rtx-fsi: pin FSI3's release response and settled cycle
Performance Benchmarks / Run Benchmarks (push) Canceled after 0s
CI / Format Check (push) Canceled after 0s
CI / Clippy Check (push) Canceled after 0s
CI / Build (macos-latest) (push) Canceled after 0s
CI / Build (ubuntu-latest) (push) Canceled after 0s
CI / Test (macos-latest) (push) Canceled after 0s
CI / Test (ubuntu-latest) (push) Canceled after 0s
CI / Build CPU-Only (Explicit) (push) Canceled after 0s
CI / Python Bindings (maturin) (macos-latest) (push) Canceled after 0s
CI / Python Bindings (maturin) (ubuntu-latest) (push) Canceled after 0s
CI / WASM Build + Size Check (push) Canceled after 0s
CI / Distributed Training Tests (push) Canceled after 0s
CI / CI Success (push) Canceled after 0s
Documentation / Build API Documentation (push) Canceled after 0s
Documentation / Build User Guide (push) Canceled after 0s

Two tiers in the FSI2 pattern. The committed default (t_end 4.2) pins
the deterministic release response at the digit-stable measurement
(uy 10.7684 +- 23.5726 mm, ux -2.8982; +-35% bands, 2x onset-growth
floor against a measured 4.6x). The sticky-mask study configuration
(HYST>0, subcycle 2, t_end >= 8.4, ny 62 or 82) pins the settled
flapping cycle measured across two grids at t_end 8.5 / window(2.0):
uy amp in [38, 72] mm (measured 50.2 / 57.6; the un-flapped release
and every pre-hysteresis dead march sit far below, and the reference
+-34.9 sits OUTSIDE — landing inside the reference band is a loud
finding, not a regression), mids, crossing-frequency in [4.4, 6.8]
(covers the estimator's measured beat-scatter — the DFT puts both
grids at 5.4-5.6 vs ref 5.46), and drag MEDIAN in [380, 530]
(measured 454.0 vs ref 460.2). WindowStats gains drag/lift medians —
the honest central loads (the extreme-based mids are noise-dominated
at large deformation).

Band anchors computed exactly as the test computes them, replayed
offline against the run 7/8/10 CSVs (deterministic trajectories).
Verified: both committed defaults green with the release pins live,
trajectories digit-identical (FSI3's loads line gains the medians,
FSI2's output byte-identical). The t_end 8.5 study pin runs at both
grids are in flight.

Co-Authored-By: Claude Fable 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01X2GmJXeQ2njUecEKiJZ1G2
This commit is contained in:
Omar Sobh
2026-08-28 07:56:51 -05:00
co-authored by Claude Fable 5
parent 137a62c4ea
commit a49602cf16
2 changed files with 115 additions and 6 deletions
@@ -147,6 +147,13 @@ pub struct WindowStats {
pub drag_amp: f64,
pub lift_mid: f64,
pub lift_amp: f64,
/// Window MEDIANS of the recorded loads — the honest central values
/// (the mid ± amp above are extreme-based and noise-dominated at
/// large deformation; the medians measured within 0.8% / 2.7% of
/// the FSI3 / FSI2 reference drags where the mids read 14% off or
/// worse).
pub drag_median: f64,
pub lift_median: f64,
/// uy amplitude over the first / last quarter of the coupled march.
pub amp_early: f64,
pub amp_late: f64,
@@ -203,6 +210,8 @@ impl MarchResult {
.unwrap_or(self.force_times.len() / 2);
let (drag_mid, drag_amp) = mid_amp(&self.drag[force_start..]);
let (lift_mid, lift_amp) = mid_amp(&self.lift[force_start..]);
let drag_median = median(&mut self.drag[force_start..].to_vec());
let lift_median = median(&mut self.lift[force_start..].to_vec());
let quarter = self.uy.len() / 4;
let (_, amp_early) = mid_amp(&self.uy[..quarter.max(1)]);
let (_, amp_late) = mid_amp(&self.uy[self.uy.len() - quarter.max(1)..]);
@@ -217,6 +226,8 @@ impl MarchResult {
drag_amp,
lift_mid,
lift_amp,
drag_median,
lift_median,
amp_early,
amp_late,
}