feat(cli): finalize the risk-regime axis — ledger note + clippy-clean regime check (#210 T5)

The last slice of the risk-regime structural axis. The sugar parity
(`translate_sweep` emitting `risk: vec![]`, absent-serializing) and the
real-data two-regime e2e landed in the earlier slices (the loop's self-correction
and its e2e phase), so this closes the remaining pieces:

- design-ledger note: the risk regime realizes the StopRule structural axis at
  the campaign-document level — kept-separate keying, compared-not-selected (the
  R-unit argument), the C18 stamp, absent-parity, and the deferred trace gap
  (#212).
- clippy: `validate_campaign`'s regime check reads `k <= 0.0 || k.is_nan()`
  instead of `!(k > 0.0)` (neg_cmp_op_on_partial_ord), behaviour-identical.

Full workspace suite green; clippy clean.

refs #210
This commit is contained in:
2026-07-06 14:56:16 +02:00
parent c62f7e9878
commit 50d3db7028
2 changed files with 23 additions and 2 deletions
+20
View File
@@ -938,6 +938,26 @@ dedicated `aura-composites` crate, so `aura-engine`'s runtime dependency stays
`aura-core`-only and `aura-std` is an `aura-engine` `[dev-dependencies]` (the graph
stays acyclic).
**Realization (2026-07-06 — the risk regime as a structural campaign axis, #210).**
The `StopRule{Fixed,Vol}` structural axis is realized at the campaign-document
level as `CampaignDoc.risk: [RiskRegime]` (a serializable, content-addressable
mirror of the runtime enum — `aura-research`, sole variant `Vol{length,k}`, the
fixed-stop rule additive when needed). It is a **kept-separate** matrix axis, a
peer of instruments and windows: the executor keys the nominee map by
`(strategy, window, regime)`, so generalize aggregates across instruments
*within* a regime, never across regimes. Regimes are therefore **compared** at
presentation, never argmax-**selected** across — a cross-regime E[R] argmax would
compare R-multiples in different R units (the stop defines 1R), so the legacy
verbs' `--stop-length`/`--stop-k` joint stop grid is retired as a campaign
methodology (finding the best regime = the same walk-forward / worst-case-R
validation, run once per regime, and picking the most robust — a comparison, not
a search). Each member manifest stamps its resolved stop (default included),
closing the C18 gap; absent/empty `risk` = one implicit default regime,
absent-serializing for content-id parity. Deferred (documented): regime-aware
**trace** persistence — the trace re-run and cell-key dir naming still assume the
default stop, since `CellRealization` carries no regime (`#212`); the core
run/stamp/generalize path is unaffected.
**Realization (cycle 0066).** SQN is the operational single-number objective for
ranking an r-sma sweep family by signal quality — C12 **axis-2 (argmax-metric)**
over the C18 family store. `metric_cmp` (`aura-registry`) learns the