63 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:
- File inventory checked from the current worktree.
useEffect/useLayoutEffect/useInsertionEffectsites classified.- Perf-sensitive patterns checked: timers, subscriptions, observers,
JSON.stringify, storage writes, polling, broad store subscriptions, large list rendering, and render-time derived state. - Each suspicious site dispositioned as "no change", "needs PR", or "covered by PR".
- 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, #3176, and #3184 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 in progress | Create PR dialog submit reset covered by #3184. Continue checking polling, PR checks, file explorer watch/reveal, and 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 |
| PR CA | Create PR submit close reset | The hosted review creation dialog reset submit/error state in an Effect after closing. | CreatePullRequestDialog.tsx, ChecksPanel.tsx covered by #3184 |
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. |
| #3184 | nwparker/react-perf-create-pr-submit-reset |
Create PR dialog submit reset moves out of an Effect | Medium | Open | pnpm exec oxlint src/renderer/src/components/right-sidebar/CreatePullRequestDialog.tsx src/renderer/src/components/right-sidebar/ChecksPanel.tsx; pnpm exec vitest run --config config/vitest.config.ts src/renderer/src/components/right-sidebar/checks-panel-content.test.tsx src/renderer/src/components/right-sidebar/checks-panel-git-status-snapshot.test.ts; pnpm run typecheck:web; git diff --check; AST Effect count 923 -> 922. |
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.