v1.110 — three-way fail-safe campaigns (validate the safety net) - #249
Merged
Conversation
…y net) Extends the dispersion-campaign discipline from nominal recovery to the FAIL-SAFES, with three-way envelope classification: inside the recoverable set no fail-safe fires (no false positive), outside it the CORRECT one (terminate vs RTL) fires + latches. Each trial drives the FULL production FlightSupervisor (real IEKF + geometric controller + mixer + FSM) via a tilt-injecting backend. crates/falcon-core mod failsafe_campaign, both pass, both regimes well-sampled: - failsafe_runaway_terminate_campaign: tilt in (1.15,1.50) > TILT_RUNAWAY_LIMIT MUST terminate + latch; tilt in [0,0.95] MUST NOT terminate. - failsafe_wind_rtl_campaign: tilt in [0.38,0.62] (in saturation band) away from home MUST latch RTL; tilt in [0,0.20] MUST NOT. A one-sided pass (detector always-on or always-off) trips the well-sampled floor. Deterministic tilt sweeps for now (60/regime densely covers the 1-D range) — injected tilt is exact; sensor-noise/gust dispersion + rule-of-three trial counts are the next slice. no_std discipline: core-panic assert formatting (no Vec/String/format!/eprintln). Named gate (ci.yml closed-loop-sim) now also runs `cargo test -p falcon-core failsafe`. FV-FALCON-SIMMC-002 (verifies RUNAWAY-P01 / WINDFS-P01). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The rivet Verification gate EXECUTES every non-bench-only fields.steps[].run. The v1.110 failsafe campaign steps (heavy full-estimator falcon_core tests, ~65s + a big cold build) ran inside the gate on a disk-constrained self-hosted runner (94% disk) and got killed mid-run. Mark the campaign steps `# bench-only` (the Kani-steps convention): they already run in the dedicated "Closed-loop simulation" CI job + the workspace test, so re-running them in the rivet gate is redundant and resource-heavy. Also marked the v1.109 SIMMC-001 steps for consistency + to prevent recurrence. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ld rebuilds The rivet gate runs every artifact's non-bench-only cargo step serially. A PR touching a central crate (here falcon-core) invalidates the shared build cache, so the ~370-artifact sweep rebuilds many steps cold and exceeds 30 min on the disk-constrained self-hosted runner — the v1.110 run timed out at 373 artifacts, ALL PASS (0 failures). This bumps the headroom so the sweep completes; the verification was never failing. Root cause to watch separately: runner disk pressure (post-job hooks report 94% used). Co-Authored-By: Claude Opus 4.8 <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.
Dispersion campaigns for the fail-safes themselves
v1.109 dispersed the nominal recovery behaviors. This extends the discipline to the fail-safes, with the three-way envelope classification the research note called for: inside the recoverable set no fail-safe fires (no false positive), and outside it the correct fail-safe (terminate vs RTL) fires and latches.
Where the point-tests prove ONE condition each, these sweep the regime and validate both halves — "fires when it must" AND "never false-fires". A one-sided pass (a detector wired always-on or always-off) trips the well-sampled assertion.
Each trial drives the full production
FlightSupervisor(real IEKF + geometric controller + mixer + FSM) via a tilt-injecting backend — the exact mechanism of the existing point-tests.crates/falcon-coremod failsafe_campaign— both pass, both regimes sampledfailsafe_runaway_terminate_campaignTILT_RUNAWAY_LIMIT→ Terminated + latchedfailsafe_wind_rtl_campaignrtl_latchedReproducible from
(seed, index); both regimes well-sampled (≈60 each) so the pass is genuinely two-sided.Honest scope
These are deterministic tilt sweeps for now (60/regime densely covers the 1-D range; the injected tilt is exact). Adding gyro/accel noise + bias walk + gust profiles — the full stochastic dispersion vector, at which point trial counts rise to rule-of-three ~1000/behavior — is the next slice.
Discipline notes
no_stdcrate: assertions use core panic formatting (noVec/String/format!/eprintln!) — the index+tilt+mode is the reproducer.FlightSupervisorisn'tClone, so no converge-once shortcut).ci.yml"Closed-loop simulation" job now also runscargo test -p falcon-core failsafe.rivet validatePASS.FV-FALCON-SIMMC-002verifies RUNAWAY-P01 / WINDFS-P01.🤖 Generated with Claude Code