Skip to content

v1.110 — three-way fail-safe campaigns (validate the safety net) - #249

Merged
avrabe merged 3 commits into
mainfrom
feat/failsafe-threeway-campaigns
Jul 2, 2026
Merged

v1.110 — three-way fail-safe campaigns (validate the safety net)#249
avrabe merged 3 commits into
mainfrom
feat/failsafe-threeway-campaigns

Conversation

@avrabe

@avrabe avrabe commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

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-core mod failsafe_campaign — both pass, both regimes sampled

campaign fires-when-must never-false-fires
failsafe_runaway_terminate_campaign tilt ∈ (1.15, 1.50) rad > TILT_RUNAWAY_LIMITTerminated + latched tilt ∈ [0, 0.95] → never terminates (RTL via wind path ≠ false terminate)
failsafe_wind_rtl_campaign tilt ∈ [0.38, 0.62] (in saturation band) away from home → rtl_latched tilt ∈ [0, 0.20] (below band) → never latches RTL

Reproducible 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_std crate: assertions use core panic formatting (no Vec/String/format!/eprintln!) — the index+tilt+mode is the reproducer.
  • Runtime trimmed to ~65 s (full-estimator trials are expensive; FlightSupervisor isn't Clone, so no converge-once shortcut).
  • Named gate: ci.yml "Closed-loop simulation" job now also runs cargo test -p falcon-core failsafe.

rivet validate PASS. FV-FALCON-SIMMC-002 verifies RUNAWAY-P01 / WINDFS-P01.

🤖 Generated with Claude Code

avrabe and others added 3 commits July 1, 2026 22:44
…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>
@avrabe
avrabe merged commit 145e474 into main Jul 2, 2026
56 checks passed
@avrabe
avrabe deleted the feat/failsafe-threeway-campaigns branch July 2, 2026 00:30
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.

1 participant