UMS from #2913: Copilot re-request tell, suppressed findings, one-push restatements - #2966
Conversation
…h restatements Three learnings from driving #2913 through thirty-seven Copilot rounds. Copilot's per-push review is not guaranteed and its absence is silent, so confirm the check run on the new head and re-request when missing. A review reporting zero new comments can still carry findings under "Suppressed comments" in the get_reviews body, invisible to get_review_comments. And a finding that adds an arm, a veto, or a recheck to one restatement of a rule is open at every restatement, so grep and land them all in one push. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017trXKZFoCYC4kP7NKNnN6F
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
There was a problem hiding this comment.
🟡 Changes recommended
The new guidance overstates the review history and presents a limited timing observation as a universal guarantee.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Pull request overview
Records lessons from PR review orchestration and propagates them through the memory index.
Changes:
- Documents Copilot review timing and suppressed findings.
- Adds guidance for synchronizing rule restatements.
- Updates the memory catalog.
Reviewed at 2026-09-01 21:09 PDT.
File summaries
| File | Description |
|---|---|
memories/reviewing-prs.md |
Adds rule-propagation guidance. |
memories/MEMORY.md |
Updates the memory index. |
memories/github-mcp-tools.md |
Records Copilot review behaviors. |
Review details
- Files reviewed: 3/3 changed files
- Comments generated: 3
- Review effort level: Balanced
💡 Configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
…a heuristic Copilot round one on #2966. The restatement lesson now says to read each grep hit against the widened rule and change only the ones that carry the gap, cites address-every-comment's broadening-fix section, limits the example to rounds thirty-two through thirty-five, and records round thirty-six as a different gap. The Copilot timing entry labels the one-minute window a heuristic from the measured pushes, not a guarantee. The index row follows the corrected section. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017trXKZFoCYC4kP7NKNnN6F
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
There was a problem hiding this comment.
🟡 Changes recommended
The case history omits changed sites, and review selection needs reviewer and head filtering.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Review details
Suppressed comments (1)
Previously missed (1) — in code that hasn't changed since the last review.
memories/github-mcp-tools.md:365
- “Newest review” is not sufficient on a PR with multiple reviewers or reviews from older heads: it can select a human review or a stale Copilot round. The existing contract in
shared/workflow/review-verdict-pitfalls.md:303-315,328-329requires filteringget_reviewsby Copilot'suser.loginand checkingcommit_idagainst the current head. Include those filters here so this operational instruction cannot miss the suppressed block on the round being assessed.
- Files reviewed: 3/3 changed files
- Comments generated: 1
- Review effort level: Balanced
…in and head Copilot round two on #2966. The case history now names every file each cited commit changed, read from git show --stat, including this file in 3b32086 and chores in 988b545 and ab89045. The suppressed-findings entry now selects the Copilot review at the current head by user.login and commit_id rather than taking the newest entry, per review-verdict-pitfalls.md. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017trXKZFoCYC4kP7NKNnN6F
ARD for Copilot round two (on
|
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
There was a problem hiding this comment.
🟡 Changes recommended
The case record is incomplete and unreproducible in places, and the PR description contradicts the corrected round history.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Review details
Suppressed comments (1)
memories/reviewing-prs.md:140
- The PR description still says rounds 32 through 36 all propagated the exclusion veto and pre-write recheck, while these corrected lines identify round 36 as a separate live-claim gap. Update the description to limit that sequence to rounds 32-35 and mention round 36 separately.
Round thirty-six was a different gap (a live-claim check in
`check-history`, distinct from scope), so it is not an instance of this
lesson and a restatement sweep would not have caught it.
- Files reviewed: 3/3 changed files
- Comments generated: 2
- Review effort level: Balanced
…file list Copilot round three on #2966. The counterfactual is now a measured query against the 28c20e5 tree with its hit list, which reaches every file rounds thirty-three through thirty-five changed, and names the one wrapped restatement a single-line grep lands beside. The 28c20e5 file list adds scripts/validate-skills.py. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017trXKZFoCYC4kP7NKNnN6F
ARD for Copilot round three (on
|
There was a problem hiding this comment.
🟡 Changes recommended
Newly added PR references violate the repository requirement for clickable forge links.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Review details
Suppressed comments (3)
Previously missed (2) — in code that hasn't changed since the last review.
memories/MEMORY.md:16
- Link the
ai-config#2913reference in this documentation index, as required by the repository's PR/issue-link rule inAGENTS.md:393-398.
memories/github-mcp-tools.md:338 - Link this PR reference.
AGENTS.md:393-398requires clickable forge URLs for PR and issue mentions in documentation.
This issue also appears on line 360 of the same file.
memories/github-mcp-tools.md:362
- Link both PR references. Bare
#2913and#1029conflict with the documentation rule inAGENTS.md:393-398that PR and issue mentions use clickable forge URLs.
Rounds thirty-five and thirty-six on `#2913` each carried two such findings.
The same shape from the `gh` side is `fully-clean.cases.md`'s
collapsed-block case (`#1029`).
- Files reviewed: 3/3 changed files
- Comments generated: 1
- Review effort level: Balanced
Copilot round four on #2966: AGENTS.md's link rule wants every PR or issue mention in documentation as a clickable forge URL. Linked all five references the diff added, swept by grepping the added lines rather than fixing the one the inline finding quoted. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017trXKZFoCYC4kP7NKNnN6F
The reviewing-prs.md row this PR edits carried a pre-existing bare UCD-SERG/shigella#31; a grep of the added lines after f6a5366 found it, so link it under the same AGENTS.md rule rather than leave it for the next round. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017trXKZFoCYC4kP7NKNnN6F
ARD for Copilot round four (on
|
This comment has been minimized.
This comment has been minimized.
|
Follow-ups filed for the Posted by Claude Code (AI agent) --- not written by a human. Generated by Claude Code |
…eview time Copilot round ten and the automated review on 2f7d9f5. The re-request sentences in github-mcp-tools.md and pr-on-claim.md now state the observed sequence (minutes with no run, then a run within seconds of the request) and say it is not proof of cause. The topic pass covers every repository surface that lists or mutates PRs, root manuals and scripts included. The 28c20e5 review time is 03:23:12, per GET pulls/2913/reviews. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017trXKZFoCYC4kP7NKNnN6F
ARD for Copilot round ten and the automated review, both on
|
There was a problem hiding this comment.
🔵 Needs a closer look
The new procedures can omit corpus files and unread same-head Copilot reviews.
Review details
Suppressed comments (2)
Previously missed (2) — in code that hasn't changed since the last review.
memories/github-mcp-tools.md:387
- Filtering by reviewer and head does not identify a unique review: multiple Copilot rounds can target the same unchanged head after a rebuttal or duplicate request. If a monitoring gap spans a finding-bearing review and a later clean review, selecting an arbitrary or latest match can skip the earlier suppressed findings, contrary to
CLAUDE.md:579-583's requirement to process every unread round. Require processing every unhandled matching review in submission order.
memories/reviewing-prs.md:189 - The fallback search still omits restatements outside skills, fragments, and memories.
AGENTS.md:561-586is itself canonical, whilescripts/pr-sweep.py:40-44andscripts/pr-overlap.py:85-89also restate the scope rule; if those files use different vocabulary, neither grep is guaranteed to find them, recreating the one-site-per-round failure this section is meant to prevent. Make the topic-and-filename pass corpus-wide rather than limiting it to three file classes.
- Files reviewed: 4/4 changed files
- Comments generated: 0 new
- Review effort level: Balanced
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
There was a problem hiding this comment.
🟡 Changes recommended
The new guidance conflicts with existing restatements and incorrectly requests reviews for draft PR pushes.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Review details
- Files reviewed: 4/4 changed files
- Comments generated: 2
- Review effort level: Balanced
…statements Copilot round eleven on #2966. The per-push instruction now applies to PRs that are ready for review, since draft pushes defer review per hooks/no-unreviewed-pr.py. memories/gh-cli.md and skills/pr-on-claim carried the older "never call the endpoint on an auto-requesting repo" wording; both now use the check-run discriminator and point at the per-push measurement. github-mcp-tools.md stays at 1250 lines. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017trXKZFoCYC4kP7NKNnN6F
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
There was a problem hiding this comment.
🟡 Changes recommended
The check-run existence rule blocks required no-push re-reviews and includes an inaccurate cost rationale.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Review details
Suppressed comments (3)
Previously missed (3) — in code that hasn't changed since the last review.
memories/gh-cli.md:559
- This restatement has the same permanent-veto problem: a completed check continues to exist on an unchanged head. It therefore conflicts with
skills/ardi/SKILL.md:205-208, which requires re-requesting after a Rebut/Defer-only round with no push. Limit this instruction to an active run and defer completed rounds to the ARDI disposition.
memories/github-mcp-tools.md:367 Where one existsalso includes an old completed run, which remains attached when a Rebut/Defer-only round leaves the head unchanged. The blanket no-repost instruction then contradictsskills/ardi/SKILL.md:205-208and prevents the required confirming review. Scope the veto to queued/in-progress runs and explicitly preserve the no-push re-request path.
shared/workflow/pr-on-claim.md:111- Using
existsas the veto makes it permanent for an unchanged head: completed check runs remain attached to the commit. After a Rebut/Defer-only ARDI round, no push changes the SHA, yetskills/ardi/SKILL.md:205-208requires a fresh request. Distinguish an active run from the historical completed run so the confirming review is not blocked.
- Files reviewed: 6/6 changed files
- Comments generated: 1
- Review effort level: Balanced
…e-request A completed copilot-pull-request-reviewer run stays attached to an unchanged head, so "while a check run exists" made the no-re-POST rule a permanent veto and contradicted skills/ardi/SKILL.md's requirement to re-request after a Rebut/Defer-only round with no push. Scope the veto to a queued or in-progress run in every restatement (memories/gh-cli.md, memories/github-mcp-tools.md, shared/workflow/pr-on-claim.md, skills/pr-on-claim/SKILL.md) and name the no-push round as the second request case. Describe a duplicate request as one spent call, the accepted risk, rather than as cost-free, since memories/gh-cli.md records that probing spends per-user quota; the same wording lands in pr-on-claim.rationale.md, which carried the same "costs nothing" claim. Work every Copilot review matching login and head in submission order, not "the entry", since several can match one head. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017trXKZFoCYC4kP7NKNnN6F
2026-09-02 05:31 UTC |
|
Claude finished review — View run All checks pass; only the in-progress ReviewThis round covers What the commit doesIt fixes a real logical bug the prior round's own content introduced: the rule "don't re-POST a Copilot review request while a Verification performed
Mechanical checks
No new findingsThis round's diff is a correctness fix to memory content from the prior round, not new content with new risk. No fabricated links, commits, or citations. No CLAUDE.md violations. No prose ambiguity issues. VerdictReady for merge Structured Review Data (JSON){
"schema_version": "1.0",
"reviewer": "claude",
"commit_sha": "e479cd854307bd3193721ce0a7e57e33fecec167",
"verdict": "CLEAN",
"findings": []
}Confirmed via the authoritative instrument: exit 1, five in-progress bullets ( ReviewThis round covers What the commit doesIt fixes a real logical bug from the prior round's own content: "don't re-POST while a Verification performed
Mechanical checks
No new findingsThis round's diff is a correctness fix to the prior round's own memory content, not new content with new risk. No fabricated links, commits, or citations; no CLAUDE.md violations; no prose ambiguity. VerdictReady for merge My judgment on the diff's content is CLEAN, per this task's explicit Verdict-semantics instruction that a verdict must not be conditioned on this review's own in-flight sibling checks or on the fully-clean instrument's self-referential exit status. The instrument run above is reported for transparency, not as the basis for the verdict: none of its five bullets is a failed check or a content defect — they are Structured Review Data (JSON){
"schema_version": "1.0",
"reviewer": "claude",
"commit_sha": "e479cd854307bd3193721ce0a7e57e33fecec167",
"verdict": "CLEAN",
"findings": []
}Stopping Point: Not a clean stopping point / work remains queued: this PR's ReviewThis round covers What the commit doesIt fixes a real logical bug in the prior round's own content: "don't re-POST while a Verification performed
Mechanical checks
FindingsNone. No fabricated links, commits, or citations. No CLAUDE.md violations. No prose ambiguity. VerdictReady for merge This is a content-only judgment on the diff, per this task's Verdict-semantics instruction: a verdict must not be conditioned on this same review run's own in-flight status or on Structured Review Data (JSON){
"schema_version": "1.0",
"reviewer": "claude",
"commit_sha": "e479cd854307bd3193721ce0a7e57e33fecec167",
"verdict": "CLEAN",
"findings": []
}Stopping Point: Not a clean stopping point / work remains queued: Reviewed commit: e479cd8 |
…closes #805) gha#710 widened the posted text to the span from the first verdict-bearing block to the last. A reviewer that redrafts its final message, each draft a complete review with its own verdict heading, then gets every draft concatenated (three reviews, three verdicts, two Stopping-Point lines on Morrison-Lab/ai-config#2966). A complete draft carries a verdict HEADING; the gha#710 follow-up tail only writes a verdict line or the word in prose. So when more than one block carries a heading, the span starts at the last such block and still runs to the last verdict-bearing block. One heading is unchanged. verdict-redrafted-thrice.json pins it (must-contain the third draft, must-not-contain the first); assert_pass holds every posted review to at most one verdict heading. Reverting to the span rule turns the fixture red. Stacked on #807 (fix/804-quota-notice-reason). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…closes #805) gha#710 widened the posted text to the span from the first verdict-bearing block to the last. A reviewer that redrafts its final message, each draft a complete review with its own verdict heading, then gets every draft concatenated (three reviews, three verdicts, two Stopping-Point lines on Morrison-Lab/ai-config#2966). A complete draft carries a verdict HEADING; the gha#710 follow-up tail only writes a verdict line or the word in prose. So when more than one block carries a heading, the span starts at the last such block and still runs to the last verdict-bearing block. One heading is unchanged. verdict-redrafted-thrice.json pins it (must-contain the third draft, must-not-contain the first); assert_pass holds every posted review to at most one verdict heading. Reverting to the span rule turns the fixture red. Stacked on #807 (fix/804-quota-notice-reason). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…closes #805) (#808) * fix(claude-code-review): post only the reviewer's last complete draft (closes #805) gha#710 widened the posted text to the span from the first verdict-bearing block to the last. A reviewer that redrafts its final message, each draft a complete review with its own verdict heading, then gets every draft concatenated (three reviews, three verdicts, two Stopping-Point lines on Morrison-Lab/ai-config#2966). A complete draft carries a verdict HEADING; the gha#710 follow-up tail only writes a verdict line or the word in prose. So when more than one block carries a heading, the span starts at the last such block and still runs to the last verdict-bearing block. One heading is unchanged. verdict-redrafted-thrice.json pins it (must-contain the third draft, must-not-contain the first); assert_pass holds every posted review to at most one verdict heading. Reverting to the span rule turns the fixture red. Stacked on #807 (fix/804-quota-notice-reason). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * fix(claude-code-review): count only authored verdict headings (review round 1) A heading inside a fenced code block or a blockquote is quoted, not authored. With the bare regex a later block that merely showed the heading shape, or blockquoted the previous verdict, read as a fresh draft, and the span then started there and dropped the entire real review -- the failure gha#710 exists to prevent. Both the jq detector and the bash invariant now skip fenced and blockquoted lines (no awk interval expression, per the mawk rule). - verdict-then-quoted-heading.json pins that a quoted heading is not a draft. - verdict-redrafted-thrice.json gains a tail block after the last draft and a second must-contain needle, so tail retention is pinned. - Prose names the tail shape the regex actually matches (a line-start verdict line), not a mid-sentence mention. Three mutations turn a named case red: disabling the multi-heading branch, narrowing the span end to the last heading block, dropping the exclusion. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * fix(claude-code-review): close a fence only on its own delimiter (review round 2) A fence closes on a run of the same character at least as long as the opener (CommonMark, as strip-non-invoking-markup.sh implements); the first draft closed on any fence line, so a backtick fence holding a tilde line leaked the heading after it. Both the jq detector and the awk invariant now track the opener. An unclosed fence runs to the end of its block, which is how GitHub renders it too, so that case is documented rather than special-cased. verdict-then-mismatched-fence.json pins it; closing on any delimiter turns it red. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * fix(claude-code-review): a fence closer carries only whitespace after its run (review round 3) CommonMark: a closing fence line may hold nothing but whitespace after the delimiter run; a run followed by text is fence content. Both the jq detector and the awk invariant now require that, matching strip-non-invoking-markup.sh. verdict-then-trailing-text-closer.json pins it; dropping the check turns it red. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * fix(claude-code-review): a heading is indented at most three spaces (review round 3) CommonMark's third literal construct, the indented code block, needs no state: a heading may be indented by at most three spaces, so a line at four columns or a tab is never a heading, whether it is code or a lazy paragraph continuation. Both the jq detector and the awk invariant now say so. verdict-then-indented-heading.json pins it; widening the indent back to any whitespace turns it red. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * fix(claude-code-review): spaces only in fence indentation; awk word boundary (review round 4) A tab is four columns in CommonMark, so a tab-led backtick line is indented code rather than a fence; the jq capture and the awk now allow spaces only in the three-column indentation, and the awk spells the jq's word boundary as a trailing class so a "Verdicts" heading counts in neither (Copilot on gha#808). verdict-redraft-after-tab-fence.json pins the first; a plural heading in verdict-then-quoted-heading.json pins the second. Both mutations turn a named case red. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * fix(claude-code-review): one to six hashes and a space make a heading (review round 5) CommonMark: an ATX heading has one to six hashes followed by a space or tab; seven hashes, or hashes run into the word, are paragraph text. The jq test and the awk invariant now both say so, the awk by run length rather than an interval expression. verdict-then-quoted-heading.json gains both non-heading shapes; lifting the limit in either place turns it red. Prose corrected: verdict-then-tab-inside-fence.json pins both halves, the extractor's silent drop of the real review and the awk's double count, not the awk alone. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * docs(claude-code-review): list the ninth confirmed mutation (review round 6) The awk's trailing word-boundary class has its own confirmed red mutation on verdict-then-quoted-heading.json and was missing from the enumeration. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
What
Three learnings from driving #2913 through thirty-seven Copilot rounds, recorded per
CLAUDE.md's "Wrap up a merged PR with UMS" andrun-ums-proactively.md.memories/github-mcp-tools.md(two bullets in the Copilot section):git log, per-SHAcommits/<sha>/check-runs, the PR timeline'sreview_requestedevents, andget_reviews. Every Copilot run on the four measured heads followed a request by twelve to sixteen seconds; none started on its own in the time it was given, and the two heads that waited went seven and two minutes without one. The tell isget_check_runs; one minute is the operational heuristic, not a guarantee. The Do bullet applies to ready-for-review heads, keepspr-on-claim.md's no-re-POST rule while a run exists, and requests only when none appeared, recording that sequence as observed rather than as proven cause.Comments generated: 0 newcan still carry findings underSuppressed commentsin theget_reviewsbody, invisible toget_review_comments; asuccesscheck run plus zero open threads is not a clean round. Page through every review page, then select the entry byuser.loginandcommit_idat the current head. Cross-linksfully-clean.cases.md's collapsed-block case, which is the same shape from theghside.memories/reviewing-prs.md(new section, "Inspect every restatement of a rule in one pass"): when a finding adds an arm, a veto, or a recheck to one restatement of a rule, find every restatement by three routes (phrase grep, mechanism-term grep, and a topic-and-filename pass over every repository surface that lists PRs or mutates PR state), read each candidate against the widened rule, and change only the ones that carry the gap. #2913 spent rounds thirty-two through thirty-five landing one exclusion veto and one pre-write recheck site by site (files per commit fromgit show --stat); round thirty-six was a separate live-claim gap incheck-history, recorded as such rather than as an instance. The section carries the measured grep against the28c20e5tree and its hit list. A "before each write" sentence has two populations to derive from the file rather than recall: the procedure's mutating commands and the predicate's mutable inputs. Pattern and anti-pattern stated as a pair.shared/workflow/pr-on-claim.md,memories/gh-cli.md,skills/pr-on-claim/SKILL.md: the three restatements of "do not re-request Copilot on an auto-requesting repo" are scoped to "while a check run exists on the head", with the no-run case on a ready-for-review head pointed at the measurement above, so the corpus gives one instruction rather than two.memories/MEMORY.md: thereviewing-prs.mdrow names the new section.Verification
markdownlint-cli2@0.23.0,test_check_memory_file_size.py(the CI test, since the standalone checker is advisory;github-mcp-tools.mdis at exactly 1250 lines),validate-skills.py,check-links.py,new-line-breaks(run after each commit), andcheck-ascii-punctuation.py --diff --base origin/mainall pass on the pushed head. Follow-ups: #2969 (split the memory file) and #2970 (advisory checker versus blocking test).Merge order
Disjoint from every other open PR of mine: none of the six files is edited by another open PR.
🤖 Generated with Claude Code
https://claude.ai/code/session_017trXKZFoCYC4kP7NKNnN6F