No op names a blueprint — everything registers as graph #331

Closed
opened 2026-07-24 11:05:41 +02:00 by claude · 6 comments
Collaborator

Binary-only M1 fieldtest (2026-07-24, d26f0c8): the op grammar has no op to set the blueprint name; every graph build output is named graph. The default leaks into the registry (all store entries named graph) and into the sugar axis namespace (graph.fast.length). Either add a name op (or an op-list header field), or document the default and its consequences in graph build --help.

Related: the axis-namespace reconciliation (#328) decides whether the blueprint name belongs in axis paths at all. Corpus: fieldtests/m1-self-description/s1_bootstrap_author_validate/.

Binary-only M1 fieldtest (2026-07-24, d26f0c8): the op grammar has no op to set the blueprint name; every `graph build` output is named `graph`. The default leaks into the registry (all store entries named `graph`) and into the sugar axis namespace (`graph.fast.length`). Either add a `name` op (or an op-list header field), or document the default and its consequences in `graph build --help`. Related: the axis-namespace reconciliation (#328) decides whether the blueprint name belongs in axis paths at all. Corpus: `fieldtests/m1-self-description/s1_bootstrap_author_validate/`.
Author
Collaborator

Milestone assignment (tracker harvest, 2026-07-24)

Moved to "Sugar retirement — document-first authoring over a self-explaining CLI": whether the blueprint name belongs in axis paths at all is exactly the #328 namespace decision, so a name op shipped before it risks immediate re-litigation. Sequence inside the milestone: #328 → this → #319.

## Milestone assignment (tracker harvest, 2026-07-24) Moved to "Sugar retirement — document-first authoring over a self-explaining CLI": whether the blueprint name belongs in axis paths at all is exactly the #328 namespace decision, so a name op shipped before it risks immediate re-litigation. Sequence inside the milestone: #328 → this → #319.
claude added this to the Sugar retirement — document-first authoring over a self-explaining CLI milestone 2026-07-24 15:52:41 +02:00
claude self-assigned this 2026-07-25 02:59:51 +02:00
Author
Collaborator

Design reconciliation (specify)

Spec: blueprint-name-op. The issue body leaves the mechanism open ("a name op (or an op-list header field), or document the default"); this records the resolution plus the forks a pre-spec recon surfaced.

  • Fork: mechanism — name op vs. header field vs. documentation-only → an eleventh op, {"op":"name","name":"<...>"}, script-level and at-most-once, following the doc op's shape. Basis: derived — the op-script format is deliberately envelope-free (a bare op list, no header), so a header field would be a format change with a second parse path and a migration question for every existing script, while the op vocabulary is the established closed-vocabulary extension point (C25) and doc is the exact precedent for a script-level metadatum authored as an op. Documentation-only heals neither of the two real collisions recon confirmed: every op-script blueprint's default tap recording lands in one shared trace directory, and two use-splices of unnamed blueprints collide as duplicate instance identifiers.
  • Fork: default when no name op is present → keep graph, byte-compatible. Basis: derived — any new default re-keys the content id of re-derived transcripts and breaks the restates-name doc-gate pin without semantic gain; C29's "registered artifacts are never retroactively invalidated" argues directly against re-interpreting existing unnamed documents; mandatory naming would break the whole existing corpus for no added capability, since the op is opt-in.
  • Fork: what the op sets → the render name (the blueprint document's name field — the exact field that is graph today). Consequences ride existing mechanics unchanged: store documents carry the authored name, trace runs write under it, use-splice instance defaults inherit it, and the restates-name doc-gate now checks against the real name. The registry label (register --name) stays an orthogonal, explicitly-set concept. The content id of a newly built named document differs from its unnamed twin (the name is part of the hashed bytes — by design); the identity id never changes (names are stripped as debug symbols, C23).
  • Fork: name shape constraints → a deterministic shape gate at intake, C29-style (string shape, never content judgement): non-empty, no path separators or traversal segments, because the name keys a trace directory on disk. Basis: derived — the name is used as a filesystem path segment today, so an unconstrained string is a correctness hazard, and the deterministic shape check is the established gate pattern.
  • Fork: the two collision surfaces (shared trace dir, use-splice duplicate) → no separate mechanism; the op itself is the fix (authored names disambiguate), and the default's collision behaviour gets documented. The pre-existing trace-directory contract question keeps its own issue (#311), untouched here.

Status: design settled — ready for spec production.

## Design reconciliation (specify) Spec: blueprint-name-op. The issue body leaves the mechanism open ("a name op (or an op-list header field), or document the default"); this records the resolution plus the forks a pre-spec recon surfaced. - **Fork: mechanism — name op vs. header field vs. documentation-only** → an eleventh op, `{"op":"name","name":"<...>"}`, script-level and at-most-once, following the `doc` op's shape. Basis: derived — the op-script format is deliberately envelope-free (a bare op list, no header), so a header field would be a format change with a second parse path and a migration question for every existing script, while the op vocabulary is the established closed-vocabulary extension point (C25) and `doc` is the exact precedent for a script-level metadatum authored as an op. Documentation-only heals neither of the two real collisions recon confirmed: every op-script blueprint's default tap recording lands in one shared trace directory, and two `use`-splices of unnamed blueprints collide as duplicate instance identifiers. - **Fork: default when no name op is present** → keep `graph`, byte-compatible. Basis: derived — any new default re-keys the content id of re-derived transcripts and breaks the restates-name doc-gate pin without semantic gain; C29's "registered artifacts are never retroactively invalidated" argues directly against re-interpreting existing unnamed documents; mandatory naming would break the whole existing corpus for no added capability, since the op is opt-in. - **Fork: what the op sets** → the render name (the blueprint document's `name` field — the exact field that is `graph` today). Consequences ride existing mechanics unchanged: store documents carry the authored name, trace runs write under it, `use`-splice instance defaults inherit it, and the restates-name doc-gate now checks against the real name. The registry label (`register --name`) stays an orthogonal, explicitly-set concept. The content id of a newly built named document differs from its unnamed twin (the name is part of the hashed bytes — by design); the identity id never changes (names are stripped as debug symbols, C23). - **Fork: name shape constraints** → a deterministic shape gate at intake, C29-style (string shape, never content judgement): non-empty, no path separators or traversal segments, because the name keys a trace *directory* on disk. Basis: derived — the name is used as a filesystem path segment today, so an unconstrained string is a correctness hazard, and the deterministic shape check is the established gate pattern. - **Fork: the two collision surfaces (shared trace dir, use-splice duplicate)** → no separate mechanism; the op itself is the fix (authored names disambiguate), and the default's collision behaviour gets documented. The pre-existing trace-directory contract question keeps its own issue (#311), untouched here. Status: design settled — ready for spec production.
Author
Collaborator

Reconciliation correction (specify — skeptic finding)

An adversarial pre-gate review refuted one decision in the reconciliation recorded at issues/331#issuecomment-4706 and the spec was revised before grounding:

  • Fork: name shape constraints — corrected. The gate as first minuted sat on the op intake only. That placement does not achieve its stated purpose (protecting the trace directory seam), because the name has a second data-borne birth route the first minute did not enumerate: the blueprint-envelope intake (graph build/register on a blueprint JSON file) reconstructs the composite with its name field unchecked, so a hand-edited envelope with "name":"../x" would register cleanly and write traces/../x/ at run time — nothing sanitizes the name downstream.
  • Corrected decision: one shared deterministic name_gate (shape only: non-empty, no path separators, not ./..) applied at both intake seams — the name op and the envelope intake's root name (the filesystem seam consumes exclusively the root name). Store read-back (reproduce, use-splice resolution from the registry) stays ungated: C29 forbids retroactively invalidating registered artifacts, and the store is populated through the gated intakes. Every shipped envelope fixture is named graph, which passes — no accepted input changes.

The review also positively confirmed two claims: the doc op is a genuine at-most-once script-level precedent for the new op's uniqueness guard, and the new internally-tagged op variant cannot change behaviour for any existing script (byte-compat holds).

Status: design settled (corrected) — spec revised, awaiting grounding.

## Reconciliation correction (specify — skeptic finding) An adversarial pre-gate review refuted one decision in the reconciliation recorded at issues/331#issuecomment-4706 and the spec was revised before grounding: - **Fork: name shape constraints — corrected.** The gate as first minuted sat on the op intake only. That placement does not achieve its stated purpose (protecting the trace directory seam), because the name has a **second data-borne birth route** the first minute did not enumerate: the blueprint-envelope intake (`graph build`/`register` on a blueprint JSON file) reconstructs the composite with its `name` field unchecked, so a hand-edited envelope with `"name":"../x"` would register cleanly and write `traces/../x/` at run time — nothing sanitizes the name downstream. - **Corrected decision:** one shared deterministic `name_gate` (shape only: non-empty, no path separators, not `.`/`..`) applied at **both** intake seams — the `name` op and the envelope intake's root name (the filesystem seam consumes exclusively the root name). Store **read-back** (reproduce, `use`-splice resolution from the registry) stays ungated: C29 forbids retroactively invalidating registered artifacts, and the store is populated through the gated intakes. Every shipped envelope fixture is named `graph`, which passes — no accepted input changes. The review also positively confirmed two claims: the `doc` op is a genuine at-most-once script-level precedent for the new op's uniqueness guard, and the new internally-tagged op variant cannot change behaviour for any existing script (byte-compat holds). Status: design settled (corrected) — spec revised, awaiting grounding.
Author
Collaborator

Spec auto-signed (/boss)

The spec for the blueprint name op was auto-signed on a grounding-check PASS (second dispatch; the first dispatch BLOCKed on two findings — an instance-default mechanic claimed as verified while no green test pins it, and a false statement about shipped fixture names — both resolved by spec revision: the mechanic is now carried as this iteration's own ratifying test, a commitment rather than an assumption, and the fixture claim was corrected to the actual names). Nine load-bearing current-behaviour assumptions were ratified against green tests, line anchors verified.

No human reviewed the spec at sign time; the veto window is open.

Status: spec signed — ready for implementation.

## Spec auto-signed (/boss) The spec for the blueprint `name` op was auto-signed on a grounding-check PASS (second dispatch; the first dispatch BLOCKed on two findings — an instance-default mechanic claimed as verified while no green test pins it, and a false statement about shipped fixture names — both resolved by spec revision: the mechanic is now carried as this iteration's own ratifying test, a commitment rather than an assumption, and the fixture claim was corrected to the actual names). Nine load-bearing current-behaviour assumptions were ratified against green tests, line anchors verified. No human reviewed the spec at sign time; the veto window is open. Status: spec signed — ready for implementation.
Author
Collaborator

Cycle-close minute (audit + bench)

Two decisions from the closing gates, recorded for the veto window:

  • Fork: architect found four more ungated authored-file store intakes (the sweep/walkforward/mc family builders and the axis-validation register path) — gate them vs. narrow the ledger prose. → Gated, same shared shape gate and refusal prose as every other authored intake. Basis: derived — the C29 read-back exemption rests on the premise that the store is only populated through gated intakes; weakening the prose would surrender the invariant itself rather than fix the wording. The gate sits before each family/axis build because a malformed name otherwise surfaces as a misleading unknown-axis error first (verified by deliberately mis-placing it). One e2e pin on the synthetic sweep route.
  • Bench: cli_fixed_cost fingerprint CHANGED — regression vs. ratify. → Ratified with a re-pin, cause attributed outside this cycle: the #328 tidy switched single-run manifest defaults from wrapped to raw axis names after #328's own bench rerun had already passed, leaving the committed baseline stale. Verified empirically by building the pre-cycle binary and diffing the run record lines field by field: pre-cycle and this cycle's HEAD are fingerprint-identical; only the volatile build-commit field differs. All five surfaces fingerprint OK after the re-pin.

Status: cycle drift-clean (fix-path resolved); field test pending.

## Cycle-close minute (audit + bench) Two decisions from the closing gates, recorded for the veto window: - **Fork: architect found four more ungated authored-file store intakes (the sweep/walkforward/mc family builders and the axis-validation register path) — gate them vs. narrow the ledger prose.** → Gated, same shared shape gate and refusal prose as every other authored intake. Basis: derived — the C29 read-back exemption rests on the premise that the store is only populated through gated intakes; weakening the prose would surrender the invariant itself rather than fix the wording. The gate sits before each family/axis build because a malformed name otherwise surfaces as a misleading unknown-axis error first (verified by deliberately mis-placing it). One e2e pin on the synthetic sweep route. - **Bench: cli_fixed_cost fingerprint CHANGED — regression vs. ratify.** → Ratified with a re-pin, cause attributed outside this cycle: the #328 tidy switched single-run manifest defaults from wrapped to raw axis names after #328's own bench rerun had already passed, leaving the committed baseline stale. Verified empirically by building the pre-cycle binary and diffing the run record lines field by field: pre-cycle and this cycle's HEAD are fingerprint-identical; only the volatile build-commit field differs. All five surfaces fingerprint OK after the re-pin. Status: cycle drift-clean (fix-path resolved); field test pending.
Author
Collaborator

Cycle-close minute (fieldtest)

Source-blind consumer fieldtest over the four cycle axes (release binary, 4 examples, corpus fieldtests/cycle-331-blueprint-name/): roll-up bugs_found — 1 bug / 0 friction / 1 spec_gap / 4 working.

  • B1 (bug, fixed in-cycle, RED-first): sweep <file> --list-axes was the one authored-envelope file route still outside the gate class — a hand-edited bad root name listed mangled wrapped axis names at exit 0 while every sibling intake refused. The e2e refusal test was observed failing before the fix; the route now refuses before any axis line prints.
  • SG1 (spec_gap, ratified): the refusal prose is byte-uniform in its core sentence while the leading context prefix varies by site convention — C24 now says exactly that instead of an unqualified "uniform".
  • W1-W4 (working): the authoring loop lands the name in bytes, store document, and traces// with the documented default collision observable; op-route refusals are op-indexed; use-splice instance defaults, collision, and dissolution behave as documented; help/guide/glossary agree on eleven ops and the render-name vs registry-label split.

Status: cycle complete — feature, review, audit (drift resolved fix-path), fieldtest, and the fieldtest bug all closed; full suite green on the final head.

## Cycle-close minute (fieldtest) Source-blind consumer fieldtest over the four cycle axes (release binary, 4 examples, corpus fieldtests/cycle-331-blueprint-name/): roll-up bugs_found — 1 bug / 0 friction / 1 spec_gap / 4 working. - **B1 (bug, fixed in-cycle, RED-first):** `sweep <file> --list-axes` was the one authored-envelope file route still outside the gate class — a hand-edited bad root name listed mangled wrapped axis names at exit 0 while every sibling intake refused. The e2e refusal test was observed failing before the fix; the route now refuses before any axis line prints. - **SG1 (spec_gap, ratified):** the refusal prose is byte-uniform in its core sentence while the leading context prefix varies by site convention — C24 now says exactly that instead of an unqualified "uniform". - **W1-W4 (working):** the authoring loop lands the name in bytes, store document, and traces/<name>/ with the documented default collision observable; op-route refusals are op-indexed; use-splice instance defaults, collision, and dissolution behave as documented; help/guide/glossary agree on eleven ops and the render-name vs registry-label split. Status: cycle complete — feature, review, audit (drift resolved fix-path), fieldtest, and the fieldtest bug all closed; full suite green on the final head.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Brummel/Aura#331