[BUG] Triage automation closes reproducible bugs without verifying they still exist — proposal: repro-gated closure
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:
- 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-fixedwith the repro-attempt transcript attached (auditable, reversible). - Not automatable (hardware/OS-specific) → escalate to a human; never auto-close.
- 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.
- 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. - 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
- Pick any reproducible bug whose reporter stops commenting (e.g. #62257).
- Wait for the stale window. Observe closure
not_plannedwith no repro attempt. - 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.