Release notes

v2026.9.5

v2026.9.5

Reading formats: Release notes for readers · Plain Markdown for AI agents and tools.

OpenClaw 2026.9.5 brings Atomic Updates that check the next version before switching over, plugins you can install without restarting your Gateway, conversations you can share, GPT Live in your meetings and phone calls, browser pages you can work on alongside your agent, conversation archives you can revisit later, guided setup for your own team of specialist agents, everyday reliability improvements, and more.

This release includes 4,179 pull requests and 64 direct commits, with credits to 502 contributing accounts.

Installation and Onboarding

Setup can help you create a specialist or a small team, choose an avatar, and get connected. Installation and recovery guidance also covers more of the places where setup can get stuck.

Set up a specialist team

Start with a chief of staff, researcher, writer and reviewer, or choose a single specialist. Guided setup can create the four-agent team, and New agent in the web UI offers the same roles through a proposal you approve before anything is created. Setup remembers your chosen coordinator if you need to resume. Choosing Skip creates the team offline, with AI access still to configure.

If creation stops partway through, check openclaw agents list and repair the incomplete team before retrying. If all four members already exist, finish with openclaw onboard --workspace <workspace> without --team.

Sources and complete change list

Improvements

  • Choose agent roles and teams in the Control UI #141453.
  • Create agents from roles or a team preset #145712.

Bug fixes

  • Preserve selected teams through onboarding recovery #145817.
Choose an avatar for a new agent

Once you agree on your new agent's name and personality, setup can offer four matching portraits and save the one you choose. You'll need an available image provider. You can skip this step and keep the emoji, which also lets setup continue if generation or saving fails. Existing avatars and completed workspaces stay unchanged.

Sources and complete change list

Improvements

  • Choose a generated avatar during new-agent setup #146669.
Start with fewer setup decisions

Fresh OpenAI and ChatGPT/Codex setups start with Astra if you haven't chosen a primary model. Existing choices stay in place. If your account does not offer Astra, choose an available model during OpenAI setup. Verified official plugins also skip a redundant approval step before sign-in. Third-party plugins and those OpenClaw cannot verify still need the applicable consent.

Local onboarding now selects Full tools when no profile is set, including when you rerun onboarding. This includes messaging and available optional tools from enabled plugins. Explicit profiles stay in place, and an ordinary upgrade leaves an unset profile unchanged. Security settings now save an explicit Full choice. Full selects tools; Full Access controls execution permissions, which remain separate from tool selection and other access restrictions.

The existing openclaw setup-and-repair helper is now discoverable in the tool list. It also belongs to group:automation and group:openclaw, so denying either group blocks the helper even if you explicitly allow it. To use it, narrow or remove a conflicting group deny. Restricted profiles still need an explicit selection through tools.alsoAllow, subject to the remaining restrictions.

Sources and complete change list

Improvements

  • Simplify official plugin setup and default OpenAI to Astra #145646. Related image and Workboard defaults also use Astra while honoring configured model policies.

Limits and compatibility

  • Default local onboarding to Full tools and clarify permissions #150596. Thanks @obviyus.
Recover command-line installation

The installer can reuse your compatible Node and nvm setup without replacing system software or changing your shell profile unnecessarily. If it needs to install Node through nvm, it asks first and explains any change to your default Node version. If you decline or run unattended, it stops and gives you commands to prepare the installation.

Mac app CLI setup can now recover from temporary-directory permission errors without an administrator password, provided /tmp is writable. The Linux companion's installer also avoids the bundled OpenSSL conflict that could stop system download tools during AppImage setup.

On Linux, Gateway installation can recover from stale session connection settings while preserving working custom connections to the service manager. It also works again on systems running systemd 239. If the service manager is unavailable or its files cannot be read, the error explains what needs repair.

Sources and complete change list

Bug fixes

  • Apply installer timeout settings to curl connections #110657. Thanks @xydigit-zt and @fuller-stack-dev.
  • Recognize versioned Node executables for services #129301. Supported current runtimes named nodejs, node24 and node-24, including .exe variants, still undergo the existing capability checks.
  • Preserve useful automatic Control UI build errors #144844. Thanks @vincentkoc.
  • Preserve existing Node and nvm setups during installation #145317. Thanks @jb-lopez.
  • Restore Gateway installation on systemd 239 #146022. Thanks @pollybot13 and @bruce-cham.
  • Correct llama.cpp download-speed estimates #146263.
  • Restore Linux installs with stale session-bus settings #146569. Deep status also shows the selected connection.
  • Recover Mac CLI setup from temporary-directory permission errors #146730. The original environment is restored before service setup.
  • Preserve working runtime links when validation fails #147221. Relative-path selections remain usable after changing directories. Alpine system-package changes are not rolled back. Thanks @vincentkoc and @lucarinaorg.
  • Preserve installer PATH search behavior #147249. Intentional current-directory entries remain usable without introducing a lookup when all search locations are excluded. Thanks @vincentkoc and @lucarinaorg.
  • Preserve CLI startup metadata when refresh fails #147290.
  • Use host libraries for Linux AppImage installer tools #148174. Thanks @xydigitlybnnnn, @fuller-stack-dev and @jb-lopez.
  • Handle permission-denied Node runtime probes #150858. Restricted child-process launches now reject the unusable candidate without granting additional permissions. Thanks @romneyda.
Set up OpenClaw in a container

The Docker guide now explains how to set up the web UI's browser inside your container and troubleshoot missing Chromium. If permissions block a package update inside the container, OpenClaw recommends replacing the image and redeploying with your existing state and configuration mounts. Docker source builds that include Matrix also get past the import errors that could stop the build.

When OpenClaw runs in Docker, its sandbox shell and browser tools can now see the same workspace and skill files even when the host uses different paths. Workspace and state folders, including nested managed sources, must use verified host bind mounts. Named volumes, tmpfs and files stored only in the image remain unsupported, and OpenClaw refuses sources whose container or Docker daemon it cannot verify. Read-only mounts stay read-only, and custom sandbox binds still use host paths.

Restart the Gateway after changing its mounts or Docker connection. If existing sandbox containers have different mounts, OpenClaw keeps them and gives you a command to recreate the affected containers. Browser-control connections over the default Compose bridge remain a separate limitation.

Sources and complete change list

Improvements

  • Explain container redeployment after update permission errors #95887. Thanks @fuller-stack-dev and @dioubernardo.

Bug fixes

  • Fix Matrix-selected Docker source builds #146081. Thanks @vincentkoc.
  • Restore sandbox workspace files in Docker-hosted Gateways #147276. Thanks @vincentkoc, @aaronwander, @frankekn and @jiesou.

Documentation

  • Explain Control UI browser setup for Docker #141527. Thanks @pollybot13 and @patrick-erichsen.
Connect a device with clearer guidance

A browser using only its device token can now reconnect after an administrator approves Request admin, instead of being sent back to login. Changing shared authentication still invalidates old credentials, and previously damaged tokens are not automatically repaired. Pairing requests also accept pasted IDs with surrounding spaces or newlines, and long Node host setup commands fit inside the pairing dialog while remaining complete when copied.

Authorized operators using trusted-proxy authentication can generate mobile setup codes without adding an unused Gateway token or password. Your phone must still sign in through the proxy, and scanning a QR code does not sign you into Cloudflare Access. Secure-transport rules and pairing approval still apply, and authentication mode none is still rejected.

Sources and complete change list

Improvements

  • Skip unnecessary LAN route probes #145812.

Bug fixes

  • Accept whitespace around device pairing request IDs #110848. Thanks @nocodet888-arch and @obviyus.
  • Use discovered Gateway ports in SSH tunnel hints #129649.
  • Explain pairing setup failures by authentication mode #144136. Thanks @liuwqgit, @obviyus and @delicate-xqy.
  • Reject empty push environments before Gateway contact #144687. Omit --environment for the node's default, or supply sandbox or production. Thanks @alix-007 and @obviyus.
  • Allow QR setup with trusted-proxy-only authentication #147036. Thanks @vincentkoc.
  • Keep device-pairing commands inside the dialog #147427. Mobile controls remain reachable by scrolling. Thanks @donniefi and @vincentkoc.
  • Reconnect browsers after approving requested admin access #149192. Thanks @obviyus and @liuwqgit.

Documentation

  • Clarify mobile setup codes and node join URLs #149237. Use Pair device or openclaw qr for mobile setup; node join URLs belong to openclaw connect. Thanks @kvnloo, @tomdailey55 and @iwhatsskill.
Keep your default agent after migration

Migrated multi-agent setups now keep their saved default after a restart, so integrations can find the intended agent again. The web UI saves and displays that same choice. If your agent list has no valid default, choose one with Set Default in the web UI. Choosing a default does not move your older workspaces or conversation data.

Sources and complete change list

Bug fixes

  • Preserve migrated default agents across restarts #146246. Explicit targets and existing data ownership remain intact. A separate legacy-session import case for sole-agent setups remains unresolved, with original files retained. Thanks @lilei0311.
Install the CLI on FreeBSD

You can now install the CLI on FreeBSD with install-cli.sh using system Node and npm. First, have an administrator install bash, node24, npm-node24, git, python3 and gmake. Follow the npm installation route with a published version or compatible built package; Git source installation remains unsupported. System packages stay administrator-managed, and the installer's private --node-only recovery option is unavailable on FreeBSD.

Setup and error messages explain how to connect to a Gateway you start yourself, using the same account you used for onboarding. Run openclaw gateway run in a terminal or manage an installed package service separately. The CLI does not install or control FreeBSD services, and it cannot report their status.

Keep pkg/Ports installations under their package owner's management. On affected FreeBSD 2026.9.4 installations, the old updater stops before it can download the repair. Follow the manual update procedure through the owning package manager first, preserving the same installation, state and configuration and using the actual service or foreground owner to stop and start OpenClaw. After that bootstrap, the repaired updater can update an independently managed x64 installation, subject to package and service ownership checks. ARM64 updates remain unverified, and rc.d services still need their external owner.

Sources and complete change list

Improvements

  • Install the FreeBSD CLI using system Node and npm #147204. Thanks @vincentkoc and @lucarinaorg.

Bug fixes

  • Explain FreeBSD desktop setup prerequisites #147211. Thanks @vincentkoc and @lucarinaorg.
  • Identify FreeBSD process owners during update handoffs #147415. Thanks @vincentkoc and @lucarinaorg.
  • Explain FreeBSD maintenance refusals #147736. Thanks @vincentkoc and @lucarinaorg.

Documentation

  • Explain Gateway and node startup options on FreeBSD #147200. Node hosts use openclaw node run. Thanks @vincentkoc and @lucarinaorg.
  • Clarify FreeBSD npm installation guidance #150014. Thanks @vincentkoc and @lucarinaorg.

Limits and compatibility

  • Recognize FreeBSD boot identities for triage leases #147243. Thanks @vincentkoc and @lucarinaorg.
  • Preserve FreeBSD native dependencies during update handoff #147324. Thanks @vincentkoc and @lucarinaorg.
Keep migration options in effect

Migration commands now keep your selected source, output format and credential exclusions when shared options appear before list, plan or apply. Options explicitly set on a subcommand still take precedence. Use openclaw migrate plan to preview a migration. The apply command does not support dry runs and now rejects a preceding --dry-run before changing anything.

Sources and complete change list

Bug fixes

  • Honor migration options before subcommands #144111. A parent --no-auth-credentials remains effective when the subcommand explicitly includes secrets. Thanks @yetval.
Resume interrupted local setup

Interrupted local setup can now finish in the workspace you already approved while keeping your saved agents, model and runtime choices. Recovery checks that the pending setup still belongs to the same configuration, so replacing the configuration or switching to a remote Gateway does not carry that approval forward.

Sources and complete change list

Bug fixes

  • Resume setup in the approved workspace #147705. Thanks @vincentkoc.

Web UI

The web UI makes it easier to find an agent, follow its work, and keep a conversation going while the rest of the page catches up.

Find agents and their conversations

The new Agents overview brings recent activity and conversation previews together, with a direct link to each agent’s main chat. Turn on Show all agents for an optional team sidebar that groups conversations by agent. That choice is remembered in this browser for each Gateway, and agent creation remains available in Settings.

Activity keeps delegated subagent work with its parent conversation, so it no longer crowds out your conversations or inflates people counts. Switching agents also cancels obsolete archive-deletion confirmations from the previous agent.

Choose whether empty sidebar groups hide When filtering, Always, or Never, with separate choices for each user and Gateway in this browser.

Sources and complete change list

Improvements

  • Browse agents with activity and conversation previews #141097.
  • Browse every agent's conversations in one sidebar #141476. Thanks @hannesrudolph, @madkow1001.
  • Match activity indicators to shared-session avatars #144696.
  • Keep agent creation in Settings #145062. Thanks @hannesrudolph.
  • Use a gear icon for Agent settings #145297. Thanks @vyctorbrzezowski.
  • Keep internal worker conversations out of the sidebar #145346.
  • Filter sessions from person headers #145514.
  • Clarify Online activity device labels #145518.
  • Reduce sorting work for larger session lists #145682.
  • Resolve short session links with less work in large stores #146803.
  • Remove the duplicate Ask OpenClaw toolbar button #147189.
  • Choose when empty session groups stay visible #147392. Thanks @vincentkoc.
  • Translate empty session-group controls #147465.
  • Hide repeated self avatars in filtered lists #147610.
  • Hide repeated single-user sidebar attribution #147654. Thanks @romneyda.
  • Use compact metadata for group discovery #147909. Thanks @vincentkoc.
  • Use one downward chevron in the agent selector #148605. Thanks @patrick-erichsen.
  • Remove the sidebar account-name tooltip #148624. Thanks @patrick-erichsen.
  • Slow sidebar session-title scrolling on hover #148640. Thanks @patrick-erichsen.
  • Show pending request details in sidebar tooltips #149318.
  • Load selected agent sessions without waiting for chat startup #150092. Thanks @jalehman.
  • Reveal long sidebar titles on hover and focus #150586. Thanks @vyctorbrzezowski.
  • Move agent creation-history reads off the main thread #150747.

Bug fixes

  • Cancel obsolete session actions when switching agents #133331. Thanks @aniruddhaadak80, @vincentkoc.
  • Keep Sessions Refresh usable during background updates #139023. Thanks @pollybot13, @lakemike, @patrick-erichsen, @he-yufeng.
  • Restore pinning for ordinary Home-linked conversations #143250. Thanks @sunnyshu0925, @patrick-erichsen, @jalehman, @foxrainhy.
  • Keep sidebar sessions active while subagents work #145028.
  • Hide empty native CLI sidebar sections #145054.
  • Remove leftover sidebar headings after owner filtering #145082.
  • Recover session links after temporary disconnects #145347.
  • Keep archived sessions visible in Activity #145462.
  • Hide empty Other sections under owner filters #145521.
  • Distinguish terminal connections in Online cards #145559.
  • Hide empty sections under personal session filters #146069. Thanks @vincentkoc.
  • Stop unrelated sidebar child-session reloads #146410.
  • Refresh newly available sessions after discovery #146535.
  • Align the Online sidebar heading with session categories #146747.
  • Keep subagent sessions out of the Activity conversation feed #147253.
  • Avoid overlapping sidebar activity requests #147400. Thanks @lakemike.
  • Keep sidebar focus outlines visible #147520. Thanks @romneyda.
  • Center sidebar agent names #147597. Thanks @vyctorbrzezowski.
  • Distinguish waiting sidebar sessions from active work #148543. Thanks @patrick-erichsen.
  • Restore continuous sidebar scrolling #148809.
  • Preserve session edits during concurrent lifecycle updates #148969.
  • Keep shared-session owner counts visible beside avatars #149141. Thanks @vyctorbrzezowski.
  • Stop repeated rejected read acknowledgements #149359.
  • Keep pinned subagents visibly nested #149379.
  • Keep conversation names visible while reconnecting #149464.
  • Show recovery actions for sessions lost during reconnect #149582.
  • Keep sidebar request previews open when tapped #149659.
  • Preserve session lists when earlier actions finish #149959.
  • Keep sidebar child sessions visible during cached refreshes #150095. Thanks @jalehman.
  • Keep independent conversations outside Home's sidebar subtree #150096. Thanks @jalehman, @vyctorbrzezowski.
  • Keep sidebar pagination working after agent switches during deletion #150125.
  • Keep session lists updating after agent switches #150305.
  • Disable session pagination while the sidebar refreshes #150718.
  • Skip redundant scheduling for loaded sidebar children #150001.
Choose artwork for agents and conversations

To give a conversation its own artwork, paste a custom SVG in Icon & color → Custom icon…, or ask your agent to set it. Artwork keeps its own colors and must be self-contained and no larger than 16 KiB decoded. Scripts, embedded documents, and external references are rejected.

Sources and complete change list

Improvements

  • Share agent and appearance controls across browser plugins #144748. Thanks @vyctorbrzezowski.
  • Give fallback agent avatars fuller faces and varied expressions #146734.
  • Use custom SVG artwork for session icons #147442.
  • Enlarge session assignment avatars #147567.

Bug fixes

  • Keep delayed avatar downloads on their original profile store #145180.
  • Prevent fallback-avatar flashes while images load #146109.
  • Match avatar outlines to sidebar backgrounds #147875. Thanks @vyctorbrzezowski.
Arrange plugin pages in the sidebar

Plugin pages can now join your saved sidebar order alongside built-in pages, keeping their places after a reload or temporary absence. Home stays first in chip mode. Pages shown by default can be reordered, but only optional plugin pages can be dragged out to unpin them.

Sources and complete change list

Improvements

  • Reorder plugin pages in the sidebar #147569.
Enter text in the command palette

The command palette shows Searching sessions… or Searching commands… while it is still looking, with local commands available in the meantime. When you compose text with an input method, Enter, Escape, and arrow keys stay with that input instead of selecting a result or closing the palette.

Sources and complete change list

Bug fixes

  • Show command palette search progress before empty results #146938. Thanks @vincentkoc.
  • Preserve command-palette text composition #150164.
See conversation activity on browser tabs

The browser-tab icon now shows when the selected agent is working, needs an answer or approval, has finished while you were away, or has disconnected. The completion indicator clears when you return to the tab. Failed or interrupted runs do not appear as completed work.

Sources and complete change list

Improvements

  • Show agent activity in the browser tab #147388. Thanks @vyctorbrzezowski.
Choose where a new task runs

New Session puts your devices in a searchable picker, with capacity details and an Any available device choice when you have several. Cloud options sit beside their provider, and suggested tasks can start in the current conversation, a new session, or a separate Git worktree.

A worktree needs a Git checkout. Local means the computer running OpenClaw, which may be different from the computer running your browser.

For empty remote workspaces, see Start remote tasks in an empty workspace under Browser and Computer Use.

Automatic placement now counts work already accepted or starting when choosing a paired device. If the chosen device becomes unavailable for the task, OpenClaw can try another eligible device after confirming cleanup of the failed attempt, with at most three devices tried in total. These retries stop once workspace preparation begins. Choosing a device does not reserve capacity, and idle sessions reserve no slots.

Sources and complete change list

Improvements

  • Search destinations and switch automatic selection separately #144453. Thanks @patrick-erichsen.
  • Remove redundant New Session picker tooltips #144651. Thanks @patrick-erichsen.
  • Choose where to start a suggested task #145019.
  • Compact environment choices and simplify Auto selection #145061.
  • Simplify device selection and cloud options #145183. Thanks @patrick-erichsen.
  • Show loading placeholders for session environments #146059. Thanks @patrick-erichsen.
  • Reduce project catalog work for large agent fleets #147124.
  • Reduce workspace lookup work for large agent fleets #147144.

Bug fixes

  • Align the Connect a machine picker action #144530. Thanks @patrick-erichsen.
  • Preserve cloud selection while the picker opens #145420.
  • Show the selected worktree branch #145574.
  • Keep host availability current during event bursts #146165.
  • Improve suggested-task contrast and menu placement #147575.
  • Spread Auto session starts across available paired devices #148099.
  • Preserve clones after uncertain project registration #149386.
  • Keep device-picker focus during capacity refreshes 87ff8b24.
Keep drafts and queued input intact

You can submit text and attachments while chat history loads and start your next draft immediately. Delivery waits until the conversation is ready. During a reconnect, a message OpenClaw has tried to send appears once in the conversation; messages it has not tried to send stay editable in the queue. If the connection drops while you correct one of those waiting messages, you can still save the correction. It keeps the message’s delivery choice and queue position, even if the main composer now uses Steer or Interrupt. Attachments show when they are being prepared, and removal controls name the file.

Discard removes the local pending copy; it cannot cancel a message OpenClaw has already received. Most commands still need the conversation to finish loading. If saving a queued correction fails because of browser storage, keep the tab open and copy the affected text before freeing storage. For saved drafts that fail to load, reload without clearing site data, after copying any unsaved correction; clearing site data would delete local drafts.

Web chat also shows accepted queued follow-ups from CLI, TUI, native apps, and RPC clients while the agent is working. Labels such as via CLI describe the submitting app; they do not establish a person’s identity or grant permissions. If an interruption leaves input queued outside the saved conversation, resend it explicitly after restart. That queue is not replayed automatically.

Eligible foreground New Session submissions open a read-only chat preview while the conversation is being created. If creation fails, the original draft returns. The preview does not mean the session or its first turn has already been accepted.

Unfinished queued-message corrections survive switching conversations and block automatic update reloads until you save or cancel them. An explicit browser reload still discards those corrections. Incognito New Session drafts survive destination changes and Back within the same tab, but disappear on reload or closure; turning Incognito off resumes ordinary autosave for the existing draft.

Sources and complete change list

Improvements

  • Preview new chats while their sessions are created #114032. Thanks @fuller-stack-dev.
  • Draft messages while chat history loads #143625. Thanks @vyctorbrzezowski.
  • Queue messages while chat history loads #145531.
  • Remove the redundant queued-message notice #146194.
  • Avoid repeated chat draft recovery snapshots #146884. Thanks @vincentkoc.
  • Show attachment preparation and name removal controls #146941. Thanks @vincentkoc.
  • Close suggested-task cards immediately #148021.

Bug fixes

  • Return chat rail focus to the current message #143611. Thanks @vyctorbrzezowski.
  • Preserve replies during IME Escape #144271. Thanks @vincentkoc.
  • Steer active sessions across browsers and identify queued messages #144694.
  • Keep earlier retained messages selected during refresh #145240.
  • Prevent reconnect freezes and preserve account paging focus #145405.
  • Recover from stalled chat and model loading #145436. Thanks @fuller-stack-dev, @obviyus.
  • Save queued message edits across disconnects #145481. Thanks @romneyda.
  • Recover draft storage after browser closure #145545.
  • Withdraw canceled steering before delivery #145809. Thanks @shakkernerd.
  • Preserve every line of text steer and tell commands #146009. Thanks @masatohoshino, @obviyus.
  • Show reconnecting messages once and preserve queue order #146466.
  • Avoid database waits when finishing already-recorded chat input #146795.
  • Clear accepted drafts before interrupted navigation #147413.
  • Show queued external messages and their source #147848.
  • Clear accepted drafts after leaving New Session #147921.
  • Preserve queue order when editing messages #147923.
  • Preserve newer split-pane drafts and final selections #149364.
  • Preserve queued corrections during navigation and updates #149366.
  • Honor queued-message changes while attachments load #149479.
  • Clear resolved queued-message reorder warnings #149962.
  • Preserve New Session drafts through Incognito navigation and toggling #149973.
  • Preserve rejected Home commands across page and dock moves #150039.
  • Return to queued edits while another page loads #150066.
See teammates' unsent drafts

In shared sessions, each person’s live draft now appears in a softer chat bubble labeled Typing · not sent, or as their own typing dots. These temporary previews disappear after inactivity or sending. They are not saved in the conversation or included in model context.

Sources and complete change list

Improvements

  • Show live drafts as unsent chat bubbles #147669.
Enter emoji by name

In Chat and New Session, type an emoji name such as :smi to see suggestions, then choose one with the arrow keys and Enter, Tab, or a click. Completing a recognized shortcode such as :smile: also inserts its emoji. This edits the draft without sending it, while code, URLs, and unknown names stay literal.

Sources and complete change list

Improvements

  • Suggest and convert emoji shortcodes in Chat and New Session #146737. Thanks @vacinc, @vincentkoc.
Choose optional composer visitors

Optional lobsters and other occasional visitors now gather around the New Session composer. They yield to typing, attachments, and controls, and keep your existing visit, sound, and reduced-motion preferences. Dismissing a visitor applies to that composer opening; permanent dismissal turns visits off.

Sources and complete change list

Improvements

  • Move occasional visitors into the composer #147338.

Bug fixes

  • Preserve lobster proportions and landings #147750.
Add comments to selected chat passages

Select a passage and choose Add to chat to save a comment without disturbing your message draft. Collect several comments, reopen them to edit or delete, then send them with their selected passages as text attachments. The compact editor grows as you type, and long comments remain readable in scrollable previews.

Retained comments keep their controls when history or the composer changes, and new formatted selections keep their previews after sending and reloading. You can hover, focus, or tap a sent comment count to read it. Sent comments are read-only.

Sources and complete change list

Improvements

  • Save selected chat passages as editable comments #148649. Thanks @patrick-erichsen.
  • Make inline comment editors and previews compact and readable #149351. Thanks @vyctorbrzezowski.

Bug fixes

  • Keep chat comments usable across transcript and composer changes #148763. Thanks @patrick-erichsen.
  • Read sent comments by tapping their count #149360.
Keep the project when forking a conversation

Fork conversation and Fork from here now keep an eligible selected local folder or project, so existing file references and subsequent work use the intended workspace. An explicitly chosen destination takes precedence. Previously created forks are unchanged.

Sources and complete change list

Bug fixes

  • Keep local workspaces when forking conversations #148098.
Read replies and long histories

Loading earlier messages now keeps you on the message you were reading, including when you choose Show earlier. Completed answers stay visible after later tool activity, and Japanese, Chinese, and Korean bold text and multiline table cells display as intended. Desktop navigation groups loaded assistant responses by run, while long user messages have visible Show more and Show less controls.

Background-task notifications imported from Claude appear as collapsed system notices, with the original content available to expand. The same XML deliberately pasted by a person remains their message.

Reopening a long active chat no longer repeats saved progress updates after their live replay has expired. Loading older history also removes temporary duplicates of confirmed sent messages, even while their assistant replies are waiting to appear. Separate submissions with the same text remain separate.

Activity summaries sit closer to their replies without shrinking touch controls, and hidden panes remember your reading position. Large plain-text replies, including text shown when Markdown rendering fails, take less work to display while retaining the existing HTML sanitization.

Sources and complete change list

Improvements

  • Reuse saved message text during streaming replies #146831. Thanks @vincentkoc.
  • Reduce navigation work during streamed replies #146883. Thanks @vincentkoc.
  • Clarify expansion controls for long chat messages #147232.
  • Compact expandable chat notes #147482.
  • Keep activity summaries close to replies #147612.
  • Load setup text with New Session #147973.
  • Reduce redundant chat sender labels #148456.
  • Soften collapsed chat prompts and center expansion controls #150037. Thanks @vyctorbrzezowski.
  • Collapse long forwarded messages into expandable previews #150440. Thanks @vyctorbrzezowski.
  • Add breathing room above chat headings #150589. Thanks @vyctorbrzezowski.
  • Group chat navigation markers by assistant run d534c315. Thanks @vyctorbrzezowski.

Bug fixes

  • Show one chat bubble for a correlated channel reply #121871. Thanks @aadi-joshi, @obviyus, @fatihfulness, @aaajiao.
  • Render CJK bold text and table line breaks correctly #123084. Thanks @romneyda, @shng-fujiwara, @zhangbo-cn.
  • Keep your place when earlier chat messages load #143343. Thanks @jalehman.
  • Keep completed answers visible after later tool activity #143525. Thanks @jalehman.
  • Stop styling inactive preview links as clickable #144193.
  • Keep recent conversations loaded when another is evicted #144284.
  • Keep plain tooltips from blocking nearby controls #144313. Thanks @vincentkoc, @fuller-stack-dev.
  • Prevent duplicate streamed commentary #144498. Thanks @fuller-stack-dev.
  • Keep reply tags in streamed code examples literal #144632.
  • Preserve collapsible sections in streamed replies #145702.
  • Show Claude background tasks as system notices #145772. Thanks @marvinthebored, @peetiegonzalez, @obviyus.
  • Preserve code controls while replies stream #145826.
  • Restore complete error details in reopened chats #146259.
  • Align chat loading placeholders with the conversation #146280.
  • Keep assistant messages intact while tools run #146554. Thanks @vacinc.
  • Keep final chat replies single after refresh or reconnect #147080. Thanks @obviyus, @panyhp.
  • Keep chat navigation markers steady #147462. Thanks @vyctorbrzezowski.
  • Avoid repeated commentary when reopening chats #147600. Thanks @romneyda.
  • Keep own messages aligned during reconnect #147634. Thanks @sunnyshu0925, @obviyus, @keith9681.
  • Keep sent prompts from reappearing after reconnect #147670.
  • Show earlier-history loading feedback #147804. Thanks @vyctorbrzezowski.
  • Remove duplicate prompts beside buffered replies #147836.
  • Preserve CLI and RPC attribution in older reply previews #148537.
  • Restore conversation scrolling over the composer #149347.
  • Show saved interrupted replies once #149405. Thanks @fuller-stack-dev.
  • Keep transcript search titles when filtering sessions #149606.
  • Close previews when their source pane becomes hidden #149669.
  • Close the focused split-chat preview first with Escape #149781.
  • Find recovered full replies in transcript search #149915.
  • Reveal quoted messages inside collapsed chat work #150163.
  • Keep collapsed prompt previews readable #150478. Thanks @vyctorbrzezowski.
  • Match link-card menus to the active theme #150883. Thanks @vyctorbrzezowski.
  • Keep wide chat content inside the shared message boundary #151123. Thanks @vyctorbrzezowski.
  • Reconcile saved tool-use answers with live replies be29f772. Thanks @eatmoreduck, @jalehman.
Inspect tool activity when needed

Tool failures appear as a muted count beside collapsed activity, with full errors available when you expand it. Named operations keep their commands together, and plugin icons follow the current theme color. Background tasks use a compact, full-width feed with expandable commands, while the assistant’s reply keeps growing as one message. Saving conversation memory… now explains when that work is happening before a reply.

Web and macOS chat show each subagent task’s name beside a claw that moves while it runs, with badges for failures and timeouts. Hover for its status, or use keyboard focus in the web UI; screen readers receive the explanation too. Reduced Motion keeps the claw still. In web chat, progress folds while you read older messages and stays compact as output arrives. Choose Latest to follow again. Manual open and closed choices are remembered for that conversation across visits and new runs on the same Gateway connection, and reset when you reload or switch connections. Completion can reopen progress only when you are already at the live end and have not manually closed it.

Progress cards avoid freezing on large runs of unmatched HTML opening tags, including in macOS WebKit. New background command tasks save short, redacted command previews as their labels, making tests and builds easier to distinguish without repeating Running. Existing task labels remain unchanged.

You can also drag or scroll the Task progress header to leave just part of the panel open. Incoming output and the final response keep that chosen height. Click, Enter, or Space toggles the full panel, and Latest resumes following the conversation. Partial heights apply to the current task and reset for a new one.

Sources and complete change list

Improvements

  • Show when conversation memory is being saved #140380. Thanks @pollybot13, @noelillinger, @vincentkoc.
  • Show plugin icons on chat tool calls #143711. Thanks @patrick-erichsen.
  • Make background-task activity readable in the detail panel #144413.
  • Reduce processing for live tool updates #145581.
  • Reduce allocation during agent event delivery #146077.
  • Speed up large streamed tool-argument previews #146236.
  • Reduce repeated processing of long streamed replies #146304.
  • Reduce temporary allocation when tracking tool progress #146453.
  • Keep tool error details inside expandable activity #146478.
  • Build long tool-argument previews with less work #146587.
  • Reduce line-counting overhead for large file edits #146690.
  • Reduce repeated work in live session subtitles #146790.
  • Give memory activity a distinct icon #147173.
  • Give common tool activity distinct icons #147207.
  • Fold task progress while reading older messages #147295. Thanks @vyctorbrzezowski.
  • Use plugin-owned icons for chat tool activity #147333.
  • Reduce repeated work while retaining tool progress #147438.
  • Show task names in subagent activity #147458.
  • Skip preparation of unused session updates #147538.
  • Reduce redundant command activity updates #147550.
  • Show task progress with accessible claw status #147753.
  • Identify background tasks by command #147758.
  • Remove duplicate running status from task cards #147832.
  • Reduce temporary allocation during tool-progress capture #148832.
  • Display background task status as inline text #149264.
  • Reduce sizing work for long worker live previews #149798.
  • Adjust task progress with drag and scroll gestures #150218. Thanks @vyctorbrzezowski, @vincentkoc.
  • Show nested tool work and visible failure details 0d857eb9.

Bug fixes

  • Remove nested scrolling in expanded tool activity #139120. Thanks @aniruddhaadak80, @obviyus, @wajdamian.
  • Show when the parent is still working after subtasks finish #142853. Thanks @sunnyshu0925, @jalehman, @patrick-erichsen.
  • Show readable chat error and system labels #144829. Thanks @romneyda.
  • Align chat expand and collapse arrows #145167. Thanks @vyctorbrzezowski, digitalnav.
  • Preserve selected Debug event text #145600. Thanks @vincentkoc.
  • Keep final status updates after cancelling a run #145987.
  • Stop preparing previews after delivery shuts down #146896. Thanks @vincentkoc.
  • Group nested commands under their named operations #147156.
  • Avoid progress-card freezes on malformed content #147528. Thanks @jjjhenriksen, @honki12345, @noelillinger, @vyctorbrzezowski.
  • Keep Task progress collapsed while reading history #147802. Thanks @vyctorbrzezowski, @vincentkoc.
  • Keep task progress collapsed while reading history #148291.
  • Deliver background-command results to WebChat #148360. Thanks @etzelm, @jalehman, @oywino.
  • Keep Task progress collapsed and the composer available #149384. Thanks @vyctorbrzezowski.
  • Label stopped Swarm tasks accurately #149508.
  • Stop labeling deferred session yields as failures #149983. Thanks @obviyus.
  • Distinguish steering skips from tool failures in the Control UI #150185.
Ask a side question without losing the conversation

Side chat puts the cursor in the right input when you open it and keeps the main conversation visible. Questions now wrap and grow as you type, with Shift+Enter for a new line and the existing 400-character limit.

You can now ask /btw side questions about photos attached to the current message when using a direct model provider or the bundled Codex integration. Reply photos are included when the channel supplies them. CLI runtimes instead report how many images were omitted, and third-party agent integrations may ignore images. Images already described by media understanding remain excluded, and their descriptions are not forwarded instead.

Sources and complete change list

Improvements

  • Match Side chat text and code presentation to main chat #144435. Thanks @patrick-erichsen.
  • Include current-message images in /btw side questions #150020. Thanks @obviyus.

Bug fixes

  • Focus Side chat when its panel opens #144428. Thanks @patrick-erichsen.
  • Keep latest chat visible and support multiline Side chat questions #144703.
  • Open and focus Side chat with slash commands #147795. Thanks @vyctorbrzezowski.
  • Keep failed Side chat questions for retry #147873. Thanks @vyctorbrzezowski.
  • Keep Side chat reads available within the selected session #148248. Thanks @vacinc.
Choose models while discovery continues

The model picker opens with choices already loaded, and adds newly discovered models while the menu stays open. Models settings also keep healthy choices usable when another provider fails, with a warning and Retry available. Account labels help distinguish subscription access, API keys, and an explicitly selected account. People with permission to edit a session can also change its thinking level and fast mode for subsequent turns.

If the model list or selected account changes during loading, the picker can retry the resulting stale-list rejection once without losing your draft. The retry keeps the original time limit and still respects cancellation. A second failure stays visible; permission and connection failures do not trigger this retry.

Active chats and split panes make fewer routine requests for model information. Choosing a model, account, or agent runtime still refreshes that information promptly, as do credential and availability changes. Ordinary account usage remains recorded without making every connected web UI reload its model information.

Sources and complete change list

Improvements

  • Simplify model and account selection in chat #145112.
  • Show provider sign-in details in the chat model picker #145316.
  • Shorter ClawRouter model labels #145332.
  • Reopen model choices without repeated loading waits #145384.
  • Clarify model sign-ins and Auto choices #145525.
  • Show web model choices sooner without stale account selection #145927. Thanks @obviyus.
  • Keep model dropdown choices visible while hovering #148651. Thanks @patrick-erichsen.

Bug fixes

  • Keep reopened model pickers visible during updates #144399.
  • Keep new chats on the displayed model and allow setup commands #144967. Thanks @obviyus.
  • Keep newer model choices during settings refresh #145478.
  • Separate model refresh warnings from selection controls #146201.
  • Refresh chat model controls after discovery #146258.
  • Allow thinking and fast-mode changes with session write access #146343. Thanks @vacinc.
  • Keep model choices usable while provider details load #146396. Thanks @obviyus.
  • Open model choices before catalog refresh completes #146643. Thanks @obviyus.
  • Defer hidden-chat refreshes and share model reads #146685.
  • Reduce repeated background reads while loading chat #146953.
  • Recover model picker after catalog changes #147926.
  • Keep saved global model settings current across agent switches #148843.
  • Keep the selected chat model visible while a response starts #149789. Thanks @obviyus.
  • Preserve model search while composing text #149845.
  • Keep confirmed model selections after refresh failures #150101.
  • Keep model choices visible while New Session refreshes #150827. Thanks @obviyus.
  • Reduce repeated model catalog reads during chat updates #151198.
  • Avoid model-information refreshes for routine account usage #151247.
Review changes and repository state

Activity now shows available Git change counts and pull-request previews, so you can check coding work without opening every conversation. Review also restores missing patches for filenames containing spaces or escaped characters. Activity counts describe the checkout or pull request, including applicable uncommitted work. Recent pull-request links from the same repository remain available after checkout changes, and the check-status control is easier to recognize and open.

Pull-request badges now reflect fetched state, and status reads say Loading. Shared publication progress can return after reconnecting or reloading, with unavailable warnings when fresh GitHub information cannot be fetched.

Check status reads the recorded outcome without publishing again. If an acknowledgement was lost, an empty lookup does not prove the action never ran; check the original request before using Retry publication, which explicitly retries that same request. Recovery stays within the current session and workspace, and existing personal confirmation and permissions still apply.

For an open or draft pull request, open the CI indicator to see named checks and expand GitHub Actions jobs for their steps, statuses, and durations. Details refresh while the monitor is open, with warnings and Retry for unavailable, partial, or rate-limited results. Full logs open on GitHub; other CI services remain listed without Actions step details.

Sources and complete change list

Improvements

  • Add word wrapping to Review file views #143972. Thanks @marvinthebored, @peetiegonzalez, @shakkernerd.
  • Speed up inline edit preview comparisons #145319.
  • Git changes and PR previews in Activity #145530.
  • Speed up large-file edits and previews #146082.
  • Prepare edit previews faster after unchanged leading lines #146500.
  • Compact branch and pull-request rows above chat #147147.
  • Make pull request check details easier to discover #147279.
  • Reuse unchanged session pull-request references #147373.
  • Read session pull-request references together #147443.
  • Reduce the gap above the composer #147474.
  • Skip redundant session-branch commit counts #147508.
  • Inspect pull-request CI jobs and steps in chat #148070.
  • Reuse native GitHub lookups for reads and account options #149372.
  • Reduce Git work for session diffs before the first commit #149711.
  • Reduce Git work when loading session diffs #150018.
  • Expand and collapse chat pull request stacks #150576. Thanks @vyctorbrzezowski.

Bug fixes

  • Include committed work with remote-only default branches #144246. Thanks @zhangguiping-xydt, @obviyus, @ansxor.
  • Share repeated Git reads and keep branch requests responsive #146273.
  • Keep large repository reads and queued cancellation responsive #146499.
  • Restore Review previews for filenames with spaces and escapes #146533.
  • Avoid repeated GitHub setup during chat refresh #146697.
  • Keep session PR status visible after checkout changes #147166.
  • Correct PR status and restore shared publication progress #147195. Thanks @vincentkoc.
  • Preserve unchanged line endings in published changes #147618.
  • Avoid duplicate publication and pull-request status rows #148385.
  • Check published history before changing local work #148741. Thanks @vacinc.
Use images and documents from chat

Markdown attachments open as formatted documents beside the conversation, with headings, tables, and working code controls. Chat menus can copy available message Markdown, complete code, tables ready for a spreadsheet, or an attachment’s download link or name. New generated images stay with their completion reply without adding a duplicate image-only message. Uploaded image frames now align with their prompts, including in Safari, and user image galleries sit closer to the text that explains them.

You can also right-click chat images for the browser’s familiar copy and save actions. The browser may copy the displayed thumbnail. Use OpenClaw’s Copy image action when you want the full-resolution file.

Images reserve their place while loading, reducing jumps in the conversation. Failed managed previews retain an explanation and Retry, and loading animation respects reduced motion. Assistant images and attachments also stay between their original paragraphs, so Before and After labels remain with the right images.

Relative local file references resolve from the session’s selected project or worktree and appear as attachments, with existing file-access checks. Files on a remote execution host must first arrive through managed attachment delivery.

Rewind and Fork restore supported image attachments for resending, with a 5 MiB decoded limit for restored inline images. Failed queued sends and their attachments remain available after reload for you to retry.

Sources and complete change list

Improvements

  • Load visible GitHub previews before hovering #145123.
  • Read Markdown attachments as formatted documents #145555.
  • Copy chat messages, code, tables and attachment references #146679. Thanks @fuller-stack-dev.
  • Reuse image downloads and load Files lists together #146709.
  • Tighten spacing between chat images and prompts #147448. Thanks @vyctorbrzezowski.

Bug fixes

  • Restore image attachments when rewinding or forking chats #92223. Thanks @joeykrug, @fuller-stack-dev, @bsg2000, @amknight, @syfvb.
  • Deliver fetched directory files with replies #138427. Thanks @nianjiuzst, @obviyus, @igs-rogenlo.
  • Make inline image uploads available to file tools #143753. Thanks @harjothkhara, @obviyus, @woohahahaaa, @johnmacob, @rodja.
  • Preserve Markdown code controls after refresh #145805.
  • Clear stale table-copy success feedback #145962.
  • Distinguish absolute and relative file links #146572.
  • Restore browser image menus in chat #146618. Thanks @fuller-stack-dev.
  • Show generated images once in chat #146777.
  • Fix large inline media validation failures #146972.
  • Align uploaded images with their prompts #147389.
  • Keep chat images in place while loading #147565. Thanks @vyctorbrzezowski.
  • Render relative files as chat attachments #147646.
  • Keep assistant images beside their labels #147731.
  • Attach generated speech to its answer during live chat #148696. Thanks @liuwqgit, @obviyus, @zerolxgic.
  • Keep progress images visible inline and after reload #148795.
  • Give transcript media consistent spacing #149137. Thanks @vyctorbrzezowski.
  • Keep annotation buttons free of unwanted shadows #149929.
  • Cancel delayed copy fallbacks from closed file previews #150074.
Inspect the sources cited in an answer

Completed researched answers can show a Sources strip with up to eight cited pages. Open a card to read its recorded snippet or excerpt, then choose Open source for the original page. These previews reflect what was retrieved for that answer, rather than a fresh check of the page, and some citations have no excerpt.

Sources and complete change list

Improvements

  • Preview cited research sources directly in chat #148431.
Recover attachments after website sign-in expires

When expired website sign-in blocks images or files, OpenClaw first tries to renew access without interrupting the conversation or unsent draft. Silent renewal needs a valid global sign-in session and browser cookie and framing support. If that cannot work, sign in in a separate tab and return to the same chat; failed attachments retry after access is verified. Session lifetimes stay unchanged.

Sources and complete change list

Bug fixes

  • Restore attachments after website sign-in expires #148400.
  • Renew website access before prompting for sign-in #149833.
Keep dashboards and embedded views usable

Ask your agent to add a hosted HTTPS website to a session dashboard, expand it across the task area, and return through a named, pinned session. The browser also remembers layouts, panel choices, and dashboard tabs for up to 500 sessions.

Dashboard editors can use Layout → Use current view as default to save a shared fullscreen or split starting view, and agents can save it too. A viewer’s personal layout takes priority, and saving a default never rearranges active viewers. Fullscreen fills the task area, rather than the browser screen.

Some sites block embedding or need a separate sign-in; Open website opens them in another tab. Personal layout preferences, docking, and dimensions stay in this browser, and a live website frame is kept only while its task view remains cached.

When a split-chat window narrows, the active chat and its file panel now fill the available area. Widening it restores the saved desktop proportions and independent drafts, while hidden panes stay inactive.

Sources and complete change list

Improvements

  • Make chat widget controls more compact #143541. Thanks @vyctorbrzezowski.
  • Remove framing from focused single-widget dashboards #145542.
  • Remember layouts and tabs for 500 sessions #146014.
  • Batch board tab saves and removals #146300.
  • Show hosted websites in fullscreen session dashboards #146312.
  • Save shared dashboard fullscreen and split defaults #146475.
  • Speed up repeat loads for visualizations and widgets #146602.
  • Translate dashboard default-view feedback #147428.
  • Show shimmer while chat widgets load #147843.
  • Preview dashboard gallery layout while loading #148652. Thanks @patrick-erichsen.

Bug fixes

  • Restore ACP binding and reply history in dashboard chats #145147. Thanks @fuller-stack-dev, @cjn119-ui.
  • Keep slow control connections online while pings wait to send #145191. Thanks @fuller-stack-dev.
  • Forward selected themes to plugin tabs #145409. Thanks @chazgo, Chaz Gordish.
  • Let slow dashboard downloads finish before recovery #146881.
  • Keep widgets interactive when they define an open helper #147327.
  • Release removed dashboard progress widgets #147471. Thanks @vincentkoc.
  • Clarify where saved widgets appear after restart #147533.
  • Release removed content from panel tab focus tracking #148086. Thanks @vincentkoc.
  • Fill narrow windows with the active split chat #148165.
  • Accept HTML widgets with an empty report placeholder #148570. Thanks @mertbasar0, @akarshghale, @obviyus.
  • Preserve loaded dashboard widgets when switching tabs #149607.
  • Restore keyboard focus after closing a split chat pane #149827. Thanks @aniruddhaadak80.
  • Name the surviving chat pane for assistive technology #149989. Thanks @aniruddhaadak80.
  • Preserve appearance while profile preferences load #150529. Thanks @vyctorbrzezowski.

Documentation

  • Restore the complete Show widget reference #144393. Thanks @vyctorbrzezowski.
  • Remove repeated MCP Apps introduction #144408. Thanks @vyctorbrzezowski.
  • Clarify supported dashboard link destinations #149525.
Use page controls in a shared desktop toolbar

Desktop pages outside Chat now place titles or hub tabs and page actions in a shared toolbar. The layout also keeps Arabic and Persian page actions clear of the fixed sidebar controls. Chat, Settings takeover views, and mobile headers keep their existing layouts.

Sources and complete change list

Improvements

  • Align desktop page headers in a shared toolbar #148362.

Bug fixes

  • Keep RTL page actions clear of sidebar controls #149299.
Inspect machines in Systems

The new Systems workspace brings searchable machines, their reported resource readings, and an available remote desktop into the main workspace. Desktop viewing starts in view-only mode; taking control remains an explicit action subject to your permissions. If you customized your pinned navigation, add Systems through Edit pinned items.

Offline and headless machines remain inspectable. Readings may be last-known or unavailable, and a related-session link shows an association rather than proof that work ran on that machine.

Sources and complete change list

Improvements

  • Browse machines and desktops in Systems #147519. Thanks @vincentkoc.

Bug fixes

  • Hide completed cloud workers from current machine lists #148821.
  • Keep environment lists responsive during pairing cleanup #148988.
Open and manage terminal tabs in Chat

Native Codex and Claude Code sessions open in a main terminal page, with the sidebar available and a URL you can return to within the existing terminal lifetime. Access still requires the terminal capability and administrator permissions. Page tabs and dock tabs remain independent.

Within Chat, shell sessions now appear directly in the side-panel header beside their status and actions, leaving more room for output. Choose + → Terminal again to open another shell.

Sources and complete change list

Improvements

  • Open native CLI sessions in the main terminal page #145065.
  • Terminal sessions in the Chat panel header #145640.
  • Reduce terminal scrollback overhead #145687.

Bug fixes

  • Keep terminal Retry paired with the right error #145222.
  • Keep closed connecting terminal tabs closed #145452.
Open optional panels with clear loading feedback

Home and System busyness open their panel frames immediately, with loading and Retry inside the panel so you can keep editing the main chat. Home keeps its saved size and docking position, and closing a loading panel keeps it closed. Settings no longer automatically restores Ask OpenClaw, though you can still open it yourself.

Sources and complete change list

Improvements

  • Load Home and System busyness in place #147574.
  • Reduce System busyness startup code #147954. Thanks @romneyda, @fuller-stack-dev, @vincentkoc.
  • Defer Skills and file-preview text until needed #150420.
  • Load Usage-page text on demand #150455.
  • Defer skill-preview messages from initial UI load #150491.
  • Load Portals text with its page #150512.
  • Load System busyness only when opened 8618ee31. Thanks @vincentkoc.

Bug fixes

  • Fix Home and System busyness loading dialogs #147434.
Manage mentions and browser notifications

Mentions leaves more room for the entries you came to read. Notification settings now sit in the shared Inbox header, so you can reach them from any Inbox tab.

Sources and complete change list

Improvements

  • Make more room in Mentions and expose shared settings #144412. Thanks @vyctorbrzezowski.
  • Reduce browser notification preparation overhead #146284.
  • Load less data for Web Push test notifications #146573.
  • Batch expired Inbox mention cleanup #147334.
  • Move Web Push storage work off the Gateway thread #150823.
Browse large People lists

Sorting a large session sidebar by People does less repeated work, especially when many different people own sessions. The ordering, selected session, and familiar controls stay the same.

Sources and complete change list

Improvements

  • Speed up People sorting in large sidebars #146063.
Edit settings with clearer controls

Established Labs controls now live with their related settings, including Swarm and loop detection under Agent Defaults → Tools. Settings forms put readable controls and individual hints first, without repeating their defaults in a block of raw JSON.

Settings reloads no longer trigger the repeated loading calls that could overwhelm the browser. Save conflicts still receive their existing recovery controls, and you must explicitly retry a failed save.

Agent Files keeps unsaved edits when you switch agents, including their save-conflict checks. Save before leaving the Agents settings page, reloading the browser, or changing Gateway connections; these drafts are temporary.

Sources and complete change list

Improvements

  • Save session preferences without reconnecting #145337.
  • Match Settings placeholders to navigation #145418. Thanks @vyctorbrzezowski.
  • Move Labs into System settings #145446.
  • Move established Labs controls into settings #145460.
  • Avoid redundant config copies during form edits #145846.
  • Remove redundant JSON default summaries from Settings #146218.
  • Move profile preference access off the main thread #146405.
  • Use consistent disclosure arrows in Settings and Skills #146564. Thanks @vyctorbrzezowski, digitalnav.
  • Save profile preferences together #147534.
  • Save global model defaults without a success banner #148627. Thanks @patrick-erichsen.
  • Remove Settings badges and retain authored tag search #149162. Thanks @patrick-erichsen.

Bug fixes

  • Restore retention and security-header settings controls #143700. Thanks @wangyan2026, @obviyus, @gregbond.
  • Keep sidebar visible at default desktop size #145569.
  • Keep differently typed settings choices distinct #145578.
  • Keep About copy retries busy until completion #146459.
  • Keep selected-agent checkmarks compact #146485. Thanks @vyctorbrzezowski.
  • Prevent settings reload stack overflows #147970.
  • Keep the selected agent across Settings pages #148667. Thanks @patrick-erichsen.
  • Show the selected agent's execution policy in Devices #149066. Thanks @piyushrathoree, @obviyus.
  • Keep long secret names clear of access badges #149108. Thanks @kip-claw, @obviyus.
  • Recover agent identity editing after reconnect #149470.
  • Keep unsaved file edits when switching agents #149524.
  • Prevent lost device binding edits and allow clearing unavailable nodes #149721.
  • Find typography controls through Settings search #150006.
  • Preserve Back navigation through moved Settings links #150133.
  • Preserve included credentials when saving configuration forms #150637. Thanks @wakawakaooo.
  • Keep credential cancellation errors current #150658.
Inspect current usage details

Enabled usage footers keep available totals and cache counts even when separate input and output counts are missing. When a session is recreated, Usage clears the old timeline selection so it no longer hides the new conversation’s messages. Hour filters also handle daylight-saving changes without freezing, and Models settings labels its usage-record count as messages. These display fixes leave billing totals unchanged.

Sources and complete change list

Improvements

  • Reduce work for large transcript usage summaries #145680.
  • Reduce Usage page filter and chart preparation work #146510.
  • Reduce database reads for transcript statistics #146640.
  • Reduce timestamp formatting work in populated lists #146789.
  • Reduce rendering work for populated Usage timelines #146947.
  • Avoid duplicate date-boundary work in usage reports #146995.
  • Reuse timezone formatters for repeated calendar calculations #147003.
  • Shorten the prompt-budget heading #147924.
  • Move usage-pricing reads off the Gateway thread #148709.

Bug fixes

  • Keep usage footers with total or cache-only counts #144302. Thanks @richchen01.
  • Refresh Usage details when sessions are recreated #144430.
  • Clear obsolete Usage ranges after session replacement #144497.
  • Coordinate usage refreshes with database opening and cleanup #145209.
  • Refresh usage estimates after model price writes #146113.
  • Label model usage counts as messages #146735.
  • Prevent Usage hour filters freezing during daylight-saving changes #146919. Thanks @rex993.
  • Honor the selected timezone in Usage date shortcuts #148277. Thanks @quziang, @takhoffman.
  • Retain usage-refresh errors alongside cleanup failures #149296.
  • Correct Usage tool totals and interval message counts #149547.
  • Keep Usage results matched to selected filters #150086.
Open and switch busy conversations

The conversation you open now loads before automatic background session lists. Long histories and chats with many child sessions need less repeated database work, and large session lists let other requests proceed while they load. Chat startup also avoids compression delays on busy Gateways.

Opening one conversation no longer waits for the entire session list to refresh. Stored titles and usage can appear first, while older titles, previews, and some model details arrive later. Cold archives and oversized content can remain without those optional details, and missing usage is not reconstructed.

Large session lists also reuse unchanged titles as messages arrive, choose the correct title after a reset, and keep child-session links in a consistent order. Opening an exact session link and preparing list pages now require less repeated work, including when conversations have many subagents.

Session refreshes also release old versions of session-list data that were being kept in memory, fixing a leak that could exhaust Gateway memory and interrupt work.

Panes showing the same conversation share history recovery, and activity elsewhere avoids unnecessary redraws.

The connection now sends uncompressed frames, so large histories and rosters use more bandwidth.

If a chat misses the signal that work finished, it can clear its busy state when saved history confirms that same run is complete. When both history and live updates fail, Retry now retries both, including approval-card updates.

Sources and complete change list

Improvements

  • Reduce repeated lookups when listing sessions #137745. Thanks @vincentkoc.
  • Reduce work when loading chats with large tool results #137766.
  • Reduce memory growth during session lookups #140499. Thanks @dakshk-02, @obviyus.
  • Avoid repeated decoding during session updates #142866. Thanks @finn763, @obviyus, @quangtran88, @ayaangazali.
  • Avoid redundant reads after queued session refreshes #144239.
  • Avoid rebuilding unchanged chats during worker setup #144385.
  • Reduce Control UI startup JavaScript #145430. Thanks @obviyus.
  • Defer GitHub publication code at UI startup #145476.
  • Reduce repeated model selection in session lists #145580.
  • Reduce temporary allocations in session lists #145671.
  • Reduce allocations in full progress histories #145672.
  • Reduce file checks across history streams #145696.
  • Open pre-reset messages with less waiting #145709.
  • Reduce work reopening chats near history limits #145737.
  • Reduce repeated store checks when loading Sessions #145748.
  • Improve Sessions and Tasks under parallel work #145795.
  • Avoid rebuilding unchanged saved conversations #145863.
  • Avoid duplicate history message preparation #145885.
  • Reduce temporary allocation during session lookups #145997.
  • Load child-session participants together #146000.
  • Reduce temporary copying when serving the Control UI #146003.
  • Reduce temporary metadata during catalog refreshes #146020.
  • Reduce allocation when reading session participants #146036.
  • Reduce allocation during session creation #146068.
  • Reduce temporary allocation in large session lists #146108.
  • Reduce individual session lookup work in large Gateways #146145.
  • Reduce temporary allocation when counting sessions #146158.
  • Reduce repeated session-key parsing #146164.
  • Reduce temporary allocation when reading saved sessions #146184.
  • Reduce temporary allocation during session-key parsing #146193.
  • Load long conversations with less database work #146286. Thanks @shakkernerd.
  • Reduce temporary allocation when creating and listing sessions #146310.
  • Reduce repeated transcript lookup work #146318.
  • Prepare large session pages with less sorting work #146378.
  • Count transcript history without unused display metadata #146382.
  • Reduce database work when loading session history #146390.
  • Reduce temporary allocation during session lookups #146450.
  • Reduce temporary allocations in session reads #146456.
  • Avoid repeated history sizing during active conversations #146574.
  • Speed up catch-up in marker-heavy histories #146578.
  • Reduce repeated work when loading session history #146607.
  • Read multiple sessions with fewer database queries #146668.
  • Reduce loading work for heavily compacted sessions #146717.
  • Reduce broadcast work for unrelated session clients #146746. Thanks @vincentkoc.
  • Reduce repeated streaming work for slow clients #146788.
  • Skip unused prompt decoding for presence updates #146817. Thanks @vincentkoc.
  • Reduce database work for heavily watched sessions #147107.
  • Reduce repeated agent lookups during chat metadata refresh #147137.
  • Defer Apps text until the Control UI needs it #147164.
  • Reduce session-list work with large model catalogs #147350.
  • Reduce first-read history startup work #147491.
  • Reduce repeated history-marker lookups #147532.
  • Reduce recovered-history lookahead rendering #147605.
  • Reduce history query-builder loading #147648.
  • Reuse participant table-check statements #147663.
  • Read branch headlines only when needed #147666.
  • Reduce history identity-validation overhead #147727.
  • Load older pages with less repeated recovery work #147842.
  • Speed session renames and plaintext replies #147869.
  • Reduce repeated work in large session inventories #147911.
  • Reduce repeated metadata query preparation #147916.
  • Reduce session-list work for large subagent histories #148437.
  • Reduce repeated agent lookups when building session lists #148549.
  • Reduce CPU spent assembling session listings #148712.
  • Reduce repeated metadata work in session lists and searches #148713.
  • Reduce repeated sender lookups in queued history #148812.
  • Reduce search delays for restricted operators #148826. Thanks @vincentkoc.
  • Limit conversation metadata work to related subagent runs #148836.
  • Avoid repeated tab-status updates during streaming #148865.
  • Reduce repeated work in multi-agent session lists #149057.
  • Make short chat links ready for drafting sooner #149070.
  • Avoid repeated saved-prompt reads when listing sessions #149118.
  • Reduce repeated runtime-owner lookups across agents #149170. Thanks @kvnloo.
  • Reduce sidebar processing for unchanged sessions #149212.
  • Reduce repeated model-parameter lookup work #149231.
  • Reduce temporary allocation when loading stored sessions #149327.
  • Reuse live session lists and isolate operator results #149387.
  • Reduce repeated database opening in cold session search #149404.
  • Reuse complete subagent session-list reads #149601.
  • Avoid repeated ownership reads for cold session stores #149639.
  • Reduce temporary allocations when ordering large session pages #149677.
  • Skip unused transcript preparation for session lists #149709.
  • Reduce redundant database opens for custom session stores #149724.
  • Speed up configured-agent session membership checks #149839.
  • Offload cold session-detail metadata reads #149858.
  • Reduce repeated work when updating session views #150023.
  • Avoid repeated session-field reconciliation in the Control UI #150194.
  • Keep session lists and live updates current in memory #150196.
  • Reduce session-update work in large subagent registries #150429. Thanks @aniruddhaadak80.
  • Reduce work when listing keyed agent rosters #150533.
  • Reduce repeated UI catalog and metadata requests #150566.
  • Reuse session titles and preserve child order #151182.
  • Speed up exact session links and large session list pages #151204. Thanks @datrab.

Bug fixes

  • Recover chats after missed completion events #145798. Thanks @romneyda.
  • Reduce Sessions-list waits with large saved prompts #146001.
  • Reduce chat startup delays on busy Gateways #146102.
  • Show chat history before loading supporting details #146107.
  • Avoid redundant child-session refreshes in chat #146122.
  • Keep the Gateway responsive while preparing large session lists #146175.
  • Reduce session-switch overhead under Gateway load #146243.
  • Reduce session-loading stalls during skill watcher startup #146480.
  • Load selected chats before background session lists #146591.
  • Preserve chat metadata refreshes and retries #146666.
  • Reduce history read work and keep paging consistent #146770.
  • Avoid redrawing chat history for run-status changes #146802. Thanks @vincentkoc.
  • Limit repeated chat refreshes and settle expired cancellations #146810. Thanks @fuller-stack-dev.
  • Fix shared-store searches and reduce preview overhead #146823. Thanks @vincentkoc.
  • Release closed chat panes after queued updates #147240. Thanks @vincentkoc, @vyctorbrzezowski.
  • Share chat recovery across panes #147416.
  • Prioritize chats over background refreshes #147845.
  • Restore live updates when retrying history #147865.
  • Avoid redundant selected-session reads during sidebar refreshes #148373.
  • Keep metadata loads valid during repeat contributions #148398.
  • Load chat metadata without waiting for unrelated agents #148415.
  • Avoid full metadata reloads after participant updates #148467.
  • Load the selected conversation before automatic chat extras #148483.
  • Keep metadata loading during unrelated session updates #148487.
  • Avoid duplicate sidebar session requests during startup #148917.
  • Keep transcript search working across large session inventories #149254.
  • Correct failed-view recovery and blocked reload handling #149492.
  • Improve Gateway responsiveness during large session-detail reads #149749.
  • Reduce repeated session-list reloads during activity #149774. Thanks @lakemike.
  • Keep chat metadata loading during unrelated session writes #149853.
  • Avoid repeated reads during session-list refreshes #150964.
  • Open conversations before the full session refresh finishes #150989.
  • Reduce repeated subagent bookkeeping in large session lists #151202.
  • Release old session-list data during repeated refreshes #151248.
Read current controls in your language

The 20 existing interface languages receive updated labels and guidance for connection settings, session storage, website dashboards, and other current controls. This keeps the translated interface in step with the screens you use.

Sources and complete change list

Improvements

  • Refresh Inbox expiry wording across 20 locales #144426.
  • Translate outdated usage-context guidance #144444.
  • Translate background-task timing and call counts #144456.
  • Localized provider sign-in guidance #144478.
  • Localized saved API-key removal confirmation #144512.
  • Localized device, download, and plugin-list controls #144523.
  • Refresh translated conversation navigation hints #144777.
  • Translate Skill Workshop action-status warnings #144864.
  • Refresh Control UI translations across 20 locales #145059.
  • Translate the queued-agent notice #145187.
  • Translated chat account heading #145323.
  • Refresh Control UI translations across 20 languages #145408.
  • Translate the App tab label #145610.
  • Refresh agent and plugin UI translations #145742.
  • Translate agent navigation controls #145799.
  • Localize chat error sender labels #145821.
  • Refresh chat and settings translations #147498.
  • Translate recap and archive status labels #147578.
  • Translate chat status and diagnostics text #147850.
  • Refresh translations across twenty locales #147936. Thanks @vincentkoc.
  • Translate Control UI chat comment controls #148752.
  • Translate the model-pending status in existing locales #148799.
  • Refresh translations and clarify pending-request counters #148846. Thanks @romneyda.
  • Refresh Control UI translations #149924.
  • Translate the task progress gesture hint #150258.
  • Translate plugin details and refresh reload guidance #150285.
  • Translate plugin settings labels across20 Control UI locales #150303.
  • Translate credential controls and save warnings in 20 languages #150384.
  • Refresh translated setup and permission guidance #150408.
  • Translate pull-request list collapse controls #150913.

Bug fixes

  • Correct Turkish attachment-removal labels #147445. Thanks @vincentkoc.

Documentation

  • Clarify translated custom-redaction help #145935.
  • Translate desktop viewing and configuration warnings #146176.
  • Translate the Worktree Acceleration setting #146295.
  • Refresh Control UI translations across 20 languages #146400.
  • Translate Gateway ping and activity labels #146781.
  • Translate browser controls and chat actions #146813.
  • Refresh settings-recovery and usage translations #147074.
  • Refresh chat and search status translations #147100.
Browse chat files in tabs

Keep several chat files open in tabs and switch between them without losing your reading position. HTML files offer Preview and Source, and reopened editable drafts can save or resolve conflicts directly from Preview. Strict mode keeps document scripts disabled and applies the guarded preview’s resource restrictions.

Tabs clear when you reconnect. HTML previews retain the 256 KiB limit and do not load relative assets from the file’s directory; attachments from another origin remain download-only.

Reopen a file from chat, a tool card, or the Files list to refresh its saved contents in the existing tab. Simply selecting its tab keeps the current preview. Unsaved edits and newer saves stay protected from delayed reads, including when you switch sessions or connections.

Sources and complete change list

Improvements

  • Keep chat files in tabs and preview HTML #146672.
  • Reduce empty space above sidebar file previews #147116.

Bug fixes

  • Restore scrolling in Files sidebar previews #147115.
  • Open workspace file links with Unicode names #148097.
  • Refresh file previews on explicit reopen #148157.
  • Label raw file previews as Source #148265.
  • Align file-search matches with visible line endings #148827.
  • Ignore surrounding whitespace in Files search #149362.
  • Keep workspace files readable and consistently selected #149499.
  • Keep Files selection and search results current during refreshes #149900.
  • Keep parent-folder navigation when a folder becomes unavailable #150118.

Security and trust

  • Fix strict HTML preview isolation and saving reopened drafts #146873.
Inspect Gateway connection and resource graphs

Settings → Gateway now shows connection ping statistics beside CPU, memory and activity graphs, helping you investigate a slow connection or a busy Gateway. Readings and uptime stay visible during refresh. Ping includes Gateway handling time and does not measure how long a model takes to reply; graph history resets when you leave or reconnect.

Full Debug status, health and model snapshots refresh when opened, when the connection or agent changes, or when you choose Refresh. Heartbeat and command activity stay live.

Minimize System busyness to keep CPU, diagnostics-request time, and process-memory graphs in a small widget while you work. Readings and history continue while minimized and return to the panel when you expand it. Closing stops the readings, and a lost connection shows Unavailable.

The widget’s ping measures the existing system.info request, separately from Settings’ connection ping. Neither measures model response time. The memory graph shows memory held by the Gateway process, known as resident memory or RSS.

Sources and complete change list

Improvements

  • Hide Linux EFI mounts from Gateway disk cards #146739.
  • Keep Gateway host readings visible during refresh #146740.
  • View Gateway ping statistics and activity graphs in settings #146755.
  • Minimize System busyness into a live widget #147760.
  • Show three trends in a smaller busyness widget #147840.
  • Stop hidden diagnostic requests in minimized System busyness #149151.
  • Remove utility launches from covered disk and executable discovery #149792.

Bug fixes

  • Loading feedback for Gateway host readings #145328.
  • Show Gateway uptime in the Debug overlay #146960.
  • Reduce Gateway work while viewing diagnostics #147110.
Keep Undo controls available

Notifications pause their expiry timer while you hover over them or focus their controls with the keyboard, giving you time to use Undo. The remaining time resumes once both hover and focus leave, and you can still dismiss the notification immediately.

Sources and complete change list

Improvements

  • Skip unused measurements when dismissing notifications #147196.

Bug fixes

  • Keep Undo available while notifications are hovered or focused #146940. Thanks @vincentkoc.
  • Keep successful archive and pin results after refresh failures #148155.
  • Keep archive Undo available after switching chats #148831.
  • Keep archive confirmation and Undo after leaving Sessions #150108.
  • Keep delayed attachments out of rewound drafts #150181.
Continue an offline device's conversation on the Gateway

Continue on Gateway now recovers an offline device’s conversation even when pending workspace results previously blocked the action. After recovery, you can send a fresh message or delete the session with its transcript archived.

You must explicitly confirm the loss of unsynced device work. Ordinary moves continue to preserve pending results. Cleanup stays pending until the old device acknowledges its stop, so a recovered conversation does not prove that device has stopped.

If a single Delete or Archive is blocked by offline device work, the web UI now offers the same recovery choice. Reconnect the device to preserve its changes, or explicitly confirm losing its unsynced files and in-flight work. The discard route restores the last Gateway-synced workspace and retries the requested removal once; interrupted work is not replayed.

Cancel preserves pending work, and a failed recovery move does not trigger removal. For a batch, recover each affected session individually before retrying the selection. CLI and native clients do not gain this interactive recovery flow.

Sources and complete change list

Bug fixes

  • Recover offline device sessions blocking Delete or Archive #146588. Thanks @zachisfine, @obviyus, @jalehman.
  • Restore Continue on Gateway with pending device results #147390. Thanks @obviyus, @masterswords1, @jalehman.
Catch up with Activity recaps

Activity recaps help you catch up on a conversation without reopening its full history. These rolling summaries survive page reloads, Gateway restarts, and archival. Previous text stays visible while a recap refreshes or fails, with freshness feedback and Retry recap when available. A recap is a convenience for catching up, not proof that a task is complete.

Generating recaps sends the previous recap and bounded transcript excerpts through the owning agent’s utility model. These separate model calls may incur usage charges. Disabling utility routing stops new recaps, and a failed call does not fall back to the primary model.

Read-only viewers can read cached recaps without requesting model work. Incognito, subagent, and scheduled-job sessions are excluded. Scheduled jobs keep their scheduler-owned summaries.

Sources and complete change list

Improvements

  • Show lasting session recaps in Activity #147441.
  • Improve Activity recaps, ordering and previews #147901. Thanks @onlyysaurabh.
  • Reduce transcript reconciliation startup dependencies #148459. Thanks @jalehman.

Bug fixes

  • Reduce Gateway stalls while saving recaps #147837.
  • Avoid session-list reloads when Activity recaps update #148706.
  • Keep Activity recaps and image galleries current #148814.
  • Keep Activity filters and search focus during navigation #149176.
  • Preserve stored conversations in Activity navigation #149513.
  • Skip conversation recaps for scheduled jobs #150965. Thanks @giodl73-repo.
Keep screen controls in the requesting browser

When you ask an agent to change a page, pane, or panel through screen controls, the change now stays in the browser that requested it. Your other tabs and other people’s dashboards keep their views. Reply also returns focus to the composer when a streamed update has redrawn the conversation.

Standalone RPC and MCP integrations must start screen actions from a Control UI connection or a turn begun there; the previous broadcast behavior is no longer supported. If the original browser has disconnected or no browser was captured, the action returns UNAVAILABLE. Ask again from the open Control UI.

Sources and complete change list

Security and trust

  • Keep screen actions in the requesting browser #147647.

Updates and Maintenance

Atomic Updates check the next version before switching over on supported update paths. Conversation archiving compresses older history you can reopen later, with storage controls in Settings.

Archive older conversations and inspect storage

Conversation archiving compresses older, inactive history while keeping it available to reopen later. Settings shows how much storage each agent’s conversations use, with a Run now control for archiving. Cold storage is off by default. Turn it on to archive eligible inactive history after 30 days, or change that interval without restarting. Opening or resuming an archived conversation restores its history and makes it searchable again, even if you have since turned archiving off.

Make and verify a backup before upgrading. This release changes the conversation database even with archiving off, so going back requires the matching older build and backup. Keep archive files with the database; supported backups include and verify them.

Sources and complete change list

Improvements

  • Archive older transcripts and inspect session storage #145172.

This also preserves account-picker focus during refresh, avoids mutable startup during updater capability checks, and orders Codex steering history after transcript projection.

  • Reduce metadata processing during history archival #148950. Thanks @todddickerson.

Bug fixes

  • Keep artifact reads working during concurrent archival #145625.
Prepare for the session database upgrade

Large conversation stores avoid repeated full scans when OpenClaw checks access to a session or reopens its database. The first check still reads the store, and the change adds some startup, memory, and write overhead.

This release upgrades agent databases to schema 21, which older builds cannot open. Make and verify a pre-upgrade backup that includes committed data still in the database journal, or WAL. Going back requires restoring that backup with its matching older build and loses work saved after the backup. Reinstalling an older package alone is insufficient. Do not change schema markers or delete database tables to force a downgrade. Users updating from 2026.9.2 must follow the manual schema-upgrade instructions.

Sources and complete change list

Limits and compatibility

  • Reduce repeated session admission scans with schema21 #149388. Thanks @todddickerson.
Repair older state explicitly with Doctor

Older conversations, workspace metadata, pairing records, and file-based message queues now wait for an explicit repair instead of being converted during ordinary startup. If OpenClaw reports pending legacy repairs, stop the Gateway through its service owner and run openclaw doctor --fix. Restarting alone no longer completes these conversions. Current prepared-message recovery and ordinary database opening continue normally.

Doctor preserves retained conversations and their associated records during supported migrations. Where damaged history permits only a partial import, its warnings name the files that still need attention. Keep those originals and your backups until you have checked the result, and follow the stopped-Gateway recovery guidance. Unread history is not recovered, and retained old messages are not automatically sent.

Sources and complete change list

Bug fixes

  • Reduce memory use during legacy-session migration #149704.
  • Preserve retained session history through Doctor migrations #149741.
  • Repair older shared databases before recording pending plugin migrations #149753.
  • Finish deferred migrations when upgrading from older versions #149913. Thanks @fuller-stack-dev.
  • Handle damaged retained session history during updates #149956.
  • Check current plugin migrations before archiving retained sessions #149964.
  • Archive orphan transcripts after deferred plugin migrations #150015.

Limits and compatibility

  • Keep legacy session repairs in Doctor #150110.
  • Move legacy pairing and delivery repairs to Doctor #150190.
Choose whether an update repair agent runs

If an interactive update fails, AI repair starts only after you choose Yes, because it uses your account and tokens. Enter, No, cancellation, or a 30-second timeout skips repair and leaves diagnostics and manual recovery instructions. An older updater already running may still use its old prompt.

Sources and complete change list

Improvements

  • Prefer Codex for triage handoffs #149447.

Bug fixes

  • Require affirmative consent for interactive update repair #146693. Thanks @fuller-stack-dev, @as76.

Documentation

  • Clarify owner-requested updates and recovery guidance #146476. Thanks @potterdigital.
Request updates from authorized chat accounts

Owners can ask their agent to update the OpenClaw installation hosting the conversation through the default tool profiles. /update remains available when the model or update tool is unavailable. Existing owner permissions and restart restrictions still apply. Optional first-owner setup asks you to confirm the exact account and defaults to Skip; ordinary permission to chat does not grant administration.

Sources and complete change list

Improvements

  • Optional first-owner enrollment during channel setup #145527.

Bug fixes

  • Owner update requests through default tool profiles #145573.
Choose a coding CLI for repair assistance

Triage can hand repair work to installed Muse Code, Grok Build, Cursor, Kimi Code, and Qwen Code, alongside its existing choices. Select one with openclaw triage --agent; Cursor requires cursor-agent on your PATH. These choices extend explicitly requested repair assistance, while unattended recovery keeps its existing routes.

Review the selected CLI's permission policy. Kimi runs its single repair prompt with native automatic permissions and no approval prompts, which triage announces before launch. Qwen opens an interactive session with its normal approvals; saved headless commands retain its native restrictions.

Sources and complete change list

Improvements

  • Add Muse, Grok and Cursor triage handoffs #149703. Thanks @as76.
  • Add Kimi Code and Qwen Code triage handoffs #149877.
Preserve linked files in backups

Backups preserve external, cyclic, and dangling symbolic links, and Mac metadata files no longer stop backup creation. When several filenames point to the same managed SQLite database through hardlinks, each name in the backup now gets the same saved data, including changes still in the database journal. Every hardlink must be included in the managed backup inventory. Incomplete or conflicting sets are refused.

Symbolic links retain their original targets without copying the files they point to. Review those targets before restoring elsewhere, and use an updated restore reader for these newly supported link archives. See the backup guide.

With openclaw backup git create --all, healthy agents receive fresh snapshots while an unavailable configured agent keeps its previous Git backup, if one exists. The result warns that coverage is degraded because the retained snapshot is older. Explicit agent selection and runs with no copyable databases still fail.

Sources and complete change list

Improvements

  • Preserve external symbolic links in backups #141925. Thanks @adele-with-a-b, @obviyus, @vsumner, @clawputerlabs, @rayseling.

Bug fixes

  • Prevent Mac metadata files from stopping backups #140989. Thanks @ericcaiwx-star, @obviyus, @pollybot13.
  • Preserve committed data across SQLite backup hardlink aliases #144624. Thanks @obviyus, @aron-intframe.
  • Preserve cyclic and dangling links in backups #146161. Thanks @obviyus, @adele-with-a-b.
  • Verify and stage-restore backups with Windows UNC paths #148386.
  • Preserve unavailable agents' previous Git backups #149265. Thanks @yetval.
Keep stale queued messages from replaying after upgrades

Upgrades hold back abandoned messages from older file-based queues instead of sending them when a channel reconnects. This applies to pending messages at least 72 hours old and those with missing or invalid timestamps, including future dates. It does not change ordinary message expiry.

Review withheld messages in the private .migrated backups and verified queue-owned attachments in .media.migrated, then send a new message deliberately. Do not restore old pending entries to resend them. Finish any reported attachment preservation and cleanup before downgrading; openclaw doctor --fix on the same state directory retries incomplete cleanup.

Sources and complete change list

Bug fixes

  • Prevent stale legacy messages from replaying after upgrades #146583. Thanks @iwhatsskill, @scottrawson-sketch.
Finish core updates with clear plugin outcomes

A missing plugin update no longer has to hold up the core update. OpenClaw can keep a compatible installed plugin and explain what still needs repair or consent. Eligible official plugins pinned to older releases can return to normal catalog updates, including some manually pinned versions. A version or tag explicitly requested in your current update command still takes precedence. Explicitly linked local plugins keep their selected source, even when a bundled plugin has the same name; follow the warning to update them at their source. A completed core update can therefore still need plugin follow-up. The update guide explains these outcomes.

Unavailable configured plugin paths now produce actionable warnings while preserving their settings. Fix the reported path or permissions, then run openclaw doctor --fix; the plugin remains unavailable until repaired, and structural errors can still block the update. Pending plugin migrations retain their original inputs, so conflicting edits are refused until repair finishes. Complete pending migrations before returning to an older build when you need to preserve later ACP session changes.

Sources and complete change list

Bug fixes

  • Finish update repair after redundant plugin-path cleanup #144367. Thanks @theangrypit, @cassiemei, @obviyus.
  • Preserve OpenClaw package names in repair commands #144808. Thanks @romneyda.
  • Keep core updates moving when compatible plugin updates are unavailable #145045. Thanks @blaekmajik, @noma-marketplacedb, @zhangmianzhong-glitch.
  • Preserve source-built plugins during repair and updates #145356. Thanks @donniefi.
  • Retain unavailable-plugin update diagnostics #145369. Thanks @fuller-stack-dev.
  • Complete bundled plugin files on the first Git update #145664.
  • Preserve custom-plugin sibling imports during updates #146616. Thanks Jenna Brinning.
  • Preserve explicitly linked plugins during core updates #147009. Thanks @obviyus.
  • Clear false migration warnings for installed bundled runtimes #149653. Thanks @obviyus.
  • Keep unavailable configured plugins from rolling back core updates #150016. Thanks @olli0103, @holny.
  • Preserve plugin settings when configured paths cannot be inspected #150312. Thanks @olli0103.
  • Recover official plugin updates and separate retry notices b6073553b799. Thanks @finn763, @shakkernerd.
  • Let upgrades continue while unavailable plugin migrations wait dac3cb6d47c2.

Documentation

  • Clarify pending plugin-consent update warnings #145970.
Update the installation you actually use

Updates recognize custom npm installations, handle affected pnpm package-directory changes, and check build identity before skipping an explicitly selected same-version package. Git updates can prepare their required files before stopping service, and Mac package replacement preserves launcher permissions.

Older updaters, including 2026.9.4, can now finish an otherwise healthy managed-Gateway update that previously rolled back during a late service-configuration check. The replacement package supplies this repair, so it can help on that same upgrade.

The separate managed-service-preflight refusal before package replacement still needs the manual update instructions for your installation, as may other older-updater blockers. If you see candidate-config-read-failed, the existing service configuration is left unchanged; inspect the problem with the updated CLI. If a baseline scan times out, the update retains a warning that rollback verification was reduced.

Sources and complete change list

Bug fixes

  • Preserve compatible state when switching to npm stable #144155.
  • Unblock pnpm 12 global update staging #144713. Thanks @xilopaint.
  • Continue npm updates after baseline scan timeouts #144758.
  • Complete pnpm updates after package directory changes #144778. Thanks @obviyus, @xilopaint.
  • Install explicitly selected packages when versions match #144894. Thanks @romneyda.
  • Allow longer baseline package scans on slow disks #144925. Thanks @njuboy11, @vincentkoc, @richard355168, @highsensor, @jaysonsolis, @baumus.
  • Explain skipped updates for unsupported installations #145193. Thanks @robotx5.
  • Preserve macOS launcher permissions during updates and rollback #145282. Thanks @pollybot13, @yuxiao345, @alexph-dev, @oktrev, @rileyjjy.
  • Compare package build identity before skipping updates #145349. Thanks @nmotyl.
  • Stage Git update objects before stopping the Gateway #145501. Thanks @romneyda, @fuller-stack-dev.
  • Recognize custom npm prefixes when updating #146091. Thanks Rex Horizon.
  • Avoid lint memory exhaustion during older Git upgrades #146186.
  • Restore Gateway after verified pnpm replacement #146395. Thanks @obviyus, @timetrvlr.
  • Preserve selected packages during repeated managed updates #146756.
  • Accept Bun pipes during managed update handoff #149150.
  • Protect other installations during Node update recovery #150526. Thanks @arrobapontocom-ui.
  • Prevent older updaters from rolling back healthy Gateway updates #151977.

Security and trust

  • Preserve pkg-owned files during self-update #147988. Thanks @vincentkoc, @lucarinaorg.

Limits and compatibility

  • Check system Node during Bun-driven Git updates #149083.

The system Node checked here can differ from the runtime used by package commands, including with version managers.

Update partial Git clones with clear recovery guidance

Partial-clone Git updates can work with intentionally omitted historical objects while still requiring the complete files for the proposed version. If transfer fails, the error distinguishes missing-object recovery guidance from verified corruption. Local edits still stop an update before installation or service shutdown, now with a failure result and instructions to commit the changes and retry or use triage.

Doctor's Git maintenance guide also explains optional cleanup of harmless leftover partial-clone markers. Check for missing objects and verify integrity first, move markers into the prescribed backup, and keep that backup through successful follow-up checks. Cleanup remains a manual choice.

Sources and complete change list

Bug fixes

  • Tolerate missing historical objects during partial-clone updates #150788. Thanks @romneyda.
  • Explain missing Git objects during updates #150793. Thanks @romneyda.
  • Report updates blocked by local edits as failures 77985738b800. Thanks @romneyda.

Documentation

  • Document safe cleanup of leftover partial-clone markers #150798. Thanks @romneyda.
Keep managed services on the selected runtime

Managed Gateway and node services can stay on the exact Node or Bun executable you select with --runtime-path, including a version-manager path. Use an absolute executable path; reinstall and repair preserve it, and an invalid pin produces an error instead of silently choosing another runtime. Set a different path to replace the pin, or explicitly use --runtime node without a path to return to automatic selection. See the Gateway service guide.

Sources and complete change list

Improvements

  • Pin services to an exact runtime executable 9843b937e354. Thanks @darkamenosa, @fuller-stack-dev.

Bug fixes

  • Fix false runtime-pin failures in Linux service installs #150952.
  • Keep unchanged Linux Gateways restartable after upgrades #151049.
Retain local package changes through updates

Package updates save supported local edits for recovery, and --reapply-local-overrides lets you explicitly replay trusted changes against matching original files. Fresh-profile updates now honor that choice too. Back up your edits and data before the first upgrade from an older updater. Recovery bundles are separate from data backups, remain on disk until you remove them, and keep conflicting changes available for manual recovery.

Sources and complete change list

Bug fixes

  • Preserve local package changes during updates #89985. Thanks @fuller-stack-dev.
  • Honor local override replay in fresh-profile updates #145754.
Check updates without disturbing live work

On supported update paths, Atomic Updates check the next version against a private copy of your setup while your current Gateway keeps running, then switch over and verify the updated installation. If something goes wrong, recovery can restore the previous version when your data and configuration remain compatible. Keep a verified backup before upgrading, because rolling back the application cannot undo database migrations. The private validation copy is not a rollback backup.

Once the corrected updater is installed, update checks account for large databases and plugin folders when choosing temporary storage and allowing time to finish. Simple version checks avoid copying entire conversation histories. Checks of the proposed update leave copied background tasks idle and live Workshop files intact, preserve authentication policy, and avoid using the MCP Apps sandbox port needed by your running installation.

Background update checks now read and save their data in the background, and shutdown waits for accepted checks to finish their save attempt. Usage statistics remain opt-in, and current consent, Do Not Track, and update-check settings are checked before a request is sent. Storage failures can still prevent those results from reaching disk.

Sources and complete change list

Improvements

  • Reduce unnecessary loading for configuration backups #147439.
  • Load automatic-update execution only when needed #150582. Thanks @dgmoon1994, @fede-kamel.
  • Defer automatic update discovery until Gateway readiness #150629.

Bug fixes

  • Clean up cancelled update checks and adjust inspection deadlines #144542. Thanks @jalehman.
  • Fix Windows update snapshots with extended-length paths #144688. Thanks @fszcd, @rogerspires4452-dev, @yyds-xxxx, @unknowbug, @nachopenclaw-svg.
  • Let updates finish copying large databases #144901. Thanks @vincentkoc, @baumus, @jplavoiemtl.
  • Fix updates blocked by former Workshop workspaces #145084. Thanks @compoodment.
  • Keep development updates on selected source and enforce deadlines #145300. Thanks @theangrypit, @fuller-stack-dev.
  • Avoid sandbox port conflicts during update checks #145342. Thanks @carme99.
  • Allow updates with intentional open-group policies #145379. Thanks @donniefi, @patrykpatryk5.
  • Keep copied background tasks idle during update checks #145496.
  • Avoid false update rejection with debug capture #145547.
  • Preserve live workspace files during update rehearsal #145606. Thanks @xbb19730559, @itilys, @githoubi, @ggfp2dhtht-wq, @romneyda.
  • Choose update snapshot storage for databases and plugins #145802. Thanks @sootyax.
  • Avoid full history copies during update checks #146027. Thanks @jalehman.
  • Preserve authentication policy settings during update checks #146071. Thanks @jj5638521.
  • Keep update checks on foreground Gateway startup #147011.
  • Defer plugin downloads during update validation #148694. Thanks @aaronqianaa.
  • Show known installed versions and explain unresolved update targets #149693. Thanks @obviyus.
  • Report Node compatibility in update previews #149718. Thanks @water-run.
  • Pause update heartbeats during activation Doctor repairs #149823. Thanks @masatohoshino.
  • Restore custom-plugin Doctor checks in update rehearsals #150978. Thanks @romneyda.
  • Defer MCP connections during update validation b18667756495. Thanks @zzs12345-web.
  • Move update-check storage work into the background worker #150824.
Understand update failures and recovery

Failed updates now show what went wrong first, any later repair or cleanup failure, and the next step to take. Full update repair now restores and health-checks the Gateway service it stopped before reporting a Doctor failure or an expired repair deadline. If restoration fails its checks, the result retains the cause and recovery commands. A service that was already stopped stays stopped. Keep preserved originals until you have checked the result. A recovery check does not mean rollback has finished, and a failed rollback may leave earlier saved changes in place.

Stalled activation now reports a timeout instead of waiting indefinitely. The Gateway can remain stopped while update work is unfinished or when restoration itself fails. Check openclaw update status and Doctor's guidance, wait for the updater and its child processes to stop, and follow the reported repair step. Externally managed systemd services still require their owner to stop the affected Gateway before repair.

After an abandoned update has been successfully reconciled and acknowledged, obsolete failure banners, retry controls, and triage prompts clear while failed historical phases remain available. This does not clear newer failures that still need repair.

Doctor refusals during affected older Git updates now provide manual recovery commands when the previous revision can be verified, or ask you to inspect Git history when it cannot. Wait for the updater to exit and use an independent terminal; restoring source alone is insufficient after data repairs. Update reports also distinguish an unavailable version reading from a real mismatch, and separate saved recovery advice from a Gateway responding now. That response does not establish that the update succeeded or make rollback safe.

Git and package updates can now finish Doctor work without mistakenly rejecting the updater that handed it over. An older updater already running can still report Parent executor is suspended for its candidate. After it exits, run openclaw update repair --yes --json from the updated installation with the same profile and state/config overrides. Check the repair result before restarting a stopped Gateway through its service owner.

Check status now shows when a refresh is pending, completed, or failed; it does not retry the update. New configuration refusals name invalid fields without exposing their values. Package disk warnings also appear earlier, but remain advisory.

A separate early check stops the update before staging when every eligible location has a measured shortage of space for its state snapshot. Free space or choose a suitable TMPDIR before retrying. That early inventory excludes plugin copies and registered external databases; unknown measurements remain warnings, and the complete later check still runs. Older installed updaters retain their first-update behavior.

With managed proxy routing set to gateway-only, the updater now checks the proposed version’s exact local health URLs directly. If an eligible check runs out of time while that version is still running, the update can continue with a warning, but readiness remains unconfirmed. Explicit proxy routing still applies. Blocked routing, cancellation, lost update authority, or the checked version exiting still fail the check. Older updaters keep their original polling code, so the documented first-update workaround temporarily disables managed routing and restores it afterward.

Windows updates can warn and continue when they cannot read when an update process started. A confirmed process-identity mismatch still stops the handoff, but the fallback cannot always distinguish a new process reusing an old process ID. If an interrupted update leaves one of these fallback records, recover with the fixed build. Older builds refuse those records.

Sources and complete change list

Improvements

  • Explain update checks in plain language #147588. Thanks @romneyda.
  • Check snapshot space before staging updates #147908. Thanks @vyctorbrzezowski.
  • Warn when update validation cleanup is unconfirmed #150121.

Bug fixes

  • Keep interrupted updates from leaving service commands in control #143905. Thanks @fuller-stack-dev.
  • Keep retired update records from blocking settings writes #144208.
  • Preserve recorded failure phases in update reports #144281. Thanks @jason-allen-oneal, @fuller-stack-dev.
  • Allow authorized Linux updates past Gateway stop checks #144532. Thanks @jalehman.
  • Allow normal operations before update storage initialization #144715. Thanks @fuller-stack-dev.
  • Preserve the initial error in failed-update diagnostics #144729. Thanks @richard355168.
  • Report the real configuration error during update repair #144819. Thanks @romneyda, @fuller-stack-dev.
  • Show one next step for update recovery #144822. Thanks @romneyda.
  • Avoid implying rollback in update failure reports #145039. Thanks @bodegaclaw.
  • Run update repair with the version that owns the data #145044. Thanks @jalehman, @vincentkoc, @pfrederiksen, @rosssaunders.
  • Recover safe permission drift after interrupted update storage creation #145085.
  • Recover Linux updates after Gateway shutdown errors #145094. Thanks @eleqtrizit.
  • Let validated update repairs apply Doctor migrations #145215. Thanks @bodegaclaw.
  • Remove misleading recovery claims after finalization failure #145321. Thanks @fuller-stack-dev.
  • Preserve failing checks in update reports #145390. Thanks @vincentkoc, @zhangguiping-xydt, @guarismo, @jason-allen-oneal.
  • Keep update recovery checks on the selected database #145507.
  • Preserve failure diagnostics during automated update repair #146229.
  • Preserve exact file identity during update handoff #146461.
  • Continue update repair and restore Gateway after updater exit #146514.
  • Preserve diagnostics after update cleanup fails #146529. Thanks @fuller-stack-dev.
  • Stop stale retry advice after a newer update #146982. Thanks @vincentkoc, @rosssaunders.
  • Bound update activation and allow slower Windows identity checks #147019. Thanks @rogerspires4452-dev, @hermannmetzker-ai, @zaraki-a.
  • Preserve update finalization failure details #147286. Thanks @navras98.
  • Explain recovery after Doctor refuses a Git update #147404. Thanks @obviyus.
  • Clarify update verification and recovery reports #147553. Thanks @freshxiaoyao.
  • Retain actionable update-check failures #147581. Thanks @romneyda.
  • Attribute update failures to the correct check #147583. Thanks @romneyda.
  • Complete the updater’s Doctor handoff #147615.
  • Separate update checks from installation progress #147724. Thanks @vyctorbrzezowski.
  • Explain invalid configuration at update preflight #147771. Thanks @gryffindorhammer.
  • Handle missing Windows process timestamps during updates #147797. Thanks @rogerspires4452-dev, @fazedors.
  • Show status feedback and earlier disk warnings #147883.
  • Keep update readiness checks off managed proxy #147941. Thanks @yoyo837.
  • Finish managed upgrades started by OpenClaw 2026.9.3 #148604. Thanks @jalehman.
  • Retain installed version and Doctor exit in update reports #148702. Thanks @nickfost.
  • Clarify update verification and finish applying saved model keys #148830. Thanks @vincentkoc.
  • Verify update recovery before reporting successful repair #148968. Thanks @pollybot13, @rlosito, @sinenguquko.
  • Keep restart notices with the Gateway being updated #149047. Thanks @vincentkoc.
  • Preserve the reason managed update handoff failed #149202. Thanks @leoin1, @373246784-design, @flyintothesky.
  • Include recognized causes beside update exit codes #149399. Thanks @guxiangya, @jhvics1, @arnehorn, @gbates19-jpg, @jh-pm, @rshields-tfd.
  • Prevent update progress writes from blocking Doctor #149509. Thanks @shakkernerd.
  • Identify configuration errors that block updates #149571. Thanks @mmhzlrj, @ghank, @clawli-coder, @oxiaom, @qudingshun, @phucmep91-debug, @caiming0331.
  • Wait for busy update history and explain deferred updates #149598. Thanks @caiming0331.
  • Log unexpected Gateway update exceptions #149939. Thanks @chelsealong, @tannhatcms.
  • Keep update JSON clear of finalization diagnostics #150061.
  • Avoid false cleanup failures on busy hosts #150392.
  • Preserve useful details in unexpected update failures #151089. Thanks @isinghmitesh.
  • Keep temporary Doctor cleanup failures from blocking updates #151110. Thanks @osipovia, @nktoronto, @qq2744138qq, @zaraki-a, @youfa08, @legion-web3, @luomou12.
  • Repair external systemd installs and clear refusal-only warnings #151132. Thanks @thaman666, @chac4l.
  • Preserve update channels through Node recovery #151150. Thanks @arrobapontocom-ui.
  • Restore Gateway restarts after package upgrades #151179.
  • Preserve update failure details without repeating errors 7423bc2a4cb6. Thanks @romneyda.
  • Wait for Gateway reachability before refreshing login 6c6b03462404. Thanks @sallyom, @fuller-stack-dev.
  • Restore the stopped Gateway after failed repair and clear stale recovery prompts #151003. Thanks @shadesurgeon.

Security and trust

  • Preserve update ownership when recovery is pending #144314. Thanks @vincentkoc, @fuller-stack-dev.
  • Stop configuration changes after update ownership is lost #144315. Thanks @vincentkoc, @fuller-stack-dev.

Documentation

  • Explain recovery from repeated global-install failures #149540. Thanks @dembe-agent, @arnehorn, @rshields-tfd, @cheddaran, @martinic.
  • Clarify limits on detached hosting-Gateway repairs eeab80daf6a3. Thanks @romneyda.

Limits and compatibility

  • Replace unusable update coordination files with unresolved custody risk #145320.

Replacing an affected populated file can hide unfinished native work and allow competing changes. Retaining a diagnostic copy is best effort.

Distinguish accepted updates from completed updates

When an update launched inside a supported managed Gateway service hands work to a background helper, the initiating command now exits with 75. This means accepted and still in progress. Automation must check openclaw update status --json or openclaw update history --json, then follow the printed health guidance before treating the update as complete. Do not retry merely because this acknowledgment is nonzero; other nonzero exits remain failures. An older updater performing the first upgrade keeps its existing exit behavior.

Sources and complete change list

Limits and compatibility

  • Return exit 75 while background updates are still in progress #150799. Thanks @romneyda.
Restart services and recover with Doctor

Doctor and service checks handle more Linux restart and inspection cases, including temporary session-bus loss after a manager has been identified. Repairs retain referenced environment credentials and can bring back a service that was running before maintenance, while leaving an already-stopped service off.

Standalone update repair now recognizes its own Doctor process, while another active or uninspectable update still blocks maintenance. Doctor can temporarily stop and restore its managed Gateway even with --no-restart, which skips update activation only. An already-stopped service stays stopped.

Windows stop and restart can continue after a broad process lookup fails when individual checks still identify the intended Gateway. Linux diagnostics explain when leftover child processes block maintenance; have their owning service or process administrator stop them. If Doctor warns that Windows state is in OneDrive, stop the Gateway, move the whole state directory to local storage, update its service environment, then restart and rerun Doctor.

Native shutdown can abandon unfinished calls when its deadline arrives, including after five seconds of draining on macOS launchd. An older running process still uses its old shutdown code. Where an external service manager owns OpenClaw, follow the Doctor recovery instructions to stop and restart it through that manager. Keep any preserved repair files until you have verified the result.

Restart preserves a recorded Gateway that is still starting and can target a verified healthy Gateway you launched manually, even when a Windows task is installed. If that process is unhealthy or cannot be identified, OpenClaw leaves it running with guidance. External supervisors and other tasks still need their own stop and restart controls.

Restored background tasks with a recorded, verifiably dead local process are marked canceled, so ended work does not repeatedly delay later restarts. Older tasks and unknown, foreign, or unsupported remote owners keep their existing grace periods. Downgrading does not undo cancellations already recorded.

Plugin cleanup failures now name the affected plugin and make stop or restart unsuccessful. A failed in-process restart exits with code 1 and starts no successor. Shared cleanup still finishes, and memory-only cleanup warnings remain nonfatal.

Sources and complete change list

Improvements

  • Load migration code only when Doctor needs it #145334.
  • Avoid repeated shared-state copies in Doctor #145577. Thanks @vacinc.
  • Load legacy memory migration helpers only when needed #146815.
  • Reduce unnecessary loading during Doctor checks #146926.
  • Reduce redundant Gateway startup work #147165.
  • Reduce repeated Gateway startup checks #147285.
  • Reduce repeated Gateway startup preparation #147405.
  • Reuse database inspection processes during startup #147554.
  • Avoid unnecessary migration scans on fresh installations #148851.
  • Inspect native FreeBSD service selection #148875. Thanks @vincentkoc.
  • Reduce startup scans for session sandbox workspaces #149063. Thanks @obviyus, @amtls-bbq.
  • Defer idle tool loading during Gateway startup #149226.
  • Avoid unnecessary Windows startup subprocesses #149257. Thanks @dgmoon1994, @fede-kamel.
  • Skip unused Doctor runtime imports with plugins disabled #149300.
  • Reduce Gateway startup work and defer background maintenance #149314.
  • Identify unfinished service cleanup steps in timeout diagnostics #150195.
  • Load Doctor update-history diagnostics only when needed #150561.
  • Reduce unnecessary configuration-migration loading #151028.

Bug fixes

  • Avoid startup hangs during address checks #80921. Thanks @leegisang, @fuller-stack-dev.
  • Warn when Windows state is stored in OneDrive #123720. Thanks @mohammedalkindi, @vincentkoc, @haruaiclone-droid.
  • Keep restart timing stable across clock changes #137191. Thanks @xialonglee, @patrick-erichsen.
  • Restart Windows Gateways with redirected launcher output #137374. Thanks @akagifreeez, @vincentkoc.
  • Preserve literal paths in Linux service units #137831. Thanks @fuller-stack-dev.
  • Wait for Tailscale readiness before claiming Serve or Funnel #140309. Thanks @ylcn91, @liuyu1984.
  • Wait for Gateway health after Doctor restarts #142497. Thanks @zackmsa777-a11y, @jalehman, @novaunboundai.
  • Preserve Doctor warnings after failed rollback #143839. Thanks @xialonglee.
  • Fix Mac Gateway reinstall with a self-referencing wrapper #144053. Thanks @chelsealong, @obviyus, @xaver-savemyphone.
  • Complete Gateway restarts after forced child cleanup #144069. Thanks @jalehman.
  • Preserve legacy sandbox files after quarantine failure #144787. Thanks @alix-007, @obviyus.
  • Preserve Unix termination signals through startup wrappers #144838. Thanks @shakkernerd.
  • Fix account-switched service probes and explain repair blockers #145023. Thanks @deltaecho3, @mattfaus, @jared-oberhaus.
  • Explain temporary tool limits after restart #145057. Thanks @sunnyshu0925, @abacha, @obviyus.
  • Cancel dashboard preparation during Gateway shutdown #145118.
  • Restart Linux Gateways after Doctor repairs #145220. Thanks @bruce-yii, @kip-claw.
  • Recover orphan task deliveries with Doctor #145284. Thanks @fuller-stack-dev, @githoubi.
  • Recover orphan task records before starting an update #145312. Thanks @fuller-stack-dev, @githoubi.
  • Doctor warnings for Linux service shutdown settings #145322. Thanks @iwhatsskill, @deregtx, @dasx.
  • Continue repair after safely skipped audit recovery #145376. Thanks @robertemetz-afk.
  • Show Linux port clients with spaced process names #145465.
  • Count work inspection toward Gateway pause expiry #145471.
  • Retain Linux service inspection after session-bus loss #145597. Thanks @fuller-stack-dev.
  • Avoid false service-name mismatches during Linux updates #146090.
  • Restore startup after older updaters rewrite legacy settings #146139.
  • Wait for Gateway ownership during restart #146189. Thanks @waynegault.
  • Complete Doctor repairs for older installations #146196.
  • Finish native Gateway shutdown when calls ignore cancellation #146217. Thanks @waynegault.
  • Recover Windows stop and restart after process inspection fails #146387. Thanks @fszcd, @milo-yellow.
  • Preserve referenced environment credentials during startup #146660. Thanks @foxsky, @fuller-stack-dev.
  • Let database workers finish during Doctor repair #146714.
  • Explain remaining Gateway processes blocking Linux maintenance #146865. Thanks @vacinc.
  • Preserve running Gateways during restart cleanup #147242. Thanks @deyangar, @shojikumaru.
  • Keep Doctor saving task flows after module reloads #147292.
  • Verify a replacement Gateway before reporting restart completion #147437. Thanks @miluo-star, @taihartman.
  • Reduce Doctor work on large conversation histories #147464. Thanks @vacinc.
  • Stop ended tasks delaying subsequent restarts #147585. Thanks @gregbond, @vacinc.
  • Cancel background recaps when shutdown begins #147713.
  • Let update repair run its own Doctor maintenance #147720. Thanks @rogerspires4452-dev.
  • Avoid false credential warnings for unavailable plugins #147888. Thanks @zhangguiping-xydt.
  • Avoid false maintenance failures during shutdown #147904. Thanks @obviyus.
  • Report plugin cleanup failures during shutdown #147917. Thanks @obviyus.
  • Keep updates connected to the intended service manager #148061. Thanks @romneyda.
  • Keep Doctor cleanup scoped to its own database clients #148126.
  • Cancel idle node-readiness waits during shutdown #148544.
  • Preserve stopped private inputs through Doctor repair #148625. Thanks @fuller-stack-dev.
  • Restore Windows Scheduled Task inspection diagnostics #148671. Thanks @westaicommerce.
  • Recognize systemd system services in status and Doctor #149055. Thanks @cookywook.
  • Let Doctor wait for slow Gateway restarts #149422. Thanks @novaunboundai.
  • Avoid unrelated service errors in Gateway status #149654. Thanks @obviyus.
  • Preserve Gateway credentials when reinstalling legacy services #149686. Thanks @tlopez80-a11y, @yuexiaoyong-star.
  • Preserve caller signal handling in FreeBSD service discovery #149706. Thanks @vincentkoc, @lucarinaorg.
  • Prevent Doctor restart inspection from timing out on systemd #149970. Thanks @kip-claw.
  • Quarantine changed legacy audit archives and continue repairs #150425.
  • Allow updates when service inspection is unavailable #150494.
  • Preserve channel-account ownership through legacy upgrades #150555. Thanks @arrobapontocom-ui, @lwh0424, @hyspacex.
  • Honor prepared empty migration lists in Doctor validation #150730.
  • Check maintenance ownership before stopping the Gateway #150848. Thanks @romneyda.
  • Preserve legacy speech preferences and explain local memory setup #150927. Thanks @arrobapontocom-ui.
  • Fix Doctor diagnostics for keyed agent configurations 7133cee79246. Thanks @romneyda.
  • Keep Windows scheduled Gateways running after restart 7c51ba75120a. Thanks @ly85206559.
  • Preserve managed environment keys during startup repair 778d6fef4894. Thanks @dasx, @fuller-stack-dev.
Fit Linux shutdown within the service deadline

Linux Gateways now reserve cleanup time within the running systemd service's stop deadline, including externally managed services. A service allowing 90 seconds gives active work 75 seconds, leaving time for cleanup and exit. Unfinished work may still be interrupted.

The deadline is read when the new Gateway starts. Changing the service timeout requires a restart, and the first stop of an older binary still uses its old behavior. Failed inspection logs a warning and uses a 90-second fallback, which may differ from a custom unit. Follow the restart guidance and retain KillMode=mixed when adjusting the service through its owner.

Sources and complete change list

Bug fixes

  • Fit Gateway shutdown within systemd stop deadlines #150954.
  • Honor stop deadlines for externally managed Linux services #151142.
Start and inspect large agent fleets

Large agent fleets avoid preparing chat metadata and Codex session locations for every agent before they are needed. Model preparation and multi-agent status scans give other Gateway requests more opportunities to run, while shared background workers reduce per-agent worker accumulation. These changes address specific sources of delay and memory growth; resource use still depends on the fleet. Parallel database checks can increase peak memory and disk activity, and keeping more authentication readers ready uses more open files.

Online openclaw status --json now uses the running Gateway's facts instead of repeating local fleet scans. Its collection flags distinguish uncollected checks from clean results, and some fields can be null. Run openclaw security audit, openclaw plugins inspect --all, or openclaw memory status --deep when you need those inspections. Plugin authors must also treat registration-time api.config as read-only; plugins that modify it may fail.

Sources and complete change list

Improvements

  • Defer shell-command parser loading until first use #149802. Thanks @dgmoon1994, @fede-kamel.
  • Defer Codex session discovery to reduce fleet startup work #150004. Thanks @609nft.
  • Keep Gateway traffic moving during multi-agent health and status scans #150079. Thanks @nianjiuzst, @obviyus, @baeut.
  • Reduce startup maintenance waits for large agent fleets #150188. Thanks @609nft.
  • Reduce Gateway stalls during large-fleet model preparation #150223. Thanks @609nft.
  • Reduce repeated auth database opens across agents #150524.

Bug fixes

  • Prepare chat metadata on demand instead of warming every agent #149716. Thanks @609nft.
  • Reduce background-worker memory growth in large fleets #150354. Thanks @609nft.

Limits and compatibility

  • Make online JSON status responsive on large agent fleets #150269. Thanks @609nft.
Recover and isolate agent database problems

Healthy agents can remain available while another agent's database checks finish. The affected agent is shown as degraded until preparation succeeds; even the default agent can remain unavailable while healthy peers serve. A responding Gateway therefore does not mean every agent is ready. Shared-state failures and uncertain database ownership can still block work. Stop the Gateway before Doctor repair or verified-backup restoration, then restart and check the affected agent.

Doctor also continues independent repairs when older agent folders contain conflicting files, preserving current files and existing SDK conversations. Databases awaiting relocation stay at their original location with their companion files. Inspect retained quarantines before removing them.

Bun can now open more than four independent worker-backed databases, within its existing 64-client limit. Multiple connections to one database still consume that budget. See Bun compatibility.

Windows now treats ordinary and extended-length spellings of the same internal database path consistently. Run standalone openclaw doctor --fix on the corrected build after updates finish to consolidate existing duplicate registrations, preserving their newest facts and external database locations. Consolidation skips active updates and candidate checks. An older updater blocked before the corrected code runs may need one manual corrective installation.

Sources and complete change list

Improvements

  • Reduce repeated Doctor inspection setup #148028.

Bug fixes

  • Fix shutdown tracking after verifier errors #144451.
  • Recover misplaced duplicate agent databases during upgrades #144714.
  • Keep healthy agents online during secondary database conflicts #145426.
  • Recover agent registrations after interrupted upgrades #145595.
  • Continue Doctor repairs after legacy directory conflicts #146092. Thanks Aristotelianism.
  • Repair duplicate Windows database paths #147762. Thanks @taihartman, @agebreak0083, @amadeubordaneto.
  • Repair legacy Workshop catalog damage through Doctor #148834.
  • Complete history migration with unused configured agents #148901. Thanks @vincentkoc.
  • Explain database-version refusals during startup and status #149168. Thanks @mtoko.
  • Unblock unused agents with empty legacy session indexes #149260. Thanks @wangmiao0668000666.
  • Include custom agent databases in Doctor repair #149268. Thanks @609nft.
  • Preserve session state across repeated Doctor repairs #149308.
  • Allow Doctor maintenance after slow database preparation #149380. Thanks @shakkernerd.
  • Show the original database-opening error #149554.
  • Allow Bun to open more than four SQLite stores #149663.
  • Preserve unknown database write outcomes during recovery #149881.
  • Preserve shared database files when a custom restore is refused #149918.
  • Preserve uncertain nested write outcomes during lease failures #150055.
  • Keep healthy agents available during slow database checks #150755. Thanks @desksk.
  • Repair current-schema agent indexes during startup #150819. Thanks @dh-js, @n0sn3b.
  • Reject uncertain session database ownership #151174.

Limits and compatibility

  • Fix Bun SQLite worker startup and cleanup #145046.
Clean up large session stores

Large conversation stores avoid repeated metadata reads during cleanup, and bulk cleanup no longer hits the reported stack-overflow crash. Cleanup can wait through brief database contention. It also leaves more room for other activity by reusing cleanup workers and pausing between phases, while long transcript rewrites do less repeated search-index work. Automatic cleanup waits for ongoing conversation changes to finish and keeps the existing retention rules and protections for active conversations.

Sources and complete change list

Improvements

  • Reduce temporary memory during session cleanup #145616.
  • Reduce duplicate session cleanup reads #145647. Thanks @hermanzeng.
  • Reduce indexing work during transcript rewrites #145744.
  • Reduce metadata transfer during attachment cleanup #147177.
  • Skip unrelated session reads during cleanup #147625.
  • Skip unnecessary session-maintenance protection scans #148351.
  • Reduce session inventory counting work #148445.
  • Fetch less session data during history cleanup #148553.
  • Reduce maintenance pauses from retained subagent history #148823.
  • Reduce task maintenance overhead on large stores #149526.
  • Reduce repeated session retention checks and schedule idle cleanup #149754.
  • Reduce repeated maintenance scans during concurrent session writes #150371.
  • Reduce session cleanup overhead and startup pauses 7ab507770f3d.

Bug fixes

  • Speed local session cleanup and correct archive accounting #144232.
  • Wait through brief database contention during cleanup #144355.
  • Reject outdated session deletion requests sooner #144525. Thanks @hermanzeng.
  • Prevent Gateway crashes during large session cleanup #145129. Thanks @aatreya.
  • Preserve sessions during active lifecycle changes #146749.
  • Correct cleanup status after post-commit failures #149546.
Verify large databases with less repeated work

Large databases do less repeated checking during ordinary use. OpenClaw can reuse a successful check of the same file for the current Gateway lifetime, while fresh processes, Doctor, backups, and explicit maintenance retain full checks. Background inspections and temporary-file cleanup also leave more room for other work.

Eligible full startup checks can now inspect agent databases directly without copying their entire contents, while retaining fresh integrity, ownership, and migration checks. Recovery-sensitive databases, empty files, and incomplete journal families still need snapshots. Independent agent checks can run two at a time, which can increase peak temporary-storage use and disk activity.

Damage introduced after a file was checked may be detected by normal database access, the daily verifier, or explicit maintenance instead of the next reopen. Full integrity checkers use a larger temporary cache, with about 64 MiB more peak memory per active checker in the recorded measurement.

If an inspection exhausts its ten attempts, the error now explains the limit and suggests waiting for database writes to settle before retrying. Ongoing writes are a possible cause, and the message does not guarantee the next attempt will succeed.

Sources and complete change list

Improvements

  • Check agent databases two at a time during startup #139878. Thanks @xuzhi1982.
  • Reduce read-only SQLite snapshot startup overhead #144448.
  • Avoid full database copies for startup version checks #145541.
  • Keep Gateway responsive during recovery snapshots #145965.
  • Keep Doctor responsive during scheduled-job inspection #146026.
  • Avoid redundant database cleanup after session imports #146597. Thanks @vacinc.
  • Reduce repeated reads during database integrity checks #146650. Thanks @vacinc.
  • Reduce pauses during startup database inspection #146754.
  • Reuse compiled modules during SQLite inspections #147376.
  • Start SQLite snapshot workers with fewer imports #147522.
  • Reduce integrity-check startup imports #147607.
  • Avoid full database copies during startup checks #147635. Thanks @vacinc.
  • Batch reference-schema reads during SQLite validation #149316.
  • Reduce repeated query work during legacy audit imports #149590.
  • Keep Doctor responsive during database-size checks #149951.
  • Reduce repeated database inspection setup during fleet startup #150444. Thanks @609nft.

Bug fixes

  • Retain inspection snapshots through database cleanup failures #145360.
  • Avoid repeated integrity scans when reopening agent databases #146512. Thanks @najef1979-code, @zyv5ge, @sollaci.

The same change keeps small Control UI startup chunks with their consumers.

  • Await temporary SQLite snapshot cleanup #146571.
  • Explain SQLite inspection failures and retry steps #147476. Thanks @obviyus, @sunnyshu0925, @pfrederiksen.
  • Preserve database files during schema-version reads #147633. Thanks @sunnyshu0925, @emilywinslow-source, @ayaangazali.
  • Reuse consistent plugin metadata during Doctor startup checks #149737. Thanks @dgmoon1994, @fede-kamel.
  • Reclaim temporary database copies after interrupted runs #150816. Thanks @vyctorbrzezowski, @glucksberg, @stwhwing.
Read and write session storage efficiently

OpenClaw does less repeated database work when reading and saving conversations, including fewer unnecessary file-permission changes on macOS and Linux. On older installations, offline Doctor recovery can make conversations searchable again when they were missing from the old registry and their transcript files still exist. Explicitly deleted conversations stay deleted.

Conversation saves and model changes wait for database maintenance and cleanup shutdown before writing. Canceled conversation changes stay canceled.

Sources and complete change list

Improvements

  • Reduce repeated filesystem work in Gateway writes #145582.
  • Reuse idle coordinators for frequent state writes #145634.
  • Stop first-result database reads after one row #145678.
  • Reduce repeated work in agent database checks #146181.
  • Reduce large-event overhead in trajectory capture #146244.
  • Batch transcript position lookups for multi-message turns #146292.
  • Skip redundant database permission updates #146492.
  • Reduce SQLite read CPU on newer Node #147862.
  • Reduce repeated SQLite work in session operations #148366. Thanks @datrab.
  • Avoid full transcript scans during session checks #148725. Thanks @vincentkoc.
  • Skip unnecessary database reads during session updates #148748. Thanks @vincentkoc.
  • Reuse compiled transcript presence and freshness queries #148773. Thanks @vincentkoc.
  • Avoid full-roster reads for repeat participants #148841.
  • Reduce repeated session-check stalls during message admission #148868.
  • Reduce session-list and transcript-diagnostic read work #148918. Thanks @datrab.
  • Reuse transcript-count query compilation #149238.
  • Reduce duplicate data binding during session saves #149478.
  • Reduce SQLite result-read overhead on Node 24.20 #149769.
  • Reduce repeated validation work when saving sessions #149821.
  • Reduce repeated session-write query construction #150683.

Bug fixes

  • Recover searchable conversations missing from old session registries #120781. Thanks @leochun92-sudo, @fuller-stack-dev, @rybing7, @injinj, @countermarch.
  • Reject invalid redacted worker transcript batches cleanly #143495. Thanks @vincentkoc.
  • Stop flagging system-agent state as abandoned #144156. Thanks @emes, @obviyus.
  • Apply SQLite lock waiting when readers open #144175.
  • Preserve session updates during database maintenance #146732.
  • Preserve database error handling across module reloads #146741.
  • Coordinate transcript writes with cleanup-worker shutdown #147178.
  • Prevent startup failures during slow database checks #147277. Thanks @vacinc.
  • Retry archived transcript recovery after asynchronous read errors #147284.
  • Preserve session updates when participant cache refresh fails #148607.
  • Coordinate database housekeeping with session writes #148941.
  • Avoid unused avatar reads and preserve rollback-safe profiles #148953.
  • Keep new sessions independent of unrelated archive failures #148958.
  • Close database readers when ownership validation fails #149228.
  • Stop revoked history restores and bound rebuild checks #149333.
  • Track new sessions before their first transcript write #149712.
  • Preserve Windows state-directory selection for queued database work #149976.
  • Prevent stale Side chat and cloud transcript writes #149997.
  • Preserve Windows state directories when opening database workers #150035.
  • Preserve session ownership when recording blocked CLI turns #150038.
  • Preserve Windows state directories during session writes #150146.
  • Coordinate usage-cache writes with other database work e6e377d7418a.
Save current settings and recover failed writes

Settings now confirms the version actually saved, including changes in included configuration files. If you revert a form change while autosave is running, that choice is preserved. Outdated drafts that conflict with included files ask you to reload, and save results distinguish what reached disk from what the running app has applied.

After a stale write is rejected, choose Reload to retrieve current settings, then explicitly retry your change. The rejected write preserves external edits; reloading does not automatically replay it.

If preparing a settings save fails, existing backup history stays intact. Failed saves can restore the original file when ownership checks allow it. If restoration is uncertain, Settings keeps your draft, pauses coordinated UI saves, and tells you which configuration file and backup to inspect. The draft is discarded only after a successful reload of an existing valid file. After reconnecting, a successful Reload Config also resumes autosave. Failed or offline reloads keep your draft.

Doctor repairs now preserve supported nested model and agent settings without flattening included files. Removing an explicit included default model policy keeps an empty policy so later aliases do not unexpectedly restrict model access. A later update failure can leave the candidate package installed after those include changes, so retain the native backups and follow the repair guidance.

Sources and complete change list

Improvements

  • Skip unchanged configuration branches #145883.
  • Speed up configuration section lookups #146482.
  • Reduce startup work for configuration reads #146784.
  • Skip preparation of ineligible configuration backups #149334.
  • Prepare native Gateway configuration snapshots asynchronously #150812.

Bug fixes

  • Preserve configuration edits made during Doctor confirmation #145140. Thanks @shakkernerd.
  • Accurate config save and rollback errors #145365. Thanks @shakkernerd.
  • Protect included settings from stale drafts #145660. Thanks @obviyus.
  • Show literal configuration keys correctly #145724.
  • Return complete JSON configuration errors #145768. Thanks @alix-007, @obviyus.
  • Report unavailable config values as unset #145872.
  • Preserve concurrent settings across autosaves #145939. Thanks @obviyus.
  • Acknowledge saved settings after concurrent edits #145983. Thanks @obviyus.
  • Save Settings reverts made during autosave #146002. Thanks @obviyus.

A remaining conflict case after a successful preference change can still allow a later form save to overwrite an external edit.

  • Reject blank config batch inputs #146053.
  • Accept configuration edits under startup overrides #146275.
  • Preserve configuration and backups after failed saves #146291. Thanks @obviyus.
  • Fix updates with model and agent settings in included files #146743.
  • Preserve Settings drafts after failed configuration recovery #146856. Thanks @obviyus.
  • Resume Settings autosave after Reload Config #147136.
  • Move configuration health and audit persistence to the shared worker #147256.
  • Refresh settings after rejected stale writes #148143.
  • Preserve valid configuration during shared-state retirement #148839. Thanks @vincentkoc.
  • Preserve exact filenames for configuration imports #149629. Thanks @zhangguiping-xydt, @obviyus.
Approve settings changes and corrections from chat

Chat can propose settings edits that were previously refused, including runtime pins and model or provider settings. After a validation failure, the assistant can offer one correction with a separate approval under your session's policy. A notice saying completion is unconfirmed means you should inspect current settings before retrying. Saving settings does not test whether an API key or model route works.

For settings that run a command to obtain a secret, a remaining limitation can allow that preflight command to start after delegated approval ends. Do not rely on canceling the approval to prevent every such command from starting.

Sources and complete change list

Bug fixes

  • Allow approved chat config edits and separately approved corrections #149870. Thanks @obviyus.
Find the cause of slow or failed maintenance

Status checks avoid unnecessary copies of large conversation databases and reuse session reads. Optional diagnostic timelines show where status collection spent time, while storage logs identify slow transcript reads and cleanup. Doctor also explains the fixed USER.md size limit and useful ways to shorten or move excess information.

In pretty and compact console output, Gateway warnings, errors, and fatal messages can now show their redacted diagnostic fields, including in systemd journals. Long diagnostic tails can still omit later fields. This improves investigation without changing file logging or repairing the underlying slow operation.

Deep status and Doctor now warn when pending database writes cannot finish moving from the journal into the main database. Capture the status output and restart gracefully if directed. Never delete a WAL file to clear the warning; it can contain committed data. Status polling also reads task summaries with less interference in chat work.

Shutdown failures now retain the failed step and redacted exception details after exit, with bounded time for pending logs to flush. Inspect them with openclaw gateway stability --bundle latest --json. This helps diagnose failures once the fixed Gateway is running; it does not repair the original exception or recover details already lost.

Sources and complete change list

Improvements

  • Report external and ArrayBuffer memory #141902. Thanks @vincentkoc.
  • Show which archive-cleanup stages are slow #144224.
  • Explain time spent in slow session-list requests #144531.
  • Reuse compiled plugin Doctor checks in built checkouts #144676.
  • Explain time spent in slow task cleanup #144697.
  • Separate database-check time from surrounding delays #144746.
  • Reduce unused logging work with Prometheus #145576.
  • Speed recovery checks for large inventories #145711.
  • Batch session reads for shared-store health summaries #146177.
  • Avoid duplicate status reads and expose collection timings #146228.
  • Identify slow transcript reads and maintenance in logs #146231.
  • Reuse database queries for transcript statistics #146281.
  • Speed recent proxy capture session lists in large histories #146752.
  • Reduce prompt-recording CPU overhead #147876.
  • Batch trajectory event writes #147896.
  • Explain time spent in asynchronous database integrity checks #148372.
  • Read failed-delivery health counts in the shared worker #148636.
  • Version Doctor lint JSON output #150847. Thanks @romneyda.
  • Avoid full database copies for ordinary schema checks 0f748036332e. Thanks @vacinc.

Bug fixes

  • Reject conflicting Doctor maintenance requests #117488. Thanks @fuller-stack-dev.
  • Reject oversized trajectory sources before parsing #130877. Thanks @sunnyshu0925, @patrick-erichsen.
  • Explain USER.md size limits accurately in Doctor #136967. Thanks @xialonglee, @patrick-erichsen, @majik360, @pawel-kowalczyk.
  • Reject empty audit time filters and limits #137335. Thanks @alix-007.
  • Use selected-model context in Doctor tool checks #144332.
  • Clear old log records after observed file disappearance #144360.
  • Report temporary SQLite snapshot cleanup failures #144558. Thanks @sunnyshu0925.
  • Explain Codex plugin health failures in Doctor #144813. Thanks @romneyda.
  • Suppress repeated Bonjour warnings after interface removal #144870. Thanks @tzy-17, @obviyus, @tontoko.
  • Preserve dashboard HTTP errors when repair text fails #145227.
  • Include worker requests in latency diagnostics #145602. Thanks @vincentkoc.
  • Count active sessions beyond the first history page #146207.
  • Avoid full database copies during status ownership checks #146213.
  • Stop suggesting invalid names as configuration choices #146321. Thanks @vincentkoc.
  • Report blocked database checkpoints in status and Doctor #146775. Thanks @thegizmopro.
  • Label the status session count as stored #146979.
  • Keep status polling from delaying Gateway responses #147141.
  • Label terminal session counts as stored sessions #147273.
  • Report Claude directory inspection failures in Doctor #147287. Thanks @alix-007, @obviyus.
  • Preserve new log records after concurrent truncation #147311. Thanks @alix-007, @vincentkoc.
  • Show configuration inspection failures in support summaries #147414.
  • Preserve node worker startup failure reasons #147798.
  • Report actual trajectory export files #147987.
  • Retain Gateway shutdown failure details after exit #148163. Thanks @navras98.
  • Recover log following when rotation removes the active file #148654. Thanks @alix-007, @fuller-stack-dev.
  • Fix Linux log-follow fallback timestamp compatibility #148781. Thanks @alix-007, @obviyus.
  • Show shutdown triggers and recent Gateway stop history #148910. Thanks @mtoko.
  • Show plugin names in text logs #149011. Thanks @alix-007, Tak.
  • Identify slow session subscription warnings correctly #149062.
  • Standardize malformed push-proxy credential errors #149112.
  • Give slow Gateways more time for Doctor diagnostics #149373.
  • Keep status reports available when Git checks are slow #149491. Thanks @novaunboundai.
  • Return Doctor exit 2 for JSON runtime failures #149713.
  • Preserve Doctor JSON output when SQLite workers log diagnostics #150184.
  • Preserve SQLite failure details through cleanup errors #150368.
  • Preserve final SQLite worker shutdown diagnostics #150511.
  • Show repeated plugin diagnostics once in Doctor reports #150796. Thanks @romneyda.
  • Distinguish status timeouts from connectivity failures #150828. Thanks @romneyda.
  • Preserve session-read errors when cleanup also fails #151163.
  • Preserve task diagnostics when worker shutdown also fails #151177.
  • Show diagnostic details in plain Gateway warnings and errors #151215.
Investigate a running Gateway's CPU and memory use

Administrators running OpenClaw on Node can investigate a busy Gateway without restarting it. Live diagnostics offers diagnostics.cpuProfile for CPU sampling and diagnostics.heapProfile for sampled allocation call stacks, through openclaw gateway call. Both require operator.admin and are requested manually.

Profiles cover the main JavaScript runtime rather than all process memory or threads. Capture adds overhead and can take longer than requested if the Gateway stalls. Avoid competing profilers and review retained code symbols before sharing a profile. The results help investigate a problem; they do not repair it.

Sources and complete change list

Improvements

  • Capture CPU profiles from a running Gateway #148004. Thanks @vincentkoc.
  • Report session-list CPU time in diagnostics #149291.
  • Sample Gateway heap allocations for troubleshooting #150594.

Bug fixes

  • Accept valid CPU profiles with out-of-order timestamps #149276.
  • Accept valid negative coordinates in CPU profiles #149597.
  • Accept CPU profiles containing WebAssembly callback frames #149701.
  • Clarify memory-pressure guidance and named Doctor removals #150894. Thanks @dom521.
Keep bundled tools compatible after updates

The bundled tool refresh preserves chat scroll position during streaming and dock changes, fixes cleanup after an unused iOS voice capture is canceled, and keeps hidden Mac Dashboard and chat windows hidden. MCP app discovery, themes, and command-line selections also retain compatibility with their updated dependencies.

The acpx backend now accepts incoming messages up to 64 MiB per raw line. Larger trusted messages need ACPX_MAX_ACP_MESSAGE_BYTES and a Gateway restart; 0 removes that limit. The direct OpenClaw ACP bridge is unaffected. Remote authenticated Lobster calls now need an explicit nested --token, separate from the approval-resume token. Ambient OpenClaw credentials are no longer forwarded to remote destinations, and already-dispatched steps are not automatically retried.

Sources and complete change list

Limits and compatibility

  • Refresh dependencies and repair chat scrolling, voice cancellation and hidden Mac windows #149908.
See which build is running

Git installations report the built version and flag when it needs rebuilding to catch up with the checkout. Doctor also gives rebuild and restart guidance when the recorded build and checkout commits differ. That warning is advisory and stays quiet during updates. If an agent fails because OpenClaw was replaced while still running, its error explains that a restart is needed.

Refreshing Git update status clears stale reminders and behind counts when the checkout is current or ahead. Update settings also display an inferred Extended stable channel correctly.

Sources and complete change list

Improvements

  • Doctor warns about source and build mismatches #144499. Thanks @romneyda.
  • Show installed Gateway version when the probe returns none 97527632cd2b. Thanks @holny.

Bug fixes

  • Show inferred Extended stable in update settings #138952. Thanks @marmar9615-cloud, @obviyus.
  • Clear stale Git update prompts after refresh #142959. Thanks @ly85206559.
  • Report built versions and flag stale Git builds #143538. Thanks @romneyda.
  • Explain failures from outdated running installations #143906. Thanks @romneyda.
  • Keep reconciliation imports stable across development rebuilds #148561. Thanks @romneyda, @newsstand, @sonpiaz.
Read documentation and release history

Documentation fixes make code examples and command labels readable in titles, preserve existing section links, and clarify setup and troubleshooting guidance. Per-version release notes are easier to browse, with labeled formatted and plain-Markdown reading options, including the earlier v2026.9.4 notes.

Sources and complete change list

Improvements

  • Per-version release notes and preserved contribution records #145464. Thanks @hannesrudolph.

Bug fixes

  • Keep outdated QA evidence out of current maturity coverage #143976. Thanks @vincentkoc, @romneyda.
  • Restore code text in documentation titles #144389. Thanks @vyctorbrzezowski.
  • Render complete labels containing angle brackets #144390. Thanks @vyctorbrzezowski.
  • Report malformed docs search responses #145613.
  • Restore docs publishing and preserve existing links #146415. Thanks @hannesrudolph.

Documentation

  • Expand maturity guidance for shared and fleet deployments #143528. Thanks @romneyda.
  • Correct documentation links and pruning reference #144133. Thanks @vincentkoc.
  • Simplify Why OpenClaw while preserving links #144344.
  • Correct repeated wording in personal-account guidance #144405. Thanks @vyctorbrzezowski.
  • Remove duplicate message-prefix migration entry #144409. Thanks @vyctorbrzezowski.
  • Correct token-rate example units #144410. Thanks @vyctorbrzezowski.
  • Mirror v2026.9.4 release notes in plain Markdown #146386. Thanks @hannesrudolph.
  • Preserve context behind maturity ratings #147219. Thanks @vincentkoc.
Back up application databases

Backups can complete when unrelated application databases contain broken references between records, while OpenClaw's managed databases and declared plugin databases still receive checked snapshots. Agent and plugin discovery works during concurrent writes, including when workspace files are excluded. If discovery fails, resolve the error before creating a state backup. --only-config saves just the active JSON configuration file, excluding included files, state, and external credentials.

Unrelated databases and their companion files are copied as ordinary files with warnings. Use the owning application's backup procedure when you need a consistent copy of a running database or removal of deleted data. OpenClaw v2026.9.4 cannot restore archives containing these database companion files. Follow the backup guide, use openclaw backup create --verify, and keep a verified pre-upgrade backup if you need to downgrade.

Sources and complete change list

Bug fixes

  • Keep unrelated SQLite files from blocking backups #146700. Thanks @obviyus, @clawputerlabs.
  • Preserve backup discovery during concurrent state writes #146912. Thanks @obviyus.
  • Correct backup commands in recovery guidance #147023. Thanks @zzs12345-web.
Allow more time for slow updates

Updates on slower machines and installations with large databases now allow time based on the work they need to complete. Ongoing copy progress extends the wait, and update-status network checks default to 300 seconds with explicit overrides still available. Larger allowances can mean longer waits during a stall, and an updater already running keeps the timers it loaded. A timeout does not make rollback or restart safe by itself; follow the reported recovery instructions.

With the corrected updater, a qualifying slow-starting Gateway can remain running after readiness checks expire, with its backups retained. The result stays gateway-readiness-unverified, not completed success or a promise to finish in the background. Keep the backups and check openclaw gateway status --deep. An already-running 2026.9.3 or 2026.9.4 updater keeps its older completion behavior and can still disable Windows autostart after this unverified result.

Sources and complete change list

Improvements

  • Give slow updates time based on required work 290613f538dd. Thanks @rlosito.

This also preserves selected Chrome-tab navigation through stale loading and same-group events without restoring revoked access.

Bug fixes

  • Let slow Gateway startups finish during managed updates #144890. Thanks @baumus.
  • Keep slow-starting Gateways running after update readiness expires #149760. Thanks @djskinner, @novaunboundai.
Use configured deadlines for setup and repair

Setup and repair conversations now use your configured agent timeout instead of stopping after two minutes. The embedded helper also skips skills it cannot use. Set an explicit shorter agents.defaults.timeoutSeconds value when you want to limit these runs; the documented default is 48 hours, and 0 disables the deadline. See the setup and repair guide.

Sources and complete change list

Bug fixes

  • Honor agent timeouts during setup and repair #147422.

Messaging

Experimental room teams let several agents take part in one conversation. Messaging also improves replies, interactive questions and recovery after interruptions across supported channels.

Let specialists participate in a room

Experimental room teams let you bring several configured agents into one conversation, address a particular specialist, and let the agents discuss their answers for a limited number of rounds. Discord and Slack replies and attachments now stay with the participant who answered. Extra rounds use more agent runs, and the discussion's active budget does not survive a restart. See broadcast groups for setup and limits.

Sources and complete change list

Improvements

  • Configure bounded multi-agent conversations in messaging rooms #141411.

Bug fixes

  • Preserve participant context for Discord and Slack replies #145735.
  • Wait for pending Raft wake work during shutdown #150070.
Review cross-service messaging defaults

Agents with message-tool access can now send messages and perform permitted actions across configured chat services without a separate cross-provider opt-in. This also changes existing installations that leave tools.message.crossContext.allowAcrossProviders unset. Other tool, account, channel, and provider permissions still apply.

To keep services isolated, set tools.message.crossContext.allowAcrossProviders to false. To confine guarded actions to the current bound conversation, also set tools.message.crossContext.allowWithinProvider to false. Per-agent settings override global settings. CLI calls without a bound source conversation are not confined to one conversation by these controls, and separate shell and filesystem restrictions still matter. See cross-provider messaging guidance.

Sources and complete change list

Documentation

  • Explain cross-provider messaging defaults and upgrade impact #150157.

Limits and compatibility

  • Allow messaging across configured chat services by default #149875.
Use Discord voice and interactive replies

Configured GPT-Live conversations in Discord can play short and subsequent replies, preserve pauses, and hear you interrupt while the agent speaks. Uneven audio arrives with fewer playback gaps, using up to 120 ms of initial buffering, and silence no longer interrupts the reply. Buttons, forms, model menus, and Activity launches also keep their actions tied to the intended choice.

For GPT-Live, remove requireWakeName: true and consultPolicy: "always", or choose gpt-realtime-2.1 for host-controlled turns. The separate opt-in alternate Discord endpoint applies across accounts, takes precedence over explicit proxy and custom-fetch choices, blocks off-origin media, has no silent fallback to public Discord, and does not support interactive voice.

Sources and complete change list

Improvements

  • Support a custom Discord API endpoint #118067. Thanks @romneyda.
  • Remove redundant Discord audio copies #145893.
  • Split long Discord replies with many code blocks faster #146074.
  • Avoid an extra audio copy in Discord recordings #148302.

Bug fixes

  • Restore Discord replies after reopening archived threads #111148. Thanks @hanamizuki and @fuller-stack-dev.
  • Correct Discord thread permission diagnostics #121144. Thanks @alix-007.
  • Honor configured Discord line limits in durable sends #137969. Thanks @anyech, @davidbennett1979, and @patrick-erichsen.
  • Keep Discord model selections tied to available runtimes #143322. Thanks @obviyus.
  • Prevent resolved Discord Activities from confusing later clicks #145162.
  • Preserve resolved Discord account credentials #145424.
  • Restore continuous GPT-Live conversations in Discord #146289.
  • Wait for Discord interaction registration and cleanup #146319.
  • Reduce Discord voice playback gaps and stale controls #146798.
  • Finish voice processing before releasing temporary audio #146885.
  • Update the Discord and OpenAI voice codec #147093.
  • Preserve voice speech and pauses across playback gaps #148023.
  • Prevent Gateway hangs during Discord voice join cleanup #148638.
  • Reject malformed Discord message IDs before requests #150151. Thanks @shakkernerd.
  • Reopen accessible unlocked Discord threads with Send Messages permission #150216. Thanks @shakkernerd.
  • Restore Discord transcript capture across plugin loads #150905. Thanks @romneyda.
Read and address the intended Discord message

Reading a Discord message with --message-id or messageId now returns that message or an error, instead of unrelated recent history. Commands, autocomplete, and model selection also keep the intended channel or thread when Discord supplies only its ID. Authorized actions in your current DM accept equivalent native-channel targets while retaining the existing account and conversation restrictions.

Sources and complete change list

Bug fixes

  • Preserve Discord channel identity in commands and model selection #148852. Thanks @k-oc-agent, @obviyus, and K.
  • Honor message IDs when reading Discord messages #149113. Thanks @donniefi, @obviyus, and @dg-thinkgoode.
  • Restore Discord DM actions with channel-prefixed targets #149201. Thanks @shakkernerd and @nissl24.
Restore Discord threads and finish accepted work

When Discord starts, saved threads reconnect to their agent conversations without holding up other Gateway work on the database lookup. Failed or canceled startup cleans up the pending thread setup, and presence greetings recheck the current settings before they start. Stopping an account waits for accepted introductions to finish their delivery and recording work, so shutdown can take longer while that work settles.

Sources and complete change list

Bug fixes

  • Keep presence-greeting storage from blocking Discord events #149576.
  • Restore Discord thread bindings without blocking the main thread #149861.
  • Finish accepted Discord introductions before shutdown #150072.
Send richer LINE replies

LINE can bring photos sent together into one turn so your agent can consider the set, and supported questions in direct chats offer answer buttons. You can also enable native quoted replies or receive completed portions of an answer as they finish.

Automatic quoting is off by default. Sending reply blocks uses more of LINE's message quota. For models without native vision, photo sets need tools.media.image.attachments.mode set to all and a sufficient maxAttachments limit.

Sources and complete change list

Improvements

  • Answer agent questions with a tap in LINE direct chats #133421. Thanks @edenfunf and @patrick-erichsen.
  • Add native quote replies for LINE #142092. Thanks @edenfunf and @patrick-erichsen.

Bug fixes

  • Keep malformed LINE carousel replies readable as text #113366. Thanks @edenfunf, @vincentkoc, and @patrick-erichsen.
  • Handle photos sent together in LINE as one turn #132136. Thanks @edenfunf and @patrick-erichsen.
  • Explain disabled or missing LINE webhook settings #133649. Thanks @edenfunf and @patrick-erichsen.
  • Make LINE block streaming settings work #142145. Thanks @edenfunf and @patrick-erichsen.
Keep Slack threads responsive

Slack keeps one progress card per command, shows interactive choices once, and preserves the complete written answer when controls cannot be used. A duplicate event waiting in one thread no longer holds up unrelated threads, and compatible corrections can reach a queued turn once it starts running.

You can change supported access and reply settings for new work without reconnecting Slack. Replies already underway keep their original settings. Account, connection, and other settings that require a restart still reconnect Slack.

Incoming messages remain queued for retry through temporary Slack authorization outages, while invalid credentials stay rejected. Socket Mode also handles the affected rate-limit and incomplete notifications without crashing the Gateway.

Sources and complete change list

Improvements

  • Reduce formatting work for long Slack replies #144633.
  • Apply Slack access and reply settings without reconnecting #146202.
  • Skip unnecessary Slack text entity checks #146629.
  • Reduce long Slack message conversion work #147678.

Bug fixes

  • Show one Slack progress card per command #143879. Thanks @n1hility and @sallyom.
  • Keep command text stable when progress completes #143880. Thanks @n1hility and @sallyom.
  • Honor proxy settings for Slack relay connections #143881. Thanks @n1hility and @obviyus.
  • Preserve complete Slack replies without repeating native choices #144653. Thanks @obviyus.
  • Preserve Slack diagnostics for cyclic errors #145721. Thanks @alix-007 and @altaywtf.
  • Restore Slack onboarding after core updates #147109. Thanks @vincentkoc.
  • Close Slack health-check connections #147846.
  • Fall back safely for malformed Slack table headers #148872.
  • Wait for pending Slack reply settlement during shutdown #150073.
  • Reject malformed queued Slack relay records #150406. Thanks @romneyda.
  • Retry Slack messages after temporary authorization failures #150457. Thanks @pash-openai.
  • Prevent Slack control notifications from crashing the Gateway #150608. Thanks @pash-openai.
  • Keep Slack threads responsive during queued work bffda1f. Thanks @pash-openai.
Keep Telegram conversations and input in order

Telegram conversation titles include known forum topic names, and earlier text reaches the agent before later long-message fragments. An authorized /stop clears your pending input in that chat or topic. Agents can also discover supported persistent subagent conversations again, keeping follow-ups with the same helper when binding is enabled.

You can change supported access rules and reply settings for new work without reconnecting the bot. Work already underway keeps the settings it started with. Token, connection, account, and native-command changes still require their usual refresh.

Typed commands retain replied-to photos, quotes, and topic context and now run in the chat session. Codex-backed credential requests also deliver their protected form links again, including in side questions. Enter the credential in the masked Control UI form, not in Telegram. Messages interrupted by shutdown before the agent takes ownership return to the queue for restart recovery; already-adopted turns are not replayed, avoiding repeated tool work.

On affected self-hosted Telegram Bot API setups, a reply rejected with "rich message must be non-empty" can now arrive as plain text. This preserves the available text without enabling rich formatting on the older server or recovering previously stranded deliveries.

Sources and complete change list

Improvements

  • Update Telegram access and replies without reconnecting #146129.
  • Reduce long Telegram message preparation #147786.
  • Move Telegram message bookkeeping and poll routing off the event loop #149588.

Bug fixes

  • Restore protected credential links in Telegram #140079. Thanks @wantosure, @obviyus, @mganjoo, and @waterundman.
  • Show Telegram topic names in conversation titles #140983. Thanks @obviyus.
  • Keep deliberately skipped Telegram messages from failing jobs #143583. Thanks @sunlit-deng, @obviyus, and @jerabinovich.
  • Preserve Telegram input order and cancel buffered text with stop #144839. Thanks @obviyus and @xilopaint.
  • Deliver plain Telegram text after legacy rich-message rejection #145223. Thanks @0xalydev, @obviyus, and @elharonyclaw.
  • Restore Telegram persistent subagent conversations #145543. Thanks @nimarosa, @obviyus, and @jackpothan.
  • Preserve queued Telegram messages interrupted by restart #149953. Thanks @obviyus.
  • Keep reply and photo context in Telegram commands #150028. Thanks @obviyus.
  • Wait for accepted Telegram work before account shutdown #150080.
  • Keep Telegram model buttons tied to their original provider #150880. Thanks @obviyus.

Documentation

  • Explain Telegram message storage and replay guarantees #147222. Thanks @navras98, @vincentkoc, and @mehmetulutug.
  • Clarify Telegram button sends and action permissions #147229. Thanks @navras98 and @vincentkoc.
Preserve Teams mentions, tables, and polls

Teams replies preserve mention names containing escaped brackets or backslashes and correctly separate raw tables from code blocks in lists when table conversion is off. Votes submitted while older poll data is being imported are also preserved.

Sources and complete change list

Improvements

  • Reduce Teams image and mention formatting work #146362.

Bug fixes

  • Correct Teams table boundaries around list code blocks #146464.
  • Preserve escaped display names in Teams mentions #146532.
  • Reduce poll cleanup reads and protect concurrent votes #146575.
Recover Matrix replies and preserve local files

Previously joined encrypted Matrix rooms can recover replies at startup when their local encryption state is missing. Encryption remains opt-in, and rooms that cannot recover remain blocked from sending instead of falling back to plaintext. Control UI settings can also save again when Matrix account credentials use secret references, preserving those references and keeping their IDs hidden in readback.

Background-generated Matrix media can arrive after the incoming request has ended, and recovered deliveries retain accurate reply information. Long messages and spoilers also need less repeated formatting work.

Failed migrations now leave unrelated nearby files in place. If startup stops during a migration, retain the local database, source files, and .migrated archives while fixing the reported permissions or file conflict and retrying. The Matrix migration guide explains recovery.

Sources and complete change list

Improvements

  • Reduce repeated work when formatting Matrix spoilers #145261.
  • Speed up Matrix formatted message preparation #146604.
  • Prepare long plain Matrix messages faster #146652.
  • Reuse table parsing for Matrix spoilers #147418.
  • Move Matrix credential and crypto snapshots off Gateway thread #149548.
  • Move Matrix recovery-key persistence to background storage #149695.

Bug fixes

  • Recover encrypted replies in existing Matrix rooms #115688. Thanks @alexscfraser, @fuller-stack-dev, and @aurorabotticus-svg.
  • Report malformed Matrix directory replies as errors #131718. Thanks @xu-kai-quan, @obviyus, and @shojikumaru.
  • Refresh Matrix keys before reporting device trust #136226. Thanks @romneyda.
  • Preserve unrelated files after Matrix migration failures #144883.
  • Keep background media delivery working after Matrix requests end #144907. Thanks @romneyda.
  • Correct Matrix reply metadata after delivery recovery #145173.
  • Preserve Matrix encrypted sync state across restarts #148152. Thanks @romneyda.
  • Preserve Matrix account secret references when saving settings #150321. Thanks @donniefi, @fuller-stack-dev, and @june-repro.
Find Feishu contacts across directory pages

Feishu contact searches now reach later directory pages, and the requested result limit counts matching people. You can request more than 50 contacts; the default remains 50 matches, with existing access rules and a 100-page lookup limit.

Sources and complete change list

Bug fixes

  • Find Feishu contacts beyond the first directory page #149077. Thanks @shakkernerd.
Restore iMessage feedback and remote attachments

After the iMessage bridge recovers, supported typing indicators and read receipts can return on the next incoming message using your existing preferences. Official external iMessage installs can also copy permitted remote attachments into OpenClaw again.

When iMessage catchup is enabled, OpenClaw recovers the oldest missed messages first at startup. The existing limits still apply, including the 500-message window per chat, your configured age limit, and the cap on messages replayed at each startup. Catchup does not repeat automatically or recover messages that earlier runs already skipped.

iMessage setup now offers to correct a command path that points to a folder or a file that cannot run. Custom Windows command extensions must be allowed by PATHEXT; passing the availability check still does not guarantee the command will launch.

Sources and complete change list

Improvements

  • Reduce unnecessary module loading for iMessage delivery #146294.
  • Move iMessage receipt recovery reads off the Gateway thread #148392.
  • Move iMessage echo and replay bookkeeping off the Gateway thread #149605.
  • Move iMessage reply-cache storage off the Gateway thread #149808.

Bug fixes

  • Restore iMessage feedback after bridge recovery #142626. Thanks @omarshahine.
  • Restore remote attachments for external iMessage installs #144048. Thanks @liuwqgit, @obviyus, and @mlapida.
  • Recover older missed iMessages before advancing catchup #147395. Thanks @obviyus, @zhangguiping-xydt, and @yetval.
  • Detect unusable configured command paths #147703. Thanks @alix-007 and @obviyus.
Use saved Signal accounts and long replies

Signal accounts with names such as Work Phone can start without running Doctor when they have their own configured phone number. Their own endpoint and access settings now take effect, so review those settings when upgrading. If deleting an account would activate another saved identity, OpenClaw leaves it running and names the conflicting entries for you to resolve. See Signal account guidance.

Sources and complete change list

Improvements

  • Format long Signal list replies faster #146340.

Bug fixes

  • Respect Signal container connection timeouts #108574. Thanks @pick-cat and @fuller-stack-dev.
  • Repair Signal accounts skipped because of their names #138982. Thanks @marmar9615-cloud and @obviyus.
  • Start Signal accounts with spaced names #145750. Thanks @obviyus and @marmar9615-cloud.
  • Refuse Signal deletion that changes account identity #145981. Thanks @obviyus.
  • Move Signal reply-context persistence off the Gateway thread #149896.
Answer questions in Mattermost

Mattermost offers buttons for supported simple questions, so you can choose an answer without retyping it. Typing still works, and questions needing private or more complex answers stay in text. Model menus also reflect the account selected for the conversation.

Sources and complete change list

Improvements

  • Answer Mattermost questions with option buttons #135350. Thanks @edenfunf and @patrick-erichsen.

Bug fixes

  • Honor selected accounts in Mattermost model menus #144880. Thanks @obviyus.
  • Recognize accepted Mattermost reactions #148055. Thanks @chengyouj and @fuller-stack-dev.
Save and import Nostr profiles

Authorized paired dashboard users can save and import Nostr profiles without supplying another credential. Profile actions can also use a valid saved credential when the browser credential is rejected, and rejected requests show readable errors.

If access is revoked while a profile publication is being acknowledged, a retry with another saved credential can publish it again. Revocation cannot undo a publication already sent to a relay.

Sources and complete change list

Bug fixes

  • Recover Nostr profile actions with saved credentials #138975. Thanks @zhangguiping-xydt and @obviyus.
  • Restore Nostr profile actions for paired operators #145932. Thanks @obviyus.
Keep eligible Buzz rooms connected

An unavailable Buzz room no longer keeps other eligible rooms offline. Granting a skipped room the Bot role can bring it back without reconnecting healthy rooms, while startup and reconnect reuse saved room information to prepare the appropriate history.

Sources and complete change list

Improvements

  • Reduce Buzz room recovery work on startup and reconnect #146463.

Bug fixes

  • Keep eligible Buzz rooms online and restore newly granted rooms #144070. Thanks @sla55er and @obviyus.
Find the next step when a room conversation stops

If a room conversation still cannot continue after restart recovery, a reminder can explain how to start again. Use an authorized /reset or /new, or choose Resume in new session in WebChat when the model is locked. Starting fresh keeps the old transcript.

Sources and complete change list

Bug fixes

  • Explain how to recover failed room sessions #146363. Thanks @chachi-max.
  • Honor explicitly configured reset command aliases #149203.
Use approval buttons and keep prompts available

Authorized operators can use Allow Once or Deny on OpenClaw change-approval cards in Discord and Slack, and late button responses no longer overwrite the final result. Slack can also finish the original pending card after a restart. Configured approval forwarding also sends a text prompt when the destination's native approval handler is inactive. A local prompt or a recovering handler can show the same request again; a handler stopping after the request arrives does not trigger rerouting.

iMessage, WhatsApp, Signal, and Matrix now wait for approval controls to finish registering or clearing before reporting that operation complete. Plugin authors must await the updated registration and deletion methods and use a supporting host. If optional storage fails, the fallback lasts only until the process stops; see the approval SDK guidance.

Sources and complete change list

Bug fixes

  • Wait for approval bindings to save and clear #146325.
  • Make Discord and Slack change-approval cards actionable #147152. Thanks @obviyus, @liuwqgit, and @anyech.
  • Keep approval prompts available during native-handler downtime #148228. Thanks @edenfunf, @obviyus, @harshitgupta31415, and @mertbasar0.
Inspect and recover channel connections

You can check one channel's status even if an unrelated account check fails. Accounts you explicitly start stay visible while discovery catches up, and recovery after a computer freeze continues past diagnostic errors. Accounts you stopped manually stay stopped.

Replies on affected channels keep working after live settings changes without a restart. Queued replies and attachment cleanup keep using their original storage, even if settings change while they wait. Delayed replies and discovered conversations respect changes to the agent handling them, and follow-up messages waiting behind long replies avoid unnecessary timeout retries.

Message scripts must omit --channel when they want automatic selection. An empty value now stops the command instead of silently choosing a channel; see message commands.

Sources and complete change list

Improvements

  • Add channel names and verified help paths to JSON listings #93265. Thanks @fuller-stack-dev.
  • Reduce repeated conversation search work #145952.
  • Reduce device-pair notification status read cost #146889.
  • Reduce cached Discord role processing #147573.
  • Move queued session-delivery persistence off Gateway thread #147887.
  • Avoid repeated missing-plugin checks #147977.

Bug fixes

  • Report empty IRC sends as failures #129660.
  • Show explicitly started channel accounts in status #144503. Thanks @ericcaiwx-star and @obviyus.
  • Prevent channel startup failures when plugins load together #145026. Thanks @meajuda365.
  • Wait for pending delivery reads during shutdown #145168.
  • Reject blank integer channel setup options #145534. Thanks @hugenshen and @obviyus.
  • Restore model switching with omitted plugin defaults #145904. Thanks @obviyus, @tsuel-dev, and @jiajia021.
  • Keep filtered channel status independent of unrelated accounts #146271.
  • Preserve configured channels in plugin send results #146619.
  • Recover channels despite diagnostic inspector failures #146720.
  • Keep delayed replies tied to the current conversation #146866.
  • Keep queued deliveries in their original state directory #146917.
  • Recheck conversation routing before saving discovered addresses #146927.
  • Keep queued conversation replies on original storage #146984.
  • Keep channel replies working after hot configuration reloads #147001. Thanks @sunhsiao, @xiankun-liang, @lidashi1025, @bronyazaychik0328, @bruce-yii, @obviyus, and @cqforest123-wq.
  • Keep delayed session announcements working after replies finish #147150. Thanks @vincentkoc, @mikywang, @liuwqgit, @sunlit-deng, and @bruce-yii.
  • Avoid false errors after channel startup cancellation #147510.
  • Restore delegation from peer-bound groups #147716. Thanks @vincentkoc.
  • Preserve Telegram webhook startup error codes #148417.
  • Prevent duplicate channel-task cleanup and repeated errors #148922. Thanks @holny.
  • Avoid repeated sleep recovery on busy Gateways #149369. Thanks @pollybot13.
  • Keep queued channel messages alive during long replies dba4da1. Thanks @pollybot13 and @obviyus.

Documentation

  • Clarify channel membership in maturity references #148120. Thanks @romneyda.
  • Clarify agent bindings and reload guidance #148848.

Limits and compatibility

  • Reject blank message channel arguments #144802. Thanks @ly85206559 and @obviyus.
Recover Zalo Personal connections and saved sessions

A stalled Zalo Personal connection attempt now times out after 30 seconds and releases its listener so the existing retry path can try again. That is a limit for one connection attempt, not a recovery deadline for every outage. Restoring saved sessions and routinely refreshing credentials also move their database work off the Gateway thread on supporting hosts, preserving logout and replacement-session checks. QR-login replacement and logout keep their existing synchronous storage paths.

Sources and complete change list

Improvements

  • Avoid Gateway blocking during Zalo credential refresh #149527.

Bug fixes

  • Recover from stalled Zalo Personal connection attempts #109506. Thanks @lsr911 and @fuller-stack-dev.
Keep incoming email moving

Packaged IMAP no longer lets the affected HTML-only emails block later incoming mail when they contain encoded characters such as an apostrophe. Updating to the repaired package restores parsing without a mailbox reset. If you build OpenClaw from source, rebuild the package to receive the fix.

Sources and complete change list

Bug fixes

  • Prevent HTML-only email from stalling IMAP #142678. Thanks @ericcaiwx-star, @obviyus, and @dennyjoe.
Preserve location pins and message attachments

Location pins now survive removal of private runtime text from an outgoing message, and group-thread locations remain standalone so an added sender caption does not discard them. Attachments with unusual content-type headers also pass through media handling without the error that could stop an upload. Existing channel support and content limits still apply.

Sources and complete change list

Bug fixes

  • Preserve location pins after private text is removed #129390.
  • Preserve attachments with unusual content-type headers #143673. Thanks @xialonglee and @obviyus.
Recover incomplete channel replies

OpenClaw can recover a final answer or missing ending when part of a streamed reply is confirmed unsent. It keeps track of acknowledged text and attachments, while an uncertain send stays under recovery instead of triggering a competing answer. Some formatted replies still need the full-answer fallback and can repeat text when the delivered prefix cannot be matched safely.

Sources and complete change list

Bug fixes

  • Recover final answers after failed streamed messages #145428. Thanks @obviyus.
  • Recover missing streamed reply tails #148301. Thanks @obviyus.
Receive replies after channel requests finish

Verified official channel plugins installed through supported external installation paths regain replies from delegated work that finishes after the original turn ends, including the affected Discord setup. LINE and the shared SMS and Zalo webhook paths also keep replies and queued follow-ups alive after the initial incoming request finishes. Existing cancellation and access checks still apply; this does not extend the official-plugin repair to arbitrary third-party plugins.

Sources and complete change list

Bug fixes

  • Restore deferred replies for official channel installations #148146. Thanks @anyech and @o0j4yj4y0o.
  • Keep webhook-triggered replies alive after ingress polling ends #148548. Thanks @edenfunf and @obviyus.
Stop pending outgoing messages

Canceling supported messaging work now stops more pending sends, uploads, and message changes from starting. For a partly sent broadcast, OpenClaw keeps the completed results and distinguishes possible delivery from destinations never attempted, so you can follow up selectively. Possible delivery is not confirmation.

Requests already submitted may finish. Cancellation does not recall delivered messages or files, undo accepted changes, or stop remote tasks already accepted. A file upload alone also does not establish delivery to a conversation.

Telegram retains the delivered message when a follow-up pin fails. An optional pin failure leaves delivery successful; a required pin failure is reported as partial failure, with the message and its receipt retained. Recovery does not resend the original message because its pin failed.

These protections depend on the channel carrying through OpenClaw's cancellation check. They do not cover every scheduled-message path.

Sources and complete change list

Bug fixes

  • Wait for outbound ownership renewal before cancellation cleanup #148390. Thanks @fuller-stack-dev.
  • Keep broadcast results after cancellation #151165. Thanks @shakkernerd.

Security and trust

  • Stop further Slack requests after direct delivery is revoked #151102. Thanks @shakkernerd.
  • Stop canceled A2A deliveries before requests and retries #151108. Thanks @shakkernerd.
  • Stop canceled Tlon sends and preserve per-send account isolation #151129. Thanks @shakkernerd.
  • Stop canceled Talk deliveries before further requests #151135. Thanks @shakkernerd.
  • Stop canceled iMessage deliveries before further sends #151144. Thanks @shakkernerd.
  • Stop canceled Google Chat sends after preparation #151146. Thanks @shakkernerd.
  • Stop canceled Nostr sends before relay fallback #151160. Thanks @shakkernerd.
  • Stop pending LINE sends after cancellation or supersession #151162. Thanks @shakkernerd.
  • Stop remaining Slack requests when an action ends #151166. Thanks @shakkernerd.
  • Stop pending Signal sends after cancellation #151169. Thanks @shakkernerd.
  • Recheck Zalo sends after preparation #151171. Thanks @shakkernerd.
  • Stop later Feishu sends after cancellation #151168. Thanks @shakkernerd.
  • Stop pending Teams sends after cancellation and retain accepted receipts #151193. Thanks @shakkernerd.
  • Stop later ClickClack sends after cancellation and retain accepted messages #151208. Thanks @shakkernerd.
  • Stop later Zalo Personal requests after cancellation #151230. Thanks @shakkernerd.
  • Stop pending Feishu edits, pins and reactions after cancellation #151235. Thanks @shakkernerd.
  • Stop pending Teams pins, reactions and chat changes after cancellation #151237. Thanks @shakkernerd.
  • Stop later Telegram pins after delivery cancellation #151244. Thanks @shakkernerd.
  • Stop further Matrix uploads and sends after cancellation #151257. Thanks @shakkernerd.
Prepare long replies with less repeated work

Long lists, code-heavy replies, and streamed progress need less repeated scanning as OpenClaw prepares them for chat. These changes preserve the text and message boundaries, while Discord persona replies also respect the requested size limit after mentions are expanded.

Sources and complete change list

Improvements

  • Reduce repeated code-block searches when splitting replies #145254.
  • Reduce formatting work for list-heavy reports #145665.
  • Prepare long newline-chunked replies faster #146242.
  • Reduce processing of code-containing progress updates #146628.
  • Reduce processing of streamed reasoning progress #146751.
  • Reduce repeated work in Matrix, Feishu and Beam #146772.
  • Reduce processing for long reasoning progress updates #146776.
  • Avoid duplicate Zalo Personal Markdown parsing #147488.
  • Skip unused attachment decoding #147879.
  • Reduce repeated parsing of long Telegram replies #148285.
  • Skip unnecessary transcript-header scans in code-heavy replies #148345.
  • Reduce duplicate-checking work as message caches fill #148700.
  • Avoid repeated rich-post parsing in Feishu reads #149136.
  • Speed up formatting long Telegram replies #150213.
  • Reduce Telegram reply formatting work #150222.

Bug fixes

  • Honor Discord persona text limits and reply targets #144629.
Clean up failed Feishu attachment downloads

If a Feishu attachment fails to save, OpenClaw tries to close the download stream even when no data has been read yet. You still get the original storage or timeout error for troubleshooting.

Sources and complete change list

Bug fixes

  • Close Feishu streams after failed saves #145891.
Read accurate QQBot setup warnings

Valid QQBot direct-message settings no longer trigger contradictory advice to add a wildcard that the configuration does not allow. This corrects the warning while preserving your access settings.

Sources and complete change list

Bug fixes

  • Stop contradictory QQBot direct-message warnings #144187. Thanks @ericcaiwx-star, @obviyus, @lamkan0210, and @yubingjiaocn.
Understand WeChat pairing limits

The WeChat guide now explains that plugin version 2.4.8 uses its own sender list and QR-login fallback, so normal OpenClaw pairing approvals and revocations do not reliably control its chat access. Disable that plugin if you require those controls. This is corrected guidance; the plugin's behavior has not changed.

Sources and complete change list

Documentation

  • Clarify WeChat 2.4.8 access-control limits #144262. Thanks @vincentkoc.
Follow progress in channel replies

Supported channel previews now show readable progress notes, so you can see what your agent is doing while you wait. Slack and Telegram also remove abandoned previews after tool work while retaining the final answer or useful failure notice. Slack keeps a preview when someone has replied to it, preserving that part of the conversation. Your existing preview settings still control what appears.

In Slack's compact progress mode, the last complete update stays visible until the next complete one arrives, instead of being replaced by a word fragment.

Sources and complete change list

Improvements

  • Reduce progress-note formatting work #147602.

Bug fixes

  • Show readable progress-card notes in channel drafts #144790. Thanks @obviyus and @lastguru-net.
  • Keep recoverable tool failures out of quiet progress #145345. Thanks @stemkat100 and @joncursi.
  • Remove abandoned Slack and Telegram streaming previews #147106. Thanks @vincentkoc, @doomclaw, @sweetsophia, and @100yenadmin.
  • Restore quiet Slack progress updates #150407. Thanks @pash-openai and @fuller-stack-dev.
  • Avoid fragment-only Slack progress notifications #150671. Thanks @pash-openai.
  • Clear temporary Slack status after queued followups finish #151084. Thanks @pash-openai.
  • Keep complete Slack progress messages visible between updates #151164. Thanks @pash-openai.
Keep Mattermost thread participation current

Mattermost keeps a thread's original participation expiry after a restart, so an expired conversation requires a mention again. It can also recover permitted recent thread context after a restart or reset, including DMs with threading enabled. Recovery respects historyLimit, reads at most one 200-post page per attempt, and has a five-second deadline. A reset can therefore be followed by earlier server-held messages returning as context; flat DMs are unchanged.

Sources and complete change list

Bug fixes

  • Preserve Mattermost thread participation expiry #147289.
  • Restore Mattermost thread context after restart or reset #150644. Thanks @fuller-stack-dev, @iloveleon19, and @geekforlife.
Keep messages with the selected destination

Messages now use the room or conversation selected through the active channel plugin, without a saved account default adding a conflicting destination and blocking the send.

Sources and complete change list

Bug fixes

  • Keep subagent results on the selected conversation #144704.
  • Preserve selected channel destinations #147492. Thanks @shakkernerd.
  • Keep Slack message-tool updates in their reply thread #151069. Thanks @pash-openai.
Read the intended Teams conversation

Teams searches and member lookups now use the conversation you select, with existing access and membership restrictions still enforced. Channel lists and details also accept valid Teams team IDs when Slack is enabled. Lists still require teamId, and channel details require both teamId and channelId.

Sources and complete change list

Bug fixes

  • Expose Teams team IDs in message actions #147579. Thanks @shakkernerd.
  • Honor selected Teams conversations #147591. Thanks @shakkernerd.
  • Select Matrix and Teams conversations for CLI member lookup #149074. Thanks @shakkernerd.
  • Accept current-channel ID aliases in Teams lookups #149093. Thanks @shakkernerd.
  • Honor Teams CLI search targets and limits #149353. Thanks @masatohoshino and @obviyus.
Read permitted context through installed channel plugins

Verified official Discord, Slack, and Matrix installs can retrieve supported context from other conversations when your account and destination rules allow it. Discord also restores permission and server metadata lookups. Matrix reads follow the existing room and direct-message access rules, with no new permission to change messages.

Official Mattermost, Teams, and Feishu installations also restore their supported, permitted context reads. Mattermost history reads remain disabled until enabled, and Teams member lookup still excludes private and shared channels. Authenticated dashboard conversations can use supported official-plugin reads under their existing permissions. Channel-origin replies through CLI backends also regain permitted Discord actions and Discord/Slack reads; this does not grant the same authority to scheduled work.

Update core and the official plugin together. OpenClaw 2026.9.4 lacks the required plugin API, so updating the plugin alone is not sufficient. See the channel-plugin guidance for the supported read actions.

Discord server-wide reads require an allowed server and unrestricted or wildcard channel access. Delegated agents do not get the filtered channel-list exception available to direct operators. Other actions and unverified installations keep their restrictions, and revoking access cannot recall a request already sent.

Sources and complete change list

Bug fixes

  • Restore permitted context reads in installed Discord and Slack plugins #143341. Thanks @anyech, @shakkernerd, @josh-cornelius, @wg-mojo, @kareemelangbawy191, and @nissl24.
  • Restore Slack requester and emoji lookups #147657. Thanks @shakkernerd and @josh-cornelius.
  • Restore Discord metadata reads after official installation #147658. Thanks @shakkernerd, @josh-cornelius, @wg-mojo, and @kareemelangbawy191.
  • Restore permitted Slack file downloads #147659. Thanks @shakkernerd and @josh-cornelius.
  • Restore permitted Mattermost history reads #147660. Thanks @shakkernerd and @josh-cornelius.
  • Restore permitted Teams context reads #147661. Thanks @shakkernerd and @josh-cornelius.
  • Restore Matrix context reads after official installation #147665. Thanks @shakkernerd.
  • Preserve Feishu reads after official installation #147667. Thanks @shakkernerd.
  • Restore permitted message actions for CLI channel replies #149131. Thanks @shakkernerd and @nissl24.
  • Restore permitted dashboard reads through official plugins #150309. Thanks @shakkernerd.

Security and trust

  • Keep Matrix reads from changing direct-message mappings #151093. Thanks @shakkernerd.

Memory

Interrupted memory rebuilds can reuse completed work, and large searches cause fewer pauses for other work in OpenClaw.

Rebuild and repair saved memory indexes

With embedding caching enabled, a memory rebuild can reuse completed work after a retry or restart. The existing search index stays intact until its replacement succeeds. OpenClaw also repairs partially missing keyword indexes during normal initialization.

With search synchronization enabled, an older index can rebuild automatically when you search after an upgrade. That first repair can take longer and make paid embedding-provider requests. After a rollback, a newer-format index is preserved and search stays paused until you upgrade OpenClaw or explicitly reindex. Checking status alone does not rebuild it.

If changes to secret-masking rules interrupt conversation indexing, OpenClaw keeps the existing index and pending updates for another attempt. Those pending retries last only within the same running process, and new content becomes searchable only after a later synchronization succeeds.

Sources and complete change list

Scripts using memory commands with --json now receive a single parseable error if validation, the command itself, or historical-workspace cleanup fails. Historical commands wait for cleanup before reporting success. A failure does not undo memory data already written.

Google/Gemini embeddings now reject empty or malformed responses. Custom Google-compatible endpoints that return them will report errors, and previously stored vectors are not repaired by this change.

Improvements

  • Reduce overlapping memory chunk preparation #145733.
  • Reduce archive-notification work in memory indexing #146140.
  • Skip unnecessary setup for empty memory replacements #146150.
  • Reduce repeated memory index checks #146494.
  • Reuse memory-origin queries #147630.
  • Move memory event storage off Gateway thread #147948.
  • Bound vector cleanup for small memory sources #148854.
  • Report missing memory command arguments sooner #149946.

Bug fixes

  • Reuse completed embeddings after failed rebuilds #144404. Thanks @jalehman, @louisone1, @gaodaabao, @niriakot, @dbostik, @loshay1.
  • Recognize embedding quota errors in long responses #144619.
  • Recover missing memory search index rows #144641. Thanks @jinliyl.
  • Correct Bun memory file destinations and indexing order #144700.
  • Restore memory search fallback for index-name collisions #144783.
  • Automatically repair outdated memory indexes after upgrades #146713. Thanks @obviyus, @githoubi, @itanyplus.
  • Coordinate memory indexing with database writes and shutdown #146760.
  • Return one JSON error for memory command failures #147366.
  • Preserve indexing retries during redaction changes #147870.
  • Background bounded session-memory reindex writes #148101.
  • Avoid Gateway stalls during memory rebuild cleanup #148230.
  • Recover memory indexing from Zhipu item limits 0afc023. Thanks @ylcn91, @vincentkoc.
  • Reject malformed Google embeddings before memory indexing 4068854. Thanks @fuller-stack-dev.

Limits and compatibility

  • Preserve newer memory indexes and disclose rebuild costs #146908. Thanks @obviyus.
Forget saved memories and their sources

Forget removes a session's influence on memory ranking while keeping its source transcript. Forgetting a nonempty selection also clears that agent's entire embedding cache, so later indexing may make new provider requests. Unrelated published memories remain searchable.

Consolidated memories now keep the source links needed for Forget when a file replacement reports an error after writing, or its outcome is uncertain. Uncertain writes report an error without automatically appending another copy. This protects future Forget operations in that failure case; it does not recover source links lost before the fix.

Sources and complete change list

Improvements

  • Reduce memory-forget counting overhead #146215.
  • Reduce work when deleting memory source records #146283.
  • Reduce data loaded when previewing and forgetting memory #147315.
  • Batch deletion of forgotten memory sources #147451.
  • Batch records when forgetting many sessions #147504.

Bug fixes

  • Remove forgotten sessions' memory-ranking signals #144622. Thanks @jinliyl, @obviyus.
  • Keep consolidated memories removable after write errors #149340.
Memory search responsiveness

Large memory searches and note preparation cause fewer pauses for other work in OpenClaw by running in the background. Control requests can also continue while large memory indexes are installed, though other database writes may still wait and indexing itself can take longer. Semantic search avoids a repeated-scan problem that could leave affected searches with only partial keyword results, without requiring a reindex.

Independent conversations can recall Active Memory at the same time when helper capacity is available. The existing subagent concurrency setting controls this separate shared limit, and busy periods can still cause timeouts. On the Codex path, recall follows the current request through prompt rebuilds instead of being triggered by an old memory question in the conversation history.

Sources and complete change list

Keyword, filename, and project-scoped searches read and sort less unused text without changing how results are selected. Several matches from one file can also share a preview.

Scanning archived conversations for memory indexing now lets other work in OpenClaw continue. The scan itself can take longer. Errors other than a missing archive directory still surface, so an incomplete scan is not mistaken for deleted transcripts.

Improvements

  • Reduce text loading in fallback memory search #145693.
  • Speed keyword searches in large memory indexes #145739.
  • Reduce repeated snippet work in memory diversity ranking #146120.
  • Speed up memory searches for filenames and paths #146153.
  • Keep the Gateway responsive during large memory searches #146168. Thanks @jackten.
  • Rank multilingual memory results with less work #146256.
  • Reduce unrelated project reads during memory recall #146301.
  • Load less text for vector memory search snippets #146380.
  • Fetch less note text during fallback memory search #146507.
  • Reduce hashing work in memory and Slack #146686.
  • Copy less note text during memory filename searches #146891.
  • Reduce temporary memory while hashing exports #147481.
  • Bound vector-search decision counts #147900.
  • Reuse SQL statements during memory vector replacement #148201. Thanks @vincentkoc, @jalehman.
  • Avoid duplicate memory startup transcript reads #148202.
  • Avoid unnecessary leases during captured-text preparation #148278.
  • Avoid decoding saved prompts during transcript discovery #148484.
  • Skip unused transcript revision reads during memory sync #148615.
  • Skip unrelated project reads in global recall #149452.
  • Skip unused recall-tracking loading when dreaming is disabled #149503.
  • Reduce memory-index worker startup time #150314.
  • Reduce memory-index worker initialization overhead #150602.
  • Move memory-presence checks off the CLI thread #150988.

Bug fixes

  • Allow memory recalls to proceed concurrently #99105. Thanks @gorkem2020, @fuller-stack-dev.
  • Reuse file previews across memory search matches #145238.
  • Reduce Gateway pauses while scanning transcript archives #148072.
  • Keep Active Memory recall focused on the current request #149180. Thanks @lordratner, @sercada, @fuller-stack-dev, @gisk0, @joeykrug, @suidge.
  • Prevent repeated vector scans in semantic memory search #149348. Thanks @wrgrant, @obviyus.
  • Keep Gateway responsive while publishing memory indexes #149901. Thanks @fuller-stack-dev, @jalehman, @hk31584-alt, @aron-intframe.
  • Release temporary tools after background memory work #150899.
Memory Wiki search and compilation

Memory Wiki reuses pages it has already parsed when searching, reading, and compiling your vault. OpenClaw can also find the Obsidian command when a folder with the same name appears earlier in the search path.

Sources and complete change list

Improvements

  • Reduce repeated parsing in Memory Wiki #146364.
  • Reduce work selecting Memory Wiki search snippets #148361.

Bug fixes

  • Skip directories when finding the Obsidian command #144681. Thanks @alix-007, @obviyus.
Public types for embedding plugins

Embedding plugin authors can use the public SDK types for asynchronous text batches instead of importing internal memory types. Batches remain per-file by default; combining a whole source requires explicit opt-in through sourceWideBatchEmbed.

Sources and complete change list

Improvements

  • Expose public asynchronous embedding-batch types #129625. Thanks @ekinnee, @patrick-erichsen.
Keep promoted memories within file limits

Dreaming and manual promotion now check that the updated MEMORY.md fits the startup file limits of agents sharing the workspace. They use the smallest configured limit, up to the existing 10,000-character ceiling. Only memories actually saved are marked promoted or included in dream narratives. To make room, OpenClaw removes only recognized generated sections within the configured prior-entry loss allowance, 25% by default. User-written and ambiguous text is preserved.

A full or oversized file can pause new promotions until consolidation, freed space, or changed limits let them fit. Candidates still follow normal eligibility and expiry rules, so retrying alone may not help. Existing oversized user-written text is not automatically trimmed. Dreaming reports also explain why candidates that reached promotion were not saved to long-term memory.

Sources and complete change list

Improvements

  • Reuse timezone formatters in memory scans #148461.
  • Reuse the current day when calculating memory status #148593.

Bug fixes

  • Keep memory promotion within bootstrap limits #142545. Thanks @romneyda, @zachisfine.
  • Avoid counting unchanged daily memories twice after capped sweeps #144611. Thanks @jinliyl, @obviyus.
  • Explain why dreaming candidates were not saved #145458. Thanks @migelizaga-rgb, @vincentkoc, @ctbritt, @nocode-ananas.
Keep event-triggered reminders current

Event-triggered reminders now wait for ongoing session writes before saving their updates. If a reminder check times out while waiting, it leaves the reminder's remaining activations intact, so an expired check does not use up a future reminder.

Sources and complete change list

Improvements

  • Reduce text transfer during reminder maintenance #148996.

Bug fixes

  • Coordinate reminder updates with session persistence #148816.

Skills

Skills now include interactive visualizations, while Workshop makes it clearer when a suggested change has been applied or rejected.

Find and load selected skills

Available ClawHub skill artwork now appears in search results and detail views, making skills easier to recognize. Sessions with several pinned skills load their revision details together while keeping the exact versions you selected.

Explicitly selected manual personal skills now work with workspace-only file access. Agents can read the selected revision's instructions and supporting files without enabling automatic invocation or opening access to unrelated files. Directory listing and changes to those files remain restricted.

Sources and complete change list

Improvements

  • Batch pinned skill revision lookups #146235.

Bug fixes

  • Show ClawHub skill artwork in search and details #123051. Thanks @romneyda.
  • Read selected manual personal skills with workspace-only access #144954. Thanks @iwhatsskill, @fuller-stack-dev, and @sisutuulenisa.

Documentation

  • Restore readable skill-creation tutorial steps #144388. Thanks @vyctorbrzezowski.
Browse a plugin's complete skill folder

Open a skill from an installed plugin or a catalog detail page to read its instructions, follow bundled reference links, and browse supporting files in the Control UI. Catalog previews stay tied to the exact published version and require no installation or execution. You can also read a disabled plugin's skills without activating it.

Browsing requires read access through operator.read. Text previews have size limits, with explanations for binary, oversized, or unavailable files. Some older catalog entries need republishing or a metadata backfill before their root-level skills can be previewed.

Sources and complete change list

Improvements

  • Browse plugin skill folders in the Control UI #149287. Thanks @patrick-erichsen.
Read complete skill verification reports

Piping openclaw skills verify into another tool now preserves the complete JSON report even when verification fails. Supporting ClawHub servers can return full scanner findings and coverage details, with reports accepted up to 64 MiB. Verification reads a stored scan; it does not start a new one, guarantee that a skill is safe, or authorize installation.

Sources and complete change list

Bug fixes

  • Preserve complete skill verification reports in CLI output #144559. Thanks @patrick-erichsen.
Apply Workshop suggestions with clear results

When you apply or reject a suggestion in Skill Workshop, its row updates as soon as the result is confirmed and stays consistent through refreshes and agent switches. Temporary confirmations disappear on time. If a result is uncertain, refresh and check before trying again. A changed suggestion still needs your review and another explicit action.

Doctor also points out automation paths left behind when Workshop moves a skill, so you can update the affected jobs yourself. When sandbox restrictions block Workshop, troubleshooting guidance explains that restriction before suggesting changes to the tool allowlist.

If an older Workshop backup was left behind after moving a workspace, run openclaw doctor --fix. Doctor can recover it when exactly one agent's skills match all the recorded contents, then a Gateway restart clears the retained warning. Incomplete, changed, or ambiguous matches stay preserved for manual recovery. Do not edit the saved manifest or change your workspace to force a match.

Sources and complete change list

Improvements

  • Avoid redundant Workshop text copies #147593.

Bug fixes

  • Warn about stale automation paths after Skill Workshop relocation #144680. Thanks @obviyus and @rayseling.
  • Dismiss expired Skill Workshop confirmations #145015.
  • Avoid false Workshop relocation warnings #145396. Thanks @raydestar, @obviyus, and @githoubi.
  • Explain sandbox restrictions on Skill Workshop #145546. Thanks @deltaecho3.
  • Recover Skill Workshop backups after workspace moves #148995. Thanks @zoroo07 and @holny.
  • Keep Workshop action results and suggestions consistent 56fcd66. Thanks @obviyus and @yangxiansheng.
Recover automatic Workshop reviews

In Workshop auto mode, weekly reviews now pause visibly when every configured runtime is known to lack support for keeping the review inside the Workshop directory. Inspect paused jobs with openclaw cron list --all --json, configure a supported runtime or fallback, then reload configuration or restart the Gateway. The same jobs become enabled again with their history intact.

This does not add Codex support for these reviews or a separate review-only runtime selector. An enabled job still has to pass the checks when it runs, and automatic reviews still require cron to be enabled.

Sources and complete change list

Bug fixes

  • Pause Workshop reviews with no supported runtime #141626. Thanks @anyech, @patrick-erichsen, @mwclaw, @fuma2013, @xilopaint, and @dbarbatti.
Prepare skills without blocking unrelated work

OpenClaw can keep handling other requests while it checks what skills need to run, prepares their commands or reads sandbox files. This helps when several agents start work at once. Some preparation paths can take longer or use more CPU while allowing those other requests to proceed.

Security scans use fresh findings after a skill file is replaced. If you edit a file during a scan and the scan fails, finish editing and retry. Oversized source files are skipped. If a newly loaded pinned skill is rejected because its instructions exceed 1 MiB or use a disallowed link, restore the skill artifact or explicitly detach the pin.

The sag speech skill now stays available with supported alternate credentials, such as SAG_API_KEY or an explicitly supplied key file. If it was previously disabled, run openclaw config set skills.entries.sag.enabled true and refresh Skills before your next agent turn. Ready means the executable is available; it does not verify credentials or successful speech generation.

When a skill installer cannot find Homebrew on FreeBSD, the error now explains how to recover. Install the required tools manually through pkg or Ports on the computer running OpenClaw, then run openclaw skills check. Add --agent <id> to check a specific agent.

Sources and complete change list

Improvements

  • Skip unused indexing in single-workspace skill loading #145151.
  • Reduce missing-command lookup overhead on Unix #145175.
  • Avoid repeated dependency checks in skill status #146274.
  • Reduce skills-watcher work during unrelated file activity #146309.
  • Keep Gateway requests responsive during skill preparation #146373.
  • Skip unnecessary skill scans for URL messages #146467.
  • Skip program searches for unavailable skills and hooks #146470.
  • Prepare skills faster when plugins are disabled #146615.
  • Prepare Gateway skill commands asynchronously #146812.
  • Skip unnecessary tool checks for excluded skills #147359.
  • Reduce repeated polling during skill edits #148273.
  • Speed up concurrent skill preparation #149791.

Bug fixes

  • Keep file reads responsive and skill scans current #146654.
  • Keep sag available with alternate credentials #147685. Thanks @obviyus, @liuwqgit, and @navras98.
  • Correct FreeBSD dependency recovery advice #147733. Thanks @vincentkoc and @lucarinaorg.
  • Preserve literal skill keys in API-key setup commands #149026. Thanks @zhangguiping-xydt and @obviyus.
  • Show accurate alternative prerequisite groups in skills info #149132. Thanks @liuwqgit, @obviyus, and @zhangguiping-xydt.
  • Keep Gateway requests responsive during weekly skill-review preparation #149600. Thanks @609nft.
  • Keep Workshop review-preference inspection read-only #149627.

Security and trust

  • Guard skill reads and reduce worker packaging memory #147336.
Connect Google Workspace from a remote host

The Google Workspace skill now tells agents to try your existing sign-in before asking you to set it up again. Updated guidance explains how to complete sign-in from a trusted shell when OpenClaw runs on a remote computer. Keep callback URLs and secrets out of chat, and enter callback URLs yourself in that shell rather than passing them through an agent tool.

Sources and complete change list

Documentation

  • Clarify remote Google Workspace authorization #145945. Thanks @donniefi, @vincentkoc, and @abhishek17n.
Create interactive visualizations

The bundled visualize skill helps agents create interactive explanations as one-off visuals or saved dashboards, and update existing widgets. Widgets can now use chart libraries such as D3 and fonts from approved public hosts.

Downloaded code can read the widget’s content and use permissions you have granted it. Loading an asset also shares your device’s IP address and the requested asset with its host. Access to dashboard data and actions on the OpenClaw host still require separate permissions.

Recreate older saved inline widgets to use these assets, and prefer URLs pinned to a specific library version. PNG exports may omit external styles and fonts, and strict embed mode still disables scripts.

Sources and complete change list

Improvements

  • Load chart libraries and fonts in widgets #147265.

Native Apps

The Mac app now opens the Web experience by default, with an experimental Native option. Mobile and desktop updates also make conversations, connections and work waiting for your attention easier to manage.

Choose Web or experimental Native on Mac

The Mac app now uses the embedded Web UI by default, including existing profiles that have not saved an experience preference. To try Native, enable Native experience (Experimental) under Dashboard → Settings → This Mac → App. Dashboard, Dock and Gateway-window actions follow that choice. The toggle needs a current Gateway UI; the older 2026.9.4 UI remains usable but does not show it.

Switching keeps each experience's loaded windows and drafts available when you return. Drafts stay with their own experience, Gateway address and signed-in account, including the address used by an SSH tunnel. Settings opens on the web, while Connection, About and Quick Chat remain native. Command-N opens the Gateway-window picker, and Shift-Command-N creates a new thread.

Sources and complete change list

Improvements

  • Make Web the Mac default with an experimental Native option #149763.
  • Translate the Mac native-experience setting across 20 locales #149872.
Run and maintain a local Mac Gateway

You can run a Gateway on your Mac alongside a remote primary, with separate chat and dashboard windows. Enable “Also run a Gateway on this Mac” in Connection settings. It is off by default, and your remote primary keeps its existing Talk, menu-bar and node role. Connection settings also offers install, update and repair actions for app-managed local Gateways, even after you dismiss setup.

Sources and complete change list

Improvements

  • Localized Mac Gateway setup and recovery messages #144613.
  • Run a local Gateway alongside a remote primary on Mac #145038.
  • Translate local Gateway controls and port notices #145311.

Bug fixes

  • Recover local Gateway setup from the Mac Connection window #144554. Thanks @fuller-stack-dev.
  • Avoid Gateway reinstalls after inconclusive Mac service checks #146880. Retains startup diagnostics.
Recover Mac connections and switch Gateways

The bottom-left account menu now shows Gateway health and switching controls, with hints for existing keyboard shortcuts. Use Command-click or Control-click to open another window. Expired Cloudflare sign-ins have a recovery page inside the affected window; windows restored at launch wait for you to click “Sign in again.”

If the approval page does not appear, choose “Open browser” and check the browser account before approving. A timed-out attempt needs a fresh sign-in. Closing a sign-in window opened by a command cancels that command.

Nearby setup keeps your saved connection until you enter a trusted address, setup code or SSH destination and choose Save. Cancel keeps the current connection, and Direct node pairing now requires explicit approval.

Sources and complete change list

Improvements

  • Translate macOS browser sign-in recovery #145110.
  • Gateway switching in the Mac sidebar #145341.
  • Show Mac Gateway shortcut hints #145416.
  • Refresh Mac connection-diagnostic translations #145856.
  • Hide the selected Gateway's redundant shortcut hint #146753.

Bug fixes

  • Retain Mac app IDs despite unrelated metadata #144381.
  • Recover expired Mac Gateway sign-ins inside the window #145040.
  • Stable Mac dashboard errors for Gateway port conflicts #145333.
  • Keep Mac debug actions on the selected Gateway #145427. Cancel stale Mac connection resets and diagnose the active tunnel port.
  • Keep Gateway discovery results current #145435. Ignore stale Apple Gateway discovery results after stop or refresh.
  • Recover Mac Gateway sign-in when the browser does not open #146787.

Security and trust

  • Keep Nearby discovery from replacing saved Mac connections #121622. Thanks @jacobtomlinson, @eleqtrizit, @freeqaz-openai, @joshavant, @pgondhi987, and @vincentkoc.

Documentation

  • Translate macOS browser sign-in recovery messages #147025. Includes Open browser and inactive sign-in recovery guidance.
Keep Mac browser tabs with their chat

Each Mac chat now keeps its own browser tabs, so you can switch conversations and return to the pages you left open for that chat. Tabs last while the window stays open and can show the page's own icon. Update both the Mac app and Gateway-served UI for this behavior. Older tabs stay shared until closed, and login cookies remain shared across chats in the same window.

Sources and complete change list

Improvements

  • Show page icons on Mac browser tabs #145714.

Bug fixes

  • Keep Mac browser tabs with their chat #144508. Thanks @patrick-erichsen.
  • Discard outdated Mac browser-import banners #145449. Discards outdated banners after mode changes.
Keep an authorized Mac desktop available

Authorized Computer work can keep an unlocked Mac awake for up to an hour from its first action. To keep it awake between jobs while connected and hosting, enable Unattended desktop hosting under Settings → This Mac and accept the native confirmation. That option is off by default. It does not bypass login or lock; after locking or losing access, sign in normally and start fresh Computer work.

Sources and complete change list

Improvements

  • Keep Mac Computer sessions available and open desktops directly #144226. Keep authorized Mac desktops awake, open session desktops directly, launch discovered Mac apps, restore node hosting after reapproval, and complete prepared-worker refill and cleanup.
  • Translate macOS unattended-desktop consent #145055.
Choose models and sign in on Apple devices

iOS and Mac chat show the model, thinking and Fast controls supported by your current session, with provider sign-in available from chat. Mac Quick Chat refreshes choices without losing your draft and offers supported speed settings for the next message. If an older Gateway cannot supply native model choices, update it or use /models and /login.

Sources and complete change list

Improvements

  • Match Apple model controls to Gateway capabilities #144762. Thanks @obviyus.
  • Keep Quick Chat model and speed choices current #144804. Thanks @obviyus.
  • Refresh Apple model-settings and sign-in translations #144856.
Stop Mac audio and capture cleanly

When you cancel local MLX speech on your Mac, audio arriving late is discarded before playback and cannot interfere with a newer Talk request. Microphone tests finish cleaning up before you can start another, and camera capture ends before the recording is exported.

Sources and complete change list

Bug fixes

  • Discard late local speech after cancellation on Mac #144586.
  • Finish microphone and camera cleanup before subsequent work #145450.
Mac windows, commands and launch preferences

Dashboard controls stay visible and clickable in full screen, including after reconnecting. Commands that finish quickly return their actual result instead of a false timeout, and rapid changes to launch-at-login preserve your latest choice. Remote-mode users who enable Cookie Sync also avoid its startup-watchdog crash.

Automation can close an OpenClaw window without crashing the app or its other windows. Update or rebuild OpenClaw.app to receive this fix; updating the Peekaboo CLI alone is insufficient. Native plugin panels such as Workboard can load their stylesheets over a direct local HTTP connection. Cookies still share a hostname across ports, so do not put mutually untrusted services on that same hostname.

Sources and complete change list

Improvements

  • Update embedded macOS Peekaboo automation to 4.4.0 #148485.

Bug fixes

  • Prevent Mac Cookie Sync startup crashes #137052. Thanks @zhangguiping-xydt, @fuller-stack-dev, @loshay1, and @joncursi.
  • Restore native plugin stylesheets over local HTTP #139735. Thanks @jjjhenriksen, @kimiyu-186, @jalehman, @theangrypit, and @atlas-crete.
  • Keep Mac Dashboard controls visible in full screen #144571. Thanks @fuller-stack-dev, @shojikumaru, and @arong-me.
  • Preserve executable permissions in macOS worker packages #145042.
  • Prevent false timeouts for fast Mac commands #145437.
  • Preserve the latest Mac launch-at-login choice #145451.
  • Stop obsolete Mac file notifications and release watchers #145453. Includes Canvas watcher cleanup.
  • Drag macOS windows from empty tab-header space #146404. Applies to empty side-panel tab headers.
  • Prevent crashes when automation closes OpenClaw windows #147114.
Smaller Mac app packages

Mac app packages omit unused copies of the dashboard, reducing download size and installed disk usage. The Gateway continues to supply the web interface. The reduction depends on the app's architecture; it does not change how you open the dashboard.

Sources and complete change list

Improvements

  • Reduce macOS app size by removing unused dashboard copies #150729. Thanks @romneyda.
Review work and choose models on Android

Open Chat actions → Review changes to inspect uncommitted code and add a selection to your existing draft without sending it. The viewer is read-only and appears when your Gateway supports change review. The Chat actions menu also stops closing unexpectedly on affected phones.

Model controls follow the selected model's supported Fast and thinking choices, and refresh failures show a warning with a way to retry. Provider sign-in and API-key setup are available from the picker when supported by your Gateway and administrative access; older Gateways show update guidance and retain slash commands.

Sources and complete change list

Improvements

  • Review uncommitted code changes in Android chats #144101. Thanks @ansxor and @iwhatsskill.
  • Localized Android change-review and selection controls #144501.
  • Localized Android model-refresh retry guidance #144698.
  • Match Android model controls and sign-in to Gateway capabilities #144711. Thanks @obviyus.
  • Refresh Android and Wear OS translations #144759. Covers sign-in and model guidance.
  • Refresh native sign-in and connection translations #145410. Covers Android sign-in and Mac Gateway connections.
  • Reuse Android history preparation while streaming #147940. Retains message replacements and expanded work within the current conversation. Thanks @vincentkoc.

Bug fixes

  • Show Android refresh warnings and reload agent model choices #142355. Thanks @obviyus.
  • Keep Android Chat actions menus open #145505. Thanks @donniefi and @iwhatsskill.
End watch calls and choose models for the current chat

Ending Talk on Wear OS starts microphone and speaker shutdown before waiting for the phone, while “Ending call…” keeps the conversation visible. Model choices now follow the chat selected on your watch, with available choices retained during a partial refresh. Update the phone app and Gateway if the picker reports missing support.

Replies stop waiting once their outcome is confirmed, including a completed answer or a successful Stop. The watch also replaces its displayed reply when the phone shortens or clears the text, so an earlier version does not linger.

Microphone permission controls offer Retry or Open Settings. After granting access, return to the watch app and tap again to start recording. If the microphone cannot start, Voice now shows an audio error.

Accepted Type or Dictate input from Voice now opens Chat to show the reply or error. Canceled, empty or locally rejected input leaves you on the current page, and active Live Talk stays in Voice. You can also tap a failed-reply notification to open the watch app; its Reply action still retries through the original phone and conversation.

Sources and complete change list

Bug fixes

  • Stop watch audio before waiting for Talk to end #144346. Thanks @iwhatsskill.
  • Settle Wear replies and replace stale streamed text #144387. Thanks @iwhatsskill.
  • Recover Wear microphone permission and failed Talk audio #144414. Thanks @iwhatsskill.
  • Show model choices for the watch's selected chat #144717. Thanks @obviyus.
  • Show audio errors when Wear OS recording cannot start #147073. Thanks @iwhatsskill.
  • Keep the correct Wear OS title after session search #148227. Thanks @iwhatsskill.
  • Show watch chat replies after typing or dictating from Voice #151224. Thanks @iwhatsskill.
  • Open the watch app from a failed reply notification #151262. Thanks @iwhatsskill.

Documentation

  • Translate the Wear OS call-ending status #146745. Includes 21 locales.
  • Translate Wear OS microphone-permission recovery labels #146778.
Browse inside the Tauri companion

The Tauri companion gains browser tabs beside your conversations, with navigation, screenshots, element inspection and native Save dialogs. Conversations keep separate tabs, but all reading tabs share cookies in one private browsing session. Closing every tab, switching Gateways or quitting ends that session; sign-in links still open in your system browser.

Sources and complete change list

Improvements

  • In-app browser tabs for the Tauri companion #145572.
Manage saved Gateways in the Tauri companion

The Tauri companion can save direct and SSH Gateways, open independent dashboard windows and restore the last successful selection after a restart. Quick Chat, desktop actions and the Omarchy panel stay on Primary. Changing Primary requires separate confirmation and a saved token-authenticated connection. Linux needs an unlocked Secret Service credential store, and saved profiles from the separate Swift Mac app are not imported.

Manage Gateways now has focused Add and Edit forms. Back discards unsaved form changes; blank credentials retain a saved secret only for the same address. Setup, recovery, the manager and Quick Chat follow system appearance while preserving in-progress text, with the connected dashboard keeping its own appearance setting. On macOS, the Tauri startup crash is fixed and credential-store failures show one dismissible notice. Resolve the reported problem, then choose Manage Gateways → Try again.

Sources and complete change list

Improvements

  • Save and switch desktop Gateways #147684.
  • Simplify the desktop Gateway manager #148526.
  • Match desktop setup and Quick Chat to system appearance #148808.

Bug fixes

  • Prevent Tauri startup crashes and repeated Gateway alerts #148430.
  • Match Gateway manager appearance to the system #148668.
Use the Linux tray and Omarchy bar

The optional Omarchy 4 bar panel puts agents, sessions and quick prompts on your desktop, using the Linux app's Primary Gateway when available. Install it separately with a compatible app or CLI. Drafts stay in memory and are lost when the shell restarts, and uncertain sends are not retried automatically.

Sources and complete change list

Improvements

  • Omarchy agents and conversations panel #145593.

Bug fixes

  • Show OpenClaw as the Linux tray name #146174.
Recover Linux Gateway connections

The Linux companion can retry your saved remote Gateway, and leaving Connection Settings keeps your active chat and sign-in. If the app cannot tell whether the Gateway is running, it keeps trying to reconnect and offers Start Gateway only after confirming it has stopped. A failure to monitor system sleep no longer leaves the app thinking the computer is asleep and blocking local recovery.

Sources and complete change list

Bug fixes

  • Respect saved Linux connections when service status is unknown #146045. Accepts healthy Gateways even when service status is unknown. Thanks @vincentkoc.
  • Clear abandoned Linux sleep state #146046. Thanks @vincentkoc.
  • Recover Linux remote connections without disrupting active sessions #146047. Retry saved Linux connections and a failed SSH tunnel once, preserve chats when leaving Settings, reuse credentials for the same address, and restore native access after local Start or Restart. Thanks @vincentkoc.
  • Keep Linux Gateway recovery active when status is unknown #146857.
Retry Linux Quick Chat

If Linux Quick Chat loses confirmation of a finished request, retrying the unchanged draft can retrieve its completed answer without asking the model again. The recovered reply clears the busy state so you can continue typing. If recent history is unavailable or contains no matching completed answer, the error remains.

Widget previews can regain access when you reconnect to the same configured Gateway. Switching Gateways leaves old previews unavailable, even if you later return to the same address. Slow widget updates now settle on the latest layout, and outdated failures no longer replace the current status.

Sources and complete change list

Bug fixes

  • Recover completed Quick Chat answers after lost acknowledgements #146048. Rejects stale sends after switching Gateways. Thanks @vincentkoc.
  • Keep Linux Quick Chat widgets tied to their Gateway 47060d1. Applies the latest layout and error status. Thanks @vincentkoc.
Choose agents and keep Mac chat drafts

The native Mac chat sidebar now groups conversations under named agents and keeps a text draft for each conversation. Activity and attention indicators help you find work that needs you, while timestamps and cached message previews make threads easier to recognize. The indicators cover loaded sessions and local history. Finish handling pending attachments before switching conversations.

New Thread keeps your selected agent and offers a separate Git working copy when needed. The revised layout leaves more room for reading, the message box grows with your draft, and model sign-in sits nearby when credentials need attention. Full chat windows also keep Reasoning, Tool Activity, pinned and recent models, and collapsed sidebar groups in the active profile. Named profiles use their own model and sidebar choices or normal defaults; unrelated global preferences are not copied into them.

Sources and complete change list

Improvements

  • Add agent navigation and improve native Mac chat layout #146531.
  • Show agent activity and thread previews in native Mac chat #147197. Places sign-in by the composer and distinguishes finished, failed, empty and missing tool results.
  • Translate native chat activity and unread labels #147384. Covers iOS and Mac activity, unread counts and personal message-preview labels in 21 existing non-English locales.
  • Translate native task-status descriptions #147899. Covers iOS and Mac tooltips and accessibility descriptions in 21 non-English locales. Thanks @vincentkoc.

Bug fixes

  • Keep macOS chat preferences in the active profile #146966.

Documentation

  • Refresh conversation and worktree translations in native apps #146924.
Use the companion's window controls

The Tauri companion puts window controls in the dashboard header, with empty space for dragging and a double-click to maximize or restore. You can still resize from the window edges. Closing the main window leaves the app in the tray, while extra Gateway windows close normally. Older dashboards keep their native titlebars until updated.

Sources and complete change list

Improvements

  • Combine desktop window controls with the dashboard header #147097.
Follow Linux desktop updates

Regular stable releases now start Linux desktop publication automatically. While a new bundle finishes, the updater can keep offering the previous signed AppImage. Linux downloads finish separately from the core release, so a new core version does not mean its desktop download is ready at the same time.

Updated Linux clients recognize numbered correction releases and keep “Open download page” available if opening it fails. Older installed clients need this fix before they gain that behavior. For a manual update, choose a release that includes the Linux packages and their checksum file.

The Linux compatibility guide clarifies that AppImages require glibc 2.35 and GLIBCXX_3.4.30. Quick Chat on Wayland needs a tray host, and Talk microphone capture needs the Control UI in a regular browser.

Sources and complete change list

Improvements

  • Preserve Linux update delivery across core releases #146052. Preserve signed Linux update feeds and core-release mirrors, retry metadata delivery without rebuilding verified bundles, and protect existing public release bodies. Thanks @vincentkoc.
  • Publish Linux apps with stable releases and preserve updater continuity #147113.

Bug fixes

  • Recognize Linux correction updates and retain download retries #146050. Retains manual download retries without reviving dismissed or replacing newer banners. Thanks @vincentkoc.

Documentation

  • Clarify Linux desktop packages, shortcuts and microphone access #146051. Includes explicit Model Setup actions. Thanks @vincentkoc.
Keep answers visible in Mac chats

In the full Mac chat window, completed work folds into an expandable row above the answer, keeping the result and its attachments in view. Active work, work without an answer and unresolved work after an answer stay expanded. You can open the row to inspect earlier steps, including failures followed by a valid answer. Find in Conversation reveals folded content, and transcript exports keep it.

Sources and complete change list

Improvements

  • Fold completed work above macOS replies #147540. Preserves separate progress messages through history refreshes. Thanks @cbruney.
  • Translate native completed-work labels #147650. Covers existing completed-work and elapsed-time labels in iOS and Mac catalogs across 21 non-English locales.
Switch saved Gateways on iPhone and iPad

With multiple Gateways saved, the iOS sidebar now offers a picker so you can switch without opening Connection settings. Unavailable Gateways stay listed, and the selected connection shows its current status. Before switching, send or clear your draft, finish recording, remove attachments and wait for pending delivery. Drafts do not move between Gateways or restore separately for each one.

Sources and complete change list

Improvements

  • Switch saved iOS Gateways from the sidebar #146641. Thanks @solvely-colin.
  • Translate iOS Gateway menus and switching alerts #148377. Thanks @vincentkoc.
Keep answers visible on phones and tablets

On iPhone and iPad, completed intermediate work now folds into a tappable “Worked” row above the answer. Tap to inspect it and tap again to collapse it. Final answers and media stay visible, while active or unanswered work stays expanded.

Android adds the same interaction to default, agent-main and dashboard chats, with channel conversations keeping their full transcript. Active and steered work stays expanded, and unanswered failures remain accessible. Folding changes the view without deleting conversation content.

Sources and complete change list

Improvements

  • Collapse completed chat work on iPhone and iPad #148002.
  • Collapse finished work in Android conversations #148050. Uses run IDs for strict matching when available.
Follow dictation and attachment progress on mobile

Android and iOS now show what is happening while dictation starts, listens and finishes, with recognized words visible before they enter your draft. Android's Stop finishes listening, Cancel discards a starting or transcribing attempt, and only final text is inserted. iOS adds a live waveform and offers Done to add the transcript or Cancel to discard it.

Both show attachment-preparation progress. Android distinguishes local message queuing from delivery, while iOS also shows attachment sending and asks you to select an unavailable photo or video again. Dictation errors give retry guidance without silently leaving you waiting.

Sources and complete change list

Improvements

  • Show Android dictation and attachment progress #150994.
  • Show iOS dictation and attachment progress #151004.
Restore and send queued mobile messages

Restoring queued messages now does less repeated database work on Android and Apple clients while preserving message and attachment order. Android also avoids reading unrelated queued messages before sending one, including messages waiting for another Gateway. Existing delivery order and retry behavior stay the same.

Sources and complete change list

Improvements

  • Reduce Android queued-message database reads #148577.
  • Batch attachment reads when restoring the Apple chat outbox #148609.
  • Reduce Android queued-message send overhead #148899.
Inspect cited sources in native chats

Completed answers in Android, iOS, native Mac chat and Mac Quick Chat can show up to eight cited-source cards. Open a card to read the recorded search snippet or page excerpt, then use Open source to visit the page. Cards need matching successful research from the same answer, and missing excerpts are shown as unavailable. Previews reuse recorded content without fetching the page again; Android does not retain this source evidence in its offline transcript cache.

Sources and complete change list

Improvements

  • Translate native source-preview controls #148897.
  • Inspect cited sources directly in Android chat #148904.
  • Inspect research sources in macOS and iOS chat #148906.
Preview questions and approvals in native sidebars

Tap a question or approval icon in the iOS, Android or native Mac sidebar to inspect what needs your attention without leaving the current conversation, even in collapsed groups. The count follows the oldest request's kind. Previewing does not approve anything, and iOS administration approvals still open the Dashboard review page. Resolved requests and requests from a previous Gateway or account stop contributing attention.

Sources and complete change list

Improvements

  • Preview pending requests in native app sidebars #149811.
Keep native Talk input and cleanup responsive

Android Talk now sends spoken turns that previously stopped after recognition and honors an explicit stt-tts choice using your configured speech provider and voice. Idle recognition beeps, visible fixed Talk instructions and setup readiness without a realtime provider remain unchanged.

iOS Talk can return to Listening when developer diagnostic output is blocked. Delayed cleanup also stays with its original Gateway and account, so reconnecting cannot send an old session's close request through your new connection. If the original connection has retired, cleanup is rejected there.

Sources and complete change list

Bug fixes

  • Keep iOS Talk cleanup on its original Gateway connection #149786. Thanks @vincentkoc.
  • Restore Android Talk replies and configured speech voices #150175. Thanks @guarismo and @iwhatsskill.
  • Avoid Talk stalls from blocked diagnostic output #150338. Thanks @patrick-erichsen.
Prepare Apple notifications without blocking other work

The Gateway can keep handling other work while it looks up the device details needed for an iOS notification or wake request. Existing direct-device and relay registrations keep their current behavior, with no settings change needed.

Sources and complete change list

Improvements

  • Move Apple push registration reads off the Gateway thread #150570.
Read current native controls in your language

Translations across 21 existing native-app locales now cover more Gateway setup, pending questions and approvals, dictation and attachment feedback. Android also gains translated QR-scanning and Talk voice-change guidance, while Mac onboarding gains translated setup and utility-model labels.

Sources and complete change list

Improvements

  • Translate Android gateway and QR-scanning messages #149633.
  • Translate Android Talk voice-change errors #149679.
  • Refresh native translations for pending requests #149891.
  • Translate macOS setup and utility labels #150619.
  • Translate native dictation and attachment feedback #151041.
Embed OpenClaw in Rust applications

Rust developers can build on repository-local Gateway and node-host libraries for connections, reconnection, platform-managed signing and commands that accept input or report progress. A separate-process bridge adds authenticated messages and local permission checks.

These libraries are unpublished and their APIs are unstable. Product integration and deployment remain the developer's responsibility, and system.run is not included. The bridge authenticates messages without encrypting them, and cancellation of native work depends on handlers cooperating.

Sources and complete change list

Improvements

  • Add shared Rust Gateway and node-host libraries #116050. Thanks @giodl73-repo.
  • Support embedded Rust node lifecycles and streaming commands #116450. Thanks @giodl73-repo.
  • Add an authenticated bridge for separate Rust node runtimes #116863. Thanks @giodl73-repo.

Models and Providers

GPT Live reaches Talk, meetings and phone calls. Model settings make sign-ins and remaining Codex usage easier to manage, with fixes that preserve selected models and eligible subscription billing.

Use GPT Live in Talk, meetings and calls

You can speak while GPT Live replies in supported Meet, Teams and Zoom meetings, and let it consult your OpenClaw agent during meetings or phone calls. Select Live explicitly for these surfaces. In Talk, unpinned sessions now choose Live using your configured OpenAI access. Existing model pins stay in place.

Live is audio-only, so choose gpt-realtime-2.1 when you need a camera. Configured Platform credentials take precedence over ChatGPT subscription access and use the Platform billing route. For meetings, update both Gateway and paired node and use supported isolated audio capture; remove a custom audioInputCommand before selecting Live. Live does not support Voice Call custom functions or host-controlled wake-name and forced-consult modes. On Apple clients, Stop ends the Live session. Headphones help prevent speaker feedback.

Sources and complete change list

Improvements

  • Public GPT-Live and account-aware Talk defaults #145382.
  • Reduce CPU work during voice audio conversion #146469.
  • Extend GPT-Live to meetings and phone calls #146546.

Bug fixes

  • Correct spoken-update guidance for public GPT-Live #145807.
  • Prevent microphone timing drift in GPT-Live relay calls #146078.
  • Discourage repeated backend work in GPT-Live calls #146182.
  • Fix GPT-Live caption repeats and spoken confirmations #146370.
  • Retain call storage during deferred callbacks #147689. Thanks @romneyda.
Change the voice during a call

You can ask the assistant to change its speaking voice during supported Talk calls, or use the browser's voice picker. Supported Discord calls also offer in-call switching, now including Google Live's prebuilt voices. The call briefly reconnects while keeping the conversation and unfinished work, and your saved defaults stay unchanged. Speech already submitted to Google may be interrupted and is not replayed. Discord still requires an authorized voice turn with agent delegation and tool access.

Sources and complete change list

Improvements

  • Switch voices during supported Talk and Discord calls #146676.
  • Change Google Live voices during Talk and Discord calls #149748.

Bug fixes

  • Isolate voice-switch cancellation and connection cleanup #149865.
Use Apple models for setup and utility tasks

On an eligible Mac running OpenClaw, Apple Foundation Models can help with setup and short utility tasks without an API key. This optional route requires Apple silicon, macOS 27 or later, enabled and downloaded Apple Intelligence, Apple developer tools with the macOS 27 SDK, and a model with at least 8,192 context tokens. Those requirements apply to the Gateway host; connecting a Mac app to a Linux or Windows Gateway does not supply the model.

Regular chat still needs a separately selected primary model. Apple's smaller context and output quality limit its suitability for long prompts and complex tasks. Model Setup offers Recheck & repair if the helper is missing. Before upgrading, keep a verified archive of your current installation state. Returning to the older package requires restoring that archive; downgrading the package alone is insufficient.

Sources and complete change list

Improvements

  • Use Apple on-device models for setup and utility tasks #150376.

Bug fixes

  • Restore Apple Foundation Models artwork #150842. Thanks @romneyda.
Connect accounts and see their remaining usage

Connecting a provider keeps your chosen model. Replacement sign-ins saved through Model Setup stay inactive until you successfully test and explicitly activate them. If activation fails, setup can restore your working connection without overwriting newer connection edits. If setup requests a plugin update or Gateway restart, complete it and retry activation. Before downgrading OpenClaw, remove inactive replacement sign-ins or restore the state from before setup, because older versions may use them.

On Models, administrators can compare remaining Codex usage beside each saved subscription login and refresh accounts individually. This display excludes API keys and other providers. Stored accounts return to Ready after verified quota recovery without a Gateway restart.

Eligible automatic background OpenAI work keeps using subscription billing when an API key is also present. An explicit choice of a metered account still takes precedence.

Sources and complete change list

Improvements

  • Connect providers without changing the selected model #144329. Thanks @obviyus.
  • Unify API-key editing and removal #144420. Thanks @obviyus.
  • Choose model access after provider sign-in #144468. Thanks @obviyus.
  • Sign in to OpenRouter from private chat #144491. Thanks @obviyus.
  • Use activated accounts in automatic chats #144975. Thanks @obviyus.
  • Reuse plugin metadata when checking provider usage #146488.
  • Reduce GitHub OAuth maintenance work with many agents #147021.
  • Avoid avatar loading during model-account ownership checks #147032.
  • Connect provider accounts separately from testing a model #148864. Thanks @obviyus.
  • Read usage for a selected saved Codex login 1f3672e4. Thanks @jesse-merhi.
  • Show Codex usage beside each login 95f3ed90. Thanks @jesse-merhi.

Bug fixes

  • Resolve credentials for plugin-generated titles and summaries #112257. Thanks @0xghost42, @fuller-stack-dev.
  • Use saved account credentials for local inference #141569. Thanks @bruce-yii, @obviyus, @richard355168.
  • Preserve settings during login and acknowledge auth refresh #144181. Thanks @obviyus.
  • Keep saved sign-ins after failed setup checks #144195. Thanks @obviyus.
  • Explain partial success after provider login #144436. Thanks @obviyus.
  • Keep replacement sign-ins inactive until confirmed #144524. Thanks @obviyus.
  • Preserve concurrent settings edits during provider setup #144568. Thanks @obviyus.
  • Restore saved credentials for local media and embedding commands #144931. Thanks @masatohoshino, @bruce-yii, @obviyus.
  • Recover saved sign-ins and expired model-access choices #145051. Thanks @obviyus.
  • Refresh provider status across clients and explain recovery #145089. Thanks @obviyus.
  • Keep selected accounts working after Doctor renames credentials #145136. Thanks @obviyus.
  • Preserve replacement API keys during pending removal #145143. Thanks @obviyus.
  • Preserve current accounts during delayed OAuth refresh #145196.
  • Preserve subscription billing during OpenAI model migrations #145305. Thanks @dbraendle.
  • Fix false legacy credential removal failures #145585. Thanks @vincentkoc, @fuller-stack-dev.
  • Apply provider sign-in settings after reload #145761. Thanks @obviyus.
  • Recover OpenAI subscription accounts after quota resets #145853. Thanks @obviyus, @grynn, @rookai471.
  • Preserve plugin authentication during provider discovery #146336.
  • Clean up temporary plugin files after catalog workers stop #146513.
  • Reuse model catalogs after slow discovery #146665.
  • Refresh model readiness after stored-account quota recovery #146691.
  • Clean up credential requests after lost registration replies #147068. Thanks @vincentkoc.
  • Expose typed model API-key editing contracts #148093. Thanks @obviyus.
  • Remove the unsupported Brave model setup choice #148178. Thanks @obviyus.
  • Restore working connections after failed setup activation #148195. Thanks @obviyus.
  • Complete provider sign-in from the waiting dialog #148300. Thanks @obviyus.
  • Preserve working sign-ins when Gateway activation fails #148312. Thanks @obviyus.
  • Keep local provider sign-in links available #148469. Thanks @obviyus.
  • Complete local OpenRouter sign-in and correct pasted input #148785. Thanks @obviyus.
  • Activate custom providers with omitted model defaults #148856. Thanks @obviyus.
  • Complete Model Setup after the first device sign-in #148860. Thanks @obviyus.
  • Preserve current credentials during concurrent auth updates #148960.
  • Clarify saved-account health and model availability #148987. Thanks @obviyus.
  • Restore Copilot connection and private-chat login choices #149038.
  • Keep account details session-specific in shared catalogs #150535.
  • Correct provider connection guidance in Ask OpenClaw #150800. Thanks @obviyus.

Documentation

  • Clarify model catalogs, login, and saved credentials #144591. Thanks @obviyus.
  • Updated provider libraries and Copilot runtime guidance #145381.
  • Correct Anthropic shared-credential guidance #145622.

Limits and compatibility

  • Require explicit GitHub Copilot activation #144749. Thanks @obviyus, @conan-scott.
  • GitHub Copilot requires a saved Copilot login, COPILOT_GITHUB_TOKEN or explicit provider credentials. Generic GH_TOKEN and GITHUB_TOKEN no longer activate the provider, and the retired discovery.enabled=false setting no longer disables discovery for configured Copilot.
  • Replacement activation needs a running Gateway capable of immediate reload. Complete requested plugin updates or restarts before retrying; recovery does not cover a process exit between saving settings and preparing activation.
Choose models from current account lists

Choosing Show all after sign-in reveals models already fetched from your account. Model lists can refresh expired provider catalogs in the background while keeping saved choices available, and a failed refresh leaves a warning you can retry. Model permissions now match the exact provider and model, so explicitly allow the intended pair if an older accidental match stops working. Showing a model never grants account access to it.

If you declare a provider in current settings, supply its credentials and headers through the supported account or configuration settings. Keys and headers stored only in an older models.json no longer fill gaps in that declaration.

If an older catalog is stored only in legacy files, run openclaw doctor --fix to import or repair it; ordinary discovery no longer changes those saved files. Unsupported native model IDs may also need an explicit definition before they can be selected or used for a child session. Doctor can repair supported retired Grok choices while preserving account pins and restrictions.

Sources and complete change list

Improvements

  • Reduce Moonshot policy loading overhead #137768.
  • Reduce session-list work with large model catalogs #137901.
  • Reduce processing during large model searches #145139.
  • Skip unused provider defaults when reading configuration #145204.
  • Reduce model-provider discovery loading overhead #145212.
  • Reduce preparation work for configured model lists #145433.
  • Reduce thinking-option lookup work #145439.
  • Reduce temporary allocations in provider policy lookups #146123.
  • Reduce allocation in CLI model metadata lookups #146180.
  • Skip policy-free model entries during runtime lookup #146199.
  • Prepare model lists with less repeated policy work #146657.
  • Reduce repeated authentication path work in model refreshes #146728.
  • Reduce model refresh setup work for large agent fleets #147081.
  • Reuse provider installation choices #147712.
  • Reduce repeated work preparing model catalogs #148081. Thanks @vincentkoc.
  • Reduce repeated model-validation work #148428.
  • Reduce repeated plugin setup during model catalog preparation #148496.
  • Reduce repeated model lookup work in chat metadata #149389.
  • Reduce catalog lookup work for provider aliases #149528.
  • Reduce repeated model catalog policy lookups #149764.
  • Reuse provider policies when resolving model references #149799.
  • Avoid unnecessary scans of frozen provider inputs #150600.
  • Reuse prepared providers for utility calls #150706.

Bug fixes

  • Remove retired Raptor mini from Copilot fallback choices #116505. Thanks @vincentkoc.
  • Respect OpenRouter models' advertised tool support #129659.
  • Show the exact answering fallback model and context limit #134496.
  • Use fallback for timeout-classified agent errors #143649. Thanks @sunnyshu0925, @familievantuyll-max.
  • Keep model catalogs and request settings consistent #143837. Thanks @obviyus.
  • Preserve model choices through fallback and credential refresh #143961.
  • Keep capabilities aligned with configured model connections #144180.
  • Keep configured prices tied to the exact model #144182.
  • Keep lightweight and worker requests on the selected model #144238.
  • Preserve provider-prefixed model IDs in configuration #144275.
  • Stop unlisted models inheriting sibling output limits #144292. Thanks @ylcn91, @obviyus, @yetval.
  • Normalize bare defaults using captured provider metadata #144429.
  • Preserve fallback models when aliases are reused #144438.
  • Validate the intended model when saving settings #144474.
  • Start the Gateway when bundled providers omit custom models #144599. Thanks @obviyus.
  • Keep effort and speed controls during partial model refresh failures #144750. Thanks @obviyus, @conan-scott.
  • Avoid false model-change reports when saving settings #144807. Thanks @vincentkoc.
  • Keep discovered models through same-account token renewal #144861. Thanks @obviyus.
  • Avoid false model warnings when no offline catalog exists #145076. Thanks @emes, @mnowrot.
  • Discover account models automatically after sign-in #145190. Thanks @obviyus.
  • Use newly discovered models on the next turn #145726. Thanks @obviyus.
  • Refresh model lists with unavailable startup accounts #145859. Thanks @obviyus.
  • Skip stale fallback lookups after model changes #146016.
  • Refresh expired model lists in the background #146317. Thanks @obviyus.
  • Show fetched account models after choosing Show all #146342. Thanks @obviyus.
  • Limit model discovery scope and initialize provider request hooks #147159.
  • Preserve provider selection when assembling model catalogs #147323.
  • Resolve Groq models during external-plugin setup #147539. Thanks @obviyus, @jason-allen-oneal.
  • Preserve selected model settings for runtime choice #147849.
  • Keep model lists loading during sibling updates #147878.
  • Warn when model inventory refresh fails #148084. Thanks @obviyus.
  • Fix MiniMax model discovery for versioned endpoints #148782. Thanks @obviyus.
  • Fix LiteLLM discovery URLs already ending in v1 #149472. Thanks @masatohoshino, @obviyus.
  • Wait for standalone model discovery before listing results #149752. Thanks @obviyus.
  • Keep native model choices available during refresh #150806.
  • Restore Z.AI model listings on China endpoints #150851. Thanks @kybrcore.
  • Preserve Gateway defaults during automatic plugin activation d13f15f2.
  • Preserve LiteLLM discovery for explicit proxy URLs f9584dc5. Thanks @obviyus.
  • Keep saved model-catalog repair in Doctor 0a7f6493.

Security and trust

  • Preserve selected models and enforce exact model grants #144041.

Limits and compatibility

  • Check model support before selection and subagent creation #150128. Thanks @obviyus.
See which model is answering

WebChat shows the model actually generating a reply, including observed fallback changes in local, worker and native Codex runs. The picker keeps your saved choice. Until OpenClaw has an execution observation, the label says Model pending instead of reusing a previous turn's model.

Sources and complete change list

Bug fixes

  • Show executing models for worker and native responses #146115. Thanks @ekinnee, @obviyus, @laurencebrown.
  • Show the model generating local WebChat responses #148756. Thanks @obviyus, @ekinnee, @laurencebrown.
Keep manual model choices within allowed models

Manual model choices now follow your allowed-model list, including choices made through commands and saved automations. A model being the configured primary or fallback no longer grants permission to select it manually. If an existing explicit choice is rejected, use Default where supported or add the intended model to the list. Current-model reasoning controls remain available, and automatically selected child models keep their separate selection rules.

Sources and complete change list

Limits and compatibility

  • Separate manual model permissions from automatic selection #148167. Thanks @obviyus.
Preserve model choices when delegating work

When you delegate work to a child using the same agent, it inherits the model currently running in the parent, including temporary overrides. An explicit child choice or configured child model takes precedence, and a different agent uses its own selection. New visible child sessions also retain their configured backup models on later requests when selection was automatic; explicit choices, locks and empty backup lists stay strict. Existing children with incorrectly saved manual choices are not automatically repaired.

Sources and complete change list

Improvements

  • Avoid unnecessary catalog preparation for configured child runs #149438.

Bug fixes

  • Preserve configured backup models for visible child sessions #148954. Thanks @liuwqgit, @obviyus, @chilango74.
  • Preserve the active parent model when spawning subagents #149036. Thanks @vincentkoc.
Read why a model request was rejected

Live and saved chats now explain recognized provider request limits instead of showing only a generic failure. For example, a rejected request can tell you that it supplied five cache-control blocks when the provider permits four. Private diagnostics remain redacted, and the explanation helps identify what needs correcting without changing the provider's limit.

Sources and complete change list

Bug fixes

  • Clear provider rejection reasons in live and saved chat #145402.
Wait and recover after provider limits

When a provider asks OpenClaw to wait, affected runs can finish that retry delay without being mistaken for stuck work. Exhausted daily caps, including OpenRouter's free-model limits, skip futile same-model retries and move to eligible configured alternatives. Interrupted Responses tool calls can also continue from saved results without executing partial arguments. Cancellation, execution deadlines and existing retry limits still apply.

Sources and complete change list

Bug fixes

  • Honor provider retry waits during stuck-run recovery #144543. Thanks @obviyus, @corvid-reads.
  • Recover tasks after interrupted Responses tool-call streams #144583.
  • Skip retries after daily provider caps #147807. Thanks @etzelm, @rfd62794, @jalehman.
Guide Codex while it works

With a supporting Codex model, you can answer a question in the web UI while work continues, or return to it after the turn finishes. Suggested answers require your submission. When policy requires permission for a requester's connected MCP tool, Codex now asks you to allow that call once or deny it.

Follow-up work in a native Codex child keeps earlier task results. Eligible accepted follow-ups can recover after a yield or restart when Codex's saved history identifies the accepted work. Older ambiguous records can remain unresolved, so let pending native work finish before downgrading OpenClaw.

Sources and complete change list

Improvements

  • Align model choices and status with native Codex sign-in #143588. Thanks @obviyus.
  • Answer Codex questions while the agent keeps working #144664.
  • Identify OpenClaw tasks in Codex usage metadata #145455. Thanks @pash-openai.

Bug fixes

  • Start Codex ACP with inherited max thinking defaults #132116. Thanks @pollybot13, @patrick-erichsen.
  • Explain why Codex receiver startup was cancelled #144677. Thanks @fuller-stack-dev.
  • Preserve completed tool results in fresh Codex forks #149096.
  • Preserve Codex request timeouts during clock changes #149614.
  • Resume remote Codex conversations after instruction changes #149647. Thanks @sjf-oa, @sjf.
  • Preserve Codex subagent results across follow-ups and recovery #149864. Thanks @romneyda.

Security and trust

  • Cancel disconnected Codex hook waits #147444. Thanks @vincentkoc, @nvtoroy, @aspalagin.

Limits and compatibility

  • Older Codex follow-up records without a safe task boundary can remain unresolved, and identical-result ambiguity can allow an extra continuation. Let pending native work finish before downgrading.
Keep OpenClaw conversations out of personal Codex history

Ordinary Codex-backed OpenClaw chats now use per-agent storage instead of automatically appearing in personal Codex Desktop or CLI history. If you relied on OpenClaw borrowing your personal login, select detected Codex in Model Setup to sign in, or run openclaw models auth login --provider openai and select the resulting profile. Explicit appServer.homeScope: "user" remains an opt-in; remove it to use isolated storage. Your existing personal history is neither moved nor deleted. See OpenAI runtimes for setup.

Sources and complete change list

Limits and compatibility

  • Keep ordinary Codex chats out of personal history #149355. Thanks @fuller-stack-dev.
Start and recover Codex conversations

A failed Codex turn no longer has to strand an otherwise eligible conversation when its instructions change. OpenClaw can resume the same saved thread after confirming that the old process has exited. Recovery still refuses cases where replacement would disrupt active or protected siblings, client-bound sessions or supervised work. Separately, one startup timeout no longer interrupts healthy turns sharing the process, and Linux process checks avoid waiting behind unrelated filesystem work. A native startup that never settles can still block new starts in the same Codex home until that process exits.

Sources and complete change list

Bug fixes

  • Avoid Linux Codex inspection timeouts under filesystem load #148434. Thanks @datrab, @pfrederiksen.
  • Recover failed Codex conversations after instruction changes #149000. Thanks @mertbasar0, @obviyus, @compoodment.
  • Keep other Codex turns running after startup timeout #149393. Thanks @fuller-stack-dev.
Load long Codex conversations with bounded history

Long Codex sessions load a bounded amount of mirrored history for prompt preparation and compaction, reducing memory allocation along that path while keeping full transcripts and native resume state. If required recent context cannot fit, preparation fails explicitly. An authorized standalone /reset or /new can recover by clearing active context, which loses conversation continuity; /reset soft is insufficient. OpenClaw does not reset or resume interrupted work automatically.

Sources and complete change list

Bug fixes

  • Reduce history-loading memory in long Codex sessions #149520. Thanks @fuller-stack-dev.
Keep Codex replies and reasoning complete

Codex previews keep their opening text, and completed reasoning remains visible even when it did not arrive piece by piece. Asynchronous messages stay separate from the final answer instead of being repeated there. Native conversation history also carries recorded speaker identities through compaction, helping preserve who said what; missing historical identities are not guessed.

Sources and complete change list

Bug fixes

  • Preserve who said what through Codex compaction #150490. Thanks @compoodment, @jalehman.
  • Preserve Codex previews and reasoning without duplicate async replies #151200.
Preserve Codex and Copilot task results

Temporary save failures no longer immediately discard completed Codex or Copilot child-task results. Codex retries saving results and delivery status without repeating an announcement just because its status write failed. Copilot retains the original outcome for a later event or cleanup to retry. Pending unsaved outcomes still depend on that OpenClaw process staying alive.

Sources and complete change list

Bug fixes

  • Preserve Copilot subagent outcomes after failed saves #145467.
  • Preserve Codex subagent results through storage failures #145520.
Preserve Copilot conversation continuity

Copilot saves the connection between your OpenClaw conversation and its native session without blocking the host's main processing thread. Reset and shutdown wait for pending saves and cleanup, and a late compaction result no longer removes a different replacement session.

Sources and complete change list

Improvements

  • Move Copilot session storage off the host event loop #149577.
Keep long-running model commands within their deadlines

Long foreground commands can use their accepted execution time without prematurely aborting the whole agent turn. Codex commands on paired nodes also honor their resolved command budget; upgrade OpenClaw core and the Codex plugin together for that repair. Setting a command timeout to zero disables only its process timer, while transport deadlines, Stop and approval limits still apply. CLI-backed turns also preserve remaining timeout budgets across detected long process freezes.

Sources and complete change list

Bug fixes

  • Prevent early recovery aborts of long foreground commands #148959. Thanks @obviyus, @vicvinc, @alvinveroy.
  • Preserve CLI timeout budgets across process freezes #149130. Thanks @xialonglee, @obviyus, @raltonaugust.
  • Honor foreground remote-command timeouts in Codex #149267.
  • Preserve startup output during private input delivery #149311.
Use supported reasoning levels

Fable 5 and 5.1 now inherit Medium reasoning effort, as does GPT-6 Astra when the account supports it. Your explicit effort settings still win. Fable and Mythos offer their supported Low through Max choices; update scripts that send /think minimal or /think adaptive to use /think low or /think high instead. The thinking guide explains model-specific defaults and how /think default clears a saved session override.

Thinking choices also stay with the selected model and runtime across interactive and automated work. Supported effort levels still depend on that route; selecting Off does not make a model with mandatory reasoning stop reasoning.

Sources and complete change list

Bug fixes

  • Supported reasoning choices for OpenAI and Codex #145329.
  • Correct Fable and Mythos thinking choices #145395.
  • Preserve thinking choices across models and runtimes #150106.
  • Preserve selected models and their thinking settings #150509.
  • Respect compatible providers' supported reasoning efforts ec798a46. Thanks @snowzlmbot, @alex-govorov, @fuller-stack-dev.

Documentation

  • Explain per-model thinking defaults and override order #146040. Thanks @smartnewb, @altaywtf.

Limits and compatibility

  • Default Fable and Astra to Medium reasoning #145554.
Keep custom model settings in effect

Custom OpenAI-compatible models keep their declared advanced reasoning levels when you start a session and send requests, within the API's supported limits. Custom Anthropic and Mistral requests also keep your chosen response-length limit when the model's information omits an output ceiling. Provider limits still apply, and Anthropic manual thinking is disabled if it cannot fit that response budget.

Sources and complete change list

Bug fixes

  • Fix Kimi tool-definition rejection through OpenRouter #110138. Thanks @novalis78, @fuller-stack-dev, @harjothkhara.
  • Hide encoded MiniMax tool text in replies and shared history #126307. Thanks @zhucegep, @obviyus.
  • Preserve supported DeepSeek tool argument alternatives #143819. Thanks @azuretek, @obviyus.
  • DeepSeek Flash image input and thinking controls #144469. Thanks @obviyus, @gluo88.
  • Honor configured MiniMax endpoints during model refresh #144782. Thanks @vantang, @obviyus.
  • Preserve advertised context on hosted Ollama subdomains #144891. Thanks @obviyus.
  • Fix model selection through the Fireworks alias #144913. Thanks @shakkernerd.
  • Resolve supported Anthropic Vertex models at turn startup #145160. Thanks @obviyus.
  • Ignore corrupted Z.ai detection errors #145380. Thanks @xydt-juyaohui, @altaywtf.
  • Honor configured Anthropic output limits #145985.
  • Preserve declared custom-provider reasoning levels #146134. Thanks @alex-govorov, @itanyplus.
  • Preserve requested output limits for custom models #146479.
  • Load selected CLI plugins that use built-in model APIs #148664. Thanks @alix-007, @obviyus, @donniefi.
  • Restore session-affinity headers for managed chat completions #149615. Thanks @sunnyshu0925, @obviyus, @blackhu.
  • Preserve configured provider endpoints during credential refresh #150003. Thanks @obviyus.
  • Preserve model capabilities on the first local agent request #150136. Thanks @obviyus.
Understand model context limits

OpenClaw now counts tool definitions when checking how much room a model has left for a reply. Affected OpenAI-compatible requests log a warning when almost no room remains, helping explain unexpectedly short answers. Custom models configured below the existing 4,000-token minimum now stop before sending a request, even if you set a larger input cap. Correct the model's declared window or choose one with enough room.

If you downgrade, older OpenClaw versions can discard saved model-budget information during recovery, leaving context engines to use their fallback limits.

Sources and complete change list

Improvements

  • Reduce CPU work when loading large session contexts #146302.
  • Skip unused structured tool-result processing #146328.
  • Reduce reads when validating long transcript chains #146458.
  • Prepare tool-heavy conversation context with less work #146632.
  • Avoid duplicate context estimation during compaction #146961.
  • Reduce repeated token-budget work before model requests #148448.
  • Reduce CPU work for multilingual context estimates #148663.
  • Reduce CPU work when trimming large tool results #148718. Thanks @vincentkoc.

Bug fixes

  • Tell compaction when workspace context is incomplete #140249. Thanks @sunnyshu0925, @vincentkoc.
  • Count tool definitions and warn about tiny reply budgets #140902. Thanks @sunnyshu0925, @patrick-erichsen, @jlapenna.
  • Preserve provider-specific prompt limits through reply selection #141052. Thanks @snotty, @jalehman.
  • Preserve model budgets through context-engine commits #142871. Thanks @marvinthebored, @jalehman.
  • Keep input budgets within model context limits #144168.
  • Keep selected fallback models during compaction #144432.
  • Report native session models accurately to context engines #146801.
  • Restore context-window choices for configured models #147559. Thanks @obviyus, @marvinthebored, @peetiegonzalez.
  • Continue after context overflow following completed tools #148383.
  • Continue output-limited tool calls using completed results #148440.
  • Preserve compaction checkpoints in the selected store #148489.
  • Explain cache drops alongside changing prompt context #150547. Thanks @vacinc, @yigtwxx.
  • Prevent duplicate context maintenance during task callbacks #151106.
Continue long conversations through compaction

Long conversations can continue through compaction without overstated context pressure prematurely blocking the next request. Saved summaries retain their full streamed text, checkpoint branches leave the source conversation running, and recorded speaker IDs help preserve attribution. Slow required compaction can finish without repeatedly restarting the waiting reply, while authentication failures now reach recovery guidance. These fixes preserve usable context within the model's existing capacity.

Budget-triggered compaction on public OpenAI Responses now uses its compact endpoint by default. Set params.responsesCompactEndpoint to false to opt out. Manual compaction keeps its previous default, and confirmed overflow or endpoint failure uses client-side recovery. This new default does not extend to ChatGPT, Azure or custom Responses endpoints. See compaction for the available controls.

Sources and complete change list

Bug fixes

  • Prevent premature context overflow after compaction #149462.
  • Preserve conversation context and session ownership through compaction #149840.
  • Preserve speakers in conversation summaries #149869. Thanks @compoodment, @jalehman.
  • Keep replies moving during long conversation compaction #150040. Thanks @obviyus.
  • Explain compaction authentication failures and recovery options #150400. Thanks @shakkernerd.

Limits and compatibility

  • Stored speaker IDs help preserve attribution but cannot recover identities absent from older messages. In the affected pre-reply compaction case, use the channel's /stop; the Gateway chat-abort route did not cancel that waiting work.
Continue after a provider's progress message

An agent can continue from a progress message to tools and a final answer when a Responses provider explicitly says the turn is unfinished. You no longer need to send another prompt in that case, and cancellation and stop controls still apply.

Sources and complete change list

Improvements

  • Reduce copying while preparing Anthropic tools #145287.
  • Reduce repeated streamed-reply processing #145683.
  • Parse ordinary tool arguments with less work #146241.
  • Reduce CPU work for long streamed code replies #146254.
  • Reduce JSON processing overhead for streamed responses #147101.
  • Reuse OpenAI tool-schema preparation #147543.

Bug fixes

  • Recover tool turns rejected under Zero Data Retention #139320. Thanks @ylcn91, @marcelolebre.
  • Report final outcomes after unfinished model streams #140156. Thanks @sunnyshu0925, @patrick-erichsen, @vacinc.
  • Avoid compression-related Responses stream failures #141592. Thanks @anyech, @patrick-erichsen.
  • Preserve HTTP conversations with uppercase keys #142746. Thanks @ruel225, @obviyus, @kevinammerman.
  • Continue agent tasks after Responses progress messages #146393. Thanks @vacinc.
  • Keep transcript repair diagnostics out of later model context #148738. Thanks @alix-007, @obviyus, @nierclaw-sudo.
  • Report incomplete Anthropic-compatible replies as failures #149842. Thanks @zhangguiping-xydt, @obviyus.
  • Recover through fallback after xAI token-generation errors #150433. Thanks @rileyjjy, @obviyus, @michaeljgood71.
  • Keep streamed chunks consistent with diagnostics #150682.
Continue conversations on compatible Responses endpoints

A verified compatible custom Responses model can opt into stored HTTP continuation with compat.supportsResponsesContinuation set to true, allowing later turns to send new input with a reference to the previous response. This deliberately permits the backend to retain requests, even on turns that cannot continue. supportsStore: false and explicit no-store policy still take precedence. Dedicated Azure and ChatGPT/Codex routes are excluded, and some turns may still resend full history. See provider configuration before enabling it.

Sources and complete change list

Improvements

  • Enable stored continuation for compatible Responses endpoints #128633. Thanks @hartmark, @patrick-erichsen.
Stop unfinished API work when the client disconnects

When an OpenAI-compatible HTTP client disconnects before its response finishes, OpenClaw now sends cancellation to the unfinished chat, embedding or media-preparation work even when the runtime reports only a closed response. Completed responses keep their normal behavior. Provider-side work may already have started, so disconnecting does not undo completed actions.

Sources and complete change list

Bug fixes

  • Cancel unfinished HTTP work after client disconnects #148317.
Use optional tool arguments with ChatGPT subscriptions

Tools used through ChatGPT subscriptions can leave unused optional arguments absent instead of filling them with empty placeholders. The correction applies to HTTP and WebSocket requests. Required fields and tool-execution checks remain in place; this does not change strict structured response output or guarantee which optional values a model will choose.

Sources and complete change list

Bug fixes

  • Preserve optional tool arguments on ChatGPT subscriptions #149501. Thanks @modestapproach, @obviyus, @josephbergvinson, Ted Dessert.
Keep image and PDF requests on the intended model

Image descriptions and PDF analysis keep the model selected for that request, and PDF results name the selected model consistently. Heavy image and PDF processing can run separately so other OpenClaw requests continue and cancellation can take effect. Busy workers can reject new work, and their three-minute deadline includes time spent waiting.

Restored Codex screenshots now stay beside their original messages instead of appearing attached to a later request. If a whole historical message no longer fits in the model's context, its images are left out of that request but remain saved.

Sources and complete change list

Improvements

  • Decode fewer bytes when checking Anthropic image formats #145277.
  • Keep image and PDF processing responsive and cancellable #146094.
  • Reduce size-estimation work for large image results #146506.

Bug fixes

  • Resize photos to the image-description model's limits #122431. Thanks @alix-007, @obviyus, @tracycollins.
  • Use each image request's model metadata #144254.
  • Keep PDF model selection and reporting consistent #144417.
  • Honor agent selection for image descriptions #147456. Thanks @obviyus, @mertbasar0.
  • Preserve image model choices and resize limits #147830.
  • Keep restored images with their source messages #147913.
  • Preserve tool-returned images on Bedrock GPT-5.6 Sol #149336. Thanks @dclosefuturex, @yigtwxx, @obviyus.
Use media from the active task's workspace

Image and PDF inspection, along with local generation references, now follow the active task's worktree and relative directory. A screenshot created in that checkout can be read without moving it to the agent's default workspace. Local media access still respects approved roots and symlink boundaries, and sandboxed tools retain their filesystem isolation.

Sources and complete change list

Bug fixes

  • Read local media from the active task worktree #148414.
Preserve long voice notes and avoid wasted synthesis

Deepgram Flux preserves voice-note audio beyond 20 minutes instead of silently dropping the end, within your configured size and timeout limits. The speech CLI also rejects an unsupported remote Gateway --output request before synthesis starts, avoiding provider usage for a file it cannot save locally. Audio transcription commands now identify the provider and model used when that information is available.

Sources and complete change list

Bug fixes

  • Preserve visible replies across split speech directives #144161. Thanks @bartok9, @obviyus, @yetval.
  • Keep the selected model for speech summaries #144354.
  • Preserve Deepgram Flux voice notes beyond 20 minutes #145391. Thanks @obviyus.
  • Find bundled speech-summary models after startup #146183.
  • Reject unsupported remote speech output before synthesis #146222. Thanks @leon-sk668.
  • Resolve Kimi aliases before provider startup #146261.
  • Show provider and model used for audio transcription #147170.
  • Run the intended local transcription executable #148270.
Connect organization models through Radius

The new Radius provider connects your organization's model access through browser sign-in or an API key, with streamed answers and supported image and tool use. Requests use the selected organization's credits and follow its budgets and policies. Available models depend on that access, and some advertised models can still be unavailable upstream.

Sources and complete change list

Improvements

  • Connect Radius models with browser sign-in or API keys #145377.

Bug fixes

  • Fix Radius Claude requests with thinking disabled #145565.
  • Refresh device-sign-in credentials before model discovery #148482. Thanks @obviyus.
See why a search failed

When every automatic web-search provider fails, operator logs retain the first failure to help you trace the problem. Known docs-search HTTP errors return without waiting for diagnostic response capture to finish. Failed web-search and fetch commands also allow piped output to finish before exiting with failure, within the existing five-second drain limit.

Sources and complete change list

Bug fixes

  • Preserve the first failure across web-search fallback #132755. Thanks @tommyjoseph, @obviyus.
  • Report docs search HTTP errors promptly #146987. Thanks @alix-007, @obviyus.
  • Preserve failed web-command output through slow pipes #148234.
Automatic Daybreak retries

Eligible defensive-security requests can receive one automatic Daybreak retry after a structured OpenAI policy refusal, in both native Codex and embedded OpenAI chats. The retry keeps your selected session model in place. Successful interactive embedded retries name Daybreak or your configured retry model before the answer, including in the originating group or channel.

Automatic retries are enabled for eligible unlocked settings and require access granted by the provider. An unavailable target can add a request and delay. Strict model selections, other refusal types and work that cannot safely be repeated still stop without a retry. To disable retries, set plugins.entries.codex.config.appServer.cyberFailover.mode to off for native Codex, or agents.defaults.embeddedAgent.cyberFailover.mode to off for embedded turns. See model failover for configuration.

Sources and complete change list

Improvements

  • Add Daybreak retries and cyber-policy notices #143761.
  • Retry eligible embedded OpenAI cyber refusals on Daybreak #145291. Thanks @vacinc.
  • Show which model completed a policy retry #147146. Thanks @vacinc.

Bug fixes

  • Handle denied Codex fallback access without losing results #145105.

Limits and compatibility

  • A native Codex retry may show both the original refusal and its result, and a policy-review notice can remain after cancellation or failure.
Keep generated media filenames

Generated music attachments now use the saved audio filename, including a name you supplied, so immediate results and background completion messages identify the same file. Generated images and saved videos also keep readable filenames in their results and completion messages while retaining their unique storage paths. Videos returned only as links keep their existing names.

Sources and complete change list

Bug fixes

  • Preserve signed media links through delivery retries #118830.
  • Preserve chosen music filenames #147570.
  • Preserve readable image and video filenames #147833.
Generate media with the intended references

Video generation preserves repeated reference positions, so the same image can serve as both the first and last frame of a loop. Image editing and image-guided music generation can reach a compatible configured fallback when the primary cannot accept the references. Invalid provider media responses fail visibly; third-party speech or video endpoints with malformed response headers may need their headers corrected.

Alibaba and Qwen video requests now enforce one total timeout, including downloads, using the existing 120-second default. Slow jobs may need an existing timeout override. A local timeout does not establish that the remote job stopped or that billing ended.

Sources and complete change list

Bug fixes

  • Validate DeepInfra inline video output before accepting it #117319. Thanks @fuller-stack-dev.
  • Reject invalid speech and video response headers #117369. Thanks @fuller-stack-dev.
  • Enforce the total timeout for Alibaba and Qwen videos #117781. Thanks @fuller-stack-dev.
  • Preserve video frame roles and compatible media fallbacks #148805.

Limits and compatibility

  • PDF inspection rejects non-PDF inputs and does not accept data URLs. Late cancelled image-read results are discarded. Media-header and container checks do not guarantee decoding or playback.
Choose the same model through different runtimes

You can offer the same model through OpenClaw and Codex as separate, labeled choices in the chat model picker. Each choice shows the reasoning and context options that its runtime supports. To enable this, set pickerRuntimes on an exact model entry, with up to eight explicit runtime IDs. Your configured agentRuntime stays the default. Per-agent lists replace inherited alternatives, and an empty list removes them. See the models guide for configuration.

Each alternative needs an enabled, compatible runtime and current account access. Adding a picker choice grants no credentials or access. ACP and locked sessions keep their runtime restrictions, and unavailable saved alternatives are discarded rather than silently replaced. Use explicit runtime IDs rather than auto or default; wildcard model entries are excluded. Opening the picker uses prepared choices, while Refresh checks for new ones.

Sources and complete change list

Improvements

  • Choose the same model through different runtimes #147994.

Bug fixes

  • Honor runtime preferences for profile-pinned models #149604. Thanks @shakkernerd.
Reduce retained text during long replies

During long ordinary-text replies through Completions, OpenClaw keeps less accumulated text in memory as the answer arrives. Completions and Responses also avoid repeated waits when a scheduled pause runs longer than expected. The reply text and cancellation checks stay intact. Processing time varies, and short replies can take longer.

Sources and complete change list

Bug fixes

  • Reduce retained strings and repeated streaming waits #147972.

Limits and compatibility

  • Buffered parsing paths remain outside the ordinary-text retention repair, and a single expensive event cannot be interrupted. The retention repair can take more processing time than the scheduling change alone; measured string storage is not total process memory.

Automations and Scheduling

Scheduled work keeps your latest edits and gives you clearer ways to follow what ran, what failed, and what needs attention. You can also see whether delegated work is running, waiting or finished, and whether its result has returned.

Keep scheduled work and its outcomes current

Changes you save to a running schedule or watcher now survive completion and crash recovery. Manual runs report that they are queued only after the queue accepts them. That acknowledgement means the run was accepted, not that it has finished; use its run ID to check the outcome.

After a plugin reload, script automations can refresh stale tools once before starting. Repeated failures stay grouped, and confirmed successful completion sends a recovery notice. Setup recovery never replays a script or tool action that has already started.

Doctor now preserves scheduled reports that return to their original conversation, including setups without an external messaging channel. If an older repair already changed a job to isolated delivery, restore its intended destination manually. Disabled jobs stay disabled.

Before downgrading, let affected edited runs finish and let the scheduler finish reconciling their results on the current version. A completed task alone is not enough to preserve those edits when returning to an older version. Stream sources stopped by matching overload or timeout need you to check the expression or server load and explicitly re-enable them; disabling or changing an exit watch cancels its pending exit.

Administrator tasks can keep managing existing automations after waiting for subagents, without another user message. That access belongs only to the exact resumed task and covers management of existing jobs. Cancellation, a session reset or archive, a new direct user turn, or a Gateway restart ends the handoff.

Click Automation attached in a session hovercard to open its automation editor. If several automations match, you get a list filtered to that session, with Show all automations to return to the full list. Your existing viewing and editing permissions still apply. In the CLI, an ambiguous job name now shows matching jobs so you can retry by ID; scripts using duplicate names must use an ID too.

Sources and complete change list

Bug fixes

  • Release queued reservations after cron startup failures #141008. Thanks @holny, @fuller-stack-dev and @wilhelminavonhunt.
  • Reduce cron cleanup stalls on large agent fleets #142591. Thanks @zachisfine, @pollybot13 and @609nft.
  • Forward saved CLI credentials to scheduled and queued runs #144266. Thanks @masterswords1, @fuller-stack-dev, @angeliti999 and @iwhatsskill.
  • Allow zero scheduler timeouts for automations #144551. Thanks @jalehman.
  • Preserve standing reminders after prompt-hook timeouts #145107.
  • Release old Automation page state after switching agents #145236.
  • Preserve running automation edits after crash recovery #145375. Thanks @shakkernerd.
  • Preserve spaces in automation script filenames #145673.
  • Recover the correct cron run when timestamps collide #145734. Thanks @shakkernerd.
  • Preserve edited schedules during recovery #145828. Thanks @shakkernerd.
  • Preserve cron failure details when sessions are renamed #146551. Thanks @vacinc.
  • Recover automation tools and group recurring failure alerts #146582.
  • Show active automation runs despite disabled stream sources #146793.
  • Preserve scheduled conversation delivery through Doctor repair #146794. Thanks @fuller-stack-dev.
  • Keep run history attached to the selected automation #147399.
  • Preserve automation management after child tasks #147499.
  • Keep automation fields focused during validation #147841.
  • Correct heartbeat owner discovery and status #147944. Thanks @perpaul.
  • Restore schedule controls after failed automation saves #148242.
  • Reject blank cron schedules before changing jobs #148271.
  • Report actual abort reasons in cron warnings #148331.
  • Reject blank script paths before changing scheduled jobs #148787. Thanks @alix-007 and @obviyus.
  • Avoid heartbeat timeouts while waiting for busy agents #148876. Thanks @srinatar and @obviyus.
  • Skip idle cron cleanup availability checks #148920. Thanks @obviyus, @609nft and @zachisfine.
  • Keep long CLI cron jobs active through completion #149245. Thanks @donniefi and @obviyus.
  • Clear saved automation timeout overrides #149274.
  • Preserve automation pacing in copies and clear it for Once schedules #149594.
  • Refresh automation details without losing edits #149608.
  • Preserve automation events, timing and recovery history #149673. Thanks @vincentkoc.
  • Clean up scheduled replies and retain continuation usage #149697.
  • Preserve scheduled-run usage when a retry fails #149767.
  • Prevent extra runs of event-triggered automations #149902.
  • Keep automation history with its selected task and clear recovered errors #149955.
  • Keep the selected automation open when an earlier save finishes #150129.
  • Acknowledge manual runs after queue acceptance #150849. Thanks @shakkernerd.

Improvements

  • Reduce repeated scans in cron delivery previews #144145.
  • Reduce startup work for heartbeat and reply checks #145033.
  • Fetch only excess cron receipts during cleanup #146384.
  • Reduce copying when filtering heartbeat alert history #146589.
  • Reduce scheduling work during session-notice bursts #146818.
  • Reduce heartbeat setup work for large agent fleets #147055.
  • Reduce database reads when matching standing reminders #147099.
  • Batch reminder rearming after cooldown #147180.
  • Reduce repeated scoped automation-list work #147558.
  • Skip old job payloads during cron saves #147743.
  • Open automations from session hovercards #147749.
  • Move scheduled-job loading into the database worker #148335.
  • Move unguarded scheduled-job saves off the caller thread #148594.
  • Show matching jobs for ambiguous automation names #150082. Thanks @shakkernerd.
  • Avoid unused descriptions during managed job cleanup #150709.

Limits and compatibility

  • Reject ambiguous automation names when showing a job #149958. Thanks @alix-007.
  • Offline status and failed Gateway status calls retain the local readiness fallback. Heartbeat setup uses an array for commands.ownerAllowFrom; preserve existing owners when replacing it. For Telegram, set heartbeat.target to "telegram" and heartbeat.to separately to a quoted recipient string.
  • Zero scheduler timeouts still leave provider, startup and command-runner limits in place.
Read completed automation runs

Choose View transcript in Tasks or automation run history to read the specific completed run, even after its temporary session has been cleaned up. The CLI also makes it easier to investigate a run, with searchable, paged history and separate filters for execution and delivery results. Transcript access still depends on retained history and your permissions. Existing text-block limits remain, so this does not recover deleted history or text that was omitted from the stored view.

Sources and complete change list

Improvements

  • Search and page automation run history from the CLI #141777. Thanks @alix-007 and @patrick-erichsen.

Bug fixes

  • Read completed automation transcripts after session cleanup #148211.
  • Keep filtered automation history on the correct page #149482.
Keep quiet heartbeat checks silent

Quiet heartbeat checks can finish in the built-in runtime without an unwanted missing-summary warning or another finalization request. If a check falls back to a CLI backend without the response tool, it now receives explicit guidance to stay silent when nothing needs attention. That fallback still depends on the model following the instructions. Accepted alerts and private monitor notes also survive retries and compaction, while stopping or superseding a check suppresses its delivery.

Sources and complete change list

Bug fixes

  • Avoid false MCP blockers in group heartbeats #140316. Thanks @ylcn91, @obviyus and @fuma2013.
  • Preserve heartbeat alerts and private notes through retries #144377. Thanks @obviyus and @jlahullier.
  • Respect deliberate silence in heartbeat finalization #145343. Thanks @pollybot13, @nixcyry and @obviyus.
  • Keep quiet heartbeat checks silent after CLI fallback #149549. Thanks @ruel225, @obviyus and @axeg0.

Improvements

  • Add readable next-wake times to cron debug logs #141742. Thanks @alix-007 and @celthi.
Automation owners and maintenance notices

Explicitly configured owners can now manage existing automations across sessions directly from chat. Eligibility comes from individual entries in commands.ownerAllowFrom, not channel allowlists or wildcards, and management does not transfer the creator's execution permissions. If Doctor can identify who created an older automation, openclaw doctor --fix restores their ability to edit its prompt without changing tool permissions. Jobs stop before execution when a required creator account is unavailable. Restore that account or recreate the automation under the intended account; changing its delivery account does not transfer ownership. A missing execution agent also leaves a reason in run history.

Revoking the initiating device's authorization stops later scheduling changes from its admitted agent turn, including after disconnect. An ordinary disconnect does not revoke that authority, and already accepted changes keep their recorded outcomes. Existing schedules are not canceled by revoking their creator's token. A queued run can still be stopped before execution by later revocation.

Changing an account-owned job's type and changing it back now preserves its account restrictions. Jobs that already lost that policy need explicit operator reauthorization or recreation by the authenticated creator. Tool restrictions also stay in effect across OpenClaw and Codex, including an explicitly empty tool list. Every applicable restriction must allow a tool, so jobs relying on the earlier combination of restrictions may lose access to some tools.

Doctor also warns when some automatically captured tool lists may be missing file, command or web capabilities. The restrictions may be intentional, so even --fix leaves them unchanged. To add tools, an authorized session must review and replace the complete list, including every tool the job should keep. Agents are instructed to ask an authorized administrator to check a known automation after a restricted lookup fails, before creating a replacement.

Scheduled message edits, deletions and pins must match the saved creator provider and account and use an adapter that declares the necessary authorization support. Update OpenClaw and the plugin and load its updated registration if an unsupported adapter refuses these actions. Claude-created automations preserve their saved execution target under automatic placement, but a conflicting explicit host or required sandbox policy rejects execution, including for existing jobs with that saved target.

New update and restart notices go only to destinations matched to configured command owners, and update notices respect account send settings. Unsupported destinations lose notices and restart continuations, while update results remain in the Control UI. Review owner eligibility and account send settings if chat notices stop arriving. Later policy changes do not recall notices already queued.

Sources and complete change list

Bug fixes

  • Guide agents away from duplicating inaccessible automations #137451. Thanks @liuwqgit, @sallyom, @eason-mars, @pkinjo and @emmyallears.
  • Finish manual automation requests when their owner is missing #143804. Thanks @sunnyshu0925, @obviyus and @yncubys.
  • Restore prompt editing for older automations #145730. Thanks @joncursi.
  • Report unavailable automation creator accounts #145783. Thanks @runvouch and @joncursi.
  • Honor scheduled-job tool restrictions across harnesses #149375.
  • Preserve Claude automation targets within current policy #150089. Thanks @shakkernerd.

Security and trust

  • Restrict update and restart notices to configured owners #146079. Thanks @adembektas.
  • Respect account send settings for update notices #146084. Thanks @eleqtrizit and @adembektas.
  • Preserve automation account restrictions across payload changes #150221. Thanks @shakkernerd.
  • Preserve Cron outcomes while enforcing current caller authority #150906. Thanks @shakkernerd.
  • Stop agent Cron changes after caller revocation #150921. Thanks @shakkernerd.
  • Require authorization support for scheduled message changes #151064. Thanks @shakkernerd and @nissl24.

Improvements

  • Flag captured automation lists missing native tools #147969. Thanks @obviyus.
  • Manage existing automations from owner chat #148790. Thanks @lnxg33k and @emmyallears.
Use permitted channel actions from scheduled jobs

Scheduled agents can read supported channels without an incoming chat, using either their operator permissions or their saved creator account. Eligible Discord jobs can also edit, delete, pin and unpin messages. Operator-created jobs can edit channels and threads through supported adapters; account-owned jobs need authorization from the actual requester in the owning Discord conversation. Current requester and bot permissions, enabled actions, target restrictions and the job's allowed tools still apply. Delivery settings do not grant access, and changing the default account does not replace the saved creator account.

Use an updated, loaded adapter with support for the scheduled action. Older jobs missing creator or requester information need fresh authenticated authorization or recreation. Changes to executable behavior, such as a prompt, model or schedule, can clear prior requester or local-read authority and stop further affected actions; an edit already accepted by Discord can still return its confirmed result. Reauthorize from the owning Discord conversation or, for local-read authority, a fresh authenticated local session. Remote management alone cannot grant local-read authority. The scheduled payload guide explains the required complete tool allowance and recovery paths.

Sources and complete change list

Bug fixes

  • Restore channel reads for operator-created scheduled jobs #150166. Thanks @shakkernerd and @nissl24.
  • Restore scheduled Discord message edits, deletion and pinning #150191. Thanks @shakkernerd and @nissl24.
  • Restore scheduled channel reads for creator accounts #150278. Thanks @shakkernerd.
  • Preserve local authorization for scheduled account reads #150311. Thanks @shakkernerd.

Improvements

  • Allow trusted scheduled jobs to edit Discord channels #150182. Thanks @shakkernerd and @nissl24.
  • Preserve Discord requester permissions for scheduled channel edits #150308. Thanks @shakkernerd and @nissl24.
Finish automatic reset hooks

Hooks that run during daily or idle session resets can now finish delayed work after the triggering request ends. This lets a hook wait for another operation and continue its work without losing its place when that request finishes.

Sources and complete change list

Bug fixes

  • Let automatic-reset hooks finish delayed work #146350. Thanks @vasubansal7576, @liuwqgit, @vincentkoc and @yigtwxx.

Improvements

  • Move native-hook relay lookup off the CLI thread b51a3ad.
Review a subagent's result before announcing it

A parent agent can now review a subagent's result privately, ask for more work, or stay silent before anything is automatically announced to a channel. Opt in with completionTarget: "parent" when spawning the subagent. A busy parent handles the result in a separate private turn after its current work, and resetting or removing the parent keeps the result from reaching a replacement session. Fast child results wait for the parent turn to settle; after a normal parent response, a ready result can proceed while siblings continue. Private processing also retains accurate timeout outcomes and available final details.

This option supports hidden native one-shot runs. ACP, collected results, visible or threaded runs, session mode, and expectsCompletionMessage: false are not supported. Automatic child results, parent replies and generated media stay off the channel on this route, but permitted explicit send tools can still send messages, and operators can still inspect tool arguments and child transcripts. Leaving the option unset preserves existing behavior.

Keep a verified pre-upgrade backup and follow the target build's migration instructions, including stopping processes that write to OpenClaw's data before running doctor --fix. Rolling back requires the matching released build and backup, losing work saved after that backup. Older builds may discard private handoffs, so downgrading and upgrading again does not guarantee they will resume.

Sources and complete change list

Improvements

  • Return subagent results privately for parent review #147206. Thanks @vincentkoc, @nicknmorty, @good-warning and @fuller-stack-dev.

Bug fixes

  • Preserve private subagent results across parent yield #148405.
  • Preserve timeout outcomes for private parent continuations #148619. Thanks @fuller-stack-dev.
Delegate work to a selected project

An agent can now open a separately visible child session for a registered project or managed GitHub repository, optionally in its own worktree. This gives delegated work its own place to run and a session you can follow. Visible children can also inherit the current conversation while the parent keeps working, with their own assignment made explicit after the inherited history.

Use a visible native subagent with exactly one of projectId or projectGitUrl, leaving cwd unset. GitHub HTTPS and git@github.com repository URLs are supported; local paths, file URLs, other Git hosts, hidden runs and ACP runs are excluded. Existing sandbox boundaries, tool limits and setup-script permissions still apply, and arbitrary external directories still require administrator access.

Sources and complete change list

Bug fixes

  • Preserve project and task context in visible child sessions #145102.

Improvements

  • Select managed projects for visible child sessions #147459. Thanks @vacinc and @yasuhito.

Limits and compatibility

  • With worktree: true and no project or directory selector, same-agent children continue to inherit the parent repository.
Follow delegated tasks and continue their work

The task inspector now shows whether a subagent is working, waiting or finished, and whether its result has reached the parent. You can inspect its activity and child dependencies beside the parent conversation without losing your draft. When a runtime cannot report current activity, the inspector leaves it unknown.

Agents can wait for selected tasks to finish or need attention. OpenClaw reduces a source of delays in subagent waits, task lists and cancellation checks when many past tasks are retained. Explicit message modes let them supply future context, steer supported active work, or start a follow-up turn. Ending a wait or reaching its time limit leaves the tasks running and their results available for delivery. The notify mode queues context for a future turn without waking the target or confirming it has read the message. That queued context can be evicted or lost on restart.

The explicit sessions_send mode resume can continue an eligible paused native child while preserving its original task and completion recipient. It requires current authority over that child and returns acceptance, not the final answer. Omit watch and use no positive wait timeout. Ordinary follow-up messages keep their existing behavior, and previously stranded tasks are not automatically repaired.

Scheduled jobs wait for delegated work and its result delivery before choosing a final response, within their existing deadline. Repeated wait checks now leave time to process completion. Managed Lobster approval flows can also resume from a saved checkpoint with the flow ID, current revision, owning session and the user's decision.

Sources and complete change list

Bug fixes

  • Avoid duplicate work after inline child replies #147394. Thanks @obviyus, @ylcn91 and @tonyisblind.
  • Keep long-running subagents in activity counts #147431. Thanks @fuller-stack-dev.
  • Respect subagent cleanup retry limits #147480.
  • Preserve recorded replies when chat waits finish #147656. Thanks @vincentkoc.
  • Prevent scheduled subagent waits stalling Gateway #147779.
  • Clarify where cross-session announcements are recorded #148740. Thanks @vincentkoc and @nikolascostello.
  • Avoid reporting cancellation for native children still running #149025.
  • Show child follow-up activity in the parent chat #149807.
  • Wait for admitted ACP cleanup before returning spawn failure #150792. Thanks @yigtwxx.
  • Keep subagent waits responsive with large task histories #151261.

Improvements

  • See why subagents wait and whether results arrived #147571.
  • Preserve the original task when resuming paused work #149283. Thanks @jalehman.
  • Reduce temporary memory use when listing subagents #149761.
  • Stop repeated idle subagent scans #149810.
  • Load ACP cleanup only when task maintenance needs it #150632.
  • Reduce repeated flow reads during task operations #150692.

Limits and compatibility

  • Selected-task waits accept 1–32 task IDs for 0–60 seconds and distinguish completion, attention, unavailability and timeout. steer requires a supported active run; followup starts or queues another turn.
  • Yielding without children requires explicit waitFor: "message" and a real future sender. A waiting status does not schedule an external timer or guarantee a future wakeup.
  • Post-yield state_changes progress is opt-in, bounded and best effort. It is process-local and excludes private child text, tool arguments and results.
  • Workboard claims coordinate cooperating writers but do not protect files or shell processes from other writers. Use separate worktrees for isolation.
Find relevant conversations for agent work

Agents can find conversations by owner, creator, project or workspace, filter for activity, and continue through matching results instead of mistaking the first page for the whole inventory. Metadata-only requests do not read transcripts or start sessions. These filters preserve existing access permissions; filters relative to the current user need a trusted identity, and current activity requires a Gateway connection. Results are a live view, so agents need to account for conversations changing between pages.

Sources and complete change list

Improvements

  • Filter and page agent session inventories #148051.
Wait for background commands and collect their results

Work resumed after a background command finishes uses the normal agent timeout instead of the shorter heartbeat budget. ACP turns and approved-command continuations can use their configured execution budgets, resumed native subagents retain their saved timeout, and late replies can still be observed after an initial wait expires. Explicit limits and cancellation still apply, and that late-reply observation does not survive a Gateway restart.

Background commands still do not automatically wake a subagent. Collect their terminal results with process poll before yielding without another completion source, including after a requested stop. Confirmed requested stops with successful cleanup avoid false failure notices, while real timeouts and cleanup failures remain errors. Completion entries now explain the existing tools.exec.notifyOnExit=false setting for stopping automatic completion turns while keeping background commands. Check per-agent overrides; changed settings apply only to newly started commands, whose results you can collect with process poll or process log.

Sources and complete change list

Bug fixes

  • Fix false process failures and stalled waits #147871.
  • Preserve agent timeouts after background commands complete #148388.
  • Preserve execution budgets and late task replies #148508.

Documentation

  • Explain how to disable automatic completion turns #150540. Thanks P-Dawg.

Limits and compatibility

  • A CI watcher that exits with PROXY-AUTH-FAILED and code 2 needs a new watcher from an active authenticated run or repaired proxy access.
  • Long node invocations and location requests receive forwarding and response grace based on their operation timeout unless a shorter override is supplied. Approval follow-up observation remains bounded even when execution continues, and scheduled heartbeat monitors keep their own timeout policy.
Keep worker coordination out of the main conversation

Multi-agent conversations hide raw worker reports and automatic coordination replies while keeping useful parent answers and task results visible. Child reports no longer start reciprocal reply loops, and a requested late result can produce one visible parent answer. Human follow-ups still get their own visible replies. Coordination remains in raw transcripts and model context, and older messages without enough sender information remain visible. This display behavior is separate from opting into private parent review before an announcement.

Sources and complete change list

Bug fixes

  • Keep worker reports on their task completion path #150520.
  • Stop child reply loops and clear internal control markers #150527. Thanks @romneyda.
  • Hide worker coordination and prevent reciprocal child reply loops #150625.

Browser and Computer Use

You can share a page in a local managed browser with your agent and use computer controls on supported local or cloud desktops. Cloud sessions also gain more ways to reuse prepared work and recover after interruptions.

Start work from prepared cloud environments

Private repositories can reuse eligible prepared cloud environments, reducing repeated setup when matching capacity is available. Your source GitHub credentials stay on the computer running OpenClaw during preparation. The connected session receives its normal credentials later.

Crabbox-based workers require version 0.56.0 or newer. If your host cannot download releases, stage a supported copy before updating OpenClaw, because worker inspection and cleanup need it too.

File checks for large workspaces are also faster when preparing node and cloud sessions. Stop can cancel preparation before a worker is allocated, though file reads already underway must finish before cleanup. Upgrade the Gateway to receive this fix; updating only the node is not enough.

Linux and macOS deployment images can also reuse a verified cloud-node archive after a restart, avoiding repeated compression. This requires updating the image recipe. Windows and existing images keep building normally, and worker installation and provisioning still happen.

Sources and complete change list

Bug fixes

  • Reject model switches that cannot run on the assigned worker #136833. Thanks @sunnyshu0925, @patrick-erichsen, @jalehman, and @skorfmann.
  • Prevent expired forks from extending warm-image demand #146163.
  • Prevent large-workspace preparation stalls #147470.
  • Reuse supported Crabbox binaries without loading the installer #149658. Thanks @vincentkoc.
  • Bootstrap cloud nodes from builds containing private QA tooling #149926.
  • Stop obsolete cloud attempts before bundle installation #150763. An ownership change after installation has already started may still delay completion and cleanup.

Improvements

  • Reuse prepared cloud workers for private repositories #144237.
  • Reduce startup delay for prepared worker repositories #145302. Avoid extra remote calls when starting prepared worker repositories.
  • Less repeated Git housekeeping at worker startup #145331. Avoid repeated checkpoint cleanup during worker startup.
  • Reduce GitHub checks during prepared worker startup #145480.
  • Avoid loading inactive cloud-worker conversation branches #145591.
  • Defer syntax highlighting during worker startup #145685.
  • Overlap worker loading with connection approval #145793.
  • Skip redundant Git author lookups during workspace sync #146833. Thanks @vincentkoc.
  • Reduce cold cloud-session preparation work #147787. Prepare missing worker bundles during remote installation and skip unused archive parsing on cold cloud starts.
  • Reduce fresh-worker plugin activation work #147945. Skip unnecessary legacy-state work when activating plugins on fresh cloud workers.
  • Combine cloud desktop setup with node enrollment #148691.
  • Prepare fresh cloud project runtimes with less waiting #148952.
  • Move Crabbox warm-image storage off the Gateway thread #149680.
  • Reuse verified cloud-node archives after Gateway restart #150199. Thanks @patrick-erichsen and @erulkey.

Limits and compatibility

  • Require Crabbox 0.56.0 for prepared workers #145109.
Resume or recover cloud sessions

A first message waiting for cloud setup can continue after a Gateway restart. Returning to a released session now waits for its replacement worker without reporting a false stall, and Stop prevents canceled setup from launching work later.

For a failed session, choose Gateway · local in Restart session… to recover on the computer running OpenClaw once worker cleanup finishes. Recovery uses the last accepted workspace checkpoint. Changes that were never uploaded may be lost, and the interrupted turn is not replayed.

Archiving an independent cloud session no longer waits for unrelated setup maintenance. Its sidebar row hides immediately and returns with an error if the request is rejected. An already-failed worker with no live turn can stay archived while cleanup is retried separately. Undo restores the row while the retained checkout is intact; it does not restart the worker.

Active and provisioning workers still follow their normal steps for stopping and saving work. Deleting or rebuilding a checkout also keeps stricter cleanup checks. Update both the Gateway and Control UI for this behavior, and check the actual archive state after a timeout.

If a saved first message is stuck after a startup timeout, Retry can use the worker that has since become ready. Reconnecting alone does not allocate a replacement, and uncertain sends still need Check delivery. Repository conversations marked Worker required now offer Choose worker… so you can continue in the same chat on an eligible device or cloud worker.

Sources and complete change list

Improvements

  • Preserve useful workspace-transfer error details #144272. Thanks @jalehman.
  • Keep healthy Crabbox desktop renderers running on resume #146816. Thanks @vincentkoc. Keep a healthy Crabbox desktop renderer running on resume when its wallpaper is unchanged.
  • Reduce database work in worker result checks #149211.

Bug fixes

  • Resume cloud-session setup after Gateway restarts #145068.
  • Match Stop actions to actual cloud-worker recovery state #145153.
  • Archive sessions with starting or cleanup-pending cloud workers #145170.
  • Restart failed cloud sessions on the local Gateway #146054.
  • Resume cloud sessions without false setup-stall errors #146225.
  • Keep pending cloud archives visible #147552. The later archive fix below supersedes pending-row visibility with immediate hiding and Undo. This change also avoids unrelated queued-maintenance delays and rejects duplicate archive requests.
  • Archive sessions while failed-worker cleanup remains pending #147651.
  • Preserve cancelled hosted turns after shutdown errors #148181.
  • Recover repository conversations that need a worker #148256. Thanks @zachisfine and @obviyus.
  • Reject interrupted remote workspace uploads #149080. Thanks @wangmiao0668000666 and @obviyus. For an existing incomplete workspace, preserve needed remote changes before running openclaw sandbox recreate.
  • Recover cloud-worker workspace sync after slow process checks #149963. Exhausted recovery can leave workers paused for a later retry; a rollback delay may also last until the original lease expires.
  • Recover saved cloud messages and abandoned Desktop viewers #150484.
Check cloud work with less repeated file processing

Finishing cloud work can avoid repeatedly reading unchanged files, while changed files still receive the checks needed before their results are accepted. Large workspace scans also reuse temporary memory for file checks.

Large transfers and result checks now run expensive file calculations in the background so other requests can stay responsive. This can use more CPU and memory and does not necessarily shorten the transfer.

Sources and complete change list

Improvements

  • Reduce cloud-session checkpoint overhead #145571.
  • Skip unnecessary scans when archiving worktrees #146097.
  • Reuse unchanged cloud workspace file hashes #146327.
  • Reduce temporary allocations during large workspace scans #146680.
  • Keep large workspace transfers responsive #147626. Run workspace-transfer and result computations in a pool of up to two background workers while keeping writes and cleanup under host control.
  • Reduce Git process starts when restoring worker results #150057.
Manage cloud snapshot build results

The Snapshots page keeps build progress, cancellation controls, and failure messages visible even when the image list fails to load. Dismiss a reviewed failure and it disappears from the current view, updating Needs attention as soon as the request succeeds. The retained record can return after a page reload.

Sources and complete change list

Bug fixes

  • Keep snapshot builds visible during inventory failures #144127.
  • Remove dismissed snapshot builds immediately #145122.

Improvements

  • Dismiss failed cloud worker snapshot builds #144671.
Run sandboxed tools on compatible cloud workers

The optional Crabbox sandbox backend can run commands and file tools on a cloud machine while your agent and model credentials stay on the host. Enable and configure the plugin to use it. Initial support is direct Daytona with a compatible Crabbox build; version 0.56.0 lacks the required capability, so prepared-worker support alone is not enough. Cloud resource usage applies, and this backend does not support sandboxed browsers or Docker bind mounts.

Before downgrading to a version without this recovery support, disable the backend and finish pending cloud allocation or cleanup using the current version. The shared SSH backend also now requires native no-replace directory renaming to create or recreate workspaces. Existing workspaces remain usable without being reseeded.

Sources and complete change list

Improvements

  • Run sandboxed tools on Crabbox cloud machines #144454. Run sandboxed tools on compatible Crabbox cloud machines, preserve remote edits across reuse, and publish initial SSH workspace uploads without replacing existing work.
Clean up failed local sandbox setup

If Docker or Podman sandbox setup fails, OpenClaw now tries to remove the container created by that attempt. Existing containers with a conflicting name are left alone. Cleanup can still fail, in which case the error reports both the setup and cleanup failures so you know what needs attention.

Sources and complete change list

Bug fixes

  • Clean up containers after failed sandbox creation #150713. Thanks @vincentkoc and @eleqtrizit.
Inspect and control the intended desktop

An agent on the computer running OpenClaw can now control its configured desktop without a separately paired node. Enable cua-computer, allow the computer tool, and use a vision-capable agent. The configured Gateway desktop is preferred by default. If it is unavailable, the request fails without sending input elsewhere. Provider setup and native display permissions still apply.

On desktop-enabled Linux cloud workers, agents can launch a graphical app with exec and use it on the same desktop. Use background: true for apps that need to stay open.

The viewer's Match option resizes compatible virtual desktops to fit the panel when you have control and permission to resize. Fit remains the default, and older fixed-size workers need a backend update and reprovisioning. Supported browsers in a secure context can also open a view-only Picture-in-Picture window, letting you watch the desktop beside other work. Keep the originating viewer open.

Supported window actions return a fresh screenshot and element references for the agent's next step. If input or the refresh fails, get a fresh observation before deciding what to do next. Input is not automatically replayed.

After a rapid hide/show of the embedded Desktop, a later disconnect keeps its reason and Reconnect control visible. Repeated Stop requests on paired desktops now wait for cleanup already underway. Cloud Desktop shutdown cancels queued app launches and waits for its local work, including work from a replaced worker. Local cleanup completion does not confirm that the cloud provider has released the machine.

Sources and complete change list

Improvements

  • Watch live desktops in Picture-in-Picture #143836. Thanks @vincentkoc.
  • Match virtual desktop resolution to the viewer #143938. Thanks @vincentkoc. Match compatible virtual desktop resolution to its viewer and clear modifier keys released while native menus were open.
  • Reduce host selection and desktop overhead #146162.
  • Reduce repeated screenshot encoding in worker requests #146907. Thanks @vincentkoc.
  • Control the Gateway desktop without pairing a node #147275.
  • Reduce cloud session and desktop readiness delays #150162.

Bug fixes

  • Screenshot-free accessibility inspection on CUA #145351. Honor screenshot-free accessibility inspection on updated CUA nodes; Peekaboo remains unsupported and pixel clicks still require an image.
  • Desktop input feedback and capability-aware guidance #145352.
  • Restore desktop and portal streams on Bun #146005.
  • Let cloud worker commands open desktop apps #146223.
  • Return fresh window observations after computer actions #146822. Thanks @vincentkoc.
  • Keep Desktop connected across quick Chat tab switches #147175. Retain connected Desktop viewers for quick Chat tab switches within 30 seconds, pausing input while hidden and disconnecting during active drags or session changes.
  • Release retired desktop keyboard connections #148082. Thanks @vincentkoc. Release the desktop keyboard's old viewer connection after a full reset without waiting for another input event.
  • Avoid leftover helpers after SSH desktop connections #149345.
  • Prevent Computer Use refresh from aborting Codex startup #149365. Thanks @bdjben, @obviyus, and Benjamin Badejo.
  • Correct Codex Computer Use readiness checks #149494. Thanks @jalehman and @jason-allen-oneal.
  • Recover Desktop viewer slots after abandoned setup #150801.
  • Wait for Desktop stream cleanup during shutdown #151139.
  • Finish desktop cleanup across repeated stops and queued app launches #151236.
  • Keep Desktop reconnect controls after rapid visibility changes #151243.

Documentation

  • Clarify window accessibility filtering for agents #146388.
Inspect browser pages and apply policy changes

Browser pages appear directly in the Chat panel header, leaving more room for the page. Mac Browser panes also stay visible beside menus that do not overlap them. Plain accessibility snapshots show references beside their controls, helping agents target follow-up actions on supported backends.

With hot reload enabled, you can change browser enablement, JavaScript permission, and network policy without restarting the whole Gateway. The browser service still restarts, canceling pending work and closing OpenClaw-managed Chrome tabs. Attached and remote browsers stay open, but OpenClaw disconnects from them. Extension relay settings still require a Gateway restart.

If Chrome loses a tab's internal automation target, the extension relay can restore control for clients that remain subscribed, provided the tab is still accessible. Take a fresh snapshot before continuing; failed actions are not replayed. Explicit detach and Chrome's Cancel still stop control.

Agent browser previews stay readable during refresh, with progress on the reload button. Browser message-dispatch failures now close the affected connection without stopping unrelated Gateway work. The failed browser operation is not automatically retried.

Sources and complete change list

Improvements

  • Expose native Chrome tab IDs for extension integrations #138338. Thanks @patryk-roguszewski and @jalehman.
  • Browser pages and favicons in the Chat panel header #145517.
  • Change browser control policy without restarting the Gateway #146100.
  • Skip unnecessary HTML visibility checks #146152.
  • Format large browser debug logs with less work #146375.

Bug fixes

  • Preserve visible webpage text after hidden HTML #144210. Thanks @ruel225, @obviyus, and @yetval.
  • Keep sidebar tab menus visible over native Browser pages #145108. Thanks @patrick-erichsen.
  • Warn when browser response bodies are truncated #145210.
  • Keep Mac Browser panes visible beside menus #145482.
  • Show element references in plain accessibility snapshots #146247.
  • Clarify browser profile data removal status #146965. Report unconfirmed browser data removal when deleting a profile, rather than claiming no data exists.
  • Preserve browser scope in repair advice #147859. Keep --browser in sandbox inspection and recreation advice so follow-up commands target browser containers.
  • Restore subscribed tabs after target loss #147943.
  • Guide browser-sidebar requests to the existing panel #148471.
  • Open remote browser tabs when discovery advertises localhost #148546. Thanks @donniefi, @obviyus, and @batmanscode.
  • Keep browser previews readable during refresh #149328.
  • Keep browser dispatch failures from stopping the Gateway #150177. Thanks @moerai, @tdvtoan, and @fuller-stack-dev.
  • Keep new browser tabs accessible during first navigation #150233.
Recover managed browser sessions and profiles

Slow but healthy managed browsers can keep their process and tabs through startup and later readiness checks. Profile reset and deletion also verify which browser owns the data before moving it, preserving the data when ownership is uncertain.

For a lock naming another host, including after a machine rename, close the browser using that profile and verify its Chromium lock before retrying. Automatic cleanup of a browser left by an earlier OpenClaw runtime remains limited to Linux and macOS; this adds no Windows cross-runtime recovery. Late cleanup from an old Chrome connection also leaves its replacement alone, and cancelling a request before it starts preserves other callers' shared browser work.

If installing the browser's local helper fails while replacing a file, you can retry without restarting OpenClaw. The previous launcher or manifest stays intact, and leftover temporary files no longer block the retry.

Sources and complete change list

Bug fixes

  • Tolerate delayed managed-browser readiness responses #149284.
  • Preserve slow running browsers and locked profile data #149354.
  • Protect browser session cleanup and shared-work cancellation #149820.
  • Retry browser installation after failed file replacement #151254.
Paste text into the agent's browser

Click a field in a managed Agent browser panel or Browser dashboard and paste plain text with Cmd+V, Ctrl+V, or right-click Paste. Password fields, multiline text, and fields inside embedded pages are supported. Paste waits for the remote click to succeed and does not submit the form or change the remote clipboard. File and image paste and Chrome MCP existing-session profiles remain unsupported. See Browser panel controls.

Sources and complete change list

Bug fixes

  • Enable plain-text paste into Agent browser panels #148451. Thanks @vincentkoc.
Save a displayed browser file

The Browser sidebar gains a Download file button for the image, video, or document you are viewing, keeping its preview open. Mac tabs use a native Save dialog. Eligible Agent tabs download through your browser; default or network-restricted Agent profiles must use Open in your browser instead. Remote browser-node transfers retain their 10 MiB file limit, and existing-session Chrome MCP profiles do not support this action.

Sources and complete change list

Improvements

  • Download sidebar assets with native Mac saving #144480. Thanks @patrick-erichsen. Download the displayed Browser sidebar file while keeping its preview open, preserve existing files if a native save fails, and restore missing WebKit toolbar icons.
Share a browser page with your agent

A shared Browser dashboard lets you and your agent use the same page. Enter a note or change an app's filters, then ask your agent to continue from what you changed. It uses a local OpenClaw-managed browser profile and that profile's login state, including for permitted HTTP apps shown through the HTTPS Control UI.

Browser access is required. Remote profiles, paired-node browsers, and attached personal browsers are unsupported, and the page does not use your phone or laptop's cookies. Stop closes the tab and loses unsaved page state. Resume opens the saved URL.

Typing in the Browser panel also preserves spaces between words again.

Sources and complete change list

Improvements

  • Share browser dashboard pages with your agent #146702.
  • Reduce repeated dashboard tab reads #147892. Recheck only selected browser dashboard tabs during cleanup, so unrelated damaged records do not block those checks.

Bug fixes

  • Restore Space typing in the Browser panel #150317. Thanks @donniefi and @moltmanisgreat.
Choose which machine handles browser actions

Automatic browser actions now prefer the selected browser on the computer running OpenClaw, even if an installed managed browser has not started yet. If that computer has no browser capability, a single eligible connected node can handle the request. Explicit targets and configured node pins take precedence. A failed action stays with the selected browser instead of being replayed on another machine.

This default can change which machine and browser login session you use after upgrading. To keep using a node's existing session, select that node explicitly or set gateway.nodes.browser.node.

Sources and complete change list

Bug fixes

  • Prefer the host browser for automatic routing #147446.
Use real paths for browser output

Browser downloads and traces preserve the directory name you requested, including trailing spaces, and check the whole path before writing. If your output directory passes through a user-created symbolic link, choose its real, canonical path. The Invalid path error can now apply even when the final directory already exists. The macOS /tmp and /var system aliases remain supported.

Sources and complete change list

Limits and compatibility

  • Validate complete browser output paths #147541. Preserve literal browser output directory names, reject symlinked ancestors, and clean up temporary Chrome MCP screenshot workspaces.
Start remote tasks in an empty workspace

Choose New workspace to start a task on a cloud worker or eligible paired device without supplying a repository. Remote sessions choose it by default when you have not explicitly selected a folder, project, or worktree. The selection survives draft reload and placement recovery, while explicit source choices keep their existing validation.

Existing agent files are not copied. Each new session starts with its own Git history and remotes, and Git remains an internal requirement. Normal managed snapshots and recovery still apply; this does not add disposable workspaces or general multi-repository support.

Sources and complete change list

Improvements

  • Start remote sessions in a new empty workspace #147773. Thanks @danhayman.

Plugins and Integrations

Install or reload supported plugins while your Gateway keeps running, and give teammates read-only access to selected conversations.

Install plugins and continue the conversation

You can install or reload supported plugins without restarting the Gateway, making it easier to add an integration or try a plugin without taking the whole installation offline. Owners can do this through the command line or an authorized chat command, and the Plugins UI helps you find official and ClawHub packages. Existing permission checks and consent still apply.

Managed Codex conversations can continue with changed tools, carrying completed results and accepted follow-up input within bounded conversation context. This stops the current native turn and background terminals. Imported or supervised Codex sessions need a new managed conversation for changed tools.

The CLI also accepts several plugins in one enable, disable, reload, update or uninstall command. Earlier successful changes remain if later work fails, so review the result before retrying. Local files and marketplace registrations must be available on the Gateway computer, and offline installs wait for startup. If installation saves but activation fails, follow the repair message and run openclaw plugins reload.

After a replacement timeout, recovery can wait up to 60 seconds for unfinished work, restore the previous plugin and restart eligible channels. Cleanup failures can still require another reload or a Gateway restart. Restart into the updated code to receive this repair. Rebuilt bundled code and enabling experimental native plugin UI retain their separate restart requirements; native UI also needs a browser reload.

Sources and complete change list

Bug fixes

  • Restore replies for plugins using the older inbound API #91245. Thanks @849261680, @fuller-stack-dev, @ckai49500-source, @jakuboleksy, @davidchpl, @nissanlogan, @bravostation.
  • Preserve plugin files when update ownership is lost #144316. Thanks @vincentkoc, @fuller-stack-dev.
  • Preserve plugin registration object identity #145488. Thanks @romneyda.
  • Keep callbacks working when another plugin instance retires #145804.
  • Recover plugin reloads and complete resource cleanup #145816.
  • Load JavaScript plugins natively under Bun #145947.
  • Release retired plugin services after hot reload #146073. Thanks @vincentkoc.
  • Reduce memory retained after repeated plugin reloads #146239.
  • Apply approved plugin artifacts without restarting Gateway #146413.
  • Apply first channel setup without restarting Gateway #146481.
  • Preserve plugin update errors when rollback fails #146483. Thanks @aniruddhaadak80.
  • Preserve plugin install failures when rollback also fails #146656.
  • Reuse plugin registrations with prepared metadata #146703.
  • Preserve pending chats during plugin reload #147472.
  • Preserve runtime context for deferred plugin commands #147688. Thanks @romneyda.
  • Preserve ClawHub artifact size in install metadata #148118. Thanks @onlyysaurabh, @vincentkoc.
  • Restore native addon discovery during plugin reloads #148170. Thanks @novaunboundai.
  • Release retired plugin-service startup references #148175.
  • Use the selected registry's integrity for ClawHub installs #148220. Thanks @romneyda.
  • Avoid blocking the Gateway during plugin artifact cleanup #148286.
  • Keep plugin CLI callbacks in their owning runtime #148524. Thanks @vincentkoc, @romneyda.
  • Stop Gateway stalls after plugin retirement #148635.
  • Repair stale ClawHub plugin connections with Doctor #149634. Thanks @patrick-erichsen.
  • Reuse loaded channel plugins during setup and preserve current credential views #150026. Thanks @liuwqgit, @fuller-stack-dev, @dh-js.
  • Check plugin SDK aliases only when needed #150840. Thanks @romneyda.
  • Recover channels after plugin replacement timeouts #150953.
  • Preserve SQLite host context across module copies #151153. Thanks @romneyda.
  • Keep plugin service identities stable across registration and reload 54a71610. Thanks @fuller-stack-dev.

Improvements

  • Retain plugin dependencies through active work and cleanup #144252.
  • Manage and reload plugins without restarting the Gateway #145484.
  • Manage plugins within an active conversation #145648.
  • Install supported plugins without Gateway restart #145710.
  • Refresh plugin tools within managed Codex conversations #145917.
  • Reduce repeated discovery during standalone plugin activation #148168.
  • Reduce offline plugin activation startup work #148368.
  • Enable multiple plugins in one command #149824.
  • Manage multiple plugins in one CLI command #149910.
  • Avoid unnecessary plugin alias preparation #150622.

Security and trust

  • Revoke stale plugin host access #145888.

Documentation

  • Correct plugin setup and restart guidance #146516.
Recover plugin reloads and release retired resources

Changing Lossless settings no longer lets cleanup from the old plugin close the replacement's database. Eligible failed replacements can recover using the previous code and settings, while unchanged plugins keep running. Successful cleanup is required before replacement, so slow cleanup delays recovery and a cleanup failure can leave the affected plugin unavailable. A plugin replacing itself from an active call must wait for that call to finish.

Repeated reloads also release more retired plugin state and reuse unchanged bundled setup code. Memory growth from native ESM modules remains unresolved, so long-running installations can still accumulate memory across reloads.

Sources and complete change list

Bug fixes

  • Release plugin memory retained by cached error stacks #149643. Thanks @patrick-erichsen.
  • Release old plugin registries after replacement #149644. Thanks @patrick-erichsen.
  • Release stopped lease timers and worker references #149645. Thanks @patrick-erichsen.
  • Avoid redundant inbound plugin registration during reload #149648. Thanks @patrick-erichsen.
  • Keep Lossless and other plugins usable after settings reloads #149675. Thanks @patrick-erichsen.

Improvements

  • Reuse bundled plugin setup code across reloads #149646. Thanks @patrick-erichsen.
Load source plugins under Bun and Node

Bun-hosted Gateways can reload supported installed-plugin source through the existing source checks, and receive targeted fixes for TypeScript, JSX and deferred imports. Node also handles directly imported source SDK code through the appropriate loader. Compatibility still depends on the runtime and plugin's imports. Some Bun cases require a patched runtime, while conditional package exports and indirect source-SDK imports retain known gaps.

Sources and complete change list

Limits and compatibility

  • Allow source-validated installed-plugin reloads under Bun #150088.

Bug fixes

  • Resolve captured plugin module targets under Bun #150154.
  • Preserve Bun plugin source loading and import failure behavior #150287.
Find plugins by purpose and inspect them

Purpose-based categories and package logos make plugins easier to recognize and browse. Installed and catalog plugins now share an overview with their capabilities, documentation and available actions, and local controls remain usable when optional catalog information fails to load. Marketplace pages keep their destination when you refresh.

Plugin details load through one ClawHub request. Operators of a self-hosted registry must add support for /api/v1/packages/{name}/detail before upgrading this client.

With telemetry enabled, deliberate plugin searches send normalized query text and remote result counts to ClawHub analytics, which retains queries for 30 days. Local inventory matches and user, device and session identifiers are excluded. Set CLAWHUB_DISABLE_TELEMETRY to opt out while keeping search results available.

Sources and complete change list

Improvements

  • Include deliberate plugin searches in ClawHub analytics #142664. Thanks @patrick-erichsen.
  • Group bundled plugins by their main purpose #142760. Thanks @patrick-erichsen.
  • Keep integration card descriptions compact #144442. Thanks @patrick-erichsen.
  • Load the plugin marketplace from one overview #144569. Thanks @patrick-erichsen.
  • Add space around Plugins workspace navigation #144652. Thanks @patrick-erichsen.
  • Reduce allocation when finding loaded plugin APIs #146101.
  • Avoid plugin dependency scans for unrelated imports #146486.
  • Skip channel discovery when plugins are disabled #146689.
  • Reduce plugin metadata lookup work #146763.
  • Reduce JavaScript plugin dependency capture work #146993.
  • Reduce repeated plugin cache preparation #147345.
  • Reuse checked package paths when loading plugins #147411.
  • Reduce filesystem checks when reusing plugins #147467.
  • Reuse shared plugin discovery across workspaces #147535.
  • Reuse cached plugin schema validation #147594.
  • Reduce plugin argument preparation work #147664.
  • Reduce isolated settings-helper startup work #147858. Thanks @shakkernerd.
  • Reduce repeated scans when inspecting all plugins #148303.
  • Unify installed and catalog plugin overviews #149216. Thanks @patrick-erichsen, @kvnloo.
  • Load plugin details with one ClawHub request #149475. Thanks @patrick-erichsen.
  • Reduce plugin lookup overhead for unrelated imports #149485.
  • Correct bundled plugin logos and the OpenClaw fallback #149610. Thanks @patrick-erichsen.
  • Move hosted plugin-catalog snapshot work off the caller thread #150067.
  • Prepare Logbook, Memory Wiki and1Password for catalog publication #150291. Thanks @patrick-erichsen.
  • Add Logbook, Memory Wiki and 1Password catalog metadata #150318.
  • Expand plugin categories and matching icons d26a3ad1. Thanks @patrick-erichsen.

Bug fixes

  • Fix direct loading of plugin marketplace pages #142798. Thanks @patrick-erichsen.
  • Stop retaining obsolete plugin catalog entries #144219.
  • Keep selected plugin tabs open while information loads #144647.
  • Keep plugin categories available while searching #144661.
  • Fix Plugins catalog refresh at the trailing-slash URL #144740. Thanks @gokay-ai, @conan-scott, @obviyus.
  • Preserve plugin page links on reload #145303.
  • Package icons and reliable missing-image placeholders #145415. Thanks @patrick-erichsen.
  • Match plugin loading placeholders to cards #145417. Thanks @vyctorbrzezowski.
  • Preserve plugin diagnostic details in Doctor JSON #147020.
  • Complete Radius and Session Share plugin listings #147104.
  • Restore plugin search icons and distinguish official results #148518. Thanks @patrick-erichsen.
  • Show disabled plugins' declared CLI backends during inspection #149837. Thanks @zhangguiping-xydt, @obviyus.
  • Restore bundled plugin descriptions #150331.

Limits and compatibility

  • Keep unpublished Logbook, Memory Wiki and 1Password bundled #150316. Thanks @fuller-stack-dev.
Search and edit grouped plugin settings

Plugin Settings can organize options into searchable sections, with per-field reset controls and permissions on the same page. Plugins without section definitions keep their complete flat form. Text and number edits commit when you leave the field, while switches commit immediately. Escape also commits the focused edit before leaving Settings.

Sources and complete change list

Improvements

  • Find and edit plugin settings in searchable sections #149246. Thanks @patrick-erichsen.
  • Organize bundled plugin settings into named sections #149331. Thanks @patrick-erichsen.
Inspect and edit plugin credential references

Administrators can inspect supported credential fields to see whether a plugin uses an entered key, an environment fallback or a secret reference, and edit declared references directly in Settings. Existing keys stay masked, and only a newly entered replacement can be revealed. Environment fallbacks remain inspect-only, and read-only configuration cannot be edited.

Reference saves wait for acknowledgment. Canceling a rejected edit preserves other changes, but a lost acknowledgment can leave the draft and error visible until you reload. Saving a reference does not rotate the secret or verify the provider connection.

Sources and complete change list

Bug fixes

  • Make supported plugin credential fields editable #148192. Thanks @obviyus.

Improvements

  • Inspect and edit plugin credentials in Settings #149286. Thanks @patrick-erichsen.
Ask about a plugin setting

Use Ask OpenClaw on a plugin or individual setting to prepare a contextual question without losing your existing conversation or draft. The question stays unsent until you choose Send. Generated value previews withhold recognized sensitive values, and help waits while a sensitive setup answer is in progress. This protection applies to the generated preview, so check any private information you type yourself.

Sources and complete change list

Improvements

  • Ask OpenClaw about plugins and individual settings #149330. Thanks @patrick-erichsen.
Build and inspect custom plugins

Plugin authors get clearer build and verification errors when a package is missing its manifest or a declared JavaScript entry. Builds preserve existing manifest and package-folder permissions. Plugins stored beneath a symlinked parent directory also regain correct manifest hashes; after updating, use openclaw plugins registry --refresh to repair affected registry metadata.

Registration-time api.config and its descendants are now read-only. Plugins that mutate them can throw or have writes ignored, so authors need to update those integrations. See the related maintenance change.

Sources and complete change list

Bug fixes

  • Keep independent tests out of generated tool packages #129393.
  • Report missing plugin manifests as build failures #145823.
  • Reject missing JavaScript plugin entries #145903.
  • Preserve plugin-validation debug details #147632.
  • Preserve plugin source paths outside the home directory #148142. Thanks @qingminglong.
  • Restore plugin manifest hashes through directory aliases #148632. Thanks @patrick-erichsen, @hannesrudolph.

Security and trust

  • Preserve plugin manifest permissions during builds #147393. Thanks @vincentkoc.

Documentation

  • Correct plugin media and QR helper examples #148422.
Pass large inputs to plugin tools

Passing large datasets to managed plugin tools uses less temporary memory and preparation work before execution. Existing object identities, shared references and cycles remain supported. The improvement concerns input preparation rather than total application memory.

Sources and complete change list

Improvements

  • Reduce temporary memory for large plugin inputs #145659. Thanks @fuller-stack-dev.
Carry agent setup in Claw packages

Experimental Claw packages now preserve explicit model preferences and delegation settings. With a local Gateway running, add and update can activate up to 64 required plugins together after the usual trust and capability confirmations. Missing models and companion agents still need to be configured separately.

Earlier successful steps can remain after a later failure, so follow the reported recovery instructions before retrying. An interrupted installation can also refuse to resume if model or companion-agent availability changes. Offline installation still needs a restart. Removing a Claw leaves global plugins installed by default; explicitly selected plugin removal waits for active work to finish.

Sources and complete change list

Improvements

  • Preserve model and delegation settings in Claw packages #141921.
  • Apply Claw plugin requirements together #145713.

Security and trust

  • Disclose added memory sources in Claw update previews #144415.

Bug fixes

  • Drain active plugin work before Claw package removal #145649.
Share selected conversations read-only

Session Share lets you share selected conversation groups with teammates on another paired OpenClaw installation, giving them read-only access without handing over control of the conversation. Both sides must enable sharing, and an empty group selection shares nothing. Recipients see conversation text and eligible user-created forks, without subagents, tool activity or reasoning. They can read the conversation but cannot continue it, archive it or use its terminal.

Choose groups carefully, since text and metadata may contain private information and revocation cannot recall what someone already received. Keep the source node connected and restart it after configuration changes. Reload an older open shared view after updating, and restore cold history on the source before reading it remotely.

Sources and complete change list

Bug fixes

  • Keep shared sessions focused on conversation text #146598.

Improvements

  • Reuse sender facts within shared transcript pages #148672.
  • Reduce repeated work when paging shared sessions #149285.
  • Read session members through the background worker #151036.
  • Share selected sessions read-only with a paired Gateway 5278a8f2.
Browse sessions from installed coding apps

Choose which installed coding apps supply sidebar conversations in Settings → Appearance → Session sources. Claude Code, Codex, OpenCode and Pi now have one place for these controls. Updated paired nodes can show native Codex conversations without a matching Gateway agent, and empty catalogs stay hidden while discovery continues. Large CLI history imports preserve more conversation text and visible results within the response size limit.

Codex listings follow native activity recency and preserve conversations sharing the same timestamp. Browsing and search reuse already loaded session details, and valid saved listings can reopen while refreshing after a restart. Renames and successful archives update the catalog without another full scan; external changes may wait for background refresh. Older conversations remain accessible through native paging and search, which can take longer and return partial pages to continue. Very large native responses can still cause memory bursts.

These settings autosave for everyone on the Gateway and require a restart; the relevant plugin must be enabled. Update paired nodes as well as the Gateway for the newer Codex discovery behavior. Fresh Claude Code and Codex discovery defaults off, while OpenCode and Pi defaults on. New Claude CLI conversations can use saved subscription tokens while existing conversations retain their account and history. API keys require explicit selection, and your configured fallback policy still applies.

Sources and complete change list

Bug fixes

  • Preserve conversation before tool activity in large CLI imports #143995. Thanks @von8794, @obviyus.
  • Preserve Claude CLI replies during backend replacement #145378. Thanks @ylcn91, @jalehman, @emi-ercel.
  • Use saved subscription tokens for new Claude CLI conversations #146095. Thanks @obviyus, @klaussarros.
  • Restore native Codex discovery and hide empty catalogs #146305.
  • Release cancelled session catalog requests from the queue #146498.
  • Stop retired session-catalog lookups #148407.
  • Preserve shared Codex catalog reads under cache pressure #148513. Thanks @giangthb.
  • Reuse pending Codex catalog reads after polling timeouts #148631.
  • Back off repeatedly failing Codex catalog sources #149378.
  • Let waiting catalogs progress after node work completes #149396.
  • Keep active catalog refreshes shared under query pressure #149500.
  • Stop history updates after a catalog pane closes #149505.
  • Avoid repeated Codex scans across multiple homes #149879.
  • Avoid repeated recent-session scans during older-session discovery #150517.
  • Bound searches through hidden Codex sessions #150639.
  • Preserve starting limits for Codex session searches #150859.
  • Resolve current ACP tasks after run ID reuse #151030.

Improvements

  • Keep Gateway responsive during Claude history discovery #145684.
  • Reduce work when merging long CLI histories #146031.
  • Put coding session discovery controls in one panel #146502.
  • Add app icons to session source settings #146592.
  • Reduce database reads during transcript-mirror recovery #146684.
  • Explain where slow session listings spend time #148047. Thanks @giangthb.
  • Identify where slow Codex session listings wait #148639.
  • Identify where slow Codex session requests fail #148735.
  • Avoid reopening Codex session files for known provenance #148838.
  • Identify phases of slow Codex catalog calls #148984.
  • Let waiting session catalogs advance between scan steps #149030.
  • Explain slow Codex catalog waits with correlated request logs #149616.
  • Reuse Codex catalog pages across repeated multi-home listings #149773.
  • Reduce Codex session-list memory bursts and preserve timestamp ties #150112.
  • Reduce processing of large Codex previews #150514.
  • Reuse current Codex session indexes and restart snapshots #150659.
Start and recover coding-agent conversations

Connected coding agents can recover from a stalled /reset or /new after the existing 15-second cleanup deadline, letting a fresh conversation proceed without restarting the Gateway. Old cleanup may continue in the background. Canceling queued or initializing ACP work also prevents unwanted provider submission through the repaired setup paths.

ACP clients normally receive a new session's introduction before its updates, and unrelated session creation no longer holds up an active prompt. An initial backlog above 256 updates can still arrive before the introduction so its content is preserved.

Sources and complete change list

Bug fixes

  • Introduce ACP sessions before sending their updates #110455. Thanks @superdiaodiao, @fuller-stack-dev, @fused-id.
  • Stop canceled ACP turns before they start provider work #114199. Thanks @kevin2966n, @fuller-stack-dev.
  • Resume ACP conversations after reset cleanup stalls #115184. Thanks @jacks1237, @fuller-stack-dev, @romneyda, @enominera.
Read and cancel code-navigation results

Bundled code-navigation tools process large, fragmented language-server replies with less copying. Stopping a turn during language-server startup now stops further launches and cleans up the servers that turn acquired. Canceling an individual tool request still leaves its shared server available for later requests.

Sources and complete change list

Improvements

  • Process large language-server replies with less copying #145703.

Bug fixes

  • Stop language-server startup when a turn is canceled #148762.
Work with large Workboards

Opening a Workboard and claiming a task now involve less unrelated card data, so damaged records elsewhere no longer block those actions. Other application work can continue while Workboard waits on its database, and plugin reload lets already-accepted storage work finish. Damaged records still need attention when read directly, and archived cards still prevent a board from being deleted.

Sources and complete change list

Improvements

  • Speed up Workboard statistics and occupancy checks #146237.
  • Reduce Workboard task-claim reads #146245.
  • Load only the requested board's cards #146683.
  • Read only the selected card for Workboard notifications #146748.
  • Run Workboard database operations in a background worker #146976.
  • Reduce Workboard dependency-check reads #147102.
  • Filter Workboard subscriptions before loading #147780.
  • Reuse board settings within each Workboard dispatch decision #148523.

Bug fixes

  • Preserve waiting Workboard cards during idle dispatch #149160. Thanks @obviyus, @gregbond.
Save large Team Reports

Other work can continue while Team Reports waits on its database to save a report. Large roster refreshes use fewer writes, and a failed refresh preserves the complete previous report and roster. Standalone plugin installations need a compatible host with the SQLite worker SDK.

Sources and complete change list

Improvements

  • Move Team Reports database work off the Gateway thread #144871.
  • Save large Team Reports with fewer database writes #146233.
  • Reduce Team Reports status-read overhead #147452.
  • Reduce internal data transfer for Team Reports people pages #148288.
Maintain Logbook without blocking the Gateway

Logbook handles database waits in the background so other application work can continue. Screenshot cleanup waits until active previews and analysis finish reading the images. Expired screenshot metadata is removed in batches while timeline cards, observations and standups remain available under the existing retention rules.

Use a compatible worker-capable host for standalone Logbook installations. Stop Logbook and let active work finish before moving its storage. Rolling back the database cannot restore screenshot files that retention already deleted.

Sources and complete change list

Improvements

  • Keep Logbook database work from stalling the application #144982.
  • Batch expired Logbook screenshot cleanup #146306.
  • Reduce dense screenshot-batch metadata transfer #147999.
  • Reduce Logbook pending-activity selection overhead #149660.
Search saved meeting and call history

Find past meetings by words in saved notes or transcripts, then read long summaries with their headings and lists intact. The wider meeting timeline gives those notes more room, with clear loading feedback on desktop and mobile. Larger saved transcript libraries and voice-call histories also avoid repeated database work when you reopen them.

Sources and complete change list

Bug fixes

  • Keep transcript reads consistent through updates and cleanup #145031.
  • Save Google Meet summaries to the requested output file #147078.

Improvements

  • Search saved meeting notes and transcripts #145367.
  • Reduce repeated meeting transcript storage work #146381.
  • Load populated transcript libraries with less database work #146623.
  • Reduce database queries for voice call history #146625.
Keep Reef message checks available

Reef can reuse an explicitly configured OpenAI OAuth login for message checks, with the required model permissions and compatible Codex runtime policy. Existing API-key setups remain supported. If message-tracking storage fills, the shared inbox stays connected and parks affected entries until capacity becomes available.

An entry may be delivered again if its earlier delivery could not be recorded. Before downgrading from the OAuth setup to an older version, restore the older API-key configuration described in the Reef guide.

Sources and complete change list

Improvements

  • Use an existing OpenAI OAuth login for Reef checks #134815. Thanks @jason-allen-oneal, @patrick-erichsen.
  • Reduce repeated Reef peer reads #147505.
  • Move Reef registration persistence off the application thread #149637.
  • Move Reef delivery-marker storage off the application thread #149745.
  • Move Reef inbox progress storage off the Gateway thread #149770.
  • Move Reef replay persistence to SQLite workers #149849.
  • Move Reef review reads off the Gateway thread #149930.

Bug fixes

  • Keep Reef inbox processing available when storage fills #144637. Thanks @eleqtrizit.
Read original timestamps in Fleet logs

Add --timestamps to openclaw fleet logs to compare container events by their original log time. It works alongside --follow, --tail and --since; leave it out to keep the existing output format.

Sources and complete change list

Improvements

  • Add optional timestamps to Fleet logs #132554. Thanks @alix-007, @patrick-erichsen.
Keep ClickClack discussion setup consistent

ClickClack saves the installation identity used to own a discussion before creating its remote channel. If that identity cannot be saved, channel creation stops and asks you to retry opening the discussion. Existing saved identities need no migration.

Sources and complete change list

Bug fixes

  • Save ClickClack ownership before creating discussions #149574.
Remove a Beam from the current view

Confirming a Beam deletion immediately hides its sidebar row while the request runs. If deletion fails, the current row returns with an error. Successful deletion is permanent and leaves independent continuations intact; uploading the same Beam later can recreate its row.

Sources and complete change list

Bug fixes

  • Hide deleted Beams immediately #147460.
Diagnose MCP configuration and cleanup

Read-only Doctor checks preserve working MCP OAuth logins by leaving schema inspection to authenticated operations that can save refreshed credentials. Use --severity-min info to see deferred checks and openclaw mcp probe <name> for a configured server. Plugin-provided servers and agent-local profiles need an authenticated serving-agent turn. Already-invalid logins still need reauthorization.

Claude CLI tools remain usable after the turn that started their listener finishes. Silent configured MCP calls receive the existing 15-minute active-tool allowance, with cancellation and transport deadlines still in force. Servers denied as a whole no longer start, and unused discovery connections can close while retained tools remain available. If cleanup remains unconfirmed, inspect or stop the affected processes before rerunning Doctor.

Sources and complete change list

Bug fixes

  • Release MCP servers after isolated heartbeats #143433. Thanks @ylcn91, @chachi-max, @as76, @kgerman-ar, @jmmoncada95.
  • Contain MCP startup cleanup failures and preserve Doctor findings #144941. Thanks @libraho, @itanyplus.
  • Reject folders as MCP server commands #144998. Thanks @masatohoshino.
  • Accept nested-reference MCP result schemas #145533.
  • Accept cleanup of already-ended MCP sessions #145831. Thanks @zhangguiping-xydt, @baumus, @obviyus.
  • Preserve underlying errors when MCP cleanup is uncertain #146561.
  • Explain MCP probes with no enabled servers #147216.
  • Preserve MCP OAuth logins during Doctor checks #147454. Thanks @shad0wca7.
  • Attribute tool-preparation delays to the correct stages #148349.
  • Cancel language-server startup during conversation compaction #148845.
  • Wait for bounded tool subprocess cleanup during shutdown #149005. Thanks @vincentkoc.
  • Prevent premature aborts of silent MCP tools #149206. Thanks @obviyus, @wujialehk.
  • Stop pending MCP startup when compaction is cancelled #149339.
  • Complete MCP cleanup when shutdown helpers stall #150306.
  • Keep Claude CLI tools available across turns #150339. Thanks @marieldejesus12, @josepeluso, @seahopark, @potterdigital.
  • Skip denied MCP servers and close unused discovery connections #150364. Thanks @michaeljgood71, @terrencehinds99, @clode2026, @radekpohl-rgb.
  • Remove unused empty MCP session records #150901.

Improvements

  • Avoid unused JSON conversion for structured MCP results #148929.
Protect current workflow progress

An outdated task-flow update can no longer replace newer saved progress or recreate a deleted flow. Progress notifications also wait until the update commits, so a rolled-back change does not appear to have succeeded.

Finished subagent tasks and their linked flows also avoid redundant updates during idle Gateway restarts. Genuine corrections still persist, and failed notifications can still retry.

Sources and complete change list

Bug fixes

  • Protect current task-flow progress from stale updates #145699.
  • Keep finished subagent tasks stable across restarts #145940. Thanks @zhangguiping-xydt, @anusha0501, @obviyus, @eliasbogordos.
Adopt asynchronous plugin storage

Plugin authors can use awaited storage, task and flow operations so their database work can run while other application work continues. Loading saved tasks and workflows at startup, during reloads and before awaited SDK reads now uses the background worker too. Webhooks and Lobster wait for managed-flow saves before returning results or starting dependent work. Data-only keyed-store operations now use the shared database worker; callback-based updates, validation and serialization still run on the calling thread. The storage migration guide explains how to switch interfaces without copying data.

Check host capabilities before using optional APIs such as deleteIfEqual, await writes, and reread state before retrying a creation whose outcome is uncertain. Existing synchronous APIs remain supported but deprecated. Linking child work to a managed flow does not launch it, and later changes still need the documented revision and ownership checks.

Sources and complete change list

Improvements

  • Skip redundant quota scans during plugin-state writes #144198. Thanks @tedbarnett.
  • Reuse compiled queries for plugin-state imports #144206.
  • Expose the selected runtime entry to plugins #144818.
  • Package declared private plugin workers #144821.
  • Add asynchronous task and flow reads for plugins #145851.
  • Skip unnecessary plugin state expiry scans #146114.
  • Avoid loading old plugin values during writes and imports #146278.
  • Use cheaper plugin record counts and capacity checks #146285.
  • Speed up plugin capacity checks and migration previews #146377.
  • Move managed workflow writes off the application thread #146495.
  • Await managed child-task linking in plugins and Webhooks #146678.
  • Count flow tasks without loading full task records #146682.
  • Reduce reads when plugin caches evict old entries #146750.
  • Skip unused plugin-state payload reads #147619.
  • Move conditional plugin updates into database workers #147891.
  • Save Teams learnings through database workers #147931.
  • Move SMS delivery-status writes off main thread #147934.
  • Move awaited plugin metadata reads off main thread #148017.
  • Avoid an extra copy when reading stored plugin files #149420.
  • Allow asynchronous scoped session-access checks #149599.
  • Move data-only plugin storage to the shared-state worker 2ff1f93a.
  • Move saved-task preparation off the Gateway main thread #148574.

Limits and compatibility

  • Deprecate synchronous plugin storage with migration guidance #145158.

Bug fixes

  • Return complete large SQLite worker results #145926.
  • Allow large SQLite worker writes #146019.
  • Move async database opening into its worker #146172.
  • Preserve causes of asynchronous TaskFlow creation errors #148241.
  • Prevent plugin storage failures after read-only database inspection #150236.

Documentation

  • Correct async task SDK migration guidance #146568.
Keep conversations usable with custom context engines

When a custom context-engine hook fails, the conversation's message order and tool-result history are restored for retry. Pending work keeps the resources it needs, and delayed subagent cleanup stops incorrectly disabling a healthy engine just because its original caller has finished. The history repair restores the message list, not arbitrary changes a plugin made inside individual messages.

Intentionally disabling a recognized selected engine uses the built-in engine and keeps your choice for re-enabling. A cold start can still report a missing engine when its plugin has a different ID and no ownership registration is available. Genuine plugin failures retain their existing isolation behavior, and earlier quarantine is not automatically cleared.

Sources and complete change list

Bug fixes

  • Preserve conversation history when context hooks fail #117328. Thanks @fuller-stack-dev.
  • Keep context-engine resources through pending work #145621.
  • Prevent false context-engine quarantine after caller closure #148600. Thanks @jalehman.
  • Treat disabled context engines as normal built-in selection #149319. Thanks @jalehman.
Browse and filter Workboard tasks

Workboard filters now work together, so you can narrow cards by status, priority, attention needed and recent completion, including on mobile. Switch from the default board to a list with aligned task details and collapsible status groups when you want to scan more work at once. The list-view choice is not saved. Clearing filters keeps your selected agent context; use the agent picker to return to All agents.

Sources and complete change list

Improvements

  • Organize Workboard filters and mobile controls #144751. Thanks @vyctorbrzezowski.
  • Add a responsive Workboard list view #144753. Thanks @vyctorbrzezowski.
  • Compact Workboard’s filtered empty state #147514. Thanks @vyctorbrzezowski.
  • Clarify Workboard list focus and hover #147515. Thanks @vyctorbrzezowski.
  • Clarify Workboard filter borders #147516. Thanks @vyctorbrzezowski.
Edit Workboard cards and protect drafts

Workboard card details now organize task information, activity and recent session context into tabs, with common fields editable in place. You can also rename a board and choose or reset its icon and color. Closing changed cards or comments asks before discarding your draft, and failed saves keep your edits available. Dragging cards preserves neighboring status changes, while attachments on a recreated card survive cleanup of its predecessor.

Use matching current Workboard, Gateway and Control UI components for these controls. If a move's result is uncertain, wait for a successful reload before editing again; your open comment draft remains available.

Sources and complete change list

Improvements

  • Simplify Workboard cards and preserve concurrent reordering changes #144752. Thanks @vyctorbrzezowski.
  • Edit Workboard cards and board appearance #144754. Thanks @vyctorbrzezowski.
  • Organize Workboard card details and session context #144755. Thanks @vyctorbrzezowski.

Bug fixes

  • Preserve attachments when deleted Workboard cards are recreated #147191.
Change several Workboard cards at once

Select several Workboard cards in board or list view to change their status, assignment, priority or labels together, or to archive or delete them. A batch can finish only partly, so review the results before retrying the unfinished cards that remain selected. Deleting a card leaves its running session active. These controls require matching current Workboard and Gateway components.

Sources and complete change list

Improvements

  • Select and update multiple Workboard cards #144756. Thanks @vyctorbrzezowski.
Finish background plugin work

Deferred plugin webhook callbacks can finish after the request that started them ends, while remaining tracked during Gateway shutdown. This repairs the closed-request failure that could interrupt background processing. Plugin authors using the deferred-work helper should account for callbacks having their own lifetime and continuing after the requester cancels.

Sources and complete change list

Bug fixes

  • Keep deferred webhook processing alive after requests finish #144801. Thanks @liuwqgit, @maxwell-code07, @vincentkoc.
Find and combine tools in Code Mode

With Code Mode enabled, an agent can find native and MCP tools together by describing the task it needs to perform. Optional TypeScript checks help combine calls and report several errors at once, while existing permissions and approvals still apply. Exact tool names now distinguish capitalization, and an active wait keeps its tool-call deadline instead of expiring as an idle snapshot.

Returned data preserves numeric values and literal object keys. Typed arrays return indexed JSON objects, so use Array.from when you need an array and convert dates explicitly. If a tool returns malformed data, the error identifies problem fields and advises checking what happened before retrying, because the action may already have run.

Sources and complete change list

Bug fixes

  • Restore Tool Search code mode under Bun #145688.
  • Explain invalid Code Mode tool results before retrying #147239.
  • Restore MCP tool discovery in Code Mode #149662. Thanks @vincentkoc.
  • Avoid false failures after Code Mode replies are saved #151021.
  • Preserve Code Mode tool selection, waits and returned values #151210.
  • Classify Code Mode tool-call deadlines as timeouts 4c7cabb5. Thanks @yigtwxx, @vasubansal7576.

Improvements

  • Reduce ranking work in large tool catalogs #145725.
  • Speed up Code Mode MCP catalog preparation #146083.
  • Reduce repeated processing of large Code Mode results #146584.
  • Find native and MCP tools by task in Code Mode #147134.
  • Improve Code Mode result types and compiler feedback #147143.
  • Speed repeated Code Mode type checks #147252.
  • Infer Code Mode results from the requested action #147291.
Continue coding-app conversations after Stop

Stopping a reply now keeps an established coding-app conversation available with its earlier context for the next turn. The partial reply stays visible, and the interrupted turn remains unsuccessful, so you can continue without treating unfinished work as complete.

Sources and complete change list

Bug fixes

  • Keep CLI conversation context after cancellation #147139. Thanks @obviyus, @peetiegonzalez, @marvinthebored, @enotionz, @ataraxiat.
  • Report unexpected ACP signal exits as failures #148027.
  • Shut down the ACP client when terminal input closes #148611.
  • Consolidate ACP agent process management #150150. Thanks @obviyus.
  • Settle disconnected Codex sockets and enforce forced shutdown #151192.
Reuse results within a Code Mode run

Code Mode can save a result and reuse its complete data in later cells, including after wait and resume, without fetching it again. Eligible oversized final objects and arrays can also become reusable references automatically during interactive execution. A preview is only a sample; load the saved result for calculations over the full dataset.

These are temporary snapshots that expire when the run ends or aborts, tools or permissions change, or the Gateway restarts. The store holds up to 64 entries with a default 10 MiB encoded-JSON allowance, and refuses new saves when full without evicting existing results. Result operations are unavailable in restart-safe cells. Automatic retention also excludes headless execution and can fall back to ordinary truncation when the result or reference cannot fit.

Sources and complete change list

Improvements

  • Reuse saved data across Code Mode cells #147154.
  • Keep oversized Code Mode results for later cells #147278.
  • Reuse byte counts when fitting results #147718.
List 1Password items efficiently

In installations with many agents, 1Password item listings can skip unrelated access grants and avoid failures caused by damage in those grants. This requires a storage adapter that supports reading only the requesting agent's relevant grants. Listings still return metadata, with existing secret-access and approval rules in place.

Sources and complete change list

Improvements

  • Reduce database reads when listing 1Password items #147183.
Recover a custom plugin workspace

UI customization now lives under Plugins → Customize UI, replacing the floating button. The Plugins page always opens the built-in workspace so you can reach these controls even when a custom workspace hides navigation. Open /plugins under your Control UI base URL and choose Built-in to return to the standard workspace.

Sources and complete change list

Improvements

  • Move UI customization access to Plugins #147245.
Retrieve files delivered by a specific run

Integrations can request only the files an assistant delivered for a chosen run, leaving out user uploads and raw tool observations. Set messageRole to assistant together with runId; the run ID alone does not select outputs. Scoped managed downloads return the exact selected file or report it missing when its ID is stale.

Older Gateways reject the new filter. Integrations must show that limitation instead of silently retrying without it.

Sources and complete change list

Improvements

  • Select assistant-delivered files by run #147682. Thanks @vincentkoc.
Keep registered diff previews during cleanup

Diffs cleanup now preserves an older preview directory if it becomes registered while its age is being checked. It also skips unnecessary database checks for recent files. Files being rendered remain protected, and orphan cleanup still applies only to directories more than 24 hours old.

Sources and complete change list

Bug fixes

  • Preserve newly registered diff files during cleanup #147624.
Recover an interrupted file overwrite

If a pre-approved File Transfer overwrite fails because the disk fills or a file-size limit is reached, OpenClaw attempts to restore the original contents instead of leaving an empty or partly replaced file. The transfer still reports its original error. Restoration is best effort and can also fail; it does not provide recovery from a process crash or power loss.

Sources and complete change list

Bug fixes

  • Restore originals after interrupted approved overwrites #140678. Thanks @zenglingbiao.
Cancel PDF extraction without crashing the host

Canceling PDF extraction no longer aborts Node through the repaired PNG-compression initialization failure. Cancellation during that encoding step waits for it and the worker to finish; rendering remains immediately cancellable. A stuck protected native operation can still delay cancellation beyond the task deadline.

Sources and complete change list

Bug fixes

  • Prevent PDF cancellation from aborting Node #150752.
Prepare Feishu document tables

Preparing Feishu documents with several tables or longer cell text needs less local processing while preserving table widths and Unicode text. Smaller inputs and some batches may not benefit, and Feishu network requests are unchanged.

Sources and complete change list

Improvements

  • Reduce repeated preparation for multi-table Feishu documents #148997.
  • Reduce preparation work for long Feishu table cells #149040.
Use authorized email services from agent tools

Shared agent instructions now explicitly allow user-authorized email CLI and API actions under existing tool permissions and approvals. Replies to connected chat channels still use OpenClaw routing. This clarifies existing permissions; the separately reported native Codex email refusal remains unresolved.

Sources and complete change list

Bug fixes

  • Clarify permission for authorized email CLI actions #148521. Thanks @vacinc, @aanalog-crow.

Security and Privacy

These changes tighten specific permission checks and improve how OpenClaw handles credentials in tool results and diagnostics. Client developers can also add checks that tie actions to the selected account.

Keep command approval tied to the launch

Covered Gateway and node command paths now recheck saved approval-file permissions before launch and keep reviewed programs tied to their approved paths. This does not stop a process that has already started, and queued Linux helper launches can still start after approval is revoked. Requester-specific MCP tools in OpenClaw's Codex integration also ask for an allow-once or deny decision when policy requires it. Full-permission sessions and the trusted OAuth sign-in step retain their exceptions; SDK integrations need to supply the approval callback.

If you use custom Homebrew curl or git paths, move HOMEBREW_CURL_PATH and HOMEBREW_GIT_PATH from the launch-directory .env into your launching shell or ~/.openclaw/.env. Project environment files can no longer choose those executables during an approved dependency install.

Sources and complete change list

Bug fixes

  • Reduce approval prompts caused by truncated command reviews #144587. Thanks @masterswords1 and @unknownengineofficial.

Security and trust

  • Match verified Gateway users in command allowlists #144601. Thanks @jamesy023 and @obviyus.
  • Enforce required approvals for requester-specific MCP tools #144631. Thanks @eleqtrizit.
  • Block project environment files from choosing Homebrew executables #146389. Thanks @eleqtrizit.
  • Recheck command approvals at process launch #146517.

Improvements

  • Reduce repeated work when checking saved command approvals #146773.
Keep sandbox writes inside their allowed paths

Sandboxed Codex file changes through OpenClaw's shipped local and remote bridges now reject directory links that redirect them into protected locations. Authorized directory aliases still work. Sandbox file tools also follow the files and permissions visible inside the container, including overlapping mounts. Use exec for container-only storage that file tools cannot verify, and recreate affected containers after changing bind sources or access modes. See the Docker sandbox guide for the supported mount changes. The patch-tool guide explains why full command access can still leave file changes restricted.

Sources and complete change list

Documentation

  • Clarify patch-tool workspace limits and permission precedence #136088. Thanks @marvinthebored, @peetiegonzalez and @obviyus.

Security and trust

  • Prevent symlinks from redirecting sandbox file changes #143501. Thanks @eleqtrizit.
  • Align sandbox file tools with visible container mounts #148893. Thanks @vincentkoc, @aaronwander, @frankekn and @jiesou. Selected changes to tmpfs destinations or read-only modes below binds also require scoped container recreation; unchanged containers remain reusable.
Keep sandbox attachments within allowed folders

Sandbox media reads and reply attachments now retain the active session's allowed folders, rejecting reads from another session's sandbox and reply staging from an unmounted host workspace on the affected paths. Plugin SDK integrations must supply trusted session context to access sandbox files. Authorized workspace reads remain available, including the existing caller-workspace access in ordinary inbound processing.

Sources and complete change list

Security and trust

  • Confine sandbox media reads to authorized folders #144347. Thanks @eleqtrizit and @vincentkoc.
Keep subagent attachments separate

Files passed to native subagents now live in OpenClaw-owned storage, with Docker and Podman children receiving read-only access to their own attachments. Use the file paths supplied to the child. Attachment-bearing spawns are refused on shared-scope sandboxes and unsupported backends, including SSH; spawns without attachments continue as before. Pre-upgrade attachments in child workspaces remain for operator cleanup. The subagent guide explains the supported configurations and changed paths.

Sources and complete change list

Security and trust

  • Isolate subagent attachment storage and cleanup #146600. Thanks @eleqtrizit, @jacobtomlinson and @vincentkoc.
Use native helpers for guarded file operations

OpenClaw now automatically uses installed native helpers for supported guarded file operations on macOS, Linux, and Windows. Moves that must preserve an existing destination require that helper. If native mode is off or the helper is missing or unsupported, a move to an absent destination is refused with its source retained.

On supported installations, change an explicit native-off override to auto or remove it, install with optional platform dependencies enabled, then restart and retry. Unsupported environments need a supported runtime and filesystem for these moves. Check both paths before retrying an error reported after a move starts, since a later identity check can fail after the move completed. See secure file operations for mode and platform requirements.

Sources and complete change list

Limits and compatibility

  • Preserve file operations with fs-safe0.13.1 native helpers #150263. Explicit native-mode settings and the sealed-worker native-off policy remain effective.
Mask recognized secrets in tool results and diagnostics

OpenClaw's built-in agent runtime now masks recognized and registered secrets in completed tool-result text before the next model request, including file reads, command output, and tool errors. With redaction enabled, custom rules retain built-in credential checks. The release also corrects mistaken masking of public status links and masks reflected bot credentials in new Mattermost error diagnostics.

Log views and exports now mask recognized credentials and private-key fragments across selected portions of stored logs while keeping JSON readable. The stored files remain unchanged, and reading a selection can take longer because masking may scan earlier history. Secret detection remains limited to recognized patterns and registered values, and the tool-result change does not cover native Codex. Previously shortened message text cannot be restored.

Sources and complete change list

Security and trust

  • Redact local paths in sidebar failure previews #143907. Thanks @romneyda.
  • Mask Mattermost credentials in error diagnostics #144172. Thanks @wangmiao0668000666 and @obviyus.
  • Preserve URLs and credential masking with custom rules #145810. Thanks @obviyus and @schjonhaug.
  • Mask secrets in tool results before model delivery #146596. Thanks @nicknmorty.
  • Keep credential-masked Gateway logs valid JSON #146718. Thanks @obviyus.
  • Preserve masking and valid JSON across stored log selections #146850. Thanks @obviyus.
  • Keep secret masking consistent across module copies #147316.
  • Redact Windows diagnostic paths without namespace leftovers 2995f0f. Thanks @liuwqgit and @obviyus.

Bug fixes

  • Preserve public status links during redaction #145553. Thanks @obviyus and @schjonhaug.

Improvements

  • Reduce allocation when redacting diagnostic snapshots #146192.
  • Reduce unrelated credential metadata processing during cleanup #146882. Thanks @vincentkoc.
  • Reduce temporary credential-redaction allocations #147592.
  • Reduce unused redaction allocations #147672.
  • Reduce repeated redacted-log reconstruction #148007.
Configure and diagnose secret references

Missing credentials under numeric account names or dotted provider keys now point to the exact setting instead of surfacing as a later authentication failure. The config command also preserves literal secret-provider arguments, including empty strings and surrounding whitespace. Quote those values in your shell, and reapply any previously saved argument whose whitespace an older command removed.

Sources and complete change list

Bug fixes

  • Detect missing credentials under numeric and quoted keys #148310. Thanks @zhangguiping-xydt and @obviyus.
  • Preserve literal exec secret-provider arguments #148327.
Use private credential files

File-based SecretRef credentials now require a private regular file with a single hard link. Existing hardlinked credentials can block startup or secret activation until you replace them with a new private file at the configured path; changing permissions alone is insufficient. Follow the Linux and macOS replacement procedure, then run openclaw secrets reload for a running Gateway or repair the file before restarting. The separate 1Password broker-token hardlink allowance remains in place.

Sources and complete change list

Limits and compatibility

  • Require private single-link SecretRef files #148087.
Read verified credential files on Windows

Secure credential reads on Windows x64 verify ownership and access permissions using the matching native helper. If that helper is disabled, missing, or outdated, the read is refused. Restore auto mode or reinstall the matching helper without resetting your credentials. Native Windows ARM64 has no matching helper for these reads. See secure file operations for recovery guidance.

Sources and complete change list

Limits and compatibility

  • Preserve Windows secure credential reads and Agent Files navigation #149124. Agent Files links also retain the requested panel while the agent roster loads, with newer sidebar selections taking precedence.
Honor current tool and messaging permissions

Limited tool profiles now also restrict Codex native shell and file access, and isolated workers retain the command restrictions set by the Gateway. Keep restricted Codex sessions on a compatible managed runtime. Worker commands that need unsupported remote approvals must run locally under the configured approval policy; incompatible retained workers need recovery or reprovisioning. Workspace plugins need explicit trust before replacing configured channels.

Messaging topic changes and sends follow the configured cross-context rules, including when the source service is known but its conversation address is missing. Omitted cross-provider settings now permit otherwise allowed actions across services. Set tools.message.crossContext.allowAcrossProviders=false to preserve service isolation, and set allowWithinProvider=false as well to keep a bound conversation within its current chat. Pending sends stop before new provider requests after their caller closes, including Discord queue retries. Rejected unsent messages stay out of recovery once that rejection is saved; already dispatched messages cannot be recalled.

PDF access now follows media and OpenClaw group restrictions, so an explicit PDF allow cannot override a conflicting group deny. Narrow that deny if PDF access is intended. Doctor also stops copying LINE direct-message senders into group permissions. Review existing groupAllowFrom entries if you ran an earlier repair, since previously copied entries remain in place.

Sources and complete change list

Security and trust

  • Preserve command restrictions in isolated workers #123236. Thanks @drobison00 and @vincentkoc. Host-local command approvals and safe-bin allowances are not portable to workers, and remote approval or unsupported node/sandbox execution is not added.
  • Ignore Teams reactions outside allowed routes #143735. Thanks @pgondhi987.
  • Stop worker workspace downloads after access revocation #144640. Thanks @eleqtrizit. Worker teardown interrupts active transfers when it revokes permanent access; routine credential rotation does not cancel them.
  • Reject another agent's restored credentials #145692. Thanks @obviyus. Keep the restored database's recorded agent identity or initialize separate agent state for local embedding and media commands.
  • Apply limited profiles to Codex native execution #145694.
  • Require explicit trust for workspace channel plugins #146352. Thanks @eleqtrizit.
  • Enforce cross-context permissions for topic changes #146409. Thanks @eleqtrizit.
  • Enforce child-agent scheduling restrictions through MCP #146671. Thanks @eleqtrizit.
  • Prevent Doctor from granting unintended LINE group access #147135. Thanks @obviyus and @edenfunf.
  • Keep message lookups consistent with current session visibility #147330. Thanks @fuller-stack-dev. Reload the conversation when a replaced session returns a retryable read error.
  • Enforce cross-provider rules without a target address #147939.
  • Keep cancellation tied to current control and selected execution #149082. Older ACP tasks without execution details cannot be cancelled through the core task controls. Select the current task or use ACP session controls. Accepted stops can report cleanup still pending.
  • Stop pending message operations after their caller closes #149277. Thanks @shakkernerd.
  • Prevent rejected queued messages from sending during recovery #149370. Thanks @shakkernerd.
  • Honor Feishu account restrictions regardless of casing #149497. Thanks @eleqtrizit. Calls that previously used the wrong account can now be refused by the intended account's restrictions.

Bug fixes

  • Recognize PDF in core tool policies and diagnostics #146408. Thanks @bartok9 and @mnowrot.
  • Restore system-expert access across equivalent credential sources e2d2146. Thanks @nullarbitrage and @jalehman.

Improvements

  • Move conversation approval storage to the shared worker #150052.
Stop revoked sign-in attempts

GitHub Copilot sign-in attempts stop further guarded requests and sign-in steps when the attempt is revoked or superseded. MiniMax chat sign-in also checks current permission before subsequent token requests in both global and CN flows. These changes stop later acquisition steps; they do not revoke existing credentials or undo token requests already sent.

Sources and complete change list

Security and trust

  • Stop revoked GitHub Copilot login attempts #148999. Thanks @vincentkoc.
  • Stop MiniMax token requests after login permission revocation #149140. Thanks @masatohoshino and @obviyus.
Preserve current device credentials and revocation

Device credential handling now protects newer saved tokens from cleanup left over from an older connection. Integrations using asynchronous storage can finish saving an accepted token through disconnect or shutdown before reconnecting. Rotating or revoking a device token, or removing its device, also invalidates the corresponding retained Dashboard read access after disconnect. Disconnect alone still lets accepted work finish, and revocation cannot undo requests already sent. See device management.

Sources and complete change list

Bug fixes

  • Protect device credentials through reconnect and shutdown #150349. External integrations must honor conditional storage checks to protect newer tokens; asynchronous waiting applies to hosts that provide asynchronous storage.

Security and trust

  • Revoke retained Dashboard read access after disconnect #150811. Thanks @shakkernerd.
Keep Side chat within current conversation access

Side chat questions and cached answers now follow current conversation visibility, including private drafts in deployments with Gateway roles. Access is checked again before later embedded model requests, including requests delayed by credential or media preparation. Revoking access can stop the next request, but cannot retract context already sent to a provider.

Sources and complete change list

Security and trust

  • Apply session visibility rules to Side Chat #150703. Thanks @vincentkoc, @eleqtrizit and @1052.
  • Recheck Side Chat access before provider requests #150704. Thanks @vincentkoc and @eleqtrizit.
Protect retained conversation history

Retained conversation history continues to follow current sharing permissions after a session is deleted. Direct access to a deleted session's retained transcript now requires operator.admin; task history keeps its separate authorization rules. Recall also picks up same-size offline transcript edits after restart, archived multiline imports remain readable, and usage totals follow configured stores and known agent ownership in shared storage. Older unregistered files retain their existing accounting behavior. See session history access.

Sources and complete change list

Security and trust

  • Preserve session privacy, recall freshness and usage totals #149529. Thanks @masatohoshino.
Keep discovery preferences from enabling unwanted plugins

The discovery opt-out that OpenClaw saves for native conversations no longer produces a misleading disabled-plugin warning or, by itself, enables Codex and expands the plugin allow-list. Doctor offers manual guidance for matching historical entries, since it cannot tell whether you intended to enable the plugin. Those entries are preserved. Other activation rules still apply, including Doctor's default-model repair when no model is configured.

Sources and complete change list

Bug fixes

  • Stop warning about native conversation discovery opt-outs #148426. Thanks @zhangguiping-xydt and @liuwqgit.

Security and trust

  • Keep privacy defaults from unintentionally enabling Codex #148669. Thanks @zhangguiping-xydt.
Stop outdated webhook work after settings change

Rotating webhook credentials, changing hook policy, or disabling hooks now stops outdated pending requests before they dispatch more work. A request rejected because settings changed receives 409 and can be retried with the current route and credentials. Already accepted work remains accepted, and successful replay keeps its original result without launching duplicate work.

Sources and complete change list

Security and trust

  • Apply webhook configuration changes before dispatch #147785. Thanks @eleqtrizit.
Apply network limits to downloads and incoming webhooks

Browser download actions now follow the selected profile's destination restrictions, so downloads that previously bypassed those rules can be rejected. Nextcloud Talk and Feishu webhook listeners also limit simultaneous incomplete requests before authentication, reducing the resources those requests can hold open.

At saturation, legitimate webhook arrivals can receive a closed 429 response and may be lost. Reduce or buffer upstream concurrency where needed, and do not assume rejected deliveries will retry. The Nextcloud Talk guide explains its fixed read limit and overload behavior. Mattermost slash commands now have separate upload capacity for recognized command credentials. Preserve the original Authorization Token header through proxies; OAuth callbacks and requests with stripped headers share anonymous capacity and can be throttled, as explained in Mattermost troubleshooting.

Sources and complete change list

Security and trust

  • Limit stalled Mattermost slash-command uploads #136503. Thanks @drobison00 and @vincentkoc. Each recognized-credential pool and the shared anonymous pool permits eight concurrent admissions.
  • Enforce destination policy for browser downloads #146297. Thanks @eleqtrizit.
  • Bound Nextcloud Talk webhook reads #146356. Thanks @eleqtrizit. The fixed limit is 64 simultaneous unauthenticated reads, with earlier acknowledgements preserved before an overflow rejection closes the connection.
  • Limit concurrent unauthenticated Feishu webhook reads 04644af. Thanks @alix-007. The fixed limit is 64 simultaneous reads per account route; the default WebSocket transport is unaffected. Related proposal #137230.
Update security-sensitive dependencies

IMAP email handling updates Nodemailer for reported security advisories. The Tauri desktop app updates Rustls to reject invalid TLS 1.3 handshake sequences in its Gateway WebSocket and updater HTTPS connections, while retaining certificate and fingerprint checks.

Markdown-it also receives the upstream smartquotes denial-of-service fix for parsers with typography enabled. The proxy-addr update corrects affected Express proxy-trust matching. Downstream Express deployments using malformed mapped prefixes or cross-family trust may need correct IPv4 or mapped-prefix notation.

Sources and complete change list

Security and trust

  • Update IMAP Nodemailer security dependency #145477. Thanks @romneyda.
  • Update markdown-it for the smartquotes security advisory #148375. Thanks @romneyda.
  • Update proxy-addr to correct proxy trust matching #149013. Thanks @romneyda.
  • Patch desktop TLS handshake handling with Rustls0.23.45 #149911. Thanks @vincentkoc.
Limit access to a managed Signal connection

On POSIX hosts, a managed Signal connection can now use an optional private UNIX socket to restrict daemon access by OS user. HTTP remains the default. Follow the Signal setup guide for a distinct absolute socket path and a parent folder owned by the OpenClaw user with 0700 permissions. Socket failures do not fall back to HTTP. This option is unavailable on Windows and does not isolate processes running as the same user or administrators; Linux operators must also ensure the folder hierarchy has no ACLs granting others access.

Sources and complete change list

Security and trust

  • Offer a private socket for managed Signal daemons #143511. Thanks @eleqtrizit and @vincentkoc.
Keep Fleet actions on the selected container

Fleet start, stop, restart, removal, upgrade, and restore-recovery actions now stay tied to the container that was inspected. Reusing its name for another container no longer redirects those actions to the replacement. Initial creation and startup retain their existing behavior, and an explicitly requested data purge can still delete tenant data even when forced container removal finds nothing left to remove.

Sources and complete change list

Security and trust

  • Prevent Fleet actions from targeting reused container names #143098. Thanks @masatohoshino and @obviyus.
Replace Gateway certificates without disconnecting clients

If your Gateway serves HTTPS directly, you can replace certificate files at their existing paths without restarting listeners or disconnecting established clients. Incomplete or mismatched replacements leave the last accepted certificate in use. Turning automatic reload off pauses certificate adoption until you enable it again.

Update saved certificate pins on remote clients before reconnecting after renewal. Changing TLS enablement, certificate paths, or listener configuration still requires a restart. Each certificate and private-key file, including a certificate chain, must now fit within 64 KiB. Correct oversized files before startup or inspection; separate CA bundles retain their existing behavior. See hot reload for the supported behavior.

Sources and complete change list

Improvements

  • Renew Gateway TLS certificates without interrupting connections #146267.

Bug fixes

  • Stop TLS renewal watchers during Gateway shutdown #146412.

Limits and compatibility

  • Limit TLS certificate and key files to 64 KiB each #150534. Thanks @fuller-stack-dev and @zhanxingxin1998.
Upload files through protected network connections

File uploads through protected egress now send the correct upload length to services that require it, while retaining authorized secret substitution. This applies to uploads with a known length up to 100 MiB. Cancelling a buffered upload stops its unsent remainder, though bytes already submitted cannot be recalled.

These uploads wait until OpenClaw has collected the full body before sending. Shared capacity limits or the five-minute deadline can refuse a transfer. Larger uploads and those without a known length still send in chunks, which some destinations reject.

Sources and complete change list

Bug fixes

  • Preserve fixed-length uploads through protected egress #144902. Thanks @iwhatsskill and @vacinc.

Security and trust

  • Stop remaining buffered upload writes after cancellation #146840. Thanks @vincentkoc.
Keep WebSocket messages working through protected connections

WebSocket connections through protected egress now preserve text and binary messages during connection setup, including on Bun. Disconnecting the client cancels a pending upstream connection. Connections that fill the early-message buffer while waiting for setup are closed.

Sources and complete change list

Bug fixes

  • Preserve WebSocket messages through the secret proxy #149676.
Protect workspace files during cancellation

Cancelling during preparation can now stop pending workspace writes, edits, and directory changes, with permission checked again before the covered changes are made. Cancelled or timed-out CLI runs also lose Gateway tool access during process cleanup. Worker attachments copy within their allowed size without overwriting files from earlier turns. Cancelling before an attachment is published leaves no new destination file; attachments already published, including any replacements you later saved, stay in place. Managed worktrees also preserve supported files while rejecting source files replaced with symlinks.

Sources and complete change list

Security and trust

  • Guard canceled workspace changes and bound attachment copying #147138. Managed-worktree copies preserve source modes, supported hardlinks, large files, and literal tilde names. Backup capture avoids blocking on substituted special files, bundle checks use the admitted file's bytes, and Control UI health checks retain their file-size limit.
  • Revoke CLI tool access when a run is cancelled #149154. Thanks @shakkernerd.
Configure the approval reviewer

You can now set the approval reviewer's reasoning and optional Fast mode independently of the main agent, globally or per agent. Leaving the options unset keeps provider defaults, and existing approval checks and human fallback remain in place. The controls apply to OpenClaw's model-backed reviews, not native Codex Guardian.

Reasoning choices can affect cost, waiting time, and review quality. Fast mode requests priority processing on supported OpenAI Responses and ChatGPT/OAuth routes and may cost more; other providers may ignore it. If you enable these options, remove the new thinking and fastMode keys before downgrading to a version that does not recognize them.

Sources and complete change list

Improvements

  • Configure approval-review reasoning and Fast mode independently #147192. Thanks @vacinc.

Documentation

  • Translate approval-review settings in 20 locales #147213. Thanks @vincentkoc.
Use correctly owned FreeBSD credentials

The FreeBSD desktop now rejects Gateway token and password files owned by another user. If this affects your connection, correct the file ownership to match the account running the app or replace the credentials in Settings before reconnecting. Rejected files leave your saved settings intact.

Sources and complete change list

Security and trust

  • Require credential files to belong to the FreeBSD app user #147212. Thanks @vincentkoc and @lucarinaorg.
Use Git through protected network connections

If you use protected egress, Git commands launched by the Gateway now receive the proxy's trusted certificate bundle. This fixes the resulting HTTPS certificate error while keeping certificate verification enabled, with no new settings required.

Sources and complete change list

Bug fixes

  • Fix Git certificate trust behind the secret egress proxy #147410.
Bind client actions to the selected account

Client developers can now add selected-account checks so their apps detect when the chosen account no longer matches the signed-in profile. Already accepted work keeps its original conversation and receipt through ordinary disconnects or later account selection changes. These checks are opt-in; other requests keep their existing behavior.

If a client requires these checks, it must report when the Gateway does not support them. An account mismatch reported after an action starts does not mean the action was undone. Before retrying, check earlier acknowledgements or receipts and keep the original idempotency key, which identifies the request across retries.

Sources and complete change list

Security and trust

  • Bind Gateway actions to the selected profile #143587. Thanks @vincentkoc.

Bug fixes

  • Keep selected Codex apps available across connection ID formats #151228. Thanks @pash-openai. Matching supported identifiers refer to the same selected app; explicit denials and account authorization remain enforced.

Quality-of-Life Improvements

Everyday terminal use gains image previews and clearer feedback, while managed worktrees can share source storage across more platforms. Background history loading helps OpenClaw stay responsive while opening large conversations.

See images in compatible terminal chats

Received and generated images now appear as static previews in Ghostty, iTerm2, and Kitty, including supported images in reopened conversations and tool cards. Terminal image previews show up to four images per message and keep the 24 most recent previews. Unsupported terminals retain readable text, and previews are off by default inside tmux and GNU Screen.

Sources and complete change list

Improvements

  • Show image attachments directly in the terminal UI #146644.
Keep terminal controls and output clear

The terminal shows your remembered conversation name while startup checks finish, then confirms it or falls back to the actual session. Ctrl+C hints no longer hide an ongoing response's activity indicator. Local commands resolve relative working directories from the session workspace, keeping ~ literal and .. parent-relative.

Bash completion stops suggesting options after --. If you use a cached completion script, refresh it with openclaw completion --shell bash --write-state and reload your shell.

Sources and complete change list

Improvements

  • Format long Windows CLI tables with less work #146307.
  • Reduce copying in streamed Windows command output #147881.

Bug fixes

  • Show small token counts accurately in session listings #117517.
  • Default omitted shell-platform checks to the local host #133752. Thanks @xialonglee, @gracy769, and @patrick-erichsen.
  • Show the remembered terminal session during startup #138070. Thanks @sunnyshu0925, @patrick-erichsen, and @vyctorbrzezowski.
  • Keep transcript output free of startup notes #144579. Thanks @bruce-yii and @obviyus.
  • Keep terminal activity visible after Ctrl+C #146367.
  • Protect replacement task terminals from stale cleanup #146712. Failed task notifications can be sent on a later update.
  • Restore mid-command PowerShell suggestions #147737. Command and option-value suggestions work when editing before arguments already on the command line.
  • Resolve relative command paths from the session workspace #148162. Local working directories keep ~ literal and .. parent-relative.
  • Keep startup diagnostics clear of the CLI spinner #148506.
  • Finish database cleanup before removing temporary agent state #148674.
  • Honor plain output for log diagnostics and recovery notices #149595. Thanks @liuwqgit, @obviyus, @zhangguiping-xydt, and @holny.
  • Respect the end of options in Bash completion #149678. Thanks @zhangguiping-xydt and @obviyus.
  • Correct home-path labels for ignored overrides #149897.
  • Restore nested completion after boolean option overrides #150395. Thanks @alix-007 and @obviyus.
Share source storage across managed worktrees

Managed worktrees can now share unchanged source-file storage on eligible Linux Btrfs, macOS APFS, and Windows ReFS or Dev Drive destinations, while keeping each checkout's edits and setup independent. Sharing is selected automatically on supported destinations. Repeated APFS checkouts avoid the initial file-by-file cloning slowdown, and worktree removal saves recoverable tracked and untracked edits with less delay. Creation also checks space for the selected commit, while cleanup protects checkouts still being created, restored, or reused.

The first source template and each checkout's dependencies still need preparation. ReFS sharing can take longer than ordinary Git checkout; set worktreeAcceleration to false to opt out. Btrfs sharing requires the optional native package; unavailable or disabled native helpers use ordinary Git and its normal space checks. APFS uses ordinary Git when inherited permissions cannot be preserved or checked, and cancelling an already-started native clone waits for it to finish.

Cancelling workspace cleanup on a worker node now stops deletions that have not started and leaves those items available for a later cleanup attempt. A deletion already underway finishes and cannot be undone.

Sources and complete change list

Improvements

  • Share worktree source storage with Btrfs snapshots #146251.
  • Share managed-worktree source storage on APFS #146338.
  • Share Windows worktree storage on ReFS #146403.
  • Reduce Git queries and redundant APFS worktree waits #146722.
  • Speed worktree removal and reduce warm-clone space requirements #146723.
  • Reduce waiting for managed worktree restore and creation #146765. Saved edits are retained.
  • Reduce worktree inventory read cost #146890. Listings skip unused provisioning manifests.
  • Reduce worktree filesystem pauses and temporary extraction syncs #146906. Native Btrfs sharing works without the btrfs command, and temporary installation files skip unnecessary disk syncs.
  • Break down slow worktree cleanup timings #147379. With diagnostics and info logging enabled, slow-removal logs show stage timings after the operation settles.
  • Move project registry removal to the shared worker #148623. Removing a registry entry leaves checkout files intact.
  • Move stored project listing to the shared worker #148637.
  • Avoid duplicate template reads during worktree cleanup #148840.
  • Avoid repeated Git scans during worktree cleanup #148919.

Bug fixes

  • Speed up managed APFS worktree creation #146401.
  • Preserve inherited permissions in APFS worktrees #146586.
  • Keep workspace setup moving during background cleanup #147358. Unrelated cleanup inspection can proceed alongside preparation; shared disk allocation can still require waiting. Thanks @vacinc.
  • Stop further workspace cleanup after cancellation #147616. An already-started node deletion finishes.
  • Recover workspace preparation from transient Git failures #147692. Managed Git reads and project clones retry once after one second within the original timeout. Pushes, pulls, authentication failures, and arbitrary agent or setup commands are excluded.
  • Preserve worktree snapshots after failed deletion #147922. This also covers a state directory different from the default.
  • Preserve managed worktrees during creation and cleanup races #149914.
  • Fix worktree preparation with partial Git clones #150909.
  • Preserve refresh ownership and Windows environment settings 70b587ba.
  • Preserve Windows environment settings in project operations b5eb5895.
Choose source profiles for managed worktrees

New managed worktrees can use repository-defined source profiles to check out selected source directories. Add --source-profile <name> to openclaw worktrees create, repeating it to combine profiles. Full source remains the default, existing or restored worktrees are left as they are, and dependency installation and builds remain separate.

Source profiles use ordinary Git checkout. Enabling them can also make later full worktrees use Git instead of accelerated sharing, even after expanding the source selection, so allow extra disk space.

Sources and complete change list

Improvements

  • Choose repository-defined source profiles for new worktrees #149581. Thanks @fuller-stack-dev.
Recover managed worktree creation and cleanup

Managed worktree cleanup preserves unpublished work and retains checkouts whose branch changed or whose HEAD became detached. Use openclaw worktrees remove <id> --if-lossless to remove only eligible clean, published worktrees. Run-end cleanup uses the same non-force path.

Large ignored dependency folders and untracked directory trees no longer cause the filename-buffer overflow that prevented eligible cleanup; local edits and untracked child files remain restorable. A directory replacing a deleted file in a merge conflict can also be saved and restored, though the conflict itself still needs resolution. Existing retention rules and protection for nested repositories remain in place.

Ordinary removal still saves a recovery snapshot before forced checkout removal. --force permits snapshot loss and cannot be combined with --if-lossless. Interrupted deletion retains recovery data but may require manual reconciliation before retry or restore.

Sources and complete change list

Bug fixes

  • Allow ten minutes for managed worktree allocation #148470. Cancellation or an overall request deadline can end the wait sooner.
  • Restore idle cleanup for worktrees with large ignored directories #148608.
  • Preserve work during managed worktree cleanup #148765. Thanks @fuller-stack-dev.
  • Finish cleanup of large untracked worktree directories #151231. Git output limits still apply to large numbers of top-level entries.
  • Clean up conflicted worktrees while preserving replacement directories #151259.
Keep goal instructions and budgets intact

Goals retain multiline instructions and meaningful spacing, so a carefully written objective reaches the agent intact. Goals can also be created without a token budget, and reconfirming completion keeps the original finish time.

In the Control UI, choosing Goal with Tab, Enter, or a click opens the existing objective form, as does submitting /goal or an empty /goal start, /goal set, or /goal create command. Slashes and spacing in the objective stay literal. Empty objectives cannot be sent, and a rejected submission keeps your draft. Complete and management commands still work as text commands.

Sources and complete change list

Improvements

  • Avoid redundant session reads when managing Goals #149765. Thanks @vincentkoc.

Bug fixes

  • Preserve goal instructions and optional budgets #145041.
  • Open the Goal form from composer shortcuts and empty starters #150976. Typed creation starters open the form after a following separator. Thanks @jalehman and @vyctorbrzezowski.
Use the expected automatic clock format

Automatic clock formatting now recognizes 24-hour locales that use non-Latin digits, including Persian, so current-time and status text no longer incorrectly switch to AM/PM. Explicit 12- or 24-hour settings and operating-system preferences still take precedence over locale detection.

Sources and complete change list

Bug fixes

  • Respect 24-hour locales with non-Latin digits #147321.
Avoid repeated local processing

OpenClaw does less repeated work when preparing long conversations, showing progress, and running agents in parallel. It makes fewer temporary copies without changing the conversation content, and requests for recent history, usage, or selected agent results skip older details they do not need.

Sources and complete change list

Improvements

  • Avoid repeated copying of captured CLI output #144278.
  • Reduce repeated processing of CLI reasoning updates #144350.
  • Avoid unrelated secret reads during GitHub maintenance #144940.
  • Reduce repeated processing of streaming commentary #145149.
  • Reduce temporary allocations when preparing long conversations #145265.
  • Reduce temporary allocations during parallel agent work #145630.
  • Reduce temporary allocation in synchronous work #146035.
  • Reduce temporary allocations during agent turns #146037.
  • Use less memory for quiet BOOT.md runs #146041.
  • Reduce temporary allocation during parallel sessions #146219. The measured workload allocated less temporary data but took longer.
  • Reduce temporary allocation during parallel agent work #146344. The measured workload allocated less temporary data while peak process memory increased.
  • Use faster hashing for file verification #146581. Shared hashing helpers use larger file reads. Faster large-file verification uses more memory.
  • Avoid unused parsing when saving assistant replies #146858. Code-heavy replies skip unnecessary delivery-instruction parsing.
  • Reduce work for small history and usage reads #147205.
  • Reduce repeated work when matching saved chat messages #147210.
  • Reduce provider-summary work in agent listings #147518.
  • Avoid duplicate CLI metadata snapshots #147861. One CLI plugin-metadata operation avoids duplicate database copies; the next operation sees newer changes. Thanks @pfrederiksen.
  • Batch stale usage-summary cleanup #147998. Concurrent updates and retention rules are preserved; small cleanups can take longer.
  • Reduce delays after whole-file writes #148132. Thanks @pollybot13 and @fuller-stack-dev.
  • Avoid an extra copy for single-frame node messages #148468.
  • Reuse timezone validation while preparing reply context #148492.
  • Reduce repeated UTC history formatting work #148648.
  • Reduce structured logging CPU overhead #148813.
  • Reduce repeated timestamp work during logging bursts #148867.
  • Reduce temporary allocation during log redaction #149225.
  • Reduce redaction work for ordinary structured logs #149329.

Bug fixes

  • Reduce Gateway stalls when reading retained subagent runs #147209. Chat polling, session updates, and waits for selected agents avoid loading old task and result bodies.
Inspect saved QA Lab results

QA Lab keeps repeated attempts available for inspection and downloads the log belonging to the selected result. Earlier failures remain visible after retries. Recognized file formats determine the preview, so a descriptive label containing a word such as “gif” no longer hides a log or misidentifies a JSON file.

External tools that read only v2 QA evidence need upgrading for newly produced v3 files. OpenClaw's bundled readers continue to accept historical v2 results.

Sources and complete change list

Improvements

  • Retain QA attempts and select exact evidence #147756. Thanks @vincentkoc and @romneyda.

Bug fixes

  • Fix Bun UI builds and development refresh prompts #144345. Thanks @vincentkoc.
  • Match QA previews to file formats #145612.
  • Reject blank scenario filters in dedicated QA commands #146345.
  • Stop surviving Linux QA worker threads #147386. Thanks @vincentkoc.
  • Distinguish unavailable Linux QA memory from zero #147407. Thanks @vincentkoc.
  • Preserve text previews for path-like QA labels #147545. Thanks @romneyda.
Run more conversations at once

Installations using the default concurrency limit can run more independent conversations while others wait for model or tool responses. The default now allows four main agent runs per available CPU, with at least eight slots—32 on an eight-CPU host and 192 on a 48-CPU host. Each conversation still runs one turn at a time, and subagent and scheduled-job limits remain separate.

More simultaneous turns can use more memory and put more pressure on providers. Existing agents.defaults.maxConcurrent settings still take precedence. Set a lower explicit limit for a constrained machine or resource-heavy work.

Sources and complete change list

Improvements

  • Allow more simultaneous sessions by default #147423.
Keep the Gateway responsive during history loads

Opening large conversations or loading history in several clients leaves the Gateway more time to respond to controls and other requests. Saved-history preparation now runs in the background, with session and access checks before history is shown. If the background reader is busy, unavailable, or times out, you receive an error and can retry.

The tradeoff is more memory use and potentially longer waits for history. The warm background worker added about 270 MiB in the reported four-CPU Linux test. First reads can be slower, including after the worker shuts down while idle, and separate requests can use more CPU. Even small history pages can occasionally take longer to load.

Opening the branch list in a large saved conversation also uses a separate background worker, leaving the Gateway available for other requests. Incognito branch lists stay local. In a separate synthetic test, this worker added about 105 MiB of process memory and took about 0.42 seconds for its first request. On Node, cold conversation-list scans also move off the Gateway thread, with possible extra startup time and memory use.

History pages with a byte limit and context preparation for large messages also do less unnecessary work. Small, empty, and full-page reads can still take longer.

Sources and complete change list

Improvements

  • Prepare conversation history away from the Gateway main thread #147363. Thanks @datrab.
  • Keep Gateway responsive while listing branches #147649. Stored-conversation branch order, selection, and contents are preserved.
  • Reduce first-use chat history latency #148382.
  • Reduce code loaded for cold history and profile reads #148427.
  • Reduce cold session-history child lookup work #148775.
  • Reduce temporary allocation when paging marker-heavy history #148833.
  • Reduce pauses during subagent completion checks #148914.
  • Reduce repeated chat-history database opening #148972.
  • Avoid duplicate fixed-store discovery during history loading #148985.
  • Reduce repeated work when loading session history #150186.
  • Reduce unnecessary work when loading history and context #150481. Thanks @datrab.
  • Reuse history readers across agents #150519. Retained readers use additional open file handles and close when the whole history worker retires after 30 idle minutes.
  • Reduce repeated work during live history updates #151194. The reported multi-minute Gateway stalls remain unresolved. Thanks @datrab.
  • Move conversation-list reads off the Gateway thread 9ab47386. Also preserve extension custom TypeBox format validation alongside the built runtime. Bun and incognito list-reading paths remain unchanged.
  • Reduce unnecessary work in byte-limited history and large-message context reads #151240. Very large message-count context reads showed no consistent gain. Thanks @datrab.

Bug fixes

  • Avoid slow history reads after database analysis #148057. Sparse conversation-history markers avoid unnecessary scans without a new index or user action.
  • Keep other requests responsive during large session reads #148818.
  • Reduce Gateway pauses while listing sessions #149466.

Other Bug Fixes

Interrupted conversations and delegated tasks get more ways to finish from saved work, while explicit Stop requests remain cancelled.

Subagent results and recovery

Ordinary subagents can use completed tool results before pausing. When they resume and finish, the parent conversation can continue with their complete retained answers. Larger answers use more of the parent's context, and results removed by retention fall back to a marked, shortened copy. Later parent turns can find retained child results still awaiting delivery or continuation. A child you explicitly stop stays cancelled. If the parent finishes its work but misses a required channel reply, the result stays blocked for explicit retry or dismissal instead of automatically repeating its tools. Check completed actions before retrying.

Newly accepted native Codex child results can also support restart recovery of a still-owed parent channel reply without rerunning the child. This requires a recorded accepted completion and a supported outbound channel route. Control UI, route-less, remote-worker, and never-admitted completions are outside this recovery path. Update the Gateway and Codex plugin together, and finish pending recovery before downgrading.

In OpenClaw's built-in agent runtime, the system expert can now answer even when only one ordinary agent is allowed to run at a time. Cancelling the parent task can still leave queued expert work able to start. If a subagent was already paused before upgrading, send it a follow-up to resume it. Abandoned tasks cleared by maintenance follow the existing retention rules. Downgrading does not restore their earlier status or records already removed by retention. To return to an older binary, restore a verified pre-update backup into fresh state.

Sources and complete change list

Improvements

  • Skip archive readers for sessions without archives #149506.

Bug fixes

  • Prevent repeated tools after a missing completion reply #85308. Thanks @dolencluka, @fuller-stack-dev.
  • Recognize completed work after progress narration #90864. Thanks @moeedahmed, @smfworks, @fuller-stack-dev.
  • Keep completed subagent work available to later turns #112623. Thanks @ericcaiwx-star, @fuller-stack-dev, eric.
  • Correct orphaned subagent status after restart #126322. Thanks @vladimirkrdzic, @fuller-stack-dev, @vacinc.
  • Keep yielded parent conversations intact across sibling completions #141602. Thanks @ylcn91, @jalehman, @mrclawfield.
  • Clear stale subagent activity after restart cleanup #146248. Thanks @vacinc.
  • Preserve original callers for queued Swarm tasks #146490.
  • Read current subagent completion and protect replacements #146542. An unreadable session can still interrupt the completion sweep for healthy siblings.
  • Protect reset subagent sessions from old cleanup retries #146565. Reset can fail while completion settles or protection cannot be saved; saved protection remains if a later reset step fails.
  • Recover paused subagents and show their parent hierarchy #146667.
  • Keep explicitly stopped child runs canceled #146711.
  • Restore structured results for CLI-backed Swarm collectors #146715. Thanks @etzelm, @vacinc, @potterdigital. Collectors must submit valid data through the required result tool and no longer receive sessions_yield, ask_user, or sessions_send.
  • Finish yielded collectors so waiting callers receive results #146716. Thanks @etzelm, @vacinc, @potterdigital. Missing required output still returns an error; previously stranded records are not recovered.
  • Avoid redundant chat refreshes and repair task recovery #146736.
  • Complete system-expert requests at concurrency one #147596. Thanks @obviyus, @ekinnee, @maulu5.
  • Preserve follow-through after private subagent completion #149073. Thanks @vacinc.
  • Avoid duplicate replies after native Codex waits #149104.
  • Resume yielded tasks after slow Gateway admission #149208. Thanks @kvnloo.
  • Deliver complete subagent answers to waiting parents #149223. Thanks @obviyus, @aleps001, @kvnloo.
  • Finish yielded tasks and identify failed child sessions #149261.
  • Deliver child results after background media generation #149368. Thanks @obviyus, @adamamzalag.
  • Check subagent fork limits against current conversation context #149666.
  • Prevent stale subagent notifications from failing chats #149863. Thanks @fuller-stack-dev.
  • Preserve follow-through and cancellation after private subagent batches #150065. Thanks @vacinc.
  • Recover accepted Codex child results after restart 6caadad. Thanks @fuller-stack-dev. Changed ownership, cancellation, changed task outcomes, and intervening human input block stale replay. Matrix also rechecks permission before later events and redirects, preserving already accepted events; relay cleanup retains incomplete-output errors.
Interrupted conversations and late replies

After a restart, eligible unfinished conversations can continue from saved tool work without repeating your original message or discarding its results. Eligible tasks in the built-in runtime can also keep working when their tools have finished but the model times out, or when a known Responses output limit interrupts a tool call. Cancellation, pending approvals, unfinished tool work, and retry limits still apply. Messages arriving too late to join the current answer get their own follow-up reply. ACP background tasks that finish before cancellation takes effect keep their completed result and end time.

When prompted, recover interrupted work before sending new input, and check uncertain tool outcomes before repeating an action. New messages can wait as follow-ups while recovery handles the earlier task. Acknowledged worker cleanup failures now block automatic model fallback from repeating completed actions. Cleanup does not undo earlier desktop input, so inspect the desktop and workspace before retrying.

Recovery from an overfull conversation now leaves archived turns and reset markers in their original history instead of copying them into new entries. This prevents new duplication; it does not remove duplicates already stored.

Sources and complete change list

Improvements

  • Protect session resets with an expected session identity #123864. Thanks @pollybot13, @patrick-erichsen.
  • Show when interrupted conversations resume after restart #141797. Thanks @vacinc.
  • Avoid unrelated session reads during recovery #148032. Thanks @vincentkoc.

Bug fixes

  • Stop surviving Linux subprocesses after cancellation #117151. Thanks @miorbnli, @fuller-stack-dev.
  • Unblock later messages when an agent turn stalls #123055. Thanks @romneyda.
  • Preserve replies to messages arriving after final delivery #129001. Thanks @finn763, @obviyus, @andersonjeccel.
  • Deliver child replies that match the empty placeholder #130647. Thanks @zeroaltitude, @obviyus.
  • Preserve background-task results after late cancellation #144949. Thanks @gabrielnkl, @obviyus.
  • Explain tasks that finish during cancellation #145111. Thanks @obviyus, @gabrielnkl.
  • Honor retry waits beyond timer limits #145718. Thanks @alix-007, @altaywtf.
  • Resume interrupted turns after tool activity #146487.
  • Preserve cancellation and recover interrupted conversations #146792. Thanks @desksk.
  • Preserve cross-agent replies after configuration reload #146799. Thanks @zachisfine, @vincentkoc, @davidcittadini.
  • Finish chat-history repairs before session cleanup #146842.
  • Prevent archived-history duplication during overflow recovery #147202. Thanks @vacinc.
  • Resume unfinished tasks after tools finish and the model times out #147203. Thanks @vacinc.
  • Show pending chats and a single recovery notice #147362.
  • Resume interrupted work before new messages #147486.
  • Keep current instructions and tool results after replay cleanup #147531. Thanks @obviyus, @masterswords1, @fray-ai, @mertbasar0.
  • Stop fallback for closed turns and preserve reply ownership #149518. Thanks @mertbasar0, @jalehman, @travellingsoldier85.
  • Preserve intentional silence after successful agent actions #149642. Thanks @sjf-oa, @sjf.
  • Prevent duplicate user turns during context-engine startup #149690. Thanks @marvinthebored, @peetiegonzalez.
  • Resume tasks after output-limited tool calls #149844.
  • Preserve answers to follow-up messages during a run #149925. Thanks @obviyus.
  • Distinguish saved tool activity from conversation and completed replies #150415. Thanks @romneyda.
  • Avoid duplicate answers after silent tool continuations #150539. Thanks @jalehman.
  • Remove failed reply fragments after recovery #150645. Thanks @obviyus.
  • Keep transcript errors local and show recovery guidance #150882. Thanks @donniefi, @spiral-cmd.
  • Preserve worker cleanup failures without replaying completed actions 83c1767. Thanks @fuller-stack-dev.
Answer and correct an agent's questions

If you answer only part of an agent's multi-part question, the chat now explains what needs correcting and keeps the question open. Send a complete answer using the question numbers or IDs. Authorized plain-text answers can reach the waiting run, save its tool result, and let it continue without waiting for the asking turn to finish. Partial answers are not saved as accepted answers.

Sources and complete change list

Bug fixes

  • Explain incomplete answers instead of dropping them #146646. Thanks @dasx, @obviyus, @amittell, @galshir.
  • Unblock question responses while the asking turn waits #149498. Thanks @obviyus, @amittell.
  • Resume waiting agents after saved question answers #149617. Thanks @obviyus, @hustfreefly.
Respect intentional conversational silence

An ordinary conversation can end quietly when the assistant deliberately chooses no text reply after a failed read, such as a rate-limited thread lookup. OpenClaw no longer adds a generic tool warning in that case. Unanswered requests, failed or unclassified changes, scheduled jobs, heartbeats, and aborted runs keep their failure reporting, and silence for an earlier message cannot hide a later failure.

Sources and complete change list

Bug fixes

  • Preserve deliberate silence after read failures #151042. Thanks @pash-openai.
Run and finish commands with clear results

Completed host commands now clean up their retained child processes before reporting completion, reducing process buildup during long-running sessions. This changes shell backgrounding. Children started with & stop when the root command finishes. For work that should continue across turns, use background: true with the long-running command as the root, then collect its result through process. Background command guidance explains the lifetime; sandbox lifetimes remain controlled by the sandbox backend.

Linux Gateways running on Node use a small command-launch helper to avoid launching covered commands from the large Gateway process, including Git requests over its WebSocket connection. If the helper cannot start initially, that Gateway process keeps direct launching. Later helper loss fails affected commands without rerunning them. Queued launches can still outlast approval revocation, and a failed search launch can leave grep waiting. File-limit errors now retain their original diagnosis and allow later commands after resource pressure clears; the failed command is not retried automatically.

Sources and complete change list

Improvements

  • Reduce large-Gateway command-launch pauses on Linux #150564.

Bug fixes

  • Reject extra empty CLI arguments #145468.
  • Preserve command output during Bun stalls #145564.
  • Restore supervised interactive commands under Bun #145749. Non-Windows Bun sessions use the existing Node helper. Deferred startup still has authorization and cleanup gaps, so cancellation during startup may not prevent command effects or establish completed cleanup.
  • Clarify invalid working directories under Bun #145852.
  • Contain child cleanup failures and preserve diagnostic stacks #150427. Thanks @itanyplus, @waynegault, @chachi-max, @kip-claw.
  • Preserve launch errors and recovery under file limits #150975.
  • Avoid direct Git launches from Gateway WebSocket requests #151040.
  • Bundle shell parser assets for paired-node sessions 1b9e8d0.

Limits and compatibility

  • Clean up child processes after host commands finish #150750. Thanks @php737, @terrencehinds99, @flowzito, @michaeljgood71, @kgerman-ar, @jmmoncada95.
Busy Gateway responsiveness and diagnostics

The Gateway can handle network traffic between queued session writes instead of waiting for the entire backlog. When a connection stalls during setup, the error now identifies the target and suggests a status check, giving you a clearer place to start troubleshooting. A full request queue shows a plain busy message; wait briefly, then retry your action.

Plugin authors using worker pools should handle overload errors from the new queue limits. Rejected work is not retried automatically; check that the original request is still authorized and within its deadline before retrying. These limits cover queued work and reported input sizes, not total process memory.

Sources and complete change list

Improvements

  • Reduce overhead when tracking completed runs #145988.
  • Avoid repeated HTTP client module resolution #146133.
  • Reduce CPU work when formatting WebSocket logs #150042.
  • Reduce audit event persistence overhead #150243.
  • Clean up expired tool-event recipients while idle 894643f.

Bug fixes

  • Release transcript context after completed writes #141181. Thanks @ooooo9x, @orangejon, @jalehman.
  • Release completed caller state from idle workers #145605.
  • Release ended attempts when reply delivery stalls #146034.
  • Bound concurrent compute work and queued inputs #146067.
  • Release SQLite handles after state shutdown on Windows #146160.
  • Keep Gateway I/O responsive during queued writes #146491.
  • Recognize stalled Gateway connections as transport timeouts #146508.
  • Coordinate diagnostic recording with session writes #146563.
  • Reduce pauses during trajectory history cleanup #146639.
  • Keep task-list scans responsive during registry reloads #146661.
  • Explain when the Gateway is busy and users should retry #146872.
  • Reduce turn preparation delays under load #147231.
  • Preserve slow-consumer disconnect reasons #147707. Thanks @sunnyshu0925, @vincentkoc, @aniruddhaadak80.
  • Bound device-required probe cache retention #147708. Thanks @sunnyshu0925, @aniruddhaadak80.
  • Cancel large command backlogs without repeated scans #148754. Thanks @vincentkoc.
  • Serialize Gateway connection admission 62507cc. Thanks @romneyda.
Bun worker connections and plugin setup

Bundled Canvas and Voice Call configuration updates work again on the affected Bun setup path. Bun workers also keep their Gateway connection options and handle failed output without triggering an extra error. Bun also gets fixes for sessions, provider connections, and streamed Discord requests. Skill edits use polling by default under Bun, while explicit CHOKIDAR_USEPOLLING settings still take precedence. A temporary database lock no longer blocks Gateway startup on the affected Bun 1.4.0 path.

Some operations still require Node. The worker, provider, and Discord compatibility fixes were tested with custom Bun builds; stock Bun 1.4.2 lacks a required SQLite fix and still has Slack interoperability limits. They do not establish complete support for that stock runtime.

Sources and complete change list

Bug fixes

  • Propagate cancellation to Bun response streams #145598.
  • Avoid connection resets on Bun HTTP rejections #145736.
  • Fix Bun worker connections and failed-output handling #146008.
  • Restore bundled plugin migrations under Bun #146060.
  • Improve Bun tooling and Gateway connection compatibility #146807. Node-owned child operations still require Node. In the Bun host-command wrapper, unterminated stderr can still hide a timeout marker and turn a catchable timeout into process exit.
  • Fix remaining Bun session and connection compatibility gaps #147085. Bundled channel schemas beyond 256 levels raise an error; external schemas remain available unchanged to their validator.
  • Repair Bun Discord forwarding and Nostr URL handling #147360.
  • Restore Codex history in Bun source runs #147408.
  • Restore Bun browser and plugin networking #147421. This covers browser relay/CDP, Slack proxy, Reef, Codex, the shared Mattermost adapter, and Nextcloud Talk stopping during startup. Qualifying managed Codex JavaScript launches use Bun without Node on the child PATH. Plugin authors gain the typed public openclaw/plugin-sdk/websocket-runtime adapter.
  • Use Bun's native loader for TypeScript source workers #148272.
  • Fix Bun skill watching and retained plugin contexts #150655.
  • Release snapshot locks that block Gateway startup under Bun #151269. This fixes the affected Bun 1.4.0 snapshot-release failure without configuration or database-schema changes.

Maintainer and Internal Changes

The 1,623 maintainer and internal changes cover development, testing, and release work. Open a topic below for its complete change list.

Maintain focused regression coverage

Regression tests have less repeated setup and more coverage of the code that runs in production, including resource ownership during queued conversation compaction.

Sources and complete change list

Improvements

  • Test caption ordering and tool-only Responses replies #120789.
  • Compact terminal command-handler test tables #143933. Thanks @romneyda.
  • Simplify Feishu action test tables #143934. Thanks @romneyda.
  • Compact terminal session-action tests #143935. Thanks @romneyda.
  • Compact provider-error regression tables #143936. Thanks @romneyda.
  • Test committed conversation recovery after forced termination #143984. Thanks @vincentkoc.
  • Reuse platform test fixtures #144141.
  • Share browser dictation fixtures #144157.
  • Remove a duplicate billing-error test #144170. Thanks @vincentkoc.
  • Share provider fixtures in plugin validation tests #144174.
  • Move staged Doctor coverage to package installation tests #144185.
  • Share embedding-batch test inputs #144188.
  • Remove a duplicate provider-routing test #144194. Thanks @vincentkoc.
  • Consolidate QA raw-capture test fixtures #144201.
  • Reuse Twilio send-test account fixtures #144211.
  • Remove a duplicate OpenAI attribution test #144225. Thanks @vincentkoc.
  • Share MiniMax HTTP test assertions #144249.
  • Simplify stored-goal command fixtures #144260.
  • Share New Session agent fixtures #144261.
  • Remove duplicate Doctor fallback-notice coverage #144264. Thanks @vincentkoc.
  • Reuse startup test promise fixtures #144273.
  • Share supervised-thread request fixtures #144274.
  • Avoid plugin discovery in a model-override test #144287.
  • Test Claude replacement refusal after cleanup failure #144289. Thanks @zeroaltitude, @fuller-stack-dev.
  • Share Buzz relay test setup #144297.
  • Share Matrix verification test setup #144300.
  • Simplify LM Studio JSON test responses #144301.
  • Remove a duplicate cron delivery test #144303. Thanks @vincentkoc.
  • Share OAuth fallback fixtures #144309.
  • Test UI asset discovery with real files #144335.
  • Remove duplicate Codex ready-status coverage #144339. Thanks @vincentkoc.
  • Remove a duplicate chat silent-reply test #144382. Thanks @vincentkoc.
  • Reuse cron history test element helper #144418. Thanks @vincentkoc.
  • Remove duplicate Mac wake-word gate tests #144437. Thanks @vincentkoc.
  • Consolidate duplicate package-acceptance tests #144446.
  • Shared worker-abandonment test setup #144461.
  • Shared pending plugin-claim test fixtures #144472.
  • Shared Swift chat test messages #144481. Thanks @vincentkoc.
  • Reuse Telegram delivery receipt test defaults #144485.
  • Align provider fixtures in authentication tests #144492.
  • Shared empty task summaries for status tests #144505.
  • Simplify embedding batch response fixtures #144506.
  • Shared Bedrock test configuration fixtures #144509.
  • Reuse Full Access delegation test setup #144510.
  • Simplify keyed FIFO test fixtures #144517.
  • Reuse Android reflection test helpers #144528. Thanks @vincentkoc.
  • Simplify Microsoft Teams Graph test fixtures #144550.
  • Remove a duplicate provider-stream smoke test #144570.
  • Consolidate model authentication and catalog tests #144589. Thanks @obviyus.
  • Reduce repeated work in worker artifact tests #144623.
  • Remove unused temporary-directory test bookkeeping #144628. Thanks @vincentkoc.
  • Reuse Feishu bot-menu test fixtures #144658. Thanks @vincentkoc.
  • Test terminal picker selection through Enter callbacks #144716.
  • Reuse shared assertions in skills CLI tests #144724.
  • Reuse shared response fixtures in Vydra speech tests #144741.
  • Share checkout-authentication test launchers #144771.
  • Simplify single-use chat request fixtures #144775.
  • Simplify Cron submission test fixtures #144781.
  • Reuse Model Providers test helpers #144805. Thanks @vincentkoc.
  • Remove test-only web-fetch cache reset #144820.
  • Share Docker test container cleanup #144826. Thanks @vincentkoc.
  • Test URL normalization through the public web-fetch tool #144887.
  • Make macOS Gateway readiness tests deterministic #144920. Thanks @vincentkoc.
  • Reuse typed PixVerse authentication fixtures #144926.
  • Reuse shared field assertions in command tests #144955.
  • Reuse shared runtime fixtures in model-status tests #144989.
  • Align Workboard backend tests with SQLite storage #144999.
  • Share runtime fixtures in provider authentication tests #145049.
  • Check macOS readiness lifecycle instead of test elapsed time #145056. Thanks @vincentkoc.
  • Type command-test mocks at construction #145097.
  • Share Workboard Gateway test registration setup #145106.
  • Split Gateway installation and reinstallation tests #145113.
  • Reuse promise helpers in plugin lifecycle tests #145130.
  • Remove unused ACP startup test defaults #145135.
  • Remove redundant setup wizard test defaults #145146.
  • Reuse runtime fixtures in status tests #145178.
  • Remove unused node approval test setup #145185.
  • Test model authentication through image selection #145233.
  • Reduce waiting in Gateway connection tests #145239.
  • Avoid repeated worker builds in cache tests #145243.
  • Reuse empty session stores in ACPX tests #145246.
  • Share setup across compaction safeguard tests #145247.
  • Reuse compiled modules in native update tests #145251.
  • Share temporary Git environments across script tests #145259.
  • Remove test-only media cache resets #145268.
  • Share UI command test assertions #145269.
  • Consolidate documentation translation recovery tests #145273.
  • Reuse shared defaults in agent-turn tests #145281.
  • Reuse deferred helpers in ACPX lifecycle tests #145283.
  • Simplify Chrome MCP test synchronization #145286.
  • Share sidebar narration test setup #145304.
  • Reuse marketplace archive test manifests #145310.
  • Reuse storage fixtures in update-report tests #145315.
  • Shared labeled ACP test sessions #145324.
  • Shared Mattermost monitor test setup #145326.
  • Shared runtime fixtures in backup tests #145350.
  • Shared installer Git reference fixtures #145368.
  • Simplify Bonjour regression fixtures #145383. Thanks @vincentkoc.
  • Shared Devices CLI field assertions #145387.
  • Shared Custodian healthy-response fixtures #145393.
  • Shared Comfy JSON response fixtures #145399.
  • Reuse outbound channel test imports #145404.
  • Shared Signal event-stream runtime spies #145407.
  • Remove obsolete test-helper registrations #145442.
  • Share Android composer request interception #145493.
  • Share installer Git recovery fixtures #145511.
  • Share completions-stream fixtures #145515.
  • Share workspace media fixtures #145544.
  • Share WhatsApp heartbeat sender fixtures #145549.
  • Remove obsolete update-repair test hook #145556.
  • Consolidate UTF-16 slicing tests #145570.
  • Share Doctor service repair fixtures #145584.
  • Reuse updater test runtimes #145596.
  • Consolidate heartbeat cooldown tests #145624.
  • Share Buzz runtime spies #145626.
  • Consolidate Meet admission fixtures #145631.
  • Separate response-usage tests #145633. Thanks @romneyda, @ylcn91.
  • Share idle chat-history fixtures #145645.
  • Share configuration test runtimes #145654.
  • Share Discord REST runtime mocks #145662.
  • Simplify Gateway event test tables #145666. Thanks @romneyda.
  • Compact WhatsApp media test cases #145667. Thanks @romneyda.
  • Simplify restart-recovery test matrix #145668. Thanks @romneyda.
  • Compact OpenResponses HTTP test tables #145669. Thanks @romneyda.
  • Reuse CLI test runtime factory #145717.
  • Remove duplicate response-usage test #145728.
  • Use direct database cleanup in tests #145731.
  • Share CLI preparation configuration fixtures #145743.
  • Reduce updater signal-test startup work #145757.
  • Keep wizard test selector private #145784.
  • Share state database test setup #145796.
  • Share QA streaming request fixtures #145806.
  • Compact package acceptance matrices #145832. Thanks @romneyda.
  • Compact chat-view test matrices #145833. Thanks @romneyda.
  • Simplify message-tool test matrices #145834. Thanks @romneyda.
  • Compact Talk relay test matrices #145835. Thanks @romneyda.
  • Share task command runtime fixtures #145841.
  • Share tool-call promotion stream fixtures #145857.
  • Avoid real waits in update notice tests #145858.
  • Share agent attempt stream fixtures #145880.
  • Share docs command runtime fixture #145922.
  • Share Telegram media test fixtures #145925.
  • Share Dashboard runtime fixtures #145936.
  • Shorten Meet recovery fixture wait #145944.
  • Share plugin-include test fixtures #145960.
  • Remove CLI session-loader test override #145961.
  • Move media fixture routing into tests #145964.
  • Remove browser snapshot test wait #145971.
  • Share trigger-test environment restoration #145973.
  • Share Nextcloud Talk test fixtures #145977.
  • Share Doctor diagnostic fixtures #145982.
  • Share imported-page test fixtures #146021.
  • Test the CI reopen delay with virtual time #146024.
  • Share the trajectory export test runtime #146056.
  • Make provider tests portable across Node and Bun #146103.
  • Simplify ClickClack setup verification tests #146105.
  • Speed up long-history yield test setup #146141.
  • Include child output in update test failures #146154.
  • Consolidate terminal text-preservation tests #146208.
  • Reuse token-usage fixtures in agent tests #146240.
  • Speed up Nextcloud Talk stalled-response tests #146260.
  • Reuse typed runtimes in channel command tests #146316.
  • Simplify JSON response fixtures in provider tests #146334.
  • Consolidate media generation lifecycle tests #146335.
  • Consolidate bundled-plugin source loading in tests #146360.
  • Share Teams and Zoom meeting test contracts #146379.
  • Simplify JSON response fixtures in channel tests #146398.
  • Share native channel approval test fixtures #146414.
  • Share plugin-bound reply test fixtures #146451.
  • Remove redundant plugin host-hook tests #146452.
  • Share standalone installer test contracts #146454.
  • Share HTTP assistant streaming test fixtures #146455.
  • Test TLS renewal cleanup during Gateway shutdown #146504.
  • Shorten the Tailscale startup-timeout test #146520.
  • Share outbound message-action test fixtures #146522.
  • Share allow-always approval test fixtures #146523.
  • Share Google video provider test fixtures #146524.
  • Share OpenAI video provider test fixtures #146525.
  • Share configuration-form browser test fixtures #146527.
  • Share agents-list test output fixtures #146558.
  • Reuse typed runtimes in health and readiness tests #146559.
  • Strengthen compaction provider registration tests #146576.
  • Share OpenRouter video test fixtures #146579.
  • Share image and transcription provider test fixtures #146608.
  • Share transcript test message and storage helpers #146614.
  • Share local-model test configuration setup #146621.
  • Consolidate model fallback coordination tests #146634.
  • Reuse shared runtimes in WhatsApp tests #146635.
  • Reuse message and model fixtures in tests #146642.
  • Share plugin loader test fixture wrappers #146647.
  • Share Telegram test state setup #146649.
  • Share deferred-promise helpers across UI tests #146670.
  • Share update smoke-test readiness checks #146694. Thanks @vincentkoc.
  • Reuse API-key credential fixtures in tests #146699.
  • Test quota recovery during model catalog refresh #146708.
  • Reuse runtime spies in LINE webhook tests #146710.
  • Reuse temporary-directory cleanup in ClawHub tests #146731.
  • Simplify JSON response fixtures in tests #146758.
  • Share context-engine test setup #146759.
  • Share repeated CI sweeper test setup #146764.
  • Share the desktop integration-test socket reader #146766.
  • Share Parallels smoke-test agent scripts #146768.
  • Simplify duplicate checks in agent tests #146774.
  • Share browser-page cleanup across UI layout tests #146805.
  • Share authentication-store setup across tests #146808.
  • Reuse deferred Promise helpers in Gateway tests #146809.
  • Remove redundant casts in WhatsApp logout tests #146826.
  • Share repeated heartbeat test configurations #146853.
  • Consolidate session-resolution tests #146895.
  • Reuse the plugin fixture shell runner #146920.
  • Reuse model-fallback configuration test fixtures #146948.
  • Reuse shared model fixtures in Responses transport tests #147015.
  • Remove a duplicate extension test-runner check #147022. Thanks @vincentkoc.
  • Share Gateway fixtures in channel controller tests #147048.
  • Reuse runtime fixtures in session and transport tests #147056.
  • Reuse Android chat identity test fixtures #147059.
  • Test status recovery guidance through command output #147071.
  • Reuse Comfy provider test fixtures #147086. Thanks @vincentkoc.
  • Call PDF extraction directly in runtime tests #147122. Thanks @vincentkoc.
  • Reuse shared field helpers in Wear OS tests #147162. Thanks @vincentkoc.
  • Reuse the CLI plugin test fixture writer #147186. Thanks @vincentkoc.
  • Skip unused compiler setup in routing tests #147194.
  • Remove Doctor sandbox test hooks #147214.
  • Share plugin cleanup test server setup #147225. Thanks @vincentkoc.
  • Reduce idle waiting in account catalog login tests #147228.
  • Reuse the panel-tab drag test fixture #147250.
  • Reuse session fixtures in memory-maintenance tests #147262.
  • Remove a duplicate Teams quoted-table test #147270. Thanks @vincentkoc.
  • Reuse the macOS Dashboard test gate #147310. Thanks @vincentkoc.
  • Verify restart recovery without recurring heartbeats #147313. Thanks @fuller-stack-dev.
  • Reuse promise fixtures in server preference tests #147332.
  • Share migration and ACP test fixtures #147354.
  • Remove redundant Markdown newline checks #147367. Thanks @vincentkoc.
  • Test cancellation across Gateway replacement #147382. Thanks @fuller-stack-dev.
  • Share Discord avatar test promise fixtures #147412.
  • Remove a redundant Android chat-reader test #147424. Thanks @vincentkoc.
  • Remove obsolete compatibility test comparisons #147469. Thanks @vincentkoc.
  • Narrow channel contract test imports #147487.
  • Simplify Android recap tests #147500. Thanks @vincentkoc.
  • Share plugin registry test setup #147506.
  • Remove real waits from connection-timeout tests #147523.
  • Retire obsolete plugin dependency smoke test #147555. Thanks @vincentkoc.
  • Share wizard deferred promises #147564.
  • Reuse reload-policy plugin fixtures #147577.
  • Reuse inline-action test defaults #147580.
  • Report icon decoding tests separately #147613. Thanks @vincentkoc.
  • Compact subagent policy test tables #147638. Thanks @romneyda.
  • Compact Gateway test tables #147639. Thanks @romneyda.
  • Compact QA policy tables #147640. Thanks @romneyda.
  • Compact reply-command policy tables #147641. Thanks @romneyda.
  • Reuse session-list promise fixtures #147643.
  • Simplify tooling tests and failure diagnostics #147662.
  • Remove duplicate rollback test #147735. Thanks @vincentkoc.
  • Test private completion reads after reopening storage #147788. Thanks @vincentkoc.
  • Share inline skill-dispatch fixtures #147813.
  • Simplify FreeBSD recovery tests #147818. Thanks @vincentkoc.
  • Compact embedded-agent admission matrices #147853. Thanks @romneyda.
  • Simplify node and fleet test matrices #147854. Thanks @romneyda.
  • Simplify Discord lifecycle tables #147855. Thanks @romneyda.
  • Compact agent lifecycle tables #147856. Thanks @romneyda.
  • Test onboarding credentials through setup #147872.
  • Extend declaration-pool regression coverage #147889. Thanks @vincentkoc.
  • Share iMessage and Signal installer fixtures #147894.
  • Reuse approval notification cleanup #147928. Thanks @vincentkoc.
  • Avoid repeated npm discovery in tests #147953.
  • Simplify reply-runtime test tables #147978. Thanks @romneyda.
  • Simplify OpenAI transport test matrices #147979. Thanks @romneyda.
  • Simplify update lifecycle matrices #147980. Thanks @romneyda.
  • Simplify runtime environment tables #147981. Thanks @romneyda.
  • Test approval prompts through shared parser #147985. Thanks @vincentkoc.
  • Split transcript geometry tests #148030. Thanks @vincentkoc.
  • Share command-test runtime fixtures #148113.
  • Reuse compiled ledgers in managed-update tests #148136.
  • Reuse compiled modules in update custody tests #148171.
  • Reuse compiled SQLite backends in plugin tests #148180.
  • Reduce database ownership test setup time #148223.
  • Share Gateway watch-exit test fixtures #148237.
  • Reuse skills watcher cleanup directly in tests #148252.
  • Simplify Android media playback test fixtures #148258. Thanks @vincentkoc.
  • Reuse compiled fixtures in update lease tests #148281.
  • Reuse compiled Doctor preflight in startup tests #148330.
  • Remove duplicate IRC emoji-chunking coverage #148380. Thanks @vincentkoc.
  • Remove redundant Parallels test assertions #148394.
  • Remove a duplicate Synology Chat TLS-options test #148439. Thanks @vincentkoc.
  • Reuse prepared plugins in startup compatibility tests #148465.
  • Remove duplicate tool-only Responses recovery tests #148476. Thanks @vincentkoc.
  • Reuse Telegram deferred test fixtures #148501.
  • Remove duplicate Firecrawl HTTPS acceptance coverage #148519. Thanks @vincentkoc.
  • Remove duplicate compaction HTTP timeout coverage #148554. Thanks @vincentkoc.
  • Remove redundant SDK export checks #148579.
  • Reuse shared runtime fixtures in agent-exec tests #148598.
  • Reuse shared reply-dispatch test context defaults #148621.
  • Reuse compiled modules in managed-repair tests #148626.
  • Remove redundant Parallel response-parsing coverage #148633. Thanks @vincentkoc.
  • Share and strengthen SQLite checks in configuration tests #148662.
  • Reuse compiled SQLite readers in legacy finalization tests #148678.
  • Simplify message-action test tables #148687. Thanks @romneyda.
  • Compact reply usage and credential-dispatch test tables #148688. Thanks @romneyda.
  • Simplify Matrix mention test fixtures #148689. Thanks @romneyda.
  • Compact docs mirror freshness test scenarios #148690. Thanks @romneyda.
  • Remove redundant Hugging Face retired-model coverage #148698. Thanks @vincentkoc.
  • Reuse shared runtime fixtures in Google Chat tests #148699.
  • Test browser sign-in through a real Gateway #148758. Thanks @obviyus.
  • Remove duplicate prompt relocation tests #148761. Thanks @vincentkoc.
  • Remove duplicate Venice discovery fallback coverage #148779. Thanks @vincentkoc.
  • Remove duplicate Xiaomi onboarding test work #148802. Thanks @vincentkoc.
  • Reuse macOS onboarding test sessions #148806.
  • Remove unused transport setup from parameter tests #148844. Thanks @vincentkoc.
  • Reuse prepared runtime in pristine Doctor tests #148858.
  • Consolidate terminal QR regression coverage #148931. Thanks @krasimirkralev.
  • Consolidate reasoning-mode utility tests #148932.
  • Remove duplicate streamed tool-call completion tests #148986. Thanks @vincentkoc.
  • Compile legacy updater fixtures once per test invocation #149008.
  • Seed overdue job state directly in the cron regression #149017.
  • Cover database cleanup and child cancellation boundaries #149031.
  • Compact Plugin SDK network-safety test tables #149042. Thanks @romneyda.
  • Simplify config audit redaction test tables #149043. Thanks @romneyda.
  • Compact QA evidence classification tests #149044. Thanks @romneyda.
  • Compact xAI provider test matrices #149045. Thanks @romneyda.
  • Reuse immutable CI planner test fixtures #149148.
  • Reuse compiled CLI in Doctor workspace tests #149163.
  • Strengthen compaction instruction and retry tests #149177. Thanks @kvnloo.
  • Remove duplicate Kimi onboarding assertion #149190. Thanks @vincentkoc.
  • Remove duplicate memory CLI success controls #149227.
  • Remove duplicate streaming usage-parser tests #149244. Thanks @vincentkoc.
  • Remove obsolete session-memory file-recovery tests #149338.
  • Remove duplicate Codex terminal-inventory fixture case #149349.
  • Use byte comparisons in updater snapshot assertions #149350.
  • Remove duplicate LM Studio test assertion #149356. Thanks @vincentkoc.
  • Reduce compilation work in stale-worker tests #149410.
  • Unblock managed-update fixture lint #149423.
  • Share managed-service handoff test helpers #149427.
  • Verify cron allowlists with both live runtimes #149489.
  • Assert Feishu comment links directly through the parser #149493.
  • Reuse Gateway fixtures in history query tests #149504.
  • Simplify context-engine and plugin-tool fixtures #149515.
  • Remove redundant Z.ai reasoning predicate test #149544. Thanks @vincentkoc.
  • Shorten Gateway spawn fallback tests #149613. Thanks @romneyda.
  • Remove redundant bundled-plugin tests #149623.
  • Remove redundant agent and Gateway tests #149624.
  • Remove duplicate DeepSeek model-limit assertions #149636. Thanks @vincentkoc.
  • Simplify the OpenAI WebSocket test fixture #149681. Thanks @vincentkoc.
  • Retain cached database access regression tests #149687.
  • Reduce setup and deadline costs in Gateway and agent tests #149729.
  • Remove duplicate Synthetic onboarding assertions #149732. Thanks @vincentkoc.
  • Reduce storage byte-preservation test overhead #149825.
  • Remove duplicate retry-classification test examples #149828. Thanks @vincentkoc.
  • Remove a duplicate Kilo catalog-membership test #149856. Thanks @vincentkoc.
  • Avoid unused imports in service-handoff test fixtures #149860.
  • Remove duplicate Tencent and Cohere test checks #149888. Thanks @vincentkoc.
  • Remove a timing-sensitive systemd deadline test #149898. Thanks @vincentkoc.
  • Remove redundant home-path test setup #149938. Thanks @vincentkoc.
  • Remove a redundant Vercel thinking-profile check #149969. Thanks @vincentkoc.
  • Reduce cold setup work in reply-admission tests #149977.
  • Reuse deferred gates in session accessor tests #149986.
  • Defer auth-writer loading for empty test fixtures #149991.
  • Remove redundant time-formatting and Azure test fixtures #150009. Thanks @vincentkoc.
  • Remove a redundant Deepgram audio test assertion #150050. Thanks @vincentkoc.
  • Avoid loading the configuration reader in test fixtures #150058.
  • Remove a duplicate formatter UTF-8 regression test #150084. Thanks @vincentkoc.
  • Remove duplicate infrastructure tests #150100.
  • Remove a duplicate Slack thread-participation test #150109. Thanks @vincentkoc.
  • Reuse the shared task-maintenance test runtime #150116.
  • Remove an unused repeat option from HTTP test support #150131. Thanks @vincentkoc.
  • Remove the duplicate OC Path fixture round-trip test #150155. Thanks @vincentkoc.
  • Avoid unused plugins in placement recovery tests #150170.
  • Remove a redundant provider quota assertion #150176. Thanks @vincentkoc.
  • Avoid repeated Doctor setup in Workshop backup tests #150197.
  • Remove unused web-output test fixture modes #150207. Thanks @vincentkoc.
  • Remove unnecessary diagnostic reads from setup tests #150208.
  • Remove a duplicate audio transcript formatting test #150232. Thanks @vincentkoc.
  • Remove unused Rust lifecycle fixtures and a duplicate UTF-8 test #150282. Thanks @vincentkoc.
  • Stabilize process ownership test names across runs #150284.
  • Remove unused GitHub query handlers from script fixtures #150327. Thanks @vincentkoc.
  • Reduce Doctor memory-test fixture work #150340.
  • Test warning-only lint across entry points #150352.
  • Remove unused graceful SDK test cleanup #150377. Thanks @vincentkoc.
  • Share configuration-recovery test runtime #150379.
  • Remove duplicate DeepInfra WebM test #150409. Thanks @vincentkoc.
  • Batch Git metadata reads in sparse-isolation tests #150431.
  • Speed updater preview signal tests with prepared runtime #150439.
  • Test deferred preview text without changing active language #150465.
  • Simplify OpenRouter music test streams #150495. Thanks @vincentkoc.
  • Reuse compiled modules in Doctor tests #150502.
  • Share UI storage-failure test fixtures #150505.
  • Remove unused worker test fixture modes #150557. Thanks @vincentkoc.
  • Remove duplicate Ollama embedding normalization test #150604. Thanks @vincentkoc.
  • Reuse shared deferred fixtures in Matrix tests #150697.
  • Reuse shared browser lifecycle fixtures #150765.
  • Reuse shared request URL helper in Mattermost tests #150830.
  • Reduce repeated agent test fixture setup #150835.
  • Reuse shared JSON responses in provider catalog tests #150886.
  • Reduce Gateway integration-test setup costs #150888.
  • Precompile plugin retention test subprocesses #150951.
  • Build portable-worker fixtures once per test file #150972.
  • Remove repeated onboarding from local-agent tests #151031. Thanks @romneyda.
  • Restore Slack reply-thread integration coverage at core owner #151086. Thanks @pash-openai.
  • Restore Slack thread regression coverage in core tests #151090.
  • Reuse plugin lifecycle timing fixtures #151115.

Bug fixes

  • Complete interrupted ACPX fixture turns correctly #137049. Thanks @vincentkoc.
  • Isolate IPv6 portal tests from ephemeral listeners #137722.
  • Keep OpenRouter cleanup tests past request setup #144178.
  • Clean up port-test listeners and report skips #144197.
  • Test production ownership during queued compaction #144217.
  • Test session cleanup against real writer queues #144247.
  • Isolate task-cancellation test notifications #144330.
  • Test Twitch targets with real utilities #144386.
  • Stabilize paginated-history eviction testing #144419.
  • Exercise real IRC utilities in send tests #144425.
  • Update provider tests for plugin roots #144450.
  • Clean up singleton fixtures after failed tests #144489.
  • Isolate update CLI test state #144513.
  • Stabilize plugin-settings tests during reconnects #144605.
  • Wait for rendered Android connection status in tests #144682. Thanks @obviyus.
  • Clean up heartbeat fixtures after storage setup failures #144686.
  • Correct session-link tests for loaded chat styles #144690.
  • Refresh dashboard test events before timeout #144710.
  • Restore memory search fallback test coverage #144761.
  • Avoid fixture port collisions in MCP OAuth tests #145060. Thanks @vincentkoc.
  • Keep Node-specific tests working under Bun #145064.
  • Restore core lint by simplifying daemon-install tests #145115.
  • Isolate plugin loader fallback tests #145374. Thanks @fuller-stack-dev.
  • Settle interrupted speech tests before fixture reset #145406.
  • Stabilize native relay deadline tests #145421. Thanks @shakkernerd.
  • Remove host timing from health snapshot tests #145432.
  • Repair New Session test screenshots #145463.
  • Run Bun terminal tests through the runtime adapter #145473.
  • Align custom-provider setup regression tests #145500. Thanks @romneyda.
  • Verify worker profiles in SDK tests #145508. Thanks @romneyda.
  • Complete model catalog mocks for status tests #145512. Thanks @romneyda.
  • Repair New Session screenshot capture #145540.
  • Split thinking tests to restore lint #145632.
  • Initialize readers before worker launch tests #145657.
  • Select Node for Node test fixtures #145674.
  • Compile model-context workers for tests #145708.
  • Make context and transcription tests portable #145715.
  • Prevent loaded-host worker test timeouts #145770.
  • Wait for hook relay test readiness #145771.
  • Load TypeScript in Node retention fixtures #145774.
  • Repair incomplete plugin test manifests #145794.
  • Restore Bun worker fault-injection tests #145822.
  • Retry failed script-test cleanup #145861.
  • Preserve isolation after temporary-home failures #145876.
  • Prevent environment leakage between tests #145879.
  • Fail validation when reload RPC stays unavailable #145966.
  • Correct the unchanged plugin-update test target #145991.
  • Prevent false passing results after test timeouts #145999.
  • Wait for inline widget controls in browser tests #146664. Thanks @fuller-stack-dev.
  • Wait for avatar imports in forwarded-message tests #146729. Thanks @vincentkoc.
  • Wait for quiet scrolling before measuring composer rendering #146836.
  • Correct scripted arguments in the Telegram emoji test #146848. Thanks @fuller-stack-dev, @vincentkoc.
  • Restore sidebar scope tests after helper migration #146862.
  • Isolate installer and Docker tests from shell profiles #146897.
  • Keep temporary test homes private under group-writable umasks #146931.
  • Stabilize concurrent settings-save tests #146949. Thanks @vincentkoc.
  • Make systemd clock tests independent of host permissions #146990.
  • Restore isolated plugin runtime tests #147000.
  • Restore session deletion and memory-write regression coverage #147028. Thanks @vincentkoc.
  • Prevent false settings-lock test timeouts #147029.
  • Restore OAuth recovery tests after registry changes #147045. Thanks @vincentkoc.
  • Fix Codex subagent live-test setup and lifecycle #147079.
  • Prepare Doctor refusal test workers before deadlines #147082.
  • Isolate timing-history tests from inherited settings #147112.
  • Accept remaining timeout budget in systemd tests #147117. Thanks @vincentkoc.
  • Stabilize Models catalog picker tests #147215. Thanks @vincentkoc.
  • Preserve open-ended pricing in live-test setup #147339. Thanks @vincentkoc.
  • Correct OpenShell environment-validation test expectations #147348. Thanks @vincentkoc.
  • Repair Linux service-ownership test setup #147398. Thanks @vincentkoc.
  • Wait for model-picker readiness in tests #147489. Thanks @romneyda.
  • Stabilize Reef scan test timestamps #147551.
  • Repair native routing and typography checks #147598. Thanks @vincentkoc.
  • Synchronize Composer test readiness #147606. Thanks @vincentkoc.
  • Stabilize progress-animation tests #147623.
  • Handle model restrictions in terminal auth tests #147729. Thanks @romneyda.
  • Restore normal Bun smoke status timeout #147774.
  • Stabilize retained child-result fixtures #147784. Thanks @shakkernerd.
  • Keep cancelled Gateway tests attached to cleanup #147844. Thanks @vincentkoc.
  • Wait for Workboard test writes #147950. Thanks @romneyda.
  • Retire workers before extension test cleanup #147986.
  • Stabilize cold terminal-opening tests #147990.
  • Align CLI test subprocess runtime flags #148038.
  • Synchronize post-login model catalog tests #148107. Thanks @obviyus.
  • Keep scanner timeout fixtures alive #148125.
  • Correct the ClawHub sweep test expectation #148129.
  • Align process lifecycle test expectations #148149. Thanks @romneyda.
  • Keep cron cooldown fixture incidents distinct #148151. Thanks @romneyda.
  • Restore session race tests on Node 26 #148182.
  • Wait for complete Workboard sweeps in timer tests #148221.
  • Use the shared response timeout in Gateway abort tests #148254.
  • Await resumed playback acknowledgment in Discord tests #148268.
  • Stabilize model catalog scope integration checks #148293.
  • Retry temporary-directory cleanup in Windows Canvas tests #148352. Thanks @romneyda, @vincentkoc.
  • Check diagnostic environment values across runtimes #148371.
  • Make Control UI tests portable across Node and Bun #148401.
  • Remove stale exit listeners during test cleanup #148404.
  • Wait for descendant readiness in Parallels timeout tests #148410.
  • Check Windows launcher arguments without full process snapshots #148433.
  • Restore Custodian session-recovery test coverage #148444.
  • Stabilize configuration include revision tests #148499. Thanks @shakkernerd.
  • Restore plugin directory lookup test coverage #148509.
  • Give TUI terminal tests an isolated configuration #148571.
  • Wait for child readiness in boundary watchdog tests #148587. Thanks @vincentkoc.
  • Publish native updater test signals atomically #148591.
  • Finish database cleanup before deleting watcher test files #148606.
  • Exercise exhausted retries in the cron idle-timeout proof #148617. Thanks @jalehman, @ylcn91, @philippmuller.
  • Isolate manual plugin reload tests from filesystem notifications #148618.
  • Wait for worker previews in chat-cap tests #148628. Thanks @fuller-stack-dev.
  • Align Gateway end-to-end tests with current behavior #148653. Thanks @vincentkoc.
  • Drain database workers before removing test state #148666.
  • Select the correct request in Codex delivery-cache tests #148675. Thanks @vincentkoc.
  • Fix memory-lock repair test isolation on Windows #148695.
  • Allow legitimate status polls in launchd restoration tests #148710.
  • Wait for database shutdown before cleaning test fixtures #148734.
  • Wait for SQLite workers before cleaning test fixtures #148742.
  • Finish config test database work before cleanup #148743.
  • Wait for failed Cron completion in regression tests #148749. Thanks @vincentkoc, @holny.
  • Keep database writers alive in crash-recovery tests #148759.
  • Stabilize CI fixtures and narrow Claude helper imports #148769. Thanks @vincentkoc, @fuller-stack-dev.
  • Select Node for pnpm dependency test fixtures #148776.
  • Make nested cleanup tests independent of terminal attachment #148792.
  • Preserve repeat counts and isolated recovery test sessions #148810.
  • Drain session test resources before database cleanup #148849. Thanks @vincentkoc.
  • Make Kitchen Sink tests portable across Node and Bun #148891.
  • Accept Bun error labels in plugin assertion tests #148955.
  • Prevent memory exhaustion in full Gateway-core tests #148971.
  • Synchronize permission browser-test fixtures #148977. Thanks @vincentkoc.
  • Align Copilot registry expectations with existing metadata #148981. Thanks @vincentkoc, @finn763.
  • Remove polling sensitivity from ACPX startup tests #148989.
  • Align model and image fixtures with runtime auth reads #149004. Thanks @vincentkoc.
  • Isolate catalog publication tests from startup scheduling #149020. Thanks @vincentkoc, @fuller-stack-dev.
  • Refresh setup tests and guard read-only auth fixtures #149023.
  • Wait for setup test database workers before cleanup #149027.
  • Align Models tests with readiness and account status #149035.
  • Restore auth fixtures for thinking-route tests #149049. Thanks @vincentkoc, @fuller-stack-dev.
  • Wait for background-task test recovery to complete #149056.
  • Exercise TUI session replacement at cleanup boundary #149076.
  • Wait for cron completion before checking test results #149088. Thanks @romneyda.
  • Remove startup polling race from CUA transport tests #149092.
  • Make infrastructure tests portable across Node and Bun #149098.
  • Await SQLite worker cleanup between fixtures #149127.
  • Match archive Undo test counting to its refresh query #149135.
  • Use compatible Bash for Linux workflow tests on macOS #149152.
  • Restore QA evidence fixtures that simulate Bun #149164.
  • Isolate the subagent test model catalog #149179.
  • Restrict raw-byte filename fixtures to Linux #149197.
  • Wait for model entry in recursive-spawn tests #149199. Thanks @vincentkoc.
  • Make infrastructure subprocess fixtures work under Bun #149250.
  • Await worker shutdown in Doctor read-only tests #149252.
  • Repair repository identity fixtures in PR tests #149294.
  • Repair Codex model-attribution test fixture #149301.
  • Repair Windows compiled-worker test fixtures #149403.
  • Wait for published cron results in tests #149412.
  • Limit Telegram fixtures to tests that need them #149434.
  • Stabilize Codex turn-completion regression tests #149435.
  • Stabilize Active Memory recovery tests #149443.
  • Remove runtime assumptions from Bun test fixtures #149473.
  • Remove duplicate dependency setup from PR alias tests #149477. Thanks @fuller-stack-dev, @vincentkoc.
  • Restore dependencies in PR alias test fixtures #149481.
  • Restore PR alias fixture setup with overlap accounted #149488.
  • Stabilize transcript shutdown tests under load #149523.
  • Stabilize worktree cancellation test readiness #149531.
  • Avoid false native session-refresh test timeouts #149532.
  • Stabilize yielded-session and dependency fixtures #149558. Thanks @vincentkoc.
  • Isolate Windows updater tests from Bun host detection #149560.
  • Synchronize task-list visibility revocation tests #149632. Thanks @vincentkoc.
  • Preserve dependency links during repeated PR test setup #149638.
  • Prevent macOS workflow-test shell hangs #149641.
  • Control timing in the Active Memory zero-hit recall test #149661.
  • Isolate cancelled Gateway placement tests #149668. Thanks @fuller-stack-dev, @obviyus.
  • Make runtime test fixtures portable to Bun #149699.
  • Wait for editor module loading in the file-tab test #149715. Thanks @vincentkoc.
  • Restore extension test-packing fixture checks #149726. Thanks @vincentkoc.
  • Wait for settled settings in the native verbosity test #149736. Thanks @vincentkoc.
  • Stabilize systemd clock-step regression tests #149742. Thanks @vincentkoc.
  • Accept runtime preparation for already-serial CI jobs #149762.
  • Stabilize catalog, CLI process and worker-build tests #149766.
  • Test the Mantis resolver's selected candidate directly #149814.
  • Wait for session adoption in Android archive tests #149830. Thanks @vincentkoc.
  • Keep Gateway shutdown tests on native timers #149835.
  • Remove unintended timer eligibility from on-exit cron tests #149841. Thanks @vincentkoc.
  • Wait for model startup to finish in the browser test #149862.
  • Restore late-added test environment variables #149883.
  • Finish relay test cleanup after setup failures #149885.
  • Wait for completed subagent cancellation in refresh tests #149890.
  • Stabilize the chat footer keyboard-focus test #149919.
  • Prevent iMessage receipt-recovery test deadlocks #149945.
  • Repair reconnect browser-test session fixtures #149957.
  • Wait for conversation navigation in queued-correction tests #149972.
  • Stabilize sandbox file-descriptor cleanup verification #149974.
  • Wait for desktop viewer readiness before resize tests #149975.
  • Wait for descendant readiness in the timeout-drain test #149995.
  • Synchronize Stop tests with the child completion observer #149998.
  • Avoid cold-import timeouts in iMessage rendering tests #150005.
  • Prepare metadata before Moonshot and Qwen catalog tests #150017.
  • Close SQLite connections before removing test fixtures #150022.
  • Correct memory index regression test observation #150025.
  • Select Node for Node-dependent fixtures under Bun #150056.
  • Fix memory-forget test measurements on newer Node #150090.
  • Synchronize Telegram coalescing tests with dispatch #150093.
  • Measure memory-search responsiveness separately from maintenance #150098.
  • Release held catalog responses promptly in quota tests #150115.
  • Stabilize table expansion in browser history tests #150120.
  • Match quota-recovery observations to the primary request #150145.
  • Correct Activity test snapshots after completed work #150168.
  • Wait for MCP App imports before chat test cleanup #150206.
  • Isolate memory annotation performance regression tests #150260.
  • Repair captured dependencies in plugin validation #150347. Thanks @vincentkoc, @romneyda.
  • Allow harmless discovery variation in Codex auth tests #150362. Thanks @romneyda.
  • Restore skill bundle byte-budget regression #150419. Thanks @fuller-stack-dev.
  • Align plugin tests with existing behavior #150485. Thanks @romneyda.
  • Avoid concurrent mock OpenAI port conflicts #150492. Thanks @shakkernerd.
  • Stabilize Qwen video deadline tests #150523.
  • Keep test readiness probes within startup deadlines #150559.
  • Prevent Windows test fixture cleanup stalls #150568.
  • Use native paths in Windows workspace tests #150585.
  • Correct startup delivery-queue test timing #150631. Thanks @obviyus.
  • Reserve Gateway test ports throughout startup #150642.
  • Make Google response-deadline tests deterministic #150663.
  • Close Doctor test databases before fixture cleanup #150676.
  • Restore Slack Socket Mode test typechecking #150678. Thanks @romneyda.
  • Stabilize Gateway startup scheduling tests #150689.
  • Await MCP question test cleanup directly #150690.
  • Preserve callback binding in UI test harnesses #150727. Thanks @romneyda.
  • Close Doctor test handles before Windows cleanup #150771.
  • Stabilize monitor cancellation tests under load #150789.
  • Match spawn-broker tests to Node runtime #150804.
  • Remove external DNS dependence from SMS retry tests #150814.
  • Make database-state tests portable across Bun and Node #150821.
  • Align steering tests with current skip wording #150852. Thanks @romneyda.
  • Correct plugin update authority fixtures #150853. Thanks @romneyda, @vincentkoc.
  • Accept portable missing-module diagnostics in tooling tests #150860.
  • Repair Doctor and channel-setup test fixtures #150861. Thanks @romneyda, @vincentkoc.
  • Close MCP sessions owned by private-memory tests #150874. Thanks @vincentkoc.
  • Stabilize MCP catalog recovery test timing #150887.
  • Keep guided onboarding tests on fresh setup path #150897. Thanks @romneyda.
  • Scope MCP cleanup assertions to the owned test session #150910. Thanks @romneyda.
  • Fix competing cleanup in session reclamation tests #150928. Thanks @romneyda.
  • Finish transcript reconciliation before test cleanup #150947. Thanks @shakkernerd.
  • Prevent Bash spill-test startup timeouts #150971.
  • Prevent cold-initialization timeouts in image tests #150979.
  • Make healthy restart-probe tests deterministic #150985.
  • Use system Bash in macOS workflow fixtures #150990.
  • Accept durable replay in output-limit tests #150999. Thanks @romneyda.
  • Wait for accepted catalog renewal in freshness tests #151005.
  • Avoid macOS Bash hangs in installer version tests #151014.
  • Wait for catalog publication in integration tests #151018.
  • Prevent false plugin-retention test failures #151026.
  • Make readiness deadline tests deterministic #151027.
  • Complete silent-answer test fixture #151062.
  • Run preflight import tests with Node under Bun #151077.
  • Remove Slack test import blocking CI #151080.
  • Initialize synthetic child streams in process tests #151096.
  • Repair Codex app-server timeout test helpers #151101. Thanks @romneyda.
  • Observe checkpoint warnings through logging sink #151104.
  • Await explicit connection readiness in tests #151122.
  • Match browser fixtures to pagination windows #151148.
  • Release voice-call test workers during cleanup #151187.
  • Wait for broker cleanup before process-death assertions #151195.
  • Run native review tests with Node under Bun #151220.
  • Isolate verifier tests without skipping broad selections 66fe933e.
  • Prevent false streaming render-budget failures 9e6026a9.
  • Wait for saved delegation replies before checking tool activity in UI tests #151209.

Documentation

  • Remove redundant Bonjour test headers #146981.
Consolidate internal ownership and helpers

Shared helpers consolidate repeated implementation, including preparation and resource handoff for image, music, and video generation.

Sources and complete change list

Improvements

  • Keep session storage independent of agent runtime loading #140733. Thanks @vincentkoc.
  • Remove an unused runtime-event prompt path #143314. Thanks @zackmsa777-a11y, @obviyus, @petercheng, @dasx.
  • Separate lightweight transcript-reading helpers #143494. Thanks @vincentkoc.
  • Load worker execution code only when needed #143496. Thanks @vincentkoc.
  • Defer heartbeat execution loading until a wake #143499. Thanks @vincentkoc.
  • Defer cron loading in Gateway reload handlers #143500. Thanks @vincentkoc.
  • Reuse manifest planning for model choices #143502. Thanks @vincentkoc.
  • Reuse prepared channel setup options #143540.
  • Share workspace character-limit resolution #144102. Thanks @vincentkoc.
  • Remove redundant audio and reply directive wrappers #144106.
  • Simplify subagent transcript handling #144166.
  • Consolidate cloud-worker settings and snapshot helpers #144167.
  • Share automation outcome handling #144196.
  • Share Mac connect credential selection #144214. Thanks @vincentkoc.
  • Remove the unused iMessage echo cache mirror #144215.
  • Share resource cleanup for side questions #144220.
  • Reuse shared lifecycle control in Memory panel #144228.
  • Reuse prepared plugin metadata #144230.
  • Remove unused pending-message subscription state #144234.
  • Share chat extraction cache logic #144244. Thanks @vincentkoc.
  • Remove unused setup mutation inputs #144267.
  • Share image-provider request construction #144285.
  • Reduce temporary provider-policy lookup allocations #144290.
  • Defer Teams inline image decoding #144296.
  • Reuse the model catalog identity index #144305.
  • Avoid repeated completion command registration #144311.
  • Remove unused onboarding catalog validation #144321.
  • Share Google image-provider metadata #144323.
  • Remove an obsolete updater stop path #144328.
  • Remove unused ignore-matcher compatibility #144340.
  • Remove superseded catalog and onboarding helpers #144342. Thanks @obviyus.
  • Reuse completed chat transcript indexes #144343.
  • Skip repeated normalization for cached plugin records #144362.
  • Limit unnecessary iMessage content collection #144365.
  • Remove ineffective Tailscale application search #144376.
  • Reduce source-mode update repair imports #144379.
  • Keep usage caches private and share implementation #144433.
  • Remove redundant device-event forwarding #144434.
  • Simplify Discord action dependencies #144441.
  • Remove unused follow-up and logging state #144445.
  • Share HTML export tree layout #144449.
  • Share Google media-understanding metadata #144457.
  • Remove unused Discord model-picker layout code #144496.
  • Prepare progress-card storage for asynchronous operations #144529.
  • Consolidate login tests and Models helpers #144533. Thanks @obviyus.
  • Reduce sidebar indexing and restore the UI bundle budget #144538.
  • Remove unused background authentication caching #144560.
  • Share model catalog preparation across lists and pickers #144563. Thanks @obviyus.
  • Remove unused documentation translation test support #144580. Thanks @vincentkoc.
  • Reuse prepared authentication facts for model status #144588. Thanks @obviyus.
  • Share collapsible Markdown parsing rules #144590.
  • Separate task publication from flow persistence #144593.
  • Prepare caller-controlled admission for GitHub reads #144595.
  • Remove duplicate Bedrock model classification #144634.
  • Await heartbeat storage and context claims #144635.
  • Simplify sidebar session tree calculations #144642.
  • Await workspace storage while preserving operation ownership #144645.
  • Finish accepted Team Reports database work before shutdown #144646.
  • Reuse prepared model information in status summaries #144648.
  • Simplify QA Lab and Memory Core command dispatch #144650.
  • Await memory provenance storage operations #144663.
  • Await Logbook storage and drain accepted work #144666.
  • Share Model Setup and plugin icon loading #144673.
  • Await task reads before media and prompt preparation #144674.
  • Simplify Memory Wiki Obsidian command discovery #144731.
  • Separate Control UI startup styles and Dreaming text #144737. Thanks @vyctorbrzezowski, @fuller-stack-dev, @onlyysaurabh.
  • Await Copilot token cache operations #144810.
  • Share Android discovery TLS flag parsing #144816. Thanks @vincentkoc.
  • Await Board storage while preserving current permissions #144817.
  • Await memory journal operations and preserve event ordering #144824.
  • Wait for Codex hook setup and cleanup #144828.
  • Await storage work for event-triggered reminders #144832.
  • Share Matrix reply fallback delivery #144840. Thanks @vincentkoc.
  • Share device-pairing list assembly #144847. Thanks @vincentkoc.
  • Share the Apple localization catalog reader #144848. Thanks @vincentkoc.
  • Await workspace discovery and configuration readiness #144854.
  • Share Copilot transcript user-text comparison #144888. Thanks @vincentkoc.
  • Simplify development CLI child-process listeners #144929.
  • Avoid unnecessary session reads for wakes and chat parents #144935.
  • Share Matrix context-cache insertion logic #144939. Thanks @vincentkoc.
  • Share CLI parse-error rendering #144948.
  • Centralize WhatsApp plugin wiring #144957.
  • Simplify Responses endpoint classifications #144962.
  • Centralize CLI progress cleanup #144981.
  • Separate task-flow record transformations #144983.
  • Share provider tool-schema traversal #144985. Thanks @vincentkoc.
  • Separate subagent registration records from lifecycle handling #144988.
  • Open existing SQLite worker stores without creating databases #145030.
  • Prepare Voice Call for asynchronous record storage #145047.
  • Open repository-workspace storage only when needed #145048.
  • Simplify chat welcome setup-action ownership #145077. Thanks @obviyus.
  • Simplify goal state handling #145125.
  • Remove obsolete terminal translation records #145144.
  • Consolidate terminal note wrapping #145155.
  • Await memory search and index cleanup #145159.
  • Separate plugin-state queries from database lifecycle #145163.
  • Keep approval preparation within hook relay lifetime #145164.
  • Remove unused node-host preparation inputs #145165.
  • Avoid repeating failed frontmatter parsing #145177.
  • Reuse shared JSON extraction in setup planning #145186.
  • Consolidate memory source indexing within its database owner #145207.
  • Remove the retired Discord QA serializer #145211.
  • Reduce allocations in repeated plugin directory lookups #145226.
  • Reduce repeated setup in zoned date parsing #145231.
  • Remove unused Tlon image-storage code #145234.
  • Reuse provider policies while building model catalogs #145257.
  • Avoid unused collections in Tailscale address lookup #145263.
  • Avoid unused session and tool-event copies #145271.
  • Reuse browser-tab selection during chat rendering #145275.
  • Reuse command metadata for shell completion caches #145279.
  • Reuse the Policy diagnostic finding builder #145314.
  • Prepare backup history access for asynchronous storage #145353.
  • Remove retired session statistics internals #145354.
  • Consolidate static credential secret collection #145359.
  • Share media generation failure cleanup #145361.
  • Skip preparation of discarded assistant answers #145364.
  • Consolidate Discord administration command setup #145389.
  • Await Slack presence cooldown storage #145392.
  • Await Telegram sticker cache operations #145398.
  • Reduce long health-message formatting work #145401.
  • Remove redundant Mac Canvas and permission checks #145411.
  • Avoid duplicate tool-schema definition collection #145425.
  • Share hovercard keyboard handling #145434.
  • Reduce repeated plugin API path construction #145443.
  • Consolidate database upgrade and deletion checks #145475.
  • Avoid repeated transcript export size scans #145495.
  • Share ACP session metadata readers #145498.
  • Remove obsolete environment-picker styling #145513.
  • Remove redundant touch-details cursor CSS #145516. Thanks @romneyda.
  • Remove obsolete logging test configuration hook #145519.
  • Share settings navigation grouping #145526.
  • Remove unused manual Bash session layer #145566.
  • Remove obsolete plugin page styles #145586.
  • Simplify realtime voice support code #145599.
  • Consolidate Google provider lazy loading #145614.
  • Reduce repeated final-reply history scans #145618.
  • Share assistant display-text extraction #145642.
  • Share catalog icon-request management #145644.
  • Share Mac process timeout observation #145651.
  • Separate task storage from connection ownership #145652.
  • Share Voice Call history encoding #145661.
  • Avoid redundant pending-message identity work #145663.
  • Reduce repeated plugin-state query work #145677.
  • Skip unused voice-wake ownership reads #145695.
  • Skip unused Slack reply scans #145701.
  • Consolidate failure-report receipt writes #145704. Thanks @romneyda.
  • Derive sign-in metadata from manifests #145707. Thanks @romneyda.
  • Reuse task and flow read queries #145716.
  • Share Buzz directory filtering #145763.
  • Consolidate native browser title updates #145769.
  • Consolidate plugin startup planning #145791.
  • Remove unused internal Tailscale status fields #145801.
  • Simplify container runtime selection #145814.
  • Reduce repeated plugin diagnostic scans #145815.
  • Reduce repeated network-result processing #145818.
  • Consolidate heartbeat response selection #145830.
  • Remove unused plugin-test factories #145844.
  • Reuse board read queries #145849.
  • Share home-directory resolution #145866. Thanks @romneyda.
  • Share installation policy sequencing #145868. Thanks @romneyda.
  • Share provider setup option handling #145869. Thanks @romneyda.
  • Simplify abort waits and test native cleanup #145877.
  • Reuse CLI plugin eligibility preparation #145896.
  • Stop development scans at missing plugin output #145898.
  • Reuse heartbeat timezone formatters #145900.
  • Centralize Gateway client readiness #145901.
  • Share model prefix normalization #145910.
  • Simplify usage session discovery #145912.
  • Reuse model matches in provider lookup #145914.
  • Avoid provider metadata copies #145921.
  • Register Android Plugins string resource #145924.
  • Remove unused session model cycling #145934.
  • Limit session people-filter sorting #145941.
  • Simplify channel media-limit resolution #145943.
  • Share Gateway connection lifecycle #145950. Thanks @vincentkoc.
  • Separate SQLite broker and client lifecycle #145958.
  • Share people-card keyboard handling #145967.
  • Separate board database operations #145969.
  • Remove retired Nostr translation entries #145990.
  • Separate admission claims from database handles #146015.
  • Share plugin discovery while loading build configuration #146042.
  • Remove unused intermediate skill status records #146061.
  • Simplify plugin reload lifecycle code and tests #146072.
  • Consolidate Matrix inbound media and context handling #146099.
  • Share media-generation preparation and resource handoff #146106.
  • Simplify chat send state and test fixtures #146149.
  • Simplify internal node status aggregation #146159.
  • Share automation CLI integer validation #146203.
  • Reuse PowerShell completion choice text #146270.
  • Remove redundant streamed JSON recovery #146272.
  • Simplify reclaimed-worker resume code and tests #146279.
  • Reuse canonical SQL for first-use database setup #146296.
  • Simplify internal Markdown link-span construction #146299.
  • Remove duplicate release-helper type declarations #146322.
  • Reuse severity style selection in CLI logs #146354.
  • Centralize iMessage transport and attachment staging #146460.
  • Consolidate automatic-update campaign cleanup #146555.
  • Centralize transcript reads for interrupted-turn recovery #146566.
  • Reuse normalized aliases in command catalogs #146570.
  • Simplify voice playback and cancellation state #146605.
  • Remove unused terminal chat cleanup #146624.
  • Share discovery metadata and port parsing #146627.
  • Share media generation preparation #146648.
  • Remove unused provider setup menu construction #146695.
  • Share QA Lab capture-filter rendering #146696. Thanks @vincentkoc.
  • Share channel plugin metadata merging #146757.
  • Share diagnostic timers for Git operations #146762.
  • Reuse shared provider usage error construction #146767.
  • Simplify Control UI value formatting #146785.
  • Reduce session-row bookkeeping during UI refreshes #146797.
  • Reuse existing CLI command-group names #146893.
  • Share QA harness comparison result construction #146903. Thanks @vincentkoc.
  • Remove unreachable Feishu reply-route selection #146904. Thanks @vincentkoc.
  • Simplify outgoing attachment preparation #146928.
  • Remove duplicate attachment path fallback #146933. Thanks @vincentkoc.
  • Simplify terminal note token checks #146934. Thanks @vincentkoc.
  • Consolidate Memory Wiki freshness results #146935. Thanks @vincentkoc.
  • Reuse Telegram's HTML text encoder #146936. Thanks @vincentkoc.
  • Simplify the thinking-level support check #146937. Thanks @vincentkoc.
  • Share ACP runtime mode command handling #146943. Thanks @vincentkoc.
  • Share Memory Wiki lint report rendering #146970. Thanks @vincentkoc.
  • Consolidate scheduled-job payload normalization #146971. Thanks @vincentkoc.
  • Separate browser tab tracking from cleanup #146973.
  • Reuse Feishu target parsing helpers #146980. Thanks @vincentkoc.
  • Consolidate session match classification #146983. Thanks @vincentkoc.
  • Share streaming media marker buffering logic #146989. Thanks @vincentkoc.
  • Reuse timezone suggestion normalization #146992.
  • Share Markdown span indexing #146997. Thanks @vincentkoc.
  • Share ANSI compatibility matching #146998. Thanks @vincentkoc.
  • Reuse text while splitting Discord replies #147002.
  • Reuse shared approval-destination deduplication #147004.
  • Share Slack workspace-qualified allowlist resolution #147024. Thanks @vincentkoc.
  • Share Active Memory closing-tag scanning #147031. Thanks @vincentkoc.
  • Share CLI poll-result line assembly #147033. Thanks @vincentkoc.
  • Reuse shared string normalization for skill installers #147035. Thanks @vincentkoc.
  • Consolidate health status color formatting #147043. Thanks @vincentkoc.
  • Remove redundant private Markdown chunking checks #147046. Thanks @vincentkoc.
  • Simplify the LanceDB dependency loader #147050.
  • Share marketplace Git source normalization #147053. Thanks @vincentkoc.
  • Centralize wizard cursor restoration #147058. Thanks @vincentkoc.
  • Consolidate escape-sequence restart handling #147060. Thanks @vincentkoc.
  • Share QA Multipass mount retry handling #147084. Thanks @vincentkoc.
  • Share Slack Agent View store-opening logic #147091. Thanks @vincentkoc.
  • Share browser action dispatch and result handling #147098. Thanks @vincentkoc.
  • Simplify Memory Wiki candidate deduplication #147108. Thanks @vincentkoc.
  • Share Control UI pairing request handling #147123. Thanks @vincentkoc.
  • Remove unused proxy registration fields #147126. Thanks @vincentkoc.
  • Share HTML transcript output formatting #147140. Thanks @vincentkoc.
  • Await Microsoft Teams delegated token storage #147142.
  • Consolidate silent-reply token cache helpers #147148. Thanks @vincentkoc.
  • Consolidate ACP option parsing results #147153. Thanks @vincentkoc.
  • Reuse WhatsApp target parsing results #147176.
  • Simplify shared status formatting #147190.
  • Remove unused Channels refresh timeout #147268.
  • Separate delivery queue operations from connection acquisition #147288.
  • Simplify skills formatting internals #147368.
  • Separate transcript writes and validate export metadata #147375.
  • Refresh Control UI translation records #147391.
  • Reuse shared filesystem readers #147475.
  • Simplify compaction summary internals #147479.
  • Consolidate Mattermost reply bookkeeping #147497.
  • Remove unused SSH tunnel metadata #147589. Thanks @vincentkoc.
  • Consolidate message-delivery outcome parsing #147595.
  • Simplify Matrix history tracker factory #147617. Thanks @romneyda.
  • Share cron validation responses #147671. Thanks @vincentkoc.
  • Remove readiness helper’s global logging dependency #147676.
  • Share install metadata audit logic #147679. Thanks @vincentkoc.
  • Share Policy Doctor rule detection #147683. Thanks @vincentkoc.
  • Simplify configuration wizard dispatch #147691. Thanks @vincentkoc.
  • Share native text delimiter scanning #147695. Thanks @vincentkoc.
  • Consolidate vLLM thinking-format migration #147698. Thanks @vincentkoc.
  • Reuse secret target matching #147723. Thanks @vincentkoc.
  • Share web provider selection completion #147734. Thanks @vincentkoc.
  • Share Google Meet result handling #147742. Thanks @vincentkoc.
  • Reuse translation validation helpers #147747. Thanks @vincentkoc.
  • Share Discord option construction #147763. Thanks @vincentkoc.
  • Share Matrix context truncation #147792. Thanks @vincentkoc.
  • Share Matrix reply delivery arguments #147811. Thanks @vincentkoc.
  • Reuse string-list normalization #147825. Thanks @vincentkoc.
  • Simplify health diagnostic parsing #147834.
  • Share terminal color encoding #147838. Thanks @vincentkoc.
  • Share fast-mode persistence #147847. Thanks @vincentkoc.
  • Share presentation record sanitization #147851. Thanks @vincentkoc.
  • Skip absent-overlay asset scans #147852.
  • Share usage formatter numeric conversion #147863. Thanks @vincentkoc.
  • Remove unreachable firewall fallback #147882. Thanks @vincentkoc.
  • Defer unused MCP OAuth loading #147884.
  • Avoid duplicate registry comparisons #147893.
  • Share custom-provider model construction #147915. Thanks @vincentkoc.
  • Consolidate optional provider validation #147925. Thanks @vincentkoc.
  • Share provider-auth configuration merging #147933. Thanks @vincentkoc.
  • Extract archive database operations #147946.
  • Reduce repeated validation preparation #147971.
  • Simplify internal browser loopback authentication #147989.
  • Consolidate short-term memory imports #148037. Thanks @vincentkoc.

Memory Core Doctor retains a pre-existing import limitation. After partial writes, a retry can treat the incomplete import as a conflict and archive the original source, preserving its bytes. Sharing the import helper does not resolve that behavior.

  • Share the memory phase-signal string reader #148049. Thanks @vincentkoc.
  • Share native chat math-label configuration #148073. Thanks @vincentkoc.
  • Reduce unnecessary plugin activation lookup work #148078.
  • Reuse sandbox skill path preparation #148079.
  • Reuse plugin invocation default callbacks #148080.
  • Share dream diary read-error classification #148091. Thanks @vincentkoc.
  • Load less code for secret-target discovery #148096.
  • Reduce publication-status database reads #148144.
  • Share outbound location range validation #148166. Thanks @vincentkoc.
  • Aggregate Gemini quota summaries directly #148172.
  • Resolve explicit skill references in one pass #148173.
  • Format decoded Feishu forwards directly #148184.
  • Reduce repeated chat-history paging calculations #148198.
  • Share Feishu event chat-type validation #148204. Thanks @vincentkoc.
  • Reuse shared numeric validation for speech directives #148206. Thanks @vincentkoc.
  • Reduce pending-message database reads #148208.
  • Simplify internal iMessage send wrappers #148212.
  • Consolidate configuration unset removal logic #148216. Thanks @vincentkoc.
  • Share iMessage handle classification #148229. Thanks @vincentkoc.
  • Remove unused Android helper methods #148233. Thanks @iwhatsskill.
  • Avoid temporary messages during tool-result budgeting #148238.
  • Read less metadata during managed-image cleanup #148244.
  • Reduce output-buffer trimming work during bursts #148260.
  • Prepare compaction records for atomic storage operations #148261.
  • Prepare task-visibility configuration asynchronously #148305.
  • Reuse fixed defaults when building plugin APIs #148315.
  • Reuse accepted Tool Search batch response text #148316.
  • Separate reply-delivery handlers into modules #148318. Thanks @obviyus.
  • Separate proxy-capture operations from store lifecycle #148336.
  • Reduce allocations for ordinary plugin property reads #148343.
  • Simplify z.ai quota response processing #148344.
  • Extract connection-bound outbound queue operations #148355.
  • Move registered-project lookups to the database worker #148364.
  • Record backup outcomes in the shared database worker #148378.
  • Share streamed-reply chunk boundary selection #148391. Thanks @vincentkoc.
  • Share Feishu's direct image sender #148396.
  • Batch reads when preparing session replacements #148406.
  • Remove duplicate diagnostic flag normalization #148438.
  • Consolidate filesystem operations on fs-safe #148442.
  • Remove redundant timeout and announcement helpers #148450.
  • Skip unnecessary plugin selection path resolution #148463.
  • Make outbound preparation checkpoints awaitable #148473.
  • Load scheduled-job facts asynchronously during maintenance #148505.
  • Consolidate terminal attachment reply formatting #148520.
  • Return committed transcript parents from persistence #148539.
  • Reduce code loaded for first chat-history reads #148542.
  • Reduce unused frame metadata reads during Logbook revisions #148551.
  • Avoid duplicate payload reads when acknowledging deliveries #148552.
  • Avoid redundant inventory reads during session cleanup #148572.
  • Simplify assistant display-content filtering #148590.
  • Skip unused revision reads when classifying session archives #148616.
  • Share optional reply metadata mapping across hooks #148641. Thanks @vincentkoc.
  • Share positional scanning in configuration audit redaction #148643. Thanks @vincentkoc.
  • Centralize device-token denial responses #148644. Thanks @vincentkoc.
  • Reuse shared record handling in Hermes migration parsing #148645. Thanks @vincentkoc.
  • Share plugin source-path display formatting #148646. Thanks @vincentkoc.
  • Share Nostr Doctor state migration flow #148647. Thanks @vincentkoc.
  • Reuse stable JSON serializer key storage #148661.
  • Remove unused Responses replay return metadata #148673. Thanks @vincentkoc.
  • Avoid temporary field copies during log redaction #148677.
  • Reuse cron list parsing #148686.
  • Reduce channel metadata loaded by history workers #148711.
  • Check named plugin owners before scanning other sources #148716. Thanks @vincentkoc.
  • Centralize terminal theme color lookup #148717. Thanks @vincentkoc.
  • Remove unused internal context-overflow wrapper #148719. Thanks @vincentkoc.
  • Reuse shared Unicode truncation in ClickClack #148732.
  • Share memory recall-repair count formatting #148753. Thanks @vincentkoc.
  • Reduce cold model-policy loading dependencies #148767.
  • Skip repeated plugin argument bookkeeping #148777.
  • Avoid repeated copying of plugin setup registration keys #148778.
  • Simplify browser access and media recovery internals #148811.
  • Avoid redundant fields in plugin-state reads #148815.
  • Consolidate chat metadata preparation internals #148820.
  • Simplify subagent delivery and recovery internals #148828.
  • Avoid redundant checks for trajectory truncation markers #148870.
  • Bound intermediate MiniMax usage parsing work #148871.
  • Simplify Claude usage normalization #148873.
  • Reuse fs-safe operations and repair test fixtures #148881.
  • Skip empty-coordinator path lookups #148900.
  • Reuse plugin policy preparation during provider lookup #148905.
  • Move Beam upload persistence to the plugin-state worker #148908.
  • Defer unused provider registration preparation #148912. Thanks @vincentkoc.
  • Retire delivered pairing subscriptions through the SQLite worker #148915.
  • Avoid temporary arrays for single-child plugin data #148921.
  • Avoid temporary pairs during context iteration #148923.
  • Project only selected OpenRouter video capabilities #148924.
  • Combine DeepSeek balance summary and billing processing #148925.
  • Resolve Discord fallback text only when needed #148926.
  • Reduce repeated work in Matrix style restoration #148927.
  • Collect compatible media models without intermediate lists #148928.
  • Reuse serialized arguments in tool-failure diagnostics #148930.
  • Use atomic comparisons for memory workspace-lock deletion #148934.
  • Reuse web-search request preparation #148949.
  • Avoid a redundant session read when saving turns #148993.
  • Build Google model templates only when selected #149021.
  • Simplify SuperGrok usage-period normalization #149022.
  • Reduce unused data in SQLite index inspection #149046.
  • Simplify primary CLI command registration #149053.
  • Avoid transcript storage imports during model selection #149079. Thanks @vincentkoc.
  • Reuse quote handling in XML tag scanning #149105. Thanks @vincentkoc.
  • Consolidate channel contract verification #149144. Thanks @romneyda.
  • Share directory traversal for session resources #149146. Thanks @romneyda.
  • Reduce SQLite schema-validation reads #149155. Thanks @kvnloo.
  • Reuse model-list row identity for adjacent lookups #149196.
  • Return queue status from completion admission #149281.
  • Extract outbound attempt rollback for future scheduling #149310.
  • Fetch less redundant data when loading scheduled jobs #149342.
  • Reduce temporary provider-route allocations #149385.
  • Run native-hook storage in the shared worker #149397.
  • Reduce browser dashboard discovery reads #149398.
  • Reuse delivery-queue query compilation #149421.
  • Reuse prepared attachment text #149424.
  • Support awaited process output consumers #149442.
  • Reduce database reads for transcript cache checks #149459.
  • Skip unnecessary worktree owner checks #149469.
  • Remove redundant policy reads during transcript saves #149496.
  • Centralize memory-origin SQL operations #149510.
  • Reuse thinking profiles in Gateway metadata #149514.
  • Reduce repeated session reads during compaction and Goal edits #149537.
  • Reuse selected runtime when preparing thinking options #149579.
  • Remove an unused QA session-toggle writer #149593.
  • Remove test-only skill-installer dependency wiring #149609.
  • Remove redundant Gateway startup bookkeeping #149635.
  • Simplify browser request and page-state handling #149651.
  • Separate transcript readers from storage lifecycle management #149670. Thanks @vincentkoc.
  • Extract reusable session suggestion storage operations #149723.
  • Reuse prepared schema queries during credential loads #149750.
  • Share transcript-statistics batching on existing connections #149756.
  • Separate session metadata preparation from time-dependent display #149771.
  • Avoid a duplicate database read when saving assistant replies #149783.
  • Reduce stored-content reads during progress-card updates #149790.
  • Reduce repeated statement preparation during transcript writes #149793.
  • Reuse shared filesystem reads, traversal and removal #149815.
  • Simplify completed-prompt accounting for scheduled runs #149818.
  • Consolidate Kimi thinking payload handling #149819.
  • Move queued-edit property assembly into session controls #149826.
  • Skip redundant session inserts during transcript appends #149831.
  • Remove unused Gateway startup work #149847.
  • Isolate Gateway history reads from host initialization #149876. Thanks @vincentkoc.
  • Move Codex managed-thread bookkeeping to the database worker #149895.
  • Simplify LINE auto-reply helper wiring #150043.
  • Extract shared SQL for the session usage cache #150051.
  • Reduce temporary objects when listing sessions #150103.
  • Separate asynchronous audit imports from synchronous storage #150107.
  • Isolate SQLite session-entry mutation operations #150127.
  • Share test inventory report argument parsing #150212. Thanks @vincentkoc.
  • Extract reusable device-token operations #150346.
  • Move Goal event writes to shared database worker #150389.

A delayed Goal change notification may recreate event history and watcher state after a concurrent session deletion.

  • Reuse shared filesystem resolution and readers #150414.
  • Share node command execution between production and tests #150434.
  • Filter MCP OAuth keys before returning query results #150510.
  • Batch session-history pruning updates #150521.
  • Reduce data fetched for skill-upload capacity checks #150546.
  • Skip unused worker-bundle retention scans #150583.
  • Remove test-only machine-model overrides #150590.
  • Reduce plugin source-scanning allocations #150597.
  • Move promotion annotations off the CLI thread #150607.
  • Remove redundant Gateway startup adapters #150609.
  • Load Gateway health collection on first use #150720.
  • Move shared-state task commands into task module #150775.
  • Extract promotion storage handlers from shared worker #150779.
  • Reuse unchanged session archive projections #151010.
  • Simplify session reply delivery #151019.
  • Avoid rebuilding normalized session keys #151105.
  • Prepare incognito session data before presentation #151186.
  • Simplify update-dialog state and shared test setup 70219e26.
  • Reduce redaction capture overhead d363685c.

Bug fixes

  • Remove ineffective confirmation-dialog imports #145423.
  • Keep shared database connections open until the last worker closes #147246.
  • Bind Slack control acknowledgements at receiver construction #150656.
Keep types aligned with their contracts

Configuration authoring types reuse existing validation schemas, leaving fewer duplicate definitions for maintainers to keep in sync. Some field descriptions have moved from generated type hovers to the source schemas.

Sources and complete change list

Improvements

  • Derive hook types from validation schemas #143985. Thanks @romneyda.
  • Share agent-default schema and types #143986. Thanks @romneyda.
  • Derive MCP types from their validator #143987. Thanks @romneyda.
  • Share memory-search schemas and types #143988. Thanks @romneyda.
  • Derive protocol registration from canonical schemas #144112.
  • Reuse Wear startup defaults on phone changes #144138.
  • Share Policy validation primitives #144186.
  • Derive cron types from shared contracts #144189.
  • Unified message configuration types and schemas #144462. Thanks @romneyda.
  • Unified session configuration definitions #144463. Thanks @romneyda.
  • Memory configuration type maintenance #144464. Thanks @romneyda.
  • Unified Gateway configuration definitions #144465. Thanks @romneyda.
  • Derive Gateway probe summary types from their producer #144555.
  • Normalize Codex account quota responses once #144620. Thanks @jesse-merhi.
  • Derive native device settings types from schemas #144705. Thanks @jesse-merhi.
  • Normalize Claude usage data through one schema #144707. Thanks @jesse-merhi.
  • Preserve SDK types in Slack slash-command helpers #144734.
  • Reuse status-table input types #145200.
  • Share scheduler diagnostics type #145953.
  • Use validated request types in message handlers #146206.
  • Derive authoring types from existing schemas #146355.
  • Reuse validated Gateway parameter types #146521.
  • Derive configuration types from validation schemas #146633.
  • Derive ClickClack configuration types from its schema #146761.
  • Narrow the Skill Workshop proposal context #146977. Thanks @vincentkoc.
  • Remove duplicate plugin type exports #147174.
  • Reuse validated request types in Gateway skill handlers #147185.
  • Remove redundant memory facade assertions #147751. Thanks @vincentkoc.
  • Derive Telegram pipeline types #147764. Thanks @romneyda.
  • Derive SMS webhook diagnostic types #147765. Thanks @romneyda.
  • Derive Nostr metrics types #147766. Thanks @romneyda.
  • Derive Matrix factory types #147767. Thanks @romneyda.
  • Derive daemon status types from their collector #148108. Thanks @romneyda.
  • Derive QA dependency types from their producer #148109. Thanks @romneyda.
  • Derive internal computer action fields #148110. Thanks @romneyda.
  • Derive Slack monitor context types #148111. Thanks @romneyda.
  • Derive status summary types from their producer #148418. Thanks @romneyda.
  • Derive inline directive types from the parser #148419. Thanks @romneyda.
  • Derive the Matrix QA client type from its factory #148420. Thanks @romneyda.
  • Derive session CLI row types from their producers #148421. Thanks @romneyda.
  • Centralize agent-session extension type exports #148746.
  • Type worker drain access and stabilize browser tests #148913.
  • Share Codex protocol schema normalization #149147. Thanks @romneyda.
  • Derive configuration audit types from record producers #149626. Thanks @romneyda.
  • Narrow IRC inbound runtime typing to logging #150183.
  • Derive configuration types from runtime factories #150394. Thanks @romneyda.
  • Derive Talk configuration types from its schema #150404. Thanks @romneyda.
  • Align speech configuration contracts with their schema #150405. Thanks @romneyda.
  • Derive token-efficiency report types from builders #150411. Thanks @romneyda.
  • Derive realtime voice session types from builders #150412. Thanks @romneyda.
Keep CI plans within their resource limits

Precisely scoped test changes can keep their required execution settings without scheduling unrelated test groups. Measurements from those selected tests stay separate from full-suite timing history.

Sources and complete change list

Improvements

  • Avoid redundant hashes before mandatory cache restores #144242.
  • Speed coercion declaration checks #144253.
  • Give full CLI CI more runner capacity #144257.
  • Avoid duplicate SDK checker scans #144298.
  • Avoid unrelated tests for baseline maintenance #144359.
  • Reuse verified Git trees in CI source checks #144421.
  • Preserve required metadata in targeted tooling CI #144621.
  • Avoid duplicate startup tests on full main CI #145078.
  • Run SDK declaration builds together when capacity permits #145090.
  • Retain Android CI test timing reports #145131.
  • Reserve headroom in test typecheck partitions #145461.
  • Use smaller runners for current artifact builds #145611.
  • Balance runtime tests across existing runners #145956.
  • Reuse idle Vitest caches across scheduler slots #146167.
  • Rebalance Gateway server typecheck tests #146212.
  • Reduce memory used by source validation #146266.
  • Reuse compiled workers across CI test groups #146353.
  • Keep CI focused on precisely selected tests #146366.
  • Avoid duplicate startup tests in broad pull requests #146465.
  • Refresh the Control UI startup-size baseline #146526. Thanks @obviyus.
  • Share extension inventory across CI boundary checks #146771.
  • Record resource and timing data for slow CI tests #147254.
  • Parallelize isolated browser fixtures #147529.
  • Guard wizard recovery test worker routing #148510. Thanks @vincentkoc.
  • Skip unrelated Docker validation for Node planner edits #148562.
  • Avoid unrelated plugin downloads during Android CI #148791.
  • Rebalance heartbeat typecheck ownership #148861.
  • Reuse environment names across combined source checks #149186.
  • Calculate test-cache fingerprints before dependency restore #149213.
  • Avoid unused import-cycle resolver allocations #149266.
  • Reuse directory lookups in import-cycle checking #149468.
  • Overlap declaration builds when memory permits #149592.
  • Reject worsening file-length debt in contributor checks #149622.
  • Adjust selected Blacksmith CI runner sizes #149625. Thanks @vincentkoc.
  • Select Docker, QA and UI performance CI by affected files #149655.
  • Skip CI runners for ignored comments #149664.
  • Move short CI jobs to hosted runners within a capacity budget #149685.
  • Reduce unit-fast test-discovery matching work #150031.
  • Restore CI capacity for compact Node and real-Gateway tests #150137.
  • Refresh CI test timings and split oversized groups #150226.
  • Shorten serial plugin lint on capable Linux runners #150342.
  • Reduce repeated CI planning calculations #150567. Thanks @vincentkoc.
  • Avoid duplicate boundary-test jobs #150572. Thanks @vincentkoc.
  • Run startup compatibility fallback checks in parallel #150719. Thanks @romneyda.
  • Reuse native dependency outputs in hosted CI #150725.
  • Remove redundant dependency-cache warmup job #150784. Thanks @romneyda.
  • Install fewer dependencies for Apple CI jobs #150785. Thanks @romneyda.
  • Separate Android base and emulator cache identities #150794. Thanks @romneyda.
  • Cache stable test inventories during CI planning #150846. Thanks @romneyda.

Bug fixes

  • Run Android CI for shared Talk fixture changes #135276. Thanks @qingminglong, @iwhatsskill.
  • Repair Android CI package sources and screenshot checks #143468. Thanks @vincentkoc.
  • Recover interrupted review checkouts #144431.
  • Keep growing PR test plans within the job cap #144965.
  • Rebalance session test typechecking #145431.
  • Preserve npm termination signals in package checks #145558.
  • Bound CI planner regression inputs #145759.
  • Preserve failures in redirected test reports #145800.
  • Make Docker test registry helper readable #145919. Thanks @romneyda.
  • Keep exclusions from selecting wrong test projects #145968.
  • Restore desktop CI setup and selection #145980.
  • Select Kova tests for agent-default schema changes #146057. Thanks @vincentkoc.
  • Respect process memory limits when scheduling tests #146298. Thanks @vincentkoc.
  • Rebalance hook typechecks to restore CI headroom #146538.
  • Honor empty POSIX PATH entries when selecting pnpm #146541.
  • Keep archived UI builds on their own workspace source #146548.
  • Support stopped-service inspection in upgrade tests #146622.
  • Preserve compiler cache reuse after native Mac builds #146658.
  • Balance slow runtime suites in complete PR checks #146916.
  • Run SQLite consumer tests in forked processes #146991.
  • Preserve CI workload estimates as test groups grow #147095.
  • Fix QA workflow routing test expectation #147293.
  • Prevent passing test names from triggering live CI retries #147322. Thanks @vincentkoc.
  • Run Node-specific child-process tests on Node under Bun #147329.
  • Preserve workflow loader choices in tests #147403.
  • Retain affected tests for common filenames #147754. Thanks @shakkernerd.
  • Support Bun QA source-script execution #147996.
  • Restore UI lint and startup-size checks #148010. Thanks @obviyus.

This raised the startup JavaScript cap from 353 to 354 KiB and refreshed its measured baseline. It did not shrink the browser assets.

  • Extend combined Android Play test and lint budgets #148124. Thanks @vincentkoc.
  • Make local Node and Bun test fixtures portable #148247.
  • Run wizard recovery tests with the shared-state broker #148337.
  • Record duplicate wizard recovery test registration #148353. Thanks @vincentkoc.
  • Fail test runs when Vitest workers exit unexpectedly #148408. Thanks @shakkernerd.
  • Remove duplicate database-worker test registration #148425. Thanks @decent9967, @romneyda.
  • Route provider integration and wizard recovery tests correctly #148504. Thanks @obviyus.
  • Restore database-host routing for plugin trust tests #148516. Thanks @vincentkoc, @romneyda.
  • Keep focused Node CI when documentation accompanies tests #148528.
  • Run plugin setup lifecycle tests with the database broker #148534.
  • Run isolated Gateway tests with config-health storage support #148536.
  • Restore capacity for services test typechecking #148602.
  • Limit the full tooling test aggregate to one worker #148657.
  • Retain passing hosted checks after skipped duplicates #148722. Thanks @vincentkoc.
  • Restore capacity in core test typechecking #148788.
  • Restore services typecheck capacity #148885.
  • Account for overlapping secrets typecheck assignment #148889. Thanks @vincentkoc.
  • Keep changed tooling tests alongside their consumers #148946. Thanks @vincentkoc.
  • Keep Docker tooling changes on their targeted CI group #148979. Thanks @vincentkoc.
  • Remove duplicate Copilot authentication metadata #149016. Thanks @vincentkoc.
  • Request revalidation while watching CI status #149418.
  • Preserve distributed typechecks when tests are deleted #149460.
  • Fit extension fallback tests within the PR job limit #149652. Thanks @fuller-stack-dev.
  • Correct plugin test scope and refresh CI timing estimates #149665.
  • Pin Android CI's Gradle JVM and validate toolchain changes #149832. Thanks @vincentkoc.
  • Preserve test module caches during report merging #150134.
  • Repair formatting failures in the CI scope test #150330. Thanks @fuller-stack-dev.
  • Reuse prepared workers in extension test batches #150360. Thanks @vincentkoc, @romneyda.
  • Bound database-worker CI jobs #150581.
  • Reuse cached pnpm archives before CI setup #150782.
  • Prepare runtime before parallel startup checks #151071.
  • Avoid false silence timeouts during worker preparation #151131.
  • Run Gateway-booting plans without competing plans 211e67f9.

Documentation

  • Correct Windows CI concurrency documentation #144684.

Limits and compatibility

  • Remove the retired CI credential scanner #145053.
  • Make file-length lint findings nonblocking warnings #149805.
QA diagnostics and reporting

QA runtime reports keep skipped executions distinct from passing ones while preserving their existing acceptance rules. Maintainers can also compare clean built revisions with six opt-in Code Mode workloads. These require an OpenAI API key and explicit model selection, make paid calls, and assess task results separately from follow-up explanations.

Sources and complete change list

Improvements

  • Add bounded Tool Search failure diagnostics #123145. Thanks @romneyda.
  • Reuse managed Crabbox installations across QA and proof #144154.

Offline QA hosts using an outdated Crabbox executable need a supported executable or managed copy before upgrading. See the remote testing guide.

  • Separate benchmark transport comparison modes #144159. Thanks @vincentkoc.
  • Separate performance evaluation from candidate execution #144162. Thanks @vincentkoc.
  • Share Docker diagnostic command lookup #144231. Thanks @vincentkoc.
  • Opt-in catalog-test screenshots and videos #144466.
  • Remove redundant QA Git fixture waits #144504.
  • Test Gateway startup with retained operator configurations #144626. Thanks @obviyus.
  • Consolidate Mantis remote-machine lease handling #144655.
  • Test startup upgrades against saved prior-release state #144659. Thanks @obviyus.
  • Share Matrix recovery QA command construction #144727.
  • Profile allocations in concurrency benchmarks #145629.
  • Share QA transport command registration #145705. Thanks @romneyda.
  • Reuse shared QA bus protocol #145706. Thanks @romneyda.
  • Benchmark sustained tool-using conversations #145751.
  • Add fixed probe counts to Gateway benchmarks #146006.
  • Use packaged SQLite workers in repair tests #146320.
  • Run Gateway browser tests more efficiently with clearer diagnostics #146550. Thanks @fuller-stack-dev.
  • Check sibling plugin imports during release upgrades #146636.
  • Compress temporary archives for UI performance checks #146687.
  • Add live tests for subagent waiting and operator resume #146874.
  • Preserve Gateway recovery test failure diagnostics #146925.
  • Share QA memory retrieval argument construction #147034. Thanks @vincentkoc.
  • Share approval-forwarding configuration in QA Lab #147062. Thanks @vincentkoc.
  • Share QA cache-miss report formatting #147069. Thanks @vincentkoc.
  • Consolidate Docker diagnostic command lookup #147396.
  • Measure total Gateway CPU in concurrency benchmarks #147436.
  • Compare Code Mode task and interview evidence #147537.

Keep task transcripts local unless their publication is explicitly authorized. Task effects and interview consistency are separate results, and the reported comparisons do not establish a general speedup.

  • Add native Feishu Gateway coverage #147549. Thanks @vincentkoc.
  • Skip identical-commit SDK rendering #147572. Thanks @vincentkoc.

The shortcut applies only when both references resolve to the same commit. Distinct revisions still require rendering; this change does not resolve the separate renderer memory-exhaustion problem.

  • Include worker profiles in Gateway benchmarks #147699.

Optional worker profiles add overhead and can miss activity. Each worker has a separate capture window, so those measurements cannot be added together as complete process CPU. Separate child processes are excluded.

  • Share mock followthrough evidence aggregation #147706. Thanks @vincentkoc.
  • Consolidate Matrix QA output parsing #147709. Thanks @vincentkoc.
  • Share Matrix QA permission helpers #147783. Thanks @vincentkoc.
  • Share Docker lifecycle trace checks #147822. Thanks @vincentkoc.
  • Reuse Matrix approval QA formatting #147867. Thanks @vincentkoc.
  • Share Gateway benchmark trace aggregation #148134. Thanks @vincentkoc.
  • Reduce QA evidence script startup overhead #148153. Thanks @vincentkoc.
  • Share unknown-result construction in confidence reports #148200. Thanks @vincentkoc.
  • Simplify Telegram QA formatting comparisons #148219. Thanks @romneyda.
  • Preserve desktop resize failure diagnostics #148354. Thanks @vincentkoc.
  • Share restart benchmark summary test fixtures #148555.
  • Add configuration diagnostics to failing plugin inspection tests #148597.
  • Retain profiling-test diagnostics before timeout cleanup #148610.
  • Retain both output streams in test configuration failures #148665.
  • Share ClawHub artifact checks in plugin tests #148733. Thanks @vincentkoc.
  • Expose configuration-read failures in plugin inspection tests #148736.
  • Reuse QA Lab's media-path reader #148771. Thanks @vincentkoc.
  • Explain recursive-spawn test failures with lifecycle state #148794.
  • Add shutdown stages to profiler test diagnostics #148804.
  • Identify plugin cache invalidation in test diagnostics #148944.
  • Add configuration-test diagnostics and account for Copilot overlap #149001. Thanks @vincentkoc, @fuller-stack-dev.
  • Unify Crabline QA transport construction #149061. Thanks @romneyda.
  • Retain safe dirty-checkout diagnostics in desktop CI #149085. Thanks @vincentkoc.
  • Remove redundant credentials reads from QA model selection #149159.
  • Add multi-agent Gateway benchmark workloads #149178.
  • Identify failing MCP external-auth test phases #149441.
  • Add diagnostics for MCP fixture execution failures #149692. Thanks @vincentkoc.
  • Move QA audit counts into a SQLite worker #149717.
  • Add diagnostics for off-frame chat streaming test updates #149848. Thanks @vincentkoc.
  • Add bounded failure diagnostics to Android branch tests #149857. Thanks @vincentkoc.
  • Retain Control UI browser startup diagnostics in CI #149873. Thanks @vincentkoc.
  • Include diagnostics when E2E mock-server startup fails #150062.
  • Report declaration-cache test phases on failure #150160.
  • Preserve Gateway readiness diagnostics in desktop tests #150276.
  • Capture diagnostics when CLI test children stall #150288.
  • Capture stack and handle reports for hung CLI tests #151088.
  • Run Discord QA through Crabline 013f409f. Thanks @romneyda.

Bug fixes

  • Bound stalled Mantis checks and protect failure evidence #111051. Thanks @zhangguiping-xydt, @fuller-stack-dev.

Mantis commands require Linux or macOS; Windows execution is refused. Concurrent runs need separate output directories. Uncertain cleanup retains worktrees, and failed rollback can leave recovery backups rather than a restored prior result set. The local manifest remains incompatible with the version-2 publisher.

  • Prevent stale replies from passing character checks #129312.
  • Preserve skipped outcomes in runtime QA reports #129616.
  • Wait for memory-profiler child cleanup #143503. Thanks @vincentkoc.
  • Keep memory diagnostics tied to their launched Gateway #143504. Thanks @vincentkoc.
  • Prevent startup-memory reports from overwriting each other #143505. Thanks @vincentkoc.
  • Retain replacement models for capped validation runs #143943. Thanks @romneyda.
  • Accept valid Matrix QA progress ordering #143957. Thanks @romneyda.
  • Retain QA profile diagnostics after failures #143968. Thanks @vincentkoc.
  • Close Crabline QA servers after Gateway shutdown #143992. Thanks @romneyda.
  • Count onboarding coverage per passing check #144000. Thanks @vincentkoc.
  • Fix macOS catalog test shortcuts and optional capture #144539.
  • Preserve Workboard development-preview session state #144747. Thanks @vyctorbrzezowski.
  • Skip suspicious default skills in installation tests #144833. Thanks @romneyda.
  • Match Telegram release tests to candidate source #144841. Thanks @romneyda.
  • Isolate Matrix QA progress checks from earlier events #144852. Thanks @romneyda.
  • Avoid false log-tail QA failures from concurrent logs #144867. Thanks @romneyda.
  • Align Kitchen Sink QA with expected diagnostics #144873. Thanks @romneyda.
  • Normalize expected Telegram formatting data in QA #144874. Thanks @romneyda.
  • Recognize native Slack Exec headers in QA #144893. Thanks @romneyda.
  • Isolate Matrix progress QA scenarios #144895. Thanks @romneyda.
  • Enable compaction progress in Telegram QA fixtures #144896. Thanks @romneyda.
  • Recognize split schemas in performance validation #145366. Thanks @vincentkoc.
  • Recognize reviewed Codex sandbox test fixture #145479. Thanks @romneyda.
  • Retry validation candidates after security blocks #145489. Thanks @romneyda.
  • Stop merge checks on unreadable change evidence #145603.
  • Report failed ClawSweeper dispatch requests #145617.
  • Reject empty extra script arguments #145887.
  • Fix false QA delegation failures #145905. Thanks @vincentkoc.
  • Validate repeated samples in Kova reports #146146.
  • Restore diagnostics browser test selection #146323.
  • Keep QA Gateway restarts under QA control #146397.
  • Prevent test profiler shutdown hangs after errors #146530.
  • Recognize the expected Kitchen Sink worker rejection #146681. Thanks @vincentkoc.
  • Preserve worker identity in startup profiles #146861.
  • Preserve nested Control UI test failure details #146864.
  • Clean up SQLite reliability waits after callback failures #146900. Thanks @vincentkoc.
  • Retain viewer diagnostics after desktop resize test failures #147067. Thanks @vincentkoc.
  • Identify the first hooks CLI test timeout phase #147145.
  • Preserve final Gateway logs during QA teardown #147300. Thanks @vincentkoc.
  • Correct provider identity in release-candidate QA reports #147425. Thanks @vincentkoc.
  • Exclude rejected Telegram calls from QA evidence #147484. Thanks @vincentkoc.
  • Preserve QA finals and clear unfinished previews #147536. Thanks @obviyus, @alix-007.
  • Stabilize Teams timeout QA setup #147686. Thanks @romneyda.
  • Retain onboarding prompts through redraws #147687. Thanks @romneyda.
  • Complete channel-picker QA prompts #147730. Thanks @romneyda.
  • Keep Slack QA markers visible #147748. Thanks @romneyda.
  • Compare Telegram QA formatting fields #147752. Thanks @romneyda.
  • Explain source staging filesystem failures #147778. Thanks @vincentkoc.
  • Continue skill validation past blocked automatic candidates #148041. Thanks @romneyda.
  • Separate generic plugin test fixtures from official packages #148074. Thanks @romneyda.
  • Preserve QA browser cleanup and transcript checks #148141. Thanks @vincentkoc.
  • Isolate bundled-skill QA from the parent Gateway #148150. Thanks @romneyda.
  • Recognize plain Slack progress rows in QA checks #148217. Thanks @romneyda.
  • Preserve QA restart ownership and ordinary command access #148218. Thanks @romneyda.
  • Avoid false Telegram formatting QA comparisons #148563. Thanks @romneyda.
  • Use the prepared Gateway in Ollama paired-node QA #148564. Thanks @romneyda.
  • Keep plugin lifecycle test packages on the fixture registry #148565. Thanks @romneyda.
  • Separate TUI maturity checks from shared-build scripts #148566. Thanks @romneyda.
  • Clarify Gateway test cleanup errors #148692.
  • Keep startup CPU out of idle measurements #148768.
  • Allow profiler help to finish normal Node shutdown #149010. Thanks @fuller-stack-dev.
  • Wait for developer-probe cleanup before reporting completion #149041.
  • Run shared-runtime QA scenarios serially #149086. Thanks @romneyda.
  • Repair obsolete Gateway maturity event expectations #149087. Thanks @romneyda.
  • Reduce QA child-producer fixture startup overhead #149243. Thanks @vincentkoc.
  • Wait for prompt-probe process cleanup #149428.
  • Preserve Bun in Kitchen Sink RPC validation #149474. Thanks @vincentkoc.
  • Report missing readiness in lint cancellation tests #149495.
  • Stop E2E process launches after cancellation #149521.
  • Correct Gateway benchmark request accounting and tool evidence #149698. Thanks @vincentkoc.
  • Recognize compact Slack command progress in live QA #149777. Thanks @romneyda.
  • Compare Telegram QA formatting by field values #149778. Thanks @romneyda.
  • Accept safely omitted command text in Matrix progress QA #149779. Thanks @romneyda.
  • Separate Slack QA silence observation from flow timeout #149780. Thanks @romneyda.
  • Align Codex authentication recovery tests with native failures #149784. Thanks @romneyda.
  • Capture QA evidence from the running transport #149928. Thanks @romneyda.
  • Repair Telegram QA credential imports #150356. Thanks @romneyda.
  • Run heavyweight terminal QA serially #150357. Thanks @romneyda.
  • Give disabled-channel Slack QA time to finish #150358. Thanks @romneyda.
  • Use model defaults in OpenAI onboarding probes #150474. Thanks @romneyda.
  • Check Codex ownership through Gateway observations #150475. Thanks @romneyda.
  • Supply session identity to OpenCode live checks #150501. Thanks @romneyda.
  • Align live tests with continuation and saved compaction state #150503. Thanks @romneyda.
  • Restore plugin memory profiling on Windows #150648.
  • Delete Matrix QA devices before driver shutdown #150661. Thanks @romneyda.
  • Align Telegram QA with silent access denial #150662. Thanks @romneyda.
  • Select native runtime in ultra handoff test #150722. Thanks @romneyda.
  • Remove retired timeout setting from Codex auth tests #150863. Thanks @romneyda.
  • Align Gateway and QA Lab test expectations #150866. Thanks @romneyda.
  • Separate restart QA delivery from child completion #150867. Thanks @romneyda.
  • Run live Gateway tests in host processes #150873. Thanks @romneyda.
  • Avoid Bash hangs in macOS computer-use test setup #150973.
  • Isolate Telegram startup QA account #150993. Thanks @romneyda.
  • Handle text history in Cron allowlist tests #150997. Thanks @romneyda.
  • Isolate compaction testing from plugin discovery #151000. Thanks @romneyda.
  • Isolate provider checks from background summaries #151002. Thanks @romneyda.
  • Correct QA parity request and completion evidence #151075.
  • Preserve thread identity in QA channel delivery 35bfbb53. Thanks @romneyda.
  • Drain test workers and diagnose stalled shutdowns #151225. Thanks @romneyda.

Runtime disk-scan retirement also waits for accepted measurements, with existing results, capacity and worker reuse unchanged. Diagnostic capture may add up to two seconds after a test timeout and may be unavailable if the event loop is blocked. Windows and Bun use fallback output.

Security and trust

  • Keep leased Telegram QA tokens out of child environments #148819. Thanks @obviyus.
  • Redact credentials from test failure reports #150983.

Limits and compatibility

  • Remove the legacy QA channel-selection input #149667. Thanks @romneyda.
Maintain release records and qualification inputs

Release maintenance covers package alignment, validation tooling, and historical records. Normal extended-stable publishing is now limited to the month immediately preceding the version on main.

Sources and complete change list

Improvements

  • Check frozen source compatibility before release jobs #144236. Thanks @vincentkoc.
  • Publish the 2026.9.4 macOS appcast entry #144636.
  • Reconcile main with shipped 2026.9.4 fixes and versions #144708. Thanks @vincentkoc.
  • Share cleanup across Docker release test runners #144798. Thanks @vincentkoc.
  • Share release file-content assertions #144904. Thanks @vincentkoc.
  • Share release artifact restore workflow definitions #146528.
  • Share iOS release argument parsing #146626.
  • Centralize database compatibility-check defaults #146675.
  • Share mobile changelog extraction #146909. Thanks @vincentkoc.
  • Centralize upgrade-test scenario minimum versions #146975. Thanks @vincentkoc.
  • Share retry handling across release-check agent turns #147076. Thanks @vincentkoc.
  • Share model setup commands across release checks #147077. Thanks @vincentkoc.
  • Batch release source size validation #147768.
  • Share Docker image version label parsing #148243. Thanks @vincentkoc.
  • Inspect iOS beta distribution without another upload #149007. Thanks @vincentkoc.
  • Add Projects and task-state published-upgrade tests #149487.
  • Add project workspace startup migration upgrade coverage #150077.
  • Keep complete SDK reports within release artifact limits #150273. Thanks @vincentkoc, @romneyda.
  • Compare complete publisher inventories #150333. Thanks @fuller-stack-dev.
  • Test Doctor-only workspace repair with independent specimens #150365.
  • Reduce release-validation command startup overhead #150732.
  • Reduce subprocess overhead in Linux release tests #150854. Thanks @romneyda.
  • Align 2026.9.5 versions and release records 5c27f51f.

Bug fixes

  • Bound plugin release build and packaging checks #111349. Thanks @zhangguiping-xydt, @fuller-stack-dev.

Build and pack stages each have a ten-minute deadline. Strict descendant cleanup is POSIX-only. Cancelling the real pack command can still interrupt restoration of source manifests, so complete source-byte preservation under cancellation remains unverified.

  • Reject unsupported monthly release checklist launches #127215. Thanks @vincentkoc.
  • Prepare heartbeat and Doctor release-test fixtures #144338. Thanks @vincentkoc.
  • Initialize Node before release planning #144411. Thanks @romneyda, @vincentkoc.
  • Repair categories for frozen ClawHub plugin releases #144615. Thanks @vincentkoc.
  • Verify archived publication evidence for 2026.9.4 closeout #144638. Thanks @vincentkoc.
  • Restore release-validation artifact downloads #144760. Thanks @vincentkoc.
  • Resolve updater compatibility files from the runtime build #144831.
  • Recover generated PR publication after push timeouts #144878. Thanks @romneyda.
  • Exclude unverified local identities from squash credits #145128.
  • Reuse beta validation after canonical changelog changes #145594.
  • Recognize older schemas in release validation #145628. Thanks @romneyda.
  • Register 9.5 plugin scan inventory #145670. Thanks @romneyda.
  • Respect Talk-defaults live-test opt-in #145840. Thanks @romneyda.
  • Honor Crabbox live-test opt-in #145889. Thanks @romneyda.
  • Align release fixtures with current behavior #145946. Thanks @romneyda.
  • Restore explicit Sol release-test selection #145974. Thanks @romneyda.
  • Serve release-check artifacts with special filenames #146104.
  • Exclude empty refresh commits from automatic squash credit #146585.
  • Align Discord upgrade tests with explicit plugin arguments #146606.
  • Allow versioned Linux release requests to reach publishing #146878.
  • Prepare PRs despite stale GitHub pull refs #146950.
  • Preserve source identities in repository E2E checks #146955. Thanks @vincentkoc.
  • Honor meeting live-test opt-in in CI #147044. Thanks @vincentkoc.
  • Check release package metadata before validation jobs #147049. Thanks @vincentkoc.

Fresh Full Release Validation requests must state their purpose, and publication requests must identify the packages and route. Use pinned tooling that supports both source and registry checks. Retained requests keep their original evidence for recovery; metadata admission does not authorize publication.

  • Align release fixtures with existing runtime behavior #147158. Thanks @vincentkoc.
  • Check publication registries before release validation jobs #147184. Thanks @vincentkoc.

Registry observations are retained for later checks against the actual publication inputs. They do not guarantee unchanged live registry state or authorize publication, bootstrap, or trust repair.

  • Remove the final unnecessary release-verification wait #147299.
  • Make merge drift checks independent of locale #147309. Thanks @vincentkoc.
  • Keep frozen-release checks aligned with selected source #148042. Thanks @romneyda.
  • Repair private QA imports in Telegram package checks #148044. Thanks @romneyda.
  • Install release-check dependencies before using them #148045. Thanks @romneyda.
  • Respect the frozen SDK package contract during validation #148046. Thanks @romneyda.
  • Accept reachable release commits with large ref listings #148161. Thanks @vincentkoc.
  • Retain current-run receipts for successful Docker upgrade checks #148245.
  • Avoid unrelated downloads during mobile release script export #148384. Thanks @vincentkoc.
  • Restore dependency-free cross-platform release checks #148634. Thanks @romneyda.
  • Unblock skill and Telegram package validation #148729. Thanks @vincentkoc.
  • Accept verified existing TestFlight internal-group access #148739. Thanks @vincentkoc.
  • Make malformed-filename release tests work on macOS #148780.
  • Exclude RoboClaw service credit from reviewed squash messages #148883. Thanks @takhoffman.
  • Keep release-preflight tests offline under Bun #148892.
  • Pin a maintained ClawHub installation fixture #148902. Thanks @vincentkoc.
  • Recognize reviewed Codex test probes in package scans #149058. Thanks @romneyda.
  • Report release child-workflow startup failures promptly #149059. Thanks @romneyda.
  • Require fresh checks after relevant main changes #149143.
  • Route PR aliases through their current shared wrapper #149191.
  • Supply dependencies for linked-checkout PR wrappers #149193. Thanks @vincentkoc.
  • Preserve merge receipts across repository ID formats #149230.
  • Specify Node for Codex release smoke tests #149407. Thanks @romneyda.
  • Prevent false downgrade refusals in packaged QA fixtures #149409. Thanks @romneyda.
  • Restore private QA imports and safe failure evidence #149411. Thanks @vincentkoc, @romneyda.
  • Reject incomplete or inconsistent PR review metadata #149567. Thanks @fuller-stack-dev.
  • Recover qualified historical merge refusals while retaining evidence #149674. Thanks @patrick-erichsen.
  • Repair upgrade-test fixtures, outcomes and Doctor diagnostics #149705.
  • Match frozen-package Telegram tests to the selected source #149714. Thanks @romneyda.
  • Initialize PR review inside the macOS sandbox #149776. Thanks @fuller-stack-dev.
  • Preserve required browser files in raw CDP smoke tests #149813. Thanks @vincentkoc.
  • Verify Telegram release candidates missing from GitHub associations #149846. Thanks @romneyda.
  • Run npm artifact qualification after skipped evidence reuse #149851. Thanks @vincentkoc.
  • Continue release history fetching when shallow boundaries change #150304. Thanks @romneyda.
  • Repair release setup and record validation exceptions #150337. Thanks @vincentkoc, @romneyda.

The version-specific validation exceptions record waived Telegram and Matrix checks as not run. The Axios exception is not a dependency upgrade or vulnerability fix. Later advisory matching corrects the interpretation of an explicit patched-version boundary, while unavailable reviewed data still leaves partial coverage.

  • Correct deferred-plugin inventory expectations #150341. Thanks @fuller-stack-dev.
  • Verify workspace repair before Gateway startup #150375.
  • Fetch upgrade metadata before release admission #150385. Thanks @romneyda.
  • Include missing shared dependency in E2E checkout #150471. Thanks @romneyda.
  • Record reviewed process-test scanner findings #150473. Thanks @romneyda.
  • Isolate published baseline packages in upgrade tests #150542.
  • Avoid false warnings for explicitly patched dependency versions #150657. Thanks @romneyda.

Reviewed advisory ranges remain authoritative. The publisher fallback correction is neither an Axios upgrade nor blanket dependency clearance; unavailable reviewed data still leaves partial coverage.

  • Select synthetic user bus in Doctor-switch tests #150698. Thanks @vincentkoc, @romneyda.
  • Handle absent missing-plugin-path fixtures in upgrade tests #150740. Thanks @vincentkoc, @romneyda.
  • Recognize expected registry fallback in missing-plugin upgrade tests #150748.
  • Accept verified historical upgrades in installer smoke tests #150757. Thanks @vincentkoc, @romneyda.
  • Match Telegram package tests to explicit command denials #150761. Thanks @romneyda.
  • Prevent registry timeouts in prepack tests #150832.
  • Recognize reviewed Signal socket-test findings #150844. Thanks @romneyda.
  • Validate SDK setup types through compilation #150845. Thanks @romneyda.
  • Correct update-repair isolation assertions #150917. Thanks @romneyda.
  • Prevent validation stalls on large generated inputs #150936.
  • Retry failed npm qualification without restarting validation #150991. Thanks @romneyda.
  • Enable selected node-timeout test in release validation #150998. Thanks @romneyda.
  • Keep frozen candidates eligible after release branch advancement #151039. Thanks @romneyda.
  • Preserve candidate registry during plugin-repair validation #151158. Thanks @romneyda.
  • Accept preserved runtime skips in QA reports #151170.

Security and trust

  • Exclude provider credentials from package smoke overrides #143331. Thanks @giodl73-repo.
  • Keep release validation inputs out of child-process arguments #144815. Thanks @vincentkoc.

Documentation

  • Add the detailed v2026.9.4 release guide #144665. Thanks @hannesrudolph.
  • Improve readability of v2026.9.4 release notes #144693. Thanks @hannesrudolph.
  • Refresh session-restart translation memory #146111.
  • Require UI screenshots in chat and pull requests #147263.
  • Refresh the 2026.9.5 contribution records c396abe6.
  • Refresh release records for the managed-service update fix ec9c1a13.

Limits and compatibility

  • Restrict extended-stable publishing to the preceding month #143679.

The normal preceding-month rule is enforced, but the retained bypass guidance conflicts between testing-only use and approved exceptions. A working bypass is not publication authorization.

Keep development builds compatible

Linux Crabbox setup keeps pnpm dependencies inside the workspace. Running setup again replaces only the two precisely recognized older dependency-link layouts, preserving external targets and unrelated links. Native Windows retains its existing junction layout.

Managed Windows build and test commands preserve final output and report cleanup that cannot be confirmed. Temporary test state remains available when cleanup is unresolved.

Sources and complete change list

Improvements

  • Refresh dependencies while preserving existing contracts #145124.
  • Discover static plugin assets once during postbuild #145250.
  • Move SQLite capability probes off startup thread #147866. Thanks @vincentkoc.
  • Remove unused Android test dependencies #148231. Thanks @iwhatsskill.
  • Reduce temporary memory in SDK API report rendering #148393.

Bug fixes

  • Initialize Bun SQLite before test workers start #145198.
  • Honor requested Node versions when packaging the Mac app #146556.
  • Keep HTTP headers out of native translation discovery #147119. Thanks @vincentkoc.
  • Restore repeatable Linux Crabbox dependency setup #147864.
  • Fix false unused-export failures in Windows checks #148751.
  • Avoid duplicate asset copies during merge resolution #148907. Thanks @vincentkoc.
  • Reject builds produced from subsequently reverted source edits #149866.
  • Complete Windows build and test cleanup without losing output #150244.
  • Restore macOS builds for chat handoffs #150292. Thanks @vincentkoc, @romneyda.
  • Prevent oversized plugin boundary compiler work #150721.
Clarify contributor and maintenance guidance

Contributor guidance puts the problem and practical impact first in PR descriptions, keeping risks, required actions, and useful validation easy to find. For visible UI changes, before-and-after screenshots must render in both the originating chat and the PR unless the user explicitly waives a destination.

PR cleanup stops when worktree ownership is ambiguous, orphaned, or incomplete, preserving paths and metadata for diagnosis. PR tooling also disables automatic maintenance during fetches to avoid unrelated metadata pruning.

Sources and complete change list

Improvements

  • Skip unnecessary maturity-link parsing #147560.
  • Record redundant PR-wrapper inventory addition #150451. Thanks @romneyda, @shakkernerd.
  • Skip unused config loading during native PR worktree setup #150900.
  • Validate reviews early and show CI job progress #150987. Thanks @vincentkoc.
  • Keep source-review sessions free of dependency installation f5c3d165. Thanks @fuller-stack-dev.
  • Reuse managed source clones for PR worktrees 387f6983. Thanks @fuller-stack-dev.

Bug fixes

  • Reject links to unpublished permalink URLs #144279.
  • Use source plugin schemas for documentation checks #144312.
  • Preserve links between separate HTML examples #144537.
  • Exempt bare versions from glossary validation #147377. Thanks @hannesrudolph, @vincentkoc.
  • Confine PR cleanup to its worktree #147527. Thanks @vincentkoc.
  • Preserve unrelated worktrees during PR fetches #147828.
  • Recover preparation after committed merge conflicts #148063. Thanks @fuller-stack-dev.
  • Preserve unfinished work during completed PR cleanup #148704. Thanks @fuller-stack-dev.
  • Prevent automatic Git maintenance during PR operations #150399.
  • Restore review initialization from fresh tooling snapshots #150453. Thanks @shakkernerd.
  • Include snapshot worker in isolated PR tooling #150480.
  • Restore PR tooling startup from older worktrees #150504.
  • Preserve Labeler work during ignored description edits #150728.
  • Honor explicit bases in staged checks #150934.

Documentation

  • Remove duplicate Docker test guidance #144406. Thanks @vyctorbrzezowski.
  • Remove duplicate secret-placeholder guidance #144407. Thanks @vyctorbrzezowski.
  • Require update compatibility and recovery review #145100.
  • Document UI review galleries with per-example feedback #145306. Thanks @patrick-erichsen.
  • Correct CI test shard documentation #146238.
  • Lead PR descriptions with problems and practical impact #146253. Thanks @hannesrudolph.
  • Clarify approval boundaries for internal repairs #146462.
  • Alphabetize sponsor acknowledgments and add Red Hat artwork #147302. Thanks @vacinc.
  • Document current-main scorecard dispatch #150417. Thanks @romneyda.
  • Require coordination for Team site updates a5fb8446.
Was this useful?
On this page

On this page