Skip to content

WP12 - Fidelity ladder: L0/L1/L2 propagation + L4/L5 elements; zero keep-out violations re-verified per level#25

Merged
HeliCorgi merged 6 commits into
masterfrom
wp12-fidelity
Jul 4, 2026
Merged

WP12 - Fidelity ladder: L0/L1/L2 propagation + L4/L5 elements; zero keep-out violations re-verified per level#25
HeliCorgi merged 6 commits into
masterfrom
wp12-fidelity

Conversation

@HeliCorgi

Copy link
Copy Markdown
Owner

WP12 (adsc-specification-v5.md section 6) - fidelity ladder through L2 with L4/L5 elements

Runtime-selectable propagation levels on ONE code path (no fork; 'build-selectable' realized as run-time-selectable within one build - strictly stronger): L0 the original linear CW baseline, kept - every committed campaign number byte-identical; L1 full inertial two-body+J2 of both craft differenced into the target LVLH frame (the one documented conversion, R8); L2 +per-craft drag (Vallado density, R1 reuse) with ballistic-coefficient uncertainty from an INDEPENDENT dispersion stream (ds-v2 = ds-v1 + BC stream; the committed ds-v1 draws untouched).

Mandatory cross-validation (tested, ctest ladder)

L1 with J2 disabled reproduces the L0 CW closed form within a stated 2.0 m epsilon - the CW LINEARIZATION error itself (the J2-off path is the full nonlinear two-body problem), measured worst case 0.52 m (SL-16/340) across the WP1 424.3 m scenario re-derived from its own corridor sweep, all 14 forensic-14 post-abort coasts, and the standoff case. L2 with drag disabled reproduces L1 bit-for-bit (same code path). Attitude pins (19.15/16.87/17.07) untouched by construction - no translation content.

Results (generated/wp12_ladder.{csv,md}, R14-tagged per level)

  • Zero keep-out violations at every level, both catalogs (292+291 committed abort events re-verified with the UNCHANGED WP11 clearing law; Wilson UBs 0.0130/0.0130): clearance floor 20.0 m (L0) -> 18.8 m (L2, SL-8, the tighter catalog). The anticipated CW-safe-but-higher-level-unsafe case does NOT materialize for this dispersion set - the WP11 margin absorbs the measured ~1.0-1.2 m J2+drag erosion. A negative-negative result, reported with the same discipline as a positive one (spec v5 sections 6/10).
  • Forensic-14 clears at every level (per-level table committed; the x0>0 cases actually improve at L1, consistent with the independently measured linearization signs).
  • Margin decay measured (the F2 caveat, promised qualitatively since WP1): worst 1.40 m min-range erosion over 5 orbits on the 400 m standoff ellipse [L1].
  • L4 estimate-driven guidance: the guided approach flies on the translation EKF's estimate (truth = error recording only) under measurement dropout + an UNESTIMATED range-bias walk; truth-evaluated contact speed 0.0998 m/s (gate 0.15). Honest consistency finding, stated in the pack AND README: NIS 3.99 (ideal ~4, consistent) but NEES ~310 vs ideal ~6 - the filter is OPTIMISTIC about its own accuracy under the unestimated bias walk; bias states are the identified fix. This closes WP11's truth-fed-only known limit.
  • L5 actuator model retires the continuous-torque caveat by measurement: sync at 16.28 s vs 16.87 s continuous under a delta-sigma minimum-impulse-bit actuator (MIB 2e-4 N m s PLACEHOLDER) + 1-step command delay + single-axis 50% fault; translation MIB (1e-3 m/s) still meets the contact gate. The README known-limit carried since WP3 is retired with numbers, honest remainder stated.

Two findings the CI-as-laboratory loop produced (documented, not patched over)

  1. My initial 0.5 m cross-validation epsilon was falsified by measurement: the CW linearization error alone reaches 0.52 m at the largest forensic excursions. The stated epsilon is now 2.0 m with the measured justification in the test and header.
  2. Per-step round-to-nearest MIB quantization was falsified as a model: it deletes every sub-bit command per step - including the continuous feedforward that tracks a precessing target - so the hold never converges. Replaced by the delta-sigma (duty-cycled) quantizer real pulsed DACS hardware implements: firings stay integer bits, mean torque tracks the command. The falsified variant is documented in the code comments.

