2026-09-13: The Node 26 Bridge

At midnight on Sunday, Bert asked if automation caught the new OpenClaw: « there in a new openclaw 2.0, did the sunday autoupdate did the upgrade? »
It had not. The automated upgrade daemon haus.sanctum.sunday-upgrade was asleep until morning. Meanwhile, the forty-eight-hour tripwire in our upgrade pipeline held 2026.9.4 at the perimeter. The release had dropped forty-five hours earlier. When Bert called for immediate deployment, the upgrade hit a classic distributed trap: an airgapped Linux guest stuck on an older engine while upstream leaped ahead.
The Runtime Mismatch
Section titled “The Runtime Mismatch”On the Mac Mini host, the CLI upgraded in seventeen seconds. Homebrew already had Node 26.5.1 waiting.
On the airtight Ubuntu guest (lima-sanctum-vm), the gateway crashed at boot:
[openclaw] error: this OpenClaw release requires Node >=24.16.0 <25 || >=26.1.0.[openclaw] detected Node 22.23.1 (exec: /usr/bin/node).[openclaw] install Node: https://nodejs.org/en/downloadThe guest has no direct route to the public internet. This follows our network boundary doctrine. Upgrading packages through apt would puncture the airgap shielding the orchestrator from external reach.
Mutating /usr/bin/node directly was out of the question. Five co-resident daemons run on that binary, including the Firewalla REST bridge and health ingesters. Breaking those to satisfy one gateway was unacceptable.
Isolated Runtime Provisioning
Section titled “Isolated Runtime Provisioning”We solved it with an airgapped payload. We fetched the official Node v26.8.2 Linux aarch64 binary on the host and pushed it across the internal bridge into /opt/node26.
We initially scoped this as an isolated sidecar: /opt/node26/bin/node linked to /usr/local/bin/node for OpenClaw, leaving /usr/bin/node on 22 for legacy background jobs.
We updated openclaw-gateway.service to bind the new runtime:
ExecStart=/home/ubuntu/.openclaw/sops-start.sh gateway /usr/local/bin/node --max-old-space-size=1536 /home/ubuntu/.openclaw/node_modules/openclaw/dist/index.js gateway --port 1977Schema and State Migrations
Section titled “Schema and State Migrations”Node 26 launched cleanly. Then the schema validator stopped us again. OpenClaw 2026.9.4 introduced strict structural checks:
- Timestamp Precision: Python scripts had recorded workspace setup timestamps with six decimal places (
.117210Z). The new Zod validator demanded three-digit millisecond ISO strings (.117Z). A fast normalization across ten workspace state files satisfied the parser. - SQLite Session Stores: OpenClaw migrated legacy session JSON files into SQLite. Running
openclaw doctor --session-sqlite import --session-sqlite-all-agentsconverted six agent stores (main,windu,quigon,cilghal,mundi,mothma) without dropping an event. - Signal Plugin Transport: We upgraded
@openclaw/signalto2026.9.4, converting retiredhttpUrlconfigurations into the modernexternal-nativeschema.
Fleet Unification: Node v26.8.2 Across All Nodes
Section titled “Fleet Unification: Node v26.8.2 Across All Nodes”Once the gateway was up, Bert pointed to the latent complexity of split runtimes: « why aren’t we using all the same engine, letys fix that permanently ».
Having the Mac Mini on 26.5.1, the MBP on 26.8.1, and the VM guest split between 22.23.1 and 26.8.2 introduced unnecessary divergence across the cluster. We audited the co-resident daemons:
- Firewalla REST Bridge (
firewalla-bridge.js): Evaluated standalone under Node 26.8.2. Built strictly on native standard library modules (http,fs,path,url), it started cleanly and bound port 1984 without a hitch. - VM Engine Standardization: Retired
/usr/bin/node(22.23.1archived tonode.bak-22.23.1). Atomically symlinked/usr/bin/node,/usr/bin/npm, and/usr/bin/npxdirectly to/opt/node26/bin/node. Bothopenclaw-gateway.serviceandfirewalla-bridge.servicenow execute Node 26.8.2 identically. - Host Workstations (
manoir&mbp): Upgraded both Homebrew environments from26.5.1/26.8.1to26.8.2and pinned the formula (brew pin node) to prevent uncoordinated dylib shifts during routine maintenance.
Every node in the Sanctum cluster now executes the identical engine: Node v26.8.2.
Live Verification & EETISMAD
Section titled “Live Verification & EETISMAD”- E2E & Tested:
manoir:node -v->v26.8.2(pinned: true). OpenClaw2026.9.4CLI active; gateway loopback probe reachable in 405ms.lima-sanctum-vm:/usr/bin/nodeand/usr/local/bin/node->v26.8.2.openclaw-gateway.service(PID 2907808) andfirewalla-bridge.service(PID 2919715) active and healthy.mbp:node -v->v26.8.2(pinned: true).- Signal provider connected to local port 5150 and healthy.
- Jocasta heartbeat test suite passes 8/8 in 0.09s.
- In Docs: Recorded in this field note with complete architectural provenance.
- Merged: Landed
--forceand--openclaw-onlyoptions insanctum-sunday-upgrade.shonsanctum-config(8ae80d6). - Deployed: Serving live traffic across all three nodes under Node 26.8.2.
The bridge held. The airgap remained unbroken. The fleet now speaks one single, unified engine.