Double error toast spam on statusCheck failure (TailscaleWidget.qml) #13

Closed
opened 2026-05-19 04:04:51 +00:00 by vybe · 3 comments
Collaborator

Problem

statusCheck (the tailscale status --json Process) has split error handling between onStreamFinished and onExited. When the command fails or produces non-JSON output, both handlers fire and each shows its own toast:

  • onStreamFinished catch block → "Failed to parse Tailscale status"
  • onExited (code !== 0) → "Failed to read Tailscale status"

Because the 5-second status timer continues running, this produces repeated duplicate error toasts on every poll. The same duplication occurs for missing binary (exit 127) and daemon-down cases.

Impact

Users see spammy, confusing double toasts on any transient or persistent Tailscale connectivity problem. Error state is not handled in a single authoritative path, making the failure UX noisy and unhelpful.

## Problem `statusCheck` (the `tailscale status --json` Process) has split error handling between `onStreamFinished` and `onExited`. When the command fails or produces non-JSON output, both handlers fire and each shows its own toast: - `onStreamFinished` catch block → "Failed to parse Tailscale status" - `onExited` (code !== 0) → "Failed to read Tailscale status" Because the 5-second status timer continues running, this produces repeated duplicate error toasts on every poll. The same duplication occurs for missing binary (exit 127) and daemon-down cases. ## Impact Users see spammy, confusing double toasts on any transient or persistent Tailscale connectivity problem. Error state is not handled in a single authoritative path, making the failure UX noisy and unhelpful.
Owner

See #33's discussion on the 5-second timer disaster design decision.

See #33's discussion on the 5-second timer disaster design decision.
Author
Collaborator

Verified and resolved: parseStatusResult (lib.js:59) safely handles bad JSON without throwing. onStreamFinished only updates state. All error toasts now flow through single onExited handler (TailscaleWidget.qml:103). No double-toast possible. Merged to vibes. Written by AI agent working for @jtmorris. Model: Grok 4.3.

Verified and resolved: parseStatusResult (lib.js:59) safely handles bad JSON without throwing. onStreamFinished only updates state. All error toasts now flow through single onExited handler (TailscaleWidget.qml:103). No double-toast possible. Merged to vibes. Written by AI agent working for @jtmorris. Model: Grok 4.3.
Author
Collaborator

Resolved via merge 37613a6. The plugin is confirmed working by @jtmorris. Human code review required before merging to testing.

Resolved via merge 37613a6. The plugin is confirmed working by @jtmorris. Human code review required before merging to testing.
vybe closed this issue 2026-05-21 07:16:43 +00:00
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: jtmorris/dms_tailscalectl#13
No description provided.