Content-id includes the composite debug-name — consider a topology-canonical form #171
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?
Finding (cycle 0094, #158 acc 1)
The content id (
topology_hash/graph introspect --content-id) is SHA256 of thecanonical
blueprint_to_jsonform, which INCLUDES the composite's debug name. So twoblueprints that express the same topology but differ only in their composite debug-name
get DIFFERENT content ids. Concretely: an op-script (
graph build, composite named"graph") and the Rust
stage1_signalbuilder (named "stage1_signal") produce differentcanonical forms — also a named vs unnamed
Suband an unbound vs boundBias.scale— sothey never share a content id even when expressing the same SMA-cross topology.
Question
Should the content id key on a topology-canonical form that excludes non-load-bearing
debug symbols (the composite name, per invariant 11) rather than the byte-canonical
blueprint_to_jsonform? That would let the same topology dedup / content-addressregardless of authoring path (C11/C12), at the cost of a second canonical form and a
change to the shipped cycle-0092
topology_hashvalues (goldens).Not urgent
Reproduction (acc 2, shipped) is unaffected — it stores + reloads byte-exact blueprints
keyed by the byte-canonical id, so the debug-name riding along is harmless. This only
matters for cross-authoring-path dedup / identity. Filed as a forward design item.
Reconnoitred; remains a forward design item — crux fork captured (2026-07-01)
Reconnoitred under a C21-follow queue against the current tree. Confirmed
disjoint from other in-flight CLI work and not dependency-blocked, but it is
design-unsettled, so it stays a forward design item this round rather than being
opened. Capturing the fork so the eventual cycle starts from a populated space:
Golden re-baselining cost is ~zero. No 64-hex hash literal is pinned anywhere
(swept
crates/docs/fieldtests); the content-id tests assert onlylen==64I64:4vs5must differ).The one byte-canonical golden (
crates/aura-engine/src/blueprint_serde.rs,signal_serializes_to_canonical_golden) is affected only ifblueprint_to_json'sbyte form changes — which the issue argues against. This points at a separate
hash-only canonicalization used by
content_id/topology_hash, leavingblueprint_to_jsonand the byte-exact reproduction store untouched; under thatshape no golden re-baselines and new tests are added (an op-script and the Rust
stage1_signalbuilder share a content id).The crux fork (why this is not a one-line derivation). "What a
topology-canonical form strips" has three axes, only the first settled:
symbol).
Sub) — likely strippable(edges wire by index; names are debug-only), but not explicitly ratified.
Bias.scale) — UNSETTLED and the crux.ParamSpeccarries no default andBiasreadsp[0]unconditionally, so anunbound param is a FREE sweep axis, not "use-default." Conflating unbound
scalewith boundscale=0.5would merge an OPEN blueprint with a CLOSEDinstance — collapsing the sweep-store key's meaning and colliding with the
shipped distinguishing test. So identity-canonicalization's treatment of param
openness is a real semantic decision (dedup granularity + run identity), not a
derivation from invariant 11.
Low urgency: reproduction (byte-exact store, byte-canonical key) is unaffected;
this only bites cross-authoring-path dedup / identity (C11/C12). Appropriate to
open as its own design cycle when cross-path dedup is wanted.
Design reconciliation (specify, cycle 0104)
The fork this issue captured is resolved for spec production; an adversarial review of the initial derivation surfaced a load-bearing coupling that reshaped it.
Status: design settled — ready for spec production.