audit: cycle 0019 (#41) — drift-clean; C9 boundary-uniform realization note

Architect drift review over 8bc429f..HEAD (spec 03f2dc4, plan c9115e3,
impl 41cbb55; plus the in-range #42 fieldtest port 241bb62). No regression
scripts configured (profile regression/architect_sweeps both empty) — the
architect is the sole gate.

Result: clean. C23 holds — Role.name / ParamAlias.name / OutField.name are
all dropped at lowering; compiled_view_golden byte-identical (untouched in
the diff); the param_space slot-order anchors green and unmodified. Param
aliasing is a pure naming overlay (relabel in place, slot order/arity/kind
unchanged), confirmed by the new relabel/unaliased/partial tests. C8/C7/C4/
C9 untouched (authoring-surface legibility only); BadInteriorIndex reused,
no new variant. The #42 port is faithful (assertions strengthened, not
gutted).

One drift item, resolved here: the 0018 C9 realization note carried a stale
"Input-role and param names ... remain index-only pending #41" sentence.
#41 has landed, so this commit replaces it with a cycle-0019 realization
note recording that all three composite-boundary edge-kinds (input roles /
params / outputs) are now uniform named projections of interior handles
(Role / ParamAlias / OutField), names non-load-bearing and dropped at
lowering — the prose now matches the shipped code.

drift-clean, not a milestone close (no milestone fieldtest run here).
This commit is contained in:
2026-06-08 02:24:15 +02:00
parent 41cbb5506f
commit ebe2e71349
+16 -3
View File
@@ -306,9 +306,22 @@ completion, not a contract change. A strategy composite is simply the K=1 case
they live at the blueprint boundary and in render (`[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). Input-role and
param **names** at the same boundary remain index-only pending #41 (the legibility
sibling that depends on this cycle).
compiled-view render stayed bit-identical across this change).
**Realization (cycle 0019 — name the composite boundary, #41).** The same
named-projection shape now covers the other two boundary edge-kinds, so **all
three** are uniform: `input_roles` is a `Vec<Role { name, targets }>` (was a bare
`Vec<Vec<Target>>`) and a composite carries `params: Vec<ParamAlias { name, node,
slot }>`, alongside `output: Vec<OutField>`. Each is an ordered, positionally-indexed
**named projection** of interior handles. Param aliasing is a **pure naming overlay**,
not curation: `param_space()` relabels an aliased slot's surface name **in place**
slot order, arity, and kinds are unchanged, so the sweep surface is identical and the
`param_space_mirrors_compiled_flat_node_param_order` anchor stays green. Like the
output names, role and param **names** are **non-load-bearing** (C23): they live at
the blueprint boundary and in render (`[in:<name>]` / `[param:<name>]` markers) but
are dropped at lowering — the compilat is wired by raw index and a dangling alias is
rejected at compile (`BadInteriorIndex`), not silently lowered. The full composite
boundary signature (named inputs, params, multi-outputs) is now legible without
changing the compilat.
### C10 — Strategy output is an intent/exposure stream; position management is a decoupled derived layer; brokers are downstream nodes
**Guarantee.** A strategy's primary, backtestable output is **not** an equity