Non-blocking findings from the fresh review of #871 that were deferred so the PR could land. Each is small; they can go in one PR.
packages/stim-cli/src/diagnostics/sandbox.ts covers(): the glob strip (/\/+\*+$/) runs before path normalisation, so on Windows C:\Users\me\.stim\* keeps its * and never matches. Normalise, then strip.
packages/stim-cli/src/engine/errors-gradle.ts:304: .replace(/\r$/, '') changes macOS parsing too ("FAILURE: Build failed\r" used to return ""). Correct, but unguarded and untested, and mostly dead since createLineReader strips CR upstream. Add a test or drop it.
packages/stim-cli/src/fs-util.ts:108: uncShareIsReachable calls statSync directly instead of the statFn that isOnMountedVolume was given, so it is untestable and ignores injection.
packages/stim-cli/src/process-output.ts:26: flush() does not strip a trailing \r, unlike push(); a CRLF final line without newline leaks the CR.
.github/workflows/ci.yml: branches: [main, '**windows**'] makes every job, including the macOS lanes, run on push to any windows-named branch, duplicating the PR run. Scope the push trigger to the Windows jobs only.
.github/workflows/ci.yml: job-level TEMP/TMP point at a directory created by a later New-Item step, so actions/checkout runs with a non-existent TEMP. Create it first or set the env on the steps after it.
.github/workflows/ci.yml: the comment "the job's own colour tracks the suite" is wrong; job-level continue-on-error: true makes it green regardless. Fix the comment or move continue-on-error to the step.
The EPERM to contended mapping in ownership-claim.ts is tracked separately in the claim liveness issue.
Non-blocking findings from the fresh review of #871 that were deferred so the PR could land. Each is small; they can go in one PR.
packages/stim-cli/src/diagnostics/sandbox.tscovers(): the glob strip (/\/+\*+$/) runs before path normalisation, so on WindowsC:\Users\me\.stim\*keeps its*and never matches. Normalise, then strip.packages/stim-cli/src/engine/errors-gradle.ts:304:.replace(/\r$/, '')changes macOS parsing too ("FAILURE: Build failed\r"used to return""). Correct, but unguarded and untested, and mostly dead sincecreateLineReaderstrips CR upstream. Add a test or drop it.packages/stim-cli/src/fs-util.ts:108:uncShareIsReachablecallsstatSyncdirectly instead of thestatFnthatisOnMountedVolumewas given, so it is untestable and ignores injection.packages/stim-cli/src/process-output.ts:26:flush()does not strip a trailing\r, unlikepush(); a CRLF final line without newline leaks the CR..github/workflows/ci.yml:branches: [main, '**windows**']makes every job, including the macOS lanes, run on push to any windows-named branch, duplicating the PR run. Scope the push trigger to the Windows jobs only..github/workflows/ci.yml: job-levelTEMP/TMPpoint at a directory created by a laterNew-Itemstep, soactions/checkoutruns with a non-existentTEMP. Create it first or set the env on the steps after it..github/workflows/ci.yml: the comment "the job's own colour tracks the suite" is wrong; job-levelcontinue-on-error: truemakes it green regardless. Fix the comment or movecontinue-on-errorto the step.The
EPERMto contended mapping inownership-claim.tsis tracked separately in the claim liveness issue.