__pycache__/
*.pyc

# Session telemetry (kit runtime state); only the run/ + runs/ subpaths — .claude/ itself stays visible
# run/  = delegation handoff artifacts (KIT_GATE_RESULTS_FILE containment dir)
# runs/ = telemetry event sink (.claude/runs/<run-id>.jsonl, per docs/telemetry_schema.md)
.claude/run/
.claude/runs/
.worktrees/
*.lock
# uv.lock must be tracked for reproducible builds
!uv.lock

# Per-worktree freeze marker (absolute path); never tracked — committing it
# caused parallel branches to merge-conflict on disjoint source.
.claude-kit/freeze-dir.txt

# Review scratch artifacts (ISSUE-051); never tracked — the fixed path
# docs/.review/{code-review,findings.json,minimality,security-review}.md is
# regenerated and consumed WITHIN a single /review invocation (synthesizer →
# docs/review_notes/ISSUE-XXX.md is the canonical committed record). Committing
# the scratch made parallel review branches conflict on it every sprint.
docs/.review/

# Environment & secrets
.env
.env.*

# OS
.DS_Store
Thumbs.db

# IDEs
.vscode/
.idea/
*.swp
*.swo
*~

# Testing & coverage
.pytest_cache/
.coverage
htmlcov/

# Build artifacts
dist/
build/
*.egg-info/
figma-export/
figma-export-backup/
prototype/
# Pinned test fixtures for the SPEC-056 sweep validators are data, not a
# generated prototype — re-include them (dir first, then contents).
!tests/fixtures/sweeps/proto_pass/prototype/
!tests/fixtures/sweeps/proto_pass/prototype/**
