# Python / uv
.venv/
__pycache__/
*.py[cod]
.ipynb_checkpoints/

# Test / type / lint caches
.pytest_cache/
.mypy_cache/
.ruff_cache/
.coverage
coverage.xml
coverage.json
anchor-metrics.json
htmlcov/
pytest.xml

# Build / docs output
dist/
build/
docs/_build/
site/

# plan.npz + plan.lock are NOT ignored. A settled Plan and the lock binding it to its inputs, config
# digest, code release and recipe are the reproducibility record -- committing them is what lets an
# example skip the expensive fit, and lets a reviewer see when a checkpoint goes stale. `*.npz` is
# LFS-tracked (see .gitattributes), so the binary size is handled.
#
# This was previously deny-by-default with an allowlist of `!` negations for the checkpoints we did
# want. When the examples were reorganised the negated paths stopped existing, and every example
# silently lost its checkpoint -- an allowlist that goes stale without reporting. Tracking them by
# default fails the other way: an unwanted checkpoint shows up in `git status` and gets noticed.
# The verify-quartz-full stash: a from-scratch candidate checkpoint awaiting `just promote-quartz`
# (the explicit step that replaces the committed reference). Never committed itself.
.candidate/

# --plot-thickness output: generated PNGs, never committed (regenerate on demand)
thickness_optim/

# Paper reproduction reference CSVs (imported orientation data, not generated by this codebase)
examples/Colmey_et_al_2026/**/*.csv

# OS / editors
.DS_Store
.idea/
.ssec.env

# Claude Code local tool config (permission allowlists, session state)
.claude/
