From 4a30222fdcc0dcc2f880b12f138a9286d6908314 Mon Sep 17 00:00:00 2001 From: claude Date: Fri, 24 Jul 2026 19:51:57 +0200 Subject: [PATCH] =?UTF-8?q?audit:=20#317=20cycle=20close=20=E2=80=94=20res?= =?UTF-8?q?idues=20homed,=20gang-refusal=20claim=20pinned?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Architect (fable gate): drift_found, minor, no contract violation. What holds: invariant 9 / engine-store split (Op::Use resolves only through the injected closure; the label sidecar is the C24 §Enforcement-shift-permitted store-layer discovery, the splice inlines so the marketplace Forbids clause is untouched); the C1 twin oracle; the open-pattern split consistent on both cadences across C24, guide, module docs, and the flipped pin. Drift resolutions: - [medium] #317 minute 4621 over-claimed "gangable" -> correcting comment 4629 posted; all prose surfaces already state "sweepable, not gangable". - [medium] four accepted residues had no tracker home -> collective issue #339 (instance-param ganging, gang-knob binding at splice, open-run refusal rendering, --unwired on use-bearing documents) per the consolidation practice. - [low] the documented "gang refuses an instance member path" claim was unpinned -> pinned here: gang_of_a_spliced_instance_member_path_refuses (this commit's one code change). - [low] --unwired on use-bearing documents -> #339 item 4. Regression: aura-bench report-only, all five surfaces fingerprint OK — engine_throughput -0.2% bars_per_s, ingest +0.0%, campaign_sweep +0.1% cpu / +0.5% rss / -0.3% wall, campaign_heavy +1.2% cpu / -8.8% rss / -0.9% wall, cli_fixed_cost +1.2% help / -1.8% run. No baseline moved, nothing to ratify. Erratum (batch-2 report): the harvest-sweep fieldtest spec consumed this cycle; removed with the plan/spec sweep at this close. refs #317 --- crates/aura-engine/src/construction.rs | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/crates/aura-engine/src/construction.rs b/crates/aura-engine/src/construction.rs index bc731ef..cdf5e5f 100644 --- a/crates/aura-engine/src/construction.rs +++ b/crates/aura-engine/src/construction.rs @@ -1493,6 +1493,32 @@ mod tests { ); } + /// Documented residue pin (#317 audit): a `gang` op cannot fuse a spliced + /// instance's member param — a gang fuses a PRIMITIVE's raw `(name, pos)` + /// slot, and an instance's params are nested/path-qualified. The refusal + /// is the ordinary no-such-open-param shape on the instance node, so the + /// authoring-guide/C24 claim "the gang op refuses a composite instance's + /// member path" stays an observed fact, not prose. + #[test] + fn gang_of_a_spliced_instance_member_path_refuses() { + let subgraph = |_: &str| Some(use_fixture()); + let mut s = GraphSession::new("g", &std_vocabulary, &subgraph); + s.apply(Op::Use { ref_id: "fixture".into(), name: Some("gate".into()), bind: vec![] }) + .unwrap(); + s.apply(Op::Add { type_id: "SMA".into(), as_name: Some("solo".into()), bind: vec![] }) + .unwrap(); + assert_eq!( + s.apply(Op::Gang { + as_name: "fused".into(), + into: vec!["gate.sma.length".into(), "solo.length".into()], + }), + Err(OpError::BadParam { + node: "gate".into(), + err: BindOpError::UnknownParam("sma.length".into()), + }) + ); + } + /// DAG invariant (domain invariant 5 / C9), through an instance: a /// `connect` closing a cycle through a spliced instance is rejected /// eagerly, the instance treated as one opaque node (#317) — the same