__pycache__/
*.py[cod]
*.egg-info/
.venv/
dist/
build/
.pytest_cache/
.hypothesis/
.coverage
htmlcov/
.ruff_cache/
*.png
*.html
!docs/**/*.html
# Part 1's figures are COMMITTED, not built (docs/manual/make_figures.py says
# why): the sphinx build stays seconds and stays offline, at the cost of a
# figure that can go stale.  `*.png` above would have dropped them silently,
# leaving a manual whose images are broken everywhere except this machine.
!docs/manual/using/figures/*.png
# The GUI chapters' screenshots are committed for the same reason and were
# dropped by the same rule (WP-1017) — the third time `*.png` above has
# swallowed a committed image. `tests/test_gui_manual.py` now asks
# `git check-ignore` about them, so a fourth directory fails a test instead of
# reaching a fresh clone with its pictures missing.
!docs/manual/using/screenshots/*.png
# The GUI's built frontend is COMMITTED (WP-1010) so installing the wheel never
# needs node — and `*.html` above would have quietly dropped its entry point,
# leaving a dist whose freshness test passes on this machine while a fresh clone
# serves the placeholder page instead of the app.
!src/rietx/gui/static/**
# ...and the same rule swallowed the *source* entry too, which is worse: the
# dist above is committed, so a fresh clone still serves the app — but without
# `gui/index.html` vite has no entry module and the frontend cannot be rebuilt
# at all.  Found by CI on the first clean-clone build (PR #17), never locally,
# because the file exists on every machine that has ever run the build.
!gui/index.html
gui/node_modules/
gui/.vite/
# every test refinement writes obs/calc/diff plots and exported tables here,
# for visual inspection (Rwp hides locally-bad fits).  The *.png rule above
# used to cover this by accident; WP-0505 added a CSV export and it was
# committed, so ignore the directory rather than the extensions that happen
# to land in it.
tests/output/
# a GUI project is a DIRECTORY, and every GUI verb writes into it as it is
# clicked (settings persist on the verb), so a project opened from a checkout
# is an untracked directory that grows while you work.  `rietx gui --scratch`
# opens a copy in a temp dir instead; this is the second line of defence, for
# a project made from inside the app.
*.rex/
# kept agent-eval run records (eval-runs/README.md).  A round's calls.jsonl,
# answers and transcripts outlive the session that produced them so the
# harness can be iterated on, and are deleted by hand when it is not.  The
# findings live in the WP handover and the milestone record, never here.
eval-runs/
# jax's persistent compile cache (tests/conftest.py points JAX at it): the
# backend suites are compile-bound, and the cache is keyed by a content hash
# of the computation, so it is safe to share between runs and xdist workers.
tests/.jax_cache/
# sphinx output for the theory manual (docs/manual/); note the !docs/**/*.html
# un-ignore above would otherwise commit every built page.
docs/manual/_build/
.DS_Store

# .claude/ is committed selectively: commands/ is shared tooling, while
# worktrees/ holds live checkouts and settings.local.json is per-machine.
.claude/worktrees/
.claude/settings.local.json

# A PR description composed on disk for `gh pr create/edit --body-file`.  Not
# ignored until one of them reached a commit and would have merged to sit at the
# repository root beside README.md (PR #206) — nothing partitions the root, so
# no test saw it and CI was green with it.
/pr_body.md

# Generated at Sphinx build time from rietx.help (docs/manual/conf.py).
docs/manual/_generated/

# The landing page (docs/landing/, WP-1331).  Three rules, and they are here
# rather than beside the rules they answer because ORDER decides: the last
# match wins, so an un-ignore for `*.png` and an ignore under `!docs/**/*.html`
# both have to sit after those lines.
#
# `preview.html`, `dist/index.html` and `site/` are one page built three ways,
# each with `data/demo.json` inlined or copied beside it — build products, none
# of them a thing to read in a diff.  `dist/` above already covers one;
# `preview.html` was matched by `!docs/**/*.html` and would have been committed,
# 3.2 MB of it.
#
# `docs/landing/data/` is deliberately NOT in this list.  The payload IS
# committed: it keeps every second measured channel, which puts it at 2.4 steps
# across a peak against the package's own 5-to-10 guideline, so what ships is a
# figure of the contributor's series rather than the series
# (docs/landing/build_demo.py § `decimate`, and `tests/test_landing.py` asserts
# the committed file is on the unrefinable side of that line).
docs/landing/preview.html
docs/landing/site/
# ...and the other direction, for the fourth time: `*.png` swallowed the
# landing page's four committed figures exactly as it swallowed Part 1's, the
# GUI chapters' screenshots and the GUI dist.  `tests/test_landing.py` asks
# `git check-ignore` about all six paths, in both directions, because reading
# this file correctly is what failed the first three times.
!docs/landing/img/*.png
