// 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": "standard", "pythonVersion": "3.12", "pythonPlatform": "Linux" }