Reconcile the sweep-axis namespace: sugar graph.<node>.<param> vs document <node>.<param> (open-only) #328

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

Observed (binary-only M1 milestone fieldtest, 2026-07-24, binary d26f0c8)

The two layers disagree about what a sweep axis is called — and about which params are sweepable at all:

  • Sugar: aura sweep <bp> --list-axes presents graph.fast.length:I64 default=5 (bound params are overridable axes per #246; graph is the blueprint's default name) and --axis graph.fast.length=… is accepted.
  • Document: campaign validate rejects that exact name — "axis "graph.fast.length" is not in the param space". A campaign axis must be an OPEN param named WITHOUT the prefix (fast.length), as reported by graph introspect --params — which prints nothing at all for a fully-bound blueprint.

So a consumer who learns an axis name from the sugar cannot author the canonical document form without discovering, by trial, (a) a different namespace and (b) that bound params are not campaign axes. No surface reconciles the two.

Why this is load-bearing now

#319 (ratified 2026-07-24) retires the sugar in favour of document-first authoring: the document form becomes the only form, so its axis vocabulary must absorb what the sugar expresses today (bound-override, #246) or the retirement loses capability. Reconciling the namespace — one axis name valid in both layers, or an explicit surface stating the mapping — is a prerequisite for (or the first slice of) the retirement.

Repro corpus: fieldtests/m1-self-description/s4_document_ramp/ (fieldtest finding class: spec_gap).

## Observed (binary-only M1 milestone fieldtest, 2026-07-24, binary d26f0c8) The two layers disagree about what a sweep axis is called — and about which params are sweepable at all: - Sugar: `aura sweep <bp> --list-axes` presents `graph.fast.length:I64 default=5` (bound params are overridable axes per #246; `graph` is the blueprint's default name) and `--axis graph.fast.length=…` is accepted. - Document: `campaign validate` rejects that exact name — "axis \"graph.fast.length\" is not in the param space". A campaign axis must be an OPEN param named WITHOUT the prefix (`fast.length`), as reported by `graph introspect --params` — which prints nothing at all for a fully-bound blueprint. So a consumer who learns an axis name from the sugar cannot author the canonical document form without discovering, by trial, (a) a different namespace and (b) that bound params are not campaign axes. No surface reconciles the two. ## Why this is load-bearing now #319 (ratified 2026-07-24) retires the sugar in favour of document-first authoring: the document form becomes the only form, so its axis vocabulary must absorb what the sugar expresses today (bound-override, #246) or the retirement loses capability. Reconciling the namespace — one axis name valid in both layers, or an explicit surface stating the mapping — is a prerequisite for (or the first slice of) the retirement. Repro corpus: `fieldtests/m1-self-description/s4_document_ramp/` (fieldtest finding class: spec_gap).
claude added the feature label 2026-07-24 11:05:41 +02:00
claude added this to the Sugar retirement — document-first authoring over a self-explaining CLI milestone 2026-07-24 14:30:07 +02:00
Author
Collaborator

Triage (2026-07-24)

Sorted into the new Sugar retirement milestone as its first item: the ratified #319 retirement makes the document form the only sweep-axis surface, so this reconciliation must land before the sugar goes. Queued after the Data-authorability boundary milestone per the ratified backlog plan.

## Triage (2026-07-24) Sorted into the new **Sugar retirement** milestone as its **first** item: the ratified #319 retirement makes the document form the only sweep-axis surface, so this reconciliation must land before the sugar goes. Queued after the Data-authorability boundary milestone per the ratified backlog plan.
claude self-assigned this 2026-07-24 23:45:37 +02:00
Author
Collaborator

Design reconciliation (specify)

Spec: axis-namespace. The forks below are listed open on this issue; this records their resolution. All are derived orchestrator decisions (rationale given), open to owner veto.

  • Fork: which name form is canonical -> raw (<node>.<param>, splice paths included: anchor.sess.period_minutes); the wrapped/prefixed form is retired from the user surface. Basis: derived — C23 makes the blueprint name a non-load-bearing debug symbol, and a debug symbol must not be the canonical address inside a committed intent document; the document layer (the #319 survivor) already speaks raw, and the sugar's own auto-generated campaign documents are already written raw (validate_and_register_axes strips the prefix today) — the wrapped form exists only on two sugar surfaces (--list-axes print, --axis parse). Consequence for #331: the blueprint name does NOT belong in axis paths; #331 narrows to registry/trace-dir naming.
  • Fork: how the sugar surfaces reconcile -> --list-axes prints raw (open bare, bound with default= as today); --axis accepts raw as the only form; a wrapped input gets a targeted translation refusal (naming the raw candidate) rather than a silent alias. Basis: derived — accepted form IS canonical form (the #271 strict-form precedent); a silent strip would keep two syntaxes for one vocabulary alive, which is #319's harm 2.
  • Fork: document-side translation -> campaign validate's "axis X is not in the param space" refusal gains a did-you-mean when stripping one leading segment yields a param-space hit. Basis: derived — the issue names "an explicit surface stating the mapping" as an acceptable resolution half; old transcripts quoting wrapped names remain in circulation and the refusal is where their authors land.
  • Fork: discovery for the document-first author -> graph introspect --params additionally lists bound params with the default= suffix, making it line-identical to the reconciled --list-axes. Basis: derived — the m1 fieldtest showed a fully-bound blueprint prints nothing, so a document-first author cannot discover overridable bound params without the sugar; the information (bound_param_space()) and the default= lexicon both already exist.
  • Fork: does the document absorb #246 bound-override -> yes, via the already-shipped name-coincidence mechanism (axis name may hit param_space() OR bound_param_space()); no schema flag is added; the contract gets documented in C18/glossary. Basis: derived — the behaviour exists and is pinned green (referential_tier_accepts_a_kind_correct_axis_over_a_bound_param), so absorption is ratification-plus-documentation, not construction; #319's "not a second home for intent" clause reads on the surviving executor-verb flag residue, not on document axes — the document IS the intent home ("while the document stays the base").
  • Fork: scope boundary -> internals untouched (wrap_r probe, the axes.rs/member.rs twin coordinate modules, bind_axes suffix matching); no blueprint-name op (that is #331); fieldtests/ archival transcripts keep their historical graph. prose (frozen corpus convention). Basis: derived — the disagreement is a surface/prosa/pin problem; touching the coordinate internals would widen blast radius with no capability gain.
## Design reconciliation (specify) Spec: axis-namespace. The forks below are listed open on this issue; this records their resolution. All are **derived orchestrator decisions** (rationale given), open to owner veto. - **Fork: which name form is canonical** -> **raw (`<node>.<param>`, splice paths included: `anchor.sess.period_minutes`); the wrapped/prefixed form is retired from the user surface.** Basis: derived — C23 makes the blueprint name a non-load-bearing debug symbol, and a debug symbol must not be the canonical address inside a committed intent document; the document layer (the #319 survivor) already speaks raw, and the sugar's own auto-generated campaign documents are already written raw (`validate_and_register_axes` strips the prefix today) — the wrapped form exists only on two sugar surfaces (`--list-axes` print, `--axis` parse). Consequence for #331: the blueprint name does NOT belong in axis paths; #331 narrows to registry/trace-dir naming. - **Fork: how the sugar surfaces reconcile** -> **`--list-axes` prints raw (open bare, bound with `default=` as today); `--axis` accepts raw as the only form; a wrapped input gets a targeted translation refusal (naming the raw candidate) rather than a silent alias.** Basis: derived — accepted form IS canonical form (the #271 strict-form precedent); a silent strip would keep two syntaxes for one vocabulary alive, which is #319's harm 2. - **Fork: document-side translation** -> **`campaign validate`'s "axis X is not in the param space" refusal gains a did-you-mean when stripping one leading segment yields a param-space hit.** Basis: derived — the issue names "an explicit surface stating the mapping" as an acceptable resolution half; old transcripts quoting wrapped names remain in circulation and the refusal is where their authors land. - **Fork: discovery for the document-first author** -> **`graph introspect --params` additionally lists bound params with the `default=` suffix, making it line-identical to the reconciled `--list-axes`.** Basis: derived — the m1 fieldtest showed a fully-bound blueprint prints nothing, so a document-first author cannot discover overridable bound params without the sugar; the information (`bound_param_space()`) and the `default=` lexicon both already exist. - **Fork: does the document absorb #246 bound-override** -> **yes, via the already-shipped name-coincidence mechanism (axis name may hit `param_space()` OR `bound_param_space()`); no schema flag is added; the contract gets documented in C18/glossary.** Basis: derived — the behaviour exists and is pinned green (`referential_tier_accepts_a_kind_correct_axis_over_a_bound_param`), so absorption is ratification-plus-documentation, not construction; #319's "not a second home for intent" clause reads on the surviving executor-verb flag residue, not on document axes — the document IS the intent home ("while the document stays the base"). - **Fork: scope boundary** -> **internals untouched (wrap_r probe, the axes.rs/member.rs twin coordinate modules, `bind_axes` suffix matching); no blueprint-name op (that is #331); fieldtests/ archival transcripts keep their historical `graph.` prose (frozen corpus convention).** Basis: derived — the disagreement is a surface/prosa/pin problem; touching the coordinate internals would widen blast radius with no capability gain.
Author
Collaborator

Skeptic correction to the reconciliation minute (2026-07-25)

An adversarial skeptic pass refuted the v1 spec's "surface-only, two sites" mechanics premise; the fork decisions stand, fork 6's scope statement is corrected:

  • There is a third wrapped surface: the synthetic sweep route bypasses validate_and_register_axes and bind_axes entirely (main.rs:2353-2367 -> run_blueprint_sweep) and resolves axes wrapped (override_paths, member.rs:743-758; SweepBinder verbatim-by-name, family.rs:450-473), leaking wrapped names into the user-visible run manifest (manifest.params, pinned main.rs:3583). The two sweep routes disagree internally today (real resolves raw via bind_axes; synthetic resolves wrapped) — the cycle now unifies them on the raw frame the real route already uses, and the manifest records raw.
  • raw_matches_wrapped also matches on equality, so it cannot be the acceptance gate (a wrapped name would pass silently — dead refusal ladder). The spec now defines an explicit raw-first predicate: accept iff the name is in the one-segment-stripped open set or the raw bound set; refuse-with-translation iff it is an exact wrapped hit.
  • The flip surface is larger than v1 claimed: every wrapped --axis literal in the test corpus flips to raw (enumerated by grep as a batch discipline), plus the synthetic family units (main.rs:3541/3572) and the manifest pin (3583).

Basis: derived — skeptic evidence at family.rs:420-473, member.rs:700-761, main.rs:1679-1717/2332-2367/3541-3589, axes.rs:34-46; the unification rationale is consistency (one resolution convention across both sweep routes) rather than convenience.

## Skeptic correction to the reconciliation minute (2026-07-25) An adversarial skeptic pass refuted the v1 spec's "surface-only, two sites" mechanics premise; the fork decisions stand, fork 6's scope statement is corrected: - There is a **third** wrapped surface: the synthetic sweep route bypasses `validate_and_register_axes` and `bind_axes` entirely (`main.rs:2353-2367` -> `run_blueprint_sweep`) and resolves axes wrapped (`override_paths`, member.rs:743-758; SweepBinder verbatim-by-name, family.rs:450-473), leaking wrapped names into the user-visible run manifest (`manifest.params`, pinned main.rs:3583). The two sweep routes disagree internally today (real resolves raw via `bind_axes`; synthetic resolves wrapped) — the cycle now **unifies them on the raw frame the real route already uses**, and the manifest records raw. - `raw_matches_wrapped` also matches on equality, so it cannot be the acceptance gate (a wrapped name would pass silently — dead refusal ladder). The spec now defines an explicit raw-first predicate: accept iff the name is in the one-segment-stripped open set or the raw bound set; refuse-with-translation iff it is an exact wrapped hit. - The flip surface is larger than v1 claimed: every wrapped `--axis` literal in the test corpus flips to raw (enumerated by grep as a batch discipline), plus the synthetic family units (main.rs:3541/3572) and the manifest pin (3583). Basis: derived — skeptic evidence at family.rs:420-473, member.rs:700-761, main.rs:1679-1717/2332-2367/3541-3589, axes.rs:34-46; the unification rationale is consistency (one resolution convention across both sweep routes) rather than convenience.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Brummel/Aura#328