Browse Source
Phase 08: Error Display - 1 plan created - 4 tasks defined (3 auto + 1 checkpoint) - Toast notifications in top-right corner - Error overlays on generate nodes - Ready for executionhandoff-20260429-1057
1 changed files with 171 additions and 0 deletions
@ -0,0 +1,171 @@ |
|||||
|
--- |
||||
|
phase: 08-error-display |
||||
|
plan: 01 |
||||
|
type: execute |
||||
|
--- |
||||
|
|
||||
|
<objective> |
||||
|
Improve error visibility with prominent toast notifications and minimal in-node indicators. |
||||
|
|
||||
|
Purpose: When generation fails, users currently can't see the error if a previous output exists. This makes debugging impossible. |
||||
|
Output: Toast notification system in top-right corner (manual dismiss required), expandable to show full error details. Minimal overlay on nodes indicating failure. |
||||
|
</objective> |
||||
|
|
||||
|
<execution_context> |
||||
|
~/.claude/get-shit-done/workflows/execute-phase.md |
||||
|
~/.claude/get-shit-done/references/checkpoints.md |
||||
|
</execution_context> |
||||
|
|
||||
|
<context> |
||||
|
@.planning/PROJECT.md |
||||
|
@.planning/ROADMAP.md |
||||
|
@.planning/STATE.md |
||||
|
@.planning/phases/07-video-connections/07-01-SUMMARY.md |
||||
|
|
||||
|
**Key files:** |
||||
|
@src/components/Toast.tsx |
||||
|
@src/components/nodes/GenerateImageNode.tsx |
||||
|
@src/components/nodes/GenerateVideoNode.tsx |
||||
|
|
||||
|
**Current state:** |
||||
|
- Toast component exists but: auto-dismisses after 4s, positioned bottom-center, no expandable details |
||||
|
- GenerateImageNode shows error only when no outputImage (lines 632-635) |
||||
|
- GenerateVideoNode same pattern (lines 383-386) |
||||
|
- Error overlay pattern established in loading overlay (GenerateImageNode lines 521-542) |
||||
|
- useToast hook available for triggering toasts from anywhere |
||||
|
|
||||
|
**Established patterns:** |
||||
|
- Overlay uses `absolute inset-0 bg-neutral-900/70 rounded flex items-center justify-center` |
||||
|
- Error colors: red-400 (text), red-500 (borders), red-900 (backgrounds) |
||||
|
- Error icon from Toast.tsx (circle with exclamation mark) |
||||
|
</context> |
||||
|
|
||||
|
<tasks> |
||||
|
|
||||
|
<task type="auto"> |
||||
|
<name>Task 1: Update Toast component for error notifications</name> |
||||
|
<files>src/components/Toast.tsx</files> |
||||
|
<action> |
||||
|
Modify Toast.tsx to support the new error notification requirements: |
||||
|
|
||||
|
1. Move position from bottom-center to top-right: |
||||
|
- Change `bottom-6 left-1/2 -translate-x-1/2` to `top-6 right-6` |
||||
|
- Remove translate transform |
||||
|
|
||||
|
2. Add `persistent` option to disable auto-dismiss: |
||||
|
- Add `persistent: boolean` to ToastState interface |
||||
|
- Update show() function to accept `persistent` param (default false) |
||||
|
- Only set auto-dismiss timer when persistent is false |
||||
|
|
||||
|
3. Add `details` for expandable error info: |
||||
|
- Add `details: string | null` to ToastState interface |
||||
|
- Update show() to accept optional details param |
||||
|
- Add `isExpanded: boolean` state |
||||
|
- When details exist, show "Show details" / "Hide details" button |
||||
|
- When expanded, render details in a scrollable pre/code block below message |
||||
|
|
||||
|
4. Visual updates for expanded state: |
||||
|
- Add max-width constraint (max-w-md) |
||||
|
- Details block: bg-black/30 rounded p-2 mt-2 max-h-40 overflow-auto text-xs font-mono |
||||
|
|
||||
|
Keep backward compatibility: existing callers without new params work as before. |
||||
|
</action> |
||||
|
<verify>Import useToast in a test, call show("Test error", "error", true, "Full error details here") and verify toast appears top-right, doesn't auto-dismiss, shows expand button</verify> |
||||
|
<done>Toast positioned top-right, persistent mode works, details expandable, backward compatible</done> |
||||
|
</task> |
||||
|
|
||||
|
<task type="auto"> |
||||
|
<name>Task 2: Add error overlay and toast trigger to GenerateImageNode</name> |
||||
|
<files>src/components/nodes/GenerateImageNode.tsx</files> |
||||
|
<action> |
||||
|
Add error overlay when status is "error" AND outputImage exists: |
||||
|
|
||||
|
1. Import useToast at top of file |
||||
|
|
||||
|
2. Add effect to show toast when error occurs: |
||||
|
- useEffect watching nodeData.status and nodeData.error |
||||
|
- When status changes to "error" and error is not null: |
||||
|
- Call useToast.getState().show("Generation failed", "error", true, nodeData.error) |
||||
|
- This triggers toast with full error in details |
||||
|
|
||||
|
3. Add error overlay inside the outputImage conditional (after line 519, before line 520): |
||||
|
- Similar to loading overlay at lines 521-542 |
||||
|
- Condition: `{nodeData.status === "error" && (` |
||||
|
- Semi-transparent red background: `bg-red-900/70` |
||||
|
- Show error icon (X mark or exclamation) |
||||
|
- Show "Generation failed" text (minimal) |
||||
|
- Optional: "Click toast for details" hint in smaller text |
||||
|
|
||||
|
This replaces the hidden error message. Error in empty state (lines 632-635) can remain as fallback. |
||||
|
</action> |
||||
|
<verify>Set a node to error state with outputImage present, verify overlay appears on node and toast appears top-right with expandable details</verify> |
||||
|
<done>Error overlay visible over previous output, toast triggered with full error details</done> |
||||
|
</task> |
||||
|
|
||||
|
<task type="auto"> |
||||
|
<name>Task 3: Add error overlay and toast trigger to GenerateVideoNode</name> |
||||
|
<files>src/components/nodes/GenerateVideoNode.tsx</files> |
||||
|
<action> |
||||
|
Apply same pattern as Task 2 to GenerateVideoNode: |
||||
|
|
||||
|
1. Import useToast at top of file |
||||
|
|
||||
|
2. Add effect to show toast when error occurs: |
||||
|
- useEffect watching nodeData.status and nodeData.error |
||||
|
- When status changes to "error" and error is not null: |
||||
|
- Call useToast.getState().show("Video generation failed", "error", true, nodeData.error) |
||||
|
|
||||
|
3. Add error overlay inside the outputVideo conditional (after line 315, similar position to loading overlay): |
||||
|
- Condition: `{nodeData.status === "error" && (` |
||||
|
- Semi-transparent red background: `bg-red-900/70` |
||||
|
- Show error icon |
||||
|
- Show "Generation failed" text |
||||
|
|
||||
|
Keep existing error display in empty state (lines 383-386) as fallback. |
||||
|
</action> |
||||
|
<verify>Set a video node to error state with outputVideo present, verify overlay appears and toast triggered</verify> |
||||
|
<done>Error overlay visible over previous video, toast triggered with full error details</done> |
||||
|
</task> |
||||
|
|
||||
|
<task type="checkpoint:human-verify" gate="blocking"> |
||||
|
<what-built>Error notification system with top-right persistent toast and in-node overlays</what-built> |
||||
|
<how-to-verify> |
||||
|
1. Run: npm run dev |
||||
|
2. Open http://localhost:3000 |
||||
|
3. Create a GenerateImage node, run it successfully (so it has an output) |
||||
|
4. Modify the prompt to something that will fail (or disconnect API key temporarily) |
||||
|
5. Run again - verify: |
||||
|
- Red overlay appears on the node with "Generation failed" |
||||
|
- Toast appears in top-right corner |
||||
|
- Toast does NOT auto-dismiss |
||||
|
- Toast has "Show details" button |
||||
|
- Clicking "Show details" reveals full error message |
||||
|
- Clicking X on toast dismisses it |
||||
|
6. Repeat for GenerateVideo node if possible |
||||
|
</how-to-verify> |
||||
|
<resume-signal>Type "approved" to continue, or describe issues to fix</resume-signal> |
||||
|
</task> |
||||
|
|
||||
|
</tasks> |
||||
|
|
||||
|
<verification> |
||||
|
Before declaring phase complete: |
||||
|
- [ ] `npm run build` succeeds without errors |
||||
|
- [ ] Toast appears top-right on error |
||||
|
- [ ] Toast requires manual dismiss (no auto-timeout) |
||||
|
- [ ] Toast details are expandable |
||||
|
- [ ] Error overlay visible on nodes with previous output |
||||
|
- [ ] Existing error display in empty nodes still works |
||||
|
</verification> |
||||
|
|
||||
|
<success_criteria> |
||||
|
|
||||
|
- All tasks completed |
||||
|
- All verification checks pass |
||||
|
- No TypeScript errors |
||||
|
- Error visibility improved: users can see what went wrong even when previous output exists |
||||
|
</success_criteria> |
||||
|
|
||||
|
<output> |
||||
|
After completion, create `.planning/phases/08-error-display/08-01-SUMMARY.md` |
||||
|
</output> |
||||
Loading…
Reference in new issue