docs/book/src/contributing/pr-review-protocol.md
This is the procedure followed when reviewing a pull request in zeroclaw-labs/zeroclaw. It's loaded by the github-pr-review-session skill and read by human reviewers, it's authoritative for both.
The gh CLI is assumed available and authenticated.
Run all of these. The data informs every step that follows.
PR overview
<div class="os-tabs-src">gh pr view <number> --repo zeroclaw-labs/zeroclaw
Description, labels, linked issues, validation evidence.
Top-level conversation
<div class="os-tabs-src">gh pr view <number> --comments --repo zeroclaw-labs/zeroclaw
Inline threads (every reply chain)
<div class="os-tabs-src">gh api repos/zeroclaw-labs/zeroclaw/pulls/<number>/comments --paginate
Read full reply chains before drawing any conclusion about whether something is open or settled. Note author commitments made in replies, they're load-bearing.
Formal reviews
<div class="os-tabs-src">gh api repos/zeroclaw-labs/zeroclaw/pulls/<number>/reviews --paginate
Note which CHANGES_REQUESTED are still active (not superseded by a later APPROVED or DISMISSED). Check whether you've already reviewed this PR.
Relevant foundations documents
Always read FND-005 (Contribution Culture). For others, use the relevance table below, read what applies to the PR's scope. The ratified versions are local files; no API call needed.
| Foundation | Local file |
|---|---|
| Microkernel Architecture | docs/book/src/foundations/fnd-001-intentional-architecture.md |
| Documentation Standards | docs/book/src/foundations/fnd-002-documentation-standards.md |
| Team Governance | docs/book/src/foundations/fnd-003-governance.md |
| Engineering Infrastructure | docs/book/src/foundations/fnd-004-engineering-infrastructure.md |
| Contribution Culture | docs/book/src/foundations/fnd-005-contribution-culture.md |
| Zero Compromise in Practice | docs/book/src/foundations/fnd-006-zero-compromise-in-practice.md |
Diff
<div class="os-tabs-src">gh pr diff <number> --repo zeroclaw-labs/zeroclaw
Read the full diff. Cross-check author commitments from step 3 against what actually shipped. Cross-check against the local repository where the change lands.
Before you write a single line of review, name out loud:
The take-stock pass is what stops you from re-raising settled points and what surfaces who's actually waiting on what.
Labels are maintainer metadata, not a contributor blocker. If the right label is obvious and you have permission, fix it yourself before finalizing the review. If you are acting through an assistant, draft the exact label change and get the human reviewer's approval before mutating GitHub.
Ask the author about labels only when the right label choice is ambiguous or nobody with label permissions is available. Do not request changes or hold merge solely because an author cannot edit labels.
Before approving, compare the live PR body against the current
.github/pull_request_template.md. The template is the source of truth: check
every required and applicable prompt, including conditional sections. Custom
narrative is fine only when it still satisfies that template contract.
Missing required substance is a review finding. If the content is present but the heading or placement needs mechanical cleanup, and a maintainer can safely repair it, fix or propose the exact cleanup instead of making the author do metadata work. When acting through an assistant, show the exact PR-body or metadata diff and get human reviewer approval before mutating GitHub. If the missing section is substantive, unsupported, or changes reviewer confidence, do not approve until it is filled.
Also run a truthfulness scrub on the public artifacts before choosing a verdict:
Closes / Fixes / Resolves only
when the PR fully resolves the issue; otherwise use Related, Depends on,
or Supersedes.How I tested are expected when the template asks for
them.| Situation | Verdict flag |
|---|---|
| Your review is approving, the template/truthfulness checks are satisfied, and prior substantive concerns are resolved, dismissed, stale, or explicitly reconciled in your review | --approve |
| Your review is rejecting on substantive grounds you'd block on personally | --request-changes |
| You have nothing new to block on but other reviewers hold unresolved substantive concerns | --comment |
| You have specific findings but they're all ๐ต suggestions or non-blocking clarification questions | --comment |
Do not ignore another reviewer's visible CHANGES_REQUESTED. Before approving, check whether the underlying concern is resolved in the current diff, stale, dismissed, or still valid. A review state left on an older head is not automatically an unresolved concern. If you approve while that state is still visible, explain why the concern has been resolved; your approval does not clear the other review state for merge.
When validation is the concern, identify the exact evidence gap instead of asking for "full Cargo" by reflex. Check the current required CI jobs and the changed surface, then ask for extra validation only where required CI does not prove the thing under review: tests for a platform that only received compile checks, Clippy for a platform or path outside the required lint job, desktop coverage when the desktop workflow did not trigger, release targets outside the PR matrix, stale CI, or unavailable CI.
For size:XL, over-1k-line, or new channel/provider/tool-family PRs, review the diff shape before relying on CI or prior approval. The public review should say whether the size is justified, whether the slice is merge-justified now, whether it could reasonably be split, and whether the handwritten work is mostly new value rather than duplicated machinery.
Do not dismiss generated artifacts as harmless because they are generated. If a checked-in generated file affects policy, schema, routes, migrations, lockfiles, release artifacts, capabilities, packages, runtime behavior, or reviewer evidence, review it like source and ask the PR to explain the provenance when that provenance matters.
Findings in review bodies and inline comments use this PR-review scale, adapted from FND-005. The โ
[resolved] entry is for re-reviews that acknowledge addressed findings.
Formal review body findings should use H3 headings that start with the taxonomy emoji. This keeps severity and required action easy to scan.
Use these canonical forms:
### ๐ด Blocking โ short issue title### ๐ก Warning โ short issue title### ๐ต Suggestion โ short issue title### ๐ข What looks good โ short positive title### โ
Resolved โ short resolved itemDo not write headings like ### Blocking โ ..., ### Finding 1 โ ..., or numbered findings for formal review bodies. Those miss the required taxonomy marker and make the review harder to scan.
Write as a thoughtful senior contributor who has read everything and cares about the outcome:
โ
The merge order is correct becauseโฆ) builds shared judgment over time.### โ
Resolved โ ... so the author sees their work was registered.@-prefixed usernames in all review content (chat, body, inline). @WareWolf-MoonWall, not WareWolf-MoonWall.Write the review body to a file under tmp/review-<number>.md first: this is the source of truth for what was posted and lets the user inspect before publishing. Then:
gh pr review <number> --repo zeroclaw-labs/zeroclaw \
<--approve | --request-changes | --comment> \
--body-file tmp/review-<number>.md
Always show the full draft and get explicit approval from the human before posting. Continuation words like "next" or "move on" don't count as approval, only an unambiguous "yes" / "approve" / "go" does.
If a session-level handoff file exists (tmp/handoff.md), update it with the verdict, the head commit reviewed, and what remains open. The handoff is what lets a new session pick up cold without re-reading the whole conversation.
CHANGES_REQUESTED concern has been resolved.maintainerCanModify: true allows it; even then, ask before pushing anything other than trivial fixups.