__pycache__/
*.py[cod]
*.egg-info/
.venv/
# nothing installs from a lock (setup is `uv pip install -e`), and the one
# committed went six weeks stale; a `uv run` regenerates it locally
uv.lock
dist/
build/
# the kernel crate's cargo output (WP-1940), and WP-1939's in-place Cython builds
kernels/target/
examples/aot_spike/cython/*.so
.pytest_cache/
.hypothesis/
.coverage
htmlcov/
.ruff_cache/
*.png
*.html
!docs/**/*.html
# The manual's figures are COMMITTED, not built (docs/docs/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.
# They moved here from the old tree's `using/figures/` (WP-1986), and
# `tests/test_manual_api.py` asks `git check-ignore` about every image a page
# shows.
!docs/docs/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.  They moved into the new
# tree with the GUI pages (WP-1986).
!docs/docs/screenshots/*.png
# A WP that decides something from rendered pages commits the pictures beside
# its own file, and `*.png` above swallowed all eighteen of WP-1412's — the
# fifth time, and the first outside `docs/manual/`, which is why the guard added
# after the third did not see it. `tests/test_docs_consistency.py` now asks
# `git check-ignore` about every target a planning doc links, so the next
# directory fails a test wherever it is.
!docs/wp/**/*.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
# The watcher's page is files in the package too (WP-1430), and `*.html` took
# its `index.html` exactly as it took the two above — the sixth time that one
# rule has swallowed a committed file.  Here it would have shipped a wheel
# whose `rietx watch` drops the connection on `/`, green on every machine that
# has run the split.  `tests/test_watch_app.py` asks `git check-ignore` about
# all four.
!src/rietx/watch/static/**
# The chart module's browser-test harness (WP-1461), the seventh.
!tests/rxplot_page.html
# The compare page, out of its python string (WP-1461), the eighth.
# `tests/test_compare_ui.py` asks `git check-ignore` about each file.
!src/rietx/compare_app/static/**
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 manual (docs/docs/); note the !docs/**/*.html
# un-ignore above would otherwise commit every built page.
docs/docs/_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 by docs/reference_pages.py (WP-1981).
docs/docs/_generated/
# The Microsoft style package, fetched by `vale sync` at the version .vale.ini
# pins (WP-1982).
docs/vale/Microsoft/
# Copied at Sphinx build time from examples/tutorials/ (docs/sphinx_shared.py's
# copy_tutorials, called by docs/docs/conf.py).
docs/docs/start/tutorials/
# The tutorials' markdown cells, extracted for Vale (`build.py --prose`).
examples/tutorials/_prose/

# 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
# The JupyterLite site and what builds it (docs/lite/, WP-1966): the site, the
# two WebAssembly wheels and the toolchain build_wheels.py fetches, all rebuilt
# from the scripts there.
docs/lite/site/
docs/lite/wheels/
docs/lite/.lite-work/

# jupyterlite_core build cache, written to the working directory of a run
.jupyterlite.doit.db
