audit: cycle 0022 (#46) — drift reconciled; output bindings shipped

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:<name>]`
  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).
This commit is contained in:
2026-06-08 17:20:18 +02:00
parent 3b496883e6
commit bb90c42028
2 changed files with 13 additions and 2 deletions
+5 -2
View File
@@ -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:<name>]` 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:<name>]` 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 00190022; 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.
@@ -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) :=`