=== OpenClaw Upgrade Verification ===
Waiting for container openclaw-upgrade-test to be ready...
✓ Container is responsive (waiting for init to complete...)
✓ s6 init complete (crond up)
✓ Version: 2026.4.5
✓ Config is valid JSON
✓ tools.profile: coding
✓ Config owned by openclaw
✓ Auth mode: token
✓ Gateway process running
✓ Tailscale binary present
Waiting for gateway HTTP...
FAIL: Gateway HTTP not responding (code: 000000)
✓ Config writable by openclaw user
✓ Channel plugins loaded: discord,signal,telegram,whatsapp
✓ Backup config (backup.yaml) is valid
✓ pnpm store excluded from backups
SKIP: Telegram channel probe (TELEGRAM_BOT_TOKEN not set)
WARN: openclaw doctor did not complete (may need longer startup)
=== Upgrade Verification Results ===
Passed: 11
Failed: 1
Warnings: 1
=== UPGRADE VERIFICATION FAILED (1 failures) ===
Automated Upgrade Failed: 2026.3.11 → 2026.4.5
Failed stage: Docker smoke tests
Workflow run: https://github.com/vhrahulkumar/openclaw-appplatform/actions/runs/24036377948
Test Output
Known Regressions
Release Notes
openclaw 2026.4.5
Breaking
talk.voiceId/talk.apiKey,agents.*.sandbox.perSession,browser.ssrfPolicy.allowPrivateNetwork,hooks.internal.handlers, and channel/group/roomallowtoggles in favor of the canonical public paths andenabled, while keeping load-time compatibility andopenclaw doctor --fixmigration support for existing configs. (#60726) Thanks @vincentkoc.Changes
video_generatetool so agents can create videos through configured providers and return the generated media directly in the reply.durationSecondswith a warning instead of hard-failing requests on providers like Google Lyria.comfyworkflow media plugin for local ComfyUI and Comfy Cloud workflows, including sharedimage_generate,video_generate, and workflow-backedmusic_generatesupport, with prompt injection, optional reference-image upload, live tests, and output download.music_generatetool with bundled Google (Lyria) and MiniMax providers plus workflow-backed Comfy support, including async task tracking and follow-up delivery of finished audio.openclaw plugins install --forceso existing plugin and hook-pack targets can be replaced without using the dangerous-code override flag. (#60590, #60544)contextVisibilityper channel (all,allowlist,allowlist_quote) so supplemental quote, thread, and fetched history context can be filtered by sender allowlists instead of always passing through as received.openai-codex/gpt-5.4-mini, an opt-in GPT personality, and provider-owned GPT-5 prompt contributions so Codex/GPT runs stay cache-stable and compatible with bundled catalog lag.stream-jsonpartial-message streaming so prompts stop riding argv, long replies show live progress, and final session/usage metadata still land cleanly. (#35676) Thanks @mylukin.acpxplugin, remove the extra external ACP CLI hop, harden live ACP session binding and reuse, and add a genericreply_dispatchhook so bundled plugins like ACPX can own reply interception without hardcoded ACP paths in core auto-reply routing. (#61319)openclaw doctorrepair or remove staleanthropic:claude-clistate during migration.grok-imagine-video), Alibaba Model Studio Wan, and Runway video providers, plus live-test/default model wiring for all three.provider: "auto"and provider-specific dimension controls. Thanks @wirjo.AWS_BEARER_TOKEN_BEDROCK. Thanks @wirjo./dreamingcommand, Dreams UI, multilingual conceptual tagging, and doctor/status repair support, while refactoring dreaming from competing modes into three cooperative phases (light, deep, REM) with independent schedules and recovery behavior so durable memory promotion can run in the background with less manual setup. (#60569, #60697) Thanks @vignesh07.recencyHalfLifeDays,maxAgeDays) plus optional verbose logging so operators can tune recall decay and inspect promotion decisions more easily.openclaw memory rem-harness,promote-explain), surface possible lasting truths during REM staging, and make deep promotion replay-safe so reruns reconcile instead of duplicatingMEMORY.mdentries.dreams.mdinstead of daily memory notes, update/dreaminghelp text to point there, and keepdreams.mdavailable for explicit reads without pulling it into default recall. Thanks @davemorin.enabledplus optionalfrequency, treat phases as implementation detail in docs/UI, and keep the lobster animation visible above diary content. Thanks @vignesh07.openclaw status --verbosecache diagnostics, and the removal of duplicate in-band tool inventories from agent system prompts so follow-up turns hit cache more reliably. (#58036, #58037, #58038, #59054, #60603, #60691) Thanks @bcherny and @vincentkoc.openclaw status --verbose. Thanks @vincentkoc.openclaw config schemaJSON Schema with field titles and descriptions so editors, agents, and other schema consumers receive the same config help metadata. (#60067) Thanks @solavrc.agents.defaults.cliBackendssurface, while keeping ACP harness sessions and Gemini media understanding on the native bundled providers.irc.example.comand recommend private servers for bot coordination while listing common public networks for intentional use.Fixes
/allowlist addand/allowlist remove, fail closed whenbefore_tool_callhooks crash, block browser SSRF redirect bypasses earlier, and keep non-interactive auth-choice inference scoped to bundled and already-trusted plugins. (#58476, #59836, #59822, #58771, #59120) Thanks @eleqtrizit and @pgondhi987.reasoning.effort: "none"and strict schemas where supported, add GPT-5.4 assistantphasemetadata across replay and the Gateway/v1/responseslayer, and keep commentary buffered untilfinal_answerso web chat, session previews, embedded replies, and Telegram partials stop leaking planning text. Fixes #59150, #59643, #61282./modelconfirmations, explicit topic replies, persisted reaction ownership across restarts, caption-media placeholder andfile_idpreservation on download failure, and upgraded-install inbound image reads. (#60384, #60042, #59634, #59207, #59948, #59971) Thanks @sfuminya, @GitZhangChi, @dashhuang, @samzong, @v1p0r, and @neeravmakwana.<media:audio>placeholders. (#61008) Thanks @manueltarouca.reasoning:stream, so hidden<think>traces from streamed replies stop surfacing as chat previews on normal sessions. Thanks @vincentkoc./entries visible. (#61129) Thanks @neeravmakwana.@everyoneand@heremention gates, keep ACK reactions on the active account, and split voice connect/playback timeouts so auto-join is more reliable. (#57465, #60361, #60345) Thanks @geekhuashan.[[reply_to_current]]control tags from preview text and honor explicit reply-tag threading during final delivery, so Discord replies stay attached to the triggering message instead of printing reply metadata into chat.replyToOnlyWhenBatchedflag withreplyToMode: "batched"so native reply references only attach on debounced multi-message turns while explicit reply tags still work.MEDIA:paths in tool output, avoid duplicate plain-output media requeueing, and persist volatile workspace-generated media into durable outbound media before final reply delivery so generated image replies stop pointing at missing local files.channels.whatsapp.blockStreamingand reset watchdog timeouts after reconnect so quiet chats stop falling into reconnect loops. (#60007, #60069) Thanks @MonkeyLeeT and @mcaxtr.talk.speakplayback when speech is explicitly stopped, and restore spoken replies on both node-scoped and gateway-backed sessions by keeping reply routing and embedded transport overrides aligned with the current playback path. (#60306, #61164, #61214)channels.matrix.dm.sessionScope, shared-session collision notices, and aligned outbound session reuse so separate Matrix DM rooms can keep distinct context when configured. (#61373) Thanks @gumadeiras.avatarUrlinto the default account during multi-account promotion and keep env-backed account setup avatar config persisted. (#61437) Thanks @gumadeiras.httpServerAdapterso recurring gateway deprecation warnings stop firing and the Express 5 compatibility workaround stays on the supported SDK path. (#60939) Thanks @coolramukaka-sys.ui.assistant.avatarwhen serving/avatar/:agentIdso Appearance UI avatar paths stop falling back to initials placeholders. (#60778) Thanks @hannasdev./stopand same-session overlap checks target the right active turn and restart-interrupted turns return the restart notice instead of being silently dropped. (#61267) Thanks @dutifulbob.text_endchannels so providers that emit explicit text-end boundaries no longer double-send the same final message. (#61530)gateway.modetolocalwhen unset, detect PID recycling in gateway lock files on Windows and macOS, and show startup progress so healthy restarts stop getting blocked by stale locks. (#54801, #60085, #59843) Thanks @BradGroux and @TonyDerek-dot.KeepAliveown in-process gateway restarts again, adding a short supervised-exit delay so rapid restarts avoid launchd crash-loop unloads whileopenclaw gateway restartstill reports real LaunchAgent errors synchronously.launchctl kickstart -kunloads it during restart so failed restarts do not leave the gateway unmanaged until manual repair.openclaw gateway startandrestart, while still preferring live unmanaged gateways during restart recovery. (#43766) Thanks @HenryC-3./Rundoes not start, and report fast failed restarts accurately instead of pretending they timed out after 60 seconds. (#59335) Thanks @tmimmanuel./restartcan relaunch the gateway on Windows setups whereschtasksinstall fell back during onboarding. (#58943) Thanks @imechZhangLY.EADDRINUSEretry loop. (#60480) Thanks @arifahmedjoy.tools.media.asyncCompletion.directSendas an opt-in direct-delivery path for finished async media tasks, while keeping the legacy requester-session wake/model-delivery flow as the default.skills list --json,skills info --json, andskills check --jsonoutput to stdout instead of stderr so machine-readable consumers receive JSON on the expected stream again. (#60914; fixes #57599; landed from contributor PR #57611 by @Aftabbs) Thanks @Aftabbs.failureDestinationis configured. (#60622) Thanks @artwalker.exec host=nodewhen the current exec policy cannot route to a node, and clarify blocked exec-host override errors with both the requested host and allowed config path.CLAUDE_CONFIG_DIRandCLAUDE_CODE_PLUGIN_*, so OpenClaw-launched Claude CLI runs cannot be silently pointed at an alternate Claude config/plugin tree with different hooks, plugins, or auth context. Thanks @vincentkoc.--setting-sources user, even under custom backend arg overrides, so repo-local.claudeproject/local settings, hooks, and plugin discovery do not silently execute inside non-interactive OpenClaw sessions. Thanks @vincentkoc.--permission-modebackend overrides as missing and fail safe back tobypassPermissions, so customcliBackends.claude-cli.argssecurity config cannot accidentally consume the next flag as a bogus permission mode. Thanks @vincentkoc.x-openclaw-scopes, so plugin HTTP handlers no longer mint admin-level runtime scopes on missing or untrusted HTTP scope headers. (#59815) Thanks @pgondhi987.createRequire(...)helper typing so provider-runtime lazy loads compile cleanly again andpnpm buildno longer fails in the Pi embedded provider error-pattern path.operator.*scopes throughnodeauth. (#57258) Thanks @jlapenna.deviceTokenscope requests and empty-cache fallbacks intact so reconnects preserveoperator.readwithout breaking explicit auth flows. (#46032) Thanks @caicongyang./pairsetup-code issuance, cleanup, and approval paths when gateway pairing scopes are missing, and keep approval-time requested-scope enforcement on the internal command path. (#55996) Thanks @coygeek.node.*,operator.admin, andoperator.pairingscopes.allowInsecureSsl: trueopts out.channels.telegram.apiRootfor buffered media downloads, addchannels.telegram.network.dangerouslyAllowPrivateNetworkfor trusted fake-IP setups, and requirechannels.telegram.trustedLocalFileRootsbefore reading absolute Bot APIfile_pathvalues. (#59544, #60705) Thanks @SARAMALI15792 and @obviyus.<tool_call>,<function_calls>, and model special tokens from shared user-visible assistant text, including truncated tool-call streams, so internal scaffolding no longer bleeds into replies across surfaces. (#60619) Thanks @oliviareid-svg.ENOSPC/disk full, so those runs stop degrading into opaqueNO_REPLY-style failures. Thanks @vincentkoc.MODELSTUDIO_API_KEY.shouldNormalizeGoogleProviderConfig is not a functionor other empty-facade reads during bundled plugin re-entry. Thanks @adam91holt.pnpm check/pnpm buildstay green.MEDIA:paths in tool output and avoid duplicate plain-output media requeueing so Discord image replies stop pointing at missing local files.[[reply_to_current]]control tags from preview text and honor explicit reply-tag threading during final delivery, so Discord replies stay attached to the triggering message instead of printing reply metadata into chat./modelconfirmations, explicit topic replies, persisted reaction ownership across restarts, caption-media placeholder andfile_idpreservation on download failure, and upgraded-install inbound image reads. (#60384, #60042, #59634, #59207, #59948, #59971) Thanks @sfuminya, @GitZhangChi, @dashhuang, @samzong, @v1p0r, and @neeravmakwana.<media:audio>placeholders. (#61008) Thanks @manueltarouca.reasoning:stream, so hidden<think>traces from streamed replies stop surfacing as chat previews on normal sessions. Thanks @vincentkoc./entries visible. (#61129) Thanks @neeravmakwana.reasoning:stream, so hidden reasoning traces do not surface on normal streaming sessions. Thanks @vincentkoc.@everyoneand@heremention gates, keep ACK reactions on the active account, and split voice connect/playback timeouts so auto-join is more reliable. (#57465, #60361, #60345) Thanks @geekhuashan.channels.whatsapp.blockStreamingand reset watchdog timeouts after reconnect so quiet chats stop falling into reconnect loops. (#60007, #60069) Thanks @MonkeyLeeT and @mcaxtr.memory-corebuiltin embedding registration on the already-registered path so selectingmemory-coreno longer recurses through plugin discovery and crashes during startup. (#61402) Thanks @ngutman.readoutputs visible longer, preserve the latestreadoutput when older tool output can absorb the overflow budget, and fall back to Pi's normal overflow compaction/retry path before replacing a freshreadwith a compacted stub. Thanks @vincentkoc.qmd collection add --glob, accept newer single-line JSON hit metadata while keeping legacy line fields, refresh QMD docs/doctor install guidance and model-override guidance, and keep older QMD releases working. Thanks @vincentkoc.httpServerAdapterso recurring gateway deprecation warnings stop firing and the Express 5 compatibility workaround stays on the supported SDK path. (#60939) Thanks @coolramukaka-sys.talk.speakplayback when speech is explicitly stopped, so stale replies stop starting after barge-in or manual stop. (#61164) Thanks @obviyus.ui.assistant.avatarwhen serving/avatar/:agentIdso Appearance UI avatar paths stop falling back to initials placeholders. (#60778) Thanks @hannasdev.skills list --json,skills info --json, andskills check --jsonoutput to stdout instead of stderr so machine-readable consumers receive JSON on the expected stream again. (#60914; fixes #57599; landed from contributor PR #57611 by @Aftabbs) Thanks @Aftabbs.failureDestinationis configured. (#60622) Thanks @artwalker.LiveSessionModelSwitchErrorbefore making an API call. (#60266) Thanks @kiranvk-2011.allow-alwaysapprovals in allowlist mode so identical reruns stop prompting, and tighten Windows interpreter/path approval handling so wrapper and malformed-path cases fail closed more consistently. (#59880, #59780, #58040, #59182) Thanks @luoyanglang, @SnowSky1, and @pgondhi987.system.runapprovals bound to the prepared execution plan across async forwarding, so mutable script operands still get approval-time binding and drift revalidation instead of dropping back to unbound execution.exec-approvals.jsonagent security override stricter gateway tool defaults so approved subagents can usesecurity: “full”without falling back to allowlist enforcement again. (#60310) Thanks @lml2468.host=noderouting for node-pinned andhost=autosessions, while still blocking sandboxedautosessions from jumping to gateway. (#60788) Thanks @openperf.exec-eventwake reason fornotifyOnExitso background exec completions still trigger follow-up turns whenHEARTBEAT.mdis empty or comments-only. (#41479) Thanks @rstar327.ok do itandgo aheadas immediate action turns, and trim overly memo-like GPT-5 chat confirmations so OpenAI replies stay shorter and more conversational by default.contextWindowfrom runtimecontextTokens, keep the default effective cap at272000, and expose a per-modelcontextTokensoverride onmodels.providers.*.models[].total_tokens, so DashScope-compatible sessions stop storing zero totals after alias normalization. (#54940) Thanks @lyfuci.additionalProperties: falseso direct OpenAI GPT-5 routes stop rejecting thereadtool with invalid strict-schema errors.strict: falsefor native OpenAI tool calls when a tool schema is not strict-compatible, and normalize empty-object tool schemas to includerequired: [], so direct GPT-5 routes stop failing with invalid strict-schema errors like missingpathinrequired.gpt-image-1reference-image edits through/images/editsmultipart uploads, and stop inferring unsupported resolution overrides when no explicitsizeorresolutionis provided.Editor-Version. (#60641) Thanks @VACInc and @vincentkoc.403 “Key limit exceeded”spending-limit responses as billing so model fallback continues instead of stopping on generic auth. (#59892) Thanks @rockcent.claude-cli/*auth on live Claude CLI credentials at runtime, avoid persisting stale bearer-token profiles, and suppress macOS Keychain prompts during non-interactive Claude CLI setup. (#61234) Thanks @darkamenosa.claude-cliauth profile so local and gateway agent runs can use Claude CLI immediately without missing-API-key failures. Thanks @vincentkoc.cacheRetention: “long”with the real 1-hour prompt-cache TTL on Vertex AI endpoints, and defaultanthropic-vertexcache retention like direct Anthropic. (#60888) Thanks @affsantos.toolu_*replay ids on direct Anthropic and Anthropic Vertex paths so cache-sensitive history stops rewriting known-valid Anthropic tool-use ids. (#52612)cacheRetentionsupport for direct Gemini system prompts by creating, reusing, and refreshingcachedContentsautomatically on Google AI Studio runs. (#51372) Thanks @rafaelmariano-glitch.npm install -g @google/gemini-clilayouts work again. (#60486) Thanks @wzfmini01.loadCodeAssist 400 Bad Request. (#49226) Thanks @bobworrall.gemini-2.5-*model ids by letting the bundled CLI provider clone them from Google templates, sogemini-2.5-flash-liteand related configured models stop showing up as missing. (#35274) Thanks @mySebbe.pinDnsoverrides in shared provider HTTP helpers so proxy-backed image generation works again. (#59873) Thanks @luoyanglang.glm-5-*variants likeglm-5-turboinstead of intercepting them with the generic GLM-5 forward-compat shim. (#48185) Thanks @haoyu-haoyu.AWS_PROFILEapiKey marker when no AWS auth env vars exist, so instance-role and other default-chain setups keep working without poisoning provider config. (#61194) Thanks @wirjo.toolcall_end.MiniMax-M2.7andMiniMax-M2.7-highspeedmodel definitions so image-capable flows can route through the M2.7 family correctly. (#54843) Thanks @MerlinMiao88888888.MINIMAX_API_HOSTfor implicit bundled MiniMax provider catalogs so China-hosted API-key setups pickapi.minimaxi.com/anthropicwithout manual provider config. (#34524) Thanks @caiqinghua.usage_percentfields when MiniMax reports only remaining percentage data, so usage bars stop showing nearly-full remaining quota as nearly-exhausted usage. (#60254) Thanks @jwchmodx.minimax-portaland MiniMax CN aliases as the same MiniMax quota surface, and prefer stored MiniMax OAuth before falling back to Coding Plan keys.model_remainsentry and derive Coding Plan window labels from MiniMax interval timestamps so MiniMax usage snapshots stop picking zero-budget media rows and misreporting 4h windows as5h. (#52349) Thanks @IVY-AI-gif.tools.web.search.kimi.baseUrlis unset, inherit native Moonshot chatbaseUrl(.ai/.cn) so China console keys authenticate on the same host as chat. Fixes #44851. (#56769) Thanks @tonga54.--permission-mode bypassPermissionswhen customcliBackends.claude-cli.argsoverride defaults, including fallback resolution before the runtime plugin registry is active, so cron and heartbeat Claude CLI runs do not regress to interactive approval mode. (#61114) Thanks @cathrynlavery and @thewilloftheshadow.openclaw agent --session-idruns under a stable session key so follow-ups can reuse the stored CLI binding and resume the same underlying Claude session./newand/reset, and keep live Claude CLI model switches moving across the configured Claude family so resumed sessions follow the real active thread and model. Thanks @vincentkoc.