Retire the hard-wired aura-cli harnesses once topology-data + World construction land #159

Open
opened 2026-06-29 12:59:09 +02:00 by Brummel · 28 comments
Owner

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.

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.
Brummel added this to the Topology-as-data: blueprint serialization & loader (C24) milestone 2026-06-29 12:59:09 +02:00
Brummel added the idea label 2026-06-29 12:59:09 +02:00
Author
Owner

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) mentions aura graph build or aura graph introspect; the top-level usage string lists only the bare aura graph (HTML-render) arm. aura graph build --help and aura graph introspect --help both swallow the --help token 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 introspect in the usage string, and add a per-subcommand --help documenting the op-list shape (op kinds, the typed-Scalar bind form {"I64": <v>}, capitalized kind). Evidence: fieldtests/cycle-0088-construction-op-script/FINDINGS.md (spec_gap "construction surface undiscoverable from the CLI").

## 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) mentions `aura graph build` or `aura graph introspect`; the top-level usage string lists only the bare `aura graph` (HTML-render) arm. `aura graph build --help` and `aura graph introspect --help` both swallow the `--help` token 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 introspect` in the usage string, and add a per-subcommand `--help` documenting the op-list shape (op kinds, the typed-Scalar bind form `{"I64": <v>}`, capitalized `kind`). Evidence: `fieldtests/cycle-0088-construction-op-script/FINDINGS.md` (spec_gap "construction surface undiscoverable from the CLI").
Brummel removed this from the Topology-as-data: blueprint serialization & loader (C24) milestone 2026-06-30 14:14:02 +02:00
Author
Owner

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:

  • The construction surface is invisible from the CLI's own help. aura --help and aura graph --help both list only aura graph — neither build nor introspect appears, 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.
  • Bare 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.
  • No 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).
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: - **The construction surface is invisible from the CLI's own help.** `aura --help` and `aura graph --help` both list only `aura graph` — neither `build` nor `introspect` appears, 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. - **Bare `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. - **No `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).
Author
Owner

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, and aura graph introspect --help ALL print the identical generic usage string, which lists only the
hard-wired --harness/--strategy forms. None of the shipped milestone verbs
appear — 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 + --help cannot find any of the
milestone's own surface. This is the discoverability half of #159 (surface
build/introspect + the family verbs in --help and/or a README), now with
empirical 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).

