__pycache__/
*.py[cod]
*.egg-info/
dist/
build/
.venv/
.uv-cache/
uv.lock
*.jsonl
.coverage
.pytest_cache/
.subtask/
.tadpole/
.claude/todos/
.obsidian/
.DS_Store
/data/
*.db
*.db-shm
*.db-wal
*.gif
*.tape
check.vertex
session.vertex
!experiments/**/session.vertex
!experiments/**/check.vertex
.ruff_cache/

# coupling-kernels structure-reveal scratch (embeddings + run outputs)
experiments/coupling-kernels/cache/
experiments/coupling-kernels/runs/outputs/
# Per-machine MCP server config (contains auth tokens)
.mcp.json

# Personal dev notes — essays, scratch, etc.
docs/dev/*
# ...except the loops-go coordination ledger, which loops-go's README, FINDINGS
# and SPEC reference by path. An untracked file is a dangling cross-repo pointer.
!docs/dev/loops-go-protocol-queue.md

# Personal state — vertex declarations, lenses, hooks, agents, experiments.
# Monorepo carries code + public docs; this is per-clone working state.
.claude/
# .loops/ is per-clone working state EXCEPT the canonical store log:
# under jsonl-canonical (design/architecture/jsonl-canonical-store) the
# .jsonl IS the store and is tracked; the .db is a derived index and
# stays ignored. Directory re-entry is required — git never descends
# into an ignored directory, so `!.loops/data/project.jsonl` alone is
# dead. Everything not re-listed here stays ignored.
.loops/*
!.loops/data/
.loops/data/*
!.loops/data/project.jsonl
experiments/
meta-discussion/
