# 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
MANIFEST

# Virtual environments
.venv/
venv/
env/
ENV/

# Testing
.pytest_cache/
.coverage
.coverage.*
htmlcov/
.tox/
.nox/
coverage.xml
*.cover
.hypothesis/

# Type checking
.mypy_cache/
.dmypy.json
dmypy.json
.pyre/
.pytype/

# Linting
.ruff_cache/

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

# Bulk data assets (downloaded via `mireye-earth bootstrap`)
# The data/ directory is created by the bootstrap CLI on first run.
data/*
!data/.gitkeep
!data/overture_release.txt
!data/nwi_release.txt

# Bootstrap refresh ledger (recorded by `mireye-earth bootstrap`)
data/bootstrap_state.json

# Manifest diff emitted by `--emit-manifest-diff` (consumed by Lane K)
manifest_diff.json

# DEM tile cache
cache/

# VCR cassettes that include credentials (cassettes generally should be committed;
# this is a safety net for any accidental inclusion of auth headers)
tests/cassettes/*.private.yaml

# Secrets
.env
.env.local
.env.*.local

.gstack/

# Planner-eval dev artifacts (spikes, harness logs, scratch). The frozen labeled
# set (evals/planner_eval_set.yaml) + EVALS.md ARE committed; live-run output is not.
scratchpad/
evals/planner_eval_results.json

# Truth-eval run scorecards (evals/truth/run.py) — generated per run. The nightly
# uploads them as CI artifacts; local runs are scratch. The historical example
# reports already committed stay tracked (ignore only affects untracked files).
evals/truth/reports/truth_*.json
evals/truth/reports/truth_*.md

# Claude Code: machine-local settings + worktree state. `.claude/skills/` IS
# committed (team-shared repo skills); everything else here is per-developer.
.claude/*
!.claude/skills/