## 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`, and `aura graph introspect --help` ALL print the identical generic usage string, which lists only the hard-wired `--harness`/`--strategy` forms. None of the shipped milestone verbs appear — `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 + `--help` cannot find any of the milestone's own surface. This is the discoverability half of #159 (surface build/introspect + the family verbs in `--help` and/or a README), now with empirical 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).
Author
Owner

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.

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.
Author
Owner

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 example
blueprint-DATA; the legacy PIP pair (sma, momentum) is dropped rather than
migrated. 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)

  • No library-extraction of aura-cli; take the data route instead (chosen
    2026-07-07). The crate stays bin-only — no [lib], no pub on the internal
    builders, no cargo example linking them. Each demo's internal builder emits
    its 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.
  • Drop the PIP pair (sma/momentum), do not migrate it (chosen
    2026-07-07). Both terminate in SimBroker(pip_size), a construction-arg node
    deliberately excluded from the zero-arg std_vocabulary, so they cannot
    round-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.
  • The demos belong in an examples home, kept as runnable examples that double
    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)

  • Fork F2 — does retiring the R-family builders break the just-dissolved
    verbs, and does the --strategy r-sma token survive? → No break; token
    survives as sugar. Derived.
    Each dissolved path (generalize/
    walkforward/mc --strategy r-sma --real) touches a builder at exactly one
    site to synthesize canonical blueprint bytes — sma_signal(None, None) at
    crates/aura-cli/src/main.rs:4530, :4873, :4998. Everything downstream is
    bytes-driven: the store, the verb_sugar translators (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 dissolved
    dispatchers gate on the raw string a.strategy.as_deref() == Some("r-sma"),
    not the Strategy enum, so the token survives as pure sugar ("load the
    shipped r-sma example") after the built-in sweep grid dies with
    Strategy::RSma. Basis: topology is content-/path-addressable end-to-end past
    the single synth site, so nothing structural needs the builder.
  • Fork F3 — signal-leg carve-out for r-breakout / r-meanrev. Derived.
    r-breakout is mechanical: its signal leg (main.rs:3440-3451) is
    vocabulary-clean and its lone LinComb sits in the r_equity trace branch, not
    the signal — carving price→bias out mirrors the finished
    sma_signalwrap_r split. r-meanrev carries a micro-choice: its band node
    is LinComb::builder(1).bind("weights[0]", band_k) (main.rs:3504), a
    construction-arg node excluded from std_vocabulary by a pinned invariant, so
    the leg cannot round-trip until k*sigma is re-expressed with zero-arg nodes
    (EqConst(band_k) → Mul(sigma, ·), both rostered). Basis: the vocabulary's
    construction-arg exclusion is a pinned design invariant — the resolution is to
    re-author the band node, never to admit LinComb; this edits the meanrev
    builder (and its topology hash) before any emit.
  • Fork F1 — examples home. Derived (shallow presentation). The R-family
    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 already
    lives test-paired) versus a new user-facing examples/ gallery — is pinned at
    spec time under grounding; it is a directory label, not a design fork.

Sequencing

  1. r-sma — the full data-route template on the one demo whose emitter +
    byte-identity anchor + load-and-run E2E already exist. Establishes the home,
    the golden-grade test pattern, and the dissolved-verb disk-swap.
  2. r-breakout — carve price→bias out of r_breakout_graph, route through
    wrap_r, emit → ship → golden-test → delete the inline sweep family.
  3. r-meanrev — re-express k*sigma as EqConst→Mul first, then carve /
    emit / ship / golden-test / delete (last, because it needs the builder edit
    before it can round-trip).
  4. PIP drop — delete SmaCross/Momentum/Macd builders.
  5. Dead-code sweep — drop the Strategy enum, strategy_from, cli_token,
    HarnessKind, and the built-in grid clap flags now that no builder remains.

Refactor harvest opened by the delete

  • RGrid::default and the R_SMA_STOP_LENGTH / R_SMA_STOP_K consts
    (main.rs:1105-1116, :2522, :2526) become fully dead — threaded only
    through the three R sweep/wf builders. In scope (dies with the R inline arms).
  • The stage1-r param-suffix remapping tracked by #167 (main.rs:1123-1155) is
    entirely R-family-scoped and goes dead — #167 is effectively closed by this
    deletion.
  • HarnessKind (main.rs:3716) and its dispatch are demo harnesses → dead. In
    scope.
  • #152 (cost-port naming) is not removed: it lives inside wrap_r, which
    survives as generic loaded-blueprint scaffolding. Separate.
  • The SimBroker node (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.

## 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 example blueprint-DATA; the legacy PIP pair (`sma`, `momentum`) is dropped rather than migrated. 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) - **No library-extraction of `aura-cli`; take the data route instead** (chosen 2026-07-07). The crate stays bin-only — no `[lib]`, no `pub` on the internal builders, no cargo `example` linking them. Each demo's internal builder emits its 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. - **Drop the PIP pair** (`sma`/`momentum`), do not migrate it (chosen 2026-07-07). Both terminate in `SimBroker(pip_size)`, a construction-arg node deliberately excluded from the zero-arg `std_vocabulary`, so they cannot round-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. - **The demos belong in an examples home, kept as runnable examples that double 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) - **Fork F2 — does retiring the R-family builders break the just-dissolved verbs, and does the `--strategy r-sma` token survive? → No break; token survives as sugar. Derived.** Each dissolved path (`generalize`/ `walkforward`/`mc --strategy r-sma --real`) touches a builder at exactly one site to synthesize canonical blueprint bytes — `sma_signal(None, None)` at `crates/aura-cli/src/main.rs:4530`, `:4873`, `:4998`. Everything downstream is bytes-driven: the store, the `verb_sugar` translators (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 dissolved dispatchers gate on the raw string `a.strategy.as_deref() == Some("r-sma")`, not the `Strategy` enum, so the token survives as pure sugar ("load the shipped `r-sma` example") after the built-in sweep grid dies with `Strategy::RSma`. Basis: topology is content-/path-addressable end-to-end past the single synth site, so nothing structural needs the builder. - **Fork F3 — signal-leg carve-out for r-breakout / r-meanrev. Derived.** r-breakout is mechanical: its signal leg (`main.rs:3440-3451`) is vocabulary-clean and its lone `LinComb` sits in the r_equity trace branch, not the signal — carving `price→bias` out mirrors the finished `sma_signal`→`wrap_r` split. r-meanrev carries a micro-choice: its band node is `LinComb::builder(1).bind("weights[0]", band_k)` (`main.rs:3504`), a construction-arg node excluded from `std_vocabulary` by a pinned invariant, so the leg cannot round-trip until `k*sigma` is re-expressed with zero-arg nodes (`EqConst(band_k) → Mul(sigma, ·)`, both rostered). Basis: the vocabulary's construction-arg exclusion is a pinned design invariant — the resolution is to re-author the band node, never to admit `LinComb`; this edits the meanrev builder (and its topology hash) before any emit. - **Fork F1 — examples home. Derived (shallow presentation).** The R-family 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 already lives test-paired) versus a new user-facing `examples/` gallery — is pinned at spec time under grounding; it is a directory label, not a design fork. ### Sequencing 1. **r-sma** — the full data-route template on the one demo whose emitter + byte-identity anchor + load-and-run E2E already exist. Establishes the home, the golden-grade test pattern, and the dissolved-verb disk-swap. 2. **r-breakout** — carve `price→bias` out of `r_breakout_graph`, route through `wrap_r`, emit → ship → golden-test → delete the inline sweep family. 3. **r-meanrev** — re-express `k*sigma` as `EqConst→Mul` first, then carve / emit / ship / golden-test / delete (last, because it needs the builder edit before it can round-trip). 4. **PIP drop** — delete `SmaCross`/`Momentum`/`Macd` builders. 5. **Dead-code sweep** — drop the `Strategy` enum, `strategy_from`, `cli_token`, `HarnessKind`, and the built-in grid clap flags now that no builder remains. ### Refactor harvest opened by the delete - `RGrid::default` and the `R_SMA_STOP_LENGTH` / `R_SMA_STOP_K` consts (`main.rs:1105-1116`, `:2522`, `:2526`) become fully dead — threaded only through the three R sweep/wf builders. In scope (dies with the R inline arms). - The stage1-r param-suffix remapping tracked by #167 (`main.rs:1123-1155`) is entirely R-family-scoped and goes dead — **#167 is effectively closed by this deletion.** - `HarnessKind` (`main.rs:3716`) and its dispatch are demo harnesses → dead. In scope. - #152 (cost-port naming) is **not** removed: it lives inside `wrap_r`, which survives as generic loaded-blueprint scaffolding. Separate. - The `SimBroker` node (`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.
Author
Owner

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_r scaffolding; only the r-sma builder and its
inline built-in arms (--harness r-sma, sweep --strategy r-sma) go, repointed
onto the aura run <example> / aura sweep <example_open> --axis data paths.

Spec is git-tracked per the aura spec lifecycle; it will be committed with the
plan and removed at cycle close.

## 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_r` scaffolding; only the r-sma builder and its inline built-in arms (`--harness r-sma`, `sweep --strategy r-sma`) go, repointed onto the `aura run <example>` / `aura sweep <example_open> --axis` data paths. Spec is git-tracked per the aura spec lifecycle; it will be committed with the plan and removed at cycle close.
Author
Owner

Scope split — Cut 1 becomes copy+prove, retirement follows (derived, /boss)

Plan recon surfaced that deleting sma_signal has a far larger transitive
closure than the first spec's hand-list saw. sma_signalr_sma_graph is
reached not only by the three --real dissolved synth sites and the
--harness r-sma / sweep --strategy r-sma built-ins, but also by the entire
synthetic inline r-sma surface
: r_sma_space (main.rs:1267), r_sma_sweep_over
(:1280), run_oos_r (:1346), the walkforward_family Strategy::RSma arm
(:1763), and run_mc_r_bootstrap (:2106) / mc_r_bootstrap_report (:2119) — plus
the Strategy::RSma enum variant and its arms, the twin emitter
emit_demo_signal_open_fixture (:6412), and ~40 integration tests
(--harness r-sma, synthetic --strategy r-sma, and the inline
sweep_strategy_r_sma_no_flags_keeps_the_default_grid grade 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:

  • Cut 1 — copy + prove (additive). Create crates/aura-cli/examples/r_sma.json
    (closed 2/4) and r_sma_open.json (open) as verbatim copies of the two
    committed 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 anchor
    aura run examples/r_sma.json → the pinned r_sma_single_run_output_golden
    metrics. 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.
  • Cut 1b — retire + remove. Delete the builder and its whole transitive
    closure, move the fixtures into examples/ (repointing every reader), swap the
    three --real synth sites to include_str!("../examples/r_sma_open.json"),
    repoint/drop the ~40 --harness/--strategy r-sma integration tests, and
    resolve 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::RSma arm
(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-fidelity
proof tests (they reference the builder), and the dead consts R_SMA_FAST/
R_SMA_SLOW/R_SMA_BIAS_SCALE (2532/2533/2539). Remove the Strategy::RSma
variant + arms (1578/1647/1763/2123/4375) and the HarnessKind::RSma variant +
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); every tests/fixtures/sma_signal*.json
reader — 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-sma and inline --strategy r-sma subprocess 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 shipped
example carries — rewrite against an inline GraphBuilder, or ship extra example
blueprints; (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 retired
inline family.

## Scope split — Cut 1 becomes copy+prove, retirement follows (derived, /boss) Plan recon surfaced that deleting `sma_signal` has a far larger transitive closure than the first spec's hand-list saw. `sma_signal` → `r_sma_graph` is reached not only by the three `--real` dissolved synth sites and the `--harness r-sma` / `sweep --strategy r-sma` built-ins, but also by the **entire synthetic inline r-sma surface**: `r_sma_space` (main.rs:1267), `r_sma_sweep_over` (:1280), `run_oos_r` (:1346), the `walkforward_family` `Strategy::RSma` arm (:1763), and `run_mc_r_bootstrap` (:2106) / `mc_r_bootstrap_report` (:2119) — plus the `Strategy::RSma` enum variant and its arms, the twin emitter `emit_demo_signal_open_fixture` (:6412), and ~40 integration tests (`--harness r-sma`, synthetic `--strategy r-sma`, and the inline `sweep_strategy_r_sma_no_flags_keeps_the_default_grid` grade 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: - **Cut 1 — copy + prove (additive).** Create `crates/aura-cli/examples/r_sma.json` (closed 2/4) and `r_sma_open.json` (open) as verbatim copies of the two committed 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 anchor `aura run examples/r_sma.json` → the pinned `r_sma_single_run_output_golden` metrics. 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. - **Cut 1b — retire + remove.** Delete the builder and its whole transitive closure, move the fixtures into `examples/` (repointing every reader), swap the three `--real` synth sites to `include_str!("../examples/r_sma_open.json")`, repoint/drop the ~40 `--harness`/`--strategy r-sma` integration tests, and resolve 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::RSma` arm (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-fidelity proof tests (they reference the builder), and the dead consts `R_SMA_FAST`/ `R_SMA_SLOW`/`R_SMA_BIAS_SCALE` (2532/2533/2539). Remove the `Strategy::RSma` variant + arms (1578/1647/1763/2123/4375) and the `HarnessKind::RSma` variant + 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); every `tests/fixtures/sma_signal*.json` reader — 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-sma` and inline `--strategy r-sma` subprocess 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 shipped example carries — rewrite against an inline `GraphBuilder`, or ship extra example blueprints; (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 retired inline family.
Author
Owner

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_json output). Mitigation folded into
the plan: the two examples are generated from the current builder output
(blueprint_to_json(&sma_signal(…))), so the fidelity proof and the grade anchor
are green by construction and no pre-existing fixture staleness can block the cut.

## 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_json` output). Mitigation folded into the plan: the two examples are generated from the *current* builder output (`blueprint_to_json(&sma_signal(…))`), so the fidelity proof and the grade anchor are green by construction and no pre-existing fixture staleness can block the cut.
Author
Owner

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:

  • Q2a — 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 via GraphBuilder in the test body.
    Basis (derived): the test exercises blueprint_mc_family — a surviving
    blueprint-DATA function, NOT any deleted machinery — and only used sma_signal
    to mint a never-warming closed doc; constructing that topology test-locally
    keeps the vacuous-MC-rejection property while removing the builder dependency.
  • Q2b — 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.
  • Q4 — the inline sweep/walkforward/mc --strategy r-sma and --harness r-sma
    built-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 --real
    campaign-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 NO
data-path equivalent — the kept run_signal_r (aura run <bp.json>) takes no
cost 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_equity path + the aura-std cost-node unit
tests). 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 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: - **Q2a — `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 via `GraphBuilder` in the test body. Basis (derived): the test exercises `blueprint_mc_family` — a surviving blueprint-DATA function, NOT any deleted machinery — and only used `sma_signal` to mint a never-warming closed doc; constructing that topology test-locally keeps the vacuous-MC-rejection property while removing the builder dependency. - **Q2b — `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. - **Q4 — the inline `sweep/walkforward/mc --strategy r-sma` and `--harness r-sma` built-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 --real` campaign-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 NO data-path equivalent — the kept `run_signal_r` (`aura run <bp.json>`) takes no cost 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_equity` path + the aura-std cost-node unit tests). 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.
Author
Owner

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-sma surface — 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 --cost goldens loses no cost-model
coverage; 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-sma inline) retire; the r-sma demo stays
reachable via aura run examples/r_sma.json, aura sweep examples/r_sma_open.json --axis …, and the --strategy r-sma --real campaign path (which now embeds the
shipped example instead of building it).

