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

# Virtual environment
.venv/
venv/

# Tooling caches
.pytest_cache/
.mypy_cache/
.ruff_cache/
.coverage
.coverage.*
htmlcov/
.mutmut-cache
.mutmut-cache/
mutmut-stats.json
# The mutmut 3.x shadow tree: one mutated copy per target function (~80 MB on a
# small scope) plus the run log, rebuilt from scratch by every scripts/mutmut-pr.sh
# run. Untracked, they make `git status` read dirty after any local run — which is
# how an agent comes to report a clean tree mid-run, and how a `git add -A` sweeps
# generated code into a commit.
mutants/
mutation-run.log
html/
.tox/
.uv-cache/
.hypothesis/

# Environment
.env
.envrc

# Local data — never commit (see CLAUDE.md and docs/legal-and-sources.md)
data/cache/
data/raw/
data/state/
*.tar.bz2
*.tar.gz

# Internal working notes — audits, backlogs, personal outreach notes. Never publish.
analysis/
notes/

# Editor / OS
.DS_Store
.idea/
.vscode/
*.swp

# LLHB runner: per-run CLI sandbox HOME (never versioned)
benchmarks/llhb/results/runs/.sandbox/
# What a run leaves behind is versioned by whether it can be regenerated, not
# by what it contains — lovverk is public NLOD 2.0 material, so "no legal text"
# read literally would deny the corpus repo's existence. The rule that holds:
#
#   * regenerable from the corpus pin -> not stored. A tool payload is exactly
#     that: the freeze pins lovverk, so (tool, arguments, pin) reproduces the
#     bytes, and records.jsonl keeps each payload's SHA-256 to check them
#     against. A copy in git would be a duplicate with no evidentiary value.
#   * not regenerable -> stored. Model output is non-deterministic, so an
#     answer nobody kept is an answer nobody can ever re-score. records.jsonl
#     holds every final answer and the full tool trace by name, arguments and
#     payload hash; statutory quotes inside those answers stay, because
#     redacting them would remove the citation fidelity LLHB exists to measure.
#
# raw/ is excluded because a treatment transcript embeds the payloads inline,
# which would put regenerable corpus material back in the repo. What it holds
# beyond records.jsonl — thinking blocks, event order, stderr — is not scored.
benchmarks/llhb/results/runs/*/tools/
benchmarks/llhb/results/runs/*/raw/
