A node rename mints a fresh trace directory for a bit-identical run #354
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?
Observation
Found by the #311 cycle-close field test, source-blind, against the built binary. Corpus:
fieldtests/cycle-311-trace-identity/(fixturesc311_1_spread.ops.jsonandc311_3b_spread_rename_nodes.ops.json).Two blueprints identical in every respect except their node identifiers produce byte-identical recorded series but land in two trace directories:
The recorded tap series compare byte-identical across the two addresses.
Cause, visible without reading source
RunManifest.paramsrecords node-qualified names, and the run-identity digest hashes the mergedparams/defaultsvector. The two stored manifests differ in exactly that key:#311's audit pass substituted
blueprint_identity_json's debug-symbol-blind projection fortopology_hashinside the digest, which is what makes a description-only edit converge. That substitution reaches one hashed field; the parameter vector re-admits the same names through another.The fork
This is a design call, not a mechanical fix — two established positions in this repository disagree:
manifest.paramsis part of what the run record describes, and two records that differ are two runs. Under this reading the behaviour is correct and #311's C22 clause is what needs narrowing (already done — see below).blueprint_identity_jsondeliberately blanks bound-param names while keeping position, kind and value, i.e. the repository's own definition of blueprint identity says param names are not identity-bearing. Under this reading a run whose parameters differ only in name is one run, and the digest should hash the parameter vector name-blind.Option (b) carries a mechanical trap worth stating up front: the vector is merged name-sorted, so dropping the names without also fixing the ordering would silently reorder values (
fast/slow→[2,4]butlazy/quick→[4,2]). A name-blind digest must take its order from the blueprint's structural position, which #171's projection already preserves.What was done in the #311 cycle
Nothing to the behaviour. C22's clause asserted the convergent reading outright ("two blueprints differing only in such names compute bit-identically, so one address is the correct answer") and was corrected to state what actually holds, naming this issue as the open fork. The description-only case, which does converge, is pinned by a test.
Severity is low in practice: it costs a duplicate directory for a bit-identical run after a rename, and nothing is lost or misread. It is filed because it is the last member of the class #311 set out to close — something that is not part of a run's identity reaching its address — and because a contract now points here for the answer.