diff --git a/web/src/components/ui/toast.tsx b/web/src/components/ui/toast.tsx
index 3d41450..5ccb925 100644
--- a/web/src/components/ui/toast.tsx
+++ b/web/src/components/ui/toast.tsx
@@ -32,21 +32,34 @@ export const toast = {
// Param is `item`, not `toast`, so it doesn't shadow the module's `toast` export.
function ToastItem({ item }: { item: Toast }) {
const dismiss = useToastStore((s) => s.dismiss)
+ const isError = item.tone === 'error'
useEffect(() => {
+ // Error toasts are the primary report that a mutation failed, so they do NOT
+ // auto-dismiss — a user who looked away at second 4 would otherwise lose the
+ // only notice, with nothing to retrieve (#85). Info toasts still time out.
+ if (isError) return
const t = setTimeout(() => dismiss(item.id), 4000)
return () => clearTimeout(t)
- }, [item.id, dismiss])
+ }, [item.id, dismiss, isError])
return (