fix(pr-review): reconcile live probot deploy drift into monorepo The live gemini/codex/claude reviewers run on the VM from non-git deploy copies that carried production drift never committed back to this repo. PR #804 (repo-context fix) was merged here AND grafted into the deploy, so the deploy now = #804 + drift. This commits the drift so the repo matches what is actually running live (modulo secrets/env). Reconciled (deploy -> repo): - pr-review-shared/lib/ask-ai.js: 600s timeout (was 180s; ~12% of claude reviews hit SIGTERM/143 on large diffs), killSignal SIGINT for partial flush, explicit killedByTimeout timer + clearer "timed out" rejection, richer non-zero-exit error (binary/code/signal + both streams), and a best-effort /tmp/last-prompt-.txt dump for post-mortems. Layered on top of the #804 sandbox/cwd isolation, which is preserved intact. - pr-review-shared/lib/__tests__/ask-ai.test.js: assert the deploy error + timeout message formats; all #804 sandbox tests kept. - gemini-pr-reviewer/index.js: model gemini-3.1-pro-preview. - codex-pr-reviewer/index.js: route via codex-stdin-shim.sh (codex takes the prompt as a positional arg, not stdin; askAI pipes via stdin). - codex-pr-reviewer/codex-stdin-shim.sh: new shim (reads stdin, execs codex). - claude-pr-reviewer/index.js: add --tools '' to disable tool calls that caused "Reached max turns (1)" exit 1 on large diffs. Not committed (deploy is BEHIND main here, not drift): check-resolution.js, post-review.js, review-handler.js — main already has the per-bot checkResolution filter, the postStartedReview dedup, and the mbp-tmux author notification; the deploy copies predate those. Skipped: .env*, private-key.pem, start.sh, gemini api/, .gitignore (secrets/runtime/local cruft). Tests: pr-review-shared vitest 86/86 green; node --check on all changed JS. Co-Authored-By: Claude Opus 4.8