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.
WIRE + ENABLE regression_capture: the module has ZERO callers — built, merged, inert. My #440 spec called the hook 'secondary' and made the load-bearing part optional. Add the hook, default to auto, set registry enabled=true. Prove it FIRES.
goal
WIRE regression_capture INTO pair_loop, and turn it ON. The tool is built, tested and INERT: it has
ZERO callers.
MEASURED: `grep -rl regression_capture checkouts/current/congruency/tools/` returns ONLY
regression_capture.py itself. Callers: 0. The module passes its own selftest (186/187 — the 1 is a
known false positive from a shared __pycache__ dir, not this module) and does nothing, because
nothing calls it.
WHY IT SHIPPED INERT — MY SPEC'S FAULT, NOT THE PAIR'S: #440's body said "pair_loop.py CHANGE
(secondary, MINIMAL): a single hook after a fail verdict". Calling the load-bearing part "secondary"
made it optional. The pair built the module, skipped the hook, and the auditor passed it because it
met every stated criterion. Do not re-litigate #440 — its module is correct and merged. This ticket
adds the caller it was never firmly required to write. (Same shape as #458's tag with no Documents
row and #459's migration nobody applied. The pattern is: build the thing, never tether it.)
DELIVERABLE: checkouts/current/congruency/tools/pair_loop.py — MINIMAL. Add the hook. Nothing else.
1. THE HOOK. In the round loop, AFTER an auditor returns verdict=fail and its findings are
journaled, call regression_capture with the ticket, the fail-findings, and the worker blob that
produced them. If a finding carries a structured repro and capture is enabled, regression_capture
mints its red test and pair_loop stages it with the commit scope.
2. THE TOGGLE, honored exactly as regression_capture.py already documents it (read its docstring,
do not invent):
--regression-capture off (its current default) capture off; nothing read/executed/written
--regression-capture on forced on regardless of registry.json
--regression-capture auto read registry.json {"regression_capture": {"enabled": true|false}}
NOTE the module warns that `{"enabled": "false"}` (a STRING) once turned capture ON because
bool("false") is True — the section must be an object and `enabled` a real bool. Do not
reintroduce that.
3. TURN IT ON: add {"regression_capture": {"enabled": true}} to registry.json (a real JSON bool, not
a string), and make pair_loop's flag DEFAULT to `auto` so the registry governs it. Off must
remain reachable via --regression-capture off.
4. NEVER FATAL. A regression_capture failure MUST NOT fail the commit, the round, or the pair. Log
and continue — instrumentation that can break the pipeline is worse than none.
5. DO NOT TOUCH THE #279 GUARD (pair_loop.py ~line 978, "This is ticket #279's regression, guarded at
its source") or the assign-before-ACTIVE ordering or the mint hook. This ticket ADDS a call after
a fail verdict; it changes no governance and no ordering.
ACCEPTANCE — the point is that it FIRES, not that it exists:
* `grep -c regression_capture pair_loop.py` > 0 (it has a caller at last).
* pair_loop --selftest >= 180/180 (it is 180/180 on main; do not lose a check) AND a live dispatch
still reaches the governance path (a braked ticket prints "== HALT ==", exit 3).
* PROVE IT FIRES: in the selftest's THROWAWAY repo, drive a round to a fail verdict carrying a
structured repro and assert a red test is minted under tests/regression/ and staged. With
--regression-capture off, assert NOTHING is minted (off is byte-for-byte the old behaviour).
* registry.json holds {"regression_capture": {"enabled": true}} as a real bool.
RUN ON CLAUDE. This is the orchestrator — add one hook, 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)
✗ blunder — not authorized
✗ blunder — not authorized
artifacts (forge)
not yet recorded — lands with the ticket-class build