.venv/
.venv-win/
__pycache__/
*.py[cod]
*$py.class

.pytest_cache/
.pytest-tmp/
.pytest-run-tmp/
.pytest-workdir/
pytest-tmp-workspace/
proof-runtime-workspace/
.factory/runtime/
proofs/crew_live_runtime/

.coverage
htmlcov/

.env
.mcp.json
.DS_Store

# ── design-sync (Barycenters design system → claude.ai/design) ──
# Durable inputs ARE committed: .design-sync/{config.json,NOTES.md,conventions.md,previews,overrides}
# Staged converter scripts + their deps:
.ds-sync/
# Regenerated converter output:
ds-bundle/
# Verification state (machine-local) and subagent scratch:
.design-sync/.cache/
.design-sync/learnings/
# Fork symlink (recreated per clone):
.design-sync/node_modules
# npm deps and build output (regenerate with `npm run build`):
barycenters-design-system/node_modules/
barycenters-design-system/dist/
.aider*

# Provider-local runtime state never belongs inside a surface adapter tree.
# Worktrees live in a sibling/shared worktree root; local settings and locks
# are ephemeral and must never become alternate factory law.
.claude/worktrees/
.claude/settings.local.json
.claude/scheduled_tasks.lock

# Provider-neutral live state is local runtime, never repository law.
.factory/runtime/

# Runtime state — NEVER committed. These are a live WORM ledger, a boundary registry, and a
# single-use store; they belong on a durable volume, not in the repo. They appear here when a
# script runs without ADMISSION_*_PATH set, and a stale one silently poisons the test suite:
# a leaked charter makes a namespace look claimed by a stranger, and binds start failing for
# reasons that have nothing to do with the code.
admission_audit_chain.jsonl
admission_boundaries.json
admission_charters.json
admission_revocations.json
admission_jti.db
admission_jti.db-*
node_modules/

# ── Prevent nested repo clones inside the working tree ──
barycenters-admission-wedge/
