# Python
__pycache__/
*.pyc
*.pyo
*.egg-info/
dist/
build/

# Virtual environments
.venv/
.venv312/
venv/
env/

# Testing
.pytest_cache/
.coverage
htmlcov/

# Linting
.ruff_cache/
.mypy_cache/

# Environment (.env.bak* — dated backups carry live keys, never track)
.env
.env.bak*

# Logs (root-level scratch logs from harness runs)
*.log

# Sessions (user data, not code)
sessions/*.json
sessions/*.jsonl
sessions/*.jsonl.*

# Logs
logs/

# IDE
.vscode/
.idea/
*.swp
*.swo

# macOS artifacts
.DS_Store

# Windows artifacts
nul

# Claude Code session state (transient; commands stay tracked).
# settings.local.json is machine-personal PERMISSION state — never tracked
# (untracked 2026-07-02, v2 E0b: permission configs don't belong in history).
.claude/sessions/
.claude/cache/
.claude/projects/
.claude/worktrees/
.claude/*.lock
.claude/settings.local.json

# Node / JS verifier stack (write-back v1 — Vitest)
node_modules/
npm-debug.log*

# Precompressed web assets — aiohttp shadow-serves .br/.gz siblings over the
# live .js/.css with no freshness check; stale ones mask real edits invisibly.
# Preflight (verify_cozy_links.py) fails the launch if a stale one exists.
panel/web/**/*.br
panel/web/**/*.gz
ui/web/**/*.br
ui/web/**/*.gz
node_pack/*/web/**/*.br
node_pack/*/web/**/*.gz
