construction-args residues: refuse serializing a pending builder; version prose shows only the ceiling #341
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Two small residues from the #271 cycle, found by the audit architect (collective issue per the bundling practice — neither warrants its own thread).
Silent unloadable artifact on the Rust path.
blueprint_serde::project_nodeserializes a Rust-assembled composite that still holds a pending (unconfigured) arg-bearing builder as an args-free v1 document — which can never load (reconstructrefuses it asMissingArg). The data path is fenced (add_nodeappliestry_argsbefore anything enters a graph); only the Rust path can build this state (GraphBuilder::add(Session::builder())withouttry_args). The serialize seam should refuse a pending builder outright (aSerializeErrornaming the node and its missing args) instead of emitting a document whose fault only surfaces at load.Version-range prose hides the floor.
crates/aura-cli/src/graph_construct.rs:~704renders theUnsupportedVersionfault 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.
Absorbed from the #271 fieldtest (bundling practice)
Two further items on the same seam, evidence in
fieldtests/construction-args/TRANSCRIPT.md:Discoverability dead-end on arg-bearing types (friction).
graph introspect --node LinCombshows 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 surfacedterm[i]. The--nodepending note should name the follow-up moves (graph introspect --unwiredon a partial document /sweep --list-axesafter build), and the authoring guide's worked-example set lacks a LinComb op-script showingterm[i]/weights[i].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.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 bareadd type "ThirdCandle"refuses with onlyunknown 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_3aand its bare variant, binaryeb2b0a1).