## 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-sma` surface — 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 --cost` goldens loses no cost-model coverage; 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-sma` inline) retire; the r-sma demo stays reachable via `aura run examples/r_sma.json`, `aura sweep examples/r_sma_open.json --axis …`, and the `--strategy r-sma --real` campaign path (which now embeds the shipped example instead of building it).
Author
Owner

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:

  • Fork 1 — the aura run cost flags after --harness r-sma retires. → REMOVE
    the flags.
    run_r_sma was the SOLE consumer of --cost-per-trade /
    --slip-vol-mult / --carry-per-cycle; the matches!(harness, HarnessKind::RSma) cost-guard is a hard compile-break once the variant goes.
    Decision: remove the three flags from RunCmd/RunArgs/dispatch_run entirely
    and 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 flags
    were bound to the retired inline harness; keeping them (guard-rewrite option)
    leaves dead CLI surface whose refusal message names a now-absent r-sma harness.
    Cost-model coverage survives independently (grounding-confirmed): engine-level
    aura-engine/tests/r_sma_e2e.rs net_expectancy_r math, the aura-std cost-node
    units, and aura-composites/tests/cost_graph.rs.
  • Fork 2 — McArgs::RealR. → remove; collapse the enum if single-variant
    results.
    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.
  • Fork 3 — StopArm::Open. → remove the variant + its wrap_r arm + the
    risk_executor_vol_open import; leave StopArm single-variant.
    Basis
    (derived): StopArm::Open is constructed only in the deleted r_sma_graph, so
    it + its unused import are dead. Collapsing StopArmStopRule in wrap_r's
    signature would ripple into campaign_run.rs and the r-breakout/r-meanrev
    builders (cut-2/3 territory); a harmless single-variant enum keeps this cut
    bounded and is clippy-clean.
  • Fork 4 — the four synthetic --strategy r-sma walkforward plateau/deflation
    tests (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 the
    retired 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 its
    retired 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_code allowance):
