Moves phases 08–11 execution artifacts from .planning/phases/ to .planning/milestones/v0.2-phases/ to keep .planning/phases/ clean for the next milestone. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
4.6 KiB
4.6 KiB
phase, slug, status, nyquist_compliant, wave_0_complete, created, audited
| phase | slug | status | nyquist_compliant | wave_0_complete | created | audited |
|---|---|---|---|---|---|---|
| 8 | stack-upgrade-backend-decomposition | complete | true | true | 2026-06-07 | 2026-06-12 |
Phase 8 — Validation Strategy
Per-phase validation contract for feedback sampling during execution.
Test Infrastructure
| Property | Value |
|---|---|
| Backend framework | pytest with pytest-asyncio (asyncio_mode = auto) |
| Backend config file | backend/pytest.ini |
| Backend quick run | cd backend && pytest tests/test_auth.py -x -v |
| Backend full suite | cd backend && pytest -v |
| Frontend framework | Vitest 4.1.7 |
| Frontend config | frontend/vitest.config.js |
| Frontend quick run | cd frontend && npm test |
| Estimated runtime | ~60 seconds (backend), ~10 seconds (frontend) |
Sampling Rate
- After every task commit: Run
cd backend && pytest -x -v(backend changes) orcd frontend && npm test(frontend changes) - After Wave 0 (test stubs): Confirm all new stubs are xfail —
pytest --tb=no -q - After decomposition plans: Full suite
cd backend && pytest -v— zero failures before advancing
Phase Requirements → Test Map
| Req ID | Behavior | Test Type | Automated Command | Status |
|---|---|---|---|---|
| CR-01 | change_password revokes other sessions, keeps current |
integration | pytest tests/test_auth.py::test_change_password_revokes_other_sessions -x |
✅ COVERED |
| CR-02 | enable_totp revokes other sessions, keeps current |
integration | pytest tests/test_auth.py::test_enable_totp_revokes_other_sessions -x |
✅ COVERED |
| CR-03 | disable_totp revokes other sessions, keeps current |
integration | pytest tests/test_auth.py::test_disable_totp_revokes_other_sessions -x |
✅ COVERED |
| CODE-01 | All admin URLs still respond on same paths after split | integration | pytest tests/test_admin_api.py -x |
✅ COVERED |
| CODE-02 | All document URLs still respond on same paths after split | integration | pytest tests/test_documents.py -x |
✅ COVERED |
| CODE-03 | All auth URLs still respond on same paths after split | integration | pytest tests/test_auth.py -x |
✅ COVERED |
| CODE-04 | All existing consumer imports resolve; no 35+ files changed | smoke | cd frontend && npm test |
✅ COVERED |
| CODE-08 | No model defined twice across packages | static/grep | grep -rn "class CloudConnectionOut" backend/ |
✅ COVERED |
| PERF-01 | npm list confirms all packages present | install verification | cd frontend && npm list |
✅ COVERED |
Wave 0 Gaps (Resolved)
All stubs promoted to real passing tests:
backend/tests/test_auth.py:173—test_change_password_revokes_other_sessions(PASSED)backend/tests/test_auth.py:217—test_enable_totp_revokes_other_sessions(PASSED)backend/tests/test_auth.py:270—test_disable_totp_revokes_other_sessions(PASSED)- Frontend:
SettingsAccountTab.test.jsandTotpEnrollment.test.js— 136 frontend tests pass
Critical Test Gates
| Gate | Command | Status |
|---|---|---|
| Wave 0 stubs xfail | pytest --tb=no -q |
✅ Complete |
| Admin split | pytest tests/test_admin_api.py -x -v |
✅ Passed |
| Documents split | pytest tests/test_documents.py -x -v |
✅ Passed |
| Auth split | pytest tests/test_auth.py -x -v |
✅ Passed |
| Full backend suite | pytest -v |
✅ 405 passed, 6 skipped, 7 xfailed |
| Frontend smoke | npm test |
✅ 136/136 passed |
| URL regression | pytest tests/test_admin_api.py tests/test_documents.py tests/test_auth.py -v |
✅ 58 passed |
Security Validation
| Threat | Test | Evidence |
|---|---|---|
| Router prefix doubling | pytest -v — all existing route tests pass |
URL paths unchanged |
| Admin endpoint auth leakage | pytest tests/test_admin_api.py -k "not_admin" |
403 on all admin routes for non-admin |
| Circular import crash | App starts cleanly: uvicorn main:app --reload exits 0 |
No ImportError |
| CloudConnectionOut import break | pytest tests/test_cloud.py -x |
Single definition in backend/api/schemas.py |
Known Environment Note
tests/test_extractor.py::test_extract_docx fails with ModuleNotFoundError: No module named 'docx' in the local macOS Python 3.9 environment only. python-docx is in requirements.txt and runs correctly inside Docker. This is a pre-existing local environment gap unrelated to Phase 8.
Validation Audit 2026-06-12
| Metric | Count |
|---|---|
| Gaps found (Wave 0) | 3 |
| Resolved | 3 |
| Escalated | 0 |
| Total requirements | 9 |
| COVERED | 9 |
| PARTIAL | 0 |
| MISSING | 0 |