orca/docs/reference/react-performance-audit.md

62 KiB

React Performance Audit

Status: in progress Started: 2026-05-29 Base commit: b7fe967780 (origin/main, release v1.4.35)

Goal

Scan the full React surface for $perf and $react-useeffect issues, keep coverage evidence here, and land the fixes as many small PRs with explicit merge-risk notes.

This document is the audit ledger. A section is not considered fully scanned until it has:

  1. File inventory checked from the current worktree.
  2. useEffect / useLayoutEffect / useInsertionEffect sites classified.
  3. Perf-sensitive patterns checked: timers, subscriptions, observers, JSON.stringify, storage writes, polling, broad store subscriptions, large list rendering, and render-time derived state.
  4. Each suspicious site dispositioned as "no change", "needs PR", or "covered by PR".
  5. Merge risk recorded for every PR candidate.

Scope

React hook call scan uses all repo *.ts and *.tsx files, then narrows to actual AST hook calls. The React Effect surface found on 2026-05-29 is:

  • src/renderer/src/**
  • mobile/app/**
  • mobile/src/**
  • mobile/packages/expo-two-way-audio/src/hooks.ts

Comment-only mentions outside those paths were ignored.

Initial inventory:

Metric Count
Repo *.ts / *.tsx files 3,011
Files with real Effect hook calls 285
Effect hook call sites 970
useLayoutEffect / useInsertionEffect call sites 44
Empty dependency arrays 111
Effects with cleanup returns 472
Effects with subscription/listener/observer shape 170
Effects with timer or animation-frame shape 128
Effects with JSON.stringify shape 2
Set-state-shaped Effects needing manual review 270
useMemo call sites in React scope 633
useCallback call sites in React scope 1,415
useSyncExternalStore call sites in React scope 8

Coverage Ledger

Current count after low-risk PRs #3038, #3041, #3042, #3044, #3051, #3052, #3053, #3054, #3055, #3056, #3058, #3059, #3060, #3062, #3063, #3064, #3065, #3066, #3067, #3068, #3069, #3083, #3087, #3091, #3100, #3104, #3122, #3160, #3164, and #3166: 923 Effect hook call sites.

Open medium-risk PRs #3070, #3073, #3077, #3089, #3093, #3102, #3108, #3110, #3112, #3118, #3124, #3126, #3128, #3130, #3132, #3134, #3142, #3144, #3146, #3148, #3150, #3152, #3154, #3170, and #3176 each project to 922 Effect hook call sites on the current merged baseline; open medium-risk PRs #3097, #3106, #3116, #3120, #3136, #3138, and #3180 each project to 921; open medium-risk PRs #3114 and #3168 each project to 920; open medium-risk PRs #3095 and #3140 each project to 919; open medium-risk PR #3079 projects to 913; open high-risk PR #3157 projects to 922; open high-risk PR #3075 projects to 919; and open high-risk PR #3081 projects to 915. These are not counted in the merged baseline until reviewed and merged.

Area Files / signal Scan status Notes
Renderer app shell src/renderer/src/App.tsx, root components Inventory complete, manual review in progress Confirmation dialog active request mirror covered by #3091; onboarding settings detour reset covered by #3122; quick workspace agent selection repair covered by #3148; Cmd+J selection repair covered by #3164. Continue checking global listeners, beforeunload, media-query, and active-tab repair.
Terminal / PTY components/Terminal.tsx, components/terminal-pane/**, components/terminal/** Inventory complete, manual review pending Mobile driver overlay collapse repair covered by #3170. High-risk area: xterm lifecycle, scrollback, remote/mobile parity, focus, WebGL, resize.
Renderer mobile page components/mobile/** Inventory complete, manual review in progress Mobile pairing page stage repair covered by #3180. Continue checking QR generation, mobile-page IPC, and paired-device polling.
Browser pane components/browser-pane/** Inventory complete, manual review in progress Highest Effect density: 62 sites in BrowserPane.tsx. Browser ref mirrors covered by #3081; continue with driver sync, address bar derived state, find state, webview lifetime.
Editor / markdown / Monaco components/editor/** Inventory complete, manual review in progress Untitled rename reset covered by #3083; copy feedback timers covered by #3097; combined diff local state repairs covered by #3120. Check editor model cleanup, preview scroll restore, search debounce, generated decorations.
Sidebar / worktrees components/sidebar/** Inventory complete, manual review in progress Orca hook trust checkbox reset covered by #3089; delete dialog one-shot checkbox reset covered by #3134; Add Repo clone destination auto-fill covered by #3150; sidebar live-width mirror covered by #3160; worktree selection pruning covered by #3166. Continue with drag/drop global listeners and kanban pointer flows.
Right sidebar / source control components/right-sidebar/** Inventory complete, manual review pending Check polling, PR checks, file explorer watch/reveal, source-control local resets. Git provider compatibility required.
Settings components/settings/** Inventory complete, manual review in progress Repository hook local editor visibility covered by #3093; lazy section mounted-state bookkeeping covered by #3128; browser home/Kagi draft sync covered by #3136; general auto-save/Open In draft sync covered by #3138; Source Control AI instruction drafts covered by #3140; notification volume draft sync covered by #3142; repo Source Control AI override draft sync covered by #3144; Quick Commands add intent covered by #3146; Mobile QR polling count capture covered by #3152; integration preflight status derivation covered by #3154; SSH reset-relay dialog cleanup covered by #3157; diagnostics bundle cleanup ref mirror covered by #3176. Continue with draft mirrors while keeping SSH and cross-platform settings behavior intact.
Automations components/automations/** Inventory complete, manual review in progress Combobox open-focus Effects covered by #3100; run-history selection repair covered by #3104; external run-table selection repair covered by #3102; detail-page selection resets covered by #3106; create-from branch search reset covered by #3132. Continue with draft defaulting, polling, and completion detection.
Issue, PR, task pages TaskPage.tsx, PullRequestPage.tsx, GitHubItemDialog.tsx, GitLabItemDialog.tsx, Linear components Inventory complete, manual review in progress Linear estimate input sync covered by #3108; Linear sub-issue list sync covered by #3110; GitHub project date draft sync covered by #3112; GitHub reviewer-picker active index covered by #3114; GitHub project column state covered by #3116; GitLab comment draft reset covered by #3124; Linear title/description draft sync covered by #3130. Continue large-file scan with separate GitHub, GitLab, Linear, and generic review behavior.
Onboarding / feature wall components/onboarding/**, components/feature-wall/** Inventory complete, manual review in progress Select portal root Effects covered by #3087; tour visited-marker Effects covered by #3095. Continue with demo timers and telemetry while avoiding telemetry semantic changes.
Status, dashboard, activity components/status-bar/**, components/dashboard/**, components/activity/**, components/pet/** Inventory complete, manual review in progress Status-bar account menu close reset covered by #3051; pet overlay size clamp covered by #3118; Activity selected-thread repair covered by #3126; Workspace Space row-state repairs covered by #3168. Check interval sharing, retained agent state, activity terminal portals.
Mobile app routes mobile/app/** Inventory complete, manual review pending 79 Effects, including large tasks.tsx and session route. Remote-client parity required.
Mobile shared source mobile/src/** Inventory complete, manual review pending Browser pane, transport client context, dictation hook, bottom drawer, new worktree modal.
Expo two-way audio hook mobile/packages/expo-two-way-audio/src/hooks.ts Inventory complete, manual review pending Single Effect plus useSyncExternalStore; verify native subscription cleanup.
Tests with hook mocks *.test.ts, *.test.tsx, e2e comments Inventory complete, manual review pending Do not count comment-only mentions as app Effect sites; update tests beside behavior changes.

Current Findings Queue

These are candidate batches, not final conclusions. Each item needs code inspection before implementation.

Candidate PR Area Symptom / wasted work to prove Likely files Merge risk
PR A Small controlled-input resets Extra render pass from Effects that mirror one prop into local draft state. BrowserAddressBar.tsx covered by #3038; continue with BrowserFind.tsx, PdfFind.tsx, selected settings draft fields Low to medium
PR B Settings draft hydration Multiple independent Effects mirror persisted settings into draft state. components/settings/** Medium
PR C Browser pane Effect cluster Large Effect cluster may mix external webview sync, derived UI state, and event-specific state repair. BrowserPane.tsx, useGrabMode.ts, browser tabs High
PR D Terminal tab repair and lifecycle Effects repair active terminal/browser tab state after render; could cause extra render and focus churn. Terminal.tsx, useTerminalTabs.ts, TerminalPane.tsx High
PR E Right-sidebar polling and source-control state repair PR checks, branch snapshots, file explorer watch/reveal may repeat work after unrelated state changes. ChecksPanel.tsx, SourceControl.tsx, useGitStatusPolling.ts, file explorer hooks High
PR F Mobile route monoliths Mobile task/session routes have many chained Effects and timer/refetch patterns. mobile/app/h/[hostId]/tasks.tsx, mobile/app/h/[hostId]/session/[worktreeId].tsx High
PR G Mobile shared components Visible/open Effects reset modal/drawer state and browser address state. mobile/src/components/**, mobile/src/browser/MobileBrowserPane.tsx Medium
PR H Editor search/preview/decorations Debounce and scroll-restore Effects may be legitimate external sync but need cleanup/count review. components/editor/** Medium to high
PR I Feature wall/onboarding demos Animation/demo Effects can often move to event handlers or tighter custom hooks. components/feature-wall/**, components/onboarding/** Low to medium
PR J GitHub filter controls Extra render pass from mirroring parsed reviewer qualifier into local mode state. PRFilterDropdowns.tsx covered by #3041 Low
PR K Sidebar project filter Extra render pass from mirroring the first filtered repo into command selection state. SidebarFilter.tsx covered by #3042 Low
PR L Diff note edit draft Extra render pass from mirroring saved note body into edit draft while not editing. DiffCommentCard.tsx covered by #3044 Low
PR M Status-bar account menus Extra render pass from closing Claude/Codex account submenus in Effects after the provider menu closes. StatusBar.tsx covered by #3051 Low
PR N Browser tab favicon fallback Extra render pass from resetting failed favicon state in an Effect after tab favicon identity changes. BrowserTab.tsx covered by #3052 Low
PR O Workspace title rename draft Redundant draft sync Effect runs while the inline title rename input is not mounted. WorktreeTitleInlineRename.tsx covered by #3053 Low
PR P Feature-wall tour static substep repair Three no-op Effects scan static step arrays and repair ids that are only written from those arrays. FeatureWallTourSurface.tsx covered by #3054 Low
PR Q Repo combobox mount-open state Mount-only auto-open path uses an Effect and ref guard instead of initializing state from the prop. RepoCombobox.tsx covered by #3055 Low
PR R Quick Open query reset Extra render pass from clearing the Quick Open input after the dialog opens. QuickOpen.tsx covered by #3056 Low
PR S Project group dialog open resets Extra render pass from seeding name/delete dialog local state after the dialog opens. ProjectGroupNameDialog.tsx, ProjectGroupDeleteDialog.tsx covered by #3058 Low
PR T Onboarding agent fallback disclosure Extra render pass from opening the fallback agent list when a selected agent first appears there. AgentStep.tsx covered by #3059 Low
PR U Feature-wall tour workflow resets Four local reset Effects run after workflow changes or close instead of in the selection/close path. FeatureWallTourSurface.tsx covered by #3060 Low
PR V Workspace board selection pruning Local kanban selection is repaired in an Effect after the drawer closes or board rows change. use-workspace-kanban-selection.ts covered by #3062 Low
PR W Workspace board column resize Two mirror Effects sync the latest commit callback and external committed width after render. use-workspace-kanban-column-resize.ts covered by #3063 Low
PR X Terminal quick-command dialog draft Dialog draft and agent preset search are reset in an Effect after the dialog opens or retargets. TerminalQuickCommandDialog.tsx covered by #3064 Low
PR Y Onboarding notification settings ref A ref mirror Effect keeps notification handlers pointed at the latest settings. NotificationStep.tsx covered by #3065 Low
PR Z Onboarding agent-selection ref mirrors Five ref mirror Effects keep stable onboarding handlers pointed at latest selection/detection snapshots. use-onboarding-flow.ts covered by #3066 Low
PR AA Workspace board drag ref mirrors Area-selection and card-drag pointer handlers receive latest board callbacks through Effect-updated refs. use-workspace-kanban-area-selection.ts, use-workspace-kanban-card-pointer-drag.ts covered by #3067 Low
PR AB Feature-wall tour telemetry refs Close telemetry reads source/depth payload inputs through Effect-updated refs. use-feature-wall-tour-telemetry.ts covered by #3068 Low
PR AC Onboarding persisted theme ref The theme cleanup ref mirrors the latest persisted setting through an Effect. use-onboarding-flow.ts covered by #3069 Low
PR AD Terminal window blur restart snapshot A mount-only Effect rewrites the same startup blur snapshot already captured by the lazy ref initializer. TerminalWindowSection.tsx covered by #3070 Medium
PR AE New-workspace composer note ref A note ref mirror Effect runs after each note edit so stable PR/MR selection callbacks can read latest text. useComposerState.ts covered by #3073 Medium
PR AF Source-control selection ref mirrors Four ref mirror Effects keep stable source-control row handlers pointed at latest selection inputs. useSourceControlSelection.ts covered by #3075 High
PR AG Notebook cell editor callback refs A ref mirror Effect keeps embedded Monaco save/deactivate handlers pointed at latest callbacks. IpynbViewer.tsx covered by #3077 Medium
PR AH Rich markdown editor ref mirrors Nine ref mirror Effects keep stable ProseMirror/menu handlers pointed at latest editor UI state. RichMarkdownEditor.tsx covered by #3079 Medium
PR AI Browser pane ref mirrors Eight ref mirror Effects keep browser/webview callbacks and latest tab state available to stable handlers. BrowserPane.tsx, useGrabMode.ts covered by #3081 High
PR AJ Untitled markdown rename draft reset Save-as dialog draft fields reset in an Effect after open instead of before the first open paint. UntitledFileRenameDialog.tsx covered by #3083 Low
PR AK Onboarding/feature-wall select portal roots Two mount Effects query the active overlay/dialog root only to keep select menus above fullscreen surfaces. NotificationStep.tsx, AiCommitPrSettingsCard.tsx covered by #3087 Low
PR AL Orca hook trust dialog checkbox reset The "always trust" checkbox resets after open, leaving one possible paint with the previous decision. OrcaYamlTrustDialog.tsx covered by #3089 Medium
PR AM Confirmation dialog active request mirror Active confirmation request was mirrored into local state/ref in an Effect, adding a render pass per request. confirmation-dialog.tsx covered by #3091 Low
PR AN Repository hook local editor visibility The local hook script editor was revealed by an Effect after persisted local script content arrived. RepositoryHooksSection.tsx covered by #3093 Medium
PR AO Feature-wall tour visited markers Four Effects marked visible workflows/substeps as visited after render instead of in the open/select/continue transitions. FeatureWallTourSurface.tsx covered by #3095 Medium
PR AP Editor copy feedback timers Copy success indicators started their auto-clear timers in Effects after render rather than in the copy handlers. EditorPanel.tsx, MarkdownPreview.tsx covered by #3097 Medium
PR AQ Combobox open focus Four comboboxes focused search inputs and seeded cmdk highlight state in Effects after opening. AgentCombobox.tsx, RepoCombobox.tsx, WorkspaceCombobox.tsx, CreateFromPicker.tsx covered by #3100 Low
PR AR Automation run-table selection repair External automation run selection was repaired in an Effect after the visible run page changed. ExternalAutomationRunTable.tsx covered by #3102 Medium
PR AS Automation run-history selection repair Run-history row selection was repaired in an Effect after the automation run list changed. AutomationRunHistory.tsx covered by #3104 Low
PR AT Automation detail-page selection resets Internal and external automation run detail pages were cleared in Effects after selected automation/external keys changed. AutomationsPage.tsx covered by #3106 Medium
PR AU Linear estimate input sync Linear custom estimate input was mirrored from the issue estimate in an Effect while the popover was closed. LinearItemDrawer.tsx covered by #3108 Medium
PR AV Linear sub-issue list sync Linear sub-issue rows were mirrored from the selected issue in an Effect so optimistic creates could append local rows. LinearIssueWorkspace.tsx covered by #3110 Medium
PR AW GitHub project date draft sync GitHub Project date cells mirrored the source field value into local input draft state in an Effect. ProjectCell.tsx covered by #3112 Medium
PR AX GitHub reviewer picker active index Three GitHub review request pickers reset active keyboard selection in Effects after query or row-count changes. PullRequestPage.tsx, GitHubItemDialog.tsx, TaskPage.tsx covered by #3114 Medium
PR AY GitHub Project column state Project view column visibility and width preferences were reloaded in Effects after project/view scope changes. ProjectViewList.tsx covered by #3116 Medium
PR AZ Pet overlay size clamp Pet overlay position was repaired in an Effect after the persisted overlay size changed. PetOverlay.tsx covered by #3118 Medium
PR BA Combined diff local state repairs File-tree highlight and clear-notes dialog state were repaired in Effects after diff entry or note-count changes. CombinedDiffViewer.tsx covered by #3120 Medium
PR BB Onboarding settings detour reset The App-root onboarding detour flag was cleared in an Effect after Settings navigation or onboarding eligibility changed. App.tsx covered by #3122 Low
PR BC GitLab comment draft reset The GitLab MR/issue comment draft was cleared in an Effect after the selected sheet item changed. GitLabItemDialog.tsx covered by #3124 Medium
PR BD Activity selected-thread repair Activity selected thread state was cleared in an Effect after retained agent/tab rows changed. ActivityPrototypePage.tsx covered by #3126 Medium
PR BE Settings lazy-section mounted state Settings remembered newly needed lazy sections in an Effect after search/navigation changed the visible set. Settings.tsx covered by #3128 Medium
PR BF Linear title/description draft sync Linear issue title and description drafts were synced from source issue data in an Effect after item or field updates. LinearIssueTextEditor.tsx covered by #3130 Medium
PR BG Automations create-from branch search Create-from branch search query/results were cleared in an Effect after the selected repo changed. CreateFromPicker.tsx covered by #3132 Medium
PR BH Delete dialog one-shot confirmation The delete-workspace "don't ask again" checkbox was reset in an Effect after the dialog closed. DeleteWorktreeDialog.tsx covered by #3134 Medium
PR BI Browser settings text drafts Browser home-page and Kagi session-link drafts were synced from persisted settings in Effects after source changes. BrowserPane.tsx, KagiSessionLinkForm.tsx covered by #3136 Medium
PR BJ General settings drafts Auto-save delay and Open In launcher drafts were synced from persisted settings in Effects after source changes. GeneralPane.tsx covered by #3138 Medium
PR BK Source Control AI instruction drafts Commit-message, pull-request, and branch-name instruction drafts plus parent discard reset were synchronized in Effects. CommitMessageAiPane.tsx covered by #3140 Medium
PR BL Notification volume draft Notification custom-sound volume draft and latest-settings ref were synchronized in an Effect after settings changes. NotificationsPane.tsx covered by #3142 Medium
PR BM Repo Source Control AI override draft Repo-specific Source Control AI override draft was synchronized from persisted repo settings in an Effect after source changes. RepositorySourceControlAiSection.tsx covered by #3144 Medium
PR BN Quick Commands add intent Quick Commands add-dialog deep-link intent opened from a settings signal in an Effect after the pane rendered. QuickCommandsPane.tsx covered by #3146 Medium
PR BO Quick workspace agent selection Quick-create agent override was repaired in an Effect after detection or disabled-agent settings invalidated it. NewWorkspaceComposerModal.tsx, quick-workspace-agent-selection.ts covered by #3148 Medium
PR BP Add Repo clone destination default Clone destination was auto-filled in an Effect after entering the local clone step or after settings hydration. AddRepoDialog.tsx, clone-defaults.ts covered by #3150 Medium
PR BQ Mobile QR pairing poll count The paired-device count used to start QR polling was captured in an Effect after the QR data URL rendered. MobilePane.tsx covered by #3152 Medium
PR BR Integrations preflight status mirrors Source-host integration statuses and account labels were mirrored from preflight store state in an Effect after Settings rendered. IntegrationsPane.tsx, integrations-pane-status.ts covered by #3154 Medium
PR BS SSH reset-relay dialog cleanup Pending reset-relay confirmation was cleared in an Effect after the selected target began connecting or reconnecting. SshTargetDestructiveActions.tsx, ssh-target-action-state.ts covered by #3157 High
PR BT Sidebar live-width mirror Sidebar root mirrored the committed width into the live drag CSS variable in a second passive Effect. components/sidebar/index.tsx covered by #3160 Low
PR BU Cmd+J selected-row repair The jump palette repaired selected row state in an Effect after query or result-list changes. WorktreeJumpPalette.tsx, worktree-palette-create-action.test.ts covered by #3164 Low
PR BV Sidebar selected-worktree pruning The sidebar pruned selected worktree ids in an Effect after filters or grouping hid selected rows. WorktreeList.tsx covered by #3166 Low
PR BW Workspace Space row-state repairs The space manager repaired inspected row, selected ids, and treemap zoom in Effects after scan rows changed. WorkspaceSpaceManagerPanel.tsx, workspace-space-presentation.ts covered by #3168 Medium
PR BX Mobile driver overlay collapse reset The terminal mobile-driver overlay re-expanded from collapsed chip mode in an Effect after driver changes. MobileDriverOverlay.tsx, mobile-driver-overlay-collapse.ts covered by #3170 Medium
PR BY Diagnostics bundle cleanup ref The retained diagnostics bundle id was mirrored into a cleanup ref by a passive Effect after bundle creation. PrivacyDiagnosticsSection.tsx covered by #3176 Medium
PR BZ Mobile pairing page stage repairs Mobile page polling flipped from QR flow to paired summary, then reset the paired-view polling baseline, in two follow-up Effects. MobilePage.tsx, mobile-page-stage.ts covered by #3180 Medium

Merge Risk Scale

Risk Criteria Required verification
Low Isolated local UI state, no persistence, no IPC, no terminal/browser/source-control behavior. Targeted unit test if available plus pnpm run typecheck:web.
Medium Settings, editor UI, mobile local UI, or state persisted per workspace but no transport protocol changes. Targeted tests plus manual interaction or focused Playwright/Electron check when UI behavior changes.
High Terminal/PTY, browser webview, source control, mobile remote-client, SSH, polling, persistence, or provider behavior. Targeted tests, pnpm run typecheck:web, and Electron or mobile/manual parity evidence as appropriate.

PR Log

PR Branch Area Risk Status Evidence
#3038 nwparker/react-perf Audit ledger plus browser address bar top-suggestion mirror Effect removal Low Merged pnpm exec oxlint src/renderer/src/components/browser-pane/BrowserAddressBar.tsx; pnpm run typecheck:web.
#3041 nwparker/react-perf-pr-filter PR reviewer filter mode derived from parsed query plus explicit user override Low Merged pnpm exec oxlint src/renderer/src/components/github/PRFilterDropdowns.tsx; pnpm run typecheck:web.
#3042 nwparker/react-perf-sidebar-filter Sidebar project filter command selection derived from filtered repos Low Merged pnpm exec oxlint src/renderer/src/components/sidebar/SidebarFilter.tsx; pnpm run typecheck:web.
#3044 nwparker/react-perf-low-risk-2 Diff note card removes saved-body-to-draft mirror Effect Low Merged pnpm exec oxlint src/renderer/src/components/diff-comments/DiffCommentCard.tsx; pnpm run typecheck:web.
#3051 nwparker/react-perf-low-risk-3 Status-bar account submenus collapse in provider menu open-change handlers Low Merged pnpm exec oxlint src/renderer/src/components/status-bar/StatusBar.tsx; pnpm run typecheck:web.
#3052 nwparker/react-perf-low-risk-4 Browser tab favicon failure reset happens during render for new favicon IDs Low Merged pnpm exec oxlint src/renderer/src/components/tab-bar/BrowserTab.tsx; pnpm run typecheck:web.
#3053 nwparker/react-perf-low-risk-5 Inline workspace-title rename removes inactive draft sync Effect Low Merged pnpm exec oxlint src/renderer/src/components/sidebar/WorktreeTitleInlineRename.tsx; pnpm run typecheck:web.
#3054 nwparker/react-perf-low-risk-6 Feature-wall tour removes static substep id repair Effects Low Merged pnpm exec oxlint src/renderer/src/components/feature-wall/FeatureWallTourSurface.tsx; pnpm run typecheck:web.
#3055 nwparker/react-perf-low-risk-7 Repo combobox initializes mount-open state without an Effect Low Merged pnpm exec oxlint src/renderer/src/components/repo/RepoCombobox.tsx; pnpm run typecheck:web.
#3056 nwparker/react-perf-low-risk-8 Quick Open clears its query on the open edge without a reset Effect Low Merged pnpm exec oxlint src/renderer/src/components/QuickOpen.tsx; pnpm run typecheck:web.
#3058 nwparker/react-perf-project-group-dialogs Project group dialogs reset local open-state during render Low Merged pnpm exec oxlint src/renderer/src/components/sidebar/ProjectGroupDeleteDialog.tsx src/renderer/src/components/sidebar/ProjectGroupNameDialog.tsx; pnpm run typecheck:web.
#3059 nwparker/react-perf-agent-step-latch Onboarding agent fallback disclosure latch updates during render Low Merged pnpm exec oxlint src/renderer/src/components/onboarding/AgentStep.tsx; pnpm run typecheck:web.
#3060 nwparker/react-perf-feature-tour-resets Feature-wall tour reset state moves into workflow/close transitions Low Merged pnpm exec oxlint src/renderer/src/components/feature-wall/FeatureWallTourSurface.tsx; pnpm run typecheck:web.
#3062 nwparker/react-perf-kanban-selection Workspace board selection pruning moves out of an Effect Low Merged pnpm exec oxlint src/renderer/src/components/sidebar/use-workspace-kanban-selection.ts; pnpm run typecheck:web.
#3063 nwparker/react-perf-kanban-column Workspace board column width mirror Effects move to render-time synchronization Low Merged pnpm exec oxlint src/renderer/src/components/sidebar/use-workspace-kanban-column-resize.ts; pnpm run typecheck:web.
#3064 nwparker/react-perf-quick-command-dialog Terminal quick-command dialog resets draft state during render Low Merged pnpm exec oxlint src/renderer/src/components/terminal-quick-commands/TerminalQuickCommandDialog.tsx; pnpm run typecheck:web.
#3065 nwparker/react-perf-notification-step-ref Onboarding notification settings ref mirror moves out of an Effect Low Merged pnpm exec oxlint src/renderer/src/components/onboarding/NotificationStep.tsx; pnpm run typecheck:web.
#3066 nwparker/react-perf-onboarding-agent-refs Onboarding agent-selection ref mirrors move out of Effects Low Merged pnpm exec oxlint src/renderer/src/components/onboarding/use-onboarding-flow.ts; pnpm exec vitest run --config config/vitest.config.ts src/renderer/src/components/onboarding/agent-picked-payload.test.ts; pnpm run typecheck:web.
#3067 nwparker/react-perf-kanban-drag-refs Workspace board drag ref mirrors move out of Effects Low Merged pnpm exec oxlint src/renderer/src/components/sidebar/use-workspace-kanban-area-selection.ts src/renderer/src/components/sidebar/use-workspace-kanban-card-pointer-drag.ts; pnpm exec vitest run --config config/vitest.config.ts src/renderer/src/components/sidebar/use-workspace-kanban-card-pointer-drag.test.ts src/renderer/src/components/sidebar/workspace-kanban-area-selection.test.ts; pnpm run typecheck:web.
#3068 nwparker/react-perf-feature-wall-telemetry-ref Feature-wall tour telemetry ref mirror moves out of an Effect Low Merged pnpm exec oxlint src/renderer/src/components/feature-wall/use-feature-wall-tour-telemetry.ts; pnpm exec vitest run --config config/vitest.config.ts src/renderer/src/components/feature-wall/use-feature-wall-tour-telemetry.test.ts; pnpm run typecheck:web.
#3069 nwparker/react-perf-onboarding-theme-ref Onboarding persisted theme ref mirror moves out of an Effect Low Merged pnpm exec oxlint src/renderer/src/components/onboarding/use-onboarding-flow.ts; pnpm run typecheck:web.
#3070 nwparker/react-perf-terminal-window-ref Terminal window blur startup snapshot removes redundant mount Effect Medium Open pnpm exec oxlint src/renderer/src/components/settings/TerminalWindowSection.tsx; pnpm run typecheck:web.
#3073 nwparker/react-perf-composer-note-ref New-workspace composer note ref mirror moves out of an Effect Medium Open pnpm exec oxlint src/renderer/src/hooks/useComposerState.ts; pnpm exec vitest run --config config/vitest.config.ts src/renderer/src/hooks/composer-branch-selection.test.ts; pnpm run typecheck:web.
#3075 nwparker/react-perf-source-control-selection-refs Source-control selection ref mirrors move out of Effects High Open pnpm exec oxlint src/renderer/src/components/right-sidebar/useSourceControlSelection.ts; pnpm exec vitest run --config config/vitest.config.ts src/renderer/src/components/right-sidebar/useSourceControlSelection.test.ts; pnpm run typecheck:web.
#3077 nwparker/react-perf-ipynb-cell-editor-refs Notebook cell editor callback refs move out of an Effect Medium Open pnpm exec oxlint src/renderer/src/components/editor/IpynbViewer.tsx; pnpm exec vitest run --config config/vitest.config.ts src/renderer/src/components/editor/ipynb-parse.test.ts; pnpm run typecheck:web.
#3079 nwparker/react-perf-rich-markdown-refs Rich markdown editor ref mirrors move out of Effects Medium Open pnpm exec oxlint src/renderer/src/components/editor/RichMarkdownEditor.tsx; pnpm exec vitest run --config config/vitest.config.ts src/renderer/src/components/editor/rich-markdown-key-handler.test.ts src/renderer/src/components/editor/RichMarkdownSlashMenu.test.tsx src/renderer/src/components/editor/markdown-doc-completions.test.ts src/renderer/src/components/editor/rich-markdown-commands.test.ts; pnpm run typecheck:web.
#3081 nwparker/react-perf-browser-ref-mirrors Browser pane ref mirrors move out of Effects High Open pnpm exec oxlint src/renderer/src/components/browser-pane/useGrabMode.ts src/renderer/src/components/browser-pane/BrowserPane.tsx; pnpm exec vitest run --config config/vitest.config.ts src/renderer/src/components/browser-pane/browser-pane-page-selection.test.ts src/renderer/src/components/browser-pane/context-menu-positioning.test.ts; pnpm run typecheck:web; Electron sanity launch/attach on CDP port 9333, branch identity confirmed, zero console errors, existing browser webview target observed.
#3083 nwparker/react-perf-untitled-rename-dialog Untitled markdown rename dialog draft reset moves out of an Effect Low Merged pnpm exec oxlint src/renderer/src/components/editor/UntitledFileRenameDialog.tsx; pnpm run typecheck:web.
#3087 nwparker/react-perf-tour-select-portals Onboarding/feature-wall select portal roots move out of Effects Low Merged pnpm exec oxlint src/renderer/src/components/feature-wall/AiCommitPrSettingsCard.tsx src/renderer/src/components/onboarding/NotificationStep.tsx; pnpm run typecheck:web.
#3089 nwparker/react-perf-orca-yaml-trust-reset Orca hook trust checkbox reset moves out of an Effect Medium Open pnpm exec oxlint src/renderer/src/components/sidebar/OrcaYamlTrustDialog.tsx; pnpm run typecheck:web.
#3091 nwparker/react-perf-confirmation-dialog Confirmation dialog active request mirror moves out of an Effect Low Merged pnpm exec oxlint src/renderer/src/components/confirmation-dialog.tsx; pnpm run typecheck:web; git diff --check; AST Effect count 933 -> 932.
#3093 nwparker/react-perf-repo-hooks-local-editor Repository hook local editor visibility is derived from user-open state and non-empty local script content Medium Open pnpm exec oxlint src/renderer/src/components/settings/RepositoryHooksSection.tsx; pnpm run typecheck:web; git diff --check; AST Effect count 932 -> 931.
#3095 nwparker/react-perf-feature-wall-visited-events Feature-wall tour visited markers move from Effects to open/select/continue handlers Medium Open pnpm exec oxlint src/renderer/src/components/feature-wall/FeatureWallTourSurface.tsx; pnpm exec vitest run --config config/vitest.config.ts src/renderer/src/components/feature-wall/use-feature-wall-completion.test.ts src/renderer/src/components/feature-wall/use-feature-wall-tour-telemetry.test.ts; pnpm run typecheck:web; git diff --check; AST Effect count 932 -> 928.
#3097 nwparker/react-perf-editor-copy-timers Editor copy feedback clear timers move into the copy handlers Medium Open pnpm exec oxlint src/renderer/src/components/editor/MarkdownPreview.tsx src/renderer/src/components/editor/EditorPanel.tsx; pnpm run typecheck:web; git diff --check; AST Effect count 932 -> 930.
#3100 nwparker/react-perf-combobox-open-focus Combobox open focus and cmdk highlight seeding move out of Effects Low Merged pnpm exec oxlint src/renderer/src/components/agent/AgentCombobox.tsx src/renderer/src/components/repo/RepoCombobox.tsx src/renderer/src/components/automations/WorkspaceCombobox.tsx src/renderer/src/components/automations/CreateFromPicker.tsx; pnpm exec vitest run --config config/vitest.config.ts src/renderer/src/components/agent/AgentCombobox.test.tsx; pnpm run typecheck:web; git diff --check; AST Effect count 932 -> 928.
#3102 nwparker/react-perf-automation-run-selection External automation run-table selection repair moves into page navigation/render derivation Medium Open pnpm exec oxlint src/renderer/src/components/automations/ExternalAutomationRunTable.tsx; pnpm run typecheck:web; git diff --check; AST Effect count 928 -> 927.
#3104 nwparker/react-perf-automation-history-selection Automation run-history row selection is derived during render Low Merged pnpm exec oxlint src/renderer/src/components/automations/AutomationRunHistory.tsx; pnpm run typecheck:web; git diff --check; AST Effect count 928 -> 927.
#3106 nwparker/react-perf-automation-page-resets Automation detail-page resets move into automation/external selection handlers Medium Open pnpm exec oxlint src/renderer/src/components/automations/AutomationsPage.tsx; pnpm run typecheck:web; git diff --check; AST Effect count 927 -> 925.
#3108 nwparker/react-perf-linear-estimate-input Linear estimate input sync moves to popover open Medium Open pnpm exec oxlint src/renderer/src/components/LinearItemDrawer.tsx; pnpm run typecheck:web; git diff --check; AST Effect count 927 -> 926.
#3110 nwparker/react-perf-linear-subissues Linear sub-issue rows derive from issue data plus optimistic additions Medium Open pnpm exec oxlint src/renderer/src/components/LinearIssueWorkspace.tsx; pnpm run typecheck:web; git diff --check; AST Effect count 927 -> 926.
#3112 nwparker/react-perf-project-date-draft GitHub project date-cell draft sync moves to render-time source reconciliation Medium Open pnpm exec oxlint src/renderer/src/components/github-project/ProjectCell.tsx; pnpm run typecheck:web; git diff --check; AST Effect count 927 -> 926.
#3114 nwparker/react-perf-reviewer-index GitHub reviewer picker active index resets during render Medium Open pnpm exec oxlint src/renderer/src/components/PullRequestPage.tsx src/renderer/src/components/GitHubItemDialog.tsx src/renderer/src/components/TaskPage.tsx; pnpm run typecheck:web; git diff --check; AST Effect count 927 -> 924.
#3116 nwparker/react-perf-project-view-columns GitHub Project column hidden/width state reloads during render on scope changes Medium Open pnpm exec oxlint src/renderer/src/components/github-project/ProjectViewList.tsx; pnpm run typecheck:web; git diff --check; AST Effect count 927 -> 925.
#3118 nwparker/react-perf-pet-size-clamp Pet overlay position clamps during render on size changes Medium Open pnpm exec oxlint src/renderer/src/components/pet/PetOverlay.tsx; pnpm run typecheck:web; git diff --check; AST Effect count 927 -> 926.
#3120 nwparker/react-perf-combined-diff-state Combined diff file-tree highlight and clear-notes dialog repair during render Medium Open pnpm exec oxlint src/renderer/src/components/editor/CombinedDiffViewer.tsx; pnpm run typecheck:web; git diff --check; AST Effect count 927 -> 925.
#3122 nwparker/react-perf-onboarding-detour App onboarding settings detour reset moves out of an Effect Low Merged pnpm exec oxlint src/renderer/src/App.tsx; pnpm run typecheck:web; git diff --check; AST Effect count 927 -> 926.
#3124 nwparker/react-perf-gitlab-comment-draft GitLab comment draft reset moves out of an Effect Medium Open pnpm exec oxlint src/renderer/src/components/GitLabItemDialog.tsx; pnpm run typecheck:web; git diff --check; AST Effect count 926 -> 925.
#3126 nwparker/react-perf-activity-selection Activity selected-thread repair moves out of an Effect Medium Open pnpm exec oxlint src/renderer/src/components/activity/ActivityPrototypePage.tsx; pnpm run typecheck:web; git diff --check; AST Effect count 926 -> 925.
#3128 nwparker/react-perf-settings-mounted-sections Settings lazy-section mounted bookkeeping moves out of an Effect Medium Open pnpm exec oxlint src/renderer/src/components/settings/Settings.tsx; pnpm run typecheck:web; git diff --check; AST Effect count 926 -> 925.
#3130 nwparker/react-perf-linear-text-drafts Linear title/description draft sync moves out of an Effect Medium Open pnpm exec oxlint src/renderer/src/components/LinearIssueTextEditor.tsx; pnpm run typecheck:web; git diff --check; AST Effect count 926 -> 925.
#3132 nwparker/react-perf-create-from-search Automations create-from branch search reset moves out of an Effect Medium Open pnpm exec oxlint src/renderer/src/components/automations/CreateFromPicker.tsx; pnpm run typecheck:web; git diff --check; AST Effect count 926 -> 925.
#3134 nwparker/react-perf-delete-worktree-confirm Delete-workspace one-shot confirmation checkbox reset moves out of an Effect Medium Open pnpm exec oxlint src/renderer/src/components/sidebar/DeleteWorktreeDialog.tsx; pnpm run typecheck:web; git diff --check; AST Effect count 926 -> 925.
#3136 nwparker/react-perf-browser-settings-drafts Browser home-page and Kagi session-link draft sync moves out of Effects Medium Open pnpm exec oxlint src/renderer/src/components/settings/BrowserPane.tsx src/renderer/src/components/settings/KagiSessionLinkForm.tsx; pnpm run typecheck:web; git diff --check; AST Effect count 926 -> 924.
#3138 nwparker/react-perf-general-settings-drafts General auto-save delay and Open In launcher draft sync moves out of Effects Medium Open pnpm exec oxlint src/renderer/src/components/settings/GeneralPane.tsx; pnpm exec vitest run --config config/vitest.config.ts src/renderer/src/components/settings/GeneralPane.test.ts; pnpm run typecheck:web; git diff --check; AST Effect count 926 -> 924.
#3140 nwparker/react-perf-commit-ai-drafts Source Control AI instruction draft sync and discard reset move out of Effects Medium Open pnpm exec oxlint src/renderer/src/components/settings/CommitMessageAiPane.tsx src/renderer/src/components/settings/CommitMessageAiPane.test.tsx; pnpm exec vitest run --config config/vitest.config.ts src/renderer/src/components/settings/CommitMessageAiPane.test.tsx; pnpm run typecheck:web; git diff --check; AST Effect count 926 -> 921.
#3142 nwparker/react-perf-notification-volume-draft Notification volume draft sync moves out of an Effect Medium Open pnpm exec oxlint src/renderer/src/components/settings/NotificationsPane.tsx src/renderer/src/components/settings/NotificationsPane.test.tsx; pnpm exec vitest run --config config/vitest.config.ts src/renderer/src/components/settings/NotificationsPane.test.tsx; pnpm run typecheck:web; git diff --check; AST Effect count 926 -> 925.
#3144 nwparker/react-perf-repo-source-control-ai-draft Repo Source Control AI override draft sync moves out of an Effect Medium Open pnpm exec oxlint src/renderer/src/components/settings/RepositorySourceControlAiSection.tsx src/renderer/src/components/settings/RepositorySourceControlAiSection.test.ts; pnpm exec vitest run --config config/vitest.config.ts src/renderer/src/components/settings/RepositorySourceControlAiSection.test.ts; pnpm run typecheck:web; git diff --check; AST Effect count 926 -> 925.
#3146 nwparker/react-perf-quick-commands-intent Quick Commands add-intent signal consumption moves out of an Effect Medium Open pnpm exec oxlint src/renderer/src/components/settings/QuickCommandsPane.tsx src/renderer/src/components/settings/QuickCommandsPane.test.ts; pnpm exec vitest run --config config/vitest.config.ts src/renderer/src/components/settings/QuickCommandsPane.test.ts; pnpm run typecheck:web; git diff --check; AST Effect count 926 -> 925.
#3148 nwparker/react-perf-quick-agent-selection Quick workspace agent override repair moves out of an Effect Medium Open pnpm exec oxlint src/renderer/src/components/NewWorkspaceComposerModal.tsx src/renderer/src/lib/quick-workspace-agent-selection.ts src/renderer/src/lib/quick-workspace-agent-selection.test.ts; pnpm exec vitest run --config config/vitest.config.ts src/renderer/src/lib/quick-workspace-agent-selection.test.ts; pnpm run typecheck:web; git diff --check; AST Effect count 926 -> 925.
#3150 nwparker/react-perf-add-repo-clone-default Add Repo clone destination auto-fill moves out of an Effect Medium Open pnpm exec oxlint src/renderer/src/components/sidebar/AddRepoDialog.tsx src/renderer/src/components/sidebar/clone-defaults.ts src/renderer/src/components/sidebar/clone-defaults.test.ts; pnpm exec vitest run --config config/vitest.config.ts src/renderer/src/components/sidebar/clone-defaults.test.ts; pnpm run typecheck:web; git diff --check; AST Effect count 926 -> 925.
#3152 nwparker/react-perf-mobile-qr-polling Mobile QR device-count capture moves out of an Effect Medium Open pnpm exec oxlint src/renderer/src/components/settings/MobilePane.tsx src/renderer/src/components/settings/mobile-pairing-device-polling.ts src/renderer/src/components/settings/mobile-pairing-device-polling.test.ts; pnpm exec vitest run --config config/vitest.config.ts src/renderer/src/components/settings/mobile-pairing-device-polling.test.ts; pnpm run typecheck:web; git diff --check; AST Effect count 926 -> 925.
#3154 nwparker/react-perf-integrations-status Integrations preflight status mirrors move out of an Effect Medium Open pnpm exec oxlint src/renderer/src/components/settings/IntegrationsPane.tsx src/renderer/src/components/settings/integrations-pane-status.ts src/renderer/src/components/settings/integrations-pane-status.test.ts; pnpm exec vitest run --config config/vitest.config.ts src/renderer/src/components/settings/integrations-pane-status.test.ts; pnpm run typecheck:web; git diff --check; AST Effect count 926 -> 925.
#3157 nwparker/react-perf-ssh-reset-dialog SSH reset-relay dialog cleanup moves out of an Effect High Open pnpm exec oxlint src/renderer/src/components/settings/SshTargetDestructiveActions.tsx src/renderer/src/components/settings/ssh-target-action-state.ts src/renderer/src/components/settings/ssh-target-action-state.test.ts; pnpm exec vitest run --config config/vitest.config.ts src/renderer/src/components/settings/ssh-target-action-state.test.ts; pnpm run typecheck:web; git diff --check; AST Effect count 926 -> 925.
#3160 nwparker/react-perf-sidebar-live-width Redundant sidebar live-width mirror Effect removed Low Merged pnpm exec oxlint src/renderer/src/components/sidebar/index.tsx src/renderer/src/hooks/useSidebarResize.ts; pnpm exec vitest run --config config/vitest.config.ts src/renderer/src/hooks/useSidebarResize.test.ts; pnpm run typecheck:web; git diff --check; AST Effect count 926 -> 925.
#3164 nwparker/react-perf-worktree-palette-selection Cmd+J selected-row repair moves out of an Effect Low Merged pnpm exec oxlint src/renderer/src/components/WorktreeJumpPalette.tsx src/renderer/src/lib/worktree-palette-create-action.ts src/renderer/src/lib/worktree-palette-create-action.test.ts; pnpm exec vitest run --config config/vitest.config.ts src/renderer/src/lib/worktree-palette-create-action.test.ts; pnpm run typecheck:web; git diff --check; AST Effect count 925 -> 924.
#3166 nwparker/react-perf-sidebar-selection-prune Sidebar selected-worktree pruning moves out of an Effect Low Merged pnpm exec oxlint src/renderer/src/components/sidebar/WorktreeList.tsx src/renderer/src/components/sidebar/worktree-multi-selection.ts src/renderer/src/components/sidebar/worktree-multi-selection.test.ts; pnpm exec vitest run --config config/vitest.config.ts src/renderer/src/components/sidebar/worktree-multi-selection.test.ts; pnpm run typecheck:web; git diff --check; AST Effect count 924 -> 923.
#3168 nwparker/react-perf-workspace-space-state Workspace Space row-state repairs move out of Effects Medium Open pnpm exec oxlint src/renderer/src/components/status-bar/WorkspaceSpaceManagerPanel.tsx src/renderer/src/components/status-bar/workspace-space-presentation.ts src/renderer/src/components/status-bar/workspace-space-presentation.test.ts; pnpm exec vitest run --config config/vitest.config.ts src/renderer/src/components/status-bar/workspace-space-presentation.test.ts; pnpm run typecheck:web; git diff --check; AST Effect count 923 -> 920.
#3170 nwparker/react-perf-mobile-driver-overlay-collapse Mobile driver overlay collapse reset moves out of an Effect Medium Open pnpm exec oxlint src/renderer/src/components/terminal-pane/MobileDriverOverlay.tsx src/renderer/src/components/terminal-pane/mobile-driver-overlay-collapse.ts src/renderer/src/components/terminal-pane/mobile-driver-overlay-collapse.test.ts; pnpm exec vitest run --config config/vitest.config.ts src/renderer/src/components/terminal-pane/mobile-driver-overlay-collapse.test.ts src/renderer/src/components/terminal-pane/mobile-driver-overlay-focus.test.ts; pnpm run typecheck:web; git diff --check; AST Effect count 923 -> 922.
#3176 nwparker/react-perf-diagnostics-bundle-ref Diagnostics bundle cleanup ref mirror moves out of an Effect Medium Open pnpm exec oxlint src/renderer/src/components/settings/PrivacyDiagnosticsSection.tsx; pnpm exec vitest run --config config/vitest.config.ts src/renderer/src/components/settings/PrivacyPane.test.ts; pnpm run typecheck:web; git diff --check; AST Effect count 923 -> 922.
#3180 nwparker/react-perf-mobile-page-stage Mobile pairing page stage repairs move into the device refresh path Medium Open pnpm exec oxlint src/renderer/src/components/mobile/MobilePage.tsx src/renderer/src/components/mobile/mobile-page-stage.ts src/renderer/src/components/mobile/mobile-page-stage.test.ts; pnpm exec vitest run --config config/vitest.config.ts src/renderer/src/components/mobile/mobile-page-stage.test.ts src/renderer/src/components/settings/mobile-pairing-device-polling.test.ts; pnpm run typecheck:web; git diff --check; AST Effect count 923 -> 921.

Reproduction Commands

Run from the worktree root.

rg --files -g '*.tsx' -g '*.ts' | wc -l
rg -l "\\b(useEffect|useLayoutEffect|React\\.useEffect|React\\.useLayoutEffect)\\b" -g '*.tsx' -g '*.ts' | sort

The exact Effect-site counts above came from a TypeScript AST scan so comment-only mentions are not counted.