r_sma_friendly_name + the four
{FAST,SLOW,STOP_LENGTH,STOP_K}_SUFFIX consts go dead — this closes #167
(single-source the stage1-r param-suffix remapping) by deletion
; plus
StopArm::Open (Fork 3) and McArgs::RealR (Fork 2). All removed in the deletion
task, no allowance left behind.

## 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: - **Fork 1 — the `aura run` cost flags after `--harness r-sma` retires. → REMOVE the flags.** `run_r_sma` was the SOLE consumer of `--cost-per-trade` / `--slip-vol-mult` / `--carry-per-cycle`; the `matches!(harness, HarnessKind::RSma)` cost-guard is a hard compile-break once the variant goes. Decision: remove the three flags from `RunCmd`/`RunArgs`/`dispatch_run` entirely and 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 flags were bound to the retired inline harness; keeping them (guard-rewrite option) leaves dead CLI surface whose refusal message names a now-absent `r-sma` harness. Cost-model coverage survives independently (grounding-confirmed): engine-level `aura-engine/tests/r_sma_e2e.rs` net_expectancy_r math, the aura-std cost-node units, and `aura-composites/tests/cost_graph.rs`. - **Fork 2 — `McArgs::RealR`. → remove; collapse the enum if single-variant results.** 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. - **Fork 3 — `StopArm::Open`. → remove the variant + its `wrap_r` arm + the `risk_executor_vol_open` import; leave `StopArm` single-variant.** Basis (derived): `StopArm::Open` is constructed only in the deleted `r_sma_graph`, so it + its unused import are dead. Collapsing `StopArm`→`StopRule` in `wrap_r`'s signature would ripple into `campaign_run.rs` and the r-breakout/r-meanrev builders (cut-2/3 territory); a harmless single-variant enum keeps this cut bounded and is clippy-clean. - **Fork 4 — the four synthetic `--strategy r-sma` walkforward plateau/deflation tests (`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 the retired 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 its retired 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_code` allowance):** `r_sma_friendly_name` + the four `{FAST,SLOW,STOP_LENGTH,STOP_K}_SUFFIX` consts go dead — **this closes #167 (single-source the stage1-r param-suffix remapping) by deletion**; plus `StopArm::Open` (Fork 3) and `McArgs::RealR` (Fork 2). All removed in the deletion task, no allowance left behind.
Author
Owner

Cut 1b landed — the r-sma builder is retired (f7c809e)

sma_signal and its whole transitive closure are deleted; the r-sma topology now
exists only as data. The three --strategy r-sma --real synth sites embed the
shipped open example (include_str!); the built-in --harness r-sma and inline
--strategy r-sma surfaces retire; the two fixtures moved to the examples
(readers repointed). Verified by hand (not the workflow's report): full
cargo test --workspace green, clippy -D warnings clean, and the cut-1 grade
anchor + the dissolved-verb real-archive goldens (generalize/walkforward/mc) stay
byte-identical.

  • Deviation from plan: StopArm collapsed to StopRule in wrap_r's
    signature (its only other variant, Open, died with r_sma_graph) — cleaner
    than the planned vestigial single-variant enum; behaviour-preserving.
  • #167 closes by deletion — the stage1-r param-suffix remapping
    (r_sma_friendly_name + the FAST/SLOW/STOP_LENGTH/STOP_K suffix consts) went
    dead and was removed.
  • Follow-up (a later cut): wrap_r's cost-node-building branch is now
    unreachable (nothing passes Some(CostConfig) after run_r_sma's deletion) yet
    clippy-clean — a cleanup for when the inline cost surface fully retires.
  • Process note: a first workflow attempt was discarded after a subagent's
    git checkout -- main.rs recovery silently reverted earlier tasks' edits; this
    landing 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*sigma band as a zero-arg node first),
the PIP-pair drop (sma/momentum), and a final dead-code sweep.

## Cut 1b landed — the r-sma builder is retired (f7c809e) `sma_signal` and its whole transitive closure are deleted; the r-sma topology now exists only as data. The three `--strategy r-sma --real` synth sites embed the shipped open example (`include_str!`); the built-in `--harness r-sma` and inline `--strategy r-sma` surfaces retire; the two fixtures moved to the examples (readers repointed). Verified by hand (not the workflow's report): full `cargo test --workspace` green, `clippy -D warnings` clean, and the cut-1 grade anchor + the dissolved-verb real-archive goldens (generalize/walkforward/mc) stay byte-identical. - **Deviation from plan:** `StopArm` collapsed to `StopRule` in `wrap_r`'s signature (its only other variant, `Open`, died with `r_sma_graph`) — cleaner than the planned vestigial single-variant enum; behaviour-preserving. - **#167 closes by deletion** — the stage1-r param-suffix remapping (`r_sma_friendly_name` + the FAST/SLOW/STOP_LENGTH/STOP_K suffix consts) went dead and was removed. - **Follow-up (a later cut):** `wrap_r`'s cost-node-building branch is now unreachable (nothing passes `Some(CostConfig)` after `run_r_sma`'s deletion) yet clippy-clean — a cleanup for when the inline cost surface fully retires. - **Process note:** a first workflow attempt was discarded after a subagent's `git checkout -- main.rs` recovery silently reverted earlier tasks' edits; this landing 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*sigma` band as a zero-arg node first), the PIP-pair drop (sma/momentum), and a final dead-code sweep.
Author
Owner

Design record (specify) — Cut 2: retire the r-breakout demo

Spec: demo-retirement-r-breakout. Cut 2 of the demo retirement, applying the
r-sma Cut-1/1b template one level down. The r-breakout signal leg is fused into
r_breakout_graph (unlike sma_signal, which was already a clean price→bias
Composite), so the one added step is a bin-internal carve-out of
r_breakout_signal(channel) -> Composite before the leg can serialize as data.
The generic run path is unchanged: wrap_r(signal: Composite, ...) already nests
any price→bias leg via BlueprintNode::Composite and wraps the identical pip/R
branch; run_signal_r drives the exact path aura run <blueprint.json> uses.

Load-bearing forks, all derived (no user-preference bounce):

  • Fork: equivalence-proof structure — parallel vs. refactor. → keep
    r_breakout_graph parallel and bridge it to run_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.json binds
    channel = 3.
    Basis (derived): the existing built-in grade coverage uses --channel 3
    (sweep_strategy_r_breakout_folded_no_trace_metrics_equal_raw_trace_metrics), so
    binding 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.json
    exposes 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.length independently); collapsing the two into one ganged
    channel knob over data is parameter-ganging = the separate open #61, which this
    cut 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.json
    metrics golden (survives the deletion commit), alongside the closed-ness / open-axis
    graph introspect --params anchors.
    Basis (derived): aura run <bp> emits a deterministic JSON RunReport with a full
    metrics object (total_pips, expectancy_r, sqn, …); pinning metrics
    (excluding the volatile manifest commit) is the durable builder-free equivalence
    anchor — the role the dissolved-verb --real goldens play for r-sma, which
    r-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-breakout token disposition. → the token stops being a
    recognized strategy; the built-in --strategy r-breakout sweep tests drop and the
    data successor is aura sweep examples/r_breakout_open.json --axis ….
    Basis (derived): the retirement's stated target is the Strategy enum + the
    per-strategy *_sweep_family scaffolding; r-sma's Cut-1b precedent dropped the
    built-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 for
    the 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).

