- Skip "sync to profile" prompt when not in interactive terminal
(was hanging in CI waiting for input that never comes)
- Increase milestone timeout from 180s to 300s for heavy milestones
(CNN and Transformer training can take 2-3 minutes on CI)
Bug Fix:
- Export failures now return early in module complete, preventing
progress from being updated when export fails. This fixes the issue
where students could start Module 02 even though tensor.py was
never exported.
New --user-journey test:
- Simulates exact student flow: module start --no-jupyter → module complete
- Runs milestones at natural unlock checkpoints (not all at end)
- Milestone checkpoints: after modules 03, 08, 09, 13, 19
- Explicit step-by-step output for easy CI debugging
New --no-jupyter flag:
- Added to 'tito module start' for CI/testing
- Creates notebook but skips opening Jupyter
Ref: https://github.com/harvard-edge/cs249r_book/discussions/1147
Unit tests now skip @pytest.mark.slow tests to avoid CI timeouts.
Milestone tests explicitly run all tests (including slow ones).
This ensures:
- Unit tests run quickly (~43s instead of timing out)
- Milestone tests still validate full milestone execution
- CI passes stages 1-5 reliably
The _run_pytest method was missing PYTHONPATH in the subprocess
environment, causing tinytorch imports to fail in CI where the
package isn't installed system-wide.
- _build_package now uses 'tito dev export --all' which properly:
1. Converts src/*.py to modules/*.ipynb (jupytext)
2. Exports to tinytorch/core/ (nbdev_export)
- Fixes issue where 'module complete --all' didn't iterate through modules
- Added CI streaming output for better visibility during builds
- Each CI stage that needs the package will build it independently
The inline tests were calling 'module complete' directly, but the notebook
doesn't exist until 'dev export' creates it from src/.
Now the flow is:
1. tito dev export <module> - Creates notebook from src/
2. tito module complete <module> - Runs tests and exports to core/
This matches the proper progressive build workflow.
The previous approach used 'dev export --all' which only exports notebooks
but doesn't run inline tests or copy code to tinytorch/core/.
Now uses 'module complete --all' which:
1. Exports notebooks from src/ to modules/
2. Runs inline tests in each module
3. Copies tested code to tinytorch/core/
This ensures 'from tinytorch import Tensor' works in unit tests.
Critical fixes:
1. bin/tito now uses sys.exit(main()) to propagate exit codes
- Previously the exit code was discarded, causing CI to pass even on failures
2. Collection errors are now counted and displayed
- 'ERROR tests/...' lines (collection failures) are now tracked
- Summary shows 'X errors, Y failed, Z passed' for clarity
Without these fixes, CI stages could show green even when tests failed.
In CI mode, all test types (unit, CLI, integration, E2E, milestone) now show:
- Header with test type and path
- Per-test progress as they run (✓ PASSED / ✗ FAILED)
- Summary footer with counts
This makes CI logs much more informative - you can see exactly which tests
are running and their status in real-time.
In CI mode, inline tests now show:
- Header with total module count
- Per-module progress: [1/20] Module 01: tensor... ✓ PASSED
- Error details if a module fails
- Summary footer with result
This makes CI logs much more informative for debugging.
Introduces a comprehensive testing command with explicit test type flags:
- --inline: Progressive inline tests from src/ (nbgrader tests)
- --unit: Pytest unit tests
- --cli: CLI command tests
- --integration: Cross-module tests
- --e2e: End-to-end user journey tests
- --milestone: Historical milestone tests
- --all: Run all test types (except release)
- --release: Full destructive release validation
- --module N: Test specific module
Default behavior runs unit tests only.
This consolidates validate, provides clear test hierarchy, and
matches PyTorch's explicit, predictable interface philosophy.