Contributing¶
Before You Start¶
- Read
CLAUDE.md. - Read the relevant Domain page and the related
section of
spec_v3.md. - Find the slice in Development → Slices your change belongs to.
- Run
pytest tests/unit/before changes.
Rules¶
- Follow the Conventions page without exception — config over code, structured logging, model abstraction, tool validation.
- Every schema change → an Alembic migration (Workflow).
- Every new skill → YAML + schema + fixtures + tests (Workflow).
- Every new module → a docstring. The API Reference renders it automatically.
Docstring Style¶
Google style. mkdocstrings renders them. Minimum viable docstring:
async def complete(
prompt: str,
task_type: str,
user_id: int,
) -> Completion:
"""Route a completion through the configured model for this task type.
Args:
prompt: Fully-rendered prompt string.
task_type: Alias used to look up the model in
:file:`config/donna_models.yaml`.
user_id: Owner of the invocation (logged).
Returns:
The structured completion, schema-validated.
Raises:
BudgetExceeded: If the daily or monthly cap is tripped.
"""
CI Gates¶
ruff checkmypy --strictpytest -m "not slow and not llm"properdocs build --strict(docs workflow)
Branching¶
- Default branch:
main. - Claude sessions:
claude/*. - Feature work:
feat/<slice>-<short-desc>.