React.memo blocks root.render() re-renders when props are unchanged,
so storeState task updates were invisible to the memoized component.
Switch useStore mock to a subscription model (useState + useEffect)
so notifyStoreUpdate() forces a proper re-render in the expansion test.
- Guard `run.progress` before calling `retainProvisioningProgress` in
`TeamProvisioningService.cleanupRun` — test mocks omit the field,
causing 4 crashes with "Cannot read properties of undefined (reading
'warnings')".
- Invalidate the `TeamConfigReader` list-teams cache immediately after a
successful team launch so `GET /api/teams` returns the fully-created
team (no `pendingCreate`) rather than a 5-second-stale entry from
before `config.json` was written.
- Gate TeamListView dialogs with showCreateDialog/launchDialogOpen
- Gate SchedulesView and ScheduleSection lazy dialogs with dialogOpen
- Fix import order in SchedulesView (import type before lazy constant)
- Add Show raw toggle button to MarkdownViewer rendered view
- Fix react/display-name in DisplayItemList, MarkdownViewer, SessionItem,
SidebarTaskItem, TeamDetailView, TeamListView, KanbanBoard, GlobalTaskList,
MemberCard, TaskRow — all anonymous arrows inside memo() replaced with
named function form
- Fix simple-import-sort violations in TeamDetailView, TeamListView,
SchedulesView, ScheduleSection — static imports moved before lazy() consts
- Gate all lazy dialogs in TeamDetailView by their open flag so dynamic
import() only fires when the dialog is actually opened:
launchDialogOpen, createTaskDialog.open, sendDialogOpen,
selectedTask !== null, reviewDialogState.open
These are the most expensive render components (syntax highlighting, diff
computation) — memoizing them prevents re-renders when parent tool items
toggle expand/collapse or parent chat group updates.