perf(windows): reduce startup command discovery and Git probe overhead - #6124
perf(windows): reduce startup command discovery and Git probe overhead#6124simon-curtis wants to merge 4 commits into
Conversation
|
Important Review skippedAuto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Comment |
| @@ -177,17 +177,20 @@ export const ClaudeDriver: ProviderDriver<ClaudeSettings, ClaudeDriverEnv> = { | |||
|
|
|||
| const snapshotSettings = makeProviderSnapshotSettingsSource(effectiveConfig, serverSettings); | |||
| const snapshot = yield* makeManagedServerProvider<ProviderSnapshotSettings<ClaudeSettings>>({ | |||
| maintenanceCapabilities, | |||
| maintenanceCapabilities: maintenanceCapabilities.get, | |||
There was a problem hiding this comment.
🟠 High Drivers/ClaudeDriver.ts:180
maintenanceCapabilities.get() returns the npm updater immediately after ClaudeDriver.create(), even when claude on PATH actually resolves to a native or Homebrew install. Before the deferred maintenanceCapabilities.refresh completes, ProviderRegistry.getProviderMaintenanceCapabilitiesForInstance can therefore return the wrong update action, so an update requested during startup runs npm instead of claude update/Homebrew. makeProviderMaintenanceCapabilitiesSource initializes its current value via resolver.resolve(options) before command-path/realpath discovery, and that synchronous resolve falls back to the npm updater for a bare claude command. Consider initializing current with a non-actionable value (or gating maintenance access) until the deferred resolution completes.
🤖 Copy this AI Prompt to have your agent fix this:
In file @apps/server/src/provider/Drivers/ClaudeDriver.ts around line 180:
`maintenanceCapabilities.get()` returns the npm updater immediately after `ClaudeDriver.create()`, even when `claude` on PATH actually resolves to a native or Homebrew install. Before the deferred `maintenanceCapabilities.refresh` completes, `ProviderRegistry.getProviderMaintenanceCapabilitiesForInstance` can therefore return the wrong update action, so an update requested during startup runs `npm` instead of `claude update`/Homebrew. `makeProviderMaintenanceCapabilitiesSource` initializes its `current` value via `resolver.resolve(options)` before command-path/realpath discovery, and that synchronous resolve falls back to the npm updater for a bare `claude` command. Consider initializing `current` with a non-actionable value (or gating maintenance access) until the deferred resolution completes.
6ed8120 to
bbfad77
Compare
ApprovabilityVerdict: Not approved Macroscope's review found this PR not approvable — This PR changes Windows command discovery and subprocess cleanup in shared production infrastructure, including a patched process spawner, so its runtime blast radius is broader than a small performance tweak. It also adds a file-level static-analysis suppression in a new test file, while an unresolved High finding describes a startup-time maintenance-action risk. Not approved because:
Adjust the Minimum Blocking Severity for this repo — including turning it Off — in Settings. You can add or adjust custom eligibility rules. Learn more. |
309637f to
fef06d7
Compare
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit fef06d741f8c710f0957139af036297f3f3aad90. Configure here.
CDVolvik
left a comment
There was a problem hiding this comment.
Read the Windows shell half against today's main. CONFLICTING.
Desktop: drops the -NoProfile PATH probe entirely and keeps only the profile probe, merging process PATH + profile PATH + knownWindowsCliDirs. That is the ~2s startup win (each PowerShell spawn was ~2s). It also deletes the no-profile source #6356 is trying to make read Machine+User, so a CLI installed after launch still will not show up until the next process start unless the profile sees it.
Shared: directory listing + case-insensitive name map instead of probing every PATHEXT candidate, with a fallback when readDirectory fails (ACL / unreadable share). That is the right Windows lookup. Returning [command] when the input already has a PATHEXT suffix is also right — the old code generated three casings of the same extension.
Do not land this and #6356/#4896/#6301 independently; they all rewrite installWindowsEnvironment.
fef06d7 to
2ead4e7
Compare
324294b to
96a86d6
Compare
|
Scope update: I have reframed this PR around reducing first-start/editor-discovery time on Windows. After comparing the original branch with current What remains is the independently useful shared lookup optimization: list each Windows PATH directory once, match PATHEXT candidates case-insensitively, preserve PATH order, and fall back to the existing direct probes when listing fails. I also restored A targeted five-run benchmark on this machine's 71-entry PATH and 12 PATHEXT values measured provider discovery at 199 ms → 49 ms and first editor discovery at 1,964 ms → 425 ms. This is a resolver benchmark, not an end-to-end startup claim. |
99f0376 to
d5a0e7a
Compare
cfb0d3e to
9ecfbc4
Compare
Co-authored-by: macroscopeapp[bot] <170038800+macroscopeapp[bot]@users.noreply.github.com>
9ecfbc4 to
ae911eb
Compare
|
Note 🤖 GPT-6 Astra (preview) responding on behalf of Theo This note is part of an automated cleanup pass. Preserving these details from items reviewed in the cleanup pass. Carryover from #6221 at 59849f94e2: retain the Carry over the slow-discovery evidence from #5050 at 61278bee47. On the reported Windows host with 46 PATH entries and 12 PATHEXT entries, getConfig timed out near 5,000 ms on every call. Concurrent discovery finished in 4,787 ms in that report. Its focused test interrupts one caller during discovery, then requires a later caller to obtain editors. Check cold discovery and caller interruption while retaining bounded expiry and current Linux/WSL file-manager checks. These are reported measurements and a test case to retain, not results rerun here. Keep the trace evidence from #4778 at dc7f1727a6 in the Windows resolver review. Its author reported 28,577 shell.isExecutableFile spans from 22 command lookups in 13.7 seconds, plus trace files rotating at 10 MB about every 40 seconds. The distinct code change makes isExecutableFile untraced. Main still traces that helper, although its command cache and VCS limits are now bounded. Check first-scan and miss-heavy trace cost with this PR. Do not copy the older unbounded cache or treat the reported timings as rerun results. |
|
Pushed I compared production source builds against nightly
That is 9.80 seconds / 54% less time to the first sidebar snapshot in this comparison. Median backend readiness improved from 8.87 s to 6.39 s; editor discovery from 2.28 s to 62 ms. These timings overlap and should not be added together. These are warm-cache source-build measurements, not cold boots or a measurement of fully interactive UI readiness. Since the branch includes newer upstream commits, the result compares this branch with that nightly release rather than isolating only this patch. Validation: 80 tests passed, 13 skipped, targeted lint and server typecheck passed. Native tests cover completed probes, cancellation, timeout, and preservation of default cleanup; platform tests keep the override Windows-only. Model: GPT-6. Harness: Codex in T3 Code. |

Windows startup spends seconds searching long PATH/PATHEXT lists and cleaning up already-exited Git probes. This PR reduces both costs, with behavior changes confined to Windows.
git rev-parse --show-toplevelandgit remote -v. These commands do not leave child processes behind. A small Effect patch supports the Windows-only override; cancellation, timeout, and default process cleanup remain intact.Compared with nightly
v0.0.39-nightly.20260905.1286:Both versions were built from source and used identical database snapshots, with three interleaved measured launches after a warm-up each. The 54% reduction measures time to the first sidebar snapshot with warm caches. The branch includes newer upstream commits, so this compares releases rather than isolating the patch. Individual runs and benchmark details.
Validation: 80 focused tests passed, 13 skipped; targeted lint and server typecheck passed. Tests cover resolution fallback, cache lifetime, native process cleanup, and preservation of Linux/macOS behavior.
Model: GPT-6. Harness: Codex in T3 Code.