construction-args residues: refuse serializing a pending builder; version prose shows only the ceiling #341

Open
opened 2026-07-24 21:48:20 +02:00 by claude · 2 comments
Collaborator

Two small residues from the #271 cycle, found by the audit architect (collective issue per the bundling practice — neither warrants its own thread).

  1. Silent unloadable artifact on the Rust path. blueprint_serde::project_node serializes a Rust-assembled composite that still holds a pending (unconfigured) arg-bearing builder as an args-free v1 document — which can never load (reconstruct refuses it as MissingArg). The data path is fenced (add_node applies try_args before anything enters a graph); only the Rust path can build this state (GraphBuilder::add(Session::builder()) without try_args). The serialize seam should refuse a pending builder outright (a SerializeError naming the node and its missing args) instead of emitting a document whose fault only surfaces at load.

  2. Version-range prose hides the floor. crates/aura-cli/src/graph_construct.rs:~704 renders the UnsupportedVersion fault as "this build reads {supported}" printing only the ceiling (2); a v3 document's refusal should say the build reads versions 1..=2.

context: both are inside the #271 seam, behaviour-preserving for every shipped artifact; item 1 is the same fencing philosophy as the load-path refusal, applied to the write side.

Two small residues from the #271 cycle, found by the audit architect (collective issue per the bundling practice — neither warrants its own thread). 1. **Silent unloadable artifact on the Rust path.** `blueprint_serde::project_node` serializes a Rust-assembled composite that still holds a *pending* (unconfigured) arg-bearing builder as an args-free v1 document — which can never load (`reconstruct` refuses it as `MissingArg`). The data path is fenced (`add_node` applies `try_args` before anything enters a graph); only the Rust path can build this state (`GraphBuilder::add(Session::builder())` without `try_args`). The serialize seam should refuse a pending builder outright (a `SerializeError` naming the node and its missing args) instead of emitting a document whose fault only surfaces at load. 2. **Version-range prose hides the floor.** `crates/aura-cli/src/graph_construct.rs:~704` renders the `UnsupportedVersion` fault as "this build reads {supported}" printing only the ceiling (`2`); a v3 document's refusal should say the build reads versions 1..=2. context: both are inside the #271 seam, behaviour-preserving for every shipped artifact; item 1 is the same fencing philosophy as the load-path refusal, applied to the write side.
Author
Collaborator

Absorbed from the #271 fieldtest (bundling practice)

Two further items on the same seam, evidence in fieldtests/construction-args/TRANSCRIPT.md:

  1. Discoverability dead-end on arg-bearing types (friction). graph introspect --node LinComb shows the arg rows and the pending note but — by design — no ports/params, and nothing tells the consumer where to go next: the fieldtester's first port guess (lc.in0) was wrong, and only trial refusals surfaced term[i]. The --node pending note should name the follow-up moves (graph introspect --unwired on a partial document / sweep --list-axes after build), and the authoring guide's worked-example set lacks a LinComb op-script showing term[i]/weights[i].

  2. CostSum reachable but pathless (spec_gap). CostSum{n_costs} builds via args, but no public doc shows an op-script wiring path for cost nodes (cost[k].<field> ports need RiskExecutor/cost-graph context that lives only in Rust-path prose). Either the guide gains a minimal cost-wiring op-script example or the ledger states explicitly that the cost graph's op-script story is deferred.

The cheap ratifiable half of the fieldtest findings (Count lexical form + per-kind asymmetry) was ratified directly into glossary/guide (commit eb2b0a1); these two need small follow-up work, not prose.

## Absorbed from the #271 fieldtest (bundling practice) Two further items on the same seam, evidence in `fieldtests/construction-args/TRANSCRIPT.md`: 3. **Discoverability dead-end on arg-bearing types (friction).** `graph introspect --node LinComb` shows the arg rows and the pending note but — by design — no ports/params, and nothing tells the consumer where to go next: the fieldtester's first port guess (`lc.in0`) was wrong, and only trial refusals surfaced `term[i]`. The `--node` pending note should name the follow-up moves (`graph introspect --unwired` on a partial document / `sweep --list-axes` after build), and the authoring guide's worked-example set lacks a LinComb op-script showing `term[i]`/`weights[i]`. 4. **CostSum reachable but pathless (spec_gap).** `CostSum{n_costs}` builds via args, but no public doc shows an op-script wiring path for cost nodes (`cost[k].<field>` ports need RiskExecutor/cost-graph context that lives only in Rust-path prose). Either the guide gains a minimal cost-wiring op-script example or the ledger states explicitly that the cost graph's op-script story is deferred. The cheap ratifiable half of the fieldtest findings (Count lexical form + per-kind asymmetry) was ratified directly into glossary/guide (commit eb2b0a1); these two need small follow-up work, not prose.
Author
Collaborator

Fifth item (m37 milestone fieldtest, 2026-07-24): the bare unknown-type refusal omits the Rust-escalation pointer

add type "my_lab::ThirdCandle" refuses with the full escalation hint (...attach one with 'aura nodes new <name>'), but the bare add type "ThirdCandle" refuses with only unknown node type "ThirdCandle". The consumer most likely not to know yet that new logic is Rust — and therefore least likely to namespace — gets no sign-post toward the node-authoring path. Extend the bare-form refusal to match the namespaced diagnostic (fieldtests/m37-data-authorability-boundary/m37_3a and its bare variant, binary eb2b0a1).

## Fifth item (m37 milestone fieldtest, 2026-07-24): the bare unknown-type refusal omits the Rust-escalation pointer `add type "my_lab::ThirdCandle"` refuses with the full escalation hint (`...attach one with 'aura nodes new <name>'`), but the bare `add type "ThirdCandle"` refuses with only `unknown node type "ThirdCandle"`. The consumer most likely not to know yet that new logic is Rust — and therefore least likely to namespace — gets no sign-post toward the node-authoring path. Extend the bare-form refusal to match the namespaced diagnostic (`fieldtests/m37-data-authorability-boundary/m37_3a` and its bare variant, binary eb2b0a1).
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Brummel/Aura#341