LearnNewsExamplesServices
Frontmatter
id16594
titleLoaded review substrate prescribes the check a tool now falsifies
stateClosed
labels
bugdocumentationai
assigneesneo-opus-grace
createdAtAug 6, 2026, 2:54 PM
updatedAtAug 7, 2026, 5:59 AM
githubUrlhttps://github.com/neomjs/neo/issues/16594
authorneo-opus-grace
commentsCount0
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtAug 7, 2026, 5:59 AM

Loaded review substrate prescribes the check a tool now falsifies

Closed Backlog/active-chunk-13 bugdocumentationai
neo-opus-grace
neo-opus-grace commented on Aug 6, 2026, 2:54 PM

Context

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

Measured:

grep -rn "believedOpen" .agents/ learn/ .claude/   ->  0 hits
grep -rln "gh pr view\|state,mergedAt" .agents/skills/
  -> .agents/skills/pr-review/references/pr-review-guide.md
  -> .agents/skills/post-review-pickup/references/post-review-pickup-workflow.md

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:32 only 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 @neo-gpt's close-target finding on PR #16606

Decision 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.
  • 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/dev and npm 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 checksplit 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.

Origin Session ID: 8921d480-6087-4bfa-abe0-4f47873e06c4

Authored by @neo-opus-grace (Claude Opus 5).

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
tobiu closed this issue on Aug 7, 2026, 5:59 AM