Detailed process for reviewing and approving pull requests.
PR Opened → TL Spawns Reviewers → Parallel Reviews → Feedback Loop → Approval → Merge
Goal: 2 independent approvals before merge.
| PR Type | Required Reviewers |
|---|---|
| Feature | 2 reviewers + TL final |
| Bug fix (P2/P3) | 2 reviewers + TL final |
| Bug fix (P0/P1) | 1 reviewer OR TL only |
| Hotfix | TL or Bogdan only |
| Docs only | 1 reviewer |
gh pr create \
--base develop \
--title "{type}({scope}): {description}" \
--body "Closes #{issue}
## Summary
{what this PR does}
## Changes
- {change 1}
- {change 2}
## Testing
{how to test}
"
gh pr edit {pr} --add-label "state:review"- TL session checks for
state:reviewPRs - Or coder sends completion message to TL
Before spawning:
# Verify CI passes
gh pr checks {pr}
# Verify no conflicts
gh pr view {pr}## Reviewer 1 Spawn
Label: reviewer-{project}-{pr}-1
Model: Opus
[Use prompts/code-review.md brief]## Reviewer 2 Spawn
Label: reviewer-{project}-{pr}-2
Model: Opus
[Use prompts/code-review.md brief]Reviewer Selection:
- Prefer project coders who didn't author this PR
- If unavailable, spawn fresh Opus reviewers
- Never assign author as reviewer
Both reviewers work independently:
┌─────────────────────┐ ┌─────────────────────┐
│ Reviewer 1 │ │ Reviewer 2 │
│ - Read CONTEXT.md │ │ - Read CONTEXT.md │
│ - Read PR diff │ │ - Read PR diff │
│ - Check checklist │ │ - Check checklist │
│ - Submit review │ │ - Submit review │
└─────────────────────┘ └─────────────────────┘
│ │
└──────────┬───────────────┘
↓
Both Complete
- Small PR (<100 lines): 15 min each
- Medium PR (100-300 lines): 30 min each
- Large PR (300-500 lines): 45 min each
# Add approved label
gh pr edit {pr} --add-label "state:approved" --remove-label "state:review"Proceed to Step 5 (TL Final Review).
Reviewer feedback
↓
TL notifies coder (or spawns if terminated)
↓
Coder addresses feedback
↓
Coder pushes fixes
↓
Coder re-requests review
↓
Reviewer re-reviews (same or new)
Coder Addressing Feedback:
# Coder makes fixes
git add -A
git commit -m "fix: Address review feedback
- {change 1}
- {change 2}
"
git push
# Request re-review
gh pr edit {pr} --add-assignee {reviewer}If reviewers disagree:
- TL reviews the disagreement
- TL makes final call
- Document reasoning in PR comment
If reviewer says "too large to review":
- TL asks coder to split PR
- Close current PR
- Open smaller, focused PRs
- Each smaller PR goes through full review
After 2 approvals:
## Final Review Checklist
- [ ] 2 approvals present
- [ ] All review comments addressed
- [ ] CI still passing
- [ ] No merge conflicts
- [ ] Conventional commit message
- [ ] PR description completeTL comments and waits for fix.
Proceed to merge (or request Bogdan merge for sensitive changes).
# Squash merge (clean history)
gh pr merge {pr} --squash --delete-branch# Issue auto-closes via "Closes #N"
# Update CONTEXT.md Active Work (remove merged branch)
# Archive coder state file# Remove worktree
git worktree remove ../{repo}-{feature}When coder pushes fixes after "changes requested":
# Re-request from same reviewer
gh pr edit {pr} --add-reviewer {reviewer-username}If original reviewer terminated or unavailable:
## Re-Review Spawn
Context: PR #{pr} had changes requested. Author addressed feedback.
Focus: Verify the specific issues were fixed.
[Brief includes previous review comments]- Time from PR open to first review
- Number of review cycles
- Time to merge after approval
| Metric | Healthy | Needs Attention |
|---|---|---|
| First review | < 4 hours | > 8 hours |
| Review cycles | 1-2 | > 3 |
| Time to merge | < 4 hours after approval | > 24 hours |
Problem: Reviewer blocks on minor style issues
Solution: Use linter for style, review for logic
Problem: Reviewer comments but never approves/rejects
Solution: Require explicit approve/request-changes
Problem: "LGTM" without actual review
Solution: Require checklist completion
Problem: PRs waiting >24h for review
Solution: Spawn more reviewers, prioritize review work
Author cannot be reviewer. System should prevent this.
When TL writes code:
- 2 reviewers still required
- Another TL or Bogdan does final review
- Single reviewer (TL or Bogdan)
- Merge immediately after approval
- Post-merge review acceptable for P0