audit: cycle metric-vocabulary tidy — ledger records the retired #147 deferral

Cycle-close audit (architect: drift_found, design core clean). What holds,
architect-confirmed: C18 bit-identity for RunMetrics (prose derived
byte-identically, rng order preserved, registry suite unchanged); the C10
wall (monomorphic R-gates, r_based in the R vocabulary, cross-vocabulary
refusal tested both ways — no leak); C28 direction (trait in aura-analysis,
vocabulary supplied from the outer rungs, zero Cargo edge changes); C1
determinism pinned through the generic path.

Drift items, all resolved as fixes in this commit:
- design ledger: the C28 #147 disposition now records item 2 SHIPPED (the
  A1 cut) with A2 still deliberately deferred; the #136 one-implementor
  clause carries a supersession note (the IC is the second implementor).
- seven stale doc comments describing the pre-#147 or mid-cycle state
  (analysis trait + estimator docs, registry check_r_metric C9 claim,
  engine re-export note, campaign PER_MEMBER_METRICS roster note,
  member-seam guard comment, research vocabulary note) updated to the
  shipped state.
- R_BASED_METRICS is now oracle-pinned against RunMetricKey::r_based()
  in the vocabulary test (it feeds the NonRMetric refusal prose; a
  divergence would have misreported the R-gate silently).

Noted, not amended (history stays): commit 6744f67's body says 'three
syntax-only edits' where the test module actually took five.

No regression scripts are configured (the bench is report-only); the
architect review is the gate. Verification: extended vocabulary test,
campaign suites, analysis/research suites green; clippy --workspace
-D warnings clean.

refs #147
This commit is contained in:
2026-07-20 20:03:02 +02:00
parent 0651e16146
commit 2cf4574e33
8 changed files with 61 additions and 30 deletions
+23 -11
View File
@@ -1358,7 +1358,10 @@ in the #136 thread):** the `aura-registry` `Metric` / `metric_cmp` / deflation v
**stays in the registry by design** — the registry is the trading *selection* layer, not
the domain-free engine, and its deflation statistics branch irreducibly on metric
identity (R-bootstrap vs. `total_pips` dispersion floor); forcing genericity would be a
one-implementor abstraction. **Deferred to the World / C21 layer (explicitly *not* #136):**
one-implementor abstraction. *(Superseded 2026-07-20: measurement's IC became the second
implementor — #290 — and the vocabulary moved behind the `MetricVocabulary` trait
supplied by the outer rungs; see the C28 #147 disposition.)* **Deferred to the World /
C21 layer (explicitly *not* #136):**
making `RunReport` generic over a metric type and turning the orchestration/registry layer
into a reusable domain-agnostic substrate — until then `RunReport` / `RunManifest` /
`summarize` stay trace-coupled in the engine.
@@ -2677,16 +2680,25 @@ cleanly by layer, so the layering is realized only partially:
`M = RunMetrics` (`aura-backtest → aura-engine`, an outer→inner edge). The
ladder direction is enforced for the engine/backtest/analysis rungs by the
structural test (`c28_layering`, seven-row table).
- **#147 split, partially retired (user-ratified 2026-07-20).** Item 1 — the
metric genericity `RunReport<M>` — shipped as phase 2 above (#292). Item 2 —
abstracting the registry `Metric`/`metric_cmp`/deflation vocabulary — stays
deferred: the registry sits in the process column, whose trading-awareness
this contract permits (`aura-registry → aura-research`, column-internal and
legal), and the tree still holds exactly one metric consumer — a measurement
run reports tap names, not metrics. It lifts when measurement supplies its
first deflatable metric (a tap-to-scalar reduction carrying its own null
model, #290); the original one-implementor rationale (#136, user-ratified
2026-06-27) holds until then. See #147 for the full disposition.
- **#147 retired (user-ratified direction 2026-07-20; shipped the same day).**
Item 1 — the metric genericity `RunReport<M>` — shipped as phase 2 above
(#292). Item 2 — the registry deflation vocabulary — shipped as the ratified
"A1" cut, its deferral trigger having fired when measurement supplied its
first deflatable metric (the IC, #290): the deliberately narrow
`MetricVocabulary` trait (resolve/roster/direction/value/one null draw)
lives in `aura-analysis`, re-exported through `aura-engine`; the R
vocabulary (`RunMetricKey`, `r_based`, the rosters, the centred
moving-block `null_draw`) is supplied by `aura-backtest`; the registry's
rank/optimize/deflate machinery is generic over `M: MetricVocabulary` with
refusal prose derived from the carried roster; the IC (`aura-cli`) is the
second production implementor, bringing its within-run permutation null.
The C10 wall stays monomorphic (`check_r_metric`/`generalization` accept
only the R vocabulary; `r_based` is the enforcement point). Explicitly
still deferred ("A2"): measurement runs as sweep-family citizens (report
unification, campaign engine generic-over-M) — until a concrete
family/campaign demand exists. The #136 one-implementor rationale is
superseded by the second implementor; the registry's process-column
trading-awareness holds unchanged. See #147 for the full disposition.
- The `aura-std` four-layer roster is now cut by layer (phase 4, #288): `aura-std`
holds the engine nodes only (arithmetic/logic/rolling + the generic sinks);
`aura-market` (`session`, `resample`), `aura-strategy` (`bias`/`stop_rule`/