Problem
When a PR's CI is fully green but its reviewDecision is CHANGES_REQUESTED solely because an advisory bot (CodeRabbit / Gemini / qodo) left review threads that the fix-review classifies as nitpick-level with no machine "Findings to fix", dev-lead's fix-review returns status=no-changes and the PR sits BLOCKED (CHANGES_REQUESTED) indefinitely. Neither the threads get addressed nor resolved, and the PR is not even needs-human-labeled — a human must hand-fix or manually resolve the threads to unblock the merge.
This is the green-CI sibling of #888 (which covers red required checks with no finding). Same failure signature — silent no-changes that looks 'done' but is actually stuck — but the trigger here is advisory review threads on a green PR, not a self-introduced red check.
Concrete case (2026-07-23)
PR #887 (implementing #886, repo-template re-seed fix):
- CI fully green on head
73c40919 (CodeRabbit, SonarCloud, CodeQL, bats, Graphite all SUCCESS).
- Blocked only by two unresolved CodeRabbit threads, both self-labeled
🔵 Trivial / Quick win:
scripts/seed-repo-template.sh:74 — agent_ref: line not validated by _assert_vform_pins (a real but minor validation-symmetry gap).
tests/test_seed_repo_template_workflows.bats:92 — no test for the _emit_workflow name-validation guard.
- pr-review agent held at CHANGES_REQUESTED; dev-lead's last code commit was the initial implementation ~12h earlier — it never re-engaged on the CodeRabbit threads because the machine "Findings to fix" payload was empty.
- Result: PR stuck; a human hand-fixed both nitpicks + resolved the threads to unblock.
Expected
When a PR is green but CHANGES_REQUESTED, dev-lead's fix loop should either:
- Address the advisory threads even when they carry no structured machine finding — parse the thread bodies (they contain concrete, actionable, often 'quick-win' suggestions) and fix or reply, or
- Resolve them as acknowledged with a rationale when they're genuine no-ops, or
- Escalate to
needs-human naming the specific unresolved threads.
Silent no-changes that leaves the PR CHANGES_REQUESTED with live advisory threads is the worst outcome — it reads as 'done' but is actually blocked on human intervention.
Scope
- In the fix-review loop, treat
reviewDecision == CHANGES_REQUESTED with unresolved advisory-bot threads as a first-class actionable state, even when the structured findings list is empty.
- Distinguish 'nitpick / acknowledge-and-resolve' from 'actionable-fix' from 'needs-human', and take the corresponding action rather than returning
no-changes.
Related
Problem
When a PR's CI is fully green but its
reviewDecisionis CHANGES_REQUESTED solely because an advisory bot (CodeRabbit / Gemini / qodo) left review threads that the fix-review classifies as nitpick-level with no machine "Findings to fix", dev-lead's fix-review returnsstatus=no-changesand the PR sits BLOCKED (CHANGES_REQUESTED) indefinitely. Neither the threads get addressed nor resolved, and the PR is not evenneeds-human-labeled — a human must hand-fix or manually resolve the threads to unblock the merge.This is the green-CI sibling of #888 (which covers red required checks with no finding). Same failure signature — silent
no-changesthat looks 'done' but is actually stuck — but the trigger here is advisory review threads on a green PR, not a self-introduced red check.Concrete case (2026-07-23)
PR #887 (implementing #886, repo-template re-seed fix):
73c40919(CodeRabbit, SonarCloud, CodeQL, bats, Graphite all SUCCESS).🔵 Trivial / Quick win:scripts/seed-repo-template.sh:74—agent_ref:line not validated by_assert_vform_pins(a real but minor validation-symmetry gap).tests/test_seed_repo_template_workflows.bats:92— no test for the_emit_workflowname-validation guard.Expected
When a PR is green but CHANGES_REQUESTED, dev-lead's fix loop should either:
needs-humannaming the specific unresolved threads.Silent
no-changesthat leaves the PR CHANGES_REQUESTED with live advisory threads is the worst outcome — it reads as 'done' but is actually blocked on human intervention.Scope
reviewDecision == CHANGES_REQUESTEDwith unresolved advisory-bot threads as a first-class actionable state, even when the structured findings list is empty.no-changes.Related