.venv/
# BOTH spellings, because `.venv/` with the trailing slash matches a DIRECTORY only and so
# does not match a SYMLINK named `.venv`. `git add -A` would then stage a tracked symlink
# pointing at an absolute machine path. Same hazard as the two `doxygen_out` spellings below:
# one spelling of an ignore silently covers less than a reader assumes.
.venv
__pycache__/
*.pyc
*.egg-info/
.ipynb_checkpoints/
workspace/

# Tool caches. `.ruff_cache/` is the one that matters: ruff writes its own
# `.ruff_cache/.gitignore` containing `*`, so the directory self-hides and looks handled —
# but that is ruff's file, not this repo's guarantee. Delete the cache and the protection
# goes with it.
.cache/
.pytest_cache/
.ruff_cache/
.mypy_cache/
.tox/
htmlcov/
.coverage

# Build outputs. `python -m build` runs in CI, so anyone reproducing it locally creates these.
dist/
build/

# Working-instructions and scratch. `.claude/CLAUDE.md` lives here deliberately: how someone
# instructs their own agent is theirs to maintain, not a shipped asset.
.claude/

# The doxygen-guard output directory the guard's own config declares
# (`output_dir: docs/generated/`), so any guard run recreates it.
docs/generated/

# Built indexes and their caches. DEFENSE IN DEPTH, not convenience: clew is pointed at
# third-party repos, so a stray database in the tree is that repo's source graph — symbol
# names, file paths, call structure — in a single file. It is the highest-value thing here to
# leak by accident, and a multi-megabyte binary is exactly what a hurried `git add -A`
# swallows without anyone reading the diff. `--output` accepts any path, so these patterns
# exist to keep that true when someone builds an index somewhere new.
*.db
*.db-journal
*.db-wal
*.idxcache

# Doxygen scratch from a HAND-RUN doxygen. The pipeline forces OUTPUT_DIRECTORY away from the
# target repo, so this only catches manual invocations.
#
# TWO SPELLINGS, not a glob. The dot-prefixed form is the one the pipeline produces and
# `doxygen_out/` never matched it — a leading dot makes it a non-match, which once staged 47
# files of doxygen XML. `*doxygen_out/` would also swallow a deliberately-named directory, and
# an over-broad ignore that hides a real file is a worse hazard than the mess it prevents.
#
# Deliberately NOT ignoring bare `html/` or `xml/` for the same reason: those are ordinary
# directory names.
doxygen_out/
.doxygen_out/

# Private-target acceptance evidence. A cell transcript quotes the target's source verbatim,
# so committing one publishes that source. THIS IS THE ONLY PROTECTION — there is no scrub
# gate, so a `git add -f` here is unguarded. Both spellings, per the rule at the top.
acceptance/targets/internal
acceptance/targets/internal/

# In-flux findings. A committed workbook becomes a citable claim before it has been measured;
# measured results go in `acceptance/targets/*/` beside the transcripts that produced them.
acceptance/docs/

## Acceptance run working state: the target checkout and its built index. The ANSWERS, grades
## and metadata under a run directory ARE committed — a number whose evidence is not in the
## repository becomes unverifiable prose — but a checkout and a multi-hundred-MB database are
## reproducible from the pin and the declaration.
acceptance/runs/*/*/repo
acceptance/runs/*/*/clew.db*
acceptance/runs/*/*/state/
## Doxygen intermediate output. Regenerated by every build, and on a target with a vendored
## submodule it contains THIRD-PARTY source rendered to HTML — committing it would leak another
## project into this repository, which is the one provenance rule with no gate behind it.
acceptance/runs/*/*/clew.doxygen/

## PRIVATE TARGETS, EVERYWHERE THEY APPEAR. Anything under an `internal/` segment is ignored
## wholesale — rubrics, checkouts, indexes, answers, transcripts and grade sidecars alike.
##
## STRUCTURAL RATHER THAN A LIST, and that is the whole point. An earlier version named each
## private target explicitly on the reasoning that adding a new one should be a deliberate act.
## That gets it backwards: it makes the SAFE case depend on somebody remembering, so a new
## private target is committable by default until someone notices. Nothing measured on a private
## target is citable and none of it may reach a committed file, and that rule has no gate behind
## it — so the layout has to make the mistake impossible rather than merely noticeable.
##
## The consequence for run layout: a private target's run root goes under
## `acceptance/runs/<date>/internal/<target>/`, not beside the public ones.
acceptance/targets/internal/
**/internal/
