From 26b3d689df3b4ced4ef8a26519d9a48e76e388ef Mon Sep 17 00:00:00 2001 From: claude Date: Fri, 24 Jul 2026 20:09:41 +0200 Subject: [PATCH] docs: open patterns run when the harness can bind them; README's tenth op; C29 backstop MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fieldtest truth pass (composites-use, B1/S1/S2/S3): - The "running an open pattern standalone refuses" sentence was wrong — and it was this cycle's own ratification prose, not code. Reality (ratified as-is): the harness binds input roles to archive columns BY NAME (C26), so an open pattern whose roles match the data runs standalone as a matter of design; what refuses, by name, is a role the harness cannot bind, or the run surface's other gates (bias/tap, free knobs). The authoring guide's input row now states exactly that; C24's input row ("only compile/ bootstrap require it bound") and the glossary's "requires them bound" were already accurate and stand. - README enumerated nine op kinds — the tenth (use) added (S2). - The use-seam C29 doc gate is stated as what it is: a backstop — the register verb already gates both input forms, so it fires only for store content written before C29 or through the raw in-crate path (S3, ratified). B1's fieldtest classification was bug->debug; overridden to ratify+document: the observed behaviour is C26-coherent and useful (quick-testing a pattern against real data), the defect was the sentence. Minuted on #317. refs #317, refs #339 --- README.md | 7 ++++--- docs/authoring-guide.md | 2 +- docs/design/contracts/c24-blueprint-data.md | 4 +++- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 35a385e..273909d 100644 --- a/README.md +++ b/README.md @@ -119,9 +119,10 @@ aura sweep crossover.bp.json --list-axes ``` The op kinds are `source`, `input`, `add`, `feed`, `connect`, `expose`, `tap`, -`gang`, and `doc` (`tap` declares a recorded measurement point on an interior -wire; `doc` declares the composite's one-line meaning, required at register — -C29; see the authoring guide). See +`gang`, `doc`, and `use` (`tap` declares a recorded measurement point on an +interior wire; `doc` declares the composite's one-line meaning, required at +register — C29; `use` splices a registered blueprint in as a nested composite, +by content id or label; see the authoring guide). See `aura graph introspect --node ` for a type's exact ports and the op-script grammar in the design ledger for the full semantics. diff --git a/docs/authoring-guide.md b/docs/authoring-guide.md index d1d58a5..384f262 100644 --- a/docs/authoring-guide.md +++ b/docs/authoring-guide.md @@ -227,7 +227,7 @@ are dotted `.` on both sides of a wire. |---|---|---| | `doc` | `{"op":"doc","text":}` | declare the composite's one-line meaning (C29) — the op-script twin of the Rust builder's `.doc(...)`. Required before `aura graph register` accepts the product (the store refuses a doc-less composite); at most one per script (a second refuses: `a doc op may appear at most once`). The text is gated: empty or merely restating the composite's name refuses at register. | | `source` | `{"op":"source","role":,"kind":}` | reserve a bound root **source** role of `kind` — a real input the harness feeds (e.g. `"price"`). | -| `input` | `{"op":"input","role":}` | reserve an open root **input** role (kind inferred from the slots it feeds) — the formal parameter of an **open pattern**, a fragment meant to be wired by an *enclosing* graph. An open pattern builds and registers like any blueprint; only *running* it standalone refuses (bootstrap's unbound-root-role gate — there is no enclosing graph to wire it). | +| `input` | `{"op":"input","role":}` | reserve an open root **input** role (kind inferred from the slots it feeds) — the formal parameter of an **open pattern**, a fragment meant to be wired by an *enclosing* graph. An open pattern builds and registers like any blueprint. Running it standalone is governed by the ordinary run gates: the harness binds input roles to archive columns **by name** (C26), so a pattern whose roles match the data runs as-is; what refuses, by name, is a role the harness cannot bind — or the run surface's other gates (a signal without a bias output or tap; free knobs). | | `add` | `{"op":"add","type":,"name":?,"bind":{:}?}` | instantiate a node of a type in the closed vocabulary (`aura graph introspect --vocabulary`) — see §0 below for how a type gets into that vocabulary in the first place. `name` becomes the node's identifier for later ops (default: the type's own lowercase label — two unnamed nodes of the same type then collide). `bind` sets zero or more of its params. | | `use` | `{"op":"use","ref":{"content_id":}\|{"name":