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

42 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, and #3104: 927 Effect hook call sites.

Open medium-risk PRs #3070, #3073, #3077, #3089, #3093, #3102, #3108, #3110, #3112, and #3118 each project to 926 Effect hook call sites on the current merged baseline; open medium-risk PRs #3097, #3106, and #3116 each project to 925; open medium-risk PR #3114 projects to 924; open medium-risk PR #3095 projects to 923; open medium-risk PR #3079 projects to 917; open high-risk PR #3075 projects to 923; and open high-risk PR #3081 projects to 919. 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. Continue checking global listeners, beforeunload, media-query, sidebar resize, active-tab repair.
Terminal / PTY components/Terminal.tsx, components/terminal-pane/**, components/terminal/** Inventory complete, manual review pending High-risk area: xterm lifecycle, scrollback, remote/mobile parity, focus, WebGL, resize.
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. 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. Continue with worktree list state repair, drag/drop global listeners, 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. 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. 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. 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. 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

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.

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.