Test tiers for the physics core.
The fast tier (`scripts/check.sh`, `pytest -m "not slow"`) leaves out the tests
that integrate a whole burn; CI runs everything. Measured 2026-10-06 with
`--durations`: each of these took over ~3.5 s. Re-measure before adding to it.
CI quarantine for stale EngineDesign tests (non-control).
These tests fail on the current ``main`` for reasons unrelated to any change
under review — they were written against an older API / different default
constants and were never updated. A test that is already red on a clean tree
cannot act as a regression guard, so per the project's CI philosophy (gate on
guards that catch *new* breakage, not on pre-existing drift) they are skipped
here rather than blocking the gate.
Each entry records *why* it is quarantined and how to revive it. The intent is
for this list to shrink to empty: fix the test (or delete it if truly dead) and
remove its entry. Nothing here deletes a test — the code stays visible.
The robust-DDP controller suite has its own, larger quarantine in
``tests/control/robust_ddp/conftest.py``.
CI quarantine for the robust-DDP controller test suite.
These tests were written against a *legacy 8-state* dynamics model. The
controller's state vector has since grown to 11 states (see
``engine/control/robust_ddp/dynamics.py``: ``N_STATE``), so a large block of
the suite now fails with shape errors (``w_bar must have shape (11,), got
(8,)``) or stale-API errors (``TypeError: keywords must be strings``) rather
than physics drift. A few are emergent-value checks whose tolerances no longer
match the current model.
Per the project's CI philosophy — gate on regression guards (structure,
contracts, "does it still run"), not on outputs that legitimately change when
the physics/model is retuned — these stale/brittle tests are *quarantined*:
they are skipped in collection so they do not gate CI, while the ~70 structural
controller tests that still pass keep guarding against regressions.
To un-quarantine a test once it has been updated for the 11-state model, delete
its entry below. The goal is for this list to shrink to empty over time.
Nothing here deletes a test — it only skips it, so the intent stays visible.