docs/book/src/maintainers/reviewer-playbook.md
The operating model for reviewing PRs and triaging issues. Sized to keep review quality high under heavy volume; routes by risk so high-stakes paths get the attention they need without dragging every small change through the same gate.
For the actual fetch sequence and review verdict mechanics, see PR Review Protocol. This page is the operating model; the protocol is the procedure.
Use this section to route a review before reading deeper. Each row links to the section that elaborates.
| Situation | Action | Section |
|---|---|---|
| Intake fails in the first 5 minutes | Leave one actionable checklist comment, stop deep review | Five-minute intake |
| Risk is high or unclear | Treat as risk: high until proven otherwise | Review depth matrix |
| Automation output is wrong or noisy | Apply the override protocol | Automation override |
| Need to hand off to another maintainer | Use the handoff template | Handoff |
| Risk label | Typical paths | Minimum depth | Required evidence |
|---|---|---|---|
risk: low | Docs, tests, chore, isolated non-runtime | 1 reviewer + CI gate | Coherent local validation, no behavior ambiguity |
risk: medium | crates/zeroclaw-providers/, crates/zeroclaw-channels/, crates/zeroclaw-memory/, crates/zeroclaw-config/ | 1 subsystem-aware reviewer + behavior verification | Focused scenario proof, explicit side effects |
risk: high | crates/zeroclaw-runtime/src/security/, the rest of crates/zeroclaw-runtime/, crates/zeroclaw-gateway/, crates/zeroclaw-tools/, .github/workflows/ | Fast triage + deep review + rollback readiness | Security and failure-mode checks, rollback clarity |
When uncertain, treat as higher risk.
If the path-labeler's risk inference is contextually wrong, apply risk: manual and set the final risk:* label explicitly — manual freezes any future automated recalculation.
For every new PR, before reading any code:
size:*, risk:*, scope labels, contributor tier where applicable.CI Required Gate signal status.If any intake check fails, leave one actionable checklist comment and stop. Don't deep-review a PR that hasn't passed intake — the back-and-forth is cheaper at this layer than after the diff has been reasoned about.
AGENTS.md, Extension examples).For risk: high PRs, verify a concrete example in each category. One concrete instance beats five generic claims.
Prefer checklist-style comments with one explicit outcome:
Vague comments create avoidable round trips. If you find yourself writing "this might be a problem", invest 30 more seconds and turn it into a specific scenario or pull the comment.
The same risk-routing principle applies to issues, but the labels and signals are different.
| Label | When to use |
|---|---|
r:needs-repro | Bug report missing a deterministic repro. Block deeper triage on this. |
r:support | Usage or help question better routed outside the bug backlog. |
duplicate / invalid | Non-actionable noise. Close with a polite pointer. |
no-stale | Accepted work waiting on an external blocker. Keeps the issue out of stale automation. |
If logs or payloads in the report contain personal identifiers or sensitive data, request redaction before deeper triage. The triage process must not propagate the exposure.
When review demand exceeds capacity:
size: XS/S) at the top of the queue.superseded after the author acknowledges. See Superseding PRs for the attribution rules.stale-candidate before stale closure window starts.Use this when automation output creates review side effects:
risk: manual, then set the intended risk:* label.When passing review to another maintainer or agent mid-flight, include:
This keeps context loss low and avoids the next reviewer redoing the same fetches you already did.
no-stale only to accepted-but-blocked work.size: XS/S bug and security PRs first.The goal is a queue where every open PR is either being actively reviewed, blocked on the author, or blocked on something external — never just sitting because nobody got to it.