3a03617d6b
Second verb dissolution (#210) closed drift-clean. Architect: no ledger drift. What holds (architect, verified against the diff + a live test run): - Byte-parity proven, not assumed — the exact-grade anchor runs green through the dissolved path; {"family_id":"generalize-0"} survives (the per-cell Sweep families take a distinct campaign-prefixed name). - C18 stamping preserved — the member runner maps cell.regime -> StopRule::Vol and stamps manifest.instrument; the anchor confirms regime-seam R == former grid-axis R. - run_campaign_returning/present_campaign split is behaviour-preserving — the run record is written inside execute, so the sugar path (bypassing the presenter) still records it. - Q4 is not drift — the +2 per-instrument Sweep families are the executor's uniform, reproducible audit artifacts (sweep-dissolution precedent, C18-consistent); stdout unchanged; the relaxed family pin is faithful. Regression: cargo test --workspace green (every crate 0 failed); clippy --workspace -D warnings clean. Drift resolution: - [medium] no-window generalize grades over symbols[0].full_window (one shared window) vs the inline path's per-instrument windows. RATIFIED: a single shared window is the campaign model's natural expression, the explicit-window path (both e2e + the exact-grade anchor) is byte-identical, and symbols[0] is a pragmatic pick; no value pin because a full-archive grade is fragile against archive growth. Deferred design reconsideration filed as #213. - [low] two #[allow(too_many_arguments)] in verb_sugar.rs — carry-on; the arg-bundling refactor is best done once the remaining verbs dissolve (#214). Spec + plan removed at cycle close (git-tracked in this project). refs #210