audit: cycle 0039 — drift-clean (GraphBuilder name-based wiring)
Close-audit for cycle 0039 (commit range 3a1dceb..a6a314b). Architect drift review against the design ledger + CLAUDE.md domain invariants: no contract drift, no debt. No regression scripts are configured (the architect is the gate); build + test + clippy verified green independently by the orchestrator (aura-engine 123 passed, +9 new; full workspace green; clippy --all-targets -D warnings exit 0). cycle 0039 (clean): - C23 / C11 preserved: the compilat is byte-unchanged this cycle. harness.rs (Edge / FlatGraph / Target / SourceSpec) is untouched; the new GraphBuilder resolves every port/field name in build() (resolve_slot / resolve_field) and lowers to the unchanged Composite::new with raw-index Edge / Role / OutField. No name-carrying field was added to any compilat type — names resolve at the authoring boundary and never reach FlatGraph. - C10 / C17 preserved: GraphBuilder is a genuine fluent Rust builder over the existing structs, not a DSL. Node references are typed Copy handles; only port/field names are strings, resolved against declared NodeSchema data. - C8 / C1 / C2 preserved: resolution is cold authoring-time; the run loop and the bootstrap kind-check remain the structural gate (name resolution is necessary, not sufficient). - #21 deferral is coherent: the exposure/price swap is made legible (named slots) but deliberately NOT structurally closed; issue #65 carries the structural follow-up (promoting port/field names to load-bearing keys), and no ledger contract claims the swap is closed. Awareness (not drift, spec-consistent): feed() indexes self.roles[role.0] directly, so a RoleHandle minted by a different builder panics rather than returning BuildError::BadHandle (which covers only NodeHandles, per the signed spec). RoleHandle out-of-range robustness is unspecified by spec 0039.
This commit is contained in: