What happened
Every time a thread goes into monitoring or comes out of monitoring (at least every time it comes out of monitoring) i get a notification and notification sound that says the thread was completed, when it obviously was not. it is annoying, i only want a notification when the thread was actually completed
Diagnosis
ThreadNotificationCoordinator (apps/web/src/components/ThreadNotificationCoordinator.tsx, ~L124-139) fires a "Thread completed" notification + completion sound whenever a thread's sidebar status is ready, latestTurn.state === "completed", and latestTurn.completedAt is newer than the last completion it recorded.
resolveSidebarThreadStatus (apps/web/src/components/Sidebar.logic.ts, ~L839-863) returns monitoring while backgroundLiveness === "monitoring" (Monitor tasks / background shells are the only live work). While in that state the coordinator carries the prior completion forward, so the turn that ended with a watch loop still running is "pending" rather than notified.
As soon as the watch loop ends (or wakes the agent), backgroundLiveness clears and the status resolves to ready for at least one shell snapshot before the agent's next turn sets the session back to running. In that snapshot the turn's completedAt is newer than the recorded completion, so the coordinator emits "Thread completed" even though the agent is about to continue.
The "entering monitoring" case is likely the mirror race (session goes idle one snapshot before backgroundLiveness: "monitoring" arrives), but this was not confirmed from logs.
The logic is unchanged on main as of 2026-09-26 (last touch: 315fcca, colors only).
Possible direction: don't treat a monitoring/background-live → ready transition as a new completion unless the thread stays ready (e.g. debounce), or only notify completion when the transition comes from working with no background liveness pending.
Steps to reproduce
- Enable notifications (Settings → Notifications → "Notifications with sound").
- In a Claude thread, have the agent start a Monitor watch loop or background shell and end its turn while it's running (sidebar shows "Monitoring").
- Let the monitor fire / finish so the agent resumes.
- Observe a "Thread completed" notification and sound, while the thread goes straight back to Working.
Not verified whether it also triggers while viewing the thread in the foreground (in-app toast path excludes the active thread, but the sound still plays).
Version
T3 Code Desktop 0.0.43-nightly.20260924.2213 (CLI 0.0.42)
Environment
macOS (Darwin 27.2.0, arm64), Node v26.8.2, desktop app running its bundled local server
Evidence
Diagnosed from source; no relevant log lines captured (provider event log absent on this machine).
Related issues
#10164 also involves the Monitoring status but is about the Monitoring indicator hiding the Compact notification; not a duplicate.
Fix applied or workaround
None applied. Only workaround is lowering notificationMode, which also silences real completions.
Filed by
Claude Code (Claude Opus 5.5) via t3 triage
What happened
Diagnosis
ThreadNotificationCoordinator(apps/web/src/components/ThreadNotificationCoordinator.tsx, ~L124-139) fires a "Thread completed" notification + completion sound whenever a thread's sidebar status isready,latestTurn.state === "completed", andlatestTurn.completedAtis newer than the last completion it recorded.resolveSidebarThreadStatus(apps/web/src/components/Sidebar.logic.ts, ~L839-863) returnsmonitoringwhilebackgroundLiveness === "monitoring"(Monitor tasks / background shells are the only live work). While in that state the coordinator carries the prior completion forward, so the turn that ended with a watch loop still running is "pending" rather than notified.As soon as the watch loop ends (or wakes the agent),
backgroundLivenessclears and the status resolves toreadyfor at least one shell snapshot before the agent's next turn sets the session back torunning. In that snapshot the turn'scompletedAtis newer than the recorded completion, so the coordinator emits "Thread completed" even though the agent is about to continue.The "entering monitoring" case is likely the mirror race (session goes idle one snapshot before
backgroundLiveness: "monitoring"arrives), but this was not confirmed from logs.The logic is unchanged on
mainas of 2026-09-26 (last touch: 315fcca, colors only).Possible direction: don't treat a
monitoring/background-live →readytransition as a new completion unless the thread staysready(e.g. debounce), or only notify completion when the transition comes fromworkingwith no background liveness pending.Steps to reproduce
Not verified whether it also triggers while viewing the thread in the foreground (in-app toast path excludes the active thread, but the sound still plays).
Version
T3 Code Desktop 0.0.43-nightly.20260924.2213 (CLI 0.0.42)
Environment
macOS (Darwin 27.2.0, arm64), Node v26.8.2, desktop app running its bundled local server
Evidence
Diagnosed from source; no relevant log lines captured (provider event log absent on this machine).
Related issues
#10164 also involves the Monitoring status but is about the Monitoring indicator hiding the Compact notification; not a duplicate.
Fix applied or workaround
None applied. Only workaround is lowering
notificationMode, which also silences real completions.Filed by
Claude Code (Claude Opus 5.5) via
t3 triage