Discipline

  • No pinned number moved (R15 not triggered): wp5_campaign_runs.csv byte-identical to master (verified independently at artifact level AND by the adversarial-verifier); reference_metrics legacy rows byte-identical (+9 wp12 rows); summary CSV/md differ ONLY in the two keep-out note strings (the [L0, ds-v1] tag - closes PR WP11 - Safety hardening + closed-loop guidance: clearing-abort law, reachability screen, keep-out 0 of 500 [L0, ds-v1] #19's deferred WARN, the ride-along authorized for this WP); wp10/wp11 artifacts untouched.
  • CI green end-to-end: run 28723189583 (16/16 ctest + regenerate + byte-identity gate) on the full tree; artifacts adopted from CI's own Linux regeneration (run 28722765714).
  • adversarial-verifier: SHIP - from-scratch reimplementation reproduced the worst linearization diff to six digits (0.520309 m, same case), all 14 L1 J2-on ladder values to <=5e-5 m, per-level Wilson bounds exactly, L0 floors == the WP11 audit, and full byte-discipline vs master.
  • safety-claims-reviewer: found ONE genuine pre-existing BLOCKER - a 'minimum-cost allocation' phrase in the evidence pack (banned as an absolute claim by spec v5 section 1) that had never been in the claims-audit regex list. Fixed to cost-effectiveness framing AND the audit now enforces a minimum-cost regex permanently. Its WARNs (spec-phrase drift 'clearing-'->'clearance-verified'; an under-tagged zero-claim; the ambiguous 'compliant clamp') are all fixed in-branch; the verifier's cosmetic finds (stale eps comment; the canonical safety phrase absent from the pack's summary) fixed in-branch.

Ride-alongs (owner-directed)

Spec-vs-repo observations (reported, not improvised around)

  1. Spec v5 section 1's rationale clause 'because the current campaign shows a nonzero keep-out violation rate' is now factually stale (the committed campaign shows 0/500) and sits next to the new criterion-met note. Tightening it is the owner's call (e.g. 'because a zero point estimate still carries a nonzero Wilson upper bound'); not edited beyond the authorized replacement.
  2. The 'measured worst 0.52 m' linearization figure lives in prose/comments; CI enforces only the 2.0 m ceiling. If the forensic states or emitter change, that prose figure could go stale silently - candidate for a printed/generated value in a future WP (adversarial-verifier observation).
  3. L3 (SRP) is not implemented - the WP12 completion criterion is 'through at least L2 with L4/L5 elements', which this PR meets; L3 remains for a later WP and the ladder md's coverage statement says exactly what is and is not verified.

Completion criteria (v5 section 6, WP12): ladder implemented through L2 with L4/L5 elements - met; per-level comparison table in the evidence pack - met (section 3, from wp12_ladder.csv mechanically); 'which model verifies what' section - met (the pack subsection and the ladder md coverage statement; phrased without the banned word the spec's own shorthand uses); mandatory cross-validation tested - met (ctest ladder); adversarial-verifier independently re-derived the J2-off cross-validation and per-level rates before this PR opened - met.

🤖 Generated with Claude Code

Heli and others added 6 commits July 5, 2026 08:05
… L4/L5)

- propagation module: runtime-selectable FidelityLevel (one code path, no
  fork); inertial two-body+J2(+drag) RK4 of both craft differenced into the
  target LVLH frame (the one documented conversion, R8); cited kEarthJ2 /
  kEarthOmega; drag via the existing Vallado density model (R1 reuse)
- adsc_ladder emitter -> generated/wp12_ladder.{csv,md}: per-level
  re-verification of every committed campaign abort event (same commanded
  dv - the law is unchanged), forensic-14 per-level clearance with a
  prominent flag for any L0-clears-but-L1/L2-dips case (first-class
  deliverable), margin-decay table (F2 promise, now measured), L2 BC
  dispersion from an independent stream (ds-v2 rows; ds-v1 untouched)
- run_one_mission audit hook (draw-order preserving, nullptr default)
- L4: estimate-driven guidance (TranslationEkf consumes range/LOS with
  Bernoulli dropout + unestimated range-bias walk - documented gap; screen
  and guidance on the ESTIMATE, truth for error recording only)
- L5: ActuatorError MIB quantization (half-bit deadband), command delay
  FIFO, single-axis fault - neutral defaults exact-identity (pins intact);
  retires the continuous-torque caveat with measured numbers
- ctest ladder: MANDATORY cross-validation (L1 J2-off vs CW closed form,
  eps 0.5 m, incl. the WP1 424.3 scenario re-derived and all forensic-14
  coasts; L2 drag-off == L1 bit-for-bit; J2-on erosion bounded sanity)
- campaign keep_out note string gains the L0/ds-v1 tag (PR#19 deferred WARN)
- evidence pack regenerated (PLACEHOLDER inventory: new honest marks for
  the L2/L4/L5 knobs + line shifts; no quoted number moved)

Committed generated/ campaign artifacts are byte-identical by construction
(audit hook nullptr in all artifact paths); wp12_ladder.* and new metrics
rows arrive from CI regeneration in the re-baselining commit (gate expected
red on this push; artifacts upload for harvest).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…n bound)

