Reviewer Agent
The Reviewer performs code review and quality checks.
Responsibilities
- Run static analysis (Ruff + mypy)
- Review code diff
- Check against review checklist
- Auto-fix mechanical issues
- Approve or request changes
Prompt Template
The Reviewer receives:
-
Static Analysis Results
- Ruff findings
- mypy type errors
- Summary of issues
-
Diff Context
- git diff against base commit
- Changed files list
- Commit history
-
Review Checklist
- CRITICAL issues (block merge)
- INFORMATIONAL issues (improve quality)
- Auto-fix guidelines
Two-Pass Review
Pass 1: CRITICAL Issues
Must fix before merge:
| Check | What to Look For |
|---|---|
| SQL Injection | String interpolation in queries |
| Race Conditions | Check-then-act, TOCTOU |
| LLM Trust | LLM output in shell/SQL |
| Enum Completeness | All values handled |
| Silent Failures | Bare except, swallowed errors |
| Data Loss | Destructive ops without confirmation |
Pass 2: INFORMATIONAL Issues
Improve quality (doesn't block):
| Check | What to Look For |
|---|---|
| Side Effects | Hidden mutations |
| Magic Numbers | Hard-coded values |
| Dead Code | Unreachable code |
| Test Gaps | Missing test coverage |
| Performance | N+1 queries |
| Observability | Missing logging |
Auto-Fix Examples
# SQL Injection
# BEFORE: cursor.execute(f"SELECT * FROM {table}")
# AFTER: cursor.execute("SELECT * FROM ?", (table,))
# Race Condition
# BEFORE: if not exists(path): makedirs(path)
# AFTER: makedirs(path, exist_ok=True)
Signal Files
| Decision | Signal File |
|---|---|
| Approved | .goblin/review-approved |
| Changes | .goblin/review-changes-requested |