Cross-tab realtime broken by SyntaxError in PbRealtimeRecords. The v0.12.1 refactoring removed the IIFE (function() { ... })() but left the orphaned })(); closing in the template. This caused Uncaught SyntaxError: Unexpected token '}' which prevented the ENTIRE module from executing — the EventSource for PocketBase realtime was never created, and no tab received record updates. Removed the orphaned })(); (features/todo/components/realtime.templ).
"Queue + Retry" tab did not navigate in sidebar. The button's data-on:click was @post('/api/todos', {contentType: 'form'}) instead of $sidebarTab = 'queue' — clicking the tab submitted the creation form instead of switching tabs. Fixed to $sidebarTab = 'queue' (features/todo/components/todo_list.templ).
Toast "Step X/6" repeated every 700ms in Durable Workflow.pollRun emitted publishProgress on EVERY poll tick without state deduplication. Added lastStep/lastPhase/lastDetail variables to only emit when state changes (features/todo/handlers/onboarding.go).
Duplicate toast "Step 1/6" when starting workflow.handleStart called publishProgress(1,6,...) manually, and the first pollRun tick published the same state again. Removed publishProgress from handleStart — the poll loop now handles all progress (features/todo/handlers/onboarding.go).
Intermediate steps (3/6, 4/6, 5/6) never appeared in toasts. When the workflow ran fast, the 700ms polling missed intermediate steps. On completed, now retroactively publishes all unseen steps before the final step (features/todo/handlers/onboarding.go).
AI Suggest stuck in infinite loading when LLM not configured.handleSuggestJob returned an error without sending suggest_result with suggestPending: false. Now sends the error result before returning, releasing the spinner (features/todo/handlers/llm_suggest.go).
Connected clients showed "4 online" with 2 tabs. Whiteboard and todo shared the same SSE hub. Stats().Clients counted whiteboard connections as todo clients. Added CountUserClients() that filters by userID != "" (whiteboard registers with ""). broadcastClientCount and handleIndex now use CountUserClients() (internal/queue/ssehub.go, features/todo/handlers/todo_sse.go, features/todo/handlers/todo.go).
Changed
Durable Workflow stepper expanded from 4 to 6 steps. Now shows all workflow steps (1. Greeting, 2. Waiting, 3-5. Creating examples, 6. Finalize), aligned with the DagNats 6-step workflow (features/todo/components/todo_list.templ).
Added
Regression: PbRealtimeRecords without orphan IIFE.TestRealtimeNoOrphanIIFE asserts that the PbRealtimeRecords script block does not contain })(); (features/todo/realtime_propagation_test.go).
Regression: CountUserClients excludes whiteboard.TestSSEHub_CountUserClients_ExcludesEmptyUserID asserts that CountUserClients() only counts clients with non-empty userID (internal/queue/ssehub_test.go).