# Test + lint tooling — NEVER in the prod image. Installed only by backend/Dockerfile.test (the # throwaway test image), which the prod build (root Dockerfile) never references. Pinned so the # suite is reproducible: pytest for the pure-logic tests, and ruff at the SAME version the gate's # backend lint lane runs on the host (the gate fails when the host's ruff is not this one). httpx2: # Starlette 1.x's TestClient is built on it (`import httpx2 as httpx`) and only falls back to the # app's own httpx with a deprecation warning on every run. # basedpyright: the backend type-check lane (E27 S3). Pinned like everything else here — a type # checker whose version floats silently changes what "clean" means, and the ratchet baseline it # writes is keyed to the diagnostics THIS version produces. # pytest-cov: the coverage REPORT the gate prints (E32 D4) — a number to read, deliberately with no # threshold; "every regression test seen red" is the bar, not a percentage. basedpyright==1.40.1 pytest==8.4.2 pytest-cov==7.1.0 ruff==0.15.21 httpx2==2.13.0