# Python
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
build/
dist/
*.egg-info/
.eggs/

# Virtual environment
.venv/
venv/

# uv
# (uv.lock is committed on purpose)

# Tooling caches
.ruff_cache/
.pytest_cache/
.mypy_cache/
.pyright/

# Provisioned repo checkouts (RepoProvider cache)
.cache/

# direnv local overrides
.envrc.local

# Datasets: track per-dataset READMEs, ignore the downloaded data files
datasets/**/data/

# Task outputs are the committed deliverable: per-instance runs under
# outputs/related_files/<dataset>/intermediate/<instance_id>/ (candidate +
# aggregate annotations) plus the combined
# outputs/related_files/<dataset>/annotations.parquet built from them by the
# `combine` binary. Proxy logs and other scratch stay under the gitignored
# .cache/.
#
# Full-conversation trace records are large, so they live off-repo in a HF
# dataset repo (see `traces.py`), NOT in git. Only the small
# `traces_manifest.json` (sha256 + size + repo id/revision per trace) is tracked,
# so any trace can be fetched and integrity-checked on demand.
outputs/**/*.last_exchange.json

# Jupyter
.ipynb_checkpoints/

# OS / editor
.DS_Store
*.swp

# Experiment proxy logs are large and regenerable — never commit them
experiments/related_files/prompt_variance/runs/**/*.proxy.jsonl

# Claude Code: ignore personal + runtime state, but KEEP shareable project
# config trackable (.claude/settings.json, commands/, agents/, skills/) — do
# NOT blanket-ignore .claude/.
.claude/settings.local.json
.claude/scheduled_tasks.lock
