cp .env.example .env
uv sync # resolves the workspace + dev tooling
pre-commit install # installs the git hooks-
One language, one workspace. Everything is a
uvworkspace member underpackages/(and, in later phases,cli/,services/,apps/web/). Runuv syncfrom the repo root. -
Quality gates run in pre-commit and CI:
ruff(lint + format) andmypy(typecheck). Run them all locally before pushing:pre-commit run --all-files uv run pytest uv run sphinx-build -b html docs site -W
-
CI (
.github/workflows/ci.yaml) runs the same checks on every push and pull request, plus a docs build (sphinx-build ... -W). It builds and tests, but does not deploy (see ADR 0003); the docs site is deployed separately by.github/workflows/docs-deploy.yaml.
- Branch names and commit messages must start with the GitHub issue number they address — the issue
number, not the phase number.
- Branch: the bare number, e.g.
1-foundations(issue #1),4-embeddings(issue #4). (#isn't valid in branch names.) - Commit message: prefix with
#<number>so GitHub auto-links the issue, e.g.#1 add pgvector schema.
- Branch: the bare number, e.g.
Architectural invariants are encoded as scoped AGENTS.md files placed where the work happens.
Canonical content lives in AGENTS.md; each CLAUDE.md is a one-line @AGENTS.md import stub —
edit AGENTS.md, not the stub. Honor the primary conventions (retrieval lives only in rag_core;
lazy torch loading; embedder/reranker behind an interface).
Significant decisions are recorded as ADRs in docs/decisions/. Add a new
numbered record (see docs/decisions/README.md) rather than silently
changing direction.
Work is tracked as phases on GitHub Issues, which are the source of truth — manage them there.