docs: migrate to uv, retire Read the Docs, one page per solver - #330
Merged
Conversation
…vlasov1d) The module ships its own copy of the table; load it from the package dir. Fixes import-time crash of adept.vlasov1d2v.helpers. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The README pointed at env.yaml, env_gpu.yaml and requirements.txt, all of which were deleted in d18b57a, so the documented install path had been broken for a while. Replaces it with uv throughout and brings the rest of the docs back in line with the code. Install and build: - README and docs/source/usage.md use `uv sync --extra dev`, `uv add`, and `uv run run.py`, matching what CI actually does. - Retire the Read the Docs config. GitHub Pages is what docs.yaml deploys and what CLAUDE.md references; two doc sites drifting apart is a trap. The RTD project still needs deactivating in its dashboard. - Consolidate the docs toolchain onto the `docs` extra and delete docs/requirements.txt. The extra was missing myst-parser (which conf.py loads, and without which none of the markdown pages parse) and carried sphinx_autodoc_typehints, which was never in `extensions`. The old requirements.txt pins also capped sphinx at 7.x, so they are replaced with floors. Net lockfile change is +myst-parser, -sphinx-autodoc-typehints. - docs.yaml now builds with `uv run --locked --extra docs`, which also installs adept itself. autodoc could not import the package before, so ergoExo.html and ADEPTModule.html were rendering empty on the live site. Docs build warnings: 9 -> 0. - myst_heading_anchors was never set, so no heading anchors were generated at all and both #species-multispecies-configuration links were dead. - html_css_files referenced _static/custom.css in a directory that did not exist. Adds it, widening the content column so the config tables stop being truncated at the theme's 800px default. - Drops the unsupported display_version theme option, a duplicated html_static_path, a leading transition in faq.md, and fixes an RST-breaking `eqx.Module`s in an ADEPTModule docstring. One page per solver. Every solver now has an overview page stating the equations solved, the boundary conditions, the forcing, what gets written, and how to run it. usage/vlasov1d.md, usage/vlasov1d2v.md and usage/tf1d.md are folded into those pages; usage/ keeps only initialization and cloud. Adds overview pages for spectrax1d, hermite_legendre_1d, pic1d, tf1d and vlasov1d2v, plus a config reference for pic1d. Three config references (vfp1d, spectrax1d, hermite_legendre_1d) were orphaned from every toctree and only reachable by direct URL. Rewrites dev_guide.md, which documented utils/runner.py, get_helpers() and cfg["mode"] — none of which exist — around the actual ergoExo/ADEPTModule lifecycle. Corrects the tf1d equations, which had a field term divided by density and a source-free pressure equation; the implementation has (q/m)E and a 2nu(q/m)E field-work term. Rewrites tests.md, which listed four test files by name and missed eight suites. Removes dead configs (configs/es1d, configs/sh2d — solver keys that _base_.py does not dispatch) and strays (Untitled.ipynb, .git_commit). configs/ is now closed against the dispatcher: every directory maps to a live solver key. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The branch rewrote repo_dir when the repository sat under a `checkouts/` parent, which only ever happened in RTD's build layout. The RTD project is deleted, so the condition can no longer be true. Verified the "Source" links still resolve: linkcode_resolve only uses repo_dir for os.path.relpath, and the built pages still emit correct blob URLs with correct paths and line ranges. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
joglekara
added a commit
that referenced
this pull request
Aug 10, 2026
Two rules that were tribal knowledge: - branches and commit scopes are named after the solver being touched (`feat/vlasov1d-...`, `feat(vlasov1d): ...`), with `ci/`/`docs/`/`chore/` for repo-wide work - solvers run only through ergoExo, so record the lifecycle order and the constraints it implies: later steps read only what earlier ones built, the scalar/array split between get_derived_quantities and get_solver_quantities exists because the former is logged to MLflow, vg() raises without a metric, and _get_adept_module_ is a hand-written registry keyed per runnable module rather than per directory (vlasov-1d and vlasov-1d-iaw share a directory) dev_guide.md, rewritten around the same lifecycle in #330, stays the canonical step-by-step for adding a solver; CLAUDE.md points at it instead of keeping a second copy of the list to drift against. Adds the one step it was missing: the paths filter and job in cpu-tests.yaml, without which a new solver's tests silently never run in CI. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
joglekara
added a commit
that referenced
this pull request
Aug 10, 2026
…331) Two rules that were tribal knowledge: - branches and commit scopes are named after the solver being touched (`feat/vlasov1d-...`, `feat(vlasov1d): ...`), with `ci/`/`docs/`/`chore/` for repo-wide work - solvers run only through ergoExo, so record the lifecycle order and the constraints it implies: later steps read only what earlier ones built, the scalar/array split between get_derived_quantities and get_solver_quantities exists because the former is logged to MLflow, vg() raises without a metric, and _get_adept_module_ is a hand-written registry keyed per runnable module rather than per directory (vlasov-1d and vlasov-1d-iaw share a directory) dev_guide.md, rewritten around the same lifecycle in #330, stays the canonical step-by-step for adding a solver; CLAUDE.md points at it instead of keeping a second copy of the list to drift against. Adds the one step it was missing: the paths filter and job in cpu-tests.yaml, without which a new solver's tests silently never run in CI. Co-authored-by: archis <joglekara@users.noreply.github.com> Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
The README pointed at
env.yaml,env_gpu.yamlandrequirements.txt— all deleted back in d18b57a. The documented install path had been broken for a while. This swaps it foruvand then brings the rest of the docs back in line with the code.Install and build
docs/source/usage.mduseuv sync --extra dev,uv add, anduv run run.py, matching what CI actually does.docs.yamldeploys and whatCLAUDE.mdreferences. Two doc sites drifting apart is a trap.docsextra;docs/requirements.txtdeleted. The extra was missingmyst-parser— whichconf.pyloads, and without which none of the markdown pages parse — and carriedsphinx_autodoc_typehints, which was never listed inextensions. The oldrequirements.txtalso capped sphinx at 7.x, so those ceilings became floors. Net lockfile change is+myst-parserand its three deps,-sphinx-autodoc-typehints; nothing else moved.docs.yamlnow builds withuv run --locked --extra docs, which installs adept itself. autodoc could not import the package before, soergoExo.htmlandADEPTModule.htmlwere rendering empty on the live site.Build warnings: 9 → 0
myst_heading_anchorswas never set, so no heading anchors were generated at all and both#species-multispecies-configurationlinks were dead.html_css_filesreferenced_static/custom.cssin a directory that didn't exist — a guaranteed 404. Added, and it widens the content column so the config tables stop being truncated at the theme's 800px default.display_versiontheme option and a duplicatedhtml_static_path, fixed a leading transition infaq.md, and fixed an RST-breaking`eqx.Module`sin anADEPTModuledocstring.One page per solver
Every solver now has an overview page stating the equations solved, the boundary conditions, the forcing, what gets written out, and how to run it.
usage/vlasov1d.md,usage/vlasov1d2v.mdandusage/tf1d.mdare folded into those pages;usage/keeps onlyinitialization.mdandcloud.md. New overview pages forspectrax1d,hermite_legendre_1d,pic1d,tf1dandvlasov1d2v, plus a config reference forpic1d. Three config references (vfp1d,spectrax1d,hermite_legendre_1d) were orphaned from every toctree and reachable only by direct URL.The boundary-condition tables surface things that were previously only visible in code comments:
vlasov1d's exponential velocity push is periodic in v and wraps the forward tail onto the −v edgevfp1drequiresboundary: reflectiveunder spherical geometry and raises otherwiselpse2dbuilds its absorbing layer asexp(-α·dt·(1-env))overboundary_width/5, configured per axishermite_legendre_1dconfines its Legendre window with a rank-2 Dirichlet penaltypic1dhas no velocity boundary at all, which is its structural advantage over the grid solversCorrections
dev_guide.mdrewritten. It documentedutils/runner.py,get_helpers()andcfg["mode"]— none of which exist — and is now built around the actualergoExo/ADEPTModulelifecycle.(q/m)Eand carries a2nu(q/m)Efield-work term, sopis not a pure pressure. Documented as such.tests.mdrewritten. It listed four test files by name and missed eight suites.Cleanup
Dead configs (
configs/es1d,configs/sh2d— solver keys_base_.pydoesn't dispatch) and strays (Untitled.ipynb,.git_commit).configs/is now closed against the dispatcher: every remaining directory maps to a livesolver:key.Verification
pre-commit run --all-filesgreen.tests/test_base(30) andtests/test_vlasov1d2v/test_1d_limit(3) pass;tests/import_test.pypasses.Not done
The CI coverage gap is left alone deliberately.
test_vlasov1d2v,test_vlasov2d,test_tf1dandtest_cloudhave no CI job — 14 test files never run on a PR.tests.mdstates this explicitly rather than implying coverage. Worth noting thattest_tf1dexceeded a 10-minute local timeout (test_against_vlasov.pyruns a full Vlasov sim), so those suites likely want theslowmarker or a nightly job rather than a per-PR one.🤖 Generated with Claude Code