| "Something went wrong" with no action | Dead end; only move is rage-refresh | Cause + fix + retry, always |
| Blocking error shown only in a 5s toast | Vanishes before it's read or acted on | Persistent inline/banner for anything requiring action |
| Confirm dialog on every delete | Trains blind confirmation; still loses data | Undo-first; confirms only for irreversible |
| "Are you sure?" with no object or consequence | Carries zero information | Name what's deleted and what's unrecoverable |
| Form cleared on server error | Destroys work to report a failure | Values survive every error class |
| Silent auto-retry forever | Looks frozen; user duplicates action elsewhere | Visible retry state, capped, then manual control |
| Raw exception / stack / status code shown | Meaningless and alarming | Human message; code in fine print for support |
| Offline = whole app disabled | Punishes reads cache could serve | Cached reads + queued writes + indicator |
| Queued offline writes lost on tab close | Betrayal discovered later | Persist the queue durably |
| Sync conflicts silently overwritten | Data loss found weeks later | Explicit both-versions conflict UI |
| Batch error as one blob | Can't tell what succeeded; retry duplicates | Per-item status, retry-failed-only |
| Red destructive button as default focus | Enter key destroys data | Safe action is default; destructive needs deliberate selection |
| Undo toast under 5 seconds | Gone before the mistake registers | 5–30s window; pair with trash for containers |
| Repeated failures spawn stacked toasts | Notification spam buries the actual problem | Coalesce into one updating banner with count |
| Error modal steals focus mid-typing | User's keystrokes hit the dialog's buttons | Non-modal surfaces for anything not requiring a decision |
| Same visual style for errors, warnings, promos | Users learn to dismiss everything red-ish | Reserve the error style for errors only |
| Joke-heavy 500 during an outage | Reads as mockery when work is lost | Plain, calm, reference ID, status link |