Every ticket as the root of its provenance graph — goal, patch, approval, runs and (as the ticket-class build lands) mandate, manifestations, guarantees, journey, artifacts and children. Rendered through the <<<TicketGraphList>>> tag.
pair_loop selftest 179/180: the '#457 GATE (a)' check pinned the resolver bug as PASSING ('resolver holds NO ref to ticket_artifacts'); #461 FIXED it, flipping the check to FAIL. Invert the assertion — same tripwire, correct polarity — back to 180/180.
goal
Update a STALE pair_loop selftest check that now FAILS because the bug it pinned was FIXED. This is
NOT a regression — it is a check that was written to fail once the fix landed, and the fix landed.
Restore the tripwire to green so it stops poisoning harvest checks.
WHAT HAPPENED (both tickets are CORRECT; do not revert either):
* #457 (the mint hook) added a pair_loop selftest check, "#457 GATE (a)", asserting that
resolver.py holds NO reference to `ticket_artifacts` — encoding, as a PASSING check, the fact that
the resolver could not see the mint table. Its own text: "FAIL here = resolver.py changed; re-read
THE DIRECTORY-SERVICE GATE in this docstring and close #457's gate."
* #461 (DONE, merged 775bf55) CLOSED that gap: resolver.py now reads ticket_artifacts and returns a
VM as a real match (verified: `resolver.py <noble sha>` -> "0 blob(s) + 1 artifact(s) -> 1
de-overlapped match(es)", resolver --acceptance 32/32).
* So the check flipped to FAIL. pair_loop --selftest is now 179/180 (stable across 3 runs, not
flaky). The check was designed to fail exactly at this moment.
WHY IT MATTERS: a red harness baseline poisons every harvest. The per-cycle protocol reverts on a red
cycle-start harness; a permanently-red 179/180 would either mask a real future regression or trigger
false reverts. The tripwire must be GREEN and mean something.
DELIVERABLE: checkouts/current/congruency/tools/pair_loop.py — MINIMAL. Change ONLY the "#457 GATE (a)"
selftest check.
1. INVERT the assertion to match reality: the gate is now that resolver.py DOES reference
ticket_artifacts (the mint table), i.e. the directory-service tether is CLOSED. Passing condition
becomes "resolver.py references ticket_artifacts" (was: "holds NO reference"). Update the check's
message so it documents the CLOSED state and cites #461, not the open gap.
2. DO NOT weaken or remove the check — it should still guard something real: that the resolver
remains wired to the mint table, so a future edit that silently unwires it FAILS. Same tripwire,
correct polarity.
3. TOUCH NOTHING ELSE in pair_loop.py. Not the #279 guard (line ~978, "guarded at its source"), not
the assign-before-ACTIVE ordering, not the mint hook, not commit_deliverable. One check, inverted.
4. Do NOT touch resolver.py — #461 is correct and merged.
ACCEPTANCE:
* `pair_loop.py --selftest` is back to 180/180 (the previously-failing "#457 GATE (a)" now PASSES
against the CURRENT resolver.py, which references ticket_artifacts).
* A live dispatch still reaches the governance path (braked ticket -> "== HALT ==", exit 3).
* The check still FAILS if resolver.py is hypothetically reverted to not reference ticket_artifacts
(prove the tripwire still has teeth — e.g. point it at a fixture without the reference).
* git diff touches ONLY the one check block; the #279 guard string is byte-identical.
RUN ON CLAUDE. This is the orchestrator — patch one check, do not reimagine it.
patch
none
approval
unapproved
runs
no runs recorded
mandate (clauses)
not yet recorded — lands with the ticket-class build
manifestations
not yet recorded — lands with the ticket-class build
guarantees
not yet recorded — lands with the ticket-class build
journey (blunders & successes)
not yet recorded — lands with the ticket-class build