with one click
code-review-loop
// Iterative review+fix loop for BASE_SHA..HEAD: generate findings, apply accepted fixes, run checks, commit, and re-review up to 3 iterations or until clean.
// Iterative review+fix loop for BASE_SHA..HEAD: generate findings, apply accepted fixes, run checks, commit, and re-review up to 3 iterations or until clean.
Deploy this repository to a new Google Cloud project using the repo's existing Cloud Run, Cloud Run Jobs, Cloud SQL, Secret Manager, and Artifact Registry scripts. Use when Codex needs to interpret a generic repo setup request as a deploy, discover the active gcloud operator/account/org/billing context, fail early on missing gcloud permissions or local prerequisites, or perform the actual Broccoli OSS GCP deployment behind an explicit apply step.
Non-interactive wrapper: plan-sketch -> auto-pick recommended options -> plan-write -> plan-critique-loop -> implement-from-plan -> claude-simplify-wrapper -> dedup -> code-review-loop. No PR creation and no Linear comments.
Small-change wrapper: implement → run repo checks → atomic commit → run dedup (BASE_SHA..HEAD).
Run Claude's built-in /simplify skill on BASE_SHA..HEAD, validate checks, and commit.
Dedupe-only pass for BASE_SHA..HEAD: remove duplicate code introduced by the diff or reuse existing shared utils; applies changes + commits.
Implement an approved plan doc step-by-step in application or systems codebases, including Node/TS, Python, and C/C++ repos (build/lint/test per step, atomic commits, progress log hygiene). Use when you have a plan/*.md and want to execute it.
| name | code-review-loop |
| description | Iterative review+fix loop for BASE_SHA..HEAD: generate findings, apply accepted fixes, run checks, commit, and re-review up to 3 iterations or until clean. |
Input: a git base SHA (or other explicit range) to review against (for example: <sha> or HEAD~1).
git rev-parse --show-toplevelgit status --porcelain should be empty.codex and claude) because reviewer/responder must be different vendors.Typically runs 15–45 minutes, but allow at least 120 minutes.
Do not interrupt/restart the subagent if it looks stuck. The loop script owns stuck/timeout handling and will exit on its own when it completes or when --timeout is reached. Prefer watching the periodic heartbeat output (--heartbeat-seconds) instead of tailing logs.
Claude Code print mode can be silent in --output-format text until it finishes (including during tool work). This repo defaults Claude subprocesses to --output-format stream-json --include-partial-messages so the wrapper sees measurable progress and inactivity timeouts mainly trigger on true hangs.
Run the review loop script:
resolve_skill_dir() {
local name="$1"
local repo_root=""
repo_root="$(git rev-parse --show-toplevel 2>/dev/null || pwd)"
local candidates=(
"$repo_root/.agents/skills/$name"
"$repo_root/.claude/skills/$name"
"$HOME/.agents/skills/$name"
"$HOME/.codex/skills/$name"
"$HOME/.claude/skills/$name"
)
for d in "${candidates[@]}"; do
if [[ -d "$d" ]]; then
echo "$d"
return 0
fi
done
echo "Error: skill '$name' not found in repo-scoped or user-scoped skill dirs." >&2
return 1
}
CODE_REVIEW_LOOP_SKILL_DIR="$(resolve_skill_dir code-review-loop)"
python3 "$CODE_REVIEW_LOOP_SKILL_DIR/scripts/run_review_loop.py" <base-sha>
Options:
--max-iterations N (default: 3)--cli codex|claude (pin responder provider; reviewer is selected from provider pool and always differs from responder)--provider-pool codex,claude (provider pool for both subprocesses; reviewer/responder vendors are always distinct)--codex-model-pool ... and --claude-model-pool ... (random model selection; supports model@effort)--progress-log <path> and --heartbeat-seconds N--artifacts-dir <path> (optional; stores reviewer outputs for responders to read)--timeout N (per-subprocess timeout in seconds; default: 7200)--review-only (responder does not apply fixes/commit)Claude automation knobs (env vars; defaults shown):
PROMPT_TEMPLATES_CLAUDE_OUTPUT_FORMAT=stream-json (text|json|stream-json)PROMPT_TEMPLATES_CLAUDE_MIN_VERSION=2.1.33 (fail fast if installed Claude Code is older)PROMPT_TEMPLATES_CLAUDE_STREAM_LOG_MAX_BYTES=10485760 (per invocation; set 0 for unlimited)PROMPT_TEMPLATES_CLAUDE_INACTIVITY_TIMEOUT_SECONDS=180 (set 0 to disable; in text/json mode it is disabled unless explicitly set)PROMPT_TEMPLATES_CLAUDE_INACTIVITY_MIN_RUNTIME_SECONDS=30PROMPT_TEMPLATES_CLAUDE_PROMPT_BUDGET_BYTES=0 (disabled by default; set >0 to enforce)Behavior:
BASE_SHA..HEAD (it fetches the diff locally via git diff).git diff and reads reviewer output from the artifacts dir).reviewer=claude fails after retry and responder is not pinned to codex, the script performs a role-swap fallback and re-runs the iteration with reviewer=codex,responder=claude (it prints a CLAUDE_FALLBACK: ... line when this happens).type=result event (stream-json).--sandbox danger-full-access and -a never so it can run git commands (including committing fixes) without getting stuck on approvals or .git lock writes.--review-only mode, the script enforces commit hygiene per iteration: if responder leaves working-tree fix changes, it auto-commits them before the next iteration; if responder accepts findings but produces no committed changes, the loop stops.REVIEW_PROGRESS log summary including:
gpt-5.2@highclaude-opus-4-6[1m]@highTroubleshooting:
CLAUDE_RETRY: / CLAUDE_FALLBACK: lines on stderr to confirm retry/fallback behavior.idle_seconds=... and byte counters; PTY mode uses pty_bytes=....--progress-log may include full tool outputs (diffs, file contents). Treat it as sensitive; stream-json logs are truncated by default via PROMPT_TEMPLATES_CLAUDE_STREAM_LOG_MAX_BYTES.CLAUDE_FALLBACK_UNAVAILABLE: ... responder is pinned to codex, rerun with --cli claude to allow the role-swap fallback.