The L1 J2-off path is the full nonlinear two-body problem; it reproduces the
linear CW closed form within the CW linearization error, not to zero. CI
measured the worst forensic-14 difference at 0.52 m (SL-16/340, the largest
x0>0 excursion), matching the ~3*pi*rho^2/r second-order scale. 2.0 m bounds
it with margin while still failing instantly on any real frame or
initialization bug (tens-to-hundreds of meters).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…eted the feedforward)

CI measurement (test_ladder L5): per-step round-to-nearest MIB quantization
zeroes every sub-bit command, and the torque-free feedforward tracking a
precessing target is a CONTINUOUS sub-bit command (~1e-5 N m s per 10 ms
step vs a 1e-4 half-bit) - the hold never converges. Real pulsed DACS
hardware duty-cycles: unfired demand accumulates until a whole impulse bit
fires. Implemented as a MibAccumulator (delta-sigma) in run_tumble_sync's
loop (per-step state, same placement rationale as the delay FIFO); firings
remain integer MIB quanta - the discreteness the continuous-torque caveat
ignored - while mean torque tracks the command. ActuatorError::apply keeps
scale/misalign/fault only; neutral defaults stay exact-identity (pins
byte-identical). Diagnostic print added before the L5 assert.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…+ docs

- generated/wp12_ladder.{csv,md} adopted from CI run 28722765714 (Linux):
  zero keep-out violations at L0/L1/L2 for both catalogs; clearance floor
  20.0 -> 18.8 m (L0 -> L2, SL-8) - the anticipated CW-safe-but-higher-
  level-unsafe case does NOT materialize for ds-v1/ds-v2 (measured
  negative-negative result); forensic-14 clears at every level (L1 value
  for B254 independently cross-checked against a from-scratch numpy J2
  propagation, 4-decimal agreement); margin decay measured (F2 promise):
  worst 1.40 m over 5 orbits on the 400 m standoff [L1]
- reference_metrics: +9 wp12 rows (L4 estimate-driven guidance incl. the
  honest NEES ~310 vs ideal ~6 under the unestimated bias walk; L5 MIB
  sync 16.28 s vs 16.87 s continuous); legacy rows byte-identical;
  wp5_campaign_runs.csv byte-identical (draw-order preservation verified
  at artifact level); summary notes gain the L0/ds-v1 tag (2 lines)
- evidence pack: new 'Fidelity ladder (WP12)' section (per-level table,
  forensic-14 statement, margin decay, L4/L5 measured bullets, coverage
  statement); continuous-torque limitation bullet RETIRED with measured
  numbers; estimator-scope bullet updated with the NEES honesty; TRL
  sentence extended to WP12 (spec v5 section 9); claims-audit extended
- README: wall-clock CI timings de-pinned (PR#19 verifier observation);
  known-limit retirements (continuous-torque, truth-fed-only guidance);
  WP12 roadmap/implemented bullets; ladder artifacts in the layout
- spec v5 section 1: owner-authorized exact wording replacement
  ('passively-safe approach design with clearance-verified aborts (keep-out
  violations 0/500 per catalog [L0, ds-v1, Wilson <= 0.0076])')

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…iscipline)

- evidence pack section 8: 'minimum-cost allocation' (pre-existing WP7
  text, banned as an absolute claim by spec v5 section 1) -> the
  cost-effectiveness framing; claims-audit gains a minimum-cost regex so
  the ban is enforced from now on (the reviewer found the gap: the banned
  phrase had never been in the scan list)
- README: 'clearing-verified' -> spec-exact 'clearance-verified'; the WP12
  implemented-bullet zero-claim gains its R14 dispersion-set/Wilson tags
  [L1: ds-v1; L2: ds-v2; Wilson 95% UB 0.0130]; 'compliant, geometry-keyed
  clamp' -> 'geometry-keyed clamp with mechanical compliance' (removes the
  banned-word ambiguity)
- The stale spec section-1 rationale clause ('because the current campaign
  shows a nonzero keep-out violation rate') is REPORTED in the PR body as
  an owner observation, not edited (beyond the authorized replacement)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…al safety phrase in the pack summary)

- propagation.hpp: the cross-validation comment still said eps 0.5 m from
  before the measured-linearization retune; now points at kCrossValEpsM =
  2.0 m with the measured 0.52 m worst case
- evidence pack section 1: the spec section-1 binding phrase
  ('passively-safe approach design with clearance-verified aborts') now
  appears verbatim in the executive summary with the mechanically-derived
  numbers (it existed in README but not in the pack's summary text)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@HeliCorgi HeliCorgi merged commit bb1b8a4 into master Jul 4, 2026
2 checks passed
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