## Design record (specify) — Cut 2: retire the r-breakout demo Spec: `demo-retirement-r-breakout`. Cut 2 of the demo retirement, applying the r-sma Cut-1/1b template one level down. The r-breakout signal leg is fused into `r_breakout_graph` (unlike `sma_signal`, which was already a clean `price→bias` Composite), so the one added step is a bin-internal carve-out of `r_breakout_signal(channel) -> Composite` before the leg can serialize as data. The generic run path is unchanged: `wrap_r(signal: Composite, ...)` already nests any `price→bias` leg via `BlueprintNode::Composite` and wraps the identical pip/R branch; `run_signal_r` drives the exact path `aura run <blueprint.json>` uses. Load-bearing forks, all derived (no user-preference bounce): - **Fork: equivalence-proof structure — parallel vs. refactor.** → keep `r_breakout_graph` parallel and bridge it to `run_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.json` binds `channel = 3`. Basis (derived): the existing built-in grade coverage uses `--channel 3` (`sweep_strategy_r_breakout_folded_no_trace_metrics_equal_raw_trace_metrics`), so binding 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.json` exposes 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.length` independently); collapsing the two into one ganged `channel` knob over data is parameter-ganging = the separate open #61, which this cut 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.json` metrics golden (survives the deletion commit), alongside the closed-ness / open-axis `graph introspect --params` anchors. Basis (derived): `aura run <bp>` emits a deterministic JSON RunReport with a full `metrics` object (`total_pips`, `expectancy_r`, `sqn`, …); pinning `metrics` (excluding the volatile manifest `commit`) is the durable builder-free equivalence anchor — the role the dissolved-verb `--real` goldens play for r-sma, which r-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-breakout` token disposition.** → the token stops being a recognized strategy; the built-in `--strategy r-breakout` sweep tests drop and the data successor is `aura sweep examples/r_breakout_open.json --axis …`. Basis (derived): the retirement's stated target is the `Strategy` enum + the per-strategy `*_sweep_family` scaffolding; r-sma's Cut-1b precedent dropped the built-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 for the 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).
Author
Owner

Spec signed autonomously (specify, /boss) — Cut 2 r-breakout

The demo-retirement-r-breakout spec is signed by a grounding-check PASS — an
independent 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 signal
Composite (shipped_r_sma_example_reproduces_the_builtin_grade), the aura run <bp.json> path (aura_run_loads_and_runs_a_blueprint_file), GraphBuilder::expose

  • the bias boundary, the six signal-leg node types in the closed std_vocabulary
    roster (std_vocabulary_resolves_known_and_rejects_unknown), the current built-in
    r-breakout surface (sweep_strategy_r_breakout_*,
    walkforward_unsupported_strategy_exits_2_naming_the_token), and the
    closed/open graph introspect --params behaviour (the r-sma introspect anchors).
    The r-breakout surface is untouched by r-sma Cut 1b, so its green baseline is intact.
## Spec signed autonomously (specify, /boss) — Cut 2 r-breakout The `demo-retirement-r-breakout` spec is signed by a `grounding-check` PASS — an independent 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 signal Composite (`shipped_r_sma_example_reproduces_the_builtin_grade`), the `aura run <bp.json>` path (`aura_run_loads_and_runs_a_blueprint_file`), `GraphBuilder::expose` + the `bias` boundary, the six signal-leg node types in the closed `std_vocabulary` roster (`std_vocabulary_resolves_known_and_rejects_unknown`), the current built-in r-breakout surface (`sweep_strategy_r_breakout_*`, `walkforward_unsupported_strategy_exits_2_naming_the_token`), and the closed/open `graph introspect --params` behaviour (the r-sma introspect anchors). The r-breakout surface is untouched by r-sma Cut 1b, so its green baseline is intact.
Author
Owner

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 carved
out of the fused r_breakout_graph as r_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 (+ all
four arms), the r-breakout token in the --strategy usage/docs, and the now-dead
--channel flag + RGrid.channel field. 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 sweep
tests dropped; the valid-but-unsupported-token test re-pointed to momentum (generic
property, live until Cut 4); a new negative pins that --strategy r-breakout now
falls into the generic usage error on both sweep and walkforward.

Verified by hand (not the workflow's report): full cargo test --workspace green
(0 failed everywhere), cargo clippy --workspace --all-targets -- -D warnings clean,
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_range sub-range was
not 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*sigma band re-expressed as a zero-arg
node — EqConst(band_k)Mul(sigma,·) — before the signal leg round-trips), the
PIP-pair drop (sma/momentum), and a final dead-code sweep + close.

## 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 carved out of the fused `r_breakout_graph` as `r_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` (+ all four arms), the `r-breakout` token in the `--strategy` usage/docs, and the now-dead `--channel` flag + `RGrid.channel` field. 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 sweep tests dropped; the valid-but-unsupported-token test re-pointed to `momentum` (generic property, live until Cut 4); a new negative pins that `--strategy r-breakout` now falls into the generic usage error on both `sweep` and `walkforward`. Verified by hand (not the workflow's report): full `cargo test --workspace` green (0 failed everywhere), `cargo clippy --workspace --all-targets -- -D warnings` clean, 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_range` sub-range was not 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*sigma` band re-expressed as a zero-arg node — `EqConst(band_k)`→`Mul(sigma,·)` — before the signal leg round-trips), the PIP-pair drop (sma/momentum), and a final dead-code sweep + close.
Author
Owner

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:

  • EqConst is an i64 -> bool equality gate (value == target), not an f64
    constant-emitter.
  • Bias is clamp(signal / scale, -1, +1) (divide + clamp), not a plain multiply.
  • Mul is 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 is
    a construction argument, #155/#156). There is no Div, no GtConst, and no
    constant-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:

  • A — add a constant-multiply node (e.g. a Const/Literal f64 emitter →
    Mul(sigma, Const(band_k))) to aura-std and roster it, then migrate r-meanrev like
    r-sma/r-breakout. Fills a real data-plane vocabulary gap; expands this issue into a
    small feature.
  • B — drop r-meanrev (like the pip pair): delete the builder + the built-in
    --strategy r-meanrev surface, no data successor. Cleanest; honest given it is
    disproven and cannot round-trip.
  • C — defer r-meanrev: skip it here (proceed to the pip-pair drop + the final
    sweep), file a follow-up to migrate once a constant node exists.
## 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: - `EqConst` is an `i64 -> bool` equality gate (`value == target`), not an f64 constant-emitter. - `Bias` is `clamp(signal / scale, -1, +1)` (divide + clamp), not a plain multiply. - `Mul` is 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 is a construction argument, #155/#156). There is no `Div`, no `GtConst`, and no constant-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: - **A — add a constant-multiply node** (e.g. a `Const`/`Literal` f64 emitter → `Mul(sigma, Const(band_k))`) to aura-std and roster it, then migrate r-meanrev like r-sma/r-breakout. Fills a real data-plane vocabulary gap; expands this issue into a small feature. - **B — drop r-meanrev** (like the pip pair): delete the builder + the built-in `--strategy r-meanrev` surface, no data successor. Cleanest; honest given it is disproven and cannot round-trip. - **C — defer r-meanrev**: skip it here (proceed to the pip-pair drop + the final sweep), file a follow-up to migrate once a constant node exists.
Author
Owner

Cut 3 fork resolved — add a Scale node, then migrate r-meanrev

Decision: 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 f64 factor
param; Firing::Any + warm-up filter), NOT a zero-input Const. Rationale (derived):
the per-cycle eval loop gates every node through an input-firing test
(harness.rs fires(firing, slots, …)), so a zero-input Const would never fire
without an engine-core scheduler change; Scale fits the existing firing model with
no core change and expresses the band directly. band_k * sigma becomes
Scale(sigma, factor=band_k) — multiplication is IEEE-754-commutative, so the grade
is byte-preserved versus the retiring LinComb(1, weights[0]=band_k), and factor
is a bindable param (the open form's --band-k sweep axis). A general Const/Div
stays 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) (using
Scale for the band) as a #[cfg(test)] price->bias Composite, ship
examples/r_meanrev{,_open}.json, prove byte-identity + fused-equivalence (deleted with
the builder) + durable anchors, then retire r_meanrev_graph + r_meanrev_sweep_family

  • Strategy::RMeanRev + the --window/--band-k flags + RGrid.window/band_k fields.
## Cut 3 fork resolved — add a `Scale` node, then migrate r-meanrev Decision: 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 f64 `factor` param; `Firing::Any` + warm-up filter), NOT a zero-input `Const`. Rationale (derived): the per-cycle eval loop gates every node through an input-firing test (`harness.rs` `fires(firing, slots, …)`), so a zero-input `Const` would never fire without an engine-core scheduler change; `Scale` fits the existing firing model with no core change and expresses the band directly. `band_k * sigma` becomes `Scale(sigma, factor=band_k)` — multiplication is IEEE-754-commutative, so the grade is byte-preserved versus the retiring `LinComb(1, weights[0]=band_k)`, and `factor` is a bindable param (the open form's `--band-k` sweep axis). A general `Const`/`Div` stays 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)` (using `Scale` for the band) as a `#[cfg(test)]` price->bias Composite, ship examples/r_meanrev{,_open}.json, prove byte-identity + fused-equivalence (deleted with the builder) + durable anchors, then retire r_meanrev_graph + r_meanrev_sweep_family + Strategy::RMeanRev + the --window/--band-k flags + RGrid.window/band_k fields.
Author
Owner

Spec signed autonomously (specify, /boss) — Cut 3 (Scale node + r-meanrev)

The demo-retirement-r-meanrev spec is signed by a grounding-check PASS — an
independent 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 from EqConst/Bias), the
premise that no rostered node does constant×stream today (EqConst i64→bool, Bias
clamp/divide, Mul binary, LinComb excluded), the zero-input-Const-won't-fire
rationale (harness.rs fires() returns false on an empty firing slice — which
validates choosing Scale with a real Firing::Any input over a Const emitter),
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 no
grid), wrap_r/run_signal_r genericity + RunMetrics: PartialEq, and the
closed/open graph introspect --params behaviour.

## Spec signed autonomously (specify, /boss) — Cut 3 (Scale node + r-meanrev) The `demo-retirement-r-meanrev` spec is signed by a `grounding-check` PASS — an independent 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 from `EqConst`/`Bias`), the premise that no rostered node does constant×stream today (`EqConst` i64→bool, `Bias` clamp/divide, `Mul` binary, `LinComb` excluded), the zero-input-`Const`-won't-fire rationale (`harness.rs` `fires()` returns false on an empty firing slice — which validates choosing `Scale` with a real `Firing::Any` input over a `Const` emitter), 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 no grid), `wrap_r`/`run_signal_r` genericity + `RunMetrics: PartialEq`, and the closed/open `graph introspect --params` behaviour.
Author
Owner

Cut 3 landed — Scale node + r-meanrev retired to data (257ab0b)

The r-meanrev band gap (band_k * sigma, unrostered) is filled by a new Scale node
(out = input * factor, aura-std), rostered (count-pin 22 -> 23). Scale over a
zero-input Const because the eval loop gates every node through an input-firing test
(harness.rs fires()) — a zero-input node never fires; Scale fits the model and, by
IEEE-754 commutativity, reproduces the retiring LinComb band 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}.json ship it. Before the fused
builder 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.factor is now a first-class sweepable axis), and — re-pointed
onto 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 vestigial
built-in-sweep grid apparatus retired — run_sweep's grid param, the call-site grid
build, 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). RGrid the struct SURVIVES — the dissolved
generalize verb resolves its candidate from its fast/slow/stop_length/stop_k — so only
its window/band_k fields go; its stale doc-comment is rewritten to its generalize-only
role. Also swept: persist_traces_r, the metrics_object test helper, and the
Add/Gt/Latch/Mul/Sqrt imports (now #[cfg(test)]).

Verified by hand: full cargo test --workspace green (0 failed / 62 result lines),
cargo clippy --workspace --all-targets -- -D warnings clean; the r-sma + r-breakout
anchors 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.

## Cut 3 landed — Scale node + r-meanrev retired to data (257ab0b) The r-meanrev band gap (`band_k * sigma`, unrostered) is filled by a new `Scale` node (`out = input * factor`, aura-std), rostered (count-pin 22 -> 23). `Scale` over a zero-input `Const` because the eval loop gates every node through an input-firing test (`harness.rs fires()`) — a zero-input node never fires; `Scale` fits the model and, by IEEE-754 commutativity, reproduces the retiring `LinComb` band 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}.json` ship it. Before the fused builder 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.factor` is now a first-class sweepable axis), and — re-pointed onto 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 vestigial built-in-sweep grid apparatus retired — `run_sweep`'s `grid` param, the call-site grid build, 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). `RGrid` the struct SURVIVES — the dissolved `generalize` verb resolves its candidate from its fast/slow/stop_length/stop_k — so only its window/band_k fields go; its stale doc-comment is rewritten to its generalize-only role. Also swept: `persist_traces_r`, the `metrics_object` test helper, and the Add/Gt/Latch/Mul/Sqrt imports (now `#[cfg(test)]`). Verified by hand: full `cargo test --workspace` green (0 failed / 62 result lines), `cargo clippy --workspace --all-targets -- -D warnings` clean; the r-sma + r-breakout anchors 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.
Author
Owner

Endgame reframed after an audit of what the retirement exposed

Cuts 1–3 landed: r-sma, r-breakout, r-meanrev now live only as
blueprint data under examples/, byte-identity proven before each deletion.
An audit of the residue changed the shape of the remaining work.

Finding. The fast/slow knobs in RGrid and the verb-sugar are not a
generic candidate vocabulary — they are the two SMA node-names of the retired
r-sma demo (examples/r_sma_open.json: two SMA primitives named
fast/slow, wired fast − slow into a Bias). The sibling demos expose
disjoint axis namespaces (channel_hi/channel_lo;
mean_window/var_window/band), so no axis name is universal. Three of the
four dissolved verbs (generalize, walkforward, mc) hardcode these node
names as their only signal axes and embed the blueprint via include_str!,
across ~13 sites; sweep is already axis-agnostic (--axis name=csv). The
campaign core is already strategy-agnostic (CampaignDoc.axes is an open map;
the member runner binds by blueprint param_space suffix-match), so the weld is
CLI-sugar-local.

Remaining cuts.

  • PIP-pair retirement (next): drop the legacy sma/momentum demos. They
    terminate in a SimBroker(pip_size) construction-arg node (absent from the
    zero-arg std vocabulary) and report the legacy pip yardstick that C10 retired
    with the realistic broker — dropped, not migrated to data.
  • Verb generalization (reframed final cut): the original "dead-code sweep"
    is in fact the generalization of generalize/walkforward/mc to arbitrary
    blueprint 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.

## Endgame reframed after an audit of what the retirement exposed Cuts 1–3 landed: `r-sma`, `r-breakout`, `r-meanrev` now live only as blueprint data under `examples/`, byte-identity proven before each deletion. An audit of the residue changed the shape of the remaining work. **Finding.** The `fast`/`slow` knobs in `RGrid` and the verb-sugar are not a generic candidate vocabulary — they are the two SMA node-names of the retired `r-sma` demo (`examples/r_sma_open.json`: two `SMA` primitives named `fast`/`slow`, wired `fast − slow` into a `Bias`). The sibling demos expose disjoint axis namespaces (`channel_hi`/`channel_lo`; `mean_window`/`var_window`/`band`), so no axis name is universal. Three of the four dissolved verbs (`generalize`, `walkforward`, `mc`) hardcode these node names as their only signal axes and embed the blueprint via `include_str!`, across ~13 sites; `sweep` is already axis-agnostic (`--axis name=csv`). The campaign core is already strategy-agnostic (`CampaignDoc.axes` is an open map; the member runner binds by blueprint `param_space` suffix-match), so the weld is CLI-sugar-local. **Remaining cuts.** - **PIP-pair retirement (next):** drop the legacy `sma`/`momentum` demos. They terminate in a `SimBroker(pip_size)` construction-arg node (absent from the zero-arg std vocabulary) and report the legacy pip yardstick that C10 retired with the realistic broker — dropped, not migrated to data. - **Verb generalization (reframed final cut):** the original "dead-code sweep" is in fact the generalization of `generalize`/`walkforward`/`mc` to arbitrary blueprint 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.
Author
Owner

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 / macd and cannot compile without them, and the generic
    blueprint + campaign path already supersedes them. In scope: the Strategy
    enum + strategy_from; run_sweep / sweep_family / momentum_sweep_family
    / momentum_blueprint_with_sinks; run_sample / run_sample_real /
    sample_harness; the built-in walkforward_family / sweep_over / run_oos
    and run_mc / mc_family; the macd composite cluster; HarnessKind /
    run_dispatch / run_args_from. Basis: derived — compiler-forced transitive
    closure + supersession by the generic path.

  • Fork B — bare defaults. The flag-less synthetic defaults and
    run --harness sma|macd are retired. run and sweep require an explicit
    <blueprint.json>; walkforward and mc keep their --strategy r-sma --real
    sugar and their .json branch. --strategy stays a recognized flag on
    sweep/walkforward/mc, but sma/momentum are no longer valid values — they
    fall into the same generic Usage: aura <verb> … error the retired
    r-breakout/r-meanrev tokens 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-subcommand aura graph (and
    the render self-containment test) to render a shipped example blueprint
    (examples/r_sma_open.json, loaded via blueprint_from_json into the
    Composite the renderer already takes), rather than dropping the no-arg
    default. 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.json and its
    two .mjs viewer tests as a frozen static viewer corpus. Basis: derived — it
    is 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/macd composites are not rostered nodes).

