/feedback missed a queued draft on first invocation and the draft was lost (a later invocation worked)
Corrected 2026-09-03, shortly after filing. The original report claimed/feedbackdoes not find queued drafts and deletes them. That was generalized from a single observation and is too strong. A later/feedbackin the same session did display a queued draft and handled it correctly. The real behavior is intermittent, and is described accurately below. See the correction comment for what changed.
Environment
- Claude Code 2.1.258, linux x64
- First-party OAuth (
claudeAiOauthin~/.claude/.credentials.json). No custom gateway:ANTHROPIC_BASE_URL,ANTHROPIC_AUTH_TOKEN,ANTHROPIC_API_KEY,CLAUDE_CODE_USE_BEDROCKandCLAUDE_CODE_USE_VERTEXall unset; everysettings.jsonhas an emptyenvblock.
Related but distinct: #89973 covers drafts being un-sendable under custom-gateway auth, where the client legitimately lacks first-party credentials. This is first-party auth, /feedback works on a later invocation, and a draft was lost.
What happened
Timestamps are from the filesystem, single session:
| Time | Event | Observed |
|---|---|---|
| 02:22:43 | SendFeedback call #1 | ~/.claude/feedback/ created; draft written |
| ~02:28 | /feedback run #1 | reported no feedback queued, printed no content — and the draft file was gone afterward (drafts dir empty, mtime 02:28) |
| 02:30:08 | SendFeedback call #2 | draft written; confirmed present on disk immediately after, "status": "queued" |
| 02:35:12 | /feedback run #2 | worked — draft displayed; user discarded it; file removed, which is correct |
So SendFeedback writes drafts correctly every time, and /feedback displays them sometimes. The failing case is the first invocation, and it cost a draft.
The draft JSON is complete when written — "status": "queued" plus request_ids, transcript_ref, cli_version, source_session_id, message_count. Nothing about the file explains why the first read missed it.
The part that matters
Whatever causes the first invocation to miss the draft, the draft should not be removed by a read that reported finding nothing. A draft that was never displayed to the user, never sent, and never explicitly dismissed was deleted. That is the difference between "retry the command" and "the content is gone."
Speculation, clearly labeled
I only have timestamps, not internals. One shape that would fit: the drafts list is snapshotted at session start, so a draft created mid-session isn't visible to the first /feedback in that session; the empty list is then written back, removing the file; and the second draft is visible because the first invocation refreshed the list. I have not verified any of that and it may be entirely wrong.
Reproduce
Uncertain, since it did not reproduce on the second attempt. What I can state:
- Fresh session, first-party auth. Get the model to call
SendFeedback. ls -la ~/.claude/feedback/drafts/— JSON file present,"status": "queued".- Run
/feedbackfor the first time in that session. - In this instance: reported nothing queued, and step 2's file was gone afterward. A second
SendFeedback+/feedbackin the same session then behaved correctly.
If the first-invocation-in-a-session detail is the trigger, that would explain why this is easy to miss.
Expected
/feedbackfinds drafts that exist on disk, on the first invocation as on any other.- Failing that, never delete a draft that was not displayed, sent, or dismissed by the user.
Why this is worth fixing beyond the lost file
SendFeedback returns "the user can review and send it with /feedback." When that path silently fails, the model tells the user the report is filed, the user sees an empty queue, and the draft is destroyed — so the model states something untrue in good faith and nothing reaches Anthropic. That is exactly what happened here: the underlying browser-automation report had to be recovered by reading the JSON off disk and was ultimately filed by hand as a comment on #77670.
This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