PR Triage
Maintainer triage. Three real outcomes: approve, supersede (salvage +
credit + close the old one), or close (wrong premise). Verdict first; wait
for an explicit go before forge writes (approve / supersede / close / merge /
push). Use gh or glab.
Kickoff
Batch ("we will be reviewing…") or a pasted Discord/>>>…<<< thread with a PR:
- Figure out repo + forge. Skim
AGENTS.md / CONTRIBUTING.md if present.
- Match this repo's worktree/branch naming by inspecting existing worktrees.
- Don't touch the primary checkout — use worktrees.
- Cluster the batch first (below), then verdict + salvage plan; wait for go
before forge writes.
Cluster the batch first (before per-PR verdicts)
More than one PR/issue in front of you? Group them by the fix they need
before you judge any single one. Multiple PRs on the same bug (or fragile
subsystem) are one consolidation, not N salvages.
- Map each PR/issue to the underlying fix and the files/subsystem it touches.
- Any two that fix the same bug class or the same subsystem → treat the
group as one super-PR: build the proper fix once, credit every
author (
Co-authored-by + @handle), and supersede the whole cluster.
- Default to consolidation. Only keep PRs separate when the fixes are genuinely
independent (different bug class, different area, no shared code).
- State the grouping up front, e.g.
#68665 + #63590 + #67603 → one super-PR,
then run the per-PR loop within each group to confirm premises.
Do not enumerate one verdict per PR when they share a fix — that's the lazy
shape. One cluster → one consolidated supersede.
Discord threads
A pasted thread is the intake. Don't make them restate a bare URL.
- Pull out symptom, platform, linked PR/issue, what staff already said.
- Open those PRs; look for siblings on the same fix.
- Run the per-PR loop. Check the PR actually matches the reported bug.
- Draft a user reply only if useful — still wait for go before GH actions.
- No PR? Search open ones; if they want a new fix, follow that repository's
worktree workflow.
Forge cheatsheet
| Action |
GitHub |
GitLab |
| View |
gh pr view <N> |
glab mr view <N> |
| Diff |
gh pr diff <N> |
glab mr diff <N> |
| Comment |
gh pr comment <N> |
glab mr note <N> |
| Review |
gh pr review <N> --approve | --request-changes |
glab mr approve / note |
| Close PR/MR |
gh pr close <N> |
glab mr close <N> |
| Close issue |
gh issue close <N> |
glab issue close <N> |
git fetch origin pull/<N>/head:refs/remotes/origin/pr-<N> # GitHub
# GitLab: glab mr checkout <N>
Per-PR loop
Run this within each cluster (see "Cluster the batch first"). If the group
consolidates, the salvage plan is shared and you supersede all of them into one
super-PR — don't emit a standalone salvage per member.
- Metadata + diff + existing reviews (
gh / glab).
- Unaddressed #1 / lead maintainer comments → do not approve.
- Check the premise on current default branch (usually
main).
- Cherry-pick/apply in a review worktree; run targeted tests this repo uses.
- Return a verdict:
**PR/MR:** [#N](https://…/pull/N)
**Verdict: approve | supersede | close-as-wrong-premise**
**Worktree:** `…` · `<branch>`
### Why
- …
### Checks
| Check | Result |
|---|---|
| Merges onto default branch | … |
| CI | … |
| Targeted tests | … |
### Next (after go)
- approve: …
- supersede: salvage plan (reuse X, drop Y, tests Z, credit @handle)
- close: wrong-premise comment outline
Pick the verdict (no soft exits)
| Situation |
Verdict |
| Idea + shape are fine |
approve |
| Idea is right, shape is wrong (wrong helper/layer, missing tests for the bug class, contaminated, stale/conflicting, duplicate of another PR, ignored lead feedback) |
supersede |
| Premise doesn't hold on current default branch |
close-as-wrong-premise |
Anti-patterns — do not do these:
keep open — ask the author to rewrite / reuse helper X / add coverage
when the shape is already wrong → that is supersede. You salvage it.
- Inventing a fourth outcome (
request-changes, needs-info, wait-and-see)
for external PRs that need reshaping.
- Emitting one verdict per PR when several fix the same bug/subsystem → that's
one consolidated super-PR that supersedes the cluster, credit all authors.
- Parking on someone else's confirmation when the PR's shape is already a
supersede (wrong helper, wrong layer, no bug-class tests). Note the open
question under Why if useful; still verdict supersede with the salvage
plan. Only block the verdict when you literally cannot tell whether the
reported bug is this codepath vs something else — and even then say what
evidence would flip it, don't default to "ask the author."
request-changes is not a triage verdict. It is only for trusted /
internal authors with a single tiny nit under Approve — never for
"please rebuild this correctly."
Trusted / internal authors
Infer from organization membership, team roles, prior maintainer behavior, or
the user explicitly identifying someone as a lead/internal contributor.
| Who |
Default |
| #1 lead |
Prefer approve/merge. Don't supersede automatically. Never approve over their open review comments. |
| Other internal |
Prefer approve. One tiny nit → ask them (request-changes). Needs a real rewrite → supersede (or they bounce it to you). |
| External |
Normal bar. Idea right / shape wrong → supersede with credit. Never "ask them to rebuild it." |
When to supersede
- Contaminated / wrong close keywords
- Stale conflicts, author not fixing
- Duplicates a helper / wrong layer / wrong issue
- Missing tests for the bug class while the idea is right
- Same bug across 2+ PRs → one shared fix
- Lead feedback ignored and the idea is still right
Not enough alone: taste nits, optional follow-ups, "could be prettier."
Supersede (only after go)
This is the default salvage ritual — not a rare escalation.
- One salvage worktree for the whole cluster — not one per PR.
- Keep the good idea; drop junk; reuse existing helpers (don't re-ask the
author to). Check what already landed on the default branch first — part of
the cluster may already be fixed, so build only the residual gaps.
- Credit every author in the cluster: cherry-pick or
Co-authored-by +
@handle for each in the body.
- Tests for the bug class; green.
- Open one new PR/MR:
Supersedes #N, #M, … for all members;
Closes/Fixes only for issues it really fixes.
- Close the cluster (below).
- Run
no-tropes on public comments.
Templates: reference.md.
Close the cluster
After supersede or a merge that kills siblings:
- Close every superseded/sibling PR/MR for that fix — comment
Superseded by #<new>., then close.
- Close related issues this work actually fixed (
Closes # on the new PR, or close by hand).
- Don't close issues for a different bug class.
- "Supersedes" does not auto-close other PRs — you close them.
- Audit asks → page recent supersedes/merges, close stragglers, report counts.
Approve (after go)
- Short approve (or merge if asked). Credit stays with the author.
- Internal + one tiny nit → request-changes / ask them to fix first.
- Anything bigger than a tiny nit → supersede, don't ball-bounce.
- After merge, close leftover duplicate PRs/issues.
Before you stop (every item)
Run this checklist at the end of each PR/item — don't wait to be reminded:
Hard rules
- Worktrees only for review work — not the primary checkout.
- No supersede / close / approve / merge without explicit go.
- No approve past unaddressed lead-maintainer comments.
- No orphaned superseded PRs or fixed issues after a sweep.
- No "ask the author to rewrite" when supersede criteria match — salvage it.
1---2name: pr-triage3description: Maintainer triage on OTHER people's PRs/MRs — verdict of approve, supersede, or close, salvage with credit, close the cluster. Use for a review batch, a pasted Discord thread with a PR, or salvage/supersede/close asks. Not for your own PR (that's pr-ready).4---56# PR Triage78Maintainer triage. Three real outcomes: **approve**, **supersede** (salvage +9credit + close the old one), or **close** (wrong premise). Verdict first; wait10for an explicit **go** before forge writes (approve / supersede / close / merge /11push). Use `gh` or `glab`.1213## Kickoff1415Batch ("we will be reviewing…") or a pasted Discord/`>>>…<<<` thread with a PR:16171. Figure out repo + forge. Skim `AGENTS.md` / `CONTRIBUTING.md` if present.182. Match this repo's worktree/branch naming by inspecting existing worktrees.193. Don't touch the primary checkout — use worktrees.204. **Cluster the batch first** (below), then verdict + salvage plan; wait for go21 before forge writes.2223## Cluster the batch first (before per-PR verdicts)2425More than one PR/issue in front of you? Group them by the **fix they need**26before you judge any single one. Multiple PRs on the same bug (or fragile27subsystem) are **one consolidation**, not N salvages.28291. Map each PR/issue to the underlying fix and the files/subsystem it touches.302. Any two that fix the **same bug class or the same subsystem** → treat the31 group as **one super-PR**: build the proper fix once, credit **every**32 author (`Co-authored-by` + `@handle`), and supersede the whole cluster.333. Default to consolidation. Only keep PRs separate when the fixes are genuinely34 independent (different bug class, different area, no shared code).354. State the grouping up front, e.g. `#68665 + #63590 + #67603 → one super-PR`,36 then run the per-PR loop **within** each group to confirm premises.3738Do **not** enumerate one verdict per PR when they share a fix — that's the lazy39shape. One cluster → one consolidated supersede.4041## Discord threads4243A pasted thread *is* the intake. Don't make them restate a bare URL.44451. Pull out symptom, platform, linked PR/issue, what staff already said.462. Open those PRs; look for siblings on the same fix.473. Run the per-PR loop. Check the PR actually matches the reported bug.484. Draft a user reply only if useful — still wait for go before GH actions.495. No PR? Search open ones; if they want a new fix, follow that repository's50 worktree workflow.5152## Forge cheatsheet5354| Action | GitHub | GitLab |55|--------|--------|--------|56| View | `gh pr view <N>` | `glab mr view <N>` |57| Diff | `gh pr diff <N>` | `glab mr diff <N>` |58| Comment | `gh pr comment <N>` | `glab mr note <N>` |59| Review | `gh pr review <N> --approve \| --request-changes` | `glab mr approve` / note |60| Close PR/MR | `gh pr close <N>` | `glab mr close <N>` |61| Close issue | `gh issue close <N>` | `glab issue close <N>` |6263```bash64git fetch origin pull/<N>/head:refs/remotes/origin/pr-<N> # GitHub65# GitLab: glab mr checkout <N>66```6768## Per-PR loop6970Run this **within each cluster** (see "Cluster the batch first"). If the group71consolidates, the salvage plan is shared and you supersede all of them into one72super-PR — don't emit a standalone salvage per member.73741. Metadata + diff + existing reviews (`gh` / `glab`).752. Unaddressed **#1 / lead maintainer** comments → do not approve.763. Check the premise on current default branch (usually `main`).774. Cherry-pick/apply in a review worktree; run targeted tests this repo uses.785. Return a verdict:7980```markdown81**PR/MR:** [#N](https://…/pull/N)8283**Verdict: approve | supersede | close-as-wrong-premise**8485**Worktree:** `…` · `<branch>`8687### Why88- …8990### Checks91| Check | Result |92|---|---|93| Merges onto default branch | … |94| CI | … |95| Targeted tests | … |9697### Next (after go)98- approve: …99- supersede: salvage plan (reuse X, drop Y, tests Z, credit @handle)100- close: wrong-premise comment outline101```102103## Pick the verdict (no soft exits)104105| Situation | Verdict |106|-----------|---------|107| Idea + shape are fine | **approve** |108| Idea is right, shape is wrong (wrong helper/layer, missing tests for the bug class, contaminated, stale/conflicting, duplicate of another PR, ignored lead feedback) | **supersede** |109| Premise doesn't hold on current default branch | **close-as-wrong-premise** |110111**Anti-patterns — do not do these:**112113- `keep open — ask the author to rewrite / reuse helper X / add coverage`114 when the shape is already wrong → that **is** supersede. You salvage it.115- Inventing a fourth outcome (`request-changes`, `needs-info`, `wait-and-see`)116 for external PRs that need reshaping.117- Emitting one verdict per PR when several fix the same bug/subsystem → that's118 **one** consolidated super-PR that supersedes the cluster, credit all authors.119- Parking on someone else's confirmation when the PR's *shape* is already a120 supersede (wrong helper, wrong layer, no bug-class tests). Note the open121 question under Why if useful; still verdict **supersede** with the salvage122 plan. Only block the verdict when you literally cannot tell whether the123 reported bug is this codepath vs something else — and even then say what124 evidence would flip it, don't default to "ask the author."125126`request-changes` is **not** a triage verdict. It is only for **trusted /127internal** authors with a **single tiny nit** under Approve — never for128"please rebuild this correctly."129130## Trusted / internal authors131132Infer from organization membership, team roles, prior maintainer behavior, or133the user explicitly identifying someone as a lead/internal contributor.134135| Who | Default |136|-----|---------|137| **#1 lead** | Prefer approve/merge. Don't supersede automatically. Never approve over their open review comments. |138| **Other internal** | Prefer approve. One tiny nit → ask them (request-changes). Needs a real rewrite → **supersede** (or they bounce it to you). |139| **External** | Normal bar. Idea right / shape wrong → **supersede** with credit. Never "ask them to rebuild it." |140141## When to supersede142143- Contaminated / wrong close keywords144- Stale conflicts, author not fixing145- Duplicates a helper / wrong layer / wrong issue146- Missing tests for the bug class while the idea is right147- Same bug across 2+ PRs → one shared fix148- Lead feedback ignored and the idea is still right149150Not enough alone: taste nits, optional follow-ups, "could be prettier."151152## Supersede (only after go)153154This is the default salvage ritual — not a rare escalation.1551561. **One** salvage worktree for the whole cluster — not one per PR.1572. Keep the good idea; drop junk; reuse existing helpers (don't re-ask the158 author to). Check what already landed on the default branch first — part of159 the cluster may already be fixed, so build only the residual gaps.1603. Credit **every** author in the cluster: cherry-pick or `Co-authored-by` +161 `@handle` for each in the body.1624. Tests for the bug class; green.1635. Open **one** new PR/MR: `Supersedes #N, #M, …` for all members;164 `Closes`/`Fixes` only for issues it really fixes.1656. Close the cluster (below).1667. Run `no-tropes` on public comments.167168Templates: [reference.md](reference.md).169170## Close the cluster171172After supersede or a merge that kills siblings:1731741. Close every superseded/sibling PR/MR for that fix — comment `Superseded by #<new>.`, then close.1752. Close related issues this work actually fixed (`Closes #` on the new PR, or close by hand).1763. Don't close issues for a different bug class.1774. "Supersedes" does not auto-close other PRs — you close them.1785. Audit asks → page recent supersedes/merges, close stragglers, report counts.179180## Approve (after go)181182- Short approve (or merge if asked). Credit stays with the author.183- Internal + **one tiny nit** → request-changes / ask them to fix first.184- Anything bigger than a tiny nit → supersede, don't ball-bounce.185- After merge, close leftover duplicate PRs/issues.186187## Before you stop (every item)188189Run this checklist at the end of each PR/item — don't wait to be reminded:190191- [ ] Batch clustered first: PRs sharing a fix/subsystem are grouped into ONE192 super-PR, not enumerated as separate salvages.193- [ ] Verdict is one of: approve / supersede / close-as-wrong-premise (no194 "keep open — ask author" for reshape work).195- [ ] If supersede: Next section has a concrete salvage plan (helpers, drops,196 tests, credit for every author) — ready for "go".197- [ ] Superseded/sibling PRs for this fix are closed with a pointer comment.198- [ ] Related issues this actually fixed are closed (or `Closes #` on the new PR).199- [ ] Any user-facing reply is short and actionable — an optional note, not an essay.200- [ ] Shipping work is split into topical commits (`pr-update`) and CI is green.201- [ ] You scoped the whole fix, not a timid subset.202203## Hard rules204205- Worktrees only for review work — not the primary checkout.206- No supersede / close / approve / merge without explicit go.207- No approve past unaddressed lead-maintainer comments.208- No orphaned superseded PRs or fixed issues after a sweep.209- No "ask the author to rewrite" when supersede criteria match — salvage it.