From bb90c42028dfc00ba1ebda5c20114a84f0703b99 Mon Sep 17 00:00:00 2001 From: Brummel Date: Mon, 8 Jun 2026 17:20:18 +0200 Subject: [PATCH] =?UTF-8?q?audit:=20cycle=200022=20(#46)=20=E2=80=94=20dri?= =?UTF-8?q?ft=20reconciled;=20output=20bindings=20shipped?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Architect drift review (range 69d2094..HEAD), regression gate empty (no scripts configured). Status: drift_found, all resolved here or queued. What holds: C8/C23 intact — output_binding folds OutField.name onto the producer label as a pure render symbol; compiled_view_golden byte-identical, no name reaches the compilat; the drawn where: graph is now exactly the computation DAG (false terminals + node-count inflation gone). Resolved (doc reconciliation, this commit): - docs/design/INDEX.md: two stale render descriptions brought current — the C9/0018 realization said output names render as `[out:]` markers; the C19/0017 realization said `[in:k]`/`[out]` port markers. Both superseded by the `name := producer` binding form (the `[out]` staleness is cycle-0022's; the adjacent `[in:k]` was pre-existing drift from 0019/0020 and is reconciled in the same clause while here). - docs/specs/0022: post-ship note added — its Components/Testing strategy under-counted the blast radius, missing the full-render golden blueprint_view_golden (forced re-capture, caught at implement). Queued (not fixed): output_binding's tuple arm `(a, b) := …` is spec'd + shipped but unexercised (no fixture re-exports >1 field from one node) — filed as #47 (idea). cycle 0022 drift-clean after this reconciliation (not a milestone close). --- docs/design/INDEX.md | 7 +++++-- docs/specs/0022-composite-output-binding-render.md | 8 ++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/docs/design/INDEX.md b/docs/design/INDEX.md index f808e08..5a01ec6 100644 --- a/docs/design/INDEX.md +++ b/docs/design/INDEX.md @@ -303,7 +303,8 @@ cycle 0005). This is the **same arity** C8 already grants a leaf (OHLCV = one po of K fields, **one** port, **one** row per `eval` — C8/C7/C4 untouched, a boundary completion, not a contract change. A strategy composite is simply the K=1 case (one exposure field, C10). The re-export **names** are **non-load-bearing** (C23): -they live at the blueprint boundary and in render (`[out:]` markers, #13) +they live at the blueprint boundary and in render (cycle 0022/#46 folds each onto +its producing node as a `name := …` binding; originally `[out:]` markers, #13) but are dropped at lowering — `ItemLowering::Composite.output` is `Vec<(usize, usize)>`, raw index pairs only, so the compilat is name-free (verified: the compiled-view render stayed bit-identical across this change). @@ -613,7 +614,9 @@ label refinement now appears only in the *compiled* view (built nodes, `Node::la structure** as a *program with subroutines*: a flat **main graph** wiring the harness with each composite shown as a **single opaque node** `[name]`, plus a `where:` section that defines each **distinct** composite type **once** (its -interior with `[in:k]`/`[out]` port markers; deduped by `name()`, collected +interior with named input-entry nodes and outputs folded onto their producers as +`name := …` bindings (render refined through cycles 0019–0022; originally +`[in:k]`/`[out]` port markers); deduped by `name()`, collected recursively so nested composites are opaque nodes with their own definitions). This supersedes #13's original cluster-box model and is the durable split this view realizes: **blueprint = source** (composites as named subroutines, body once) vs. diff --git a/docs/specs/0022-composite-output-binding-render.md b/docs/specs/0022-composite-output-binding-render.md index f26d311..727c670 100644 --- a/docs/specs/0022-composite-output-binding-render.md +++ b/docs/specs/0022-composite-output-binding-render.md @@ -281,6 +281,14 @@ Build / determinism: byte-identical (C23 — the compiled view never carried output names); the MACD run stays deterministic and unchanged in metrics (render-only change). +> **Post-ship note (audit 0022).** This Testing strategy and the §Components table +> under-counted the test blast radius: besides the `contains`-style assertions, the +> full-render golden `blueprint_view_golden` (`crates/aura-cli/src/main.rs`) pins the +> entire sample (`sma_cross`) blueprint render and was forced to re-capture (the +> `[cross]` output stub + its edge collapse into `[cross := Sub(#Sf,#Ss)]`). The +> shipped change is correct and green; this note records the doc-vs-reality gap that +> the implement phase surfaced. + A dedicated multi-output-per-node tuple-binding unit test is **not** required for acceptance (no such composite exists in the fixtures), but `output_binding`'s tuple branch is specified above so a future multi-output composite renders `(a, b) :=`