Repository navigation
test(install): isolate absent Node fixture from host PATH - #2448
Conversation
|
No actionable comments were generated in the recent review.
|
| Layer / File(s) | Summary |
|---|---|
Fixture PATH isolation scripts/install-node-fallback.test.ts |
The fixture removes /usr/bin and /bin from original_path. A comment notes that this prevents a host Node executable from filling an absent fixture. |
Priority:
Estimated code review effort: 1 (Trivial) | ~2 minutes
Change: Other
Possibly related PRs
- devswha/ovis#2100: Changes the installer's
node_linkbehavior and adds related tests. - devswha/ovis#1908: Introduces the installer’s Node fallback and related test coverage.
Suggested reviewers: devswha
Merge Risk: 
Minimal · up to b3a7f
-
No actionable merge-blocking risk was identified in this fixture-only change.
Pre-merge checks: 
5
-
Full details: Title check
-
Explanation
The title "test(install): isolate absent Node fixture from host PATH" matches the single change in the PR: the node_link test fixture's original_path is restricted to its temporary userPath so a host Node cannot satisfy the absent-user-Node case. It is specific, concise, and follows conventional commit style.
Full details: Description check
-
Explanation
The description follows the repository template. It has a Change section that explains the problem (the fixture's original_path included /usr/bin:/bin, so a host Node could invalidate the absent-Node case), the resulting behavior, and the scope (test-only). It has a Validation section that lists the commands run, their results, and the checks not run. The template's reference to CONTRIBUTING.md and changelog.d is not addressed, and the description does not mention a changelog entry or whether one is needed for this test-only change. Those are minor gaps.
Full details: Docstring Coverage
-
Explanation
Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff with cyclomatic complexity of at least 2. Documentation-only edits and deletions within surviving functions are included; unchanged diff context and fully deleted functions are excluded. Analyzed 1 functions across 1 files.
-
Finishing Touches
-
🧪 Generate unit tests (beta)
-
- Create a new PR
-
- Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.
Comment @coderabbitai help to get the list of available commands.
|
Merging b3a7f4e, thank you @briantcl1992! Test-only: the node_link fixture for 'no user Node' put /usr/bin:/bin on original_path, so on a host with a recent /usr/bin/node the installer (correctly) kept that Node and the test failed. The fixture's original_path is now only its own temporary user path; install.sh and every assertion are unchanged. Reviewed by the merge pass: one line in scripts/install-node-fallback.test.ts, safe for fork CI; node_link reads Node only from original_path, the shell keeps its own PATH for utilities. |
…longer hangs (devswha#1989) ## What this fixes On Windows, connecting a remote PC hung at "Checking the remote environment…" until the 90 s timeout (devswha#1944). The OpenSSH that ships with Windows (System32 9.5p2, and the 10.4 preview) never exits once the remote command has printed anything, when the Ovis server starts it. The server has no console. The reporter traced it and measured the fix: Git for Windows' `ssh.exe` exits normally in the same flow (about 0.2 s per probe). This matches the upstream Win32-OpenSSH reports of hangs with redirected stdio (PowerShell/Win32-OpenSSH#1427, devswha#1470, devswha#2448). ## Change - `server/ssh.ts` gets `sshClient()`, which picks the OpenSSH programs Ovis runs: - `OVIS_SSH` names an `ssh` (a path, or a name looked up on PATH; one pair of surrounding quotes is dropped). The `sftp` and `ssh-keygen` beside it are used where they exist. - On Windows, Git for Windows' build in `<Git>\usr\bin` is used. Git is looked for only where its installer puts it, never through PATH: the `InstallPath` Git for Windows recorded in `HKLM\SOFTWARE\GitForWindows`, then `%ProgramFiles%`, `%ProgramFiles(x86)%`, `%LOCALAPPDATA%\Programs`, or a Scoop Git in the account's profile. `install.ps1` already requires Git. - Otherwise the plain `ssh`, `sftp` and `ssh-keygen` run, as before. Linux and macOS don't change unless `OVIS_SSH` is set. - `SshConnection` uses this for every ssh, sftp and ssh-keygen it starts. The app-key `ssh-keygen` in `server/machines.ts` uses it too. `sftp` gets `-S <ssh>` so it starts that same ssh. - Docs (`docs/remote-pcs.md`, `docs/guide.md`) and a changelog fragment. **Behaviour note (auth):** Git's `ssh` reads only the agent named by `SSH_AUTH_SOCK` in the server's environment, not Windows' `ssh-agent` service. A key held only in that service is not offered: setup asks for the password or a key file's passphrase instead, once. After that, the app key makes reconnects unattended. This changes how authentication works on Windows, so it should get a real review. ## Verification - `HERDR_TEST_MODE=unit bun test ./server/ssh.test.ts`: 18 pass. - New resolver tests: Git from PATH (`cmd`, `mingw64\bin`), from the install folder, and from Scoop; never a folder outside Git's own; a quoted `OVIS_SSH` and a bare name on PATH; `OVIS_SSH` with missing siblings; plain names without Git and on Linux. - An `OVIS_SSH` wiring test: a fake ssh and sftp that aren't on PATH run `start()`, `run()` and `upload()`, and sftp gets `-S`. - Each new test fails when the code it covers is reverted: the Windows lookup, the `direct()` wiring, sftp `-S`, the Scoop root, the layout check, the quote stripping and the PATH lookup. - `ssh`, `ssh-socket`, `machines`, `conventions` and `changelog-fold` tests pass on the final head (104 pass), as do `bun run typecheck` and `git diff --check`. - `bun run check fast` (via `dori heavy`) on 0d84705 (rebased after devswha#1983): exit 0, 7356 unit pass, 0 fail. An earlier run on the first head failed only 5 `EMFILE` watcher tests in `server/legacy-env.test.ts`, an untouched file; the host was at its inotify limit. - `server/machines-refresh(.contract).test.ts` fails 3 tests locally on unchanged `origin/main` too, so that's not from this change. - Reviews: - omo-native-code-reviewer: no High findings. Its Medium/Low findings (agent docs, Scoop and x86 Git, sftp `-S` test, stale comments) are fixed in the second commit. - Codex Astra: 2 Medium and 1 Low finding (a bare `OVIS_SSH` name didn't bring its companions; Git discovery walked parent folders outside Git; a quoted `OVIS_SSH`). All are verified and fixed in the third commit, with tests. - Codex Sol review did not run (host stall); the merge pass reviews. - Merge pass Astra gate on 49ce725: C1 (an ssh.exe planted in a Git-shaped PATH folder) is fixed in 8cde9ef. C3 (keys only in Windows' agent service) is kept as a stated limitation, with a clear error. The re-review's accuracy point (the error was also added for an `OVIS_SSH` naming Windows' own ssh) is fixed in ca85c0e; see the PR comments. **Not verified on a real device:** the Windows test PC (`home-window`) has been offline for 2 days, so I couldn't run the reporter's repro with System32 ssh vs Git ssh. One thing is shown only by reading code: that Git's MSYS `ssh` starts our `.cmd` password/passphrase helper. Cygwin's spawn runs `.cmd` and `.bat` directly (`winsup/cygwin/spawn.cc`, `av::setup`). A native Windows check of a passphrase prompt, an unknown host fingerprint and an sftp upload is the remaining risk. Fixes devswha#1944 --------- Co-authored-by: mp <mp@local>
## Change
Make the `node_link` test fixture independent of the machine's installed
Node.
The fixture's `pc(false)` means there is no user Node, but its
`original_path`
also included `/usr/bin:/bin`. On a Linux machine with a recent
`/usr/bin/node`,
the production installer correctly retained that existing Node and did
not make
the link the test expected. The purported no-user-Node case therefore
depended
on the host rather than the fixture.
Restrict only the fixture's `original_path` to its temporary `userPath`.
Deliberately supplied fixture Nodes still work. The shell keeps its
normal
utility PATH; production `install.sh` and all assertions are unchanged.
This is a test-only correction, with no installed-app behavior change.
## Validation
- Before the correction, the absent-user-Node case failed on this host
even
with test concurrency limited to two. Other cases in that file passed.
- `bun test --max-concurrency=2 scripts/install-node-fallback.test.ts`:
29 passed, 0 failed, 80 expectations on the exact corrected file.
- Standard `bun run check fast`: workflow syntax, generated
types/themes,
typecheck and build passed. Unit tests: **9,165 passed, 36 skipped, 1
failed**
(9,202 tests across 591 files; 416,617 expectations). The source
fingerprint
remained unchanged. This is **not a passing full local check**.
- The single full-run failure was unrelated
`server/request-log.test.ts`:
`neither follows nor writes a symlinked log path` expected its temporary
target
to retain mode `0640`. This validation service used umask `0077`, so the
fixture's `writeFileSync(..., {mode: 0o640})` created it as `0600`
before the
logger ran. The log writer refused the symlink with `ELOOP` as intended.
The unchanged file then passed **14/14 tests, 32,084 expectations**,
under
umask `0027`. No production permission or assertion was changed; no
second
full-suite pass is claimed. This existing fixture-mode assumption is
disclosed,
not included as an unrelated change in this PR.
- Tooling: pinned Bun 1.4.2; local Node 24.21.0 differs from CI's Node
22.
Local test settings: `UNIT_TEST_WORKERS=1
BUN_OPTIONS=--max-concurrency=2`.
The ordinary check script is unmodified; no tests are skipped by those
settings.
- Integration/browser and native Windows installation were not run
locally;
there is no production, HTTP/WebSocket, UI or installer behavior change.
- The one-file correction received a separate independent source review.
No live Herdr session, application installation or user credentials are
used
by the fixture validation. A local pass is not a claim that upstream CI
passed.
Co-authored-by: clbt2 <clbt2@localhost>
(cherry picked from commit 2f9501a)
## Release 0.4.22 The release PR, prepared by step 1 of [docs/development.md#releasing](https://github.com/devswha/ovis/blob/main/docs/development.md#releasing) on main `41492320` (#2453 the last merge), refreshed to main `99a6671f` (#2582 the last merge). **Do not merge yet:** the owner tests main and judges the final build before release. No tag and no Release run from this PR's author. - **Version:** `version` is 0.4.22 in `package.json` and `herdr-plugin.toml`. - **Changelog:** `bun scripts/changelog-fold.ts 0.4.22` (2026-10-31, local) folded 20 fragments into the 2026-10-31 section of `CHANGELOG.md` (23 entries with the hand entry), linked their PRs and deleted the fragments; `changelog.d` holds only `README.md`. - `by @login` on every outside contributor's PR link: #2453 @jokkopucko, #2452 @jokkopucko, #2442 @nahwan-kim, #2463 @zerodice0, #2468 @Yoonwoo-Ha, #2065 @rabbitson87 (both entries), #2466 @jpcarranza94, #2467 @jpcarranza94, #2457 @YuuuXie, #2420 @cheol-95 (both entries), #2459 @Haeminway1, #2450 @briantcl1992, #2448 @briantcl1992. - One outside PR had no fragment and got an entry by hand: #2448 (installer test no longer finds the host's Node, Maintenance). - Issue reporters: #2442's entry credits @Ploppy3, who asked for herdr-core support in #2439. The other fixed issues were filed by the PR's own author (#2460 @zerodice0, #2464 @jpcarranza94, #2419 @cheol-95, #2089 @rabbitson87) or the maintainer (#2444), so the PR credit covers them. - Two fragments ran past the changelog's width (#2443, #2446); their entries are re-wrapped, words unchanged. - Folded after the PR opened (merge of main `653613cb`, by hand per the release steps): #2474 (Pi Chat message with leading/trailing spaces, a tab or a trailing `@mention` no longer stuck "waiting for transcript", Fixed), credited `reported by @BeerBelly69` (he reported issue #2454; the PR is the maintainer's, so the earlier `by @BeerBelly69` was corrected in `90536524`). Its fragment is deleted; `changelog.d` holds only `README.md`. The release summaries are unchanged: their fixed list is already at five lines. - Folded in a second refresh (merge of main `98c1f5e0`, by hand): #2475 (a reconnecting or reloading browser gets back its follow-up's lost "sent" receipt, Fixed), credited `reported by @christso`, who filed #2421 and proposed the approach. Its fragment is deleted; `changelog.d` holds only `README.md`. The release summaries are unchanged (fixed list already at five lines). - Folded in a third refresh (merge of main `af20e0a4`, by hand): #2490 (Chat keeps its messages mounted when the pane's skill names load, so a decoded image no longer drops back to its loading slot, Fixed), credited `by @nocstah` (outside PR, no linked issue); #2483 (a Copilot turn stays whole when its pictures pass the page window, Fixed); #2479 (Chat shows the pictures in a Copilot CLI session, Added); #2482 (Chat shows the picture attached to a Hermes prompt, Added). #2483, #2479 and #2482 are maintainer PRs; #2483's issue #2478 is the maintainer's, so no reporter credit. #2480 (site only) had no fragment. Their fragments are deleted; `changelog.d` holds only `README.md`. The release summaries are unchanged: the fixed list is already at five lines, and the two new picture features stay in the changelog only (the new list has room for them if the owner wants them there). - Folded in a fourth refresh (merge of main `4ca7d24d`, by hand): #2481 (Grok pictures in Chat), #2477 (svg figures, `reported by @affeek`, who filed #2441 and co-authored the PR), #2498 (dollar math, `reported by @kjohnsen`, #2407), #2484 (Expand thinking / Collapse work defaults, `reported by @altgans and @Ploppy3`, #2346 and #2228) under Added; #2494 (`by @todor-a`), #2491 (`by @nocstah`), #2487, #2486, #2472 (`reported by @matiemer`, #2462) and #2476 (relay session uses the server's port) under Fixed. 10 fragments deleted; `changelog.d` holds only `README.md`. Every entry's credit was re-checked with GraphQL (PR author, closing issues' authors, commit authors): #2487's #2374, #2486's #2485 and #2483's #2478 are the maintainer's, so no reporter credit. - Folded in a fifth refresh (merge of main `f5370d54`, by hand): #2503 (Claude question card steps and Back, `reported and co-authored by @jpcarranza94`, who filed #2465 and co-authored the fix), #2502 (tab name from its first message, `reported by @vibewriter-hand`, #2019) and #2505 (a note on a diff line goes into the next message; #1603 is the maintainer's, so no credit) under Added; #2506 (OmO, Codex and Hermes question cards move between questions without answering; it closes no issue, so no credit) under Fixed. 4 fragments deleted; `changelog.d` holds only `README.md`. #2499's hand-written relay entry is kept. All four PRs are the maintainer's; credits re-checked with GraphQL (PR author, closing issues' authors, commit authors). - Sixth refresh (merge of main `feb3ae09`, head `e3b0dc37`): main had no fragment left to fold. #2504 (the owner's PR, no fragment) gets a hand entry under Added next to #2499's: the PC side of the relay, which answers the relay's server proof, `/api/relay` start/stop routes restricted to the owner and to direct connections, and a relay QR from `plugin pair`; off by default with no Settings switch yet. No credit (maintainer PR). It stays out of the release summaries (off by default, no UI). - Seventh refresh (merge of main `a683e3ff`, head `7855c73c`): folded #2509's two fragments by hand, two entries under Added (the phone side of the relay: the hosted shell that pairs from the PC's relay QR and opens the app end-to-end encrypted; files and chat images through the relay) and one under Fixed (the iOS and Android apps no longer show the hosted shell's home-screen hint). Each says the relay is off by default. #2499's entry now says Ovis uses the relay only once a PC's relay link is started. No credit (maintainer PR). The fragments are deleted; `changelog.d` holds only `README.md`. The relay stays out of the release summaries. - Eighth refresh (merge of main `0b215abf`, head `f76f3ae4`): folded #2514's three fragments by hand under Fixed (relay connection limits and the 30 s wait for an absent PC, proof of the PC's relay key, the hosted shell's copy-on-select and relay-control requests) and added a hand entry for #2514 under Added: remote access through the Ovis relay can be turned on in **Settings → Phone & devices** (off by default), with the iOS and Android apps opening a relay-paired PC from its link; app.ovis.sh is deployed separately. #2499, #2504 and #2509's entries no longer say there is no Settings switch: they now say the relay is turned on in Settings. No credit (maintainer PR). Also folded #2511 (Claude task-list scan on file workers, Fixed, `by @duytbp`) and #2518 (feedback typed on Claude Code's plan card keeps Claude planning, Fixed, `by @jpcarranza94`, who also reported #2517, so no separate reporter credit). #2515 is docs only, no fold. 5 fragments deleted; `changelog.d` holds only `README.md`. - Ninth refresh (merge of main `fbb97b62`, head `44048d5f`, fold in the merge commit): folded 23 fragments by hand: 7 entries under Added (#2514's rewritten relay-identity entry, which replaces its old Fixed entry about the PC's relay key; #2519 Letta model pill `by @homebodify`; #2522 relay bulk window and the relay overview, self-hosting and hosted-shell attestation; #2524 DeepSeek Harness in the catalog), 3 under Changed (#2533 Connect a phone dialog and the `tailscale serve` box; #2539 chat pictures shown whole) and 26 under Fixed: #2508; #2512 `by @lifeofpi-ux`; #2516; #2521, #2526, #2531, #2538, #2541, #2543, #2545, #2547, #2549 and #2551 `by @jpcarranza94`; #2527 `reported by @duytbp` (#2510); #2532; #2535 `reported by @devtm1123` (#2513). #2532's #2523 is the maintainer's; @jpcarranza94's issues (#2525, #2537, #2540, #2542, #2544, #2546, #2548, #2550) are covered by his PR credit. #2529 (perf) is not merged and stays out of 0.4.22. 23 fragments deleted; `changelog.d` holds only `README.md`. - Tenth refresh (merge of main `afdfb1e0`, head `1cfcfab7`, fold in the merge commit), on the owner's OK for both: folded #2567 (Connect a phone shows three choice cards and opens on the relay whenever it is offered, with the relay's switch on its card on a tailnet; maintainer PR, no credit) under Changed and #2555 (the New workspace folder picker's compact row; `by @iwangjie`, no linked issue) under Fixed. 2 fragments deleted; `changelog.d` holds only `README.md`. The IMPROVED summary line now says the relay needs no Tailscale, in en, ko, ja and zh. - Eleventh refresh (merge of main `2b620462`, head `13fa0181`, fold in the merge commit), on the owner's go for each: folded 13 entries from 12 fragments by hand. Changed: #2562 (a chat starts loading when the press begins, `by @jpcarranza94`), #2574 (Quote a selection into the message box), #2578 (the relay's switch, reset and failures only in Connect a phone). Fixed: #2564 and #2560 (two entries) `by @jpcarranza94`; #2554 `by @iwangjie`; #2577; #2576 (the session-bound conversation cache, fixing the two HIGHs the post-merge Codex Terra review reproduced in #2562 and #2545); #2572 `reported by @rkqksk` (#2557); #2570 `reported by @nathanvale` (#2566); #2571 `reported by @altgans` (#2568); #2575 `reported by @matiemer` (#2558). @jpcarranza94's own issues (#2559, #2561, #2563) are covered by his PR credit. 12 fragments deleted; `changelog.d` holds only `README.md`. IMPROVED summary: "Select words in a Chat reply to quote them into your message." replaces the spacing line, in en, ko, ja and zh. - Twelfth refresh (merge of main `64ae5e72`, head `3ae2133e`), on Dori's go: folded #2580 under Fixed (the Cloudflare relay closes both ends of a pair after a frame send fails, so they reconnect at once; maintainer PR, no credit) and deleted its fragment. #2579 (guide only) has no fragment. Summaries unchanged. - Thirteenth refresh (merge of main `99a6671f`, head `aebaabbf`), on Dori's go: folded #2582 under Fixed (`by @iwangjie`: the folder picker's Show hidden waits for a loading folder; the path bar wraps at very narrow widths) and deleted its fragment. Summaries unchanged. - Maintainer PRs without a fragment and without a user-facing change have no entry: #2436 (relay crypto/mux foundations, not wired yet), #2445 (CI contract test against a pinned hc). - **Release summaries:** en, ko, ja and zh each have 8 new, 8 improved and 8 fixed lines (8 is the most a list the app reads may hold, 90 characters a line). New: remote access through the Ovis relay, turned on in Settings (off by default), with app.ovis.sh shipping separately (#2514); pictures in Chat for Copilot, Grok and Hermes (#2479, #2481, #2482); svg figures (#2477); math with dollar signs (#2498); Portal sign-in with watch-only visitors (#2065); DeepSeek Harness in Settings → Agents with its conversations in Chat on Linux (#2524, #2453); tab names from the first message (#2502); notes on diff lines (#2505). Improved: Expand thinking / Collapse work defaults (#2484), Chat spacing that follows the font size (#2491), key bar drag reorder (#2463), same-host links in an in-app popup on phones (#2459), Claude question cards with steps and Back (#2503), OmO, Codex and Hermes cards with Back and Next (#2506), one Connect a phone dialog (#2533), pictures shown whole (#2539). Fixed: panes again on Safari 16.4–17.3 and iOS 16.4+ (#2535), Stop with a queued follow-up keeps the stopped message (#2547), a first message reaches Claude Code (#2526), Codex Chat after a finished answer (#2443), question cards show at once and stay (#2543), Chat no longer redraws turns or jumps (#2538, #2545), a setting kept across a quick reload (#2487), Claude's plan card in narrow panes (#2541). Moved to the changelog only to fit the 8-line lists: Codex behind Kiro (#2420), Pi messages with spaces (#2474), the Claude question card between questions (#2466, #2467, now covered by the question-card line), short-phone overlap (#2494), cross-tab settings (#2486), the Antigravity note (#2472), plus the subagent poll perf (#2527), relay transport (#2516), herdr-core no-watch (#2512) and the other Fixed entries above. - **Remote bundle:** `REMOTE_BUNDLE_VERSION` rises from 40 to 41 because the bundle inputs (`server/`, `shared/`, `bun.lock`) changed since remote-v40. After merge: push `remote-v41` on the merged commit and wait for the Remote PC bundles workflow before running Release. - **Telemetry:** `telemetry/worker.ts` and `shared/telemetry.ts` are unchanged since `telemetry/deployed.json`; no Worker deploy. ## Validation - `bun scripts/release-guards.ts --base v0.4.21`: before the bump it asked to raise `REMOTE_BUNDLE_VERSION` from 40 to 41 and nothing else; after it, "Release 0.4.22: remote bundle, telemetry Worker and release metadata are in order." - `UNIT_TEST_WORKERS=4 dori heavy rel0422 -- bun run check fast` on this branch: workflow syntax, generated types and themes, typecheck, build, unit tests all ok. Unit: 9827 pass, 0 fail, 41 skip in 623 files. - After folding #2474 (head `3de63b49`): `bun scripts/release-guards.ts --base 653613c` "Release 0.4.22: remote bundle, telemetry Worker and release metadata are in order."; `UNIT_TEST_WORKERS=4 dori heavy refresh2473 -- bun run check fast` all ok, unit 9827 pass, 0 fail, 41 skip in 623 files. - After folding #2475 and correcting the #2474 credit (head `90536524`): `bun scripts/release-guards.ts --base 653613c` "Release 0.4.22: remote bundle, telemetry Worker and release metadata are in order."; `UNIT_TEST_WORKERS=4 dori heavy refresh2473b -- bun run check fast` all ok, unit 9851 pass, 0 fail, 41 skip in 623 files. - After folding #2490, #2483, #2479 and #2482 (head `0da3756d`; `e6eb7df6` removed the fragments and `0da3756d` adds their CHANGELOG entries, which that commit left out): `bun scripts/release-guards.ts --base 98c1f5e` "Release 0.4.22: remote bundle, telemetry Worker and release metadata are in order."; `UNIT_TEST_WORKERS=4 dori heavy refresh2473c -- bun run check fast` all ok, unit 9855 pass, 0 fail, 41 skip in 623 files (with `TMPDIR` off the quota'd `/tmp` tmpfs; an earlier run with the default `TMPDIR` hit `EDQUOT` there). - After the fourth refresh (head `af31fa98`): `bun scripts/release-guards.ts --base v0.4.21` and `--base origin/main` both "Release 0.4.22: remote bundle, telemetry Worker and release metadata are in order." main still has `REMOTE_BUNDLE_VERSION` 40 (no commit since v0.4.21 touches it) and `remote-v41` is not tagged yet, so this PR's 41 stays the one raise. `UNIT_TEST_WORKERS=4 dori heavy rel2473 -- bun run check fast` all ok, unit 9973 pass, 0 fail, 41 skip in 624 files. - After the fifth refresh (head `b602a998`, merge of main `f5370d54`): `bun scripts/release-guards.ts --base v0.4.21` and `--base origin/main` both "Release 0.4.22: remote bundle, telemetry Worker and release metadata are in order." (`REMOTE_BUNDLE_VERSION` stays 41). `UNIT_TEST_WORKERS=4 dori heavy rel2473c -- bun run check fast` all ok, unit 10107 pass, 0 fail, 41 skip in 631 files. - After the sixth refresh (head `e3b0dc37`, merge of main `feb3ae09`): `bun scripts/release-guards.ts --base v0.4.21` and `--base origin/main` both "Release 0.4.22: remote bundle, telemetry Worker and release metadata are in order." (`REMOTE_BUNDLE_VERSION` stays 41). `UNIT_TEST_WORKERS=4 dori heavy rel2473d -- bun run check fast` all ok, unit 10123 pass, 0 fail, 41 skip in 632 files. - After the seventh refresh (head `7855c73c`, merge of main `a683e3ff`): `bun scripts/release-guards.ts --base v0.4.21` and `--base origin/main` both "Release 0.4.22: remote bundle, telemetry Worker and release metadata are in order." (`REMOTE_BUNDLE_VERSION` stays 41). `UNIT_TEST_WORKERS=4 dori heavy rel2473e -- bun run check fast` all ok, unit 10314 pass, 0 fail, 41 skip in 644 files. - After the eighth refresh (head `f76f3ae4`, merge of main `0b215abf`): `bun scripts/release-guards.ts --base v0.4.21` and `--base origin/main` both "Release 0.4.22: remote bundle, telemetry Worker and release metadata are in order." #2514's and #2511's `server/` changes land before `remote-v41` is tagged, so `REMOTE_BUNDLE_VERSION` stays 41. `UNIT_TEST_WORKERS=4 dori heavy rel2473g -- bun run check fast` all ok, unit 10363 pass, 0 fail, 41 skip in 649 files. - After the ninth refresh (head `44048d5f`, merge of main `fbb97b62`): `bun scripts/release-guards.ts --base v0.4.21` and `--base origin/main` both "Release 0.4.22: remote bundle, telemetry Worker and release metadata are in order." (`REMOTE_BUNDLE_VERSION` stays 41; `remote-v41` is not tagged yet). `UNIT_TEST_WORKERS=4 dori heavy rel2473 -- bun run check fast` all ok, unit 10511 pass, 0 fail, 41 skip in 654 files; `server/release-notes.test.ts` and `src/lib/updateNotes.test.ts` 52 pass. - After the tenth refresh (head `1cfcfab7`, merge of main `afdfb1e0`): `bun scripts/release-guards.ts --base v0.4.21` and `--base origin/main` both "Release 0.4.22: remote bundle, telemetry Worker and release metadata are in order." (`REMOTE_BUNDLE_VERSION` stays 41; both PRs are client-only). `UNIT_TEST_WORKERS=4 dori heavy rel2473j -- bun run check fast` all ok, unit 10511 pass, 0 fail, 41 skip in 654 files; `server/release-notes.test.ts` and `src/lib/updateNotes.test.ts` 52 pass. - After the eleventh refresh (head `13fa0181`, merge of main `2b620462`): `bun scripts/release-guards.ts --base v0.4.21` and `--base origin/main` both "Release 0.4.22: remote bundle, telemetry Worker and release metadata are in order." (`REMOTE_BUNDLE_VERSION` stays 41; `remote-v41` is not tagged). `UNIT_TEST_WORKERS=4 dori heavy rel2473k -- bun run check fast` all ok, unit 10551 pass, 0 fail, 41 skip in 656 files; `server/release-notes.test.ts` and `src/lib/updateNotes.test.ts` 52 pass. - After the twelfth refresh (head `3ae2133e`, merge of main `64ae5e72`): both release guards "in order" (`--base v0.4.21` and `--base origin/main`); `UNIT_TEST_WORKERS=4 dori heavy rel2473l -- bun run check fast` all ok, unit 10553 pass, 0 fail, 41 skip in 656 files; release-notes tests 52 pass. - After the thirteenth refresh (head `aebaabbf`, merge of main `99a6671f`): both release guards "in order" (`--base v0.4.21` and `--base origin/main`); `UNIT_TEST_WORKERS=4 dori heavy rel2473m -- bun run check fast` all ok, unit 10553 pass, 0 fail, 41 skip in 656 files; release-notes tests 52 pass. - Not run: `bun run check full` (integration and browser), left to CI; no hands-on test of main, which is the owner's. This is a release-metadata PR: it changes no code path. Per the release steps, merge it after CI and the owner's go, then push `remote-v41`, wait for its bundles, and run Release with `0.4.22`. [exit 0]
Change
Make the
node_linktest fixture independent of the machine's installed Node.The fixture's
pc(false)means there is no user Node, but itsoriginal_pathalso included
/usr/bin:/bin. On a Linux machine with a recent/usr/bin/node,the production installer correctly retained that existing Node and did not make
the link the test expected. The purported no-user-Node case therefore depended
on the host rather than the fixture.
Restrict only the fixture's
original_pathto its temporaryuserPath.Deliberately supplied fixture Nodes still work. The shell keeps its normal
utility PATH; production
install.shand all assertions are unchanged.This is a test-only correction, with no installed-app behavior change.
Validation
with test concurrency limited to two. Other cases in that file passed.
bun test --max-concurrency=2 scripts/install-node-fallback.test.ts:29 passed, 0 failed, 80 expectations on the exact corrected file.
bun run check fast: workflow syntax, generated types/themes,typecheck and build passed. Unit tests: 9,165 passed, 36 skipped, 1 failed
(9,202 tests across 591 files; 416,617 expectations). The source fingerprint
remained unchanged. This is not a passing full local check.
server/request-log.test.ts:neither follows nor writes a symlinked log pathexpected its temporary targetto retain mode
0640. This validation service used umask0077, so thefixture's
writeFileSync(..., {mode: 0o640})created it as0600before thelogger ran. The log writer refused the symlink with
ELOOPas intended.The unchanged file then passed 14/14 tests, 32,084 expectations, under
umask
0027. No production permission or assertion was changed; no secondfull-suite pass is claimed. This existing fixture-mode assumption is disclosed,
not included as an unrelated change in this PR.
Local test settings:
UNIT_TEST_WORKERS=1 BUN_OPTIONS=--max-concurrency=2.The ordinary check script is unmodified; no tests are skipped by those settings.
there is no production, HTTP/WebSocket, UI or installer behavior change.
No live Herdr session, application installation or user credentials are used
by the fixture validation. A local pass is not a claim that upstream CI passed.