chore(cli,ledger): #217 cycle-close audit — coverage backfill + stop-knob helper

Cycle-close audit for the stop-default cycle (af8564d RED + 2102305
GREEN). Architect review: what holds — the argv extractors and the
campaign member runner default to the same single-sourced regime
constants; the multi-value refusal and the C10/C20 regime semantics
survive; manifests stamp the resolved stop (C18). Three drift items,
all resolved fix-path here:

- generalize's default path was shipped untested; added the
  generalize_args_from_defaults_missing_knobs_to_the_regime unit test
  mirroring mc's sibling.
- The None=>default / Some=>parse+single-value stop block recurred 4x
  across the walkforward/mc extractors; extracted into the generic
  stop_knob_or helper (refusal strings byte-identical; generalize's
  typed unwrap_or extractor deliberately not unified — no parsing
  there).
- Ledger stop-defaulting note now records the two default
  representations: sweep binds no regime (late-resolved by the member
  runner), the three verbs bind the default eagerly into the document
  — same R behaviour, deliberately different content ids.

Regression gate green, no baseline moved: full workspace suite 0
failures across all test-result groups; clippy -D warnings clean;
cargo doc 0 warnings. No spec/plan working files existed (tdd entry
path — the committed executable spec is the contract).

refs #217
This commit is contained in:
2026-07-09 16:48:49 +02:00
parent 210230596e
commit 68317ec95d
2 changed files with 58 additions and 41 deletions
+9 -1
View File
@@ -960,7 +960,15 @@ 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
absent-serializing for content-id parity. Two default *representations*
coexist by design (#217): a dissolved sweep binds no regime at all
(`risk: []`), late-resolved per member by `stop_rule_for_regime` at run
time, while walkforward/mc/generalize — whose `--stop-length`/`--stop-k`
became optional — bind the default regime *eagerly* into the campaign
document (`risk: [Vol{length:3,k:2.0}]`). Same R behaviour either way, but
deliberately different document content ids: a stop-less verb invocation's
document equals its explicit `--stop-length 3 --stop-k 2.0` spelling, not
a stop-less sweep's document. 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.