data/
__pycache__/
*.py[cod]
.venv/
venv/
*.db
*.db-wal
*.db-shm
.pytest_cache/
*.egg-info/
build/
dist/

# Host-specific IDE / willow-mcp wiring — materialized by
# `willow-mcp project sync nestor` from the fleet registry, not source.
# Cursor hooks stay local until there is a template worth committing.
.mcp.json
.cursor/
.willow/
.claude/settings.local.json

# build/test artifacts
.pytest_cache/
*.egg-info/
*.egg
build/
dist/

# Agent worktrees are transient scratch, never repo content.
.claude/worktrees/

# Bench runs land here by default; the tracked bench/results/*.json is the
# PUBLISHED record, written only with NESTOR_BENCH_PUBLISH=1. Running a
# bench must not dirty the tree — that blocked the first independent
# reproduction of a result from a clean clone.
bench/results/local/

# Dogfood stores under docs/dogfood/ are the PUBLISHED record of a session's own
# decisions, the same distinction bench/results/ already makes above: a store a
# run happens to write is an artifact, a store committed here is evidence. The
# blanket *.db rule is what these two lines exist to except, deliberately and
# visibly, rather than reaching around it with `git add -f`.
!docs/dogfood/**/*.db
!docs/dogfood/**/ledger.jsonl

# scratch review desk — the path hooks/before_write.py tells you to use
.review/

# Keyrings hold verifier keys — runtime trust material, not source (like *.db
# above). A local seal keyring must never be committed.
keyring.json

# Session-local seal ledger for the joke store (audit chain, runtime like *.db).
# Targeted so the docs/dogfood/**/ledger.jsonl exception above is untouched.
docs/llm-only-joke/ledger.jsonl
