The typecheck ran with continue-on-error, so it could not fail, and it did
not see much of the code it was meant to check: shared/ resolved none of its
imports (61 TS2307), which hid every type error behind them.
- tsconfig.app.json resolves packages that shared/ imports from web's
node_modules (types first), and @pezkuwi/utils subpaths as vite does.
Unresolved imports: 61 -> 0. The real errors behind them are now visible:
353 in total, most in production code with little test cover.
- Fixing those in one change would be a large edit to that code. Instead
ops/typecheck-ratchet.py records them per file and error code in
ops/typecheck-baseline.txt and fails when any file gains one, or when
errors were fixed without lowering the baseline in the same change.
Line numbers are not part of the signature, so unrelated edits do not
trip it. Checked: a new error in App.tsx fails (exit 1); an unlowered
baseline fails (exit 1); the current tree passes.
The CI step runs the ratchet instead of the non-blocking typecheck.