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:
2026-06-14 02:29:37 +02:00
parent a6a314bb98
commit 7865030d33

Diff Content Not Available