Skip to content

dev-lead: resolve a bot review thread on a maintainer "no change needed" disposition (rebuild of #1799 on #2049's resolver) #2079

Closed

Description

@don-petry

Problem

A bot review thread whose correct answer is "no change needed / false positive" can never be resolved by automation. Under required_review_thread_resolution it blocks merge until a human resolves it by hand (#1743). PR #1799 tried to fix this but was closed as superseded:

#2049 (#2045) adds resolve_deferred_bot_threads. It is a fail-closed resolver: shared listing, a fresh re-read before resolving, marker-based authorship, a retry marker on failure, and it runs before the terminal marker. This issue adds the maintainer no-change case on top of that resolver.

Acceptance criteria

  1. In resolve_deferred_bot_threads, accept a second case: the latest maintainer comment in a bot thread is a "no change needed" disposition (false positive / no change needed / won't fix / not applicable, with negation and question forms rejected).

    • A maintainer is OWNER, MEMBER or COLLABORATOR and the comment carries no <!-- dev-lead / <!-- pr-review-agent marker. Tell maintainer comments apart from dev-lead's by marker, never by login.
    • No newer "required" disposition and no newer bot finding may follow it.
    • That case skips the tracker check. Everything else (fresh re-read, unchanged-thread check, retry marker on failure) is the same as for a deferral.
  2. Carry over from feat: implement issue #1743 — Harness cannot resolve a bot review thread whose correct response is 'no change needed' — false positives block merge permanently #1799's branch (dev-lead/issue-1743-20260913-0436): the pure acv_latest_nochange_disposition, its negation and question regexes, and their bats tests, adapted to the marker-based authorship rule.

  3. acv_latest_maintainer_disposition treats an unreadable timestamp as blocking even when another valid one exists (the small fix from feat: implement issue #1743 — Harness cannot resolve a bot review thread whose correct response is 'no change needed' — false positives block merge permanently #1799).

  4. An agent can never dismiss a finding on its own: dev-lead writing "no change needed" must not resolve a thread. Only the maintainer's statement does (Harness cannot resolve a bot review thread whose correct response is 'no change needed' — false positives block merge permanently #1743 AC2/AC4). Add a test for this.

  5. AC4 must hold for the replies dev-lead really posts (added 2026-10-09 after reviewing PR feat: implement issue #2079 — dev-lead: resolve a bot review thread on a maintainer "no change needed" disposition (rebuild of #1799 on #2049's resolver) #2084). dev-lead's skip notes are free-form replies written by the agent, and most carry no <!-- dev-lead marker (11 of 29 on PR feat: implement issue #2079 — dev-lead: resolve a bot review thread on a maintainer "no change needed" disposition (rebuild of #1799 on #2049's resolver) #2084). A marker-less skip note that says "no change needed" or "false positive" is User + MEMBER + marker-less, so acv_latest_nochange_disposition accepts it as the maintainer's verdict.

    • Enforce authorship in shell, not in the prompt: before either resolver runs, every thread reply the pass created must be attributable to dev-lead (for example, record the reply IDs the pass adds and append a <!-- dev-lead:reply --> marker to any without one).
    • Fail closed on marker-less dev-lead replies posted before that enforcement existed.
    • Tests: a marker-less don-petry / MEMBER reply "No change needed in this pass: …" and "Skipped: this is a false positive …" must return rc 1; a thread whose only no-change comment was posted by the pass itself must stay unresolved; a marker-less don-petry comment the pass did not post must still return rc 0.
    • Details and a reproduction are in the review thread on PR feat: implement issue #2079 — dev-lead: resolve a bot review thread on a maintainer "no change needed" disposition (rebuild of #1799 on #2049's resolver) #2084 at scripts/lib/addressed-claim-verify.sh line 484.
  6. Attribution must be by identity, not by time window (added 2026-10-09 after reviewing 47fac647 on PR feat: implement issue #2079 — dev-lead: resolve a bot review thread on a maintainer "no change needed" disposition (rebuild of #1799 on #2049's resolver) #2084). Stamping every marker-less comment our account created since the pass started also rewrites comments the human maintainer posts during a pass (BOT_USER is the maintainer's account), and a stamped "must be fixed" comment stops counting as a REQUIRED disposition.

    • Stamp only comments the pass itself posted, identified by reply ID recorded at post time. Never edit any other comment. If attribution is unavailable, stamp nothing and disable the no-change path for that pass.
    • The legacy cutoff must come from configuration, with unset meaning "no-change path disabled", so it is switched on only after the release has reached every consumer's channel.
    • Tests: a don-petry comment created inside the pass window that the pass did not post stays byte-identical and still counts as REQUIRED; a top-level comment is never stamped; an unset cutoff resolves nothing on a no-change verdict.
    • Details and a reproduction are in the review thread on PR feat: implement issue #2079 — dev-lead: resolve a bot review thread on a maintainer "no change needed" disposition (rebuild of #1799 on #2049's resolver) #2084 at scripts/dev-lead-fix-reviews.sh line 2997.

Budget guard

Do AC1, AC2 and AC4 first, in one commit with tests. AC3 is a separate small commit. If time runs short, push AC1+AC2+AC4 and file AC3 as a follow-up.

Depends on #2049 being merged.

Status (2026-10-09): PR #2084 implements AC1–AC6 with the no-change path switched off (DEV_LEAD_NOCHANGE_EPOCH is unset everywhere). Switching it on, and closing #1743, is tracked in #2161. Merging PR #2084 does not close #1743.

Activity

  1. added
    bugBug reports
    dev-leadFor dev-lead agent pickup
    and removed
    dev-leadFor dev-lead agent pickup
    on Oct 9, 2026
  2. don-petry commented on Oct 9, 2026

    @don-petry
    CollaboratorAuthor

    Dev-Lead Implementation Plan

    Issue: #2079 — dev-lead: resolve a bot review thread on a maintainer "no change needed" disposition (rebuild of #1799 on #2049's resolver)

    Dependency status

    #2049 (which adds resolve_deferred_bot_threads and scripts/lib/deferred-thread-verify.sh) is still open, not merged. main has no resolve_deferred_bot_threads, so the AC1 wiring can't be built on this branch without pulling #2049's whole diff into this PR. This pass ships only the parts that don't depend on #2049. They live in scripts/lib/addressed-claim-verify.sh, which #2049 doesn't touch, so they won't conflict with it.

    Scope

    Add the pure maintainer no-change classifier (AC2) and its agent-cannot-self-dismiss guarantee (AC4, at the classifier level). Also include the unreadable-timestamp fix (AC3). Defer the AC1 wiring into resolve_deferred_bot_threads until #2049 merges.

    Implementation Checklist

    Tests to Write (tests/dev-lead/unit/test_addressed_claim_verify.bats)

    Test Command

    bats tests/dev-lead/unit/test_addressed_claim_verify.bats (plus the full bats tests/dev-lead/unit/) and bash .dev-lead/scripts/dev-lead-lint.sh

  3. don-petry commented on Oct 9, 2026

    @don-petry
    CollaboratorAuthor

    Dev-Lead: Progress (in progress — not yet durable)

    Provisional. Nothing is pushed yet. The automation posts the authoritative completion record, with the PR number and head SHA, after the push. Treat the notes below as intent, not delivered results.

    Plan Execution (intended)

    Local check output (provisional — not the pushed run)

    test_addressed_claim_verify.bats passes locally. The 20 failures in the whole tests/dev-lead/unit/ suite (gemini/copilot provider and sidecar tests) are identical on unmodified main. dev-lead-lint.sh passes.

    Files touched (this workspace, not yet pushed)

    Notes

    acv_latest_maintainer_disposition (the REQUIRED gate) still skips comments by bot_user login. Since that login is don-petry, the maintainer's own REQUIRED replies are ignored there too. That's the same class of bug as #1799's, but outside this issue's ACs; it's worth a follow-up.

  4. don-petry commented on Oct 9, 2026

    @don-petry
    CollaboratorAuthor

    Dev-Lead: Implementation Complete — PR #2084

    The implementation for issue #2079 is durable: commits are pushed and a pull request is open. This record is backed by verifiable artifacts you can confirm in one click.

    Review happens on the PR. Acceptance criteria and test results are evidenced by the PR's diff and CI checks — not asserted here. If a later stage fails, this claim is retracted in place.

  5. added 2 commits that reference this issue on Oct 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugBug reports

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions