Skip to content

dev-lead fix-review won't act on advisory-bot nitpick threads (green CI + CHANGES_REQUESTED, empty machine findings → status=no-changes → PR stalls on human) #892

Description

@don-petry

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:74agent_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:

  1. 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
  2. Resolve them as acknowledged with a rationale when they're genuine no-ops, or
  3. 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

Metadata

Metadata

Assignees

No one assigned

    Labels

    dev-leadFor dev-lead agent pickup

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions