Deliver per-member trace-writing on sweep/walkforward (--trace writes traces) #224

Closed
opened 2026-07-09 22:50:53 +02:00 by Brummel · 2 comments
Owner

Carved out of #168 (the --trace no-op bug). #168's minimal honest fix rejects
--trace on sweep/walkforward with a forward-pointer (the flag is currently a
silent no-op — the clap help promised "also persists each member's taps" but
run_blueprint_sweep does let _ = persist and the --real sugar sets
persist_taps: vec![]). This issue tracks DELIVERING the advertised capability so
the refusal can be lifted.

Direction (not prescriptive)

Translate --trace <fam> into a persist_taps campaign-presentation block so each
swept member's tap series is written to traces/<cell_key>/ via the existing
persist_campaign_traces mechanism (campaign_run.rs:638). Cover both sweep paths:
the plain blueprint sweep (run_blueprint_sweep, main.rs — currently
let _ = persist) and the dissolved --real path (the verb_sugar.rs
translators, currently persist_taps: vec![]). On landing, lift the #168 refusal
and restore the (now-honest) help lines + the chart NotFound hint that
recommends sweep --trace as the way to record traces.

  • depends on: nothing (the persist_taps / persist_campaign_traces machinery
    already exists)
  • context: #168 refuse-with-pointer follow-up (the #215 "not yet available on this
    path" pattern); surface-honesty arc.
Carved out of #168 (the `--trace` no-op bug). #168's minimal honest fix rejects `--trace` on `sweep`/`walkforward` with a forward-pointer (the flag is currently a silent no-op — the clap help promised "also persists each member's taps" but `run_blueprint_sweep` does `let _ = persist` and the `--real` sugar sets `persist_taps: vec![]`). This issue tracks DELIVERING the advertised capability so the refusal can be lifted. ## Direction (not prescriptive) Translate `--trace <fam>` into a `persist_taps` campaign-presentation block so each swept member's tap series is written to `traces/<cell_key>/` via the existing `persist_campaign_traces` mechanism (campaign_run.rs:638). Cover both sweep paths: the plain blueprint sweep (`run_blueprint_sweep`, main.rs — currently `let _ = persist`) and the dissolved `--real` path (the `verb_sugar.rs` translators, currently `persist_taps: vec![]`). On landing, lift the #168 refusal and restore the (now-honest) help lines + the chart `NotFound` hint that recommends `sweep --trace` as the way to record traces. - depends on: nothing (the `persist_taps` / `persist_campaign_traces` machinery already exists) - context: #168 refuse-with-pointer follow-up (the #215 "not yet available on this path" pattern); surface-honesty arc.
Brummel added the feature label 2026-07-09 22:50:53 +02:00
Author
Owner

Scope note (from the #168 audit-close): the RunCmd/McCmd --trace help and the design-ledger amendment now point CLI --trace restoration here, so this issue is the umbrella for restoring CLI-side --trace trace-writing across verbs — single-run (run --trace, ledger amendment 3b56efb) and per-member (sweep|mc|walkforward --trace, #104) — since both share the TraceStore/persist mechanism. The single live writer today is the campaign presentation.persist_taps (persist_campaign_traces); see the 'CLI --trace retired' amendment in docs/design/INDEX.md for the full picture.

Scope note (from the #168 audit-close): the RunCmd/McCmd --trace help and the design-ledger amendment now point CLI --trace restoration here, so this issue is the umbrella for restoring CLI-side --trace trace-writing across verbs — single-run (`run --trace`, ledger amendment 3b56efb) and per-member (`sweep|mc|walkforward --trace`, #104) — since both share the TraceStore/persist mechanism. The single live writer today is the campaign presentation.persist_taps (persist_campaign_traces); see the 'CLI --trace retired' amendment in docs/design/INDEX.md for the full picture.
Brummel added this to the Real-project readiness — role-complete research loop (no freeze) milestone 2026-07-10 17:16:15 +02:00
Author
Owner

Landed as fe4ea0a (RED: refusal lifts + non-empty tap files under runs/traces/ — deliberately layout-agnostic) + 00e15b9 (GREEN). Decisions taken:

  1. Per-member contract honoured in full: every member of a selection-free swept cell gets its own trace subdirectory <trace_name>/<cell_key>/<member_key>/, where <member_key> is the member's manifest params label in reproduce's exact rendering (filesystem-sanitized; member ordinal as fallback for an empty params join). Nominee-bearing cells keep the flat <cell_key>/ layout. Nominee-only writing was rejected — the title and the promised help text say "each member's taps".
  2. Umbrella scope resolved: walkforward lifts identically (same persist tail); run --trace and mc --trace stay refused BY DESIGN — run has no campaign context and mc --real has no family-name concept, and their help text already described that reality (not a #168-style placeholder). If a single-run trace path is wanted later it is a separate design, not a mechanical ride-along.
  3. One fixture correction on the RED test itself: its argv lacked the second open axis (slow.length), tripping the pre-existing bind_axes every-param-covered invariant with exit 1 — unrelated to the #224 contract; the missing --axis sma_signal.slow.length=8 line was added, assertions untouched (the pre-fix refusal fired argv-independently, so the RED property was preserved).
  4. Post-review hardening: member_trace_key + the per-member fan-out extracted pure and unit-pinned (6 tests at the CellOutcome seam, no archive needed); members re-run at the cell's own stop regime and resolved pip with the determinism drift alarm preserved per member, streaming one member at a time.

Verified end-to-end on the GER40 archive for both sweep and walkforward; full workspace suite green. Closes via commit on merge.

Landed as fe4ea0a (RED: refusal lifts + non-empty tap files under runs/traces/ — deliberately layout-agnostic) + 00e15b9 (GREEN). Decisions taken: 1. Per-member contract honoured in full: every member of a selection-free swept cell gets its own trace subdirectory `<trace_name>/<cell_key>/<member_key>/`, where `<member_key>` is the member's manifest params label in reproduce's exact rendering (filesystem-sanitized; member ordinal as fallback for an empty params join). Nominee-bearing cells keep the flat `<cell_key>/` layout. Nominee-only writing was rejected — the title and the promised help text say "each member's taps". 2. Umbrella scope resolved: walkforward lifts identically (same persist tail); `run --trace` and `mc --trace` stay refused BY DESIGN — `run` has no campaign context and `mc --real` has no family-name concept, and their help text already described that reality (not a #168-style placeholder). If a single-run trace path is wanted later it is a separate design, not a mechanical ride-along. 3. One fixture correction on the RED test itself: its argv lacked the second open axis (`slow.length`), tripping the pre-existing bind_axes every-param-covered invariant with exit 1 — unrelated to the #224 contract; the missing `--axis sma_signal.slow.length=8` line was added, assertions untouched (the pre-fix refusal fired argv-independently, so the RED property was preserved). 4. Post-review hardening: member_trace_key + the per-member fan-out extracted pure and unit-pinned (6 tests at the CellOutcome seam, no archive needed); members re-run at the cell's own stop regime and resolved pip with the determinism drift alarm preserved per member, streaming one member at a time. Verified end-to-end on the GER40 archive for both sweep and walkforward; full workspace suite green. Closes via commit on merge.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Brummel/Aura#224