Skip to content

feat(runtime): require Node 24 for servers and remote hosts - #26171

Merged
nwparker merged 4 commits into
mainfrom
nwparker/node24
Oct 9, 2026
Merged

nwparker merged 4 commits into
mainfrom
nwparker/node24

Conversation

@nwparker

@nwparker nwparker commented Oct 7, 2026 •

Copy link
Copy Markdown
Contributor
Files Added Deleted Net
Test 24 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​197 $\color{#cf222e}{\Huge{\mathbf{−}}}$​133 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​64
Prod 37 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​100 $\color{#cf222e}{\Huge{\mathbf{−}}}$​115 $\color{#cf222e}{\Huge{\mathbf{−}}}$​15

ELI5

Orca servers now require Node 24 or newer. The bundled runtime meets that requirement; explicitly selected host runtimes must also meet it.

What Changed

Server code and host-runtime discovery previously accepted Node 18. They now require Node 24, with matching installation guidance. The bundled SSH runtime remains the default established on main. WSL follows the same host minimum and rebuilds cached launchers after the policy change.

Server, relay and child-process builds target Node 24. CI verifies the managed-hook runtime on Node 24, and remote fixtures and SSH documentation reflect the new default. The small compatibility launcher remains built for Node 18, allowing older host Node to start the bundled runtime.

Why

Using the runtime shipped with Orca gives server code a consistent Node 24 baseline while preserving bootstrap on older hosts. Retaining host Node 18 as a server runtime would prevent adopting that baseline.

Linked Issue

N/A — maintainer change.

Visual Proof

N/A — runtime selection and build changes have no visible UI change.

Testing

  • I manually tested these changes locally
  • Automated tests added/updated, or explained why not below

Final macOS validation after merging current main: 436 focused runtime, WSL-policy, SSH and CI-scope tests passed (one environment-gated test skipped). A separate launcher/fallback run passed all 21 tests, using a real Node 18 launcher and bundled Node 24.21.0. Full pnpm tc, pnpm run check:code-quality:changed origin/main, pnpm run build:relay, pnpm run build:orcad, and the managed-hook Node 24 smoke passed.

The merge preserves main's newer SSH fallback behavior and launcher crash regression. Windows and missing-artifact failure guidance now consistently requires Node 24; the WSL benchmark probe checks later candidates when PATH points to an older Node. A controlled shell check verifies Node 18 is skipped in favor of Node 24. After correcting a stale deployment-test expectation, all 43 affected deployment/fallback tests passed locally. Fresh CI on final commit d43bd15 passed all applicable checks, including all five test shards, Windows x64/ARM inbox and preview OpenSSH, packaged Windows runtime switching, macOS/Linux persistence, SSH watcher isolation, and cross-version wire compatibility.

Review

All three sub-agent adversarial reviews returned CLEAN for both split boundaries, followed by a CLEAN final Claude Opus 5.5 review via Orca orchestration. An independent rebase review verified that every policy change and the launcher crash fix are preserved.

Agent skill upstream boundary

  • Not applicable, or this change copies or mechanically translates no upstream skill-installer source, tests, fixtures, registry entries, path tables, comments, or documentation.

Notes

The launcher is merged in #26374. This PR contains the separate Node 24 runtime policy change and preserves main’s newer SSH fallback behavior, bundled-runtime default, and launcher crash regression. No remote wire format change.

Checklist

  • This PR is small and focused
  • I explained what changed and why (ELI5, the user-facing before/after, the mechanism, and why over the alternatives)
  • Before/after screenshots or videos attached for UI changes, or N/A with reason
  • Self-reviewed for correctness, security, and performance
  • Cross-platform, SSH/remote, and path/shortcut impact considered (or N/A)
  • pnpm lint, pnpm typecheck, pnpm test, and pnpm build pass (or CI will cover; local preferred)

@coderabbitai

coderabbitai Bot commented Oct 7, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Repository UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 74ec01cf-9a55-46d1-86be-71f6e3544c07
📥 Commits

Reviewing files that changed from the base of the PR and between 798acfbb65c31ce264b7fa6626487099007d094f and 9a78990e6e4e1d060ad40368789c21ebfd0bbec3.

📒 Files selected for processing (3)
  • config/reliability-gates.jsonc
  • config/scripts/build-orcad.mjs
  • src/shared/orcad-artifacts.ts

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 7 remain after this review.


📝 Walkthrough

Walkthrough

The Orcad build now produces a Node 24 server entry and a separate compatibility launcher. Local and SSH launch paths select the appropriate entry, and build identity uses the launcher for split-entry installations. SSH host-runtime checks and relay bundles now require Node 24 or newer, with pinned Node selected by default. Managed-hook CI, runtime tests, E2E setup, reliability-gate records, and SSH documentation reflect the updated runtime.

Priority: ➖ Normal

Merge Risk: 🔵 Low · up to 9a789

A WSL benchmark can reject an environment that has a usable Node 24, producing a false negative in benchmark validation. The issue is limited to that workflow and does not block the runtime path.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage Warning Docstring coverage is 47.06% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 51 functions across 58 files. (1 skipped:… Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Title check Passed The title clearly and concisely summarizes the primary change: requiring Node 24 for servers and remote hosts.
Description check Passed The description includes the required sections, explains the user-facing change and rationale, documents testing and review, and completes the checklist. The maintainer-specific Linked Issue exception…
Full details: Docstring Coverage

Explanation

Docstring coverage is 47.06% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 51 functions across 58 files. (1 skipped: 1 unsupported.)

  • Fix all pre-merge checks with AI
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Commit to this branch
  • Create a new PR
  • Autopilot · 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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@nwparker
nwparker force-pushed the nwparker/node24 branch 2 times, most recently from eb41bd7 to 99cf546 Compare October 7, 2026 20:16

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1


ℹ️ Review info
⚙️ Run configuration
  • Configuration used: Repository UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 4af01711-6f7a-484c-bf0b-8b8276489510
📥 Commits

Reviewing files that changed from the base of the PR and between 00984cc and 99cf5463ff8dbf20fc4ca10e78062676d38237bb.

📒 Files selected for processing (98)
  • .github/workflows/e2e.yml
  • .github/workflows/pr.yml
  • config/reliability-gates.jsonc
  • config/scripts/build-orcad-prebuilds.mjs
  • config/scripts/build-orcad.mjs
  • config/scripts/build-relay.mjs
  • config/scripts/check-runtime-launcher-protocol-ratchet.mjs
  • config/scripts/node-server-change-scope.mjs
  • config/scripts/node-server-test-paths.mjs
  • config/scripts/orcad-entry-build.mjs
  • config/scripts/orcad-prebuild-slot-contents.mjs
  • config/scripts/orcad-prebuild-slot-contents.test.mjs
  • config/scripts/orcad-terminal-smoke-change-scope.mjs
  • config/scripts/pr-auxiliary-preflight-admission.test.mjs
  • config/scripts/pr-code-change-scope.mjs
  • config/scripts/pr-code-change-scope.test.mjs
  • config/scripts/pr-workflow-parallelism.test.mjs
  • config/scripts/profile-state-worker-smoke.mjs
  • config/scripts/run-node-server-tests.mjs
  • config/scripts/runtime-serve-terminal-smoke.mjs
  • config/scripts/smoke-managed-hook-runtime-node24.mjs
  • config/scripts/wsl-hook-relay-reattach-benchmark.mjs
  • docs/reference/orcad-operations.md
  • docs/site/content/docs/ssh.mdx
  • src/main/agent-hooks/wsl-hook-relay-deps.ts
  • src/main/agent-hooks/wsl-hook-relay-launch.ts
  • src/main/agent-hooks/wsl-hook-relay-manager.ts
  • src/main/agent-hooks/wsl-relay-runtime-policy.test.ts
  • src/main/ai-vault-search/session-search-in-process-service.ts
  • src/main/ai-vault-search/session-search-sqlite-support.ts
  • src/main/browser/wsl-browser-network-relay-launch.test.ts
  • src/main/browser/wsl-browser-network-relay-launch.ts
  • src/main/ipc/runtime-watcher-disposal-owners.ts
  • src/main/orcad/launcher.ts
  • src/main/orcad/main-preflight-order.test.ts
  • src/main/orcad/main.ts
  • src/main/orcad/orcad-bundled-runtime.test.ts
  • src/main/orcad/orcad-bundled-runtime.ts
  • src/main/orcad/orcad-health.ts
  • src/main/orcad/orcad-launcher-isolation.integration.test.ts
  • src/main/orcad/orcad-local-serve-selection.test.ts
  • src/main/orcad/orcad-local-serve-selection.ts
  • src/main/orcad/orcad-managed-stop.test.ts
  • src/main/orcad/orcad-profile-preflight.test.ts
  • src/main/orcad/orcad-profile-preflight.ts
  • src/main/persistence/profile-state/profile-state-database.ts
  • src/main/runtime/mobile-session-terminal-retirement.ts
  • src/main/skills/skill-delete/recovery.ts
  • src/main/skills/skill-delete/staging.ts
  • src/main/sqlite/sync-database.ts
  • src/main/ssh/orcad-activation-gate.ts
  • src/main/ssh/orcad-local-build-hash.ts
  • src/main/ssh/orcad-remote-build-hash.integration.test.ts
  • src/main/ssh/orcad-remote-build-hash.ts
  • src/main/ssh/orcad-remote-launch-windows.ts
  • src/main/ssh/orcad-remote-launch.ts
  • src/main/ssh/orcad-remote-preflight.ts
  • src/main/ssh/orcad-remote-runtime-control.ts
  • src/main/ssh/orcad-remote-runtime.ts
  • src/main/ssh/orcad-remote-shell-commands.integration.test.ts
  • src/main/ssh/orcad-remote-windows-commands.test.ts
  • src/main/ssh/orcad-remote-windows-scripts.test.ts
  • src/main/ssh/orcad-windows-host-script.ts
  • src/main/ssh/relay-socket-path-limit.test.ts
  • src/main/ssh/ssh-relay-cross-version-isolation.test.ts
  • src/main/ssh/ssh-relay-deploy-incumbent-verdict.test.ts
  • src/main/ssh/ssh-relay-deploy-pinned-node.test.ts
  • src/main/ssh/ssh-relay-deploy-staged-upload.test.ts
  • src/main/ssh/ssh-relay-deploy-windows-pipe.test.ts
  • src/main/ssh/ssh-relay-deploy.test.ts
  • src/main/ssh/ssh-relay-gc-retry.test.ts
  • src/main/ssh/ssh-relay-host-node-addons.test.ts
  • src/main/ssh/ssh-relay-host-node-addons.ts
  • src/main/ssh/ssh-relay-native-deps-install-fixture.ts
  • src/main/ssh/ssh-relay-pinned-node-install.test.ts
  • src/main/ssh/ssh-relay-pinned-node.test.ts
  • src/main/ssh/ssh-relay-pinned-node.ts
  • src/main/ssh/ssh-relay-runtime-ladder.test.ts
  • src/main/ssh/ssh-relay-runtime-ladder.ts
  • src/main/ssh/ssh-relay-runtime-resolution.test.ts
  • src/main/ssh/ssh-relay-sftp-namespace-install.test.ts
  • src/main/ssh/ssh-remote-node-addon-resolution.test.ts
  • src/main/ssh/ssh-remote-node-addon-resolution.ts
  • src/main/ssh/ssh-remote-node-install-guidance.ts
  • src/main/ssh/ssh-remote-node-resolution.test.ts
  • src/main/ssh/ssh-remote-node-resolution.ts
  • src/main/ssh/ssh-remote-node-toolchain-probe.test.ts
  • src/main/ssh/ssh-remote-node-toolchain-probe.ts
  • src/relay/fs-stream-registry.ts
  • src/relay/git-response-stream.ts
  • src/relay/pty-handler.ts
  • src/relay/relay-agent-process-lifetime.ts
  • src/shared/grouped-by.ts
  • src/shared/orcad-artifacts.ts
  • src/shared/orcad-build-identity.test.ts
  • src/shared/orcad-build-identity.ts
  • src/shared/ssh-types.ts
  • tests/e2e/fixtures/docker-ssh-relay/Dockerfile
💤 Files with no reviewable changes (9)
  • src/relay/pty-handler.ts
  • src/main/runtime/mobile-session-terminal-retirement.ts
  • src/main/skills/skill-delete/staging.ts
  • src/relay/git-response-stream.ts
  • src/shared/grouped-by.ts
  • src/relay/relay-agent-process-lifetime.ts
  • src/relay/fs-stream-registry.ts
  • src/main/ipc/runtime-watcher-disposal-owners.ts
  • src/main/ai-vault-search/session-search-sqlite-support.ts

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 7 remain after this review.

@@ -272,8 +272,8 @@ async function main() {
]),
{ allowFailure: true }
)
if (nodeVersion.status !== 0 || Number(nodeVersion.stdout.trim().split('.')[0]) < 18) {
throw new Error(`WSL distro '${distro}' needs Node.js 18 or newer to run Orca's relay`)
if (nodeVersion.status !== 0 || Number(nodeVersion.stdout.trim().split('.')[0]) < 24) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Check all WSL Node candidates before rejecting the distro.

If node on PATH is Node 18 and $HOME/.local/bin/node is Node 24, the probe on Line 271 returns Node 18 and this condition stops the benchmark. The production launcher checks later candidates and can start the relay in that distro. Make the probe select a candidate that meets the Node 24 minimum before it reports failure.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔇 Additional comments (14)
config/scripts/orcad-entry-build.mjs (1)

58-75: LGTM!

src/main/orcad/launcher.ts (1)

10-23: LGTM!

src/main/ssh/orcad-local-build-hash.ts (1)

1-9: LGTM!

src/main/orcad/orcad-health.ts (1)

11-11: LGTM!

Also applies to: 60-60, 85-85, 96-96

src/shared/orcad-build-identity.test.ts (1)

1-34: LGTM!

src/shared/orcad-build-identity.ts (1)

1-19: LGTM!

src/main/ssh/orcad-remote-launch.ts (1)

93-93: LGTM!

Also applies to: 120-120

src/main/ssh/orcad-remote-build-hash.ts (1)

1-2: LGTM!

Also applies to: 33-39

src/main/ssh/orcad-remote-build-hash.integration.test.ts (1)

18-42: LGTM!

src/main/ssh/orcad-remote-windows-scripts.test.ts (1)

358-371: LGTM!

src/main/ssh/orcad-remote-shell-commands.integration.test.ts (1)

135-137: LGTM!

Also applies to: 379-402

config/scripts/pr-code-change-scope.mjs (1)

31-31: 🗄️ Data Integrity & Integration

The concern is refuted. .github/workflows/pr.yml uses managed_hook_node24 for the path output, job, required-check list, and aggregation. The related tests also use the renamed key. No stale managed_hook_node18 reference appears in the inspected workflow and script scopes.

.github/workflows/e2e.yml (1)

695-697: 🎯 Functional Correctness

The concern is unsubstantiated as a functional defect. The SSH journey does not invoke node or npm remotely. It runs shell commands, /bin/sh, printf, test, and file checks. The symlink setup alone does not establish a required PATH contract or a failure.

docs/reference/orcad-operations.md-11-11 (1)

11-11: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

⚠️ Unverified finding
Verification ran but could not confirm this finding. It is shown for review, not as a verified issue.

Clarify the Windows launch modifier.

“Windows managed launches” is ambiguous. Separate the two launch modes and hyphenate the compound modifier.

Proposed wording
-Local and Windows managed launches start `orcad-server.js` directly.
+Local launches and Windows-managed launches start `orcad-server.js` directly.

Source: Linters/SAST tools


ℹ️ Review info
⚙️ Run configuration
  • Configuration used: Repository UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: b4151869-981d-4207-8553-e79ba6b0766c
📥 Commits

Reviewing files that changed from the base of the PR and between 99cf5463ff8dbf20fc4ca10e78062676d38237bb and a441274.

📒 Files selected for processing (15)
  • .github/workflows/e2e.yml
  • config/scripts/orcad-entry-build.mjs
  • config/scripts/pr-code-change-scope.mjs
  • docs/reference/orcad-operations.md
  • src/main/orcad/launcher.ts
  • src/main/orcad/orcad-health.ts
  • src/main/orcad/orcad-launcher-isolation.integration.test.ts
  • src/main/ssh/orcad-local-build-hash.ts
  • src/main/ssh/orcad-remote-build-hash.integration.test.ts
  • src/main/ssh/orcad-remote-build-hash.ts
  • src/main/ssh/orcad-remote-launch.ts
  • src/main/ssh/orcad-remote-shell-commands.integration.test.ts
  • src/main/ssh/orcad-remote-windows-scripts.test.ts
  • src/shared/orcad-build-identity.test.ts
  • src/shared/orcad-build-identity.ts

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 4 remain after this review.

@nwparker
nwparker force-pushed the nwparker/node24 branch 2 times, most recently from 798acfb to 9a78990 Compare October 7, 2026 23:22
@nwparker nwparker changed the title feat(runtime): default to bundled Node 24 and isolate the server launcher feat(runtime): default to bundled Node 24 and require host Node 24 Oct 8, 2026
@nwparker
nwparker changed the base branch from main to nwparker/orcad-launcher-split October 8, 2026 00:10
@nwparker
nwparker force-pushed the nwparker/orcad-launcher-split branch 2 times, most recently from e7c9ba0 to 245a6c7 Compare October 8, 2026 01:56
@nwparker
nwparker changed the base branch from nwparker/orcad-launcher-split to main October 8, 2026 02:33
@nwparker nwparker changed the title feat(runtime): default to bundled Node 24 and require host Node 24 feat(runtime): require Node 24 for servers and remote hosts Oct 9, 2026
nwparker added a commit that referenced this pull request Oct 9, 2026
…26823)

This reverts commit 46460d4 (#26171).

Pause the Node 24 requirement so existing SSH and WSL users are not
surprised by a host-runtime upgrade requirement in the next release.
This is a precautionary rollout hold requested to avoid near-term user
disruption, not a cancellation of the Node 24 transition.

Restore the prior Node 18 host minimum and companion build targets.
The previously shipped bundled Node 24 runtime and compatibility launcher
remain in place. Preserve the original change in a separate draft PR for
reintroduction after compatibility and rollout validation.
nwparker added a commit that referenced this pull request Oct 9, 2026
Reapply the Node 24 server and host-runtime policy from #26171 after its
temporary compatibility rollback. Keep this change in a draft PR until
host compatibility, fallback behavior and rollout communication have been
reviewed so existing users are not unexpectedly forced to upgrade.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant