- __init__.py now calls apply_migrations() on setup instead of raw DDL
(HIGH finding: the runner was never invoked at startup); lifecycle
wiring tests in test_migrations.py cover fresh migrate, reload reuse,
and close-on-failure
- VERSION_TABLE DDL enforces singleton row (id=1 PRIMARY KEY + CHECK)
and version >= 1; stamp is INSERT .. ON CONFLICT DO UPDATE keyed on
the singleton row
- read_schema_version rejects non-integer and sub-1 versions with
explicit guards (bool excluded)
- no-op test asserts content hash + mtime, not just size