Repository navigation
v0.325.3 - A closing path's pointers are not ids
2026-10-15. Found in the dogfood project the same day, when one diamond was linked to its outcome.
What was wrong
- The validator failed on the closing-path script's own output.
derive_closing_path.py --writestores each leaf assumption a diamond waits on undercloses_on.inputs, as
{kind: assumption, id: a-006a-2, ref: "opportunities.yml#opp-006.sol-006a"}. That points at an
assumption defined inopportunities.yml; it defines nothing inactive.yml. The v0.318.1
exemption skips a pointer only when itsrefends in its own id, the shape of a task input, and
an assumption input'srefends in its solution. So when two diamonds' paths named one
assumption, each counted as a duplicate id. In the dogfood project, linking an L2 to its outcome
put seven of an L4's assumptions on the L2's path too, and validation failed on all seven, in a
block nobody writes by hand. - The prefix check warned of a misfiling for the same reason: an archived and an active
diamond naming one assumption read asa-030a-NNNdefined under two sections.
What changed
- Nothing inside a
closes_onblock counts as defining an id, for the duplicate count
(_inside_closes_on) and for the prefix check. Itsfiredentries, which carry a task id with
noref, are covered the same way. A pointer outsidecloses_onstill counts, as the v0.318.1
test requires.
Considered and not done
- Widening the v0.318.1 rule to any
refinto another file. It would also exempt a real entry
outsidecloses_onthat happens to carry aref, which that release's test keeps counted. - Writing the assumption's id at the end of its
ref. It changes whatrefmeans for every
reader of the block, to satisfy one check.
Not covered, and what that costs
- An id somebody hand-writes inside
closes_onis not counted either. The block is the
script's store; the keys it keeps from a hand edit (routes_on_recordand the others in
PRESERVED_KEYS) name tasks and do not define ids.
Tests
tests/python/test_validate_canvas.py: an assumption on two diamonds' closing paths, and a task
in both theirfiredlists, is not a duplicate while a real duplicate diamond id still is; an
assumption on an archived and an active closing path is not a misfiling while a prefix really
defined under two sections still warns. Both red on 0.325.2.