[BUG] Triage automation closes reproducible bugs without verifying they still exist โ€” proposal: repro-gated closure

Status Closed โ€” not planned
Maintainer reply None cached
Activity 1 comment ยท opened Jul 7, 2026 ยท closed Sep 1, 2026

Preflight Checklist

  • [x] I have searched existing issues and this hasn't been reported yet
  • [x] This is a single bug report (please file separate reports for different bugs)
  • [x] I am using the latest version of Claude Code

What's Wrong?

This repo's triage automation (stale-bot, auto-dedup, auto-lock โ€” comments signed "๐Ÿค– Generated with Claude Code") closes bug reports on metadata (inactivity, similarity), never on ground truth (does the bug still reproduce?). The result: real, reproducible bugs become invisible and eventually unreportable. All evidence below is from a single afternoon (2026-07-07) of checking prior art before filing three reproducible bugs:

1. Inactivity treated as resolution. #62257 ("system prompt becomes stale after /model switch") was closed not_planned on 2026-07-01 for inactivity. We reproduced it live on 2026-07-07 with a single /model command (see #75223 for today's independent report of the same bug). Reporter silence measures reporter attention, not bug existence.

2. Duplicate-sink into locked graves. #47253 (updater deletes running binary) was auto-duped into #18019, which was itself stale-closed not_planned and then auto-locked. The dedup graph now has an absorbing dead state: every future report of this still-live bug funnels toward a thread nobody can comment on. (We had to re-file it as #75355.)

3. Duplicate count destroyed instead of aggregated. The model-identity bug was independently reported at least 6 times (#50714, #59140, #62257, #62521, #73881/#75042, #75223). Six independent discoveries is a priority signal; the automation treats it as noise to delete. A duplicate arriving after the canonical was closed is direct evidence the closure was wrong โ€” it should reopen, not be swept.

4. Closure without cause. "Inactive for too long" is not fixed, not cannot-reproduce, and not a human's resource decision. Of ~10 prior issues we checked matching our three reproducible bugs (#75354, #75355, and the #75223 family), not one was closed as completed โ€” all were not_planned (stale) or duplicate (into locked threads).

What Should Happen?

Repro-gated closure: automation may close only what it can verify is dead. The verifier already exists โ€” the product is an agent that can execute repro steps. Concretely:

  1. Liveness check before stale-closure. Before closing for inactivity, an agent attempts the issue's repro steps on the current release.
  • Reproduces โ†’ keep open, tag confirmed-on-vX.Y.Z, reset the stale clock (machine confirmation replaces reporter activity as the liveness signal).
  • Doesn't reproduce โ†’ close as unverified-fixed with the repro-attempt transcript attached (auditable, reversible).
  • Not automatable (hardware/OS-specific) โ†’ escalate to a human; never auto-close.
  1. Duplicates as signal, not noise. Auto-dedup increments a counter on the canonical issue; N independent reports escalates to human review. A post-closure duplicate auto-reopens the canonical.
  2. No locked sinks. Never lock issues closed as not_planned/stale, or make dedup refuse to target locked/closed issues (mint a fresh canonical instead). The dedup graph must have no absorbing state that renders a live bug unreportable.
  3. Humans own not_planned. Bots gather evidence (repro attempts, dup clustering, version bisection); the decision not to fix a confirmed-reproducible bug is resource allocation and must carry a human's name. Every closure carries a machine-checkable cause: fixed-by:#PR / no-repro-on:vX / declined-by:@human. "Inactive" is never a cause.

Net effect on human load: it decreases โ€” humans stop re-triaging the same rediscovered bug six times and only see the small set of machine-verified-live issues needing a real decision.

Error Messages/Logs

# The lifecycle, reconstructed from the API (state/state_reason):
#62257 [closed/not_planned] 2026-07-01  # reproduced live 6 days later
#62521 [closed/not_planned]
#50714 [closed/not_planned]
#59140 [closed/not_planned]
#40108 [closed/not_planned]  #42125 [closed/not_planned]  #42388 [closed/not_planned]
#47771 [closed/duplicate]    #47253 [closed/duplicate โ†’ #18019 (locked, not_planned)]
# zero closed as "completed"

Steps to Reproduce

  1. Pick any reproducible bug whose reporter stops commenting (e.g. #62257).
  2. Wait for the stale window. Observe closure not_planned with no repro attempt.
  3. Reproduce the bug on the current release. Observe that nothing reconciles the closed state with reality; new reports get auto-duped toward closed/locked threads.

Environment

  • Repo automation as observed on anthropics/claude-code, 2026-07-07
  • Companion reports filed today: #75354 (scratchpad GC), #75355 (updater vs running sessions); #75223 (model identity, open)

The through-line across all of these: a system that writes state must own a reconciliation loop for that state, or the state becomes a lie. The same flaw appears in the product (stale identity blocks, unreaped scratchpads, orphaned version binaries) and in the tracker that triages reports about it.

View original on GitHub โ†—

This issue has 1 comment on GitHub. Read the full discussion on GitHub โ†—