## 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` / `macd` and cannot compile without them, and the generic blueprint + campaign path already supersedes them. In scope: the `Strategy` enum + `strategy_from`; `run_sweep` / `sweep_family` / `momentum_sweep_family` / `momentum_blueprint_with_sinks`; `run_sample` / `run_sample_real` / `sample_harness`; the built-in `walkforward_family` / `sweep_over` / `run_oos` and `run_mc` / `mc_family`; the `macd` composite cluster; `HarnessKind` / `run_dispatch` / `run_args_from`. Basis: derived — compiler-forced transitive closure + supersession by the generic path. - **Fork B — bare defaults.** The flag-less synthetic defaults and `run --harness sma|macd` are retired. `run` and `sweep` require an explicit `<blueprint.json>`; `walkforward` and `mc` keep their `--strategy r-sma --real` sugar and their `.json` branch. `--strategy` stays a recognized flag on sweep/walkforward/mc, but `sma`/`momentum` are no longer valid values — they fall into the same generic `Usage: aura <verb> …` error the retired `r-breakout`/`r-meanrev` tokens 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-subcommand `aura graph` (and the render self-containment test) to render a shipped example blueprint (`examples/r_sma_open.json`, loaded via `blueprint_from_json` into the `Composite` the renderer already takes), rather than dropping the no-arg default. 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.json` and its two `.mjs` viewer tests as a frozen static viewer corpus. Basis: derived — it is 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`/`macd` composites are not rostered nodes).
Author
Owner

Cut 4 spec auto-signed (grounding PASS, /boss)

The PIP-pair retirement spec (Cut 4 — retire the sma/momentum demos and the
transitive built-in synthetic run/sweep/walkforward/mc + macd surface; repoint
the no-arg aura graph to 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 spec auto-signed (grounding PASS, /boss) The PIP-pair retirement spec (Cut 4 — retire the `sma`/`momentum` demos and the transitive built-in synthetic run/sweep/walkforward/mc + `macd` surface; repoint the no-arg `aura graph` to 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.
Author
Owner

Cut 4 landed — the PIP pair is retired; all five demos are now off production code

ee70016 drops sma/momentum and the whole built-in synthetic
run/sweep/walkforward/mc + macd surface they anchored (+247/−2691 across
main.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_family
runners, the macd composite, run_dispatch/--harness) is gone, and only the
generic blueprint-data and campaign paths remain.

The four derived forks were applied as decided above: run/sweep require an
explicit blueprint; sma/momentum fall into the same generic Usage: error as
the retired r-* tokens (new negative test); bare aura graph renders the shipped
r_sma_open.json; the sample-model.json viewer corpus stays frozen.

One plan-deviation, ratified: member_key (+ MAX_KEY/fnv1a64 and its unit
tests) 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) and
cargo clippy --workspace --all-targets -- -D warnings all 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.

## Cut 4 landed — the PIP pair is retired; all five demos are now off production code `ee70016` drops `sma`/`momentum` and the whole built-in *synthetic* run/sweep/walkforward/mc + `macd` surface they anchored (+247/−2691 across `main.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_family` runners, the `macd` composite, `run_dispatch`/`--harness`) is gone, and only the generic blueprint-data and campaign paths remain. The four derived forks were applied as decided above: `run`/`sweep` require an explicit blueprint; `sma`/`momentum` fall into the same generic `Usage:` error as the retired r-* tokens (new negative test); bare `aura graph` renders the shipped `r_sma_open.json`; the `sample-model.json` viewer corpus stays frozen. One plan-deviation, ratified: `member_key` (+ `MAX_KEY`/`fnv1a64` and its unit tests) 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) and `cargo clippy --workspace --all-targets -- -D warnings` all 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.
Author
Owner

Triage 2026-07-09 (tree at 68317ec) — assessed complete; only the formal close remains:

  • All four cuts landed: d7fa4b4/f7c809e (r-sma), 5856cad (r-breakout), 257ab0b (Scale node + r-meanrev), ee70016 (PIP pair, +247/−2691), plus the tidy sweeps 07a73fb/3198747.
  • Grep of crates/aura-cli/src finds no HarnessKind, run_stage1_r, stage1_r_sweep_family, momentum_sweep_family, Strategy::RSma or run_dispatch; only the generic blueprint_sweep_family remains. crates/aura-cli/examples/ ships all six blueprint-data successors (r_sma{,_open}, r_breakout{,_open}, r_meanrev{,_open}).
  • The residue named in the last comment has landed too: verb generalization (#220, a2294c7..4acea45), the trace-regime fix (#219, 70a045c/a1551a6), and the cycle-close audit. Discoverability: per-subcommand clap help (#175) and the README CLI map (a45d16b).
  • Sole crumb found: aura graph build --help does 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.
Triage 2026-07-09 (tree at 68317ec) — assessed complete; only the formal close remains: - All four cuts landed: d7fa4b4/f7c809e (r-sma), 5856cad (r-breakout), 257ab0b (Scale node + r-meanrev), ee70016 (PIP pair, +247/−2691), plus the tidy sweeps 07a73fb/3198747. - Grep of crates/aura-cli/src finds no HarnessKind, run_stage1_r, stage1_r_sweep_family, momentum_sweep_family, Strategy::RSma or run_dispatch; only the generic blueprint_sweep_family remains. crates/aura-cli/examples/ ships all six blueprint-data successors (r_sma{,_open}, r_breakout{,_open}, r_meanrev{,_open}). - The residue named in the last comment has landed too: verb generalization (#220, a2294c7..4acea45), the trace-regime fix (#219, 70a045c/a1551a6), and the cycle-close audit. Discoverability: per-subcommand clap help (#175) and the README CLI map (a45d16b). - Sole crumb found: `aura graph build --help` does 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.
Brummel added this to the Real-project readiness — role-complete research loop (no freeze) milestone 2026-07-10 17:16:16 +02:00
Author
Owner

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-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.
Author
Owner

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.

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.
Brummel removed this from the Real-project readiness — role-complete research loop (no freeze) milestone 2026-07-11 15:18:42 +02:00
Author
Owner

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.

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.
Collaborator

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.

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.
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Brummel/Aura#159