Development setup
Python 3.11+. The environment is built with `uv`; the repository expects the virtualenv at .venv in the root, because every documented invocation spells .venv/bin/python explicitly rather than relying on an activated shell.
Dependency tiers
Install only the tier your change needs. The tiers exist because the standards-track suites must run in an environment with no torch, no Qdrant and no network — that constraint is load-bearing, not a convenience.
Tier 1 — standards track (validator, conformance corpus, CPNP determinism, record and wire models):
Tier 2 — federation, offline (adds the HTTP/API/atproto/index surfaces; the Qdrant-marked tests still skip without a running Qdrant):
Tier 3 — the full pipeline (adds ~2 GB of wheels and a ~1.5 GB weights download on first ingest):
tests/conftest.py deselects the suites whose imports are absent at collection time rather than letting them error, so a Tier 1 environment runs a green subset instead of a broken one. That means a missing dependency looks like a smaller test run, not a failure — check the collected count if a suite you expected to exercise appears to have passed instantly.
The exiftool binary
Some metadata tests shell out to exiftool, which is not a Python package:
Tests that need it carry the exiftool marker (see pyproject.toml), alongside qdrant, model and network for the other external facts a test can depend on. Mark a new test that needs one of those four; do not silently assume it.
