🌐 US-Proxy
class="logged-out env-production page-responsive" style="word-wrap: break-word;" >
Skip to content

feat(site): rename "Dismiss warnings" to "Mute warnings" and make health callouts dismissible - #27554

Merged
tracyjohnsonux merged 6 commits into
mainfrom
tj/mute-warnings-dismissible-health-callouts
Jul 28, 2026
Merged

feat(site): rename "Dismiss warnings" to "Mute warnings" and make health callouts dismissible#27554
tracyjohnsonux merged 6 commits into
mainfrom
tj/mute-warnings-dismissible-health-callouts

Conversation

@tracyjohnsonux

@tracyjohnsonux tracyjohnsonux commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

Fixes a mismatch between the header button's label and its behavior on the Health pages. Today the button reads Dismiss warnings, which suggests it will close the in-page callout, but it actually toggles whether the health check surfaces in the top-nav status indicator and shows a bell-off icon in the sidebar. The callout itself has no way to be closed.

Changes

  • Rename the toggle to Mute warnings / Unmute warnings (with matching toast copy) and rename the component + file from DismissWarningButton to MuteWarningsButton.
  • Set dismissible on the warning <Alert>s across the Health pages (Access URL, Database, DERP, DERP region, Provisioner Daemons, Websocket, Workspace Proxy) so users can close the callout from the callout itself. Alert already supports this via a built-in close button.
  • Error-severity <Alert>s are intentionally not dismissible: HealthLayout refetches every 30s and reuses the mounted subpage, so allowing dismissal would suppress subsequent (possibly different) error messages until reload. Diagnostics pages should not hide active faults.
  • Align ProvisionerDaemonsPage's warning callout with the other five pages by setting prominent.

