#!/bin/bash transcript_path="$1" recent=$(tail -30 "$transcript_path") plan_content=$(grep -A 1000 "## Plan" "$transcript_path" | head -200 2>/dev/null || echo "$recent") review_prompt="You are a senior code reviewer. Review this implementation plan for completeness and correctness. PLAN TO REVIEW: $plan_content Evaluate: 1. Are requirements clearly understood? 2. Are edge cases considered? 3. Is the approach sound and maintainable? 4. Are there any obvious gaps or risks? Reply ONLY with JSON: {\"verdict\": \"APPROVE\" or \"NEEDS_WORK\", \"issues\": [\"issue1\", \"issue2\"], \"severity\": \"critical\" or \"minor\" or \"none\"}" tmp_claude=$(mktemp) tmp_gemini=$(mktemp) trap "rm -f $tmp_claude $tmp_gemini" EXIT claude -p "$review_prompt" --output-format json 2>/dev/null | jq -r '.result // empty' > "$tmp_claude" & pid_claude=$! gemini -p "$review_prompt" -o json 2>/dev/null | jq -r '.result // empty' > "$tmp_gemini" & pid_gemini=$! wait $pid_claude $pid_gemini claude_review=$(jq -c '.' "$tmp_claude" 2>/dev/null) gemini_review=$(jq -c '.' "$tmp_gemini" 2>/dev/null) [[ -z "$claude_review" ]] && claude_review='{"verdict":"APPROVE","issues":[],"severity":"none"}' [[ -z "$gemini_review" ]] && gemini_review='{"verdict":"APPROVE","issues":[],"severity":"none"}' claude_verdict=$(echo "$claude_review" | jq -r '.verdict // "APPROVE"') claude_severity=$(echo "$claude_review" | jq -r '.severity // "none"') claude_issues=$(echo "$claude_review" | jq -r '.issues // []') gemini_verdict=$(echo "$gemini_review" | jq -r '.verdict // "APPROVE"') gemini_severity=$(echo "$gemini_review" | jq -r '.severity // "none"') gemini_issues=$(echo "$gemini_review" | jq -r '.issues // []') judge_prompt="You are the final arbiter. Two AI reviewers evaluated a plan. Make the FINAL decision. CLAUDE REVIEW: - Verdict: $claude_verdict - Severity: $claude_severity - Issues: $claude_issues GEMINI REVIEW: - Verdict: $gemini_verdict - Severity: $gemini_severity - Issues: $gemini_issues RULES FOR YOUR JUDGMENT: 1. Only block if BOTH reviewers found CRITICAL issues, OR if one found critical and other found minor 2. If issues are minor/nitpicky (style, naming, over-engineering concerns), let it pass 3. If issues are about missing core functionality or security, block it 4. Prefer action over perfection - a good plan executed beats a perfect plan never started Reply ONLY with JSON: - Let finish: {\"continue\": false} - Send back: {\"continue\": true, \"reason\": \"\"}" final_result=$(claude -p "$judge_prompt" --output-format json 2>/dev/null | jq -r '.result // empty') if echo "$final_result" | jq -e '.continue' >/dev/null 2>&1; then echo "$final_result" else echo '{"continue": false}' fi