__pycache__/
*.pyc

# Session telemetry (kit runtime state); only the run/ subpath — .claude/ itself stays visible
.claude/run/
.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/