Notes

  • Callout dismissal is client-side only (matches Alert's existing useState behavior). Warning <Alert>s are keyed by warning.code, so a dismissed warning reappears on reload/remount but survives a refetch. The mute toggle continues to persist server-side via dismissed_healthchecks.
  • Follow-up filed for a pre-existing UX mismatch: the mute also silently drops error-severity sections from the top-nav banner (Health: "Mute warnings" silently suppresses top-nav banner for error-severity sections #27557). Kept out of scope here per requester.
  • No API or backend changes.

This PR was generated by Coder Agents on behalf of @tracyjohnsonux.

…callouts dismissible

The header button toggles whether error/warning health checks surface in
the top-nav status indicator; it does not dismiss the in-page callout.
Rename it to "Mute warnings" / "Unmute warnings" to reflect what it
actually does, and make the warning/error callouts themselves
dismissible via the Alert component's built-in close button.

Copy link
Copy Markdown
Contributor Author

/coder-agents-review

@coder-agents-review

coder-agents-review Bot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

Review starting...
Requested: 2026-07-27 23:39 UTC by @tracyjohnsonux

deep-review v0.9.0 | Round 4 | 00d134e..c61c76b

Last posted: Round 4, 9 findings (1 P2, 5 P3, 2 Nit, 1 Note), APPROVE. Review

Finding inventory

Finding inventory: PR #27554

Findings

# Sev Status Location Summary Round Reviewer Posted
CRF-1 P2 Author fixed (55d9672) AccessURLPage.tsx:34 Dismissible error Alert masks a changed/active fault; local useState not content-keyed, survives 30s refetch R1 Mafuuu P2, Meruem P2, Hisoka Note Yes
CRF-2 P3 Author accepted R2 (disclosed product call) WebsocketPage.tsx:46 Two divergent close affordances: ephemeral X vs persistent Mute; product decision R1 Pariston P3, Meruem P3, Hisoka Note Yes
CRF-3 P3 Author fixed (a2afadb) MuteWarningsButton.tsx:10 Component/file still named DismissWarningButton after full rename to Mute; collides with new dismiss (Alert X) concept R1 Gon P2, Netero/Hisoka/Mafu-san/Mafuuu/Pariston/Leorio/Nami/Meruem Nit Yes
CRF-4 P3 Author fixed (a2afadb) DERPRegionPage.tsx:81 DERP region drill-down renders same warning callouts without dismissible; missed sibling, contradicts PR coverage claim R1 Nami Yes
CRF-5 P3 Deferred (#27557) MuteWarningsButton.tsx:65 "Mute warnings" also mutes error-severity sections from top-nav banner; pre-existing scope, tracked in #27557 R1 Leorio (orig); R3 panel not escalated Yes
CRF-6 Nit Author fixed (55d9672) DismissWarningButton.tsx:13 why-not-what comment carries load-bearing rationale in three lines of narrative R1 Gon P2 (downgraded) Yes
CRF-7 Nit Author contested; panel closed R3 (defense holds; Alert dismiss is storied, button copy gap pre-existing) MuteWarningsButton.tsx:11 Behavior/copy change ships with no Storybook coverage (FE1); Bisky dissents (shared Alert already tested) R1 Mafu-san P3, Pariston/Netero/Mafuuu/Meruem/Kite Nit/Note, Bisky dissent Yes
CRF-8 P3 Author fixed (description) AccessURLPage.tsx:43 PR description stale after CRF-1/CRF-4: says "warning/error" dismissible (errors intentionally not), omits DERP Region, "reappear on refetch" false for warnings R3 Mafu-san P3, Hisoka P3 Yes
CRF-9 Note Author fixed (c61c76b) ProvisionerDaemonsPage.tsx:44 Warning Alert omits prominent while every other page's warning callout sets it (pre-existing, on a line this PR touches) R3 Nami Yes

Round log

Round 1

Netero-only first pass clean (Nit + Note, P3 floor). Panel of 11 (bisky, hisoka, mafu-san, mafuuu, pariston, gon, leorio, ging-ts, ging-react, nami, meruem + Netero). 1 P2, 4 P3, 2 Nit. ging-ts and ging-react: no findings. Reviewed against d57965e..bd3d7a4.

Round 2 update

BLOCKED. Churn guard: 2 addressed (CRF-1, CRF-6), 1 acknowledged (CRF-2), 2 contested (CRF-5, CRF-7), 2 silent (CRF-3, CRF-4). No panel spawned. Reviewed against d57965e..55d9672.

Round 3 update

PROCEED. Churn guard: 2 addressed (CRF-3 rename, CRF-4 DERPRegionPage dismissible), 2 contested carried (CRF-5, CRF-7). Rename verified clean: no stale DismissWarningButton refs, old file removed, 6 imports updated. Panel re-review of the delta. Reviewed against d57965e..a2afadb.

Round 3 panel findings

Panel of 10 (bisky, hisoka, mafu-san, mafuuu, pariston, gon, leorio, nami, ging-react, kite) + Netero. Fixes verified: CRF-3 rename complete (grep clean, old file gone, 6 imports), CRF-4 DERPRegionPage dismissible added, CRF-1 holds (no error Alert dismissible), CRF-6 comment accurate. New: CRF-8 (P3, stale PR description), CRF-9 (Note, missing prominent). Contested CRF-5 evaluated: 5 reviewers re-raised on a "no-op on warnings / only consumer is getHealthErrors" premise that is empirically false; dismissed drives a 2nd consumer (HealthLayout:164 bell-off, any severity), so "Mute" is accurate and pre-existing scope. Defense holds on merits; not escalated; still needs a ticket or explicit human acceptance for the error-nav scope. CRF-7 closed as Nit (Alert dismiss storied; button-copy gap pre-existing). ging-react: no findings.

Round 4 update

PROCEED. Churn guard: CRF-8 addressed (description rewritten), CRF-9 addressed (prominent added, c61c76b), CRF-5 deferred with ticket #27557. Delta 00d134e..c61c76b (rebased) is one code line: prominent on ProvisionerDaemonsPage warning Alert. Confirming panel.

Round 4 panel result

Panel of 7 (bisky, hisoka, mafu-san, mafuuu, pariston, nami, zoro) + Netero. No findings from any reviewer. All prior fixes verified against current code: CRF-1 holds (4 error Alerts non-dismissible), CRF-3 holds (no stale DismissWarningButton refs, 7 imports), CRF-4 holds (DERPRegionPage dismissible), CRF-6 holds (comment accurate), CRF-8 fixed (description matches diff), CRF-9 fixed (all 7 warning callouts render prominent+dismissible). CRF-2 accepted, CRF-7 closed Nit, CRF-5 deferred (#27557). All 9 findings resolved. APPROVE.

Contested and acknowledged

CRF-2 (P3, WebsocketPage.tsx:46) - two divergent close affordances

  • Finding: The ephemeral callout X and the server-persisted Mute button are two visually similar close gestures with different durability.
  • Author accepted (R2): Disclosed in the PR body, treated as a product call. Not fixing in this PR. After the CRF-1 fix (error alerts no longer dismissible) the two gestures overlap only on warnings, where the persistence gap is less consequential.

CRF-5 (P3, DismissWarningButton.tsx:66) - "Mute warnings" mutes errors

  • Finding: The button toggles dismissed_healthchecks; the cited nav indicator surfaces error-severity sections only, so "Mute warnings" actually mutes errors from the nav.
  • Author defense (R2, contested): Keeping "Mute warnings" per the requester's explicit wording. The nav-indicator vs button-label mismatch is real but pre-existing and broader than this PR's button-vs-callout scope. Offered to file a follow-up (no ticket linked yet). Panel has not yet evaluated the defense.

CRF-7 (Nit, DismissWarningButton.tsx:11) - no Storybook coverage

  • Finding: FE1/site/AGENTS.md ask stories to cover changed component behavior; none added.
  • Author defense (R2, contested): The X behavior lives in the shared Alert component (existing dismiss-banner-btn testid) and this PR only flips a prop; aligns with Bisky's round-1 dissent. Panel has not yet evaluated the defense.
  • Panel closure (R3, Nit): Verified Alert.stories.tsx has four dismissible: true stories (WarningWithDismiss etc.), so the dismiss behavior is storied and the prop-flip needs no new story. The uncovered residue is the button's Mute/Unmute copy and toasts, a pre-existing gap (no story existed under the old name either), low consequence. Netero, Bisky, Hisoka, Mafuuu, Pariston, Kite, Mafu-san all concur it stays a Nit. Bisky's note: the author's "already tested" wording is imprecise (stories render dismissible; whether a play-function clicks the testid is a separate question), but the dissent to keep it a Nit holds.

CRF-5 panel evaluation (R3)

  • Re-raise premise disproved: 5 reviewers (Netero, Hisoka, Mafuuu, Pariston, Nami) re-raised at P3 arguing getHealthErrors (DeploymentBannerView:424) is the only consumer of dismissed, making the button a no-op on warning-severity sections and an error-muter otherwise. Verified against code: dismissed has a second consumer, HealthLayout.tsx:164, which renders a BellOffIcon next to any muted section regardless of severity. So muting a warning section has visible feedback and "Mute" (bell-off metaphor) is accurate; the "no-op on warnings" claim is empirically false.
  • Author defense holds on merits: Leorio (the original finder) and Kite independently found the bell-off consumer and closed the finding; the remaining concern (muting an error-severity section also suppresses it from the top-nav error banner) is pre-existing, identical in scope to the old "Dismiss warnings" label, and not worsened by the rename.
  • Disposition: Not escalated. But the offered follow-up has no linked ticket; under no-agent-accepted-permanence the pre-existing label/nav-scope mismatch needs an explicit human decision: file a ticket or accept it as-is. Stays open pending that.
About deep-review

CRF = Coder Review Finding (P0-P4, Nit, Note)

Reviewer Focus
Bisky tests
Chopper ops/errors
Churn-guard change verification
Ging language modernization
Gon naming
Hisoka edge cases
Killua perf
Kite change integrity
Knov contracts
Knuckle SQL
Komugi flake/determinism
Kurapika security
Law decomposition
Leorio docs
Luffy product
Mafu-san process
Mafuuu contracts
Melody dispatch/pairing
Meruem structural
Nami frontend
Netero mechanical checks
Pariston premise testing
Pen-botter product gaps
Razor verification
Robin duplication
Ryosuke Go arch
Takumi concurrency
Zoro shape

🤖 Managed by Coder Agents.

Copy link
Copy Markdown
Contributor Author

/coder-agents-review

@coder-agents-review

coder-agents-review Bot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Chat: Review posted | View chat
Requested: 2026-07-28 01:26 UTC by @tracyjohnsonux
Spend: $30.98 / $100.00

Review history
  • R1 (2026-07-28): 11 reviewers, 2 Nit, 1 P2, 4 P3, COMMENT. Review
  • R2 (2026-07-28), 2 Nit, 1 P2, 4 P3, COMMENT. Review
  • R3 (2026-07-28): 10 reviewers, 2 Nit, 1 Note, 1 P2, 5 P3, COMMENT. Review
  • R4 (2026-07-28): 7 reviewers, 2 Nit, 1 Note, 1 P2, 5 P3, APPROVE. Review

🤖 Managed by Coder Agents.

@coder-agents-review coder-agents-review Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The rename is clean and complete: no test, e2e, or code path references the old copy, so nothing breaks on the swap, and the mute/unmute verb with the Bell/BellOff icons is a clear metaphor for silencing a notification. The dismissible change reuses the existing Alert close button rather than adding a new primitive. ging-ts and ging-react found nothing. Severity count: 1 P2, 4 P3, 2 Nit across a +30/-21 diff.

The one finding worth a decision before merge is CRF-1: the error callouts are now dismissible, and on a health-diagnostics page a dismissed error stays hidden across the 30s background refetch. The description's "reappear on reload/refetch" is inaccurate for the refetch half, so the stated safety valve does not exist. This needs a human call, not an agent-accepted default.

Hisoka summed up the rest: "I came looking for a fight. Copy renames and a dismissible prop on seven Alerts... Nothing bites."

Process note: the chore: retrigger CI empty commit is permanent history noise; squash it on merge so the log keeps only the commit that says what happened.


site/src/pages/HealthPage/DismissWarningButton.tsx:10

P3 [CRF-3] The component and file are still named DismissWarningButton while every string and internal identifier now says "mute". (Gon P2, Netero/Hisoka/Mafu-san/Mafuuu/Pariston/Leorio/Nami/Meruem Nit)

Renamed: the labels ("Mute warnings"/"Unmute warnings"), the toasts, and the locals (isMuted, muteMutation, unmuteMutation). Unchanged: the exported symbol, the filename, and the six imports.

This PR's thesis is that the label must match the behavior; leaving the component named DismissWarningButton re-creates that mismatch one layer down, and now "dismiss" separately names the Alert X. A reader greps "mute" and finds no component; greps "dismiss" and lands on the mute button. Rename to MuteWarningsButton and update the imports, or file a ticket. Gon rated this P2; I set P3 because it has no runtime effect and the rename is wider than this PR's scope. The server field dismissed_healthchecks is a wire contract and correctly stays; the frontend/API vocabulary split is worth a tracked follow-up.

🤖

site/src/pages/HealthPage/DERPRegionPage.tsx:81

P3 [CRF-4] DERPRegionPage renders the same warning callouts but was left non-dismissible. (Nami)

The region drill-down (reached by clicking a DERP region) maps warnings to <Alert severity="warning" prominent> with a HealthMessageDocsLink action, the identical pattern made dismissible on DERPPage.tsx:162, but has no dismissible.

The PR description lists DERP as covered; the region view is part of DERP and was missed. A user closes a warning on the DERP page, drills into a region, and the same warning is back with no close button. Add dismissible here to match. (Line is outside the diff; this file was not touched.)

🤖

🤖 This review was automatically generated with Coder Agents.

Comment thread site/src/pages/HealthPage/AccessURLPage.tsx Outdated
Comment thread site/src/pages/HealthPage/WebsocketPage.tsx
Comment thread site/src/pages/HealthPage/MuteWarningsButton.tsx
Comment thread site/src/pages/HealthPage/DismissWarningButton.tsx Outdated
Comment thread site/src/pages/HealthPage/MuteWarningsButton.tsx
…trim comment

Address coder-agents-review feedback:
- P2: error <Alert>s were dismissible with local useState. HealthLayout
  refetches every 30s and reuses the mounted subpage, so a dismissed
  error would suppress subsequent (possibly different) error messages
  until reload. Remove dismissible from all severity=error alerts;
  warning alerts stay dismissible.
- Nit: trim the two-instance mutation comment to just the load-bearing
  detail.

Copy link
Copy Markdown
Contributor Author

/coder-agents-review

@coder-agents-review coder-agents-review Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Round 2 is blocked pending a response on two round-1 findings that got no code change and no reply. They were folded into the round-1 review body (their lines were not on the diff), so there was no inline thread to answer, which is likely why they slipped past. The rest of round 1 was handled well.

Verified fixed:

  • CRF-1 (P2): dismissible removed from all four severity="error" health alerts in 55d9672; only warnings remain dismissible. The masking-across-refetch concern is resolved.
  • CRF-6 (Nit): the mutation comment was trimmed to the load-bearing version.

Responses noted and carried to the next round:

  • CRF-2 (P3): acknowledged as a disclosed product call.
  • CRF-5 (P3): contested; "Mute warnings" kept per the requester, with an offer to file a follow-up for the nav-indicator naming. No ticket linked yet.
  • CRF-7 (Nit): contested; skipped per the shared-Alert argument, matching Bisky's dissent.

Blocking (silent: no code change, no response):

  • CRF-3 (P3) DismissWarningButton.tsx:10: the component and file are still DismissWarningButton while every string and internal identifier now says "mute", and "dismiss" now separately names the Alert X. Rename to MuteWarningsButton (updating the six imports), or file a tracked follow-up and say so.
  • CRF-4 (P3) DERPRegionPage.tsx:81: the DERP region drill-down still renders the same warning callouts without dismissible, which contradicts the PR's own claim that DERP is covered. Add dismissible to match DERPPage.tsx, or state why the region view is intentionally excluded.

The panel will not re-review until each of these two is addressed: fix it, file a ticket, or explain why it should not be fixed. A bare "won't fix" is not a resolution; the justification is weighed against the finding's consequence. Push a change or reply on the two points and re-request review.

🤖 This review was automatically generated with Coder Agents.

…uteWarningsButton, dismissible DERP region warnings

Address round-2 coder-agents-review feedback:
- CRF-3 (P3): file/component name still said Dismiss while every string
  and identifier had moved to mute; "dismiss" is now the callout X.
  Rename to MuteWarningsButton and update the six import sites.
- CRF-4 (P3): DERPRegionPage renders the same warning callouts as
  DERPPage. Mark them dismissible to match.

Copy link
Copy Markdown
Contributor Author

/coder-agents-review

Round-2 blockers addressed in a2afadb:

  • CRF-3: Renamed DismissWarningButton -> MuteWarningsButton (file + component + 6 import sites).
  • CRF-4: Added dismissible to warning <Alert>s in DERPRegionPage.tsx so the drill-down matches DERPPage.

@coder-agents-review coder-agents-review Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Round 3 clears the round-2 blockers cleanly. The DismissWarningButton -> MuteWarningsButton rename is complete (no stale references under site/src, old file removed, all six imports updated), CRF-4 added dismissible to the DERPRegionPage warning callout, and the round-2 fixes hold: every error Alert stays non-dismissible (CRF-1) and the mutation comment is accurate (CRF-6). Nami: "The weather is clearing."

Severity this round: 1 new P3 (stale PR description), 1 new Note, plus the two contested findings evaluated. No P0/P1.

On the contested findings, one correction to the record. Five reviewers re-raised CRF-5 ("Mute warnings" mutes errors) arguing the button is a no-op on warning-severity sections because getHealthErrors is the only consumer of dismissed. That premise is wrong: dismissed has a second consumer, HealthLayout.tsx:164, which renders a bell-off icon next to any muted section regardless of severity. So muting a warning is not a no-op, and "Mute" (with the bell/bell-off metaphor) is an accurate, improved label over "Dismiss." Leorio (who first raised CRF-5) and Kite both found this and withdrew the finding. The panel does not escalate CRF-5. What remains is the pre-existing point that muting an error-severity section also drops it from the top-nav error banner; that is a product/copy call the requester made, unchanged by this PR. It stays open only because the offered follow-up has no ticket: please file one or state the mismatch is accepted as-is (a follow-up promise without a ticket is not a resolution). CRF-7 is closed as a Nit; the shared-Alert dismiss is storied and the button-copy gap is pre-existing.

Process note: the PR description now contradicts the shipped code (see CRF-8); update it before squash-merge since it becomes the commit body. The chore: retrigger CI empty commit is still there; squash it.

🤖 This review was automatically generated with Coder Agents.

Comment thread site/src/pages/HealthPage/AccessURLPage.tsx
Comment thread site/src/pages/HealthPage/ProvisionerDaemonsPage.tsx
…allout prominent

Align with the other five Health pages, which already set prominent on
their warning callouts. Addresses coder-agents-review CRF-9.

Copy link
Copy Markdown
Contributor Author

/coder-agents-review

Round-3 items addressed:

Process notes: leaving the retrigger commit alone as it will disappear on squash-merge.

@coder-agents-review coder-agents-review Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Round 4 resolves the last open items. The round-4 delta is a single line (adding prominent to the ProvisionerDaemonsPage warning callout, CRF-9), plus a PR-description rewrite (CRF-8). A panel of seven reviewers plus Netero re-verified the whole change and found nothing new.

All nine findings are resolved:

  • CRF-1 (P2) fixed and holding: the four error-severity Alerts stay non-dismissible, so a dismissed callout can no longer mask an active fault across the 30s refetch.
  • CRF-3 (P3) fixed: DismissWarningButton -> MuteWarningsButton rename is complete (no stale references, old file removed, all seven imports updated).
  • CRF-4 (P3) fixed: DERPRegionPage warning callout is dismissible, matching its siblings.
  • CRF-6 (Nit) fixed: the mutation comment states the behavior it prevents.
  • CRF-8 (P3) fixed: the description now matches the code (warning-only, DERP Region listed, refetch-survival called out, and the intentional no-error-dismiss rationale spelled out).
  • CRF-9 (Note) fixed: all seven warning callouts now render prominent + dismissible consistently.
  • CRF-2 (P3) accepted as a disclosed product call; CRF-7 (Nit) closed; CRF-5 (P3) deferred to #27557 with a linked ticket (a real deferral, not a drop).

The description now honestly documents the durability model: warning dismissal is client-side useState keyed by warning.code, so a dismissed warning survives a refetch and returns on reload/remount. Bisky: "A real gem stays a real gem when the setting is polished and nothing new is set into it." Nothing further from the panel. Approving.

🤖 This review was automatically generated with Coder Agents.

@tracyjohnsonux
tracyjohnsonux enabled auto-merge (squash) July 28, 2026 01:38
@tracyjohnsonux
tracyjohnsonux merged commit 6c91662 into main Jul 28, 2026
30 checks passed
@tracyjohnsonux
tracyjohnsonux deleted the tj/mute-warnings-dismissible-health-callouts branch July 28, 2026 02:56
@github-actions github-actions Bot locked and limited conversation to collaborators Jul 28, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants