Imported from machinavitalis/jaxonomy (
AGENTS.md). Install upstream withnpx skills add machinavitalis/jaxonomy. Copyright stays with the author.
AGENTS.md — Jaxonomy
Agent bootstrap and operational notes, for any coding agent (Claude Code,
Codex, Gemini, Cursor, …) and human contributors. This is the canonical,
tool-neutral entry file; CLAUDE.md, GEMINI.md,
.github/copilot-instructions.md, and CONVENTIONS.md are symlinks to it, and
.cursor/rules/ points here (see "Entry points" at the end).
Two doors, depending on what you're here to do:
- Modifying / adding code in Jaxonomy → follow the read order below,
starting at
AGENTS/README.md. Full project orientation lives inAGENTS/; come back here for the things that specifically save agent time. - Using Jaxonomy's public API in your own code (authoring a tutorial,
building a demo, writing a downstream library) → read
SKILL.md, the consumer operating manual, instead.
Read first
AGENTS/README.md— navigation + which AGENTS file to use when.AGENTS/CONTEXT.md— what Jaxonomy is, design philosophy, key abstractions.AGENTS/PATTERNS.md— coding conventions (npavsjnp,LeafSystemcallback signatures, NamedTuple state, test patterns, naming).AGENTS/DECISIONS.md— ADRs; check before re-litigating a settled choice.AGENTS/RULES.md— operating principles, shippable-surface rule, claims/gaps discipline, self-improvement loop.
For a pure usage session (author a tutorial, build a demo, exercise the public
API), SKILL.md is the better starting point.
Operating discipline (pointers, not a second copy)
The substance lives in two files; this bootstrap defers to them rather than restating them:
AGENTS/RULES.md— the four operating principles (think before coding; simplest implementation that fits; surgical changes only; define success then loop), the shippable-surface rule + adversarial-review pass, claims/gaps discipline, and the self-improvement loop. Read it once.AGENTS/README.md— session protocol, branching/commits, scope discipline, and the autonomy/escalation list.
Two reminders that bite most often in an agent session: changes to a
shippable surface (README.md, docs/**, examples/**, benchmarks/**, root
*.ipynb, CLAIMS.md, KNOWN_GAPS.md) must be real and evidence-backed —
removed beats fake; and an unrelated bug found mid-task is surfaced to the
maintainer (commit message / PR), not fixed as a drive-by on your branch.
Where things actually live (non-obvious)
| Looking for | File |
|---|---|
findop, frequency_response, bode_data, nyquist_data, pole_zero_map, step_response, impulse_response, estimate_frequency_response |
jaxonomy/library/linearization_workflow.py (not jaxonomy/optimization/ despite the name) |
linearize, LinearizedSystem, LTISystem, TransferFunction, PID |
jaxonomy/library/linear_system.py |
Standard-library blocks — split by category (was primitives.py until the refactor) |
library/sources.py (sources + stochastic), library/math_ops.py, library/logic.py, library/routing.py (mux/demux/buses), library/dynamics.py (integrators + discrete state + filters + PID), library/nonlinearities.py (saturate / dead zone / rate limiter / quantizer), library/tables.py (lookup family). library/primitives.py is a re-export hub for back-compat — from .primitives import X keeps working. |
Container blocks (EnabledSubsystem, TriggeredSubsystem, ForEach) |
jaxonomy/framework/containers.py |
Unit annotations (BusUnit) |
jaxonomy/framework/units.py |
| Variants | jaxonomy/framework/variants.py |
Lookup-table fitting (fit_lookup_table_*) |
jaxonomy/library/lookup_table_fitting.py |
| UQ workflow (Monte Carlo, Sobol, LHS, qMC) | jaxonomy/uq/ |
| Diagnostics (dead-store, empty-inputs) | jaxonomy/diagnostics.py |
| Parameter tuning helpers | jaxonomy/optimization/parameter_tuning.py |
| Lazy results + DuckDB backend | jaxonomy/simulation/lazy_results.py |
| Event-time gradient infrastructure | jaxonomy/simulation/event_gradient.py |
| Fast restart | jaxonomy/simulation/fast_restart.py |
| Provenance manifest | jaxonomy/simulation/provenance.py |
Testing
- Fast tier:
pytest -m "not slow". Use this for regression checks on routine work. - Tests live in
test/(singular), mirroring the source layout. - Baseline: fully green. A full-suite run (2026-07-09, all 5109 tests,
fast + slow tiers) had zero unexpected failures — the previously listed
baseline failures (Kalman filters, state-machine dtype, random
normal/gamma, fluid,
battery_cell,edge_detection_comparator) all pass now.test_predictor.pyTorch/TF tests skip when torch/tensorflow aren't installed (currently absent locally). A new failure on your branch is therefore yours to explain. pytest.inisets a global--timeout=180per test via pytest-timeout, and its defaultaddoptsdeselectslow/dashboard/autodiff_full/notebook— pass-m slowexplicitly to run slow tests. Genuinely long tests are marked@pytest.mark.slowand, if they can exceed ~180s, carry a per-test@pytest.mark.timeout(N)override (the global cap applies to slow-marked tests too).- Shipped notebooks are executed too (
test/docs/). Every.ipynbunderdocs/has an entry intest/docs/notebook_manifest.py, and a notebook added without one turns the (cheap, no-execution) manifest test red. A small smoke tier runs in the default tier on every PR; the rest carry thenotebookmarker and run in the weekly CI job — run them locally withpytest -m notebook test/docs/. Passing means executing without an uncaught exception; committed outputs are never compared. If you re-execute a notebook, refresh it withPYTHONWARNINGS=ignoreand the inline matplotlib backend, then runpython scripts/check_portable_paths.py— a saved warning or traceback bakes an absolute path intodocs/**and that gate will reject it. Notebooks run from their own directory, so the repo root is not on the kernel's path andimport jaxonomywould otherwise resolve through the editable install — which, in a worktree, points at the checkout the worktree was created from.test/docs/test_notebooks.pyputs the repo root onPYTHONPATHso the kernel imports the tree under test, andtest_notebook_kernel_imports_repo_under_testfails loudly if that ever stops holding. - Optional cross-tool deps:
python-control 0.10.xis available locally for SLICOT cross-validation; wrap such tests inpytest.importorskip("control").
Git conventions
- Agent-driven work goes on a branch, then merges to
mainwhen acceptance passes. Worktree sessions inherit aclaude/*branch; longer task work usestask/T###-short-title. Direct commits tomainare the maintainer's path for their own infrastructure tweaks. Full branching + merge protocol is inAGENTS/README.md. - Infrastructure tweaks (edits to this bootstrap or the
AGENTS/*docs, rule changes) stay uncommitted unless explicitly bundled with feature work. - Don't
git add -A; stage specific files. Worktrees occasionally carry long-standing untracked drafts — leave anything you don't recognize alone.
Codebase conventions worth knowing
npavsjnpvsnptriplet is a load-bearing backend-neutrality invariant. The canonical explanation lives inAGENTS/PATTERNS.md(JAX Patterns → Backend abstraction); the rationale is inAGENTS/DECISIONS.mdDEC-030. Read those once.- Helpers that return matplotlib-ready arrays (e.g.
bode_data,nyquist_data) return plain dicts — no matplotlib import insidejaxonomy. - New analytical helpers on
LinearizedSystemlive inlibrary/linearization_workflow.py, not a newanalysis/directory.
Entry points (why there are several files)
The same content is reachable under every AI tool's expected filename, with no duplication:
AGENTS.md(this file) — the one real, canonical bootstrap. Read natively by Codex/ChatGPT and by humans.CLAUDE.md,GEMINI.md,.github/copilot-instructions.md,CONVENTIONS.md— symlinks to this file (Claude Code, Gemini CLI, GitHub Copilot, Aider). EditAGENTS.md; the rest follow automatically..cursor/rules/— a one-line rule pointing Cursor here.SKILL.md— the consumer manual (using the API), a separate document; it is also surfaced as a Claude skill at.claude/skills/jaxonomy/SKILL.md, with rootSKILL.mda symlink into it.