diff --git a/CHANGELOG.md b/CHANGELOG.md index f85973ba9ae..00394e0802e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -42,6 +42,7 @@ Docs: https://docs.openclaw.ai ### Fixes - Release validation: install the cross-OS TypeScript harness through Windows-safe Node/npm shims so native Windows package checks reach the OpenClaw smoke suites instead of exiting before artifact capture. Thanks @vincentkoc. +- Release validation: let Windows packaged-upgrade checks continue after the shipped 2026.5.2 updater hits its native-module swap cleanup fallback, verifying the fallback-installed candidate through package metadata and downstream smoke instead of crashing on the immediate update-status probe. Thanks @vincentkoc. - Agents/bootstrap: keep pending `BOOTSTRAP.md` and bootstrap truncation notices in system-prompt Project Context instead of copying setup text or raw warning diagnostics into WebChat user/runtime context. Fixes #76946. - Channels/WhatsApp: allow `@whiskeysockets/libsignal-node` in `onlyBuiltDependencies` so pnpm v9+ `blockExoticSubdeps` no longer rejects the baileys git-tarball subdep and silences all inbound agent replies. Fixes #76539. Thanks @ottodeng and @vincentkoc. - Gateway/install: keep `.env`-managed values in the macOS LaunchAgent env file while still tracking `OPENCLAW_SERVICE_MANAGED_ENV_KEYS`, so regenerated services do not boot without managed auth/provider keys. Fixes #75374. diff --git a/scripts/openclaw-cross-os-release-checks.ts b/scripts/openclaw-cross-os-release-checks.ts index cb11851a573..2449343116e 100644 --- a/scripts/openclaw-cross-os-release-checks.ts +++ b/scripts/openclaw-cross-os-release-checks.ts @@ -779,7 +779,9 @@ async function runUpgradeLane(params) { timeoutMs: updateTimeoutMs(), check: false, }); - if (isRecoverableWindowsPackagedUpgradeSwapCleanupFailure(updateResult, process.platform)) { + const usedWindowsPackagedUpgradeFallback = + isRecoverableWindowsPackagedUpgradeSwapCleanupFailure(updateResult, process.platform); + if (usedWindowsPackagedUpgradeFallback) { logLanePhase(lane, "update-fallback-install"); await installPackageSpec({ lane, @@ -793,14 +795,21 @@ async function runUpgradeLane(params) { }); } - logLanePhase(lane, "update-status"); - await runOpenClaw({ - lane, - env: updateEnv, - args: ["update", "status", "--json"], - logPath: join(params.logsDir, "upgrade-update-status.log"), - timeoutMs: 2 * 60 * 1000, - }); + if ( + shouldRunPackagedUpgradeStatusProbe({ + platform: process.platform, + usedWindowsPackagedUpgradeFallback, + }) + ) { + logLanePhase(lane, "update-status"); + await runOpenClaw({ + lane, + env: updateEnv, + args: ["update", "status", "--json"], + logPath: join(params.logsDir, "upgrade-update-status.log"), + timeoutMs: 2 * 60 * 1000, + }); + } logLanePhase(lane, "run-bundled-plugin-postinstall"); await runBundledPluginPostinstall({ lane, @@ -1350,6 +1359,13 @@ export function isRecoverableWindowsPackagedUpgradeSwapCleanupFailure( ); } +export function shouldRunPackagedUpgradeStatusProbe({ + platform = process.platform, + usedWindowsPackagedUpgradeFallback, +} = {}) { + return !(platform === "win32" && usedWindowsPackagedUpgradeFallback); +} + export function resolveExplicitBaselineVersion(baselineSpec) { const trimmed = baselineSpec.trim(); if (!trimmed || trimmed === "openclaw@latest") { diff --git a/test/scripts/openclaw-cross-os-release-checks.test.ts b/test/scripts/openclaw-cross-os-release-checks.test.ts index 575cdbac9af..5ea01e8aca8 100644 --- a/test/scripts/openclaw-cross-os-release-checks.test.ts +++ b/test/scripts/openclaw-cross-os-release-checks.test.ts @@ -53,6 +53,7 @@ import { resolveRunnerMatrix, resolveStaticFileContentType, shouldExerciseManagedGatewayLifecycleAfterInstall, + shouldRunPackagedUpgradeStatusProbe, shouldRunWindowsInstalledBrowserOverrideImportSmoke, shouldSkipInstallerDaemonHealthCheck, shouldStopManagedGatewayBeforeManualFallback, @@ -716,6 +717,27 @@ describe("scripts/openclaw-cross-os-release-checks", () => { ).toBe(true); }); + it("skips the packaged upgrade status probe after the Windows fallback install", () => { + expect( + shouldRunPackagedUpgradeStatusProbe({ + platform: "win32", + usedWindowsPackagedUpgradeFallback: true, + }), + ).toBe(false); + expect( + shouldRunPackagedUpgradeStatusProbe({ + platform: "win32", + usedWindowsPackagedUpgradeFallback: false, + }), + ).toBe(true); + expect( + shouldRunPackagedUpgradeStatusProbe({ + platform: "linux", + usedWindowsPackagedUpgradeFallback: true, + }), + ).toBe(true); + }); + it("does not recover unrelated packaged update failures", () => { expect( isRecoverableWindowsPackagedUpgradeSwapCleanupFailure(