Code review for quality, security, and best practices. Use when: - User asks to "review", "check", "look at" code - Before merging, committing, or shipping - User mentions PR, pull request, changes, diff - User wants feedback on implementation - After implementing a feature (self-review)
Reviews against the full Darkroom quality checklist defined in the reviewer agent.
Focus areas: TypeScript strictness, React patterns, accessibility, performance, security, file structure.
Claude frontmatter does not enforce a fork or reviewer identity in standalone
Codex. Keep the main pass read-only or create a fresh reviewer with
spawn_agent. Deliver context to a running reviewer with send_message, trigger
another turn for an idle existing reviewer with followup_task, wait with
wait_agent, and stop its current turn with interrupt_agent only when
necessary. Never spawn codex-verifier and never run codex-run.ts from inside Codex.
Writers share the working tree unless the live host explicitly offers
isolation. Reviewers may overlap because they are read-only; serialize any
later implementer and test-writer work with non-overlapping ownership. Gather
the current state by explicitly running git branch --show-current, git diff --staged --stat, and git diff --stat. The !command lines below are Claude
interpolation only.
git branch --show-current 2>/dev/null || echo "unknown"git diff --staged --stat 2>/dev/null || echo "nothing staged"git diff --stat 2>/dev/null || echo "nothing unstaged"# Unstaged changes
git diff
# Staged changes
git diff --staged
# Specific file
git diff path/to/file
Past ~200 changed lines, present the diff walkthrough as a reading diff — the real diff, abridged — never a prose-only summary (prose can lie by omission; a diff can't). Every line shown is verbatim from git diff; the only editing allowed is removal and compression: drop whole no-signal lines, fold 2+ contiguous same-polarity lines into a ... row, or elide a noisy span inside a kept line. Never rewrite one. Drop import churn, lockfiles, generated files, and formatting-only hunks; show one instance of a mechanical rename and fold the rest with a count; keep every behavioral change. Close with an accounting line — showing N of M changed lines — dropped: ... — naming any new dependency, changed import target, or lockfile version/integrity bump even though import churn is dropped. The full diff remains the merge authority. Full protocol: the "Reading diffs" section of /review-batch (adapted from boldsoftware/meat, Apache-2.0).
Follow the native lifecycle above, then adjudicate the fresh reviewer's findings against the diff. The fresh agent supplies the independent review; skip the Claude bridge branch below.
This skill runs as the Claude reviewer agent — often Claude reviewing a diff Claude just wrote, the self-preferential-bias case. Run an independent review from a different model family in parallel and reconcile (the reviewer has Bash, so call the bridge directly):
bun "$HOME/.claude/src/scripts/codex-run.ts" review
Codex reads the same diff and returns HIGH / MEDIUM / LOW findings. Adjudicate every finding before it drives a fix — Codex produces false positives and stale findings, so its output is a set of claims, not a verdict. Tag each one:
Then fold the confirmed findings into the verdict below — map HIGH→Critical, MEDIUM→Warning, LOW→Suggestion. Agreement with your own review raises confidence. The bridge is gated and fails open: if Codex is unavailable, proceed with the Claude review alone.
## Summary
[1-2 plain-English sentences: what this change does, then your overall read]
## Critical Issues
- [Must fix before merge]
## Warnings
- [Should fix, but not blocking]
## Suggestions
- [Nice to have improvements]
## Verdict
[APPROVED / NEEDS CHANGES / BLOCKED]
/share-learning (team-wide)./verify when the diff touches auth, payments, crypto, input validation, or a breaking public API — this skill is the fast checklist pass; /verify runs three adversarial agents (issue-finder, disprover, judge) and is the gate for security-sensitive or financial code.Fires whenever the diff touches CSS transitions/animations or any motion-library
code — new or edited GSAP/Motion/Framer Motion/Lenis calls, animation props,
spring configs, or WAAPI usage, not just added imports. Adapted from emilkowalski/skills
review-animations (MIT). Default to flagging — approval is earned, not assumed.
Ten standards — each violation is a finding:
ease-out or a strong custom curve on entering/exiting
elements (see rules/ui-skills.md). ease-in on UI is a block.transform-origin at the trigger, not center (modals exempt). Never scale(0) —
start scale(0.9–0.97) + opacity.transform/opacity (clip-path is the sanctioned
third) only. Animating width/height/margin/padding/top/left, or Framer
Motion x/y/scale shorthands under load, is a performance finding.prefers-reduced-motion honored (gentler, not zero); hover
motion gated behind @media (hover: hover) and (pointer: fine).Escalation triggers (flag on sight): transition: all; scale(0) or pure-fade
entrances (reduced-motion fallbacks exempt — a crossfade is the correct fallback
there); ease-in on any UI interaction; animation on a keyboard shortcut or
100+/day action; UI duration > 300ms with no stated reason (modals/drawers exempt
up to 500ms); transform-origin: center
on a trigger-anchored popover; keyframes on toasts/toggles/anything rapidly
triggered; animating layout properties; missing prefers-reduced-motion; ungated
:hover motion; symmetric enter/exit timing on a press-and-hold interaction.
Remedial order (prefer earlier moves over later ones): delete the animation → reduce it → fix the easing → fix the origin/physicality → make it interruptible → move it to the GPU → asymmetric timing → polish (stagger, blur-masked crossfades) → accessibility & cohesion.
Fold findings into the Critical/Warnings/Suggestions verdict above — a block-tier finding here is Critical.
When the user asks "what did reviewers say" or wants a digest of feedback on the active PR (not a self-review of local diff):
# Resolve the active PR
gh pr view --json number,url,headRefName,reviews,comments
# Inline review comments (file/line anchored)
gh api repos/{owner}/{repo}/pulls/PR_NUMBER/comments \
--jq '.[] | {user: .user.login, body, path, line}'
# Discussion comments (issue-level, not file-anchored)
gh api repos/{owner}/{repo}/issues/PR_NUMBER/comments \
--jq '.[] | {user: .user.login, body, created_at}'
# Review states (APPROVED / CHANGES_REQUESTED / COMMENTED)
gh pr view --json reviews --jq '.reviews[] | {user: .author.login, state, body}'
## Summary
[1-2 sentence overview of feedback]
## Blocking (must address)
- [reviewer]: [path:line] — [issue + suggested fix]
## Suggestions (should address)
- [reviewer]: [path:line] — [issue]
## Nits (optional)
- [reviewer]: [path:line] — [issue]
## Open questions
- [unresolved threads needing a reply]
Summarizing isn't the whole job when the user wants the PR actually updated. After the digest above, close the loop on the Blocking items — scoped to this PR:
gh api repos/{owner}/{repo}/pulls/PR_NUMBER/comments/COMMENT_ID/replies -f body='...' — a thread reply. gh pr comment posts an issue-level comment that never attaches to the thread. Thread resolution is the reviewer's click (or a GraphQL resolveReviewThread mutation) — report threads as addressed, don't claim them resolved.addressed in <sha>. Review comments don't disappear when fixed, so the digest tracks addressed-vs-open — never promise a count dropping to zero.Stop and report instead of pushing when a comment is ambiguous, requests a design change rather than a fix, or falls outside the diff already under review — those go back to the user, not into an autonomous fix.
Search for places (restaurants, cafes, etc.) via Google Places API proxy on localhost.
Interact with GitHub using the `gh` CLI. Use `gh issue`, `gh pr`, `gh run`, and `gh api` for issues, PRs, CI runs, and advanced queries.
Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.
Start voice calls via the OpenClaw voice-call plugin.
Notion API for creating and managing pages, databases, and blocks.
Gemini CLI for one-shot Q&A, summaries, and generation.
Category:developer