Run the local AI review convergence loop on the current branch. Dispatches 17 domain-specific reviewers, produces a structured review summary, and runs a bounded fix convergence loop when findings are blocking. Use for AI code review before pushing, as a quality checkpoint mid-development, or standalone outside /ship. Triggers: review-local, local review, local code review, AI review, pre-push review, review my code locally.
From engnpx claudepluginhub inkeep/team-skills --plugin engThis skill uses the workspace's default tool permissions.
Guides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Migrates code, prompts, and API calls from Claude Sonnet 4.0/4.5 or Opus 4.1 to Opus 4.5, updating model strings on Anthropic, AWS, GCP, Azure platforms.
Deploys Linkerd service mesh on Kubernetes with patterns for installation, proxy injection, mTLS, service profiles (retries/metrics), traffic splits (canary), and authorization policies.
Run the local AI review convergence loop on the current branch. This skill dispatches domain-specific reviewers against your code, produces a structured review summary, and runs a bounded fix convergence loop — all without GitHub or a PR.
Use this as a quality checkpoint anytime you have code on a feature branch: before pushing, mid-development, or as a standalone review outside /ship.
Do not over-prepare. When the user asks you to run /review-local, run the script. Do not create branches, stage files, or commit on behalf of the user — the script works on the current branch state (committed + staged + unstaged).
The script path is relative to the /ship skill directory (this skill shares scripts with /ship):
plugins/eng/skills/ship/scripts/run-local-review.sh
Always run with run_in_background: true — the review dispatches 17 parallel reviewers and runs fix passes, routinely exceeding the 600-second Bash timeout:
Bash(command: "<absolute-path-to-skill>/scripts/run-local-review.sh [options]",
run_in_background: true,
description: "Local review")
Use the absolute script path. Do not rely on CWD being correct — your shell CWD may differ from the target repo. The script resolves the repo root via git rev-parse --show-toplevel from the CWD where it is invoked, so if your CWD is a different repo, the review will run against the wrong codebase. Always invoke with the full absolute path and ensure you are in the correct repo directory.
The script:
${CLAUDE_SHIP_DIR:-tmp/ship}/pr-review-plugin/| Option | Default | Description |
|---|---|---|
--target <branch> | Auto-detect (repo default branch) | Branch to diff against |
--max-fix-passes <n> | 5 | Maximum autonomous repair passes |
--docker [compose-file] | Host execution | Run inside the repo's Docker sandbox |
--spec <path> | From state.json if exists | SPEC.md path to include in repair prompts |
--allow-blocking | Exit non-zero on blocking | Accept a blocking result — exit 2 with reason allow_blocking instead of entering repair loop |
All output goes to ${CLAUDE_SHIP_DIR:-tmp/ship}/:
| File | Description |
|---|---|
review-output.md | Latest review summary (markdown) |
review-status.json | Parsed status — recommendation, risk, issue counts, blocking flag |
review-iteration-log.md | Full review/fix history across iterations |
local-review-runs/<run-id>/ | Forensic trail per review pass |
The script works without any /ship artifacts:
tmp/ship/ if missingpackage.json when no state.json exists (looks for test, typecheck, lint scripts)/ship-specific files (spec.json, progress.txt, codebase-context.md — all produce _Not available._ in prompts)# Default: review + auto-fix loop (up to 5 passes)
<ship-skill-base>/scripts/run-local-review.sh
# Review against a specific branch
<ship-skill-base>/scripts/run-local-review.sh --target develop
# Review + fix loop (up to 2 passes)
<ship-skill-base>/scripts/run-local-review.sh --max-fix-passes 2
# Run inside Docker sandbox
<ship-skill-base>/scripts/run-local-review.sh --docker
The script emits a structured return payload to stdout at exit with three delimited sections:
Exit envelope (=== LOCAL REVIEW EXIT ===): Always present. Contains exit_code, exit_reason, pass counts, fix commit SHAs, last_recommendation, blocking status, duration, and file pointers.
Review status (=== REVIEW STATUS ===): Parsed review-status.json content — recommendation, risk, issue counts, blocking reasons. Present on all non-crash exits.
Iteration log (=== REVIEW ITERATION LOG ===): Full history of review passes and fix responses. Only included on non-zero exits (blocking/fatal) to provide remediation context.
Exit reasons:
exit_reason | Exit code | Meaning |
|---|---|---|
converged | 0 | Pure APPROVE — gate is green |
fixer_no_changes | 2 | Fixer declined/deferred all findings, no code changed — re-reviewing would be identical |
max_passes_exhausted | 2 | Still blocking after all fix passes |
allow_blocking | 2 | Blocking, but --allow-blocking was set |
fatal_error | 1 | Script crashed (staging, review, or parse failure) |
You can also check review-status.json directly for the gate status:
Do not blindly apply every suggestion. Validate each finding against the diff, codebase patterns, and your intent before acting.
/ship invokes the same run-local-review.sh script directly in Phase 4: Review gate — pre-QA (/review-local) and Phase 6: Review gate — post-QA (/review-local). /ship does not load this skill — it calls the script as an orchestrator. This skill exists for standalone human invocation outside /ship.
| Context | How invoked |
|---|---|
Standalone (developer runs /review-local) | This skill — tells the LLM what to run and where to find results |
Within /ship (Phase 4 /review-local, Phase 6 /review-local) | Script invoked directly by /ship orchestrator |