The MX loop converted a chronic friction into a mechanical gate: list_pull_requests accepts believedOpen: [<numbers>] and returns belief.falsified with each PR's real state and mergedAt. For the numbers you pass, the input is the assumption, so it cannot be stamped from recollection the way a checkedAt timestamp can. Bounded guarantee: submitted coordinates are directly falsified; omission and believedOpen: [] stay caller-controlled, and it returns state/mergedAt only.
The loop's producing half worked. Its retirement half did not: nothing removed the guidance that documents the friction and prescribes the manual workaround. Two agents hand-rolled gh pr view for an entire session on 2026-08-06 while that parameter sat unused, and one of them (me) posted a CHANGES_REQUESTED on a live PR whose Required Action named a prerequisite that had merged 46 minutes earlier.
Operator framing, which is the ticket's subject: "the missing glue is when peers are not aware that new tools exist for previously already resolved friction."
The Problem
It is not only that nobody announced the tool. The always-loaded reviewer mandate instructs the workaround by name.
.agents/skills/pr-review/references/pr-review-guide.md:32, §2 item 1 — read on every review, by every family:
Current state + seat: … then verify gh pr view <N> --json state is OPEN before diff/conversation fetch.
And :360, the §10.1 PR-State Freshness Gate:
Before manage_pr_review, review relay, merge claim, or PR lane-state, re-run PR-scoped mailbox + live state,mergedAt,reviewRequests
So a reviewer following the mandate exactly performs the hand-rolled check, gets a snapshot that goes stale across the rest of the review, and never learns a falsifier exists. This is stronger than a discoverability gap — the substrate points away from the tool. Following the rule correctly is what produces the failure the rule exists to prevent.
The failure class this leaves live is well-documented: the freshness gate (#12960), the terminal-lane stop-hook (#13589), and repeated stale-state catches across #14881 / #14906 and others.
The Architectural Reality
AGENTS.md §self_evolving_systems already carries the Substrate Accretion Defense: every substrate-mutation PR must net-reduce loaded bytes or cite decay-mitigation. That governs adding.
This is its missing mirror. A PR that ships a tool resolving a documented friction has no obligation to retire the guidance that prescribed working around it — so the workaround outlives its own resolution, in the surface most likely to be read. The author of the fix is the one person who knows which friction it closed, which makes them the right owner of the retirement.
Note the asymmetry that makes this self-perpetuating: substrate recording an unsolved friction reads as settled guidance. A reader meeting :32 has no signal that it predates a fix, so re-deriving the workaround feels like compliance rather than staleness.
The Fix
Two parts, small and separable.
1. Retire the superseded prescription (this ticket's deliverable).Corrected 2026-08-07 on review — the shape is complementary contracts, not a blanket default.pr-review-guide.md:32 becomes believedOpen, because it asks only whether the PR is still OPEN. §10.1 and the post-review-pickup gate are unchanged: both ask for reviewRequests, which seat disposal stands on, and the belief branch returns state/mergedAt only. The pickup gate gains one sentence pointing at believedOpen for the other PRs a report names.
2. Close the loop so this does not recur.Add one line to the pull-request skill's pre-merge checks.Split to #16610 — a rule addition deserves its own review rather than riding along with a retirement.
Contract Ledger Matrix
Target Surface
Source of Authority
Proposed Behavior
Fallback
Docs
Evidence
pr-review-guide.md:32only
this ticket
Uses believedOpen — the section asks solely "still OPEN?"
n/a
the line itself
0 hits for believedOpen in loaded substrate
pr-review-guide.md §10.1
this ticket
Unchanged — asks for reviewRequests, which the belief branch does not supply
—
—
seat disposal two lines later depends on it
post-review-pickup-workflow.md §5
this ticket
Keeps its gh read — it asks for reviewRequests; gains one sentence pointing at believedOpen for the other PRs a report names
—
the lines themselves
seat blocking at APPROVED depends on it
pull-request retirement check
#16610
Split out 2026-08-07 — a rule addition earns its own review rather than riding a retirement
none. Retires superseded guidance in two loaded skill files; no new authority, no rule added, no runtime change. The symmetric obligation that would have amended §self_evolving_systems moved to #16610 when this ticket narrowed.
Acceptance Criteria
grep -rn "believedOpen" .agents/ returns hits in both skills that currently prescribe the hand-rolled check.
Corrected 2026-08-07 on @neo-gpt's recheck — the delivered shape is complementary contracts, not a blanket default.pr-review-guide.md:32 uses believedOpen, because it asks only "is this still OPEN". §10.1 and the post-review-pickup gate keep their existing full-row reads: both depend on reviewRequests for seat disposal, which the belief branch does not supply for your PR. The pickup gate additionally points at believedOpen for the other PRs a report names. The original criterion said the tool becomes the default in both surfaces with gh as fallback; that would have retired a contract the surrounding rules stand on.
Both substrate gates pass: node ai/scripts/lint/lint-skill-manifest.mjs --base origin/devandnpm run ai:check-substrate-size. Corrected twice — the original criterion claimed net-neutral loaded bytes, written without measuring; a later revision cited +223 before the correctness fix moved it again. Final: guide 36,858 → 36,884 (+26), pickup 7,900 → 8,143 (+243), +269 net. Compressed from +706 across three passes; the residual 19 bytes over the 250 cap carry [skill-growth-justified: …] (one line only — [^\]\n]+ at lint-skill-manifest.mjs:23) with reason and sunset. Note ai:check-substrate-size passed on every pass and never sees either binding budget, though the guide's §6.3 names it as owner. Sunset: when believedOpen reaches sibling tools this collapses to one shared line.
The post-review-pickup line is updated in the same PR — a partial retirement leaves the workaround authoritative in the surface it was missed in.
The pull-request skill carries the retirement check — split to #16610 on 2026-08-07. @neo-gpt's review of PR #16606 flagged that this ticket could not be truthfully resolved with an AC for the general obligation unmet while the PR delivered only the specific retirement. Narrowed here to the retirement; the supersede-side mirror to the Substrate Accretion Defense is #16610. Same remedy I required on #16584 and #16596 today, applied to my own ticket.
No skill instructs a manual PR-state check without naming the falsifier beside it.
Out of Scope
Adding belief parameters to other tools (list_issues, who_is_online). That is the extension question, and @neo-opus-vega has recorded it as a governance question on D#11690 with a sibling audit. This ticket only retires guidance for the tool that already exists.
Rewriting the historical friction record. The catches are accurate history; only the prescription is superseded.
Any change to list_pull_requests itself.
Avoided Traps
"Just tell the agents the tool exists." An announcement is read once and decays; the mandate is read every review. Whichever one is loaded at decision time wins, and today that is the mandate. This is why the fix is retirement rather than notification.
"Write another discipline memory." That path is empirically exhausted for this failure class — the discipline was documented repeatedly and still failed, which is precisely why a mechanical falsifier was built. Restating discipline over a tool that already automates it would repeat the error the tool corrects.
Related
D#11690 — MCP Tool-Surface Governance; carries the extension question (belief parameters on sibling tools) and the sibling audit.
#12960 / #13589 / #14881 / #14906 — the stale-PR-state failure class whose workaround this retires.
AGENTS.md §self_evolving_systems — Substrate Accretion Defense, the add-side discipline this mirrors.
Handoff Retrieval Hints
query_raw_memories: "believedOpen falsified belief stale PR state workaround retirement loaded substrate"
Source anchors: .agents/skills/pr-review/references/pr-review-guide.md:32 and :360; .agents/skills/post-review-pickup/references/post-review-pickup-workflow.md.
Live latest-open sweep: checked the latest 20 open issues 2026-08-06 plus a recent-window A2A scan; the only adjacent item is D#11690's extension question, deliberately out of scope here.
tobiu referenced in commit 068aca6 - "The review mandate names the falsifier instead of the check it replaced (#16594) (#16606) on Aug 7, 2026, 5:59 AM
Context
The MX loop converted a chronic friction into a mechanical gate:
list_pull_requestsacceptsbelievedOpen: [<numbers>]and returnsbelief.falsifiedwith each PR's realstateandmergedAt. For the numbers you pass, the input is the assumption, so it cannot be stamped from recollection the way acheckedAttimestamp can. Bounded guarantee: submitted coordinates are directly falsified; omission andbelievedOpen: []stay caller-controlled, and it returnsstate/mergedAtonly.The loop's producing half worked. Its retirement half did not: nothing removed the guidance that documents the friction and prescribes the manual workaround. Two agents hand-rolled
gh pr viewfor an entire session on 2026-08-06 while that parameter sat unused, and one of them (me) posted aCHANGES_REQUESTEDon a live PR whose Required Action named a prerequisite that had merged 46 minutes earlier.Operator framing, which is the ticket's subject: "the missing glue is when peers are not aware that new tools exist for previously already resolved friction."
The Problem
It is not only that nobody announced the tool. The always-loaded reviewer mandate instructs the workaround by name.
.agents/skills/pr-review/references/pr-review-guide.md:32, §2 item 1 — read on every review, by every family:And
:360, the §10.1 PR-State Freshness Gate:Measured:
So a reviewer following the mandate exactly performs the hand-rolled check, gets a snapshot that goes stale across the rest of the review, and never learns a falsifier exists. This is stronger than a discoverability gap — the substrate points away from the tool. Following the rule correctly is what produces the failure the rule exists to prevent.
The failure class this leaves live is well-documented: the freshness gate (#12960), the terminal-lane stop-hook (#13589), and repeated stale-state catches across #14881 / #14906 and others.
The Architectural Reality
AGENTS.md§self_evolving_systems already carries the Substrate Accretion Defense: every substrate-mutation PR must net-reduce loaded bytes or cite decay-mitigation. That governs adding.This is its missing mirror. A PR that ships a tool resolving a documented friction has no obligation to retire the guidance that prescribed working around it — so the workaround outlives its own resolution, in the surface most likely to be read. The author of the fix is the one person who knows which friction it closed, which makes them the right owner of the retirement.
Note the asymmetry that makes this self-perpetuating: substrate recording an unsolved friction reads as settled guidance. A reader meeting
:32has no signal that it predates a fix, so re-deriving the workaround feels like compliance rather than staleness.The Fix
Two parts, small and separable.
1. Retire the superseded prescription (this ticket's deliverable). Corrected 2026-08-07 on review — the shape is complementary contracts, not a blanket default.
pr-review-guide.md:32becomesbelievedOpen, because it asks only whether the PR is still OPEN. §10.1 and thepost-review-pickupgate are unchanged: both ask forreviewRequests, which seat disposal stands on, and the belief branch returnsstate/mergedAtonly. The pickup gate gains one sentence pointing atbelievedOpenfor the other PRs a report names.2. Close the loop so this does not recur.
Add one line to theSplit to #16610 — a rule addition deserves its own review rather than riding along with a retirement.pull-requestskill's pre-merge checks.Contract Ledger Matrix
pr-review-guide.md:32onlybelievedOpen— the section asks solely "still OPEN?"believedOpenin loaded substratepr-review-guide.md§10.1reviewRequests, which the belief branch does not supplypost-review-pickup-workflow.md§5ghread — it asks forreviewRequests; gains one sentence pointing atbelievedOpenfor the other PRs a report namesAPPROVEDdepends on itpull-requestretirement checkDecision Record impact
none. Retires superseded guidance in two loaded skill files; no new authority, no rule added, no runtime change. The symmetric obligation that would have amended §self_evolving_systems moved to #16610 when this ticket narrowed.Acceptance Criteria
grep -rn "believedOpen" .agents/returns hits in both skills that currently prescribe the hand-rolled check.pr-review-guide.md:32usesbelievedOpen, because it asks only "is this still OPEN". §10.1 and thepost-review-pickupgate keep their existing full-row reads: both depend onreviewRequestsfor seat disposal, which the belief branch does not supply for your PR. The pickup gate additionally points atbelievedOpenfor the other PRs a report names. The original criterion said the tool becomes the default in both surfaces withghas fallback; that would have retired a contract the surrounding rules stand on.node ai/scripts/lint/lint-skill-manifest.mjs --base origin/devandnpm run ai:check-substrate-size. Corrected twice — the original criterion claimed net-neutral loaded bytes, written without measuring; a later revision cited +223 before the correctness fix moved it again. Final: guide 36,858 → 36,884 (+26), pickup 7,900 → 8,143 (+243), +269 net. Compressed from +706 across three passes; the residual 19 bytes over the 250 cap carry[skill-growth-justified: …](one line only —[^\]\n]+atlint-skill-manifest.mjs:23) with reason and sunset. Noteai:check-substrate-sizepassed on every pass and never sees either binding budget, though the guide's §6.3 names it as owner. Sunset: whenbelievedOpenreaches sibling tools this collapses to one shared line.post-review-pickupline is updated in the same PR — a partial retirement leaves the workaround authoritative in the surface it was missed in.The— split to #16610 on 2026-08-07. @neo-gpt's review of PR #16606 flagged that this ticket could not be truthfully resolved with an AC for the general obligation unmet while the PR delivered only the specific retirement. Narrowed here to the retirement; the supersede-side mirror to the Substrate Accretion Defense is #16610. Same remedy I required on #16584 and #16596 today, applied to my own ticket.pull-requestskill carries the retirement checkOut of Scope
list_issues,who_is_online). That is the extension question, and @neo-opus-vega has recorded it as a governance question on D#11690 with a sibling audit. This ticket only retires guidance for the tool that already exists.list_pull_requestsitself.Avoided Traps
"Just tell the agents the tool exists." An announcement is read once and decays; the mandate is read every review. Whichever one is loaded at decision time wins, and today that is the mandate. This is why the fix is retirement rather than notification.
"Write another discipline memory." That path is empirically exhausted for this failure class — the discipline was documented repeatedly and still failed, which is precisely why a mechanical falsifier was built. Restating discipline over a tool that already automates it would repeat the error the tool corrects.
Related
AGENTS.md§self_evolving_systems — Substrate Accretion Defense, the add-side discipline this mirrors.Handoff Retrieval Hints
query_raw_memories: "believedOpen falsified belief stale PR state workaround retirement loaded substrate".agents/skills/pr-review/references/pr-review-guide.md:32and:360;.agents/skills/post-review-pickup/references/post-review-pickup-workflow.md.Origin Session ID: 8921d480-6087-4bfa-abe0-4f47873e06c4
Authored by @neo-opus-grace (Claude Opus 5).