Files
backup-tool/docs/release/m1-evidence.md

63 lines
2.9 KiB
Markdown

# M1 Runtime and Metadata Evidence
## RED
Commit: `8f78484 test(v2): define runtime and metadata contracts`
Command:
```bash
.venv/bin/python -m pytest tests/unit/test_config.py tests/integration/test_migrations.py -q
```
Observed result: exit 2 during collection because `backup_tool.clock` did not exist. This proves the test-only commit preceded runtime implementation.
## GREEN
Migration gate executed against a disposable absolute SQLite database:
```bash
cd backend
BACKUP_TOOL_DATABASE_URL=sqlite+aiosqlite:////absolute/path/.m1-gate.db ../.venv/bin/python -m alembic upgrade head
BACKUP_TOOL_DATABASE_URL=sqlite+aiosqlite:////absolute/path/.m1-gate.db ../.venv/bin/python -m alembic downgrade base
BACKUP_TOOL_DATABASE_URL=sqlite+aiosqlite:////absolute/path/.m1-gate.db ../.venv/bin/python -m alembic upgrade head
../.venv/bin/python -m pytest ../tests/unit/test_config.py ../tests/integration/test_migrations.py -q
cd ..
make check
```
Observed results:
- Alembic upgrade, downgrade, and second upgrade each exited 0.
- Focused M1 suite: `13 passed`.
- Fast unit/contract suite: `28 passed`.
- Ruff check/format and strict mypy: passed.
- Frontend typecheck/build: passed.
- Disposable database removed after verification.
## Review-Fix RED/GREEN
RED commit: `45a526a test(v2): prove runtime dispatch and persistence invariants`
The focused M1 command exited 1 with five intended failures: role dispatch was absent, migrate did not dispatch Alembic, database roles accepted an unmigrated DB, persisted ORM IDs had no default, and migration connections had no shared SQLite configurator.
GREEN verification after implementing the missing behavior:
- CLI dispatch and `migrate upgrade` tests passed.
- Unmigrated worker startup was rejected before its handler ran.
- Persisted User and Repository IDs were UUIDv7.
- Generated and non-UTC supplied timestamps reloaded as aware UTC.
- Alembic connection observation reported `foreign_keys=1`, `journal_mode=wal`, and `busy_timeout=7000`.
- Baseline active-execution index, schedule uniqueness, and execution checks were present.
- Focused M1 suite: `19 passed`.
- Fast unit/contract suite: `30 passed`.
- Alembic upgrade/downgrade/upgrade, Ruff, strict mypy, frontend typecheck/build, forbidden-v1 scan, and `git diff --check`: passed.
## Hand Review
- Baseline revision contains explicit `op.create_table`, constraints, foreign keys, and indexes for all 14 v2 entities; it does not call `create_all`.
- Runtime and Alembic share one SQLite connection configurator; lock waiting uses the driver timeout rather than interpolated PRAGMA SQL.
- Startup compares the database Alembic revision with the current script head and rejects unmigrated databases.
- Every ORM identity has a UUIDv7 default; every persisted datetime uses the aware-UTC normalizing type.
- Runtime roles are explicit CLI subcommands and dispatch only after the schema gate; `migrate` invokes Alembic directly.