#164 — tighten the C24 "canonical, versioned" blueprint contract on two corners
the milestone fieldtest surfaced. Both forks were derivable; resolved with
rationale (recorded on #164).
Fork 1 — canonical artifact carries no trailing newline. `blueprint_to_json`
returns the JSON value with no trailing newline (647 bytes for the SMA-cross
fixture); `aura graph build` had framed it with a `println!` (648). The library
serializer is the single canonical source — the form content-addressed topology
identity (#158) hashes — so the CLI is a transport that must not mutate the
bytes: `build_cmd` now `print!`s the canonical bytes verbatim, making the CLI and
library emit paths byte-identical. RED-first: the new E2E
`graph_build_emit_is_byte_canonical_no_trailing_newline` pinned the trailing
newline (FAIL), green after the one-line change. The two cycle-0088 `.out.json`
goldens are re-recorded at 647 bytes. The loader stays lenient (a trailing
newline on input still parses, Tier-1 robustness; the milestone fieldtest's
`mt_4` tolerance check is unaffected).
Fork 2 — the canonical JSON is the blueprint equality/identity surface; no
second in-memory PartialEq/Debug is added. `Composite`/`BlueprintNode` cannot
derive them: `PrimitiveBuilder` (aura-core node.rs) holds a
`build: Box<dyn Fn(&[Cell]) -> Box<dyn Node>>` closure, neither comparable nor
printable. Equality could only be defined over the serialized data, of which
`blueprint_to_json` is already the single source; a separate in-memory equality
notion would be a redundant second source of truth and a drift hazard against
the form #158 hashes. Recorded the decision (discharges acceptance box 2's "or
JSON-string is the intended equality surface" arm) in the C24 ledger; no code
added for it.
Verified: cargo test --workspace green (51 suites, incl. the new RED->green E2E);
cargo clippy --workspace --all-targets -D warnings clean.
closes#164
Exercise the construction op-script service (#157) purely as a downstream
consumer authoring topology as data: discover-then-author an SMA-crossover
bias, author-with-`--unwired`, and 15 error-ergonomics fixtures. Public
interface only (the C24 ledger + the CLI's own output); no implementation
source read.
Confirmed working: discover→author round-trip, the `--unwired` by-identifier
authoring aid, eager per-op diagnostics. Surfaced one bug + frictions, all
reproduced and filed forward:
- #161 (bug): `graph build` accepts a dataflow cycle — DAG invariant 5
unenforced; reproduced directly before filing.
- #162: construction error/bind ergonomics (raw-index finalize, Debug-struct
bind-mismatch, undiscoverable typed-Scalar bind).
- #28: no CLI consumer for the emitted #155 blueprint (round-trip dead-ends).
- #159: construction surface undiscoverable from the CLI usage/help.
FINDINGS.md carries the full report + the triage table. The two 1.4 MB
self-contained viewer HTML dumps from the round-trip check are dropped as
bloat (the byte-identical result is recorded in FINDINGS).