Skip to content

ci: give the recovery tier a home in integration.yml; restore Boehm to per-push - #518

Merged
wshlavacek merged 1 commit into
mainfrom
ci/recovery-tier-integration-home
Jul 24, 2026
Merged

ci: give the recovery tier a home in integration.yml; restore Boehm to per-push#518
wshlavacek merged 1 commit into
mainfrom
ci/recovery-tier-integration-home

Conversation

@wshlavacek

Copy link
Copy Markdown
Collaborator

Closes #517.

The recovery tier — ~130 real parameter-recovery fits through the bngsim backend, over an hour — had no automated home: deselected from per-push CI (#515), absent from the pre-push hook (deliberately, a multi-minute hook gets the push reaped), and not part of integration.yml's nightly slow job (that's the 4 analytical statistical tests, bngsim: 'false'). So the fitting loop's only end-to-end verification against a real engine happened when a maintainer typed pytest -m recovery by hand.

Changes

1. integration.yml — new recovery job.
setup-pybnf with bngsim: 'true', running pytest -m recovery -n auto, with its own cache-suffix: pybnf-recovery so it doesn't race the slow job's uv-cache save on a dispatch.

It is dispatch-only for now (if: github.event_name == 'workflow_dispatch') — deliberately off the nightly cron. The two open questions from the issue are exactly what a first dispatch answers:

  1. Runtime is unmeasured on a 2-core hosted runner (over an hour on a dev box, and -n auto buys less there).
  2. Flake policy — these are stochastic fits with recovery tolerances; a nightly that reds every third run for tolerance reasons gets ignored, which is worse than not having it.

Escalating once it's sized is a one-liner, documented on the job: delete the if: to put it on the 08:00 nightly (the on: block already schedules the workflow), or add continue-on-error: true to make it non-blocking.

2. test_petab_sbml_layer.py — fix the small live regression.
TestBoehmRecovery::test_roadrunner_reproduces_published_data is roadrunner-backed (bngsim-free, ~3s) but was recovery-marked at the class level, so after #515 it ran nowhere automatic — it was the one recovery test actually running in CI before #515. Moved the class-level recovery marker down onto just the bngsim cross-check:

This also aligns the code with the module docstring's own stated rule ("RoadRunner legs run in the normal tier; the bngsim leg is gated -m recovery"), which the class-level marker had contradicted.

Verification (local)

  • integration.yml parses as valid YAML.
  • Marker split confirmed by collection: default tier picks up the roadrunner test, -m recovery picks up the bngsim one; recovery collection 128 → 127.
  • Restored test passes in the default tier (~2.5s); full default tier of the file: 21 passed / 2 deselected.
  • ruff@0.15.14 check passes.

…o per-push

The `recovery` tier (real parameter-recovery fits through the bngsim backend,
over an hour) ran nowhere automatically -- deselected from per-push CI (#515),
absent from the pre-push hook, and not part of integration.yml's nightly slow
job. Add a second job to integration.yml that installs bngsim and runs
`-m recovery`. It is gated to workflow_dispatch only for now (not the nightly
cron): the wall-clock is unmeasured on a 2-core runner and these are stochastic
fits, so it needs one dispatch to size it and a flake policy settled before it
goes on a schedule. Escalating is a one-liner (drop the `if:` for nightly, add
`continue-on-error` for non-blocking), documented on the job.

Also fix the small live regression #515 introduced: the Boehm
`test_roadrunner_reproduces_published_data` is roadrunner-backed (bngsim-free,
~3s) but was recovery-marked at the class level, so it stopped running anywhere
automatic. Move the class-level recovery marker down to just the bngsim
cross-check; the roadrunner leg rejoins the default per-push tier, restoring the
one end-to-end real-backend signal #515 dropped. This also aligns the code with
the module docstring's stated rule (RoadRunner legs in the normal tier, the
bngsim leg gated -m recovery).

Closes #517.
@wshlavacek
wshlavacek merged commit 0440d0c into main Jul 24, 2026
7 checks passed
@wshlavacek
wshlavacek deleted the ci/recovery-tier-integration-home branch July 24, 2026 20:57
wshlavacek added a commit that referenced this pull request Jul 24, 2026
The recovery tier includes gradient-path parameter-recovery fits whose
log-scaled parameters route the gradient into sampling space through jax
(test_gradient_*, and the Rijal-2025 real-world cases in
test_real_world_examples.py). Those tests RAISE PybnfError rather than skip when
jax is absent, so the recovery job -- added in #518 with setup-pybnf's default
jax: 'false' -- failed deterministically on its first dispatch: 2 hard failures
(lacud5_ode, five_dl1_ode), 125 passed, in ~11.7 min. Not a stochastic tolerance
flake; a missing optional dependency.

A complete recovery environment provisions jax, so install it here via the
composite action's jax input -- exactly as tests.yml's pytest-jax job already
does for the same gradient path. The two failing cases pass locally in ~15s with
jax present.

Follow-up to #518 / #517.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

The recovery tier (130 tests, real backend fits) runs nowhere automatically

1 participant