Files
siftlode/backend/pyrightconfig.json
T
peter 378b7559e4 build(frontend): finish the React 19 move, and hold the versions that were left in prose
react-i18next was still on ^14.1.2. The E27 S1 plan named it as "the one peer that
actually needs moving — React 19 support is the 15 line", and then it did not
move. The 14 line's <Trans> reads `element.ref`, removed in React 19, and its
withTranslation types are built on the GLOBAL JSX namespace @types/react 19 no
longer declares — both latent only because this app imports neither. 15.7.4 fixes
both at the source (`c.props.ref ?? c.ref`, `React.JSX.LibraryManagedAttributes`).

`reactEngine.contract.test.ts` joins its Node and Python twins and holds what was
only a comment: the compiler's `target` against the installed React major, react
and react-dom together, the types against the runtime, and react-i18next's floor.
A stale target is not a corrupt bundle — the plugin validates the option — but it
is a silent one, since tsc never sees Babel's output.

pythonEngine gains the seventh spelling nobody held: `requirements.lock`'s own
regeneration recipe names a python image, and wheels resolve against THAT
interpreter, so a recipe left behind yields a lock that does not match the image
installing it.

The type lane now covers `alembic` too, for the reason the ruff lane was widened
to it — migrations run on every container start, so one that raises crash-loops
prod. It came back at zero new errors, so the baseline is untouched. `tests/` is
deliberately still out, and the config says why.

vitest.config's docblock claimed the React transform is "a no-op for the plain .ts
node tests". It is not: the compiler rewrites src/lib's hooks in that lane too,
which is the point of sharing one factory with the build — and worth knowing
before ruling the compiler out of a divergence.

Tests: useCardPager had none, in either the hook or its two callers, though its
page clamp moved to render in S2 — the transformation where a non-convergent
condition is a crash rather than a glitch. Four cases now, including termination
on an empty list. Combobox's and Avatar's close/failed-URL cases are relabelled
CHARACTERIZATION: both pass against the pre-sweep code, and the tests beside them
are the ones that discriminate.
2026-09-21 23:33:02 +02:00

32 lines
1.9 KiB
JSON

// The backend type-check lane (E27 S3) — the gate's ninth lane, and the first thing that has ever
// type-checked the ~36k lines of `app/`. Read as JSONC: pyright accepts comments here.
//
// basedpyright, not mypy: measured on this tree with the dependencies actually installed, both land
// ~190-200 errors with the same distribution, so the choice was made on the things that differ —
// basedpyright is ~2x faster, needs no MYPYPATH to resolve our `app.*` imports, and has a FIRST-CLASS
// baseline (`--writebaseline`), which is the whole ratchet. mypy would have needed a third-party tool
// for that.
//
// It runs in the pytest test image, never on the host: `requirements.lock` cannot be installed on
// Windows at all (uvloop refuses to build there), so a host run would type-check against absent
// third-party packages and report nonsense. The version is pinned in requirements-dev.txt, which the
// image installs — so the lane's version IS the pin, with no host-vs-pin check to drift.
//
// `pythonVersion` is not free-standing: `/.python-version` is the single source of truth and
// `tests/test_python_engine_contract.py` fails this gate if this file, the two Dockerfiles, the CI
// container or ruff's target-version disagree with it.
//
// `include` covers `alembic` for the same reason the ruff lane was widened to it: migrations run on
// every container start, so one that raises there crash-loops prod, and "it is generated code" is
// not an argument when the generated code is what boots the system. `tests/` is deliberately OUT —
// a test's job is to fail loudly when it is wrong, which is the opposite of the silent runtime
// failure this lane exists to catch, and annotating fixtures to a checker's satisfaction is churn
// the ratchet exists to avoid.
{
"include": ["app", "alembic"],
"extraPaths": ["."],
"typeCheckingMode": "basic",
"pythonVersion": "3.12",
"pythonPlatform": "Linux"
}