Pg patch review
Skill matejformanek/postgres-claude/.claude/skills/pg-patch-review
Run a multi-agent comprehensive review of a PostgreSQL patch (CommitFest entry, GitHub PR, or local .patch file) — orchestrates the mechanical pre-amble (fetch + apply + build + regress / iso / TAP) and then fans out 5 critic sub-agents IN PARALLEL (architecture / invariants critic cross-checking knowledge/subsystems/*.md INV-* tags, breaking-change critic for on-disk / WAL / catalog / extension-ABI, test-coverage critic, style / commit-message critic, reviewer-reflex critic against knowledge/calibration/gap-catalog.md), then synthesizes one PG-house-style review email. Stage 3 verdict supports REJECT-A/B/C grades for design-level rejections. Use when the user says "/pg-review <CF# | PR# | patchfile>", "deep-review this patch", "comprehensive review of CF NNNN", "mailing-grade review of this patch", or "run the 5-critic fan-out on <patch>". Skip for non-PG patch review, self-review-before-mail (use patch-submission), the lightweight 7-phase walk (use review-checklist), generic GitHub PR review (use review-changes), and security audits (use security-review).From its SKILL.md
npx -y skills add matejformanek/postgres-claude --skill pg-patch-reviewAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
29.2 KB, ~7.3k tokens by cl100k_base, as published. Nobody here has run it
pg-patch-review — multi-agent comprehensive PG patch review
The deep-review counterpart to the manual seven-phase review-checklist.
The cf6402 validation run on 2026-06-02 proved the corpus + skills compose
for a one-author review; this skill turns that loop into a repeatable
multi-agent pipeline.
When to use this skill vs review-checklist
| Situation | Use |
|---|---|
| CF entry you intend to mail a real review on | this skill |
| Quick "is this even sane?" pass on a patch | review-checklist (manual seven-phase) |
| Self-review of your own patch before mailing | patch-submission (which already invokes review-checklist) |
| Generic non-PG GitHub PR review | neither — this is PG-specific |
The two are NOT redundant: review-checklist is the seven-phase scaffold
each critic agent applies inside its assigned slice. This skill is the
orchestration layer above that scaffold (project discovery + parallel
critic fan-out + synthesis).
Companion skills (each critic loads what it needs)
review-checklist— seven-phase scaffold each critic walks inside its slicewal-and-xlog— WAL records / redo / hint bits (used by breaking-change critic)locking— lock primitive choice + acquisition order (architecture critic)catalog-conventions—pg_proc/ OID assignment (breaking-change critic)testing— regress vs isolation vs TAP vs module (test-coverage critic)coding-style— pgindent / include order / C99 subset (style critic)commit-message-style— upstream PG commit-message style (style critic, AND used by synthesizer for review-email tone)memory-contexts— palloc placement / context lifetimes (architecture critic when relevant)error-handling—ereport/ SQLSTATE choices (style critic when relevant)
Inputs
- A patch reference (required), one of:
- CF number:
6402,#6402, orCF 6402 - GitHub PR number on
postgres/postgres:pr 19234or#19234 - A local
.patchfile or directory of patches:/tmp/v3-0001-foo.patch
- CF number:
- Optional flags (from the slash command):
--skip-build— patch already applied + built in dev/, skip Phase 0--no-flaky-isolation— skip the isolation suite (macOS sometimes flakes)--subsystem=<name>— hint for whichknowledge/subsystems/*.mdto load first (e.g.--subsystem=access-nbtreefor CF #6402)
Output
- A draft review email at
sessions/<date>-cf<N>-review.md(orsessions/<date>-pr<N>-review.md) using the PG-hackers house style. - A per-critic appendix at the bottom of the same file with the raw findings each sub-agent produced (blocking / warning / suggestion).
- A run log appended to that session file: which patches applied, which tests ran, which subsystem docs the critics consulted, wall time.
- A
dev/branch namedcf<N>-review(orpr<N>-review) with the patch applied — disposable after the review is sent.
When NOT to invoke
- Patch already merged upstream — use
git log+ corpus walkthrough instead. - Patch is your own work — use
patch-submission(it invokes the same critics but on the self-review path). - Patch is non-PG — wrong skill.
Method — five stages
Stage 0 — mechanical pre-amble (5-10 min)
Done by the /pg-review slash command. If invoked directly (without
/pg-review), this skill does it inline before stage 1. See
.claude/commands/pg-review.md for the exact recipe.
Inline Stage 0 (when /pg-review wasn't used) — minimum commands:
cd dev && git checkout master && git pullgit checkout -b cf<N>-review(orpr<N>-review)- Fetch the patch (CF:
curlthe v<N> from the CF entry; PR:gh pr checkout <N>; .patch file: copy in). git am /path/to/v*.patch(apply all v<N> hunks in order).ninja -C build-debug install— must be warning-clean.meson test --no-rebuild regress/regress— record pass/fail.meson test --no-rebuild --suite isolation— record pass/fail.git diff --name-only HEAD~<N>..HEAD— capture the touched-files list.- Note any pre-existing flakes (e.g. macOS
recovery/040_standby_failover_slots_sync).
The output of this stage is:
dev/on branchcf<N>-review(orpr<N>-review) with the patch applied.- A built binary (
ninja installclean, no new warnings). meson test --no-rebuild regress/regressresult (pass/fail per test).meson test --no-rebuild --suite isolationresult.- A list of files the patch touches (
git diff --name-only HEAD~N..HEAD). - A note on any pre-existing flakes (e.g. macOS
recovery/040_standby_failover_slots_sync).
If stage 0 fails (patch doesn't apply, build breaks, regress fails) —
stop. Report to the user. The patch is Waiting on Author
mechanically; no point spending tokens on the critics.
Stage 1 — project discovery (orchestrator, ~5 min)
The main agent does this once before fanning out:
-
Touched files → touched subsystems. From the file list in stage 0, map each file to its
knowledge/subsystems/<name>.mdparent. Example:src/backend/access/nbtree/nbtpage.c→knowledge/subsystems/access-nbtree.md. Use the §2 "File map" section of each subsystem doc to confirm. If a touched file doesn't appear in any subsystem doc, NOTE THAT — the review must call out that an uncovered area was changed. -
Load per-file docs. For each touched file, look up
knowledge/files/<path>.mdif present. These have INV-* invariants and per-function cites the critics will rely on. -
Identify the "claims" the patch makes. Read the patch's commit message + cover letter (or the CF/PR description). Each claim that says "fixes X", "implements Y", "no behavior change", "doesn't touch on-disk format", "is purely a refactor" becomes a CHECK item the critics will validate.
-
Build the dispatch block. Produce a small reference block that every critic sub-agent receives in its prompt:
Patch: <CF#|PR#|path> Branch: dev/cf<N>-review @ <short-sha> Files touched: - src/.../X.c (per-file doc: knowledge/files/.../X.c.md) - src/.../Y.h (no per-file doc — flag if material) Subsystems touched: - access-nbtree (knowledge/subsystems/access-nbtree.md) - storage-buffer (knowledge/subsystems/storage-buffer.md) Claims the patch makes (verbatim from commit msg): - "Replace duplicated metapage sanity checks..." - "No behavior change." - "Restores symmetry with _bt_getroot..." Stage-0 test result: regress 245/245 pass, iso 129/129 pass, 1 unrelated TAP failure recovery/040_* (macOS flake) -
Spot-check 3-5 file:line cites in the relevant subsystem doc against current
source/— if drift > 10% (cites stale by more than ~20 lines or naming since-removed symbols), STOP and tell the user the corpus needs anhf(corpus):refresh before this review.
Stage 2 — fan out 5 critic sub-agents IN PARALLEL
Launch all five (A-E; Critic E added 2026-06-12 from Phase C) in a single message with parallel tool calls. Each gets the dispatch block from stage 1 + its assigned slice. Each is read-only — sub-agents do NOT edit files or commit. Each returns a structured finding list.
Use the Agent tool with subagent_type: "general-purpose" for each.
Estimate ~10-20 min wall time for all five to complete (in parallel).
Critic A — Architecture & invariants
Scope: does the patch fit the subsystem's existing invariants?
Loads: knowledge/subsystems/<each touched subsystem>.md + relevant
per-file docs + review-checklist Phase 6 (Architecture).
Checks:
- Does the patch violate any INV-* invariant tagged in the subsystem doc? Cite the tag.
- Does the patch's locking match the subsystem's lock-order discipline? (E.g. for nbtree: buffer locks coupled in left-to-right order; for heap: buffer-pin-before-buffer-lock; for replication: never hold ProcArrayLock across...)
- Does the patch interact with parallel query / extensions / logical replication in any way the corpus warns about?
- Does the patch's claim of "no behavior change" hold up under inspection? (For refactors: every removed line must have an equivalent in the replacement.)
- Provenance check for any helper/struct the patch touches: run
git -C source log -S '<symbol>' --oneline | head -5to find when the symbol was introduced. A symbol that's existed for years + has multiple existing callers is a safer refactor target than a symbol introduced last release. Surfaces both "this is a long- overdue cleanup" and "this is racing an in-flight feature".
Output: structured findings list. Each item:
File: <path:line>
Severity: blocking | warning | suggestion
Invariant: INV-... (if applicable) or "no INV cited"
Description: what and why
Suggestion: proposed fix or question to the author
Critic B — Breaking-change scan
Scope: does the patch touch anything backwards-incompatible?
Loads: wal-and-xlog, catalog-conventions, review-checklist
Phase 6 (Architecture — the ABI bullets), and the subsystem docs'
§5 "Invariants and breaking-change surfaces" sections.
Checks:
- On-disk page format change? (
pd_*fields, opaque-area layout.) - WAL record change? (New record, new info byte, existing record
extended.) If yes, is
XLOG_PAGE_MAGICbumped? - Catalog change? (
pg_proc.dat,pg_type.dat, etc.) If yes, isCATALOG_VERSION_NObumped? Are new OIDs assigned? - Public API / extension ABI? (Anything in
src/include/.) Inline functions / macros there count. If touching back-branchable code: new struct members must go at the end; no signature changes on exported functions. - Replication protocol change? (
libpqwire format, walsender output plugins, logical decoding output formats.) - pg_dump impact? (Any new schema object.)
Output: same structured list. For each blocking break, name the upgrade/backpatch story the author needs to provide.
Critic C — Test coverage
Scope: is the patch tested adequately for what it claims?
Loads: testing skill + the touched subsystems' "test surface"
sections + src/test/ for the existing coverage of the touched code.
Checks:
- Does the diff include
src/test/changes? If not, is the claim "pure refactor, no new behavior, existing tests cover" defensible? - For a refactor: does at least one existing test exercise the code
path being refactored? (Find by
git grepfor the function name insrc/test/.) If not, the "existing tests cover" claim is weak. - For new behavior: does the new test ACTUALLY fail without the code change? (The classic "test passes both with and without the patch" bug.) Sub-agent can't easily verify this without re-running tests twice — instead it flags this as a question for the author or for manual follow-up.
- Corner cases: NULL, empty input, max-length, encoding edges, concurrent calls, parallel-worker visibility, replication catchup. Sub-agent enumerates which apply to this patch's surface.
- Isolation tests needed? Concurrent-modification scenarios?
- TAP tests needed? Multi-node, recovery, replication, crash-recovery scenarios?
Output: same structured list. The "blocking" bar here is whether the patch's correctness claim is mechanically testable from what's in the diff.
Critic D — Style & commit-message
Scope: would a committer have to fix the format before applying?
Loads: commit-message-style + coding-style + review-checklist
Phase 5 (Coding review) + Phase 7 (Committer-readiness).
Checks:
- Patch filename:
vN-NNNN-<title>.patch? - Commit message: imperative title, no period, ~76-col wrap, no emoji,
no
Co-Authored-By(forbidden upstream), Author/Reviewed-by trailers if relevant, Discussion: link if relevant. - Code style: matches surrounding module (camelCase vs snake_case),
no leftover debug
elog, no commented-out code, no new compiler warnings flagged in stage 0. - Error messages follow the message style guide (capitalization,
no period on
errmsg, separatederrdetail/errhint). git diff --checkclean? (Trailing whitespace, broken tab/space mix.)pgindentclean? (May not be runnable locally — notepg_bsd_indentinstall state; CI will catch.)
Output: same structured list. Most items here are suggestion or
warning; only fundamentally broken style is blocking.
Critic E — Reviewer-reflex probes (added 2026-06-12 from Phase C)
Scope: does the patch trigger any of the persona-driven reflexes the corpus has documented but the generic critics A-D don't encode?
Loads: knowledge/calibration/gap-catalog.md (the 11-item
catalog) + knowledge/personas/<name>.md for each persona named in
items 4-11 that triggers + knowledge/personas/committer-map.md +
knowledge/personas/domain-ownership.md (item 11 cross-reference).
Checks (each maps 1:1 to a catalog item):
-
Cleanup-on-early-return tracing (catalog #4). Scan the diff for a new
returnstatement added inside a function whose entry block owns a resource handle (z_stream,BufFile,FileFd,MemoryContext,Relation,LWLock). If found, surface "trace cleanup path under the new error return — does<resource>_destroy()/_close()/_release()run on this branch?". Driver:daniel-gustafsson.mderrorhandling discipline. -
Multibyte/encoding interaction (catalog #5). Scan the diff for byte-walking patterns (
*p++,*input++, manualforloops overvarlena/text/cstring) OR size caps on text-processing primitives. If found, surface "enumerate worst-case per encoding (UTF-8 documented, GB18030, EUC_JP, EUC_KR, EUC_CN, EUC_TW); cite the Unicode TR / SpecialCasing.txt entry for any UTF-8-specific bound". Driver:noah-misch.md§4 +jeff-davis.mdUnicode standard fidelity. -
Subsystem-local cap discoverability (catalog #6). Scan the diff for a new
#definein acontrib/*/*.cfile (not header). If found, surface "move to<subsystem>.hif a public-style cap; cite the precedent constant in the same area (e.g.LQUERY_MAX_LEVELSforltree_io.c)". Driver:peter-eisentraut.mdstyle reflex. -
"Third state" cross-check for binary-format changes (catalog #7). Scan the diff for changes in how a flag-bit, version-bit, or layout-bit is interpreted. If found, surface "enumerate the third state: bit set but structure invalid, OR bit unset but structure looks valid — what handles each?". Driver:
heikki-linnakangas.mdbinary-format reflex. -
injection_pointsreproducer for DoS / scratch-allocation / race claims (catalog #8). Scan the commit-message + COVER for phrases like "prevents N MB scratch", "N GB allocation", "fixes a race", "OOB read", "amplification". If found AND the patch has nosrc/test/modules/injection_points/change, surface "include aninjection_pointsmeasurement at the allocation / race-windowed boundary; the structural argument is not enough on a security claim". Driver:noah-misch.md§5. -
Hot-path branch-prediction / micro-benchmark (catalog #9). When the patch touches a function in
src/backend/utils/adt/*,src/backend/access/{heap,nbtree}/,src/backend/optimizer/, or similar query-evaluator path AND adds a new guard check, surface "include micro-benchmark numbers confirming the guard is in the unlikely branch and adds <1% overhead on typical inputs". Driver:thomas-munro.md+heikki-linnakangas.mdperformance reflex on hot paths. -
Symmetric-check refactor for N-entry-point guards (catalog #10). Diff scan for 3+ near-identical added blocks (heuristic: same
if/ereport/ereturnpattern at 3+ places). If found, surface "consider a shared inline helper<module>_check_<thing>()to keep entry points symmetric". Driver:peter-eisentraut.mdsymmetric-primitives reflex. -
Persona-aware backpatch routing (catalog #11). When COVER claims back-patching AND the predicted top committer for the touched subsystem (from
domain-ownership.mdtop-committer column) has a 24mo backpatch rate < 5% (compute fromcommitter-map.mdor/usr/bin/git log --author=<name> --since= '2yr' --pretty=%s | grep -ciE 'back.?patch'ratio), surface "X doesn't backpatch in 24mo; the realistic v16/v17/v18 landing committer is Y (fromdomain-ownership.mdreviewer column — pick the highest-ranked committer who backpatches at ≥10%). CC them on the thread.". Driver: Peter Eisentraut row incommitter-map.md.
Severity rules for Critic E:
- Catalog #1-#3 are NOT this critic's job — they live in
review-checklistPhase 0 (gates that block before the patch enters the critic fan-out). - Catalog #4, #5, #7, #8 are
warning(sometimesblockingif the COVER doesn't even acknowledge the question). - Catalog #6, #9, #10, #11 are
suggestionby default — they improve the patch but don't block. - Catalog #5 escalates to
blockingif the patch caps a text primitive AND no per-encoding analysis is in the COVER — that's a real correctness gap (e.g. SP2 had this; the 3× UTF-8 bound may not hold for GB18030).
REJECT-track escalation (M4). When Critic E surfaces 3+
blocking-severity findings from the catalog AND the
context-awareness signal (engagement class contested OR a
documented INV-* invariant is foreclosed), the critic's output
should explicitly recommend a REJECT-A Stage-3 verdict rather than
"Waiting on Author". The Stage-3 orchestrator then decides between
REJECT-A (the grade above), REJECT-B (acknowledge that the critic
may have missed a concern), or downgrade to non-REJECT if the
findings don't actually compose to a design-level NACK. Critic E
recommends; Stage 3 decides.
Critic E severity matrix at a glance:
| Catalog # | Probe | Default | Escalates to blocking when |
|---|---|---|---|
| #4 | Cleanup-on-early-return | warning | COVER doesn't acknowledge the cleanup question |
| #5 | Multibyte / encoding | warning | text-primitive cap added with no per-encoding analysis in COVER |
| #6 | Subsystem-local cap discoverability | suggestion | — |
| #7 | "Third state" binary-format | warning | COVER doesn't enumerate bit-set-but-invalid AND bit-unset-but-looks-valid cases |
| #8 | injection_points reproducer | warning | structural argument on a security claim with no injection_points test |
| #9 | Hot-path micro-benchmark | suggestion | — |
| #10 | Symmetric-check refactor | suggestion | — |
| #11 | Persona-aware backpatch routing | suggestion | — |
REJECT-track escalation: 3+ blocking from this table AND context-
awareness signal (engagement class contested OR foreclosed
INV-*) → recommend REJECT-A to Stage 3.
Output: same structured-finding list as critics A-D, plus an
optional recommend_verdict: REJECT-A | REJECT-B field when the
escalation rule above triggers.
Stage 3 — orchestrator consolidates (10 min)
Critic-E recommendation vs orchestrator verdict. Critic E may
emit recommend_verdict: REJECT-A | REJECT-B when its catalog-item
threshold (3+ blocking findings + context-awareness signal) fires.
The orchestrator at Stage 3 decides; Critic E recommends. The
orchestrator may downgrade the recommendation to "Waiting on
Author" if the findings, in aggregate, do NOT compose to a
design-level NACK. Critic E's recommendation is one input, not the
verdict.
The main agent gathers all four critics' outputs and:
-
Deduplicates. Two critics may flag the same issue from different angles — merge into one finding with both rationales.
-
Resolves conflicts. If critic A says "this is fine" but critic B says "this breaks ABI", the orchestrator re-reads both and picks the stronger argument. Cite both in the merged finding.
-
Severity prioritization. Group findings into:
- Blocking (must fix before commit; flip CF to "Waiting on Author")
- Warning (should fix or justify)
- Nits / suggestions (take or leave)
- Open questions (need author input)
-
Verdict. Decide one of:
- Ready for Committer
- Waiting on Author (blocking issues)
- Needs more info from author (open questions dominate)
- REJECT-A — design fundamentally wrong, all critical problems
identified, alternative proposed. The right deliverable is a
thread reply explaining the rejection with cites; saves community
cycles. Use this when the patch is in
contestedengagement class or the Context-awareness probe (frompg-feature-plan) flagged it. - REJECT-B — design wrong, but you missed at least one major concern that a critic from the community will raise. Solid but incomplete; send the reply, acknowledge gaps.
- REJECT-C — rejected for the wrong reasons OR rejected when the proposal is actually sound. STOP — escalate to user before posting. Likely you need to re-run with looser priors or load more corpus.
M4 origin:
knowledge/shadow-implementations/money-fx-exchange/skill-gaps.md. The REJECT-A/B/C grades parallel the A-F grade rubric on non-REJECT outcomes — they're not lesser verdicts, just the right shape for proposals that shouldn't proceed.
Stage 4 — synthesize the review email
Use the commit-message-style skill's tone rules — imperative,
plain text, no HTML, no emoji, ~76 col wrap. The review email lives at
sessions/<date>-cf<N>-review.md (or pr<N>) and has this shape:
To: [email protected]
Cc: <author> <author@email>
Subject: Re: [PATCH v<N>] <patch subject>
<one-line summary of where the patch stands>
<one or two paragraphs of the high-level read — what the patch does, why
the corpus thinks it's coherent (or not). Cite specific anchors where
relevant: nbtpage.c:407, knowledge/subsystems/access-nbtree.md §4.>
Blocking issues:
1. <one-line summary>
<2-4 lines of context + concrete ask>
2. ...
Warnings / consider:
1. ...
Nits, take or leave:
1. ...
Open questions:
1. ...
Testing performed:
- git am: <clean | rejected hunk in X>
- ninja install: <clean | warnings: ...>
- meson test regress/regress: <NNN subtests, all pass | failed: ...>
- meson test --suite isolation: <NNN subtests, all pass | failed: ...>
- Patch base: <upstream-master short-sha>
<closing line: "I think this is ready for a committer" / "Marking
Waiting on Author pending the items above" / etc.>
Regards,
[Reviewer]
Below the email in the SAME session file, append:
---
## Per-critic raw findings
### Critic A — Architecture & invariants
<paste the sub-agent's structured list>
### Critic B — Breaking-change scan
<paste>
### Critic C — Test coverage
<paste>
### Critic D — Style & commit-message
<paste>
## Stage 0 mechanical log
- Patch source: <URL or path>
- Base ref: <upstream-master sha>
- Apply: <git am output summary>
- Build: <ninja install summary>
- regress: <pass/fail counts + duration>
- isolation: <pass/fail counts + duration>
- Targeted suites: <if any>
- Pre-existing flakes encountered: <list, with dismissal rationale>
## Wall time
- Stage 0: <min>
- Stage 1: <min>
- Stage 2 (4 critics in parallel): <max of the four, plus orchestration overhead>
- Stage 3: <min>
- Stage 4: <min>
- Total: <min>
Boundaries vs other skills
review-checklist(the eight-phase scaffold — Phase 0 added 2026-06-12 for reviewer-reflex gates): each critic walks the relevant phase of it. This skill orchestrates five critics doing that in parallel (A-E; E added 2026-06-12 from Phase C) and synthesizes. Don't bypassreview-checklist's phase definitions — extend them.patch-submission: the self-review counterpart. If you're reviewing YOUR OWN patch before mailing, use that — it invokes the same critics but on the pre-submission path.commit-message-style(upstream PG): used by the synthesizer for the review-email tone AND by critic D for judging the patch's commit message.meta-commit-style(postgres-claude): does NOT apply to the review email (which goes to pgsql-hackers, not into postgres-claude). It WOULD apply to the session-log commit (if any) and to the STATE.md update.
What to escalate to the user mid-review
- Stage-0 fail (patch doesn't apply, build breaks, regress fails): stop, report, ask whether to send a "rebase needed" reply or to skip.
- Corpus drift detected in stage 1 (cites stale > 10%): stop, ask
the user whether to (a) refresh the corpus first via a separate
hf(corpus):commit (per Rule R9 of.claude/rules/pg-implement-discipline.md— corpus fixes are their own commits in the meta-repo), or (b) proceed with a "best-effort against possibly-stale docs" caveat noted in the review email's "Testing performed" block. - Touched file not in any subsystem doc: don't stop; note in the review email's "Testing performed" block that this area is uncovered by the corpus. After the review, file a followup to document that subsystem.
- Two critics genuinely disagree after orchestrator consolidation: ask the user to break the tie before drafting the email.
Style notes
- The review email is the deliverable; everything else is working notes. Make the email scannable — bullets, no walls of prose.
- Cite specific file:line anchors in the email when relevant. The validation run proved this is what makes a review feel grounded vs generic.
- Distinguish blocking from nits in EVERY review. "Needs more tests" is not blocking unless the patch's correctness claim depends on the missing test.
- For performance-impacting patches: ask for pgbench numbers with exact recipe (hardware, build flags, run count, master baseline). Numerical claims without a recipe get bounced.
- If invoking via the
/pg-reviewslash command, the command already did stage 0 — skip ahead to stage 1.
Where the artifacts live
- Review email + appendices:
sessions/<date>-cf<N>-review.mdinpostgres-claude/(this repo). - Patch branch:
dev/cf<N>-review(the mutable PG clone). Disposable after review is sent. - No
knowledge/writes by this skill — if the review surfaces a corpus gap, file a follow-uphf(corpus):commit separately (per R10 of.claude/rules/pg-implement-discipline.md).
Validation reference
The 2026-06-02 v0 review of CF #6402
[unverified: session log not preserved in sessions/ at the time of this writing]
is the calibration target — re-running THIS skill against that patch
should reproduce a review of comparable quality (same draft conclusion,
same blocking-vs-nit split) in less wall time than the v0 manual walk.
A future preserved-and-named calibration session can replace this
paragraph.
Cross-references
.claude/skills/review-checklist/SKILL.md— the eight-phase scaffold each critic walks; Phase 0 hosts the REJECT-A/B/C grade rubric this skill's Stage 3 verdict consumes..claude/skills/patch-submission/SKILL.md— invokes this skill in--selfmode for the self-review path..claude/skills/pg-feature-plan/SKILL.md— supplies the Context-awareness probe + Thread-engagement classification that drive Critic E's REJECT-track escalation..claude/skills/commit-message-style/SKILL.md— Critic D + synthesizer use this for upstream PG commit-message format..claude/skills/coding-style/SKILL.md— Critic D style check..claude/skills/testing/SKILL.md— Critic C test-coverage check..claude/skills/wal-and-xlog/SKILL.md,.claude/skills/catalog-conventions/SKILL.md— Critic B breaking-change scan..claude/skills/locking/SKILL.md,.claude/skills/memory-contexts/SKILL.md,.claude/skills/error-handling/SKILL.md— Critic A architecture check.knowledge/calibration/gap-catalog.md— items 4-11 source Critic E's eight reflex probes.knowledge/personas/*.md— Critic E loads relevant persona docs per probe.knowledge/shadow-implementations/money-fx-exchange/skill-gaps.md— M4 origin (REJECT-A/B/C verdict)..claude/commands/pg-review.md— slash-command wrapper that runs Stage 0 inline.
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.