# Python
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg

# Test and coverage artifacts
# `.coverage` was tracked from Nov 2025 until 0.42.0 — a 53 KB binary database
# rewritten on every coverage run. The sdist `exclude` in pyproject exists only
# because of that; it stays as belt-and-suspenders but is now redundant.
# `.pytest_cache/` and `.ruff_cache/` are absent here on purpose: each writes
# its own `.gitignore` containing `*`, so they already self-manage.
.coverage
.coverage.*
htmlcov/

# Virtual environments
# `.venv/` needs its own entry: `venv/` does not match it, and the Makefile and
# pre-commit hook both look for `.venv/bin/python` — so the project's own
# convention was one `git add -A` away from committing an entire interpreter.
.venv/
venv/
env/
ENV/
env.bak/
venv.bak/

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

# Claude Code
.claude/settings.local.json
.claude/current-session.json
specs/

# Environment variables and secrets
.env
*.key
*.pem
*.secret
*credentials*

# Neo specific
.neo/
exemplars/
*.log
# Goal 8 measurement scratch: the arm launchers embed absolute paths from the
# machine that produced them, and the per-run `/usr/bin/time -l` dumps are raw
# instrument output. The scored JSON and the aggregates are committed; these
# are not.
evidence/bin/
evidence/m2_main/
evidence/m2_branch/
evidence/m2_g9/
evidence/m2_g9_run2/
evidence/m2_g9_clean/
