2026 OPENCLAW
UPDATE_
FALSCHER_
NODE_
GESCHRIEBEN.

Abstrakte Darstellung von Terminalausgabe und Node-Runtime-Versionsvergleich

Rund um OpenClaw v2026.5.20 wird ein Fehlerbild oft fälschlich als Schein-Upgrade oder defekter Kanal-Token interpretiert, obwohl die Ursache banal und hart ist: Der in der LaunchAgent-Plist fest codierte Node-Pfad stimmt nicht mehr mit dem überein, den Ihre Shell über which node liefert—openclaw update hat die Dienstdefinition in Follow-up-Schritten mit dem Node aus der aktuellen PATH neu geschrieben. Nach dem nächsten gateway restart beendet launchd den Prozess alle neunzig Sekunden mit Code 1, während die CLI bereits die neue Semver zeigt. Release 2026.5.20 (PR #84043) erzwingt Post-Install-Arbeit über den verwalteten Gateway-Service-Node und stellt runningVersion in openclaw gateway status --json bereit, um CLI/Gateway-Protokoll-Skew früh zu erkennen. Dieser Artikel liefert Symptommatrix, Entscheidungstabelle, sechs Schritte Runbook, drei Abnahme-Gates, Praxis-Fallstudie und FAQ—verknüpft mit unseren Beiträgen zu Schein-Upgrade und gateway status, abgelaufenen LaunchAgent-Tokens und ungültiger Konfiguration und doctor—damit Sie 7×24-Abnahme und Rollback auf einem remote Apple-Silicon-Gateway ohne Raten durchführen.

1. Schmerzpunkte: kein Versionsstring-Problem—Node-Binary-Drift

Erstens: Mehrere Node-Installationen auf einem Mac sind Normalzustand. Typisch auf Apple Silicon: Homebrew-Node unter /opt/homebrew/opt/node/bin/node, nvm-Default 22.x in ~/.nvm/versions/node/..., fnm-Globalalias 20.x—gleichzeitig. Bei openclaw gateway install wurde der damals aktive node als absoluter Pfad in ~/Library/LaunchAgents/ai.openclaw.gateway.plist in ProgramArguments eingetragen. Dieser Pfad bleibt frozen, bis etwas die Plist umschreibt—häufig still während eines Updates.

Zweitens: PATH-Wechsel löst Drift aus. Sie SSH-en rein, nvm use 25, führen openclaw update aus. Vor 5.20 liefen Follow-up-Hooks—doctor, Plugin-Reparatur, Gateway-Neustart—unter dem neuen PATH-Node, nicht unter dem Node, den launchd noch nutzte. Wechselt das globale npm-Präfix mit, zeigt die Plist plötzlich auf einen nvm-Shim, während Produktion unter Homebrew installiert war. Tarball-Version korrekt—supervisierter Prozess startet nicht.

Drittens: Abgrenzung zum Schein-Upgrade. Dort meldet die CLI 5.20, der laufende Gateway-Prozess bleibt 5.12—PID wechselt nicht. Bei Node-Drift können CLI und JSON beide 5.20 zeigen, launchd stürzt aber ab, weil engines.node am falschen Major scheitert, native Module nicht passen oder das openclaw-Einstiegsskript unter einem Präfix liegt, das der gebackene Node nicht auflöst. Symptome überlappen: WebSocket-Handshake-Fehler, RPC-Timeout, scheinbar unauthorized—Fix ist Laufzeit-Ausrichtung, kein weiteres npm install -g aus dem Laptop.

Viertens: Protokoll-Skew in 5.20. Der Release behält Health-Checks, wenn CLI einen kleinen Patch vor Gateway liegt—bei Node-Drift bootet Gateway gar nicht erst; Sie sehen Crash-Loops statt sauberer Versionsdiff. Plist-Beweise vor Token-Rotation sammeln.

Fünftens: Legacy-Updater-LaunchAgents. Issue #82167 beschreibt ai.openclaw.update.*, die relaunch-en und Gateway per SIGTERM alle paar Minuten beenden. Ab 5.20 deaktiviert openclaw update solche Jobs best-effort; Ihr Runbook braucht trotzdem launchctl list | grep openclaw, um Updater-Thrash von Node-Drift zu trennen.

Sechstens: Remote-Mac verstärkt den Fehler. Upgrade auf dem MacBook mit nvm, Gateway auf Mac Studio unter Service-Account mit Homebrew-PATH. Plist-Fragmente kopieren oder update aus der Laptop-Shell ohne PATH-Freeze—Freitag „Erfolg“, Samstag Totalausfall. Plist-Node, npm root -g und which node pro Host als ein Beweispaket behandeln.

Siebtens: Native Module und globale npm-Bäume verschärfen die Symptomatik. OpenClaw und Plugins kompilieren oder binden oft native Add-ons gegen die Node-Version, unter der sie installiert wurden. Wenn launchd plötzlich einen anderen Major startet, sehen Sie nicht immer sofort „Module not found“—manchmal crasht der Gateway-Prozess beim ersten RPC oder beim Laden eines Kanal-Plugins, während die CLI in einer anderen Shell noch funktioniert. Deshalb reicht ein reines Versionsstring-Vergleich nicht: der Beweis ist immer die Kette plist → node → npm root → openclaw package root.

Achten Sie außerdem auf Login-Shell vs. non-login launchd. nvm und fnm hängen typischerweise in .zshrc oder .bashrc; launchd startet den Gateway-Job ohne diese Dateien. Ein Update aus einer interaktiven SSH-Session kann daher einen Node-Pfad in die Plist schreiben, der in Ihrer Shell „normal“ wirkt, für launchd aber ein Einzelfall unter ~/.nvm/... bleibt, der beim nächsten Neustart des Dienstes nicht mehr existiert, wenn nvm den Ordner rotiert hat.

2. Entscheidungsmatrix: zuerst Node ausrichten oder Paket rollback?

Signal vor OrtBevorzugte AktionNicht tun
openclaw --version und Plist-Node zeigen verschiedene MajorsPATH einfrieren → update mit Service-Node oder gateway install --forceProgramArguments ohne Plist-Backup von Hand ändern
gateway status --json ohne runningVersiongateway restart --wait, launchd Exit-Code prüfenGesamten ~/.openclaw-Baum löschen
Nur Telegram flackert nach UpgradeNode-Drift ausschließen vor Kanal-Token-ArbeitMit 5.2-HTTP-Timeout-Fixes vermischen
Laptop OK, Remote-Mac downPlist-Node vs. npm root -g je Host diffennvm-Pfade vom Laptop in Studio-Plist kopieren
Audit verlangt NachweisSechs Schritte + 30-Min-Probe auf Kontroll-MacFreitag Peak ohne Rollback-Fenster upgraden

Die Matrix ist Triage-Leiter, kein Ersatz für Beweise. Fehlt runningVersion und flackert Telegram—zuerst Node-Zeilen eins und zwei, dann Tokens. npm-Rollback ohne Plist-Fix reproduziert den Crash beim nächsten Restart. Stimmen Plist-Node und which node in minimaler Login-Shell überein, Gateway scheitert trotzdem—dann invalid-config-Runbook: fail-closed Schema und doctor sind orthogonal, können sich aber stapeln.

Praktisch: legen Sie vor dem Upgrade ein PATH-Profil fest—z. B. nur Homebrew mit export PATH="/opt/homebrew/opt/node/bin:$PATH" in einem dedizierten Skript ~/bin/openclaw-prod-env.sh, das Sie für update und gateway install --force sourcen. Dokumentieren Sie, dass interaktive Entwickler-Shells dieses Skript nicht nutzen dürfen. So trennen Sie bewusst „Entwickler-nvm“ von „Produktions-Node“ und reduzieren Drift schon vor dem ersten launchd-Neustart.

3. Sechs Schritte Runbook

Schritt 1 Beweis-Triplet einfrieren

Vor jedem Fix vier Fakten ins Ticket: openclaw --version; which node und node -v; erste zwei ProgramArguments aus ai.openclaw.gateway.plist; vollständiges JSON von openclaw gateway status --json mit runningVersion (5.20+). Weichen Pfade ab, Incident als Node-Drift labeln—Token-Rotation erst nach Schritt 3.

Schritt 2 engines.node auswerten

package.json unter $(npm root -g)/openclaw/ lesen: engines.node und Release-Notes 2026.5.20. Liegt der Service-Node-Major unter der Schwelle, zuerst diesen Node-Baum upgraden, dann openclaw. Doctor kann in interaktiver Shell grün sein, launchd ruft aber älteren gebackenen Binary—engines.node ist der Vertrag für unattended Betrieb.

Schritt 3 Verwalteten Gateway-Node ausrichten (5.20-Pfad)

Ab 2026.5.20+ openclaw update aus Shell mit minimalem PATH oder Service-Account-Profil. Updater soll gebackenen LaunchAgent-Node für Follow-up bevorzugen. Bereits gedriftet: openclaw gateway install --force mit gewolltem Node—ein Manager, ein globales Präfix, eine Plist. npm root -g muss zu ProgramArguments passen. Schritt-1-Snapshot wiederholen; Pfade müssen übereinstimmen.

Schritt 4 Legacy-Updater-LaunchAgents bereinigen

launchctl list | grep openclaw. Taucht ai.openclaw.update.* mit hohem Relaunch auf, deaktiviert 5.20-update das; auf älteren Builds manuell launchctl bootout gui/$UID/ai.openclaw.update.* nach Prüfung, dass kein Job läuft. Issue #82167: Gateway-SIGTERM im Drei-Minuten-Takt oft Updater vs. Haupt-Gateway—notfalls Modell-API.

Schritt 5 Geordneter Gateway-Neustart und JSON-Sonden

openclaw gateway restart --force --wait, dann dreimal openclaw gateway status --json im zehn Sekunden Abstand. Stabile runningVersion, RPC innerhalb SLO, kein steigender launchd-Exit. Remote ohne interaktive Session: launchctl kick -k gui/$UID/ai.openclaw.gateway, Sonden vom Bastion-Host. JSON ans Ticket.

Parsen Sie das JSON bewusst: neben runningVersion notieren Sie Lauscport, PID-Erzeugungszeit und RPC-Latenzfelder, falls vorhanden. Ein Gateway, das sofort nach dem Start beendet wird, liefert oft gar kein runningVersion—dann ist launchd-Log (log show --predicate 'process == \"node\"' --last 5m oder Gateway-Logdatei) die nächste Evidenzschicht, nicht erneutes Token-Drehen.

Schritt 6 Remote 7×24 Kontrolllauf und Rollback-Fenster

Auf Kontroll-Knoten—ideal MACGPU Remote-Mac mit clean PATH ohne nvm in launchd—Schritte 1–5 identisch. Erst nach 30 Minuten grünem openclaw channels status --probe Produktion anfassen. Scheitert Produktion: vorheriges openclaw-Tarball pinnen und altes Plist-Node-Paar aus Backup; npm-Präfix und Plist diffen vor Abschluss.

# Beweis-Triplet openclaw --version which node && node -v plutil -p ~/Library/LaunchAgents/ai.openclaw.gateway.plist | head -20 openclaw gateway status --json # Globales Präfix npm root -g ls -la "$(npm root -g)/openclaw/package.json" grep -A2 '"engines"' "$(npm root -g)/openclaw/package.json" openclaw gateway install --force openclaw gateway restart --force --wait openclaw gateway status --json launchctl list | grep openclaw

4. Drei Selbstcheck-Gates

Gate A — Node: Plist-Node existiert; node -v erfüllt engines.node; derselbe Pfad wie which node in Service-Login-Shell ohne nvm/fnm—es sei denn, diese Hooks sind bewusst produktive Wahl in der Plist.

Gate B — Version: gateway status --json liefert runningVersion passend zu openclaw --version im von 5.20 dokumentierten Skew-Fenster—beide auf derselben Node-Laufzeit.

Gate C — Kanäle: openclaw channels status --probe ohne rote Zeilen; 30 Minuten nach Restart launchd Exit 0, kein „sofort wieder aus“ in Gateway-Logs. Gate fail → Traffic halten, Plist + Paket rollback.

5. Tiefenfall: „Update erfolgreich, morgens Gateway offline“

„Ops führten openclaw update vom MacBook (nvm Node 22) per SSH auf Mac Studio aus, Gateway unter Homebrew Node 25. Freitag Erfolg. Samstag Plist auf /Users/ops/.nvm/.../node, Plugins erwarteten /opt/homebrew/...; launchd Exit alle 90s Code 1.“

Team öffnete Schein-Upgrade-Runbook—Plugins liefen manchmal per SSH. CLI und JSON zeigten 5.20—bis Plist vs. which node auf Studio-Service-Account diffeten. Node-Drift, kein Token. Probe auf MACGPU-Kontroll-Mac mit einem Homebrew-Node, sechs Schritte, JSON grün—Produktion nur Plist-Node-Paar + gateway install --force; Kanäle in 30 Minuten wieder da. Regel danach: kein openclaw update aus nvm-Shell gegen remote launchd-Gateway; Service-Profil, env -i, oder CI mit frozen Node.

Zweite Lektion: Plist-Diff und engines.node-Screenshot ans Upgrade-Ticket. Auditoren verlangen Runtime-Pin-Nachweis, nicht nur Semver-Screenshots. Kontroll-Knoten-Rehearsal verhinderte zweites blindes Plist-Paste vom Laptop.

Dritte Lektion: Rollback ist zweigleisig. Nur das npm-Tarball zurückzudrehen reicht nicht, wenn die Plist bereits auf einen nvm-Pfad zeigt, der zum alten Paketpräfix passte. Bewahren Sie paarweise Backups: ai.openclaw.gateway.plist plus Ausgabe von npm list -g openclaw --depth=0 zum Zeitpunkt des letzten grünen channels status --probe. Beim Rollback beide Schichten gemeinsam wiederherstellen, dann Schritt 5 erneut fahren.

6. Brancheneinblick: Runtime-Pinning und macOS-Daemon-Praxis

2026: Node-Fragmentierung (nvm, fnm, Volta, Homebrew) macht „globale CLI“ und „Daemon-Laufzeit“ zu zwei Wahrheiten pro UID. OpenClaw 5.20 mit managed service Node in der Update-Kette markiert Shift: Agent-Gateway-Ops von „installiert“ zu pin, diff, rollback. Change-Templates enthalten Plist-Node, engines.node, gateway-status-JSON neben Semver.

launchd mit absoluten Pfaden bestraft Drift härter als Linux systemd mit sauberem Environment-Block. Ein falscher node-String = Totalausfall. Remote Apple Silicon—Studio, mini—beliebt für 7×24-Gateways wegen Unified Memory und Desktop-Kanälen; PATH-Hygiene scheitert teuer, ohne Hypervisor-Schicht.

MACGPU Remote-Mac als goldenes Kontrollsystem isoliert Probe vom Laptop-nvm. Snapshot, sechs Schritte, 30-Min-Probe, exakt dasselbe Plist/npm-Präfix-Paar in Produktion—Versicherung gegen „läuft in meiner SSH-Session“.

Windows/Linux kennen Multi-Node-Schmerz; macOS LaunchAgent-Lehre: gateway install --force als unterstütztes Realign-Tool, nicht Hand-XML. Teams mit dieser Gewohnheit weniger Wiederholungen nach jedem May-Micro-Release.

Für regulierte Umgebungen lohnt sich ein Golden-Image-Ansatz: ein dedizierter Remote-Mac mit genau einem Node-Manager, dokumentiertem globalen Präfix und wöchentlichem Snapshot der Plist. Jede OpenClaw-Micro-Release wird zuerst dort gefahren; das Ticket enthält JSON von gateway status --json, plist-Diff und Ergebnis der 30-Minuten-Kanal-Sonde. Produktion erhält nur die genehmigten Befehle—nicht improvisierte nvm-Wechsel aus dem Laptop. MACGPU-Knoten eignen sich als solche Goldkopie, weil PATH und launchd-Kontext von Anfang an für unattended Betrieb designt sind.

Langfristig verschiebt sich Agent-Betrieb von „npm global reicht“ zu Runtime-as-Contract. Wer das früh in Runbooks verankert, spart Eskalationen an Modellanbieter und Kanal-Token-Teams, obwohl die eigentliche Ursache nie im Netzwerk lag.

7. Zitierbare Schwellenwerte

① Plist-Node ≠ which node in Service-Shell → Upgrade nicht für erfolgreich erklären. ② engines.node verlangt Node ≥22 (Tarball prüfen)—Service-Node darunter → Node zuerst. ③ Mehr als drei launchd Non-Zero-Exits in 30 Min post-upgrade → Rollback mit Plist/npm-Diff. ④ Dreimal gateway status --json ohne runningVersion → Gateway Unhealthy. ⑤ Unterschiedliches globales npm-Präfix Remote vs. Laptop → kein plattformübergreifendes Plist-Kopieren; je Host gateway install --force.

Hygiene: globale npm-Installs pro UID serialisieren; zehn Minuten Gateway-Logs vor/nach Restart; Plist-Backup mit Timestamp im Ticket—Sekunden Arbeit, Stunden Kanalausfall vermieden, Modellanbieter erst nach erschöpftem Node-Beweis im Fokus.

Ergänzen Sie eine Post-Upgrade-Checkliste im Ticket-Template: Feld „Plist-Node identisch zu Service-which-node? (Ja/Nein)“, Feld „runningVersion dreifach stabil?“, Feld „30-Min-Probe grün?“. Ohne diese drei Häkchen bleibt der Change im Status „Implementiert, nicht abgenommen“—auch wenn die CLI bereits die neue Version zeigt. Das verhindert wiederkehrende Wochenend-Paging, wenn launchd erst nach dem Change-Fenster neu startet.

8. FAQ

Unterschied zum Schein-Upgrade? Schein-Upgrade: Versionsstrings und PID-Alter, CLI neu, Prozess alt. Node-Drift: Binary-Pfade und engines.node, Versionen gleich, launchd startet Runtime nicht.

Muss 5.20? Fix für managed service Node in 5.20 (PR #84043). Älter: nach jedem update manuell gateway install --force mit frozen PATH—or zuerst 5.20.

Docker? Meist ein Node im Image; Drift selten. Image-Tag vs. Volume beachten.

Plist von Hand? Mit Backup möglich; gateway install --force regeneriert konsistente ProgramArguments.

MACGPU-Knoten? Isolierter PATH, 7×24 Apple Silicon, reproduzierbare Kontroll-Rehearsal für sechs Schritte und Rollback—ersetzt kein Change-Approval.

Hilft doctor --fix? Doctor repariert Konfig-Schema, nicht Node-Pfade. Nach Node-Gates doctor, wenn fail-closed bleibt—Reihenfolge im invalid-config-Runbook.

Welche launchctl-Befehle sind sicher? launchctl kick -k auf ai.openclaw.gateway ist üblich; bootout nur für verwaiste ai.openclaw.update.*-Jobs nach Bestätigung, dass kein Update läuft. Niemals alle openclaw-Labels pauschal entfernen, ohne plist-Backup—sonst verlieren Sie EnvironmentVariables und ThrottleInterval, die OpenClaw korrekt gesetzt hat. Dokumentieren Sie jeden manuellen launchctl-Eingriff mit Uhrzeit und vorherigem launchctl list | grep openclaw-Auszug.