Retire the hard-wired aura-cli harnesses once topology-data + World construction land #159
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
C20/C24 (docs/design/INDEX.md) name the hard-wired harnesses in crates/aura-cli/src/main.rs — the HarnessKind enum, run_stage1_r, and the per-strategy *_sweep_family functions (stage1_r_sweep_family, momentum_sweep_family, and siblings) — as pre-C24 scaffolding: topology baked as engine source compiled into the binary, a tension with C16 (no project signals in the engine repo).
Once topology is a World-owned data value (this milestone) and the World constructs harnesses from data — plus the project-as-crate authoring layer lands (the #109 authoring thread) — these hand-coded harnesses and their bespoke sweep-family plumbing are replaced by data blueprints the World builds, and the scaffolding can be removed.
Idea, gated: dependent on the construction service #157 and on the project-as-crate authoring layer (a separate milestone, not yet seeded). Droppable / no commitment until those land; recorded here so the cleanup is not lost.
Discoverability finding — cycle-0088 fieldtest
The cycle-0088 fieldtest surfaced a CLI-surface gap that belongs with this issue's usage rework: the construction subcommands shipped without any in-CLI discovery path. Neither
aura(no args, exit 2),aura --help, nor any public doc (glossary, project-layout) mentionsaura graph buildoraura graph introspect; the top-level usage string lists only the bareaura graph(HTML-render) arm.aura graph build --helpandaura graph introspect --helpboth swallow the--helptoken and print the giant top-level usage at exit 0 — there is no per-subcommand help and no statement anywhere of the op-list document shape.When this issue's CLI rework lands, fold in: advertise
graph build/graph introspectin the usage string, and add a per-subcommand--helpdocumenting the op-list shape (op kinds, the typed-Scalar bind form{"I64": <v>}, capitalizedkind). Evidence:fieldtests/cycle-0088-construction-op-script/FINDINGS.md(spec_gap "construction surface undiscoverable from the CLI").The 2026-06-30 milestone fieldtest on the C24 topology-as-data surface (
fieldtests/milestone-topology-as-data/) surfaced three CLI-surface gaps that the harness-retirement / data-authoring CLI tracked here should address:aura --helpandaura graph --helpboth list onlyaura graph— neitherbuildnorintrospectappears, and the introspect flags are discoverable only by triggering a usage error with a bad argument. A consumer with only the binary cannot find the milestone's headline CLI surface.aura graph(no subcommand) silently streams the ~1.4 MB HTML viewer to stdout and exits 0 — it should print usage on a TTY rather than dump HTML.aura graph run <blueprint.json>to close the loop. The CLI authors and emits topology but cannot run an emitted blueprint or show its trace, so reproducing a run drops out of the data surface into hand-wired Rust plus a non-serializable sink. The build->consume CLI edge belongs with this retirement (related: #28).Empirically confirmed by the World/C21 milestone fieldtest (2026-07-01)
The milestone fieldtest (from the public interface only) found the entire
blueprint-data verb family is invisible at the CLI:
aura --help,aura graph --help,aura graph build --help, andaura graph introspect --helpALL print the identical generic usage string, which lists only thehard-wired
--harness/--strategyforms. None of the shipped milestone verbsappear —
graph build,graph introspect,run <bp.json>,sweep <bp> --list-axes,sweep <bp> --axis,mc <bp> --seeds,walkforward <bp> --axis.The repo has no README, so the whole surface is discoverable ONLY from the design
ledger (a design doc, not a user guide) + the op-script grammar block inside C24.
A downstream consumer with just the binary +
--helpcannot find any of themilestone's own surface. This is the discoverability half of #159 (surface
build/introspect + the family verbs in
--helpand/or a README), now withempirical evidence that it blocks a real consumer path.
Detail: docs/specs/fieldtest-milestone-world-c21-blueprint-data-families.md
(committed
780d823, the [spec_gap] --help finding).Audit note (cycle 0100, the stage1→r-family rename): the family-shared grid RGrid::default() seeds its stop knobs from the member-branded R_SMA_STOP_LENGTH / R_SMA_STOP_K consts (crates/aura-cli/src/main.rs:1084,:2450), which also feed the r-breakout / r-meanrev sweep families — pre-rename debt (the old Stage1RGrid seeded from STAGE1_R_* the same way), now more visible under the member-branded names. This scaffolding is inside the surface this issue retires; no separate fix planned.
Decision log — hard-wired demo retirement (autonomous run, 2026-07-07)
This run retires all five hard-wired aura-cli demo strategies from production
code. The R-family (
r-sma,r-breakout,r-meanrev) migrates to exampleblueprint-DATA; the legacy PIP pair (
sma,momentum) is dropped rather thanmigrated. Scope confirmed against the current tree (
b761b3c): the written gates(construction service, project-as-crate layer, topology-as-data milestone) have
all landed, so nothing open blocks the R-family route.
User decisions (provenance)
aura-cli; take the data route instead (chosen2026-07-07). The crate stays bin-only — no
[lib], nopubon the internalbuilders, no cargo
examplelinking them. Each demo's internal builder emitsits blueprint JSON once, the JSON ships as a checked-in data fixture, a
byte-identity test loads and grades it, and only then is the internal Rust
builder deleted. The byte-identity anchor — not code-preservation by
extraction — carries the equivalence proof.
sma/momentum), do not migrate it (chosen2026-07-07). Both terminate in
SimBroker(pip_size), a construction-arg nodedeliberately excluded from the zero-arg
std_vocabulary, so they cannotround-trip as data without the #156-class construction-arg surface — and they
are the legacy pip yardstick the cost-model rework already retired. Delete
rather than carry.
as the proof (stated 2026-07-07: they are demos and belong in the examples
folder, outside production code; keeping them as examples is simultaneously
the proof the data successors work).
Derived fork decisions (rationale)
verbs, and does the
--strategy r-smatoken survive? → No break; tokensurvives as sugar. Derived. Each dissolved path (
generalize/walkforward/mc --strategy r-sma --real) touches a builder at exactly onesite to synthesize canonical blueprint bytes —
sma_signal(None, None)atcrates/aura-cli/src/main.rs:4530,:4873,:4998. Everything downstream isbytes-driven: the store, the
verb_sugartranslators (content-address only),and the campaign executor which reloads via the generic
wrap_r(
crates/aura-cli/src/campaign_run.rs:735) — never a builder. The dissolveddispatchers gate on the raw string
a.strategy.as_deref() == Some("r-sma"),not the
Strategyenum, so the token survives as pure sugar ("load theshipped
r-smaexample") after the built-in sweep grid dies withStrategy::RSma. Basis: topology is content-/path-addressable end-to-end pastthe single synth site, so nothing structural needs the builder.
r-breakout is mechanical: its signal leg (
main.rs:3440-3451) isvocabulary-clean and its lone
LinCombsits in the r_equity trace branch, notthe signal — carving
price→biasout mirrors the finishedsma_signal→wrap_rsplit. r-meanrev carries a micro-choice: its band nodeis
LinComb::builder(1).bind("weights[0]", band_k)(main.rs:3504), aconstruction-arg node excluded from
std_vocabularyby a pinned invariant, sothe leg cannot round-trip until
k*sigmais re-expressed with zero-arg nodes(
EqConst(band_k) → Mul(sigma, ·), both rostered). Basis: the vocabulary'sconstruction-arg exclusion is a pinned design invariant — the resolution is to
re-author the band node, never to admit
LinComb; this edits the meanrevbuilder (and its topology hash) before any emit.
blueprints ship as user-facing runnable examples (runnable via
aura run <bp.json>), doubling as the byte-identity proof, honoring the stated"belong in the examples folder" intent. The exact directory — reuse the
existing
crates/aura-cli/tests/fixtures/(where the r-sma blueprint alreadylives test-paired) versus a new user-facing
examples/gallery — is pinned atspec time under grounding; it is a directory label, not a design fork.
Sequencing
byte-identity anchor + load-and-run E2E already exist. Establishes the home,
the golden-grade test pattern, and the dissolved-verb disk-swap.
price→biasout ofr_breakout_graph, route throughwrap_r, emit → ship → golden-test → delete the inline sweep family.k*sigmaasEqConst→Mulfirst, then carve /emit / ship / golden-test / delete (last, because it needs the builder edit
before it can round-trip).
SmaCross/Momentum/Macdbuilders.Strategyenum,strategy_from,cli_token,HarnessKind, and the built-in grid clap flags now that no builder remains.Refactor harvest opened by the delete
RGrid::defaultand theR_SMA_STOP_LENGTH/R_SMA_STOP_Kconsts(
main.rs:1105-1116,:2522,:2526) become fully dead — threaded onlythrough the three R sweep/wf builders. In scope (dies with the R inline arms).
main.rs:1123-1155) isentirely R-family-scoped and goes dead — #167 is effectively closed by this
deletion.
HarnessKind(main.rs:3716) and its dispatch are demo harnesses → dead. Inscope.
wrap_r, whichsurvives as generic loaded-blueprint scaffolding. Separate.
SimBrokernode (aura-std/src/sim_broker.rs) survives — it is engine /ingest test material and used by the surviving aura-ingest GER40 example; only
aura-cli's consumer usage is removed, and its import goes dead only after all
five demos are gone.
Design settled; forks derived. First cut is the r-sma data-route template.
Spec auto-signed (specify, /boss autonomous)
Cut 1's spec — retire the r-sma demo builder from aura-cli, replacing its
topology with a shipped runnable blueprint-data example that reproduces the
built-in grade byte-for-byte — was signed by an independent grounding-check
PASS: a fresh-context agent's verdict against the currently-green goldens, not
the orchestrator's own confidence. No human signed; this records the autonomous
sign for after-the-fact veto.
The check ratified all six load-bearing current-behaviour assumptions and
confirmed the dissolved-verb real-archive equivalence anchors execute (not skip)
on this host — so the byte-safety guard for the three dissolved-verb synth-site
swaps is a genuine executing test, not a green-by-skip. The retirement keeps the
generic
run_signal_r/wrap_rscaffolding; only the r-sma builder and itsinline built-in arms (
--harness r-sma,sweep --strategy r-sma) go, repointedonto the
aura run <example>/aura sweep <example_open> --axisdata paths.Spec is git-tracked per the aura spec lifecycle; it will be committed with the
plan and removed at cycle close.
Scope split — Cut 1 becomes copy+prove, retirement follows (derived, /boss)
Plan recon surfaced that deleting
sma_signalhas a far larger transitiveclosure than the first spec's hand-list saw.
sma_signal→r_sma_graphisreached not only by the three
--realdissolved synth sites and the--harness r-sma/sweep --strategy r-smabuilt-ins, but also by the entiresynthetic inline r-sma surface:
r_sma_space(main.rs:1267),r_sma_sweep_over(:1280),
run_oos_r(:1346), thewalkforward_familyStrategy::RSmaarm(:1763), and
run_mc_r_bootstrap(:2106) /mc_r_bootstrap_report(:2119) — plusthe
Strategy::RSmaenum variant and its arms, the twin emitteremit_demo_signal_open_fixture(:6412), and ~40 integration tests(
--harness r-sma, synthetic--strategy r-sma, and the inlinesweep_strategy_r_sma_no_flags_keeps_the_default_gridgrade golden).Decision — split into two cuts (derived)
Basis (user method, provenance): the user set the retirement method
(2026-07-07): the demos are first copied to blueprints with a load-bearing proof
that the result is identical to the original, kept as examples, and only once
the proof stands are the originals removed and the then-generic code cleaned up.
The recon's blast-radius finding is exactly why that ordering matters — so Cut 1
is split along the user's own copy→prove / then-remove seam:
crates/aura-cli/examples/r_sma.json(closed 2/4) and
r_sma_open.json(open) as verbatim copies of the twocommitted fixtures; add the load-bearing byte-fidelity proof (while the builder
is still alive):
include_str!(examples/r_sma.json) == blueprint_to_json(&sma_signal(Some(2),Some(4)))and the open twin against
sma_signal(None,None); add the durable grade anchoraura run examples/r_sma.json→ the pinnedr_sma_single_run_output_goldenmetrics. No deletion, no fixture move, no synth-site swap, no test repoint — the
builder and every inline surface stay. Tiny, safe diff that freezes the proof.
closure, move the fixtures into
examples/(repointing every reader), swap thethree
--realsynth sites toinclude_str!("../examples/r_sma_open.json"),repoint/drop the ~40
--harness/--strategy r-smaintegration tests, andresolve the two recon judgement calls below. The byte-fidelity proof from Cut 1
is what makes the swap-and-delete safe.
This quarantines every hard scope question into Cut 1b and leaves Cut 1
trivially clean.
Cut 1b site set (from recon, durable handoff)
Delete (crates/aura-cli/src/main.rs):
sma_signal(2589),r_sma_graph(2653),run_r_sma(3592),r_sma_sweep_family(~1157),r_sma_space(1267),r_sma_sweep_over(1280),run_oos_r(1346),walkforward_family::RSmaarm(1763),
run_mc_r_bootstrap(2106),mc_r_bootstrap_report(2119),emit_demo_signal_fixture(6402) +emit_demo_signal_open_fixture(6412),loaded_signal_runs_bit_identical_to_rust_built(6423), the Cut-1 byte-fidelityproof tests (they reference the builder), and the dead consts
R_SMA_FAST/R_SMA_SLOW/R_SMA_BIAS_SCALE(2532/2533/2539). Remove theStrategy::RSmavariant + arms (1578/1647/1763/2123/4375) and the
HarnessKind::RSmavariant +arm (3719/3764/4177/4192). KEEP
run_signal_r,wrap_r,RGrid,R_SMA_STOP_LENGTH/R_SMA_STOP_K(used by the kept generic path + cuts 2/3).Repoint (path/arm): synth sites 4530/4873/4998 → embed open example; the 3
include_str!fixture sites (6100/6107/6115); everytests/fixtures/sma_signal*.jsonreader — cli_run.rs (~26 refs), research_docs.rs (375/801/2179), project_load.rs
(121), graph_construct.rs (432/450/467/478/508/529 via the
fixture()helper);the
--harness r-smaand inline--strategy r-smasubprocess goldens.Two Cut-1b judgement calls (recon Open Questions, deferred): (a) unit tests
main.rs:6163(sma_signal(2,60)deep-lookback vacuous-MC probe) and:6439(
sma_signal(3,4)distinct-topology-≠-hash) reference topologies no shippedexample carries — rewrite against an inline
GraphBuilder, or ship extra exampleblueprints; (b)
sweep_strategy_r_sma_no_flags_keeps_the_default_grid(:2852)pins an inline default-grid family whose axis spec may not map 1:1 to
sweep examples/r_sma_open.json --axis …— repoint or drop with the retiredinline family.
Revised spec re-signed on grounding PASS (specify, /boss)
The spec was narrowed to Cut 1 = copy+prove (per the split recorded above) and
re-passed an independent grounding-check on the new bytes — the autonomous
signature. No new capability beyond the one already recorded (ship the r-sma demo
as a runnable example proven to reproduce the built-in grade); the scope only got
more conservative — the builder deletion is deferred to Cut 1b — so no fresh veto
prompt was raised.
Grounding confirmed the copy+prove assumptions and flagged that the new
byte-fidelity test is the first fixture-vs-builder byte lock (no existing test
compares fixture bytes to live
blueprint_to_jsonoutput). Mitigation folded intothe plan: the two examples are generated from the current builder output
(
blueprint_to_json(&sma_signal(…))), so the fidelity proof and the grade anchorare green by construction and no pre-existing fixture staleness can block the cut.
Cut 1b forks finalized (specify, /boss)
Spec: demo-retirement-r-sma-cut1b (the retire+remove cut). The two recon
judgement calls, confirmed against the actual test bodies and decided:
blueprint_mc_family_rejects_vacuous_deep_lookback(main.rs:6155).Decision: KEEP the test, decouple its input from the builder — build the
(2,60)deep-lookback topology INLINE viaGraphBuilderin the test body.Basis (derived): the test exercises
blueprint_mc_family— a survivingblueprint-DATA function, NOT any deleted machinery — and only used
sma_signalto mint a never-warming closed doc; constructing that topology test-locally
keeps the vacuous-MC-rejection property while removing the builder dependency.
topology_hash_is_stable_and_distinguishes(main.rs:6467).Decision: rewrite to use the two shipped examples as the stable+distinct pair —
topology_hash(load(examples/r_sma.json))for stability,!= topology_hash(load(examples/r_sma_open.json))for distinction. Basis (derived):the "content-id distinguishes distinct blueprints" property is generic; the
closed and open shipped examples are a proven distinct pair, so no throwaway
blueprint is needed.
sweep/walkforward/mc --strategy r-smaand--harness r-smabuilt-in-surface tests (incl.
sweep_strategy_r_sma_no_flags_keeps_the_default_grid,cli_run.rs:2852). Decision: DROP them with the retired machinery. Basis
(derived): these pin behaviours of the built-in demo surface #159 retires — the
"default {2,3}×{6,12} grid on no flags" convenience has NO data-blueprint analog
(a data sweep names its axes explicitly); the run grade is already carried on
the data path by the Cut-1 anchor (
shipped_r_sma_example_reproduces_the_builtin_grade)and sweep by the blueprint-sweep tests. The
--strategy r-sma --realcampaign-path tests are unaffected (they route through the campaign, not the
builder) and stay green.
One coverage flag for the plan-recon (derived-but-must-confirm): the
--harness r-sma --cost-*goldens (flat-cost / carry / composed) have NOdata-path equivalent — the kept
run_signal_r(aura run <bp.json>) takes nocost parameters, so their inline cost-on-run surface retires with
--harness.Dropping them is acceptable ONLY if cost-model coverage survives elsewhere (the
campaign cost-model-graph
net_r_equitypath + the aura-std cost-node unittests). The plan-recon must confirm that surviving coverage before the drop; if
it does not survive, preserve minimal cost coverage rather than lose it silently.
Cut 1b spec auto-signed on grounding PASS (specify, /boss)
The retire+remove spec was signed by an independent grounding-check PASS — a
fresh-context agent's verdict against the currently-green anchors, not the
orchestrator's confidence. No human signed; this records the autonomous sign for
after-the-fact veto.
The check ratified all deletion targets + the KEEP set + the Cut-1 data anchors +
the dissolved-verb real-archive goldens (executing, not skipped), and RESOLVED the
one open coverage question: cost-model coverage survives robustly independent of
the retired
--harness r-smasurface — engine-level net_expectancy_r math(aura-engine/tests/r_sma_e2e.rs), the aura-std cost-node units
(vol_slippage_cost/carry_cost/cost/cost_sum), and the aura-composites cost-graph
tests. So dropping the CLI-inline
--harness --costgoldens loses no cost-modelcoverage; only the surface-bound CLI-cost numeric values retire with the surface.
The plan-recon still confirms per test before the drop.
Capability signed: the built-in r-sma demo commands (
aura run --harness r-sma,aura sweep/walkforward/mc --strategy r-smainline) retire; the r-sma demo staysreachable via
aura run examples/r_sma.json,aura sweep examples/r_sma_open.json --axis …, and the--strategy r-sma --realcampaign path (which now embeds theshipped example instead of building it).
Cut 1b planning forks — decided (planner/plan-recon, /boss)
The plan-recon for Cut 1b surfaced four orchestrator forks (and a dead-code
fallout group the spec's explicit list omitted). All derivable; decided:
aura runcost flags after--harness r-smaretires. → REMOVEthe flags.
run_r_smawas the SOLE consumer of--cost-per-trade/--slip-vol-mult/--carry-per-cycle; thematches!(harness, HarnessKind::RSma)cost-guard is a hard compile-break once the variant goes.Decision: remove the three flags from
RunCmd/RunArgs/dispatch_runentirelyand drop their three tests (
run_help_surfaces_cost_flag_units_note,run_cost_flag_on_non_r_harness_is_refused_exit_2,run_cost_flag_on_default_harness_is_refused_exit_2). Basis (derived): the flagswere bound to the retired inline harness; keeping them (guard-rewrite option)
leaves dead CLI surface whose refusal message names a now-absent
r-smaharness.Cost-model coverage survives independently (grounding-confirmed): engine-level
aura-engine/tests/r_sma_e2e.rsnet_expectancy_r math, the aura-std cost-nodeunits, and
aura-composites/tests/cost_graph.rs.McArgs::RealR. → remove; collapse the enum if single-variantresults. Basis (derived): the variant becomes unconstructed once the synthetic
r-sma R-bootstrap path goes; a leftover single-variant enum + its moot
#[allow(large_enum_variant)]is dead structure.StopArm::Open. → remove the variant + itswrap_rarm + therisk_executor_vol_openimport; leaveStopArmsingle-variant. Basis(derived):
StopArm::Openis constructed only in the deletedr_sma_graph, soit + its unused import are dead. Collapsing
StopArm→StopRuleinwrap_r'ssignature would ripple into
campaign_run.rsand the r-breakout/r-meanrevbuilders (cut-2/3 territory); a harmless single-variant enum keeps this cut
bounded and is clippy-clean.
--strategy r-smawalkforward plateau/deflationtests (
runs_family_rank_shows_deflated_line,walkforward_plateau_select_stamps_plateau_provenance,walkforward_select_argmax_is_byte_identical_to_default,walkforward_plateau_worst_stamps_worst_variant_and_label). → DROP with theretired surface; feature-coverage migrates to the campaign path via the already-
open #215. Basis (derived): the plateau/argmax/deflation machinery is generic
(kept, on
walkforward_family+ the campaign path), not r-sma-specific; only itsretired inline test surface goes. argmax-default stays covered by the kept
dissolved-walkforward tests; plateau/worst provenance is exactly what #215
("permit --select plateau in the campaign walk_forward stage") re-homes with its
own coverage. No silent loss, no new issue — #215 is the home.
Dead-code fallout the deletion forces (spec §2 list omitted; acceptance §5
forbids a
dead_codeallowance):r_sma_friendly_name+ the four{FAST,SLOW,STOP_LENGTH,STOP_K}_SUFFIXconsts go dead — this closes #167(single-source the stage1-r param-suffix remapping) by deletion; plus
StopArm::Open(Fork 3) andMcArgs::RealR(Fork 2). All removed in the deletiontask, no allowance left behind.
Cut 1b landed — the r-sma builder is retired (
f7c809e)sma_signaland its whole transitive closure are deleted; the r-sma topology nowexists only as data. The three
--strategy r-sma --realsynth sites embed theshipped open example (
include_str!); the built-in--harness r-smaand inline--strategy r-smasurfaces retire; the two fixtures moved to the examples(readers repointed). Verified by hand (not the workflow's report): full
cargo test --workspacegreen,clippy -D warningsclean, and the cut-1 gradeanchor + the dissolved-verb real-archive goldens (generalize/walkforward/mc) stay
byte-identical.
StopArmcollapsed toStopRuleinwrap_r'ssignature (its only other variant,
Open, died withr_sma_graph) — cleanerthan the planned vestigial single-variant enum; behaviour-preserving.
(
r_sma_friendly_name+ the FAST/SLOW/STOP_LENGTH/STOP_K suffix consts) wentdead and was removed.
wrap_r's cost-node-building branch is nowunreachable (nothing passes
Some(CostConfig)afterrun_r_sma's deletion) yetclippy-clean — a cleanup for when the inline cost surface fully retires.
git checkout -- main.rsrecovery silently reverted earlier tasks' edits; thislanding is a hardened re-run (forward-fix-only), verified by hand. Filed on the
plugin tracker as Brummel/Skills#23.
Remaining #159 cuts: r-breakout and r-meanrev (both need the signal-leg
carve-out; r-meanrev must re-express its
k*sigmaband as a zero-arg node first),the PIP-pair drop (sma/momentum), and a final dead-code sweep.
Design record (specify) — Cut 2: retire the r-breakout demo
Spec:
demo-retirement-r-breakout. Cut 2 of the demo retirement, applying ther-sma Cut-1/1b template one level down. The r-breakout signal leg is fused into
r_breakout_graph(unlikesma_signal, which was already a cleanprice→biasComposite), so the one added step is a bin-internal carve-out of
r_breakout_signal(channel) -> Compositebefore the leg can serialize as data.The generic run path is unchanged:
wrap_r(signal: Composite, ...)already nestsany
price→biasleg viaBlueprintNode::Compositeand wraps the identical pip/Rbranch;
run_signal_rdrives the exact pathaura run <blueprint.json>uses.Load-bearing forks, all derived (no user-preference bounce):
Fork: equivalence-proof structure — parallel vs. refactor. → keep
r_breakout_graphparallel and bridge it torun_signal_r(r_breakout_signal(..))with a byte-identity test (builder-alive), rather than refactoring the fused
builder to wrap the carved leg.
Basis (derived): the r-sma precedent kept the fused builder parallel; refactoring
it to wrap the carved leg risks a 1-ULP shift in the byte-pinned grade (IEEE-754
non-associativity), and the fused builder is deleted in this cut's second commit
anyway, so a DRY refactor buys nothing while risking the golden.
Fork: closed-example channel value. →
examples/r_breakout.jsonbindschannel = 3.Basis (derived): the existing built-in grade coverage uses
--channel 3(
sweep_strategy_r_breakout_folded_no_trace_metrics_equal_raw_trace_metrics), sobinding 3 makes the shipped closed example reproduce the exact grade already
pinned. Any single value is arbitrary; 3 is the one with existing coverage.
Fork: open-form axis exposure (channel ganging). →
examples/r_breakout_open.jsonexposes the two channel axes per-node (
channel_hi.length,channel_lo.length)as the roster naturally yields, with the ganging caveat documented against #61.
Basis (derived): blueprints expose params per node (r-sma's open form lists
fast.length+slow.lengthindependently); collapsing the two into one gangedchannelknob over data is parameter-ganging = the separate open #61, which thiscut does not own. The closed example binds both to the same value (a faithful
single-run reproduction — the load-bearing grade anchor rides the closed form);
the open form is an axis-discovery demonstration, honestly showing two axes.
Fork: durable grade anchor. → ship a byte-exact
aura run examples/r_breakout.jsonmetrics golden (survives the deletion commit), alongside the closed-ness / open-axis
graph introspect --paramsanchors.Basis (derived):
aura run <bp>emits a deterministic JSON RunReport with a fullmetricsobject (total_pips,expectancy_r,sqn, …); pinningmetrics(excluding the volatile manifest
commit) is the durable builder-free equivalenceanchor — the role the dissolved-verb
--realgoldens play for r-sma, whichr-breakout lacks (it is synthetic-only). Without it, the example's correctness
would rest only on the builder-alive proof that the deletion commit removes.
Fork:
--strategy r-breakouttoken disposition. → the token stops being arecognized strategy; the built-in
--strategy r-breakoutsweep tests drop and thedata successor is
aura sweep examples/r_breakout_open.json --axis ….Basis (derived): the retirement's stated target is the
Strategyenum + theper-strategy
*_sweep_familyscaffolding; r-sma's Cut-1b precedent dropped thebuilt-in-surface tests. The token is not kept as sugar (unlike
--strategy r-sma --real, which survives only because the dissolved verbs gate on the raw string forthe campaign path — r-breakout has no campaign path, so nothing downstream consumes
the token).
Shape: two commits at close — (A) copy+prove (carve + emit examples + byte-identity
proof + durable anchors, additive), then (B) retire (delete
r_breakout_graph+r_breakout_sweep_family+Strategy::RBreakout+ the built-in surface tests +the builder-alive proof, repoint readers). The deletion commit is forward-fix-only
and grep-verifies every deletion (Brummel/Skills#23).
Spec signed autonomously (specify, /boss) — Cut 2 r-breakout
The
demo-retirement-r-breakoutspec is signed by agrounding-checkPASS — anindependent fresh-context agent's verdict, not the producer's confidence. No human
signed; a reply vetoes. All seven load-bearing current-behaviour assumptions are
ratified by named, currently-green tests:
wrap_r's genericity over a loaded signalComposite (
shipped_r_sma_example_reproduces_the_builtin_grade), theaura run <bp.json>path (aura_run_loads_and_runs_a_blueprint_file),GraphBuilder::exposebiasboundary, the six signal-leg node types in the closedstd_vocabularyroster (
std_vocabulary_resolves_known_and_rejects_unknown), the current built-inr-breakout surface (
sweep_strategy_r_breakout_*,walkforward_unsupported_strategy_exits_2_naming_the_token), and theclosed/open
graph introspect --paramsbehaviour (the r-sma introspect anchors).The r-breakout surface is untouched by r-sma Cut 1b, so its green baseline is intact.
Cut 2 landed — the r-breakout demo is retired (
5856cad)The r-breakout topology now exists only as data
(
crates/aura-cli/examples/r_breakout{,_open}.json). The signal leg was carvedout of the fused
r_breakout_graphasr_breakout_signal(channel)— a#[cfg(test)]carve whose sole role is regenerating the examples and pinning them to a faithful
serialisation (production loads the shipped JSON, never a builder). Before the fused
builder was deleted, an equivalence test proved the carve reproduces its grade
byte-for-byte at channel=3; that gate retired with the builder, and the durable
anchors that survive are the byte-identity, the loaded-grades-identically proof, and
the closed/open introspect anchors.
Retired:
r_breakout_graph,r_breakout_sweep_family,Strategy::RBreakout(+ allfour arms), the
r-breakouttoken in the--strategyusage/docs, and the now-dead--channelflag +RGrid.channelfield. Data successors:aura run examples/r_breakout.json,aura sweep examples/r_breakout_open.json --axis channel_hi.length --axis channel_lo.length. Test surface: the three built-in sweeptests dropped; the valid-but-unsupported-token test re-pointed to
momentum(genericproperty, live until Cut 4); a new negative pins that
--strategy r-breakoutnowfalls into the generic usage error on both
sweepandwalkforward.Verified by hand (not the workflow's report): full
cargo test --workspacegreen(0 failed everywhere),
cargo clippy --workspace --all-targets -- -D warningsclean,no dead-code residue; the r-sma anchors + dissolved-verb goldens stay green. Note:
the implement-loop ran both plan tasks in one pass (the
task_rangesub-range wasnot honoured — a known workflow-args limitation), so the two-commit copy/prove-then-
retire split collapsed into this one cohesive retirement commit; the equivalence
proof still ran green before the deletion (workflow journal).
Remaining #159 cuts: r-meanrev (needs its
k*sigmaband re-expressed as a zero-argnode —
EqConst(band_k)→Mul(sigma,·)— before the signal leg round-trips), thePIP-pair drop (sma/momentum), and a final dead-code sweep + close.
Cut 3 (r-meanrev) — blocker surfaced, paused for a decision
The r-meanrev migration premise was false. Its band leg computes
band_k * sigma(a constant times a stream), and the closed 22-node std_vocabulary has no way to
express that:
EqConstis ani64 -> boolequality gate (value == target), not an f64constant-emitter.
Biasisclamp(signal / scale, -1, +1)(divide + clamp), not a plain multiply.Mulis binary (stream x stream) — the constant would need to be a second stream.LinComb(which performed the multiply) is excluded from the roster (its arity isa construction argument, #155/#156). There is no
Div, noGtConst, and noconstant-emitter node.
So — unlike r-sma and r-breakout, whose signal nodes are all rostered — r-meanrev
cannot round-trip as blueprint data with the current vocabulary. This is a genuine
vocabulary gap (a literal-constant multiply), not a mechanical carve. r-meanrev is
also a disproven strategy (the edge-research milestone found price-only
mean-reversion E[R] ~ 0), so its value is only as a demo artifact.
This is a roadmap/scope fork, not a derivable one, so it is paused for a decision
rather than guessed:
Const/Literalf64 emitter →Mul(sigma, Const(band_k))) to aura-std and roster it, then migrate r-meanrev liker-sma/r-breakout. Fills a real data-plane vocabulary gap; expands this issue into a
small feature.
--strategy r-meanrevsurface, no data successor. Cleanest; honest given it isdisproven and cannot round-trip.
sweep), file a follow-up to migrate once a constant node exists.
Cut 3 fork resolved — add a
Scalenode, then migrate r-meanrevDecision: option A (add the missing standard operator, then migrate). Basis: the
user clarified (2026-07-07) that aura's nodes are only ever built as needed, so a
missing arithmetic primitive is incidental, not a design boundary — standard
operators may be added autonomously.
The node is a
Scale(out = input * factor; one f64 input, one f64factorparam;
Firing::Any+ warm-up filter), NOT a zero-inputConst. Rationale (derived):the per-cycle eval loop gates every node through an input-firing test
(
harness.rsfires(firing, slots, …)), so a zero-inputConstwould never firewithout an engine-core scheduler change;
Scalefits the existing firing model withno core change and expresses the band directly.
band_k * sigmabecomesScale(sigma, factor=band_k)— multiplication is IEEE-754-commutative, so the gradeis byte-preserved versus the retiring
LinComb(1, weights[0]=band_k), andfactoris a bindable param (the open form's
--band-ksweep axis). A generalConst/Divstays a separate, more careful engine change for when a real blueprint needs it.
Cut 3 then follows the Cut-2 shape: carve
r_meanrev_signal(window, band_k)(usingScalefor the band) as a#[cfg(test)]price->bias Composite, shipexamples/r_meanrev{,_open}.json, prove byte-identity + fused-equivalence (deleted with
the builder) + durable anchors, then retire r_meanrev_graph + r_meanrev_sweep_family
Spec signed autonomously (specify, /boss) — Cut 3 (Scale node + r-meanrev)
The
demo-retirement-r-meanrevspec is signed by agrounding-checkPASS — anindependent fresh-context agent's verdict against currently-green tests, not the
producer's confidence. No human signed; a reply vetoes. All nine load-bearing
current-behaviour assumptions are ratified: the node-authoring surface
(
PrimitiveBuilder/Node/Ctx::f64_in, mirrored fromEqConst/Bias), thepremise that no rostered node does constant×stream today (
EqConsti64→bool,Biasclamp/divide,
Mulbinary,LinCombexcluded), the zero-input-Const-won't-firerationale (
harness.rsfires()returns false on an empty firing slice — whichvalidates choosing
Scalewith a realFiring::Anyinput over aConstemitter),the 22-entry roster with both count-pins, r_meanrev_graph's current band=
LinComb(1)signal leg,
RGrid's r-meanrev-exclusivity (sma/momentum sweep families take nogrid),
wrap_r/run_signal_rgenericity +RunMetrics: PartialEq, and theclosed/open
graph introspect --paramsbehaviour.Cut 3 landed — Scale node + r-meanrev retired to data (
257ab0b)The r-meanrev band gap (
band_k * sigma, unrostered) is filled by a newScalenode(
out = input * factor, aura-std), rostered (count-pin 22 -> 23).Scaleover azero-input
Constbecause the eval loop gates every node through an input-firing test(
harness.rs fires()) — a zero-input node never fires;Scalefits the model and, byIEEE-754 commutativity, reproduces the retiring
LinCombband byte-for-byte.r-meanrev now exists only as data:
r_meanrev_signal(window, band_k)(band =Scale)is a
#[cfg(test)]carve;examples/r_meanrev{,_open}.jsonship it. Before the fusedbuilder was deleted, an equivalence test proved the Scale-band carve reproduces its
grade. Durable survivors: byte-identity, loaded-grades-identically, the closed/open
introspect anchors (
band.factoris now a first-class sweepable axis), and — re-pointedonto the carve rather than dropped — the fades-short/long behavioural test, now the
durable carve-correctness gate.
Dead-code cascade the retirement opened (the "watch for refactors" the deletion
enables): r-meanrev was the last reader of
run_sweep's grid, so the whole vestigialbuilt-in-sweep grid apparatus retired —
run_sweep'sgridparam, the call-site gridbuild, and SweepCmd's
--fast/--slow/--stop-length/--stop-k/--window/--band-k(sma/momentum sweeps build their own blueprints and ignored these; fast/slow/stop-*
had been vestigial since cut 1b).
RGridthe struct SURVIVES — the dissolvedgeneralizeverb resolves its candidate from its fast/slow/stop_length/stop_k — so onlyits window/band_k fields go; its stale doc-comment is rewritten to its generalize-only
role. Also swept:
persist_traces_r, themetrics_objecttest helper, and theAdd/Gt/Latch/Mul/Sqrt imports (now
#[cfg(test)]).Verified by hand: full
cargo test --workspacegreen (0 failed / 62 result lines),cargo clippy --workspace --all-targets -- -D warningsclean; the r-sma + r-breakoutanchors and the dissolved-verb goldens stay green.
Remaining #159: the pip-pair drop (sma/momentum — SimBroker construction-arg + legacy
pip yardstick, dropped not migrated) and a final dead-code sweep + close.
Endgame reframed after an audit of what the retirement exposed
Cuts 1–3 landed:
r-sma,r-breakout,r-meanrevnow live only asblueprint data under
examples/, byte-identity proven before each deletion.An audit of the residue changed the shape of the remaining work.
Finding. The
fast/slowknobs inRGridand the verb-sugar are not ageneric candidate vocabulary — they are the two SMA node-names of the retired
r-smademo (examples/r_sma_open.json: twoSMAprimitives namedfast/slow, wiredfast − slowinto aBias). The sibling demos exposedisjoint axis namespaces (
channel_hi/channel_lo;mean_window/var_window/band), so no axis name is universal. Three of thefour dissolved verbs (
generalize,walkforward,mc) hardcode these nodenames as their only signal axes and embed the blueprint via
include_str!,across ~13 sites;
sweepis already axis-agnostic (--axis name=csv). Thecampaign core is already strategy-agnostic (
CampaignDoc.axesis an open map;the member runner binds by blueprint
param_spacesuffix-match), so the weld isCLI-sugar-local.
Remaining cuts.
sma/momentumdemos. Theyterminate in a
SimBroker(pip_size)construction-arg node (absent from thezero-arg std vocabulary) and report the legacy pip yardstick that C10 retired
with the realistic broker — dropped, not migrated to data.
is in fact the generalization of
generalize/walkforward/mcto arbitraryblueprint axes, dissolving
RGrid. Filed as #220 (subsumes #214).Independent defect the audit turned up: the campaign trace re-run hardcodes
the default vol-stop and false-fails the C1 drift alarm for any non-default risk
regime. Filed as #219 (RED-first).
Provenance. The audit was reviewed and this split approved on 2026-07-07:
continue the retirement with the PIP-pair drop, and carry the two exposed
concerns (verb generalization, trace-regime defect) as their own tracker items
rather than folding them into this issue.
Cut 4 (PIP-pair retirement) — load-bearing fork decisions
Three parallel recons mapped the blast radius. Four forks were derivable
(none hung on user preference); recorded here with rationale before the spec.
Fork A — transitive scope. Cut 4 removes the FULL built-in synthetic
demo surface, not only the two named strategies. Every synthetic
run/sweep/walkforward/mc runner consumes the PIP
Strategy/sample_harness/macdand cannot compile without them, and the genericblueprint + campaign path already supersedes them. In scope: the
Strategyenum +
strategy_from;run_sweep/sweep_family/momentum_sweep_family/
momentum_blueprint_with_sinks;run_sample/run_sample_real/sample_harness; the built-inwalkforward_family/sweep_over/run_oosand
run_mc/mc_family; themacdcomposite cluster;HarnessKind/run_dispatch/run_args_from. Basis: derived — compiler-forced transitiveclosure + supersession by the generic path.
Fork B — bare defaults. The flag-less synthetic defaults and
run --harness sma|macdare retired.runandsweeprequire an explicit<blueprint.json>;walkforwardandmckeep their--strategy r-sma --realsugar and their
.jsonbranch.--strategystays a recognized flag onsweep/walkforward/mc, but
sma/momentumare no longer valid values — theyfall into the same generic
Usage: aura <verb> …error the retiredr-breakout/r-meanrevtokens already produce (via the!= "r-sma"gate).Basis: derived — the run target is data (topology-as-data); a hardcoded
synthetic default is exactly the coupling this issue removes.
Fork C — bare
aura graph. Repoint the no-subcommandaura graph(andthe render self-containment test) to render a shipped example blueprint
(
examples/r_sma_open.json, loaded viablueprint_from_jsoninto theCompositethe renderer already takes), rather than dropping the no-argdefault. Basis: derived — preserves the viewer's zero-arg preview affordance
while sourcing the topology from data, mirrors the existing embed of the same
example by
generalize, and is mechanically cheap (no new render path).Fork D — viewer fixtures. Keep
tests/fixtures/sample-model.jsonand itstwo
.mjsviewer tests as a frozen static viewer corpus. Basis: derived — itis test data (sanctioned by invariant 9), already decoupled from the deleted
builder (the tests read the JSON directly), and the only nested-composite
render subject; deleting it loses viewer coverage for no gain.
Provenance: decided under the /boss bold-derive stance on 2026-07-07; the user
approved continuing the retirement with the PIP-pair drop. No roster or metric
count-pin shifts (the CLI
sma/macdcomposites are not rostered nodes).Cut 4 spec auto-signed (grounding PASS, /boss)
The PIP-pair retirement spec (Cut 4 — retire the
sma/momentumdemos and thetransitive built-in synthetic run/sweep/walkforward/mc +
macdsurface; repointthe no-arg
aura graphto a shipped example) was auto-signed on 2026-07-07 under/boss. The grounding-check returned PASS — every load-bearing assumption traces
to a currently-green test or compiler-enforced structure — which is the
autonomous signature; no human signed. The implementation plan is proceeding.
The spec is a git-ignored working file, not committed.
Cut 4 landed — the PIP pair is retired; all five demos are now off production code
ee70016dropssma/momentumand the whole built-in syntheticrun/sweep/walkforward/mc +
macdsurface they anchored (+247/−2691 acrossmain.rs,render.rs,cli_run.rs). With the R-family already migrated to data(cuts 1-3), this completes the retirement of all five hardcoded demo strategies:
the built-in-strategy machinery (
Strategy,HarnessKind, the*_sweep_familyrunners, the
macdcomposite,run_dispatch/--harness) is gone, and only thegeneric blueprint-data and campaign paths remain.
The four derived forks were applied as decided above:
run/sweeprequire anexplicit blueprint;
sma/momentumfall into the same genericUsage:error asthe retired r-* tokens (new negative test); bare
aura graphrenders the shippedr_sma_open.json; thesample-model.jsonviewer corpus stays frozen.One plan-deviation, ratified:
member_key(+MAX_KEY/fnv1a64and its unittests) was removed although the plan listed it as a survivor — after the built-in
sweep/mc retire it has no production caller (the campaign path derives its own
content key), so it is dead. The spec-compliance gate flagged the deviation; it
was verified green and ratified.
Verified:
cargo build/test --workspace(0 failed) andcargo clippy --workspace --all-targets -- -D warningsall clean.Remaining under this issue: the verb-generalization (#220) and the trace-regime
fidelity fix (#219) filed above, plus the cycle-close audit and the formal close.
Triage 2026-07-09 (tree at
68317ec) — assessed complete; only the formal close remains:5856cad(r-breakout),257ab0b(Scale node + r-meanrev),ee70016(PIP pair, +247/−2691), plus the tidy sweeps 07a73fb/3198747.a45d16b).aura graph build --helpdoes not inline the op-list grammar (the README documents it) — if that still matters it is a separate one-line task, not a reason to keep this umbrella open.Status 2026-07-10 — the originally named targets are gone: the HarnessKind enum, run_stage1_r, and the per-strategy _sweep_family functions were deleted by the demo retirement (the five demo strategies now ship as examples/.json blueprint data, commits d7fa4b4..ee70016) and the verb dissolution (#210, #220 — walkforward/mc/generalize blueprint-generic, --strategy weld and RGrid removed). Verified: no live CLI code path names a strategy or special-cases a node type; the remaining strategy-named artifacts are #[cfg(test)] carves that pin the shipped example JSONs (crates/aura-cli/src/main.rs:1870-1871, 1924-1925).
The remaining substance of this issue is the last fixture-era organ: the wrap_r scaffolding itself (single "price" input role, synthetic-pip broker, fixed sinks — crates/aura-cli/src/main.rs:1256-1324). Its retirement path — harness bindings as authorable data per C20/C24 — is concretely specified in #231; this issue closes when wrap_r's hard-wired scaffolding is replaced by that binding vocabulary.
Status 2026-07-11: the single-price data weld — the last fixture-era substance this issue tracked after its named targets were deleted — is retired via #231 (ledger C26; wrap_r now declares its root roles from a resolved binding, the Close-only open sites are generalized). What remains under this issue is wrap_r's R-scaffolding itself (broker/executor/sink wiring as compiled Rust rather than authorable harness data) — the C20/C24 annotations of 2026-07-11 name it explicitly as staying here.
Moved out of the "Real-project readiness" milestone at its close (2026-07-11): the data-weld half this milestone targeted is delivered (C26 harness input binding, #231); what this issue still tracks — wrap_r's compiled R-scaffolding (broker/executor/sink wiring) becoming authorable harness data per C20/C24 — is future design work beyond the milestone's research-loop scope.
Re-anchoring after #295 (merged
4ed6455, 2026-07-21): wrap_r — the remaining substance this issue has tracked since the 2026-07-10/07-11 comments — has moved out of crates/aura-cli/src/main.rs (the path cited in those comments) into the new aura-runner crate. It now lives at crates/aura-runner/src/member.rs:249 (pub fn wrap_r), alongside run_signal_r and run_blueprint_member in the same module; aura-cli no longer contains any strategy- or harness-construction logic (crates/aura-cli/src is now argv/dispatch/presentation only, enforced by crates/aura-vocabulary/tests/c28_layering.rs). The hard-wired pieces this issue still targets — SimBroker construction, the RiskExecutor(stop) wiring, and the fixed sink topology (member.rs, wrap_r body) — are unchanged in kind, only relocated.The decided document-first direction (#300, "Complete the document-first migration: the run quintet's residual flags become document vocabulary") is now the concrete vehicle for part of this: its scope explicitly includes --stop-length/--stop-k, which are wrap_r's StopRule parameters (member.rs:255). #300 does not yet cover the rest of wrap_r's compiled scaffolding (SimBroker's pip_size, the RiskExecutor construction, the fixed broker/executor/sink graph shape) — its scope note defers exactly where each flag lands and does not mention broker/executor wiring. This issue should stay open, tracking the residue #300 does not absorb: wrap_r's broker/executor/sink construction becoming authorable harness data rather than compiled Rust, per C20/C24. Recommend revisiting scope once #300 lands, since it may absorb the stop-rule slice and leave only the broker/executor/sink wiring as this issue's remaining content.