mcpField
C
codex-review-loop

codex-review-loop

github.com/lixiaolin94Testing & quality76657 installsUpdated 17w ago
Repository

About codex-review-loop

codex-review-loop is a skill for iterating on GitHub PRs reviewed by ChatGPT Codex online, for repositories with that integration enabled. It polls review results with a script and requires validating findings and fixes; merging requires user authorization.

Key features

  1. 01Trigger and poll Codex PR reviews
  2. 02Check review and comment signals
  3. 03Extract inline findings
  4. 04Verify findings and local fixes
  5. 05Require two clean rounds before merge

Use cases

  1. 01Iterate on issues raised by Codex PR review
  2. 02Check whether a result is new to this review round
  3. 03Merge PRs with authorization under repo policy

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/lixiaolin94/skills --skill codex-review-loop

After installing, type/codex-review-loopin Claude Code to confirm it loaded.

Bundled filescodex-review-loop.sh

Details

From the project README

Codex Review Loop

A loop for converging a PR against ChatGPT Codex's online GitHub PR review, then merging. There is no hidden infrastructure — just gh, the bundled poll script, and the discipline below.

The mechanical parts (trigger + dual-signal poll + extract findings) are in codex-review-loop.sh. The judgment parts (fixing findings, verifying, deciding to merge) are yours.

Precondition (check first)

  • The repo must have ChatGPT Codex's GitHub PR-review integration enabled (org/repo setting). Reviews trigger on PR open, draft→ready, or a @codex review comment. Bot account: chatgpt-codex-connector[bot]. If the repo isn't connected, this loop cannot work — say so.
  • gh authenticated (gh auth status) and jq installed. Run the script from inside the repo (it auto-detects owner/name via gh repo view).

The loop

Run the script in the background (it sleeps between polls) so you get re-invoked on completion; don't foreground-sleep.

  1. Trigger + poll one round. bash <skill>/codex-review-loop.sh run <PR> posts @codex review (after stamping a UTC baseline) and waits. It prints exactly one verdict line:
    • RESULT=FORMAL_REVIEW id=<rid> ... inline_comments=<n> → Codex found issues; the script also prints the inline findings (FILE: path:line + body).
    • RESULT=CLEAN ... / RESULT=CLEAN_REVIEW ... → no major issues this round.
    • RESULT=TIMEOUT → re-run, or check the PR manually.
  2. If findings: address EACH one. Verify Codex's claim against ground truth before fixing — it can be wrong (e.g. it may assert an API shape the code doesn't have; check the source). Fix the real issue (and prefer fixing the whole class, not just the one instance). Then verify locally (compile / unit tests / lint / API gates — whatever the repo uses) before pushing. Commit, push, and go to step 1 again. A push = new commit = the clean counter resets.
  3. If clean: that's clean #1. Re-trigger once more on the same commit (run <PR> again, no new commit). Codex is non-deterministic — a re-review of the same commit can surface a new issue (observed in practice). Only after two consecutive clean rounds proceed to merge.
  4. Merge (only with the user's authorization for this repo's merge policy): gh pr merge <PR> --merge --delete-branch. Then sync local main.

Why the script polls two signals

Codex reports results two different ways, so polling only one misses half the verdicts:

  • Findings → a formal review (/pulls/<PR>/reviews, state=COMMENTED) plus inline comments, which correlate to the review via pull_request_review_id.
  • Clean → an issue comment (/issues/<PR>/comments) whose body says "Didn't find any major issues".

Both are filtered by bot login and timestamp > the baseline captured at trigger time, so a stale prior review is never mistaken for the new verdict. A bot "Codex is reviewing…" ack is ignored because it doesn't match the clean phrasing.

Discipline that matters (learned the hard way)

  • Two consecutive clean before merge. Single-clean isn't enough; Codex is non-deterministic.
  • Verify before fixing. Treat findings as claims to check, not facts. If a claim is wrong for this codebase, don't blindly "fix" it (you can make a green gate red). Reply/over-ride with evidence or make a robustness improvement that satisfies the underlying concern.
  • Verify before pushing. Each fix should pass the repo's local gates first — don't burn review rounds on compile errors.
  • One concern per round is fine. Late-stage rounds often surface a single P2/P3; converge them.
  • The merge decision is the user's. Confirm the merge policy once; don't auto-merge a repo where that wasn't authorized.

Adapting to another repo

  • Usually nothing to change — repo is auto-detected. If the bot login or clean phrasing differs, edit BOT / CLEAN_RE at the top of the script.
  • Tune maxIters / interval (args 3 & 4 of poll/run) for slower review queues.
  • Merge strategy: swap --merge for --squash/--rebase per the repo's convention.

Comments

Markdown supported