audit(0087): cycle close — drift-clean after C24/C9 realization note; rm ephemeral spec/plan

Architect drift review of cycle 0087 (#155, the C24 blueprint-serialization-and-
loader first cut). What holds (confirmed against the diff): C17 / no-RustAst (the
format carries only type identity + name + bound params + topology; the build
closure is dropped and re-derived, no node logic in the data); invariant 9 /
domain-free engine (injected resolver, the closed match in aura-std, engine lib
deps aura-core + aura-analysis only — a compiled-in closed set, not a dynamic
registry); C9 round-trip / C23 bootstrap untouched (loader's terminal step is the
unchanged Composite::new -> bootstrap_with_params; validation deferred to the
existing gate, not bypassed).

Resolution:
- fix (ledger): C24 Status refreshed from "unbuilt" to "first cut shipped"
  with a cycle-0087 realization note; C9's round-trips-both-ways refinement
  marked realised. The ledger no longer contradicts the code.
- backlog (debt-med): the hand-written std_vocabulary match has no guard test
  that fails when a new zero-arg aura-std node lacks an arm — fails safe today
  (clean UnknownNodeType, never silent-wrong). Filed as #160.
- carry-on (scaling): construction-arg builders + sinks excluded, so no real
  harness round-trips yet; harness retirement blocks on the construction +
  project-as-crate layers — already tracked #156/#157/#159.

No architect-sweep / regression script is declared in the project facts, so the
suite is the gate: cargo test --workspace 748 passed (737 -> 748 = the 11 new
tests); clippy --all-targets -D warnings clean.

Ephemeral cycle artifacts removed (lifecycle convention): docs/specs/0087-*,
docs/plans/0087-*.
This commit is contained in:
2026-06-29 15:01:11 +02:00
parent d5602ec5ad
commit 468fbae62b
3 changed files with 25 additions and 1010 deletions
+25 -10
View File
@@ -486,7 +486,8 @@ blueprint is not only *emitted* as data (`model_to_json`, the render half) but i
itself a **serializable data value with a load path** (data → blueprint →
`FlatGraph`), so topology is a value the World generates, stores, and reproduces —
see C24. The Rust builder API stays the primary *human / LLM* authoring surface
(C17); the data form is the *machine* surface the World owns.
(C17); the data form is the *machine* surface the World owns. (Load path **realised**
cycle 0087 / #155, `d5602ec`: `aura-engine::blueprint_from_json`.)
### C10 — Strategy output is a bias stream; signal quality is measured in R; cost is a composable downstream graph (gross R → net R); money is decoupled to the live deploy edge
**Guarantee.** A strategy's primary, backtestable output is **not** an equity
@@ -1779,16 +1780,30 @@ thread) force the **value**. The engine already treats topology as a runtime val
(C9 graph-as-data, C19 "cheap graph re-compilation, not a code recompile", C23 the
flat graph as the optimisation target); C24 only adds that the value **serializes out
of Rust and loads back in**.
**Status (2026-06-29).** The **principle** is settled (this contract, ratified in an
in-context design discussion — the #109 resolution). The **format itself** — the
concrete data structure, serialization, the data → blueprint loader, and
content-addressing for identity (C18) — is **unbuilt**, the next brainstorm /
milestone. `model_to_json` (C9) is the one-directional half that exists.
Sequencing-coupled to the **project-as-crate authoring layer** (`aura new` /
**Status (2026-06-29; first cut shipped — cycle 0087 / #155, `d5602ec`).** The
**principle** is settled (this contract, ratified in an in-context design discussion
— the #109 resolution). The **first cut now ships**: a `Composite` blueprint
serializes to a **canonical, versioned** data value (`format_version` envelope,
omit-defaults JSON) and **loads back** (data → blueprint → `FlatGraph`) via
`blueprint_to_json` / `blueprint_from_json` (`aura-engine::blueprint_serde`),
referencing nodes by **compiled-in type identity** through an **injected resolver**
whose concrete closed `match` over the `aura-std` vocabulary lives outside the engine
(`aura-std::std_vocabulary`) — the engine stays domain-free, no node registry
(invariant 9). Acceptance met: a serialized blueprint runs **bit-identical** (C1) to
its Rust-built twin. `model_to_json` (C9) remains the render half; this closes the
loop for the round-trippable vocabulary. **Remaining** (each its own milestone
issue): the forward-compat *must-understand* gate (#156); the introspectable
construction service that *emits* blueprints (#157); content-addressed topology
identity in the manifest (#158, C18); retiring the pre-C24 hard-wired `aura-cli`
harnesses (`HarnessKind`, `run_stage1_r`, `*_sweep_family`) once the construction +
project-as-crate layers land (#159). **Out of the first cut's round-trippable set**
(deliberate; fails clean as `UnknownNodeType`, never a silent wrong graph): recording
sinks (capture an `mpsc::Sender` — runtime identity, not param-generic data, C19) and
construction-arg builders (`LinComb` / `CostSum` / `SimBroker` / `Session`
structural-axis args, a C20 concern), additively addable later (#156). Still
sequencing-coupled to the **project-as-crate authoring layer** (`aura new` /
`Aura.toml` / `cdylib` loading, C16/C17) and the **composable-orchestration** thread
(#109): topology-as-data is the substrate both stand on. The pre-C24 hard-wired
harnesses (`HarnessKind`, `run_stage1_r`, the per-strategy `*_sweep_family` in
`aura-cli`) are scaffolding retired as it lands.
(#109): topology-as-data is the substrate both stand on.
---