Problem
The Phase 2.2 composer-busy cutover (chat-store.ts:206-234 comments) was never finished:
chat-screen.tsx:1646 — isComposerLoadingLegacy = isChatRuntimeBusy({...}) computes the legacy 6-signal composition on every render and is never read (grep: declaration only). Dead CPU + reader confusion.
chat-screen.tsx:1654 — isComposerLoading = useChatStore.getState().selectIsComposerBusy(...) reads through .getState(), which does not subscribe. When runPhase/waiting state changes without another render trigger, the composer's enabled/disabled state can go stale — correctness currently depends on incidental re-renders.
chat-screen.tsx:585 — stale comment "Feature flag (default OFF): swap in the drop-in shadcn composer" — ChatComposerShadcn is rendered unconditionally (:3261), old composer no longer imported. Remove comment; delete old composer file if fully unreferenced.
Fix
Delete isComposerLoadingLegacy (and the isChatRuntimeBusy import if unused elsewhere); convert the busy read into a reactive selector useChatStore(s => s.selectIsComposerBusy(...)) or subscribe to the underlying slices. Clean up the stale flag comment + dead composer file.
Found in chat-area audit 2026-06-11.
Problem
The Phase 2.2 composer-busy cutover (
chat-store.ts:206-234comments) was never finished:chat-screen.tsx:1646—isComposerLoadingLegacy = isChatRuntimeBusy({...})computes the legacy 6-signal composition on every render and is never read (grep: declaration only). Dead CPU + reader confusion.chat-screen.tsx:1654—isComposerLoading = useChatStore.getState().selectIsComposerBusy(...)reads through.getState(), which does not subscribe. WhenrunPhase/waiting state changes without another render trigger, the composer's enabled/disabled state can go stale — correctness currently depends on incidental re-renders.chat-screen.tsx:585— stale comment "Feature flag (default OFF): swap in the drop-in shadcn composer" —ChatComposerShadcnis rendered unconditionally (:3261), old composer no longer imported. Remove comment; delete old composer file if fully unreferenced.Fix
Delete
isComposerLoadingLegacy(and theisChatRuntimeBusyimport if unused elsewhere); convert the busy read into a reactive selectoruseChatStore(s => s.selectIsComposerBusy(...))or subscribe to the underlying slices. Clean up the stale flag comment + dead composer file.Found in chat-area audit 2026-06-11.