Release notes
v2026.9.6
v2026.9.6
AI agents and tools can read these release notes as plain Markdown.
OpenClaw 2026.9.6 brings clearer managed-update outcomes, recovery for unfinished work after restarts, and complete 30-day Usage reporting. A GitHub reader brings public discussions and diffs beside chat, while remote workspaces gain Files, Memory, and Skills and meeting notes update as capture continues. Optional Decision Models add TypeSafe Jev and local choices, alongside new chat-model support for Claude Opus 5.5, GPT-6 Sol and Luna, and Grok 4.7.
Release scale: 2,614 pull requests, 178 direct commits, and 350 contributors.
Installation and Onboarding
Setup has clearer recovery paths when an installation cannot continue, and new custom agents keep the job you approved for them.
Install and find command-line tools on Windows
The Windows installer can continue after a failed Node package-manager attempt, trying the remaining options before downloading an official portable runtime into your user account. That portable recovery needs no administrator access, while setup still stops if it cannot validate a supported runtime. OpenClaw also recognizes supported JavaScript command-line launchers configured by their full path without requiring changes to Windows' executable-extension settings. See the installer guide for setup options.
Sources and complete change list
Bug fixes
- Repair stale Winget Node registrations during Windows setup. 76cf13b Thanks @ooiuuii and @fuller-stack-dev.
- Continue Windows setup after failed Node package-manager attempts. #134386 Thanks @ly85206559 and @fuller-stack-dev.
- Verify supported explicit Windows JavaScript CLI paths without PATHEXT changes, while bare command names retain normal PATH/PATHEXT lookup. #152862
Choose a supported FreeBSD installation
On FreeBSD, an unsupported source installation now stops before changing your existing installation and points you to the package installation route. Use a published npm version or compatible built .tgz package with the same installation prefix. If pkg or Ports manages OpenClaw, continue using that package manager. Source installation remains unsupported, and this change does not make FreeBSD a Tier 1 platform.
Sources and complete change list
Limits and compatibility
- Reject unsupported FreeBSD source installs before setup and explain the supported package route. #151227 Thanks @vincentkoc and @lucarinaorg.
Check Node under restricted worker permissions
If Node explicitly denies permission to start worker threads, OpenClaw can check SQLite in the current process instead of incorrectly reporting that SQLite is unavailable. This helps setup and diagnostics in restricted environments while leaving permissions and the Gateway's other worker requirements in place.
Sources and complete change list
Bug fixes
- Check SQLite capabilities when Node denies workers. Other worker failures still report an error. #152075
Find missing Podman setup requirements
When Podman cannot create a sandbox because its host-side init helper is missing, the error now explains what to repair. Install catatonit or correct its configured path on the computer running the Podman engine, including inside Podman Machine when you use it. The Podman setup guide covers this requirement, which you must supply before retrying with the existing sandbox protections enabled.
Sources and complete change list
Bug fixes
- Explain repairs for missing Podman host init helpers without automatically installing them or disabling
--init. #152308
Continue setup after configuration and storage problems
If invalid configuration blocks setup, the error now directs you to run openclaw doctor --fix before retrying. Doctor applies supported repairs when you explicitly request them. Setup also stays responsive while saving recommendations and waits for progress to be saved before continuing, with storage failures still reported as errors.
When OpenClaw automatically installs the fd or ripgrep search helpers, valid encoded downloads no longer fail because their transfer size differs from the downloaded archive. Installation can also find a readable tool inside the archive when an unrelated directory cannot be read. The existing 100 MiB limit on decoded archives and extraction controls remain in place.
Sources and complete change list
Improvements
- Skip Matrix saved-auth storage probes when the backing database is definitely absent. Existing or uncertain state still receives normal credential validation. #152576
Bug fixes
Keep the purpose of a new custom agent
A new custom agent created through the Control UI now keeps its approved purpose as saved instructions for later conversations. This applies when creating a custom agent in a local workspace. Existing instructions stay intact, and conflicting instructions prompt you to choose another workspace. Changing the proposed purpose requires fresh approval.
Reopening New agent brings back the creation choices without discarding your Ask OpenClaw conversation, once pending questions, setup steps and approvals are finished. New agents also retain the display name you requested separately from their identifier, including when you choose a bundled role.
Sources and complete change list
Bug fixes
- Preserve requested names when creating custom and bundled-role agents, while keeping role instructions and existing agents unchanged. #151449
- Save a custom agent's approved purpose at creation without overwriting existing workspace instructions. Custom purpose cannot be combined with bundled-role templates or remote workspaces. #154137
- Restore creation choices when reopening New agent while preserving the conversation and pending-interaction priority. #154167
Install only the runtime files you need
Production npm installs on macOS, Windows and Linux carry about 18 MiB less unused Bash parser material while keeping the same command-parsing behavior. This is a reduction in installed files, with no configuration change needed.
Newly built Cloudflare template images also leave out an unused Litestream download archive while keeping the executable. Existing deployed images stay unchanged until you rebuild and deploy them.
Web UI
The Web UI now shows 30 days of usage across the full session report you can access, alongside improvements to everyday chat and its controls.
Start background work from the command palette
Use the command palette to start an independent task from text or a pasted screenshot while keeping your current conversation and draft in place. Press Cmd/Ctrl+K to open it and Cmd/Ctrl+Enter or New session to start the work, while ordinary Enter applies the current search instead of opening a stale result. Failed creation keeps images for another try, but closing the palette normally discards unsent images.
You can also select up to ten people to mention when starting the task. Typing a name alone does not select a recipient, and a mention does not share the conversation or grant access.
Sources and complete change list
Improvements
- Start background sessions directly from the command palette #152370 — thanks @vyctorbrzezowski, @jalehman.
- Start image tasks from the command palette #153238 — thanks @vyctorbrzezowski.
- Pause command-palette search while composing long or multiline prompts #153100 — thanks @vyctorbrzezowski.
- Keep background attention updates out of global popups #151446.
- Align command-palette settings and project navigation #153307 — thanks @vyctorbrzezowski.
- Mention people when starting tasks from the quick composer #154061 — thanks @vyctorbrzezowski.
Bug fixes
Start suggested tasks without interrupting chat
Suggested tasks keep their full summaries and Start controls reachable in shorter windows, and launching one in a new session or worktree leaves your current conversation and draft selected. If the selected repository cannot start the task, you can correct it without retyping the prompt, then explicitly retry with a usable repository that has a commit.
Choose where a new conversation runs
New-session placement makes the cloud profile, operating system, machine size and starting branch easier to confirm, and submits the choices shown in the picker. Your prompt and attachments remain visible beside startup progress while the first message waits for the destination to become active. Open session returns to a created conversation without sending the prompt again. Configured size defaults still apply and existing instances are not resized. Administrators can also register an existing repository using an accessible absolute path with a valid Git HEAD. Interrupted Incognito prompts remain only in the current tab's memory.
A failed project lookup now keeps your saved choice and blocks starting until discovery recovers or you deliberately change the destination. New Session also remembers a supported Fast mode choice, including off, for the same agent and Gateway.
Sources and complete change list
Improvements
- Show cloud operating system and machine size in the selector #151947.
- Show the starting branch for cloud sessions #152010.
- Show cloud backend marks in placement pickers #153288 — thanks @vyctorbrzezowski.
- Reuse repeated folder rankings in recent projects #152683.
- Read project-list database inventory in workers #152691.
- Load session catalog choices without history enumeration #150831.
- Reuse current session rows for default project listings #154705.
Bug fixes
- Submit the cloud size and operating system shown in the picker #153788 — thanks @vincentkoc.
- Keep cloud-session prompts and setup progress visible together #152024.
- Explain cloud startup failures and pending setup #152043.
- Keep cloud profiles available when worker inventory fails #151783.
- Keep submitted prompts visible through startup and reconnects #152241.
- Preserve saved project choices when discovery fails #155619 — thanks @vincentkoc.
- Remember Fast mode choices for new sessions #154690 — thanks @vincentkoc.
Documentation
- Document registering existing repositories in the Place picker #153721 — thanks @vincentkoc.
Choose the starting branch for a worktree
Leaving the worktree From choice untouched now starts from the fetched remote default branch, as does leaving Base branch empty when creating a worktree manually in Settings. An explicit or saved local branch keeps its meaning. Branch editing stays usable and an accepted start clears the custom name it consumed, so it does not accidentally name the next session. Rejected starts retain the name, and failed remote lookup retains the source-HEAD fallback. If name cleanup is unconfirmed, check Name before starting another session.
Failed Git discovery also keeps a saved separate-worktree choice instead of silently switching to the current checkout. Starting waits for recovery or your explicit Current checkout choice.
Sources and complete change list
Bug fixes
- Keep worktree editing stable and clear accepted custom names #150426 — thanks @romneyda.
- Start default worktrees from the remote default branch #154234.
- Use the remote default for manual worktree creation #154364.
- Preserve saved worktree isolation after Git discovery failures #155368 — thanks @vincentkoc.
Group, archive and reopen conversations
Conversations can be archived or restored directly from the sidebar with Undo, and keyboard shortcuts open a New Session draft or archive the current eligible chat. Archiving keeps the conversation and its work, while group moves appear immediately and retain confirmed placement if the next refresh fails. New tabs keep the original draft in place and open with navigation expanded, and generated links retain the intended conversation. On desktop, right-click or Shift+F10 opens the full row menu, while touch keeps a menu button. If a group save is uncertain, refresh and check its placement before retrying.
Incognito links now retain the exact conversation, provided you have administrator access and its memory-only session still exists. Reopen it from the sidebar to replace an older broken short link.
Sources and complete change list
Improvements
- Open New Session and archive the current chat from the keyboard #153537 — thanks @vyctorbrzezowski, @jalehman.
- Reduce unnecessary work when filtering owned conversations #152097.
- Archive and restore sessions directly from the sidebar #154144.
- Open new desktop session tabs with the sidebar expanded #153106 — thanks @vyctorbrzezowski.
- Register new session categories off the Gateway thread e2eae6ab.
Bug fixes
- Keep generated session links bound to the selected conversation #150242.
- Restore header organization actions for Home-linked conversations #152439.
- Show session group moves immediately and preserve saved placement #151689 — thanks @jalehman.
- Keep ordinary Claude CLI conversations in chosen groups #150537 — thanks @marvinthebored, @peetiegonzalez, @davidofflol12, @bitbalancer.
- Restore New Session shortcuts and composer focus #153836.
- Open Incognito sessions with exact session links #154644 — thanks @vincentkoc.
Follow background activity from its parent conversation
Temporary child runs now belong in transcript activity and Tasks, leaving ordinary navigation for persistent conversations. Their parent conversation continues to show an activity ring during follow-up work, and the icon keeps its resting size when that ring starts. Use Tasks or transcript activity to inspect the work itself, since a failure tooltip is not a link to the child conversation.
Sources and complete change list
Improvements
- Update subagent trees from complete session events #152510.
- Move temporary subagent runs out of conversation navigation #151470.
- Keep sidebar icons steady when activity rings start 526477da — thanks @fuller-stack-dev, @vyctorbrzezowski.
- Remove the decorative line behind sidebar subagent spinners #154041 — thanks @vyctorbrzezowski.
Bug fixes
Find older conversations and search within chat
Search can find authorized conversations beyond the currently loaded sidebar, with avatars, owner badges, highlighted matches and All, Sessions or Messages filters to help recognize the result. Results remain a bounded set of matches, and cold archived history must first be restored by opening its conversation. Within a chat, Escape closes focused transcript search and returns focus without clearing your draft or pending reply.
Sources and complete change list
Improvements
- Make search results recognizable with avatars and filters #151968.
- Reduce repeated session-search matching work #151708 — thanks @vincentkoc.
- Batch visibility metadata for restricted session searches #152503 — thanks @bsniznd.
- Move transcript searches and incremental history reads off the Gateway thread #154318.
Bug fixes
Configure and test web search from Settings
Settings → Search brings provider setup, routing information and real test queries into one place. People with read access can inspect which search route an agent and model would use, while administrators can configure a managed provider and test it against normal account limits and billing. These settings apply across agents, and a configured provider is not necessarily a working one. For native or external search, Test in chat opens an unsent draft rather than running a query. Paid Parallel can be detected from its API key, while Parallel Search Free requires an explicit selection.
Keep conversation names usable
Automatic naming can finish and update the sidebar after worktree setup stops waiting, while failed naming uses a neutral two-word name for a new session or worktree instead of copying the opening prompt. Setup can wait up to 30 seconds for a name, and a later title leaves an already-created branch unchanged. Manual names remain intact, and composing characters in the title editor no longer saves or discards a rename before composition ends.
Read long chats without losing your place
Long chats load older history in fewer batches and keep navigation markers and reading position steadier as replies stream, the composer changes size or images finish loading. Expanded details and code-reading controls stay in place while the current part of a reply is still being written. Code controls now also survive a closing code fence and later paragraphs in that same live reply, though saved-history replacement or a source correction can still reset them. Code examples stay literal, reduced-motion preferences apply from startup, and opening a chat no longer slides the whole conversation into place. The initial history load stays small, while older-history batches can be larger.
Returning to a chat restores your saved reading position once, then leaves scrolling under your control. Delayed history refreshes also preserve newer live replies and keep saved transcripts with the selected agent.
Sources and complete change list
Improvements
- Reduce rendering work when loading older chats #153137.
- Keep long-chat history loading and scroll position steadier #153245.
- Smooth new chat messages and uninterrupted streaming scroll-follow #148447.
- Adapt latest-reply metadata to pointer and touch input #150569 — thanks @vyctorbrzezowski.
- Reuse unchanged recent chat history #152734.
- Introduce bounded older-history paging, subsequently replaced by larger batches #152093.
- Reduce repeated line-ending processing during chat streaming #153215 — thanks @jjjhenriksen, @patrick-erichsen, @noelillinger.
- Avoid blocking profile lookups when opening chats #154387.
- Avoid an extra copy when callers share a history read #154552.
- Reduce repeated processing during active chat catch-up #155401.
Bug fixes
- Align rounded chat bubbles and media captions #151457 — thanks @vyctorbrzezowski.
- Remove chat entrance motion #150516 — thanks @vyctorbrzezowski.
- Keep chat navigation aligned and reject stale task publishers #153277.
- Align mention avatars with missing or loading photos #153914 — thanks @vyctorbrzezowski.
- Keep late-resizing replies above chat controls #152386.
- Keep layout adjustments from loading history or interrupting follow-latest #151726 — thanks @vyctorbrzezowski, @fuller-stack-dev.
- Match code previews to hidden-line counts #153933 — thanks @vyctorbrzezowski.
- Load older chat history in fewer batches with less browser work #152979.
- Preserve literal embed examples in Markdown code #153579 — thanks @sunnyshu0925, @obviyus.
- Stabilize conversation markers and preserve keyboard focus #151626.
- Disable loading-placeholder motion immediately under reduced motion #151314.
- Preserve reader controls while the active chat reply grows #153815 — thanks @vincentkoc.
- Batch session-refresh redraws during chat streaming #151320.
- Keep chat history readable during unchanged registry refreshes #153736.
- Keep optional transcript lookups read-only #151745.
- Keep conversation navigation anchored during composer resizing 41cd52e1 — thanks Peter Steinberger.
- Cancel abandoned New Session entrance transitions #127036.
- Keep replacement text available to copy while older requests settle #154259 — thanks @vincentkoc.
- Keep code controls when a streamed block closes #154430 — thanks @vincentkoc.
- Prevent Chrome crashes during delayed scrolling #154592.
- Restore saved chat reading positions without repeated scroll writes #154730 — thanks @romneyda.
- Keep conversation markers visible after navigation and resizing #154917.
- Keep chat footer focus rings visible #155199 — thanks @romneyda.
- Prevent duplicate bullets in Safari chat lists #155201 — thanks @vyctorbrzezowski.
- Preserve live replies and agent-specific transcripts during history refreshes #155404.
- Move incremental chat-history visibility reads off the request thread #155870.
Return to the intended conversation branch
After rewinding and resending, the branch menu reveals the preserved conversations without a reload, and loaded history follows the branch you selected. Repeated branch listings and history reads also avoid some unnecessary transcript work. These are conversation branches, and returning to one does not undo earlier tool actions or file changes.
Sources and complete change list
Improvements
- Retrieve branched conversation history with less database work #153470.
- Reduce redundant work in session history reads #153161.
- Keep more conversation branch summaries ready for reuse #152724.
- Share branch-list reads across concurrent viewers #155678.
Bug fixes
Compaction checkpoint controls are retired
Dedicated compaction checkpoint links, history cards and branch or restore controls have been removed, along with sessions.compaction.list, sessions.compaction.branch and sessions.compaction.restore. Ordinary Fork, rewind, conversation history, compaction summaries and available token-savings reporting remain. There is no equivalent replacement for checkpoint restore, and the retirement does not require a data purge or configuration migration.
Keep your place while collaborators write
Reading older messages in a shared chat no longer gets interrupted by another person's message or typing, including when an automatic scroll was pending. Deliberate reader navigation remains active, and the active reply stays visible through queued sends and saved history. A message from your own account in another browser also counts as remote activity. Sending from the current pane or selecting Latest resumes following the conversation, while typing produces fewer repeated presence updates.
Sources and complete change list
Improvements
- Reduce repeated presence broadcasts while typing #152042.
Bug fixes
Keep parallel chats and drafts in place
Parallel conversations keep more of their individual working state. A Side chat that finishes loading late does not pull typing away from your current input, archiving a neighboring pane preserves your unsaved comments and draft, and each conversation retains its own Chat or Dashboard view. Archiving the conversation you are editing still dismisses its controls.
You can keep editing a Side chat follow-up while its answer is pending, although sending still waits. Reloaded split panes also restore their own conversation's side panels instead of inheriting another pane's Files selection.
Sources and complete change list
Bug fixes
- Keep typing in the intended input while Side chat loads #150217.
- Preserve unsaved comments when another split pane archives #150198.
- Preserve each split conversation's Chat or Dashboard preference #150228.
- Keep accessible panel navigation within the correct pane #153478.
- Keep Side chat drafts editable during answers #155183 — thanks @patrick-erichsen.
- Keep split-chat panels with their own conversation after reload #155528.
Keep message controls within reach
Chat notices, reply context, Goal previews and selected recipients sit above a reachable message field in a bounded footer, keeping controls usable in narrow or overlapping panes. Shared pickers continue to dismiss correctly as panes close, and moving between menu rows closes the previous submenu. Removing a selected recipient leaves the mention text in your message.
Multiline drafts remain readable during keyboard navigation and selection, while affected typing layouts avoid repeated resizing and unnecessary redraws around selected mentions.
Sources and complete change list
Improvements
- Integrate reply, Goal and recipient composer previews #151246 — thanks @vyctorbrzezowski.
- Highlight the highest reasoning-effort settings #155402 — thanks @vincentkoc.
Bug fixes
- Keep the editor reachable and retry stale authentication reads after matching OAuth refresh #152608.
- Align composer alerts with the message field #151422 — thanks @vyctorbrzezowski.
- Close stuck submenus when moving between menu rows #152317.
- Keep picker dismissal working across overlapping chat composers 23b9b82d.
- Keep multiline drafts readable during keyboard navigation #154038 — thanks @vyctorbrzezowski.
- Reduce typing lag in the web chat composer #154451 — thanks @hxy91819.
- Keep typing responsive after selecting a mention #155181 — thanks @vyctorbrzezowski.
Keep attached context separate from your words
Long pasted excerpts appear as two-line cards in the composer and compact chips in sent messages, while newly attached Home context appears separately from the words you wrote. You can inspect the source, copy the original text or choose Show in text field directly on its card to restore it alongside your current draft without sending. The text sent to the model stays unchanged. Pasted-text previews cover up to 256 KiB and downloads retain the full content. The Home treatment applies to new messages with recorded context metadata, and attached context grants no additional permissions.
Prepare attachments and understand delivery failures
Files appear immediately in stable attachment slots with individual reading progress and removable errors, so you can see which file needs attention before sending. That progress measures the browser reading each file, and sending waits for active reads while excluding unreadable files. Replies retain failed attachment cards beside successful media, selected local workspace files can reach supported progress and final replies, and progress attachments survive the repaired cleanup race. Older failed deliveries may need a resend, and previously deleted files cannot be recovered by this fix.
Eligible connections served from the same Gateway's HTTPS origin can fetch inline transcript artifacts as raw file bytes, with fresh download permission on each click. The connection-bound links expire after five minutes and are not share links. Proxy operators must forward /api/artifacts/download/ under the configured UI mount, as described in the client guide; other connections and failed HTTP transfers retain the authenticated chat-connection path. Reconnecting or closing the preview prevents an outdated transfer from saving.
Sources and complete change list
Improvements
- Show stable attachment tiles with individual read progress and errors #152163 — thanks @vyctorbrzezowski.
- Translate attachment preparation announcements in twenty locales #152196.
- Move attachment history lookups off the Gateway thread #154448.
- Download inline transcript artifacts over HTTPS with fresh permission #154673.
- Reduce repeated work downloading transcript attachments #154726.
Bug fixes
- Keep attachment previews inside narrow chat composers #153080 — thanks @vyctorbrzezowski.
- Preserve progress attachments during managed-media cleanup #152645 — thanks @sahilsatralkar, @yetval, @takhoffman.
- Explain why an attachment failed in the current chat #151913.
- Keep session Actions accessible beside attachments #151975.
- Deliver attachments from the selected local session workspace #151888.
- Remove empty gaps around unavailable image cards #150573 — thanks @vyctorbrzezowski.
- Preserve mixed attachment failures and selected-worktree image, document and audio delivery #152079.
- Restore supported image pastes in chat #154367.
- Reduce stalls while preparing large inline artifact downloads #154521.
Documentation
- Clarify committed progress-message attachment guidance #152225.
Browse a message's images without closing the viewer
Browse the images attached to one message with buttons, arrow keys or swipes without closing the viewer. Sharper previews can open while originals load, then upgrade in place without resetting zoom, and a failed original leaves the preview visible. The gallery stays within one message and covers raster images, with SVG handled separately. Protected images still require Allow.
Play compact voice notes inside chat
Attachments marked as voice notes now play inside chat with compact play, seek, time and mute controls and a waveform measured from the audio, without file headers or opening a side panel. Ordinary audio files keep their metadata and expansion controls. If a voice note cannot preview, its available download opens separately so the conversation stays in place.
Sources and complete change list
Improvements
- Make voice notes compact and playable inline #154339 — thanks @vyctorbrzezowski, @tangqiu25.
Preview larger HTML attachments beside chat
Self-contained HTML attachments can fill the available height beside chat, making larger reports and interactive pages easier to inspect. Same-origin UTF-8 HTML previews now support up to 2 MiB, while text, Markdown and workspace reading or editing retain their 256 KiB limits. Cross-origin HTML remains download-only and the preview's sandbox permissions are unchanged.
Authored section links now scroll within the displayed document, including strict previews, without losing form values. Links created later by scripts are outside this change.
Open and read the intended file
Explicit chat file links open the intended reader, including CSV files and authored Markdown links with spaces, emoji or punctuation in their names. Website paths keep their hostname instead of becoming local-file buttons, and local directories that resemble hostnames need an explicit path such as ./. Background link renewal preserves reader focus and controls, while Escape from any in-file search control returns focus to its search button.
Agent Files also waits for file contents to load before allowing edits or saves, while retaining loaded files and unsaved drafts during refresh.
Sources and complete change list
Bug fixes
- Open CSV chat links in the conversation file preview #152900.
- Preserve website paths in chat file-link rendering #152630.
- Restore keyboard focus after closing file search #154221.
- Keep attachment keyboard navigation during link refresh #151858.
- Open workspace links containing spaces, emoji and punctuation #152179.
- Fix file-search dismissal and conversation keyboard entry #154454.
- Wait for agent file content before allowing edits #154910.
Download conversation Markdown
Use /export or /export-session without a path to download conversation Markdown from the browser. The guidance now matches that workflow, and an invalid path or a late export completion preserves your current draft and attachments. HTML and workspace exports in other clients keep their separate behavior.
Sources and complete change list
Bug fixes
- Correct browser export guidance and preserve composer drafts #152836.
Preview public links before opening them
Hover or keyboard-focus an ordinary public link to see page details before opening it, with an explicit Open in your browser action and a text fallback when images are unavailable. This sends the eligible URL, including its path and query, to the Gateway for an anonymous public-page fetch without your browser's site credentials. The existing automatic-favicon opt-out also disables this enrichment, and touch taps keep normal navigation.
Explore structured answers in Tree and Raw views
Structured assistant answers can be explored in expandable Tree and literal Raw views, with copying that preserves the original source and expansion choices that stay in place. Complete JSON objects and arrays use the inspector, while unfinished, invalid or oversized content keeps a readable fallback. Your own code fences and passive previews remain ordinary code.
Sources and complete change list
Improvements
- Explore assistant JSON in Tree and Raw views #153272 — thanks @vyctorbrzezowski.
Manage comments on selected passages
Pending comments on selected passages can be removed individually while the remaining preview stays open, or cleared together with focus returning to the composer. Remove all comments cannot be undone and no longer shows an Undo notification. Your message draft, ordinary files, already-sent comments and comments in other conversations stay intact, and reopened sent-comment previews remain visible after an interrupted hide animation.
Sources and complete change list
Improvements
- Add bulk pending-comment removal and keep individual deletion previews open #151409 — thanks @vyctorbrzezowski.
- Clear pending comments without toast or Undo and avoid duplicate image retries #153057 — thanks @vyctorbrzezowski.
Bug fixes
- Keep reopened tooltips and comment previews visible #152240.
Answer questions without losing their context
Agent questions keep entered answers and selected options while you move between them, retain the original wording after completion, and stay with the conversation they came from. Optional questions remain reachable above the composer or in a minimized strip, and unedited questions can move to history after later successful work while remaining reopenable. Archival supplies no answer or permission, secret answers remain masked, and blocking questions retain their separate Skip action. Ordinary and Other answers now support multiple lines, with Enter adding a line and Cmd/Ctrl+Enter submitting. Unfinished optional answers can recover after reload, reconnect or switching conversations in the same browser and authenticated Gateway identity, within a seven-day expiry and shared 20-record limit. Incognito and deletion retire saved data, and storage or conflicting-tab problems show a warning.
Dismiss postpones an optional question without answering, approving or stopping work, with immediate Undo or later Answer restoring unfinished input. Submitted answers show queued, sending, failed, uncertain or confirmed status, with Retry answer retaining the original answer and Discard reopening its draft. Saved history confirms delivery, so a recovered draft or a disappearing queue entry is not confirmation that an answer arrived.
Sources and complete change list
Bug fixes
- Preserve typed question answers and pending submission state #152096.
- Keep questions and approval cards in their originating conversation #151412.
- Keep full agent questions visible after answering #151623.
- Archive outdated optional reminders while keeping them answerable #153849 — thanks @vincentkoc.
- Keep unanswered questions visible above the composer #153418.
- Keep submitted optional questions resolved after reopening chat #154312 — thanks @jb510, @vincentkoc.
Improvements
- Keep optional questions compact while composing #154405 — thanks @vincentkoc.
- Write multiline answers in question cards #154432 — thanks @vincentkoc.
- Recover unfinished optional-question answers #154473 — thanks @vincentkoc, @jb510.
- Show optional-answer delivery status and recovery #154486 — thanks @vincentkoc.
- Remember optional-question dismissals and restore unfinished answers #154692 — thanks @vincentkoc, @vacinc.
Read and refresh task progress
Task-progress cards stay steadier when you send a message, make overflowing checklists easier to notice and keep keyboard focus visible. Refresh task progress asks for a current status update without adding a chat message, retains the previous card while waiting and confirms an update only when a newer saved version arrives. The refresh does not resume work or answer pending questions. You can also hide the cards as a browser-local display preference without stopping the underlying task. See progress-card refresh for its controls.
On mobile, progress stays collapsed by default across new messages and completion unless you open it. Completed work durations include the final model request when matching timing is available, and omit missing or mismatched timing instead of guessing.
Sources and complete change list
Improvements
- Hide progress cards, simplify settings hints and preserve queued foreground text and files #152429.
- Improve task progress handles, overflow cues and checklist alignment #150881 — thanks @vyctorbrzezowski.
- Refresh task-progress cards without adding a chat message #154044 — thanks @shakkernerd.
- Reuse unchanged progress-card rendering #153212 — thanks @jjjhenriksen.
- Read saved progress cards through the session worker #153857.
- Keep work-card refresh feedback inside its button #154193 — thanks @shakkernerd.
- Prefer measured progress bars for countable work #154385.
Bug fixes
- Keep task progress steady when sending messages #151388 — thanks @vyctorbrzezowski.
- Remove obstructing tool-summary hover text #152456.
- Keep tool-summary keyboard focus rings visible #149002 — thanks @romneyda.
- Repair progress refresh startup and retries after cancellation #154148 — thanks @shakkernerd.
- Use completed-run timing for chat work durations #149240 — thanks @romneyda, @vincentkoc.
- Keep corrections and progress refreshes reaching the active turn #154424.
- Recognize successful progress-card refresh retries #155025.
- Keep mobile task progress collapsed by default #155150 — thanks @vyctorbrzezowski.
Inspect active and completed tasks in Tasks
Open a background task or inline subagent activity to inspect its status and transcript inside Tasks, then use Back to tasks to return to the list. Review keeps its diff and Files keeps its selection, while reload can restore the selected task or show that it is unavailable. Compact activity summaries retain expandable details, and completed or canceled tasks update their labels correctly. Operation counts include repeated attempts and do not mean distinct files or successful results.
Sources and complete change list
Improvements
- Keep task activity summaries compact with full tool details available #152255.
Bug fixes
- Restore selected task details after reload, subsequently moved into Tasks #153185.
- Show task completion after clock rollback #153329 — thanks @gabrielnkl, @obviyus.
- Inspect subagent status and transcripts in Tasks #153260.
- Refresh canceled task delivery labels immediately #153226.
- Preserve task pagination during unrelated database cleanup #154400.
- Keep Tasks refreshes working during agent progress #155657 — thanks @vincentkoc.
Read delegated results as work finishes
Running, queued and waiting subagents keep a stable order in live chat activity. Finished, failed, canceled and timed-out runs leave that list when their final state arrives, making all five slots available for ongoing work. Their results, delivery details and final edit statistics remain in Tasks history and details, where expanded results remain readable and accessible. Completed native subagents also publish their final Tasks status without requiring a page reload.
Sources and complete change list
Bug fixes
- Expose individual Swarm child statuses to screen readers #150350.
- Keep expanded Swarm results clear of focus outlines #153168.
- Keep expanded Swarm results open during stale refreshes #154170.
- Preserve completed Swarm status during history refreshes #153840.
- Keep compact subagent rows stable during progress #154347 — thanks @vyctorbrzezowski.
- Remove finished subagents from live conversation activity #155408.
Improvements
- Clear finished subagents from inline chat activity #154469.
Check an unconfirmed Goal action
If Pause, Resume, Clear or editing a Goal returns an uncertain result, Check outcome lets you check the original action without repeating completed work, even after reconnecting or reloading a normal chat. Recovery is explicit and requires browser tab storage for normal chats, while Incognito recovery remains in memory. Saved requests expire after 24 hours, after which Review current goal refreshes the current state before your next decision. The Goal controls guide explains the recovery flow.
Goals now pause after terminal errors or timeouts, retaining their objective and usage with a frozen timer and a readable pause reason. Resume is deliberate, and an ordinary message does not restart a failed paused Goal. Starting or resuming a Goal still requires the built-in runtime.
Inspect tools available to the current conversation
Available Right Now includes tools bound to the current conversation and refreshes after a session reset, so the inventory better reflects the tools that conversation can use. Opening Tools also avoids refreshing the entire model catalog unnecessarily. Inspecting this list does not add tools or grant permission to run them.
Find people and keep linked accounts together
Explicitly linked GitHub accounts can keep one person's avatar, preferences and mention Inbox, and people search supports full names and verified handles. Selected mentions show avatars and open full person cards using information you are allowed to see, while assignment and sharing pickers remain searchable and current. Typing or pasting a name alone does not notify someone or grant membership. Before downgrading, keep a backup because older writers can discard secondary account links, and upgrading again will not restore them without explicitly relinking.
New visible child conversations can inherit the human owner when the verified requester matches the parent's human owner. Other cases retain the agent fallback, and existing conversations are not reassigned.
Sources and complete change list
Improvements
- Keep linked accounts together and make selected mentions open person cards #147568.
- Search session people pickers and show current profile details #153798 — thanks @vincentkoc.
- Simplify selected mention badges while preserving copied text #152423 — thanks @vyctorbrzezowski, @fuller-stack-dev.
- Open full person cards from selected mentions #153231.
- Show profile avatars in selected human mentions #152037.
- Avoid full history scans in the session member picker #152497.
- Move people-list and mention reads off the Gateway thread #152005.
- Inherit matching human ownership for new visible work sessions #155349 — thanks @vacinc.
Bug fixes
- Preserve mention selection and profile photos with keyboard and retry controls #152194 — thanks @vyctorbrzezowski.
- Reuse recent people searches in mention pickers #153988.
- Keep concurrent Gravatar photo requests independent #127172.
- Keep mention searches from consuming prompt text #154350 — thanks @vyctorbrzezowski.
- Accept detailed avatars in Safari and explain image rejection #154921 — thanks @stevekinney, @takhoffman.
Find conversations that mention you
An explicit mention can bring an accessible conversation into Involving me without requiring you to reply first. Personal Hide and Show controls follow your profile across browsers and restarts, and a fresh mention can bring a hidden conversation back. These controls appear when more than one identity is available and remain separate from Inbox dismissal, shared membership and archive state. Older conversations are not scanned for missed mentions. See finding sessions by owner.
Sources and complete change list
Improvements
- Find mentioned sessions in Involving me with personal Hide and Show #152083.
Understand Inbox alerts and saved Outbox messages
Inbox snoozes stay separate for each account and Gateway in a shared browser, and Dismiss or Dismiss all shown makes the scope of clearing ordinary notifications explicit. Failed or uncertain sends now appear in Inbox → System, with conversation identity and Review opening their recovery controls, including offline. Ordinary queued messages stay in chat, and account or connection displays no longer show Outbox counts. Review does not resend or discard a message, recovery entries cannot be dismissed like ordinary notifications, and an uncertain message may already have arrived. These recovery entries belong to the local browser tab and Gateway, without per-person or cross-device isolation. Older snoozes without a known owner may let an alert reappear once.
Sources and complete change list
Improvements
- Clarify Inbox dismissal and saved Outbox message status #153810 — thanks @vincentkoc.
- Reduce duplicate reads for connected Mentions Inbox viewers #153565.
- Keep notification recovery text and actions readable #151575.
- Review failed and uncertain message delivery from Inbox #153974 — thanks @vyctorbrzezowski.
- Simplify repeated sidebar and Settings text and dismissal controls #154344.
Bug fixes
Recover browser sign-in and reconnecting chats
Forget this browser in Settings → Connections → Gateway → Browser resets the current Gateway's browser sign-in without clearing unrelated preferences or other Gateways' sign-ins. It signs out the current tab and may require signing in or approval again, but does not revoke server-side devices or start a stopped Gateway. During ordinary reconnects, chat stays usable while its session list loads, with clearer account identity and connection status. Send problems are available from Inbox → System.
An approved browser can also finish reconnecting when pairing approval overlaps its handshake, while current identity and permission checks still apply. Disconnects without a supplied reason explain whether reconnection is automatic or needs a retry.
Sources and complete change list
Improvements
- Forget the current Gateway's browser sign-in without clearing other data #120319 — thanks @nehanth, @sallyom, @theangrypit.
- Explain Gateway disconnects without a supplied reason #155432.
Bug fixes
- Keep reconnect status and unresolved outbox messages visible #153321.
- Prevent global chat freezes during reconnect #151567.
- Clarify expired pairing-code notices #153921 — thanks @vyctorbrzezowski.
- Complete authorized browser pairing when approval overlaps reconnect 5cae2458 — thanks Peter Steinberger.
- Restore profile preference reads on multi-agent Gateways #147930 — thanks @ceckert, @obviyus, @ctbritt, @lakemike.
- Keep saved permissions visible after a failed refresh #154982.
Recover failed chats and queued follow-ups
Failed or timed-out chats can show their saved error and Copy error even when the live notification was missed, while temporary history-index rebuilding returns a retryable error. Failed pending messages can be discarded locally and stay removed after reload, and queued follow-ups can proceed once completion of their exact run is confirmed. Discarding does not undo accepted work or history. An outdated guarded Stop request also leaves a replacement conversation and its newer queued work alone.
Late events and a failed steering follow-up now preserve the current reply, draft and Stop target. A direct follow-up can pass older explicitly queued input without losing it, while explicit Queue and Goal ordering remain in place.
Sources and complete change list
Bug fixes
- Return retryable chat errors while transcript indexes rebuild #119778 — thanks @fuller-stack-dev, @agentsolomon.
- Show saved run errors when chat notifications are missed #153568 — thanks @vincentkoc.
- Keep session history current after rollback or database replacement #153010.
- Discard failed pending chat messages from the transcript #152188 — thanks @mertbasar0, @obviyus, @laurencebrown.
- Release queued messages after their conversation finishes #152299.
- Clear resolved queued-message edit conflicts #150220 — thanks @vyctorbrzezowski.
- Keep outdated Stop requests from interrupting replacement conversations #152116.
- Preserve current conversations and settings through delayed events #152375.
- Keep delayed permission errors out of replacement chats #154737.
- Keep delayed Stop feedback with its original chat #154805.
- Send active-conversation follow-ups past older queued messages #154806 — thanks @vincentkoc.
- Keep replacement-session messages with their own conversation #154983.
- Show one assistant answer after model fallback #155336 — thanks @vacinc.
- Keep active replies visible when a follow-up fails #155746.
Improvements
- Separate chat delivery status from recovery actions #154365 — thanks @vyctorbrzezowski.
Create and apply personal themes through an agent
Ask an agent to discover, choose or create a personal theme and save it to your authenticated profile for use across signed-in browsers. Appearance uses the same catalog, including enabled plugin themes, and connected browsers update as choices change. This requires an updated UI and Gateway together, while older tweakcn imports remain browser-local. If a selected theme becomes unavailable, Claw renders temporarily and the selection is retained for its return.
Plugin themes can also package bounded, self-contained SVG hats and composer visitors, while personal themes use the built-in decoration choices. The existing Lobster visits preference still controls visitors.
Apply a theme's complete appearance
Choosing a different theme now applies its default fonts and full palette, and eleven built-in themes gain locally bundled light and dark backgrounds. Existing preferences survive the upgrade and you can customize a theme after selecting it. Custom palettes use neutral artwork, increased contrast and forced colors hide artwork, and reduced transparency makes the composer opaque. Before downgrading to a Gateway that accepts only hex accents, remove ui.prefs.accent=theme or replace it with a hex color. Appearance settings covers these choices.
Personal and plugin themes can opt into neutral branding, their own waiting phrases and supported avatar hats or visitors. Omitted options retain the usual appearance, and these additions do not change built-in themes by default.
Sources and complete change list
Improvements
- Apply the complete default appearance when switching themes #152254 — thanks @vyctorbrzezowski, @fuller-stack-dev.
- Add theme-matched light and dark backgrounds with accessibility fallbacks #153583.
- Let themes customize mascots, waiting phrases and decorations #154518.
- Let themes customize chat composer corners #154583.
- Add four optional theme avatar hats #154774.
Keep dashboard layouts and widgets in place
An unchanged dashboard restores its selected, closed and focused panel arrangement after reload, and moving a loaded widget to an unopened tab preserves unsaved input and counters. The layout menu shows when the current view matches its shared default, while a lone full-width widget gets more unobstructed space with controls in the task menu. Explicit presentation changes still take precedence, and preserving a widget during a move does not make arbitrary widget state durable across reloads or deletion.
Use current view as default now saves both the opening view and split or fullscreen presentation, while personal layouts retain priority and existing viewers are not rearranged. Identical previously approved widgets can also avoid another model review for the same agent, name, content and declarations, subject to current permissions. This temporary reuse excludes new or changed widgets, MCP apps and Incognito sessions; see dashboards.
Sources and complete change list
Improvements
- Save dashboard changes through the database worker #153159.
- Show when the dashboard matches its shared default #152032.
- Move lone fullscreen widget controls into the task menu #152053.
- Reuse approved widget assessments across sessions #155698.
Bug fixes
- Keep other work responsive during board saves and remove interactive MCP tools after access revocation #148948 — thanks @fuller-stack-dev.
- Preserve transparent backgrounds in chat widgets #151972.
- Correct dashboard gallery result-count wording #153646.
- Keep dashboard side-panel selection after reload #151448.
- Preserve closed and focused dashboard panel arrangements on reload #151782.
- Match fullscreen widget and session menu typography #152223.
- Preserve widget input when moving between dashboard tabs #152738.
- Make right-to-left panel resizing follow user input #151989.
- Let focused dashboard widgets fill the task area #154440.
- Honor saved dashboard defaults when reopening sessions #155524 — thanks @carme99, @comfychloe.
Follow Activity recaps with less repeated work
Activity recaps and people lists avoid preparing information they do not need, reducing repeated work during refreshes. Session assessments and recaps also recover when an implicit model choice selects unavailable Codex, while an explicitly chosen unavailable Codex route still reports failure. These utility requests remain tool-free.
Sources and complete change list
Improvements
- Reduce unnecessary work in Activity people lists #151886.
- Avoid unnecessary saved-prompt decoding during Activity refreshes #150257 — thanks @vincentkoc.
- Reduce repeated people lookup work in Activity #154623.
- Reduce repeated work building Activity people counts #154978.
Bug fixes
- Restore assessments and recaps with unavailable implicit Codex #151241 — thanks @jalehman.
Preview images in Activity and project files
Activity shows compact, uncropped HTTPS image previews that can expand without taking over the list, and plugin README and agent-file previews can load HTTPS images automatically. Those images are fetched directly by your browser, so their hosts receive its network address. HTTP images remain blocked, and Markdown attachments and Workshop previews retain click-to-open behavior.
Sources and complete change list
Improvements
- Load HTTPS images in compact Activity previews #152045.
Complete 30-day Usage reporting
Usage opens with the last 30 calendar days, with history and totals covering the full session report you’re allowed to see, even beyond the visible list. Started by helps you compare tokens, estimated costs and session counts by who started the work. Each whole session is attributed to its recorded creator, with older unknown creators shown as Unattributed.
Costs are estimates rather than provider bills, and the page makes loading or incomplete totals explicit. Session CSV exports and session, text or hour filters use the loaded rows, with exports respecting your selections and filters.
Sources and complete change list
Improvements
- Add 30-day creator-based usage reports, OAuth settlement retry and sidebar busy recovery #152528.
- Reduce Usage report work for large session inventories #152366.
- Keep large usage reports from blocking unrelated Gateway work #152543.
- Decode only selected usage summaries in targeted reads #152550.
- Reduce repeated decoding in usage-cost refreshes #153348.
Bug fixes
Inspect CPU activity in a movable panel
The System busyness panel separates host and Gateway CPU readings, uses clearer labels and can be moved with a mouse, touch or keyboard, with its position remembered in browser storage. Gateway 100% means one CPU, while host 100% represents the machine's total capacity, and child or remote processes are excluded. High ping receives a visible warning color, and unavailable counters stay absent rather than implying a measurement.
Vitals continue updating when another tray request is slow. Hidden tabs pause polling, and a reset leaves samples absent until a fresh measurement arrives.
Sources and complete change list
Improvements
- Show host and thread CPU details and preserve verified UI assets during cleanup #152295.
- Reduce CPU work during overlapping diagnostics polls #152726.
- Highlight high Gateway ping in System busyness #152627.
- Move and remember the System busyness panel #154207.
- Make CPU usage readings easier to scan #153149.
Bug fixes
Find machines and inspect recent resource use
Systems offers a compact machine list with sorting and online or offline filters, plus recent load, memory and volume free-space graphs for the selected machine. History accumulates while Systems is open and resets after reconnects or gaps, so it is a recent view rather than a stored monitoring history. Connected nodes report their home volume, and load should not be read as CPU utilization.
Read and control chat on a phone
Mobile web layouts keep message margins, galleries, session controls and sidebar tools within reach, with search available from the navigation drawer and placement choices stacked for smaller screens. On recognized iPhone and iPad Safari browsers, a single Attach entry opens the existing file chooser, with camera and source prompts still controlled by the operating system.
Sources and complete change list
Improvements
- Simplify attachment selection in iPhone and iPad Safari #152271 — thanks @vyctorbrzezowski, @hannesrudolph.
- Expose search in the mobile chat drawer #150551 — thanks @marvinthebored, @peetiegonzalez, @shakkernerd.
- Make mobile session placement clearer and order cloud profiles consistently #153757 — thanks @vyctorbrzezowski.
- Add space around sidebar highlights and mobile chat #153735 — thanks @vincentkoc.
- Give mobile sidebar session titles more room #154493 — thanks @vyctorbrzezowski.
Bug fixes
- Keep mobile message margins and contain image galleries #150518 — thanks @vyctorbrzezowski.
- Keep mobile session controls and sidebar tools reachable #153131.
- Keep branch controls and Skills menus usable in narrow panes #155232.
- Keep Secrets row actions visible in narrow tables #154586 — thanks @moerai, @obviyus, @landonschropp.
Read current controls in your language
Twenty existing interface languages receive updated wording for setup, chat status, recovery, themes, usage, models and desktop guidance. These updates bring more current controls and explanations into those languages without introducing new language choices or changing the behavior of the features they describe.
Sources and complete change list
Improvements
- Refresh translated sign-in and chat-status messages #151294.
- Translate image navigation and session recovery messages #152098.
- Refresh meeting and chat translations across twenty locales #152276.
- Translate session, desktop and preview status messages #152303.
- Translate desktop-access setup guidance #154047.
- Refresh Control UI translations for current search and setup guidance #151698.
- Translate session setup and CPU diagnostics #152402.
- Translate older-message indexing guidance #152609.
- Refresh translated guidance across Control UI #152653.
- Update translated chat and connection guidance #153465.
- Translate portal settings and recovery guidance #153574.
- Translate session shortcut labels across existing locales #153633.
- Translate installed-agent and chat-permission guidance #153690.
- Refresh translated tool-output and desktop-sharing guidance #153726.
- Refresh translated installed-coding-app guidance #153762.
- Translate GitHub account guidance and update comparison links #153775.
- Translate model-route and notification explanations #153816.
- Refresh timeout and Mac presence translations #153427.
- Refresh translated setup guidance for live settings #154245.
- Translate the unavailable-theme warning into 20 locales #152842.
- Refresh Usage-page translations across 20 locales #152911.
- Refresh Control UI translations for 20 existing languages #152998.
- Refresh Control UI labels and help in twenty locales #153892.
- Translate Goal recovery and task-progress refresh guidance #154159.
- Refresh translated chat-history, question and notification wording #154343.
- Refresh Control UI translations across twenty locales #154444.
- Refresh localized optional and required question headings #154500.
- Translate Search settings and current chat guidance #154580.
- Refresh translated chat and settings guidance #154870.
- Refresh cloud-worker and group-history translations #155252.
- Translate current review messages and settings guidance #155324.
- Translate avatar image rejection guidance #155352.
- Translate update progress and connection notices #155488.
- Translate Memory-page search availability guidance #155539.
- Refresh Chrome setup translations #155700.
Bug fixes
- Translate model-refresh and panel-movement hints #154274.
Reduce repeated work in chat and panels
Chat and sidebar updates avoid some layout stalls, and opening a conversation downloads less information for Inbox alerts. The automation editor still loads the complete job settings when you open it.
Logs, Debug, Devices and channel-pairing views now pause selected background polling while hidden and refresh when you return. Explicit refresh remains available, and requests already underway are not canceled.
Sources and complete change list
Improvements
- Reduce background automation downloads when opening chats #153040.
- Defer link-reader helpers during Control UI startup #153931.
- Defer unused panels when opening chat #154437.
- Load browser voice transport code when a call starts #154666.
- Pause selected Control UI polling in hidden tabs #155617 — thanks @vincentkoc.
Bug fixes
Updates and Maintenance
Managed updates can finish with recoverable warnings and clear repair guidance, while restart recovery helps unfinished conversations continue from saved progress. Make and verify a backup before updating, because rolling back the application does not restore your data.
Automatic updates for idle headless nodes
Packaged headless nodes on stable or beta releases now update automatically when their work and cleanup are idle, keeping their pairing, settings and launch options. They check hourly after connecting, leave at least 12 hours between activations, and fall back to the previous runtime if the replacement cannot start. Busy work and plugins without explicit idle reporting can defer activation indefinitely.
You can turn this off with nodeHost.autoUpdate.enabled: false, update.checkOnStart: false, or OPENCLAW_NO_AUTO_UPDATE=1; the Gateway's automatic-update switch is separate. Native app nodes, private workers, source installs and extended-stable pins keep their existing update paths. Releases needing database migration or repair still require openclaw update, and older co-located Gateways need one normal upgrade first. See headless node updates.
Sources and complete change list
Improvements
- Automatically update idle packaged headless nodes #151545.
Request updates from operator-owned schedules
Operator-created scheduled agent jobs can request an ordinary Gateway update without inventing a chat owner identity. Jobs originating from external requesters do not gain that exception, and notification destinations do not become the authorizing user. Existing update restrictions still apply. If scheduled authority ends while update preparation is underway, inspect the update status; that late revocation may not stop the prepared update from proceeding. See updating.
Sources and complete change list
Bug fixes
- Allow operator-scheduled automation updates #154484 — @agebreak0083.
Bring prepared agents online during fleet startup
In larger installations, prepared agents can take requests while the rest of the fleet finishes starting, with pending agents shown as still preparing. Startup and session-source reads also avoid repeated checks and unnecessary loading of saved prompts. A ready Gateway can therefore have optional agents that are not yet available; readiness does not mean the whole fleet has finished, but the required default and system agents must have usable databases.
Sources and complete change list
Bug fixes
- Reduce Gateway startup stalls and database worker conflicts #151805 — @609nft.
- Keep prepared fleet agents available during remaining startup #151074 — @609nft.
Improvements
- Reduce session-store discovery work across larger fleets #153223.
- Reduce repeated filesystem checks for session sources #153319.
- Batch model-catalog reads for large agent rosters #152491.
- Reduce unnecessary worker prompt reads in large session stores #149700 — @vincentkoc.
- Avoid repeated filesystem lookups during session reads #149838.
- Skip unused saved prompts in worker-cleanup identity reads #152447.
- Move session placement evidence reads off the Gateway thread #152901.
Prioritize required repairs in large fleets
Large-fleet updates reuse configuration and plugin inspections and prioritize repairs needed to start the replacement. Optional checks that are deferred have not passed yet, so run openclaw doctor --fix after activation to finish them. Older installed updaters keep their existing time limits until they have been replaced.
Sources and complete change list
Bug fixes
- Reduce repeated configuration validation during fleet updates #151678.
- Prioritize required Doctor repairs during large-fleet updates #151683.
- Reduce large-fleet validation overhead and settle cleanup #152378.
Improvements
- Reuse Doctor preparation across large fleets #151366.
Finish backups while ordinary files change
Backups can finish when ordinary files disappear during capture, preserving the surviving files and reporting omitted paths. Completed database copies also return their result without waiting for unrelated activity, while archive creation and verification avoid repeated copying and searches. Required roots, unsafe file substitutions and capture or I/O failures still stop the backup, so review omissions before relying on an archive.
Backups also recognize duplicate registrations of the same database and preserve committed journal data across supported hardlink aliases. If a core database has hardlinks, include every alias in the backup's admitted resources and stop writers when directed; conflicting owners, ambiguous journals or capture-time changes still prevent an archive. Maintaining a private snapshot does not grant permission to maintain its live source.
Sources and complete change list
Bug fixes
- Resume completed SQLite backups in idle processes #152302.
- Continue backups when ordinary files disappear, report omissions and filter transient names except explicitly selected roots #153395 — @migelizaga-rgb.
- Deduplicate backup registrations and preserve journal data across aliases #154006 — @rjaillc.
- Preserve backups recovered while creation is still finishing #155075.
- Allow Doctor maintenance on snapshots from a running Gateway #155428.
- Avoid false cleanup warnings during active backups #155546 — @vincentkoc.
Improvements
Compact saved history and memory storage
Saved agent history now uses selective lossless compression, and memory vectors keep their full precision in a more compact binary form. Search maintenance can find the rows belonging to a conversation without scanning unrelated history. Existing database files may not immediately shrink, and reading or appending full conversation bodies can take more CPU. Valid vector conversion happens locally without an embedding-provider call.
Use the supported update or Doctor migration path with all writers stopped, a verified backup that includes pending database journal data, and space for temporary tables, journals and backups. The final formats are agent schema 23 and shared-state schema 18; older builds refuse converted stores, so downgrading requires the matching older build and pre-upgrade backup in a separate state directory, not changing version markers. Direct database readers need supported accessors or exports, and compressed rows require a compatible decoder. See database versioning.
Verify retained launcher backups
Updates no longer reject a retained launcher backup solely because the platform cannot preserve explicitly unsupported symlink metadata. Link targets, entry types and regular-file contents still have to match, and genuine mismatches leave the failed backup available for inspection. This belongs to the installed updater, so an older updater blocked before activation may need the documented manual first upgrade.
Sources and complete change list
Bug fixes
- Tolerate unsupported launcher symlink metadata during updates #153081 — svenmy76.
Preserve chosen configuration during repairs
Doctor preserves explicitly chosen workspace locations, leaves comments and formatting alone when no repair is needed, and keeps session-store ownership through unrelated settings changes. It can offer confirmed recovery of a removed owner setting from an eligible root-only, same-store backup, while conflicting tool lists are repaired only when permissions can be preserved. Ambiguous permission changes remain your decision, and a refused configuration write stops dependent service repair.
Successive repairs also preserve authored environment references, literal values and included-file ownership, checking for intervening edits before each write. A later refusal keeps earlier committed repairs and backups, and removing redundant local OAuth copies preserves the chosen preferred and fallback account order.
Sources and complete change list
Bug fixes
- Preserve session-store ownership through unrelated edits and offer confirmed backup recovery, while actual store changes clear copied ownership #151468 — @shadesurgeon, @sunnyshu0925, @masterswords1.
- Preserve explicitly configured workspaces during profile repairs #145976 — @ericcaiwx-star, @fuller-stack-dev, @oshunter.
- Honor Doctor configuration refusals before repairing Gateway services #147120 — @vincentkoc, @fuller-stack-dev.
- Avoid rewriting configuration when Doctor has no plugin repairs 6997e1d9 — @romneyda.
- Repair safe tool-list conflicts without changing permissions #151121 — @mertbasar0.
- Preserve environment references and literal intent through Doctor repairs d3e51290 — @vincentkoc, @fuller-stack-dev.
- Keep configuration revision checks across successive Doctor repairs #147235 — @vincentkoc, @fuller-stack-dev.
- Preserve config references and ownership, plus New Session focus and canceled snapshot work #147440 — @vincentkoc, @fuller-stack-dev.
- Preserve account priority during Doctor credential cleanup #155629 — @bdjben, @obviyus.
Improvements
- Reduce repeated checks during configuration saves #154758.
Run historical data repairs through Doctor
Historical conversation titles, ACP metadata, transcript markers, worktree paths and task identifiers are repaired through Doctor maintenance, keeping ordinary startup and reads from rewriting that history. openclaw update already runs the required repair pass. Supported container image upgrades now invoke Doctor maintenance automatically before serving. Direct binary replacements, state touched by older writers, or a specific remaining historical repair still need the supported Doctor preparation; when offline repair is required, stop writers and run openclaw doctor --fix against the same state and configuration before restarting.
Successful imports can continue past archive-only or scratch-cleanup warnings, while changed originals, incomplete captured data and storage or ownership failures still need attention. Ambiguous task identifiers remain unchanged rather than risking a result reaching the wrong task; title repair also retains a limitation when several agents share one physical store.
Intentionally retained stores from deleted agents no longer block unrelated active-agent repairs, and valid ACP ownership repairs can finish while retired workers settle. Deleted agents stay deleted, with unverified or changed history still protected.
Sources and complete change list
Limits and compatibility
- Reserve historical shared-state repairs for Doctor #151418.
- Move old transcript marker conversion into Doctor #153125.
- Move historical title and ACP-key repair into Doctor, with shared-store title coverage still limited #151211.
- Repair historical task identifiers through Doctor, preserve completion bindings, pass active update context to recovery advice and defer Usage-only labels #153509.
Bug fixes
- Continue safe Doctor repairs after archive-only failures #151313 — @sunnyshu0925, @karleetdm.
- Let verified session migrations complete while plugins remain pending #153097 — @berklingtools, @droidyouwerelookingfor, @wiipud, @ozp, @ericpearson.
- Read long session headers during stale-path repair #154034 — @xydt-juyaohui.
- Preserve successful transcript migration after scratch cleanup failure #151370 — @masatohoshino.
- Keep retained deleted-agent databases from blocking active updates #154136 — @joshpetras.
- Keep ACP Doctor ownership checks working during worker cleanup #154889 — @shakkernerd.
- Let Doctor finish while preserving deleted-agent history #155752.
Improvements
Recover verified session imports
If an old session index disappeared or a restored file changed identity after history was imported, openclaw doctor --session-sqlite recover can repair the import records using verified retained content. Current conversation settings and deletions remain authoritative, and changed or unverifiable files stay protected for inspection. Follow the SQLite recovery guidance and preserve files named in conflicts; a running Gateway does not by itself mean those files are ready for cleanup.
With the Gateway stopped, Doctor can settle verified leftover imported transcripts, append an eligible missing suffix and archive the original bytes. Conflicting or malformed files remain protected, and recovery through a fixed custom store for a nondefault agent still has a path-selection limitation. New reports distinguish current findings from historical errors; a retained archive warning alone needs no repair when the expected conversations are present.
Sources and complete change list
Bug fixes
- Recover verified session imports after missing or replaced source files #153655 — @cpsleepy, @mmm7053455-tech, @blackeyes-boy, @albertyn87.
- Keep deleted-agent stores out of automatic session imports e99e75e2 — Peter Steinberger.
- Explain archived-registry warnings without losing session counts #153314 — @najef1979-code.
- Let Doctor settle verified leftover imported transcripts #154413 — @cortanapham.
- Settle identical session import archives #155194 — @fozzels-assistant.
- Stop failure reports after clean session recovery #155246 — @chelsealong, @obviyus, @bipolar84.
- Separate current recovery findings from historical errors #155376 — @lojasarah.
Understand and finish Doctor checks
Doctor's final results now retain the original reason for a refused migration, identify plugins that failed to load, and give useful disk-space guidance. Completed checks survive cleanup-only delays instead of becoming false update failures, while unfinished checks still report a timeout. Standalone noninteractive Doctor exits with an error for plugin-load failures; updater-invoked Doctor can retain those findings as warnings when the update can otherwise proceed. See how updates run for the remaining older-updater limits.
Private update validation can also defer named optional inspections and print the commands to run after activation. Those checks have not passed, required failures still block, and this does not extend an older updater's overall deadline.
Sources and complete change list
Improvements
- Reuse private database copies within Doctor reports, with potentially higher temporary disk occupancy #153584 — @masterswords1, @dmlau76.
- Avoid unnecessary auth loading during Doctor session repairs #153602.
- Move Crabbox diagnostic storage reads off the calling thread 3bbb9a3f.
- Move Skill Workshop diagnostic reads off the calling thread 45384f58.
- Reuse Doctor inspection work for pending plugin migrations #152793.
- Skip unused plugin catalogs during startup inspection b46071e5.
- Reuse prepared plugin metadata during repeated checks #153452.
- Move workspace readiness reads into the background #153183.
- Explain where heartbeat worker startup stopped #154779 — @vincentkoc, @lucarinaorg.
- Defer optional Doctor inspections during update validation #155244 — @zanemc-ao, @agebreak0083, @baumus.
- Avoid redundant early Doctor database repair #155446.
Bug fixes
- Include original failures in blocked migration receipts #152335.
- Faster Doctor traversal of large retained histories #153851.
- Report plugin-load failures in Doctor's final outcome #153640 — @th-m-vogel.
- Reduce unrelated work during Doctor's Matrix state repair #152203.
- Preserve completed Doctor results through cleanup delays while older 2026.9.4 updaters retain their aggregate limit #153679 — @sebastian-hoebarth.
- Preserve database quarantine refusals through cleanup failures 749909f8.
- Preserve original SQLite errors during rollback cleanup #154862 — @vincentkoc.
- Keep actionable terminal-session migration errors visible #154928.
Repair plugin versions and follow actionable guidance
After a manual core upgrade, openclaw doctor --fix can bring eligible official npm plugins back into line while respecting newer pins and nondefault tags. Repair guidance now distinguishes an attainable release from registry lag, reports unreadable required manifests, and avoids sending you around a circular migration fix. Third-party plugins stay with their own maintainers, unavailable packages remain warnings, and missing required manifests can still make post-upgrade checks fail.
Doctor can reconnect existing settings after an interrupted installation of a trusted, declared replacement plugin ID, while existing canonical settings and explicit disables take precedence. Candidate inspection also accepts valid import.meta syntax and names remaining per-plugin parse warnings without treating a malformed plugin as healthy.
Sources and complete change list
Bug fixes
- Give achievable ClawHub update advice and explain registry lag #145103 — @dasx, @vincentkoc, @fuller-stack-dev, @colton-harris, Jason Sy.
- Repair official plugin version drift after manual core upgrades #153027 — Prince.
- Report missing or unreadable required plugin manifests after upgrades baec505b.
- Avoid circular plugin migration recovery advice #153419 — @romneyda.
- Recover plugin settings after interrupted canonical-ID configuration writes d9123f86 — @vincentkoc, @fuller-stack-dev.
- Copy plugin snapshots without native rename support #154354 — @vincentkoc, @lucarinaorg.
- Prevent plugin parsing from blocking update rehearsal #155394 — @colehammond65.
Preserve local plugin overrides during updates
Updates preserve local plugin overrides and the npm copies they shadow, with guidance about which copy is active. Check that your override supports the new release, or deliberately remove it to return to the managed copy. Preserving a local plugin does not grant it trust, and channels blocked by trust policy stop retrying until that policy is resolved. The plugin sync guidance explains the update behavior.
Sources and complete change list
Bug fixes
- Preserve local plugin overrides during update and explain blocked channels #151851 — @whitenesstiger.
Honor explicit update work deadlines
Plugin and hook updates can finish longer work when no work deadline was supplied, while explicitly short deadlines are honored. The same distinction carries through supported Doctor, plugin-convergence and finalization paths, without removing separate metadata, readiness, cleanup or enclosing updater limits. Git plugin clone and checkout still have a cancellation gap when running without a deadline, so this is not a promise that every stalled update can be canceled immediately.
Sources and complete change list
Limits and compatibility
- Honor plugin and hook work deadlines while retaining the Git clone and checkout cancellation limitation #153043 — @fuller-stack-dev.
Bug fixes
- Let post-core plugin updates finish without an implicit work deadline #153109 — @fuller-stack-dev.
- Avoid implicit overall deadlines during update finalization #153085 — @fuller-stack-dev.
- Preserve omitted Doctor deadlines during update finalization #152973 — @fuller-stack-dev.
- Honor omitted work deadlines in the Git updater API #153036 — @fuller-stack-dev.
Keep update work from overlapping
Long package updates retain exclusive control until their work has settled, and cancellation waits for cleanup before another update or repair can proceed. If cleanup cannot be confirmed, OpenClaw keeps recovery files and may leave the Gateway stopped. Inspect openclaw update status before retrying, and do not delete a lock merely because it is old or its parent process has exited.
Sources and complete change list
Bug fixes
- Prevent overlapping installation work during long package updates #153093 — @fuller-stack-dev.
- Wait for update command cleanup before releasing control #150959.
- Keep refused update helpers from proceeding during cancellation #154289 — @vincentkoc.
- Prevent private Node installation after update authority is lost #154334 — @vincentkoc.
Let active work settle before restarting
Managed restarts verify the serving Gateway and give admitted agent, subagent and scheduled work time to finish before storage and helpers close. Unknown activity no longer counts as idle. Forced restarts close new admissions immediately and normally allow up to five minutes for admitted work, capped by the service's remaining shutdown allowance; work still running at the deadline is canceled. An explicit forced wait of zero is immediate, while ordinary --wait 0 remains unbounded except for native service limits. These Unix recovery changes require the updated launcher. Recognized stale Linux shutdown policy can now be repaired during eligible updates or Doctor maintenance; custom definitions may still need same-profile openclaw gateway install --force to pick up KillMode=mixed. See restart recovery.
Already-pending authorized answers and approvals can complete during graceful draining, and eligible replacement subagents can save their results. New work stays blocked, and exhausted budgets are not renewed. Older forced callers that supply no budget retain at most 45 seconds of draining within their 60-second replacement window.
An update can now get past a stuck Gateway that refuses connections because its installation has already been replaced. OpenClaw warns before stopping it, and active tasks may be interrupted. Other failures to inspect active work still follow the usual restart protections.
Sources and complete change list
Bug fixes
- Use remaining Gateway shutdown time for sidecar cleanup #151360.
- Preserve local Gateway restart cleanup and initial chat position #153267.
- Defer restarts when active work cannot be inspected #118053 — @harjothkhara, @fuller-stack-dev, @dale-goes-fast.
- Let admitted work drain during recovered Unix Node restarts within existing service deadlines #153435 — @ly85206559, @obviyus, @donniefi.
- Verify the serving Gateway before recovered restarts #153510.
- Unblock forced restarts while cron cleanup is pending #153575.
- Drain delivery maintenance before shared storage shuts down #152379.
- Release agent database leases before update maintenance #151435.
- Refuse pending database writes as shutdown begins #152536.
- Keep a bounded Gateway exit path after shutdown cleanup errors 6f60b59b — @metahacker, Vincent Koc.
- Fix Workboard restart cleanup and stop periodic work during shutdown #154203 — @flynnmcpoc, @abusido82.
- Give forced restarts bounded time to finish admitted work #154300 — @metahacker, @vincentkoc, @alvelda, @rvelasquez.
- Finish admitted task maintenance before Gateway shutdown #154308.
- Join discarded attachment cleanup during Gateway shutdown #154832.
- Accept pending answers and approvals during shutdown #155287.
- Preserve replacement subagent results during graceful restart #155310.
- Stop replaced Gateway installations without waiting for unavailable drain checks, and give delegated Doctor stops a default timeout when none was supplied 1d8c0fcd — Peter Steinberger.
Restart recovery
You can return to unfinished conversations after a restart with their saved history, progress and tool results, plus a restart notice. The agent leading the conversation decides how to continue interrupted subagents instead of automatically relaunching them, checking that earlier work stopped and whether an action already took effect before repeating or replacing it. Stopped conversations stay stopped, and continuation still depends on current permissions and recovery checks. See what survives a restart.
Sources and complete change list
Bug fixes
- Preserve restart notices and requested session continuation recovery #152929.
- Retain subagent progress across repeated restarts #151450.
- Recover conversations stranded after Gateway restarts #153433.
- Resume unfinished parent work after Gateway restart #153243.
- Keep stopped parent conversations canceled across restart without guaranteeing that every child stopped #153271.
- Recover parent tasks across sibling completion retries #153850 — @vincentkoc.
- Preserve restart recovery restrictions and final-answer handling #137483 — @vincentkoc, @fuller-stack-dev, @jaxonparrott.
Improvements
- Prepare interrupted-turn replay through the history worker #153432.
- Batch pending-delivery checks during restart recovery #154591.
The restart-recovery correction also fixes model-catalog resource cleanup.
Recognize slow but progressing startup
Restart, update and diagnostic checks distinguish a Gateway that is still making startup progress from one that has failed, and local health checks recognize serving wildcard listeners on macOS. At the restart wait limit, exit code 2 means still starting, not healthy; health and channels JSON may likewise exit 0 with status=starting. Check openclaw gateway status --deep and inspect again before treating the service as ready. Existing wait budgets remain, and an older updater already running cannot inherit the new checks.
Sources and complete change list
Bug fixes
- Recognize serving wildcard Gateways in local health checks #153984.
- Avoid false restart failures during progressing startup #151387.
- Preserve progressing Gateway startup during update verification #151663 — @freshxiaoyao, @drtony1.
- Avoid false Gateway failures during slow startup #153063 — @suidge.
- Reuse paired service credentials for trusted-proxy restart checks #153540.
Improvements
- Defer unnecessary Gateway work during update validation #154548 — @zanemc-ao, @baumus, @jplavoiemtl, @seahopark, @mirr0ch1, @ago1776, @zsh20000414.
Change scripts that use the restart signal
On supported Node installations on macOS and Linux, SIGUSR1 now opens the debugger without restarting the Gateway. Change scripts that used it for restarts to SIGUSR2, or use openclaw gateway restart, which retains handling for verified older running Gateways. The restart and supervision guide explains the signal change.
Sources and complete change list
Limits and compatibility
- Reserve SIGUSR1 for the debugger, move Gateway restarts to SIGUSR2 and QA diagnostics to SIGQUIT #153462.
Apply more settings without restarting
With live configuration reload enabled, more settings apply without restarting the Gateway, including Cloud Worker profiles, meeting capture, Desktop connections, Browser control and access policy. Successful overlapping settings and secrets reloads also avoid an unnecessary recovery restart. Affected services or clients may reconnect, existing workers keep their original provisioning settings, and newly enabled auditing does not fill historical gaps. Listener address or port, effective authentication mode and TLS topology still require a restart.
Reduce repeated startup preparation
Eligible same-version clean restarts reuse completed database verification, and startup loads fewer unused dependencies. Memory, document and Codex workers also start with less overhead, while concurrent Windows UI preparation can reuse fully verified assets. Upgrades, unclean shutdowns, replaced files and migrations still require full checks; damage within the same file may be found after readiness, so a quick restart is not a fresh integrity certificate.
Sources and complete change list
Improvements
- Reduce background worker startup time and memory use #154293.
- Reuse database checks after eligible clean restarts while refusing startup if the required dirty marker cannot be written #153463.
- Skip unnecessary config-recovery lookups when no backup exists #151801.
- Load workspace discovery dependencies only when needed #154115.
- Load Gateway startup recovery on demand with manual fallback #151699.
- Reduce unnecessary imports when shared-state workers start #153399 — @vincentkoc.
- Avoid duplicate database verification before startup migrations #155386 — @fuller-stack-dev, @zyv5ge, @harjothkhara.
Bug fixes
Keep managed services on the selected installation
Updates and Doctor can identify eligible managed Gateways pointing at a different installation. Eligible updates repair recognized stale service settings through a backed-up transaction, and standalone openclaw doctor --fix now uses that same repair on writable packaged installations. Supported custom values are preserved while unknown edits stay available for review. Credential writes and unrelated command changes still need confirmation, and unverified recovery remains pending. Supported Node installation changes may trigger a noninteractive installation of a private compatible Node runtime without changing system Node. Already-stopped services remain stopped, externally managed services keep their owner, and --no-restart does not rebind a service. Windows and some custom overrides retain the service-root fallback described in update execution.
Doctor and update repairs can now proceed for a loaded Linux user service even when system-wide ownership checks are unavailable. OpenClaw still verifies that your account can change the service, and blocks the repair if ownership conflicts or permissions cannot be confirmed.
Sources and complete change list
Bug fixes
- Restore Gateways after inconclusive systemd inspection #153017 — @xilopaint.
- Repair managed Gateways left on a different OpenClaw installation 24445095 — @baiwei0427.
- Report outdated Gateway service settings in Doctor and update status #151777 — @andapeng.
- Treat unset home literals consistently for Gateway services #151277 — @masatohoshino.
- Refresh stale managed Gateway service definitions during updates #152120 — @andapeng.
- Complete managed Gateway updates after Node installation paths change 97c7b359 — @fuller-stack-dev, @romneyda.
- Preserve the invoked installation through Node respawn #147621 — @romneyda, @fuller-stack-dev.
- Refresh stale service shutdown budgets before maintenance #153636 — @vincentkoc, @ezimerman, @xilopaint, @flynnmcpoc.
- Preserve custom service settings during transactional policy refresh #154519 — @ezimerman.
- Repair recognized stale Gateway service settings with Doctor 0a4cc91c.
- Restore eligible Gateways after Doctor shutdown contention 18a0b30d — @fuller-stack-dev, @sagebhardt, @sasan1200.
- Expose suspension validators and prepare CLI device authentication #155258.
- Allow changes to verified loaded Linux user services when system checks are unavailable 945557e9 — Peter Steinberger.
Preserve and verify Mac Gateway services
Mac service commands recognize native XML and binary definitions, preserve original LaunchAgent bytes and permissions during supported rollback, and verify that the service has unloaded before reporting a completed stop. Run maintenance from the service owner's logged-in session and use openclaw gateway status --deep to inspect it; a disabled but still-loaded service must be unloaded before runtime replacement. Affected older update helpers may need their first upgrade from an independent Terminal. Service inspection from an inaccessible working directory remains a known limitation.
Service repair retains a supported recorded Node path unless an explicit choice overrides it. If a Mac wrapper reports malformed environment input, preserve the service definition and private environment, repair from the same owning account and profile, then verify status and health.
Sources and complete change list
Bug fixes
- Restore Mac service commands from external shells #153403 — @romneyda.
- Preserve LaunchAgent bytes and permissions during rollback #152195.
- Allow authorized update helpers to complete Gateway service shutdown #153020 — @theangrypit, svenmy76.
- Verify macOS Gateway shutdown before reporting success #153789 — @britrik.
- Read native XML and binary Mac service definitions, with inaccessible working directories still a limitation #151432.
- Require the macOS Gateway service to be unloaded before runtime replacement #153637.
- Preserve Gateway runtime paths during service repair #155265 — @philbones49.
Keep Windows shutdown and update paths verifiable
Windows updates and snapshots retain exact directory identity, and managed Gateway shutdown keeps track of the verified process through its handoff. When native Windows Job support is available, cleanup can also stop and verify owned descendants after their parent exits. If that cleanup cannot be certified, locks and temporary files remain for recovery; foreign or reused processes are still rejected.
The updated Windows updater reports backups retained because a loaded native addon prevents deletion without repeatedly waiting on that locked file. An already-running older updater keeps its previous cleanup behavior; genuinely critical removal and rollback failures still surface.
Sources and complete change list
Bug fixes
- Preserve exact Windows directory identities for updates and snapshots #152972.
- Preserve Windows Gateway shutdown ownership and handoff paths #151157 — @romneyda, @fuller-stack-dev, Jason Sy.
- Verify Windows descendant cleanup after parent exit #151443 — @andapeng.
- Avoid Windows update cleanup stalls from loaded native addons #154219.
- Start Windows Gateways with unchanged nested tilde paths #154331 — @vincentkoc, @easyteacher.
- Recognize running Windows Gateways with deadline-derived probe budgets #155051.
Update source checkouts and preserve failed-build recovery
Source-checkout updates handle larger Git packs and shallow partial repositories, show installed and target revisions, and preserve local edits when checking retained builds for rollback. Older installed updaters may still need missing Git objects fetched or a manual first upgrade, and staged packs need disk space. Doctor also gives selective recovery advice for source self-links without rewriting unrelated dependency edits.
The source-server update script stops the Gateway before clean builds and restores generated output after ordinary build failures. Custom automatic service commands need paired, nonblank stop and restart settings; an exactly empty restart setting keeps manual lifecycle control. Recovery covers generated output only, and retained nested build work remains a limitation on automatic rollback and restart.
Git updates also check destination disk capacity before stopping the Gateway and avoid letting an unrelated unavailable remote block the selected update source. Stable and beta-fallback Git updates skip extended-stable tags, preserving the selected release line; older installed updaters retain their first-upgrade limits.
Sources and complete change list
Bug fixes
- Preserve replaced clone directories during update validation #147544 — @romneyda, @fuller-stack-dev.
- Verify retained npm-linked Git builds before rollback #147562 — @romneyda, @fuller-stack-dev.
- Remove Git update pack limits and whole-pack buffering #154042 — @fuller-stack-dev, @romneyda, Mariano.
- Fix updates from shallow partial source checkouts #154191.
- Stop source Gateways before clean builds and restore ordinary failed-build output, with nested-build recovery still limited #125896 — @grynn, @fuller-stack-dev, @donniefi.
- Diagnose source self-links and preserve heartbeat and task-read recovery #117114 — @synthalorian, @fuller-stack-dev, @piotx, @vincentkoc.
- Check available disk space for large Git update packs ff4379ed — @obviyus.
- Keep stable Git updates off extended-stable release tags #154598 — @romneyda.
- Avoid update failures caused by unrelated Git remotes #155133 — @vyctorbrzezowski.
Improvements
Choose eligible extended-stable release lines
Extended-stable releases numbered .33 and later can now come from either of the two preceding completed months, giving eligible release lines a longer maintenance window. A line leaves that window when it becomes the third preceding month. Eligibility does not guarantee a published release or continued support, and extended-stable updates remain a package-installation route. See release channels.
Sources and complete change list
Limits and compatibility
- Keep two completed months eligible for extended-stable maintenance #154777 — @romneyda.
Use the Homebrew upgrade route
Homebrew installations now receive the correct formula upgrade guidance. Back up and stop the Gateway, run brew upgrade openclaw-cli, run openclaw doctor --fix, then restart. New or refreshed services use Homebrew's stable formula path; an existing service pointing into an old version directory may need same-profile openclaw gateway install --force from the upgraded CLI. OpenClaw does not run the Homebrew upgrade for you.
Sources and complete change list
Bug fixes
- Guide Homebrew upgrades and preserve stable Gateway service paths #141011 — @maxsxu.
Follow the deployment owner's update path
If an external supervisor owns your installation, the update screen explains that you need to use that server or deployment's update workflow. The refusal leaves packages and the Gateway untouched and removes irrelevant repair suggestions. If a later status read fails, Check status remains available without starting another update.
Sources and complete change list
Bug fixes
- Explain external-supervisor update refusals and status recovery #151942 — @vincentkoc, @fuller-stack-dev.
Update a foreground Gateway through a fresh process
A Gateway running in a terminal now hands supported updates to a fresh process, avoiding missing-module failures after its runtime files are replaced. Candidate validation happens while it serves, followed by a brief activation interruption; Stop waits for owned update work and leaves it stopped. OPENCLAW_NO_RESPAWN refuses before changes and gives manual instructions.
Use the coordinated openclaw update path when possible. A Gateway already running the new detection code can also notice manual package replacement and drain toward managed restart or foreground relaunch with openclaw gateway run; an old running binary cannot gain that behavior from replacement files alone. If Stop remains unconfirmed, inspect the updater and retry Ctrl+C in the original terminal or SIGTERM to the original process, as described in update execution.
Update maintenance can wait for the same exiting foreground process to release its state, without signaling or restarting that process. A foreground first upgrade from the published 2026.9.5 updater still needs stop, update and start; if files were already partly replaced, stop the old process and complete verified repair from the new installation while retaining state and backups.
Recover supported older-updater handoffs
Supported older-updater handoffs can complete offline session repairs and verify the replacement Gateway, including supported Linux/npm upgrades from 2026.9.2. Missing inherited update history or backup coverage still stops maintenance, and backups an older updater already removed cannot be recreated. After a committed package change, recovery may require a compatible installed build, same-state openclaw doctor --fix, then openclaw gateway start. Keep a verified backup because package-only rollback can be unsafe after migration; rollback and recovery explains the boundary.
Current finalization can keep database work in the compatible newly installed runtime after shared-state migration. That fix must already be in the installed updater and cannot patch an older driver that is already running; the narrower older-version handoff paths above remain separate. Code-only rollback after migration remains unsafe.
During supported non-Windows upgrades, OpenClaw can stop a managed Gateway for Doctor repairs and bring that same service back, even if a later check fails. When the update caused the stop, it may restore the service despite --no-restart and explain the exception; a service you had already stopped stays stopped. Repairs must be enabled, and the older updater must have handed control to the new version.
Sources and complete change list
Bug fixes
- Restore working Gateways after legacy update and session-import failures #151682 — @allen0373, @jjgao.
- Prevent false rollback by older Gateway updaters #151977.
- Handle missing update history and temporary-path aliases on resume #153784.
- Complete database upgrades started by OpenClaw 2026.9.2 #153657 — @vincentkoc.
- Allow managed update handoffs through aliased database paths #155508.
- Finish updates after shared-state database migrations #155610 — @vyctorbrzezowski.
- Stop an older managed Gateway before update Doctor and retain its restart handling 523cd02d — Peter Steinberger.
- Restore Gateways stopped for update maintenance and allow verified Linux user-service activation 80b922db — Peter Steinberger.
- Retry managed Gateway inspection and stop after an older updater handoff a9e0696d — Peter Steinberger.
Restoration adopts Doctor's recorded stop only after the service fingerprint and manager user ID match. The earlier uninspected-service fallback requires restart enabled and its own eligible handoff state; that restriction does not prohibit the later restoration of a service stopped for maintenance. Linux activation after an unavailable system-ownership check requires a loaded user unit with a verified writable definition; confirmed conflicts or failed capability checks still refuse.
Upgrade retained container state before serving traffic
Supported container image upgrades now run Doctor's retained-state migrations automatically before serving traffic, including on qualifying FUSE volumes. A refused default or system agent prevents a healthy readiness response, while an optional refused agent can remain isolated. Use /readyz when incoming traffic needs usable agents, and retain verified matching backups for rollback.
Unsafe required state exits with code 78 and a repair reason. FUSE recovery needs same-directory hardlinks and directory synchronization; if the filesystem cannot provide them, expose the same retained data through its native backing path before retrying. Stop writers and run same-state offline openclaw doctor --fix when instructed or when a specific historical repair remains; a separate offline command is no longer required for every supported image swap.
Sources and complete change list
Bug fixes
- Restore container migrations and usable-agent readiness on qualifying FUSE storage #153096 — @conan-scott, anonymous Discord Unraid reporter.
Restore missing packaged native filesystem support
Packaged installs can restore a missing native filesystem addon from its exact declared prebuilt package after optional-dependency fallback. Healthy installations avoid a download, explicit native-off settings stay off, and source checkouts or existing broken addons are left untouched. Unsupported or offline recovery reports a warning instead of promising native support.
Sources and complete change list
Bug fixes
- Restore missing native filesystem support after update fallback #152349.
Keep managed worktrees visible through maintenance
Restored or repaired managed worktrees remain visible when an older missing-path check finishes, and cleanup can proceed while the Gateway writes its database. Creation also avoids walking unrelated ignored dependency folders, while failed preparation preserves changed worktrees and committed reset actions. Already-removed records are not reconstructed, and historical repairs may still need Doctor.
Cleanup now distinguishes completed, deferred and partial results and explains why a worktree was retained. Partial CLI JSON results include details and exit with an error, so automation should not treat a reported deletion count as proof that all requested cleanup finished.
Sources and complete change list
Bug fixes
- Preserve restored worktrees against stale path checks #152567.
- Worktree cleanup during Gateway database activity #153843 — @vincentkoc.
- Avoid processing unrelated placements during worktree cleanup #153309.
- Create managed worktrees beside large ignored dependency folders 3e013774 — @masatohoshino.
- Preserve project worktrees and committed reset actions through cleanup failures #150249.
- Report incomplete managed-worktree cleanup and uncertain limits 585312d8 — @vincentkoc.
Improvements
Archive detached worktrees with their exact staging
Advanced operators can archive a supported detached managed worktree without losing partially staged edits, using openclaw worktrees remove <id> --exact-state <file> with a request matching its observed state, then openclaw worktrees restore <id> to recover it. This is an explicit archival route, separate from ordinary force removal. The original checkout is retained for 30 days, so its disk space is not immediately reclaimed.
Exact-state restoration requires a supporting runtime, a full non-sparse checkout, Git file refs and a supported index. Restoration normally returns the retained checkout, including later file writes; if only the snapshot survives, recovery covers eligible files and exact staging rather than a complete filesystem image or unrelated ignored caches.
Sources and complete change list
Improvements
- Archive and restore detached worktrees with exact staging #155169 — @fuller-stack-dev.
Reclaim eligible temporary data without repeated cleanup
OpenClaw reclaims eligible abandoned managed plugin copies after an ownership check and a one-hour grace period, while session cleanup avoids repeatedly scanning data it cannot reclaim. Active and protected history remains protected, and openclaw sessions cleanup --enforce still requests immediate cleanup. Committed session resets finish their remaining actions even if later cleanup fails, with the original error kept visible.
Claw removal keeps user files when a scan cannot finish, and failed backups or snapshots can reclaim verified disposable temporary files even on a full disk. Doctor reports recognized abandoned backup scratch and doctor --fix attempts cleanup, preserving live, unknown and recovery data. A Windows rename limitation remains, so this does not guarantee automatic reclamation on every platform.
Sources and complete change list
Bug fixes
- Reclaim abandoned managed plugin copies after a grace period, excluding legacy, fallback and worker scratch copies #150580 — @vyctorbrzezowski.
- Keep Gateway requests responsive during plugin expiry cleanup #153689.
- Finish committed session reset actions after cleanup failures #151955.
- Complete archive cleanup for eval-launched commands #153115.
- Resume session cleanup after clock changes and database lock release bef4401f — Peter Steinberger.
- Reclaim recognized abandoned backup scratch and report cleanup failures #154199 — @agebreak0083.
- Preserve user files when Claw removal cannot finish scanning #154797.
- Reclaim temporary snapshot and backup files when storage is full #154937 — @vincentkoc.
- Avoid backup warnings for temporary files already reclaimed #154953.
- Cancel unstarted archive work when its database retires #155153.
- Prevent Gateway pauses during expired-secret cleanup #155339.
- Clean up snapshots interrupted during allocation #155447 — @shakkernerd.
Improvements
Keep maintenance storage work from blocking other activity
More maintenance, snapshot and shared-state database work runs in background workers, reducing work that competes with messages and status requests. Catalog refreshes avoid redundant copies, unused queued snapshots can be canceled, and update rehearsals can capture consistent individual databases while other processes write. Retention rules and uncertain or active owners remain protected; these individual copies do not create an atomic rollback across every database.
When a database checkpoint cannot finish, disk-pressure cleanup now defers further archive and history pruning until a completed checkpoint is observed. Increasing the budget or waiting out a timer does not clear that protection, and deletions already committed stay committed. Diagnostics help investigate the blocker without claiming that every database lock or growing journal has been fixed.
Sources and complete change list
Improvements
- Move automatic session-maintenance database work into workers c9584688 — Vincent Koc.
- Avoid repeated scans after verified host connection closure #154258.
- Avoid repeated database reads during task activity #153893.
- Avoid repeated integrity scans during session cleanup #154662.
- Reuse database-maintenance workers across agents #155677.
Bug fixes
- Cancel unneeded snapshot copies before they start #154185.
- Reduce catalog refresh disk writes and reclaim oversized temporary snapshots #153512 — @galiniliev, @dmlau76.
- Keep snapshot reads and queued credential reads reliable #151829.
- Avoid caller-thread stalls in device-token storage #151926.
- Reduce competing database work during snapshots and restart recovery #151581 — @galiniliev, @jalehman.
- Prevent shared-state write timeouts during competing writes #152050.
- Keep storage maintenance authorized while background workers start and drain #152681.
- Keep update rehearsals working against actively written databases #149449 — @fuller-stack-dev, @jalehman.
- Keep database activity from disrupting inspection and update reporting #153839 — @pfrederiksen, @dh-js, @guarismo.
- Preserve retained history when database checkpoint cleanup is blocked #154302 — @desksk, @l497c, @markun-japan, @ermalta, @tommylei666.
- Avoid local macOS database locks after mount lookup timeouts #154492.
- Settle transcript work before update database cleanup #155138 — @zanemc-ao, @agebreak0083, @baumus.
Per-database maintenance-worker reuse can retain more workers, with existing idle and memory-pressure retirement still applying.
Managed updates
Managed updates can finish with recoverable plugin warnings and keep a verified new Gateway running while remaining maintenance waits. Results distinguish a healthy requested version from a restored previous version and show which repairs are still pending. Retaining the updater also takes less copying on filesystems with hard-link support, although some mixed link/copy layouts can still block that step.
For deferred maintenance, stop the Gateway through its service owner, run openclaw update repair, then start it through the same owner. Required database repairs, invalid settings, lost permission or a repair process that may still be writing prevent completion; a warning does not mean every check passed.
Sources and complete change list
Bug fixes
- Avoid false update recovery alarms during concurrent database writes #152986 — @fuller-stack-dev.
- Update the checkout accepted in Doctor and preserve channel preferences #151447.
- Recognize completed updates after interrupted verification #152202.
- Clear resolved Doctor guidance in the latest 100 update records after successful repair #153261 — @iwhatsskill.
- Report acknowledged historical repairs and route older recovery through full finalization, which may stop an owned Gateway #153291 — @iwhatsskill.
- Report restored version and Gateway health after rollback #151465 — @ntimesp.
- Verify update recovery before triage reports success #153443 — @johnnyjrizzo.
- Finish updates using the installed runtime and protect configuration rollback 1232d3f1 — @vincentkoc, @fuller-stack-dev.
- Report current Gateway health after update finalization failures #153178 — @0-danielviktorovich-0, @wlassalle724, @neangneatos, @zsmallx, @hxy8241.
- Reuse completed candidate checks before update repair #153188 — @bodegaclaw, @theangrypit, @baumus, @hypocritepro, @bharatvasan, @jplavoiemtl, @guerilla47.
- Keep update recovery warnings and real failures visible after previews #150807 — @romneyda.
- Bound interrupted-update checks and retain recovery outcomes #152727 — @sunnyshu0925, @yetval.
- Preserve update failures and running worker code through replacement #153764.
- Avoid duplicate update finalization and preserve asynchronous keyboard focus #154160 — @fuller-stack-dev.
- Reduce repeated database copies during update-status polling #154233.
- Finish updates with deferred maintenance when a verified Gateway serves #154499 — @rajivranjanmars, @sagebhardt, @sasan1200, @isinghmitesh.
- Finish updates with visible recoverable plugin Doctor warnings #154543 — @brunorapido.
- Clarify update progress and snapshot warnings #155188 — @romneyda.
- Show running update progress separately from queued updates #155342 — @vincentkoc.
- Keep update progress moving during checkout discovery #155498 — @vincentkoc.
- Keep selected update progress readable during shutdown drain #155499 — @vincentkoc.
- Reduce copying while retaining the running updater #155977.
Package layouts that cannot be staged now refuse the update with reinstall guidance.
Get useful update failure reports
Saved update reports retain redacted failure causes, identify the operation that failed and show recovery paths and observed rollback results. They also distinguish a completed check with slow process exit from a check that never finished, and avoid warning about rollback damage when preparation changed nothing. These reports help explain the failure rather than repair it, and older discarded details cannot be reconstructed. Review a report before submitting it.
New reports explain when another OpenClaw process is using the same state, distinguish invalid configuration from a validator that could not run, and preserve sanitized npm causes with relevant disk-space, permission or missing-version guidance. These capture improvements apply to runs using the updated updater; they cannot add details to an older run.
When npm selects a different installation, reports now show sanitized details of its destination and the running installation. Follow the destination troubleshooting guidance to correct the owning account or npm prefix before retrying; the mismatch is not automatically repaired and another installation cannot simply be overwritten. An older updater that refuses before staging cannot load these new diagnostics.
Sources and complete change list
Bug fixes
- Keep update warnings visible and provide saved outcome reports #153147 — @davidchyi-beep, @bodegaclaw, @che10x, @jammyclaw, @servermacminim2ku, @hypocritepro, @lendersmark, @guerilla47, Patryk.
- Retain automatic-update failure causes in history and logs #151568 — @masatohoshino.
- Explain update metadata failures and preserve installation mode #151649 — @nsikak1.
- Identify failed update checks and retained recovery paths #151667 — @soar-king, @baumus, @pfrederiksen, @zzs12345-web, @jplavoiemtl.
- Name the recorded failed update phase instead of an unknown reason #148879 — @navras98, @obviyus, @fuller-stack-dev, @nickfost, @wangzhongming-yh.
- Preserve useful causes and rollback outcomes in update failure reports #152331 — @bobbygaerd.
- Avoid rollback warnings when update preparation changed nothing #152749 — @fuller-stack-dev.
- Keep failed update operations identifiable in reports #153425 — @marcio-absmartly, @bobbygaerd.
- Identify failed update progress writes #153416 — @romneyda.
- Explain update health-check timeouts and unavailable repair #153330 — @lendersmark, @davidchyi-beep, @soar-king, @bodegaclaw, @guerilla47.
- Explain updates blocked by active agent database use #152976 — @fuller-stack-dev, @che10x.
- Avoid misleading version warnings after updates #154697.
- Keep refused-update reports outside selected state #154886 — @vincentkoc.
- Distinguish validator execution failures from invalid configuration #154892 — @vincentkoc.
- Explain unavailable service inspection during updates #154896 — @vincentkoc.
- Keep causes visible in update failure summaries #154920 — @rlosito, @tomekep.
- Preserve useful validator causes in update reports #155234 — @vincentkoc.
- Preserve sanitized npm errors in update failure reports #155337 — @cognos2013, @vildar82, @ckupferschmid, @keithce, @fatal0607, @edrwalker.
- Explain update destination refusals and recovery #155692 — @imhw, @agent-axos, @smaill02, @qq1091429090huo-svg.
Use supported update repair assistance
Updates, verification and rollback no longer require model credentials. Optional model-powered repair starts through triage only after a failed update has settled and released control, using normal shared or OAuth authentication without changing the recorded update outcome. Supported assistance recognizes eligible older and hybrid Linux cgroup layouts, rechecking that it still belongs to the right service. Triage also explains when an agent CLI is missing from PATH and offers a saved debugging prompt when available. Assistance does not itself prove recovery or authorize a restart, and PATH changes remain yours to make.
Sources and complete change list
Bug fixes
- Restore automatic update triage on older and hybrid Linux cgroups #149596 — @miorbnli, @fuller-stack-dev.
- Keep model authentication from blocking updates #154453 — @agebreak0083.
Improvements
- Clarify recovery when triage cannot find an agent CLI #153408 — @romneyda.
Inspect logs, audits and worker resource use
Diagnostic views retain complete structured Gateway logs, identify failed storage inspections and show background-worker memory use, including Prometheus metrics grouped by worker script. Memory-growth alerts distinguish sustained growth from recurring allocation peaks, while absolute pressure checks remain immediate. Samples can be partial, and these diagnostics identify where to investigate rather than fix a memory leak.
Routine model and voice logs are quieter, with detail available at debug level while errors, slow responses and secret-egress audits remain visible. Invalid directory log paths now show an error and keep the last records visibly stale. Routine structured log records can omit _meta.path, which matters if your log-processing tools expect that field.
Console records also retain their severity and subsystem labels so warning and error filters work correctly. Maintenance errors preserve more useful cause and timing information, while expected restart refusals and bounded cleanup listeners avoid misleading failure warnings.
Sources and complete change list
Bug fixes
- Run audit-history queries outside the Gateway request thread #152248.
- Move run-inspection database reads off the Gateway thread #152561.
- Wait briefly for database writes during CLI snapshot preparation #154025.
- Reduce false Gateway memory-growth alerts #151355.
- Retain complete JSON Gateway logs in status diagnostics #151747 — @alix-007.
- Report invalid directory log paths without clearing visible logs #151809.
- Preserve console log severity and subsystem labels #153890 — @alix-007, @obviyus.
- Correct plugin paths in proxy coverage reports #154641.
- Preserve causes and timing of state lease heartbeat failures #154878.
- Avoid false task-maintenance warnings during restart #154932 — @vincentkoc.
- Avoid misleading SQLite cleanup warnings at startup #155297.
Improvements
- Defer health collector loading until text output needs it #152797.
- Reduce processing for long verbose log previews #151593.
- Reduce routine log overhead while preserving error call sites #152493.
- Worker memory visibility and quicker oversized Claude history imports #153842.
- Reduce temporary memory in session-count status reads #153855.
- Identify which SQLite inspection operation failed #149516 — @liuwqgit, @obviyus, @vyctorbrzezowski.
- Reduce repeated work in task-flow diagnostics #152347.
- Read update history without caller-thread database work #153660.
- Identify background workers using the most heap memory #154295.
- Stream transcript usage aggregation for raw traces #150754.
- Reduce routine Gateway and Discord voice log noise #152080.
- Reduce temporary memory used by recent session summaries #154495.
- Avoid unnecessary diagnostic event copies #155422.
- Reduce Gateway-thread work in placement reporting #154695.
Messaging
Conversations keep more of the context needed to answer a follow-up, and accepted requests have clearer paths to a final reply. Changes across the messaging channels also keep progress, attachments, and delivery results attached to the work they describe.
Retain Telegram group history
Telegram group and topic history now survives restarts and /new or /reset, so the agent can look back at earlier discussion when a recent message refers to it. The automatic context window stays bounded, normally at 50 messages, while explicit reads can page through older permitted messages. Mention requirements still apply, and reads stay within the authorized account, group, topic, and sender permissions. Only messages OpenClaw received and was allowed to record are retained, and older attachments may expire.
Retained group history grows with traffic. Setting historyLimit to 0 turns off automatic context but keeps recording and explicit reads enabled, while resetting a session does not delete that history. Make a compatible pre-update backup if you may need to downgrade, and restore it before running an older release against this data because older versions can damage expanded retained history.
Sources and complete change list
Improvements
- Retain Telegram group discussion and read older messages on demand #151911 — Thanks @obviyus.
Keep rapid Telegram paste chunks together
Rapid pieces of a pasted Telegram message can now reach the assistant as one request, even when short and long chunks are mixed. Ordinary text waits for 300 ms of quiet by default, adding a small startup delay and sometimes combining messages you intended to send separately. Commands bypass batching, and ordinary media stays outside text batches.
The Telegram-specific messages.inbound.byChannel.telegram setting takes precedence over the global messages.inbound.debounceMs setting. Explicit 0 disables ordinary batching, while automatic assembly of near-limit pasted text stays active. Once a batch closes, later messages cannot join it.
Sources and complete change list
Bug fixes
- Keep rapid Telegram paste chunks in one turn #155842 — Thanks @obviyus.
Limits and compatibility
Text is collected for the same bot account, sender, chat, and topic. Non-forwarded messages of at least 4,000 characters allow at least 1,500 ms for continuation, respecting longer configured waits. Ordinary batches are limited to 12 messages and 50,000 source-text characters, with collection capped at the longer of 7.5 seconds and the configured initial quiet window. These are collection limits, not a total reply-time guarantee. Forwarded messages keep separate 80 ms batches in the same sender queue. Authorized Stop cancels buffered input and batches still waiting to dispatch.
Finish accepted group requests with an answer
Accepted group and channel requests now require an answer by default, including unmentioned messages in groups configured to accept them. If tools finish and the agent ends silently, reply recovery can produce the missing answer without repeating completed actions. Confirmed or still-pending delivery prevents another recovery reply, and pending tool or delegated work stays pending while restart recovery waits for capacity.
Always-on groups may receive more replies after updating. To keep optional replies for unaddressed requests, set agents.defaults.silentReply.group to "allow" or use the corresponding surface override described under silent replies. Mention and access rules still decide which requests reach the agent, while ambient events, heartbeats, and internal helper turns remain optional. Internal child-result and coordination notifications can now finish silently without triggering a repeated answer. Messages canceled by Stop while still queued also remain silent, while new user requests retain normal reply recovery.
Sources and complete change list
Limits and compatibility
- Require replies to accepted group requests by default #153800 — Thanks @obviyus.
Bug fixes
- Recover missing required replies after completed tools without replaying actions #152786 — Thanks @obviyus.
- Respect deliberate conversational silence after tool failures #151873 — Thanks @pash-openai.
- Keep messages pending during restart-recovery capacity waits #152475.
- Prevent repeated replies after internal notifications #154464 — Thanks @obviyus.
- Suppress false reply warnings for stopped queued messages #154872 — Thanks @vacinc.
Recover recent Slack and Discord discussion
After a restart, addressed messages can pick up fresh recent discussion from Slack and Discord without turning quiet room messages into new agent turns. The default windows are 50 messages for Slack and 20 for Discord, with 0 disabling automatic history. Slack's room historyLimit also caps thread.initialHistoryLimit, including when set to zero. Reads respect current access, edits, deletions, retention, and bounded retrieval, so unavailable history is omitted rather than replaced with stale text. Discord replies also retain quoted bot responses and automation alerts as untrusted context, making follow-ups understandable without copying the original message.
Automatic observed-message context is now capped at 200 messages. The maximum JSON integer selects each channel's default instead, while other oversized settings use the cap. Saved settings, stored messages, transcript retention, and explicit Telegram history reads are unchanged.
Sources and complete change list
Bug fixes
Follow delegated work in the right conversation
Interactive chats can show a waiting acknowledgement when delegated work would otherwise go quiet, and status checks remain visible without interrupting the running task or entering its later model context. Private child results return internally to the correct conversation, while cross-session requests from the Control UI receive their result without bouncing the human-facing response back to the other session. Thread-bound spawning is available again where channel settings and permissions enable it. The waiting acknowledgement is a single update, while independent agent peers keep their existing bounded exchanges.
Sources and complete change list
Bug fixes
- Prevent Control UI reply exchanges from bouncing between sessions #151297 — Thanks @romneyda.
- Resume private subagent results in channel conversations #152207.
- Show a default waiting reply during delegated work #151032 — Thanks @obviyus, @samiralibabic, @dankarization.
- Keep status exchanges visible without interrupting the running turn #152512 — Thanks @obviyus, @samiralibabic.
- Restore enabled thread spawning in Gateway conversations #153641 — Thanks @vincentkoc.
Use Telegram controls while work continues
Telegram inspection and interrupt commands can respond while the conversation is busy, so checking or stopping active work does not have to wait behind ordinary buffered messages. Commands that change the session, including /new, /reset, and /think, remain ordered, while /btw uses its separate lane. Existing authorization checks still protect buffered input from unauthorized controls.
Sources and complete change list
Bug fixes
- Let Telegram controls respond during active conversations e5c17513 — Thanks @vacinc.
Keep Discord progress visible during delegated work
With Discord streaming.mode set to progress, an accepted handoff to child agents keeps the existing progress checklist visible while their work continues. The final answer arrives separately, so the checklist remains a useful record of the work in progress. Declined handoffs and media or control-message paths keep their ordinary delivery behavior.
Sources and complete change list
Bug fixes
- Keep Discord progress cards visible while subagents continue #153028 — Thanks @obviyus, @samiralibabic, @dankarization.
Keep Telegram progress and questions in the chat
Telegram keeps the same progress card and checklist while delegated work continues, including eligible restart recovery when the existing card's delivery record is available. The final answer remains separate and silent child work stays hidden. Interactive questions and their settled outcomes also survive progress cleanup, while temporary previews still retire; a missing delivery record does not create a replacement progress card.
Once delegated work ends and a final reply is confirmed in the matching Telegram account and topic, OpenClaw removes that exact temporary progress message when deletion remains permitted. Pending or uncertain delivery keeps progress in place, and a cleanup failure never resends an accepted answer.
Sources and complete change list
Bug fixes
- Retain Telegram progress cards while delegated work continues #152517 — Thanks @obviyus, @samiralibabic, @dankarization.
- Keep Telegram questions after progress cleanup #151329 — Thanks @sercada, @obviyus.
- Remove temporary progress after confirmed final replies #154467 — Thanks @obviyus.
- Remove stale progress cards after Telegram topic replies #154939 — Thanks @obviyus.
Preserve delivery results and pending messages
If a channel accepts a reply and saving its status later fails, OpenClaw keeps the known delivery result instead of treating the message as unsent. When only part of a reply arrives, the failure includes what reached the recipient. Pending messages and attachments remain available when the outcome is uncertain, and OpenClaw avoids speculative resends while recovery checks what happened.
Reply completion tracking also survives failing plugin observers, and delayed cleanup preserves newer Discord and Slack previews and Slack messages people have replied to. A cleanup failure does not resend an accepted answer. Message dry runs now report a simulation rather than delivery, without automatically sending a real message.
If a conversation's assignment is changed, removed, or superseded before dispatch, OpenClaw asks you to retry instead of continuing through the old session. Custom session-store updates and newly recorded delayed replies also keep the selected agent, while /session idle and /session max-age wait for their settings to be saved before confirming success.
Sources and complete change list
Bug fixes
- Preserve known delivery results when annotation fails #151217 — Thanks @shakkernerd.
- Preserve pending deliveries owned by another worker #153083 — Thanks @chelsealong, @gabrielnkl.
- Stop repeated recovery retries for obsolete queued replies #152967 — Thanks @hartmark, @obviyus.
- Preserve successful replies with opaque channel metadata #151870.
- Keep Gateway requests responsive while storing outgoing messages #153076.
- Refresh outbound senders when plugin state changes #153105.
- Preserve session-send timeout results without diagnostics #154407.
- Keep reply completion tracking working after observer failures #155522 — Thanks @mfurkanakinci, @obviyus, @aniruddhaadak80.
- Keep message dry-run receipts from claiming delivery #155537 — Thanks @alix-007, @obviyus, @pennyvibe.
- Preserve accepted answers through shared preview-delivery ownership #155639 — Thanks @obviyus.
- Preserve chat previews and human context during delayed cleanup #155641 — Thanks @obviyus.
- Refuse stale conversation routes and retain agent ownership through delayed replies #154864.
Improvements
- Move persistent channel replay checks into workers #152642.
- Prepare cold channel metadata asynchronously before delivery #149304 — Thanks @vincentkoc.
- Reuse conversation-binding query templates #151654 — Thanks @vincentkoc.
- Avoid redundant account listing for channel-default sends #151812 — Thanks @vincentkoc.
- Reuse compiled conversation delivery lookups #150627.
- Stop duplicate-reply scans after the first match #153248.
- Keep delivery claims and renewals off the Gateway thread #152736.
- Move outbound delivery acknowledgements off the Gateway thread #152840.
- Move pending delivery failure settlement off the Gateway thread #152892.
- Reduce initialization during channel discovery #154046.
- Defer optional runtimes on cold text-only sends #152784.
Keep accepted chats through compaction and cancellation
An accepted message can continue once through verified conversation compaction, which condenses older context to make room for more work. When continuation cannot be established, Refresh preserves the draft without sending a second message. Reset, replacement, restart, and cancellation checks still apply, and clients waiting on a canceled chat now receive its completion result after the running dispatch settles instead of waiting until they time out.
Stop later message requests after cancellation
Canceled Mattermost sends stop before their next recipient lookup, upload, or posting request, and shared message actions stop later recipient lookups after cancellation. Teams polls also stop before submission when permission to send ends. Already accepted messages and polls keep their delivery results and vote tracking, so cancellation does not retract something already sent or guarantee that an in-flight request can be stopped.
Sources and complete change list
Bug fixes
- Stop retired Mattermost sends before later provider requests #151252 — Thanks @shakkernerd.
- Stop later recipient lookups after message cancellation #151270 — Thanks @shakkernerd.
Security and trust
- Stop unsubmitted Teams polls after permission withdrawal #151287 — Thanks @shakkernerd.
Preserve Mattermost post state during edits
Editing a streamed Mattermost reply or completing an interactive button now preserves the post's existing pins and reactions. Partial edits also retain message text and files when those fields are omitted. Edits containing channel-wide mentions preserve the previously read properties, but can still overwrite property changes made elsewhere between the read and update.
Sources and complete change list
Bug fixes
- Preserve Mattermost post state during partial edits #151255 — Thanks @leon-sk668, @obviyus.
Preserve requested attachments and captions
Repeated --media flags in the message CLI now preserve every attachment in command-line order, using each channel's existing sending behavior. Animated WebP files keep their animation within the existing size and model limits, with oversized animations rejected instead of flattened. Attachments also survive when a caption is stripped, without bringing the removed text back into chat. Older tool calls without a recorded publication no longer reconstruct a reply bubble, but their expanded diagnostics remain available.
Discord videos and images with duration metadata also keep their visual media type instead of being mistaken for voice notes, while genuine waveform-bearing voice notes remain audio. Video understanding still depends on the configured provider's capabilities.
Sources and complete change list
Bug fixes
- Preserve animated WebP attachments within existing media limits #129483.
- Preserve all repeated CLI media attachments #151043 — Thanks @krausefx, @obviyus, @dmnksss, @mirr0ch1.
- Keep attachments while preventing stripped-caption redisplay #150694 — Thanks @zhangguiping-xydt, @obviyus.
- Recognize Discord videos despite duration metadata #155573 — Thanks @yangmanbobo, @yursil.
Keep long replies readable
Long replies keep emoji, flags, and accented characters together when splitting them into messages, except when a single character cluster exceeds the channel's limit. Streamed code examples retain their fences and literal tags, and reply preparation preserves attachment details and the intended reply target through formatting and recovery. Several formatting paths also avoid repeated work on long text and code-heavy replies. Older third-party adapters need the prepared-operation interface to avoid reparsing replies in their own code; existing transcripts are not rewritten.
Top-level indented code also keeps its leading indentation and internal blank lines through streaming and final reply preparation, while identical snippets written at different positions remain distinct. Very long whitespace runs can still lose spaces at message edges under unusually tight limits.
Sources and complete change list
Bug fixes
- Keep emoji and accented characters intact when splitting replies #151959 — Thanks @etzelm, @obviyus.
- Preserve reply metadata through outbound formatting and hooks #152231.
- Preserve code, attachment details and reply intent through streaming and recovery #146361.
- Preserve code blocks and tag boundaries in streamed replies #151693 — Thanks @vincentkoc.
- Keep repeated streamed code without duplicating the final answer #152520 — Thanks @giodl73-repo, root.
- Preserve top-level indented code during streaming #153587 — Thanks @sunnyshu0925, @obviyus.
- Preserve code indentation in final agent replies #154857 — Thanks @obviyus.
- Preserve internal blank lines when formatted code replies split #154875 — Thanks @obviyus.
Improvements
- Reduce formatting work when splitting long messages #151898 — Thanks @vincentkoc.
- Reduce processing for code-heavy Discord replies #151828 — Thanks @vincentkoc.
- Reduce unnecessary processing for plain-text replies #149829.
- Reduce processing work for long plain-text replies #150230.
- Reduce repeated scanning inside long fenced replies #151664 — Thanks @vincentkoc.
Use explicit channel names in scripts
Login, logout, and directory commands now reject an explicitly blank --channel, preventing an empty shell variable from silently selecting a configured channel or affecting saved credentials. Omit the flag when you want automatic selection. Valid names, surrounding whitespace, and supported aliases keep their existing behavior.
Sources and complete change list
Bug fixes
- Protect saved credentials from blank logout selectors #150497 — Thanks @masatohoshino, @fuller-stack-dev.
Limits and compatibility
- Reject blank directory channel selectors and require omission for automatic selection #153731 — Thanks @masatohoshino, @obviyus.
Browse conversations after account removal
Removing or disabling a Discord account, or removing a Matrix, Telegram, or Slack account, no longer blocks conversation discovery for the remaining active accounts. Retained history stays intact, while access to retired-account conversations is still restricted. An account that is configured but not yet ready can remain temporarily unavailable.
Identify credential and channel-status problems
LINE send errors now identify an unreadable configured token file, and Nextcloud Talk distinguishes an unavailable configured bot-secret source from missing credentials. An unavailable QQ Bot secret blocks its own account while healthy accounts remain usable; failed explicit references do not silently fall back, and only unchanged accounts can retain previously working credentials during reload. Live channel status also remains readable from a reachable, authenticated Gateway while local state maintenance is underway.
Online status JSON now labels a channel summary that was not collected, instead of implying that no channels are configured. Use channels status or its --probe option for configured-account or live checks.
Sources and complete change list
Bug fixes
- Identify unavailable LINE token files in send errors #152769 — Thanks @obviyus, @edenfunf.
- Keep live channel status available during state maintenance #153445.
- Identify unavailable configured Nextcloud Talk bot secrets #153751 — Thanks @masatohoshino, @obviyus.
- Isolate missing QQ Bot credentials to the affected account #128320.
- Explain skipped channel summaries in online status #155296 — Thanks @yun-0000, @obviyus, @voytas75.
Change the voice for the current Discord call
Speakers already authorized to talk to the agent can ask to list or change the current Discord call voice without also being configured as command owners. A change affects everyone in the shared call, while saved defaults and other owner-only permissions stay in place. That voice access ends with the call or turn, cancellation, or revoked access.
Sources and complete change list
Bug fixes
- Let authorized Discord speakers change the current call voice #152044.
Keep Discord voice playback moving
Established Discord and GPT Live playback can continue while other Gateway work is busy, reducing stutters caused by that work. Changing voices keeps speech that has not started without replaying speech already underway. Speaker admission, microphone forwarding, agent work, and transcripts can still wait on the Gateway, so this does not remove every source of voice delay.
Confirm the first message in a Discord thread
Discord thread creation now reports an accepted first message separately from the thread's creation-time counters, which may still show zero or no value. Use the delivery result to check whether the initial message was accepted, and inspect uncertain sends before retrying. An empty standalone thread has no message-delivery receipt.
Sources and complete change list
Bug fixes
- Confirm initial Discord thread messages without misleading creation counters #150169 — Thanks @alix-007, @obviyus, @ludovicfourrage.
Finish accepted Feishu work during shutdown
Feishu account shutdown waits for accepted message handlers and duplicate-message bookkeeping to finish before releasing their resources. Reaching the five-minute ordering limit does not cancel an already accepted handler, allowing its work to settle during shutdown.
Receive Feishu meeting invitations after early failures
If a Feishu meeting invitation fails before the agent durably accepts it, a later delivery of that invitation from Feishu can be processed again instead of being discarded as a duplicate. vcAutoJoin remains an explicit opt-in, and this change neither schedules retries nor guarantees a meeting join. Already accepted invitations and older duplicate-message records keep their existing behavior.
Sources and complete change list
Bug fixes
- Preserve Feishu meeting invitations after early dispatch failures #155068 — Thanks @qingminglong, @obviyus.
Keep Matrix replies working after reload
Delayed Matrix replies can obtain their connection after the original message handler finishes normally, and generated images or queued replies can reuse the matching live connection after a configuration-only reload. Startup and synchronization storage work also moves off the Gateway's main thread. Shutdown, account removal, and explicit cancellation still stop pending work.
Matrix also restores single-message assistant and tool progress drafts in affected sessions by using the account's saved settings. Final replies are unchanged, and multi-message chunking still requires the plugin runtime.
Sources and complete change list
Bug fixes
- Keep delayed Matrix replies alive after handler completion #151063 — Thanks @synapse-homeroot.
- Restore Matrix image and queued-reply delivery after configuration reloads #153645 — Thanks @vincentkoc.
- Move Matrix startup storage off the Gateway thread #151994.
- Move Matrix sync-cache work off the Gateway thread #151845.
- Keep Matrix bot discovery off the Gateway thread #152122.
- Restore Matrix progress drafts without plugin runtime context #155354 — Thanks @holny, @obviyus, @mykhul.
Read the requested Matrix message
Requesting a specific Matrix message through the message CLI or agent tool now returns that event or an error, instead of substituting unrelated recent room history. Existing permissions and encrypted-message limits still apply, while ordinary history reads keep their current behavior. Configured contact, room, and approver checks avoid unnecessary credential reads, and expired secret-storage requests fail promptly while transient network errors can still retry.
Diagnose Slack status cleanup failures
Normal logs now report when Slack fails to clear an accepted working status at the end of a turn, making that failure easier to diagnose. This exposes the cleanup problem without adding retries or repairing Slack Desktop's separate stale-indicator behavior.
Sources and complete change list
Bug fixes
- Report failed Slack end-of-turn status cleanup #145778 — Thanks @alix-007, @obviyus, @joncursi.
Prepare long Telegram replies with less repeated work
Telegram avoids repeated escaping, link, and HTML-tag processing while preparing replies with the same supported formatting. With richMessages enabled, long and nested rich replies also avoid unnecessary repeated checks. The improvement is in local formatting work and varies with the message; it does not establish faster network delivery.
Long Telegram code snippets also retain their internal blank lines and code formatting when split into messages, while honoring the existing message limits.
Sources and complete change list
Improvements
- Avoid redundant escaping scans in Telegram prose #151464.
- Skip unused link formatting in Telegram text and tables #151630.
- Avoid duplicate HTML tag parsing in Telegram formatting #151715.
- Reduce preparation work for long Telegram rich replies #151827.
- Reduce repeated work in nested Telegram rich formatting #151965 — Thanks @vincentkoc.
Bug fixes
- Preserve Telegram code formatting across message splits #153576 — Thanks @sunnyshu0925, @obviyus.
Restore affected Telegram replies under Bun
Telegram now selects the complete installed HTTP client under Bun, repairing the affected reply path and /models provider picker that could fail with dispatcher.compose is not a function. The live verification used a custom Bun build, so this scoped fix does not establish general stock-Bun support.
Sources and complete change list
Bug fixes
- Restore affected Telegram native replies under Bun #152055.
React to the current Teams message
Teams can use the current inbound message when adding, removing, or listing reactions in the same conversation, without requiring its message ID to be supplied again. Reactions in another conversation and message deletion still require an explicit ID.
When someone adds or removes a reaction in a channel thread, the agent now receives that reaction's context in the owning thread rather than the parent conversation.
Keep Teams context within its channel thread
In Teams channels where the bot waits for a mention, unmentioned messages now stay available for the next request in their own thread. Answering in another thread no longer consumes that pending context. Group chats and messages without a thread keep their existing history behavior, and the separate issue of rapid messages from different threads being batched together remains outside this fix.
Sources and complete change list
Bug fixes
- Keep skipped Teams messages within their channel thread #154825 — Thanks @nianjiuzst, @obviyus, @yunligou711-commits.
Keep rapid WhatsApp messages in order
With inbound batching configured, rapid WhatsApp messages from the same sender can reach the agent together instead of waiting through separate batching delays. Group conversations keep each participant's identity and message order, including when another person's quoted or buffered message interrupts a batch. This restores the existing setting's behavior without introducing a new default.
Sources and complete change list
Bug fixes
- Batch rapid WhatsApp messages without reordering group participants #112001 — Thanks @mcaxtr, @fuller-stack-dev, @abacha.
Keep Zalo photo captions within limits
Zalo applies the same photo-caption limit to ordinary and polling replies without splitting the two-part encoding of an emoji at the cutoff. Text beyond 2,000 UTF-16 units is truncated rather than sent as extra messages, and this does not guarantee that every multi-character emoji sequence stays together.
Sources and complete change list
Bug fixes
- Bound Zalo photo captions consistently across reply paths #125402.
Keep queued iMessage replies attached to their questions
When several iMessage questions arrive while an answer is being written, queued text and media replies can stay attached to the question that prompted each one. Explicit targets and the first, all, and off reply settings still apply. This requires both the updated iMessage plugin and a host that supports its inferred reply targets; updating the plugin alone is insufficient. The startup database read that establishes the latest seen message also moves off the Gateway's main thread.
Watching external conversations
Looking up watched external conversations can now run alongside other OpenClaw requests. When monitoring stops, results that arrive late are discarded.
Sources and complete change list
Improvements
- Move watched-conversation discovery off the Gateway thread #151731.
Memory
Memory search and maintenance can recover from more interruptions, helping saved information stay useful as conversations continue.
Keep memory indexing and saves moving
History and search indexes can catch up while a conversation continues receiving messages, within a bounded amount of new history. Resets, branches, and larger backlogs still need a fresh rebuild. Completed memory saves keep their successful result if cleanup later fails, and the next sync can recover a lock left by completed local work instead of timing out. Recovery checks the original lock and database so it leaves active work and replacement locks alone.
Memory rebuilds also avoid a false “owner changed” failure when database commands wait in a queue. Genuine revocation or replacement still stops the affected work.
Sources and complete change list
Bug fixes
- Let session history and search indexing catch up during active conversations, up to 512 events and 256 KiB of new history 3c9a40aa — thanks @RomneyDa and CanadaOrNaw, a name-only coauthor.
- Prevent maintenance overlap from leaving memory indexing locks behind #152361.
- Recover memory-sync locks after cleanup contention #152430.
- Bind memory-lock recovery to its original database and grant, including recovery after a lost acquisition reply without replaying work #152480.
- Preserve completed Memory writes through cleanup failures #153150.
- Keep queued database commands from interrupting memory indexing #155535 — thanks @shakkernerd.
Improvements
Maintain conversation context between turns
Context engines that opt into background maintenance can now start summarizing after a saved conversation turn, using idle time without holding up the completed reply. Engines using foreground maintenance, or leaving the mode unspecified, still wait for that work, and some compaction may still happen during later turns. New conversation summaries also receive independent text blocks with their boundaries preserved, avoiding text being joined together before summarization. Existing summaries remain unchanged.
Long tasks with repeated tool calls can recover from later context overflows after the model makes successful progress, instead of exhausting one recovery allowance for the entire task. Repeated attempts without progress remain bounded, and refusals, errors, aborted replies, or replies cut short by a length limit do not renew that allowance. Conversation compaction also keeps working after a plugin reload by using the current plugins.
Sources and complete change list
Bug fixes
- Start opted-in context maintenance after accepted turns and keep its resources available until it finishes #151936 — thanks @jalehman.
- Keep text blocks separated in conversation summary input #151358 — thanks @RomneyDa.
- Keep conversation compaction working after plugin reload 388614d8 — thanks @jalehman.
- Continue productive tool turns through later context overflows #150513 — thanks @SunnyShu0925, @obviyus, @SBC2016, and @Yigtwxx.
- Restore guidance for selecting session history #154890 — thanks @vincentkoc.
Improvements
- Scan signed-turn attachments once during replay repair #151398 — thanks @vincentkoc.
- Avoid repeatedly encoding the same history when retrieving messages around a selected message #150302 — thanks @vincentkoc.
- Load complete saved transcripts through the history worker #153325.
- Load Side chat and Talk history asynchronously #153331.
Recognizing preserved requests during compaction
When the compaction quality guard checks a shortened conversation, it now recognizes short requests such as “How about now?” that the summary correctly retained. This avoids unnecessary retries or cancellation caused by that matching error when the guard is enabled.
Sources and complete change list
Bug fixes
- Recognize short requests retained in compaction summaries #153320 — @vacinc
Save Dream Diary entries and respect paused scheduling
New Dream Diary entries now save when their recent context was only shortened to fit, instead of being mistakenly discarded as stale. Actual context changes and Forget still prevent stale entries from being written, and previously discarded entries are not recreated. Dreaming also stops trying to reconcile its scheduled jobs while scheduling is disabled, preserving those jobs for later. Explicitly disabling dreaming removes its managed jobs, and resuming scheduling still requires an eligible owner.
Generated reflections stay searchable but no longer compete with ordinary memories in promotion rankings for long-term memory, while existing long-term memories remain unchanged.
Sources and complete change list
Bug fixes
- Keep Dream Diary entries after unchanged context truncation #153823 — thanks @Psychnix and @obviyus.
- Defer memory dreaming jobs while automatic scheduling is disabled through
cron.enabledorOPENCLAW_SKIP_CRON#151713. - Exclude generated reflections from memory promotion rankings #154994 — thanks @chelsealong, @obviyus, and @Truck0ff.
Improvements
- Reduce no-op Dreaming cleanup work in large session stores #154556.
Forget memories when session links change
Memory Forget keeps track of memories already selected for deletion and picks up new links to the selected sessions while preparing the operation, preserving unrelated content. A preview remains a view of the current state, so pause or coordinate direct agent edits and external writers during a sensitive purge. This repair covers changing session links without extending deletion to every possible copy of the information.
Sources and complete change list
Bug fixes
- Keep memory forgetting complete when session links change, and reject cleanup through a retired database connection #152902.
Use Memory files on a remote workspace host
Workspace adapters can now provide access to Memory files on a remote host for searching, reading, and maintenance, while the computer running OpenClaw keeps the index and original session data. This optional workspace capability requires a separately configured memoryFiles adapter and does not move existing storage automatically.
After changing which source files the adapter uses, run openclaw memory index --force --agent <id> before searching. Keep the workspace binding unchanged during maintenance. Revoking access does not retract results already read or retained, and embedding requests or multi-step diary updates may continue after their original access checks.
Sources and complete change list
Limits and compatibility
- Read and maintain remote workspace Memory files through an optional adapter; remote providers without maintenance support fail instead of editing local files #153124 — thanks @kimiyu-186.
Skills
Skills now refresh around actual content changes, while Workshop keeps a clearer record of the skills available to an agent and the reviews that shape them.
Refresh Skills when their contents change
Unchanged Skills no longer trigger needless session rebuilds and chat metadata refreshes, and identical copies stop producing duplicate precedence warnings. Instruction edits and changes to which skill takes priority still refresh the session, while supporting scripts and assets continue updating in sandbox copies. Discovery also handles returning to an idle workspace and, on Windows, deleting and recreating a skill folder or its parent. Skill folders added during a rescan stay watched for later edits, and filtering Skills keeps each group that remains visible in its existing open or closed state.
During initial monitoring setup, OpenClaw now checks that newly discovered nested folders are watched before treating setup as complete. If that initial check fails, later task preparation refreshes the affected skill sources while healthy watchers keep running.
Sources and complete change list
Improvements
- Reduce duplicate skill warnings and repeated parsing #152062
- Reduce repeated scans for missing skill folders #152563
- Avoid unrelated scans during Linux Node non-polling Skill discovery #153436
- Skip unnecessary filesystem work when loading local skills #153777
- Match local skill-file icons to the skill picker while keeping other link icons unchanged #153908 — thanks @vyctorbrzezowski
- Load pinned Skill library entries without blocking database reads 290d5c3
- Prepare selected skill metadata without caller-thread SQL #148560
- Use the faster strict-JSON path for skill and hook metadata #154650
Bug fixes
- Avoid skill reloads and metadata refreshes when content is unchanged #151670
- Bound retained skill subscriptions across execution workspaces and refresh file-backed skills when returning to an evicted workspace #127204
- Reduce repeated skill refreshes after shared-directory changes #154052
- Keep retired skill watchers from restarting folder scans #152903
- Keep Windows skills discoverable after folder recreation #154273
- Preserve Skills group expansion while filtering #150911 — thanks @sunnyshu0925, @fuller-stack-dev, @vyctorbrzezowski
- Keep skill directories watched during rescans #155570 — thanks @vincentkoc
- Verify skill-folder monitoring before initial readiness #155724 — thanks @vincentkoc
Limits and compatibility
The subscription limit bounds retained workspace subscriptions, not the total number of operating-system file watches. Managed Library revisions remain pinned until explicitly refreshed.
Groups removed by filtering start open if they are recreated. Failures in coverage checks after monitoring is already ready, and retirement of unusable shared watcher handles, remain separate limitations. A remote watcher reported as unavailable retains that status until its existing connection or request resets.
Keep Workshop inventory and reviews current
Skill Workshop now lists current skill files and records successful tool-mediated use even when diagnostics are disabled. A rejected proposal remains a failed review when the reviewer sends no reply, and reviews delayed until idle time use the current plugins. Usage counts start with recorded activity rather than filling in older history, exclude native Codex skill activation, and do not follow files when they move.
Safety guides and supporting files also stop triggering quarantine or critical audit findings solely for prompt-related wording. Three keyword rules were removed for both harmless guidance and actual instruction-override text, without a replacement detector. Credential checks, approval policy and other blocking rules still apply.
Normal startup now leaves legacy Workshop data untouched. To repair it, run openclaw doctor --fix or openclaw doctor --yes with the same state directory and configuration as the affected installation. Doctor during an update continues to handle that repair.
Sources and complete change list
Improvements
- Move skill usage and Curator status queries off the caller thread #152319
- Prepare only skill readiness counts for status summaries #152799
Bug fixes
- Restore recorded skill use and live Workshop inventory #151048 — thanks @obviyus
- Record failed Skill Workshop reviews despite silent replies #152018
- Use current plugins for idle Skill Workshop reviews #152235 — thanks @jalehman
- Read Workshop event history in background workers #152583
- Stop quarantining safety guides for prompt-related wording #154441 — thanks @jesse-merhi
Limits and compatibility
- Move legacy Workshop repair out of normal startup #151392
Older clients show only current inventory entries whose dates are known. Usage shutdown draining covers writes already delivered and accepted, not diagnostic events still waiting upstream.
Install and finalize skill archives
Bzip2 skill archives can now be extracted without installing a system tar command. Finalizing an uploaded archive also lets OpenClaw continue handling other work while it hashes and stores the archive, and uploads that expire before finalization or a repeated commit are rejected. The rest of the upload's database work now runs in the background too, with expiry checked after queued work is admitted. Existing extraction permissions and protection for uploads already in use by an installation remain in place.
Sources and complete change list
Bug fixes
- Install bzip2 skills without system tar and prevent false database snapshot or recovery comparison failures from unequal short reads #153973
- Keep skill archive commits responsive and reject expired uploads #152816
- Enforce skill-library limits against changing local files #154793
Improvements
- Move Skill upload database work into the background #155283
Limits and compatibility
Upload database work runs in background workers, while archive materialization and installer callbacks remain host work. Stored formats and upload expiry durations are unchanged. Library reads retain the limits of 1 MiB per file, 8 MiB per bundle and 256 files even when local files change; these are input limits, not a cap on total memory use.
Read and manage Skills on their workspace host
Supported remote workspace connections let agent tasks use Skills and supporting files on the machine where the workspace lives. Adapters that also supply the required host information and management operations can show that machine's installed skills, choose matching dependencies, and run approved dependency or source and ClawHub management operations there. Missing capabilities return an error without installing on the Gateway computer. The workspace adapter documentation describes the requirements; a document bridge alone does not enable this management, and the paired-node adapter does not support remote source or ClawHub installation, updates or removal.
Keep the remote Skills connection in place until its tasks finish. Replacing it with a document-only connection while a task retains its remote skill list can make that task read supporting files from the Gateway computer instead.
Sources and complete change list
Improvements
- Use Skills and supporting files from a remote workspace host #153126 — thanks @kimiyu-186
- Inspect host Skills and run supported dependency, source and ClawHub management through capable workspace adapters #153438 — thanks @kimiyu-186
Limits and compatibility
Remote channel-native skill menus remain separate. Provider replacement during an active task remains a known read-ownership limitation.
Read Skill instructions before loading supporting files
Plugin Skill previews now show the main instructions before fetching supporting documents, so you can begin reading without waiting for every file. Supporting files load when you select them, failed reads offer Retry, and background loading preserves your selected document and reading position. Previewing does not install or execute the plugin, and reopening the preview lets you see installed files that were edited while it was open.
Sources and complete change list
Improvements
- Open Skill instructions before loading supporting files #155282 — thanks @patrick-erichsen
Limits and compatibility
Loaded files are reused only within the current preview and connection. Closing, reopening, navigating away or reconnecting clears that preview cache.
Native Apps
The native apps make everyday conversations easier to write, read, and return to, with more room for replies and clearer controls when a connection or permission needs attention.
Compose and inspect Android chat messages
Android chat brings Gallery, File, and Location into the attachment menu, with a microphone tap for dictation and a long press for voice options. Location goes into a draft you can review before choosing Send, using only the foreground permission and precision you allowed. Failed tools and recovery instructions are easier to read, and tapping an eligible reply's timestamp opens its recorded model, token use, and estimated cost. Those details describe one model call, so they are not a whole-conversation total or a final bill.
Staged photos now show thumbnails you can open before sending. A compact, expandable Tool activity section keeps running tools and saved results with their original prompt, with failures visible even when collapsed. Stop also stays tied to the conversation you selected if you navigate away, and reports rejected or uncertain results without treating an uncertain stop as completed.
Sources and complete change list
Improvements
- Simplify Android chat controls and reviewable media and location sharing #143099 — thanks @ivankuznetsov and @iwhatsskill.
- Inspect Android reply usage and model details from its timestamp #152880 — thanks @iwhatsskill, with proposal credit to @pestelence2k and Git author Cesura.
- Keep Android tool activity in one compact expandable section #155765 — thanks @iwhatsskill.
Bug fixes
- Keep Android attachment removal accessible with long filenames #151337 — thanks @iwhatsskill.
- Keep Android chat bubbles consistent during delivery #151336 — thanks @iwhatsskill.
- Expose Android tool failures and full recovery guidance #151332 — thanks @iwhatsskill.
- Isolate Android captures and preview staged photos #153033 — thanks @iwhatsskill and @vacinc.
- Keep Android Stop on its selected conversation and report failures #155035 — thanks @iwhatsskill.
- Restore Gateway switching after interrupted Android voice notes #155036 — thanks @iwhatsskill.
- Restore Android video controls after switching media #155037 — thanks @iwhatsskill.
Limits and compatibility
Missing or zero usage details and synthetic reply rows do not supply inferred usage or billing values.
Camera captures retain permission and Camera-setting checks, reject competing requests, and end when the app leaves the foreground. Unknown Stop results leave pending runs tracked. Genuine pending imports or sends still block Gateway switching.
Zoom and pan Android chat images
Open an Android chat image to pinch, pan, or use visible zoom controls without accidentally closing the preview. Zoom reaches 4×, a double tap switches between 2.5× and the fitted view, and rotating the device refits the image instead of keeping an outdated position. Photo messages use compact rows with four-image pages that let you reach every attachment, and browsing them pauses automatic following of the conversation.
Read Android connection and setup status
Android connection forms keep their labels visible after you type and put setup errors beside the relevant fields. Overview gives Chat a clearer entry point and makes connection states and destination rows easier to read, while saved credentials remain masked and replacing them still requires confirmation. Nearby Gateway lists also retain current addresses and availability when a service disappears or is rediscovered, without changing pairing or connection checks.
Sources and complete change list
Improvements
- Clarify Android Overview actions and connection status #151335 — thanks @iwhatsskill.
Bug fixes
Use Android realtime Talk without repeated speech
Android Talk can use supported GPT-Live realtime routes advertised by the Gateway and shows which route is active or why device speech was selected. The Codex route tries ChatGPT OAuth first and can fall back to a Platform key; the public API route requires a Platform key. Platform-key use is billed per use, including fallback. An advertised route still needs valid credentials and account access, and changing an active route requires stopping and restarting Talk. Longer replies can use the existing audio buffer more fully, and a stopped session now shows its failure reason in chat.
During realtime Talk, the phone leaves automatic local read-aloud silent, including replies started from another client, so consultation answers are not spoken twice. Text remains visible, and native Talk and explicit read-aloud remain available. Reconnecting to the same Gateway also keeps the selected agent in memory, while new Android voice messages send the recognized words without the app's former added instructions.
Sources and complete change list
Bug fixes
- Use supported GPT-Live relay routes in Android Talk and explain fallback #153741 — thanks @iwhatsskill.
- Keep long Android Talk replies playing and explain failures #152834 — thanks @saariuslystoned and @iwhatsskill.
- Stop duplicate Android speech during realtime Talk #153087 — thanks @saariuslystoned.
- Preserve Android Talk's agent across Gateway reconnects #152593 — thanks @saariuslystoned, @obviyus, and @destinedenergy.
- Send Android Talk transcripts without app-added instructions #153021 — thanks @iwhatsskill, @vacinc, and @guarismo.
Improvements
- Translate Android Talk status guidance #153967.
Limits and compatibility
Explicit native mode, forced consultation, and configured Azure endpoints retain their native or restricted behavior. Updating only the Gateway can change an older Android app's route; that mixed-version audio path and independent subscription-audio verification remain pending. The audio buffer remains bounded at 12 MiB. Agent selection does not survive an app restart or Gateway switch, and historical voice messages are unchanged.
Keep Talk consultations visible and complete
Talk keeps valid consultation answers when speech transcription finishes late and shows each new answer once in Chat. Your spoken request remains readable while generated instructions for handing work to the agent stay out of the visible conversation. On supported interruptible relay calls, interrupting a reply also lets you continue speaking without immediately losing the call when the provider is slow to confirm the stop.
Sources and complete change list
Bug fixes
- Preserve Talk answers across late speech transcripts #150536 — thanks @marvinthebored, @peetiegonzalez, @shakkernerd, @dimonnld, @saariuslystoned, and @goldenrodscript.
- Keep Talk consultation startup valid as finalized speech enters history #150283 — thanks @mertbasar0, @shakkernerd, @dimonnld, and @saariuslystoned.
- Prevent duplicate Talk consultation answers #153140 — thanks @shakkernerd.
- Hide generated Talk steering instructions from visible chat #153698 — thanks @shakkernerd.
- Keep Talk calls connected after interrupted replies #152427 — thanks @saariuslystoned, @obviyus, and @dimonnld.
Limits and compatibility
Newer tasks, cancellation, and completed answers still retire older requests. Existing history is not rewritten. After an interrupted relay reply, microphone input resumes after one second while the old output stays suppressed; another 30 seconds without a provider response boundary can end the session. Non-interruptible providers and explicit session closure retain their existing behavior.
Read full replies on Wear OS
Long watch replies now offer Read full reply, with scrolling, part navigation, and retry controls beyond the compact preview. Update both the watch app and phone companion; Chat also needs a Gateway that supports full-message retrieval. Voice status and microphone guidance fit small watches more comfortably, and context selections expose their selected state to accessibility services. Live Chat stays a preview until a stored reply is available, and older Talk text can become unavailable after its session data is retired.
Sources and complete change list
Improvements
- Read complete assistant replies on Wear OS #152041 — thanks @iwhatsskill.
Bug fixes
- Make Wear context selections accessible and easier to read #151296 — thanks @iwhatsskill.
- Keep Wear Voice text and controls usable on small watches #151868 — thanks @iwhatsskill.
- Keep Wear update guidance accurate after Refresh #151779 — thanks @iwhatsskill.
Limits and compatibility
Full replies have a one-million-character limit and show explicit messages for unsupported, changed, unavailable, or oversized text.
Keep typing after sending photos on iOS
Sending a photo in native iOS chat no longer triggers the reported composer freeze, so you can send the attachment and continue typing without restarting the app. This repairs the send-time focus problem; keeping sent photos visible after history refresh remains separate work.
Sources and complete change list
Bug fixes
- Prevent native iOS photo-send composer freezes #154082 — thanks @solvely-colin, @eragim, @kittitys, @rwoverdijk, and @hhkwoong.
Keep one Mac Quick Chat composer
Native Mac Quick Chat keeps one composer beneath the conversation, preserving your draft and streamed reply when you collapse and reopen it. Separate model and Effort controls make thinking levels and supported Fast mode easier to choose, while the context ring offers Compact Thread. Model pickers keep usable choices visible without unrelated discovery warnings, and capture actions sit in the plus menu. Screenshot capture still sends after selection.
Sources and complete change list
Improvements
- Use one Quick Chat composer with preserved conversation state #153383 — thanks @benediktweber for the related proposal.
Bug fixes
- Remove unrelated discovery warnings from native model pickers #154015 — thanks @romneyda.
Limits and compatibility
Model discovery failures remain visible in Models settings and the CLI. The Quick Chat layout here belongs to the native Mac app.
Draft beneath the latest Tauri Quick Chat exchange
The Tauri desktop app puts your latest exchange above a separate bottom composer, letting you prepare the next message while a reply streams. Collapsing the reply preserves the draft, live text, and widget interactions; sending and switching agents wait until the current turn finishes. Cmd/Ctrl+Shift+O now reaches the foreground app for New Session instead of summoning a background dashboard. The separate configurable Quick Chat shortcut remains available, as described in the desktop app guide.
Sources and complete change list
Improvements
- Redesign Tauri Quick Chat and simplify Apple thinking labels #153564.
Bug fixes
- Return the New Session shortcut to the foreground app #154118.
Limits and compatibility
The retired background dashboard shortcut also removes its Enable Global Shortcut tray toggle. The Apple changes simplify effective thinking-level labels and retain the reset-to-default action; they do not apply the Tauri layout to Apple apps.
Restore saved Gateways in the Tauri app
The Tauri app on macOS can reopen saved local or remote Gateways without the reported startup crash. If the launch environment prevents keychain access, its warning now gives appropriate recovery guidance, including reopening from Finder when relevant.
Sources and complete change list
Bug fixes
- Prevent saved-Gateway startup crashes in the Tauri app #154028 — thanks @vacinc for credited prerequisite work.
- Correct saved-Gateway keychain recovery warnings #154151.
Limits and compatibility
Reopening from Finder is recovery guidance, not a guarantee that every keychain problem is repaired.
Keep Mac Gateway ownership and connection status clear
Opening the native Mac app or changing connection modes leaves independently managed Gateways and other services running. Saved Gateways show the current connection status from their Dashboard windows, even when they are not the primary connection, and About can copy version and build details while offline. Resolve a port conflict through the service that owns it; a green connection indicator describes a connection, not the health of every service behind it.
The bundled Mac worker can start with saved desktop-sharing preferences, including named profiles, and honors whether sharing is enabled or disabled. Signing in from an open embedded Dashboard can also restore protected images and files while keeping the same-account conversation. Update both the Mac app and Dashboard for that renewal; signing in through an ordinary browser tab does not renew the embedded session.
Sources and complete change list
Bug fixes
- Keep independently managed Gateways running when the Mac app opens #153474.
- Show live connection status for saved macOS Gateways #152638.
- Start the Mac worker with saved desktop-sharing preferences #154436.
- Restore content sign-in from an open Mac dashboard #154639.
Improvements
- View and copy Mac build information offline #153184.
Start Windows background helpers without a blank console
Updated Windows startup and recovery helpers avoid opening an extra blank console during background launches. Interactive commands keep their terminal, and the change takes effect when the replacement helpers run.
Sources and complete change list
Bug fixes
- Hide replacement consoles during Windows background startup #152452.
Request Mac access and read recent app activity
Mac permission controls can request missing Screen Recording or Accessibility access through Grant, with System Settings nearby when more help is needed. After updating both the native app and Gateway, interacting with OpenClaw also gives agents basic recent-computer activity without Accessibility permission. The renamed System-wide presence detection option stays off by default and needs Accessibility for activity in other apps. Turning it off now disables only system-wide detection, including for previously disabled preferences; app-local activity remains eligible and does not prove who is physically at the computer or which device sent a message.
Sources and complete change list
Bug fixes
- Restore Mac screen and accessibility permission requests #153263.
- Make Mac inspection menus follow the Developer setting #153273.
- Release memory used to read audio-input names and IDs #151455 — thanks @vincentkoc.
Improvements
- Restore Mac activity context and Canvas media playback #153381.
Limits and compatibility
Merely opening or foregrounding the app does not count as recent input. Removing the unused Terminal automation row does not revoke macOS grants, and hiding inspection menus is a presentation setting rather than a security boundary.
Play HTTPS audio and video in Mac Canvas widgets
Canvas widgets can play direct HTTPS audio and video in inline previews, dashboards, and native panels. Update both the Mac app and Gateway, then update or recreate older saved widgets to receive the new media policy. Browser format support and autoplay rules still apply, so playback controls remain useful. Media requests can reach HTTPS hosts beyond a widget's separately granted API connections; the widget media guide explains the distinction.
Sources and complete change list
Improvements
The shared source and complete accounting for this media change appear in Request Mac access and read recent app activity above.
Limits and compatibility
Media hosting servers receive the client's request. Keep private data and credentials out of media URLs. API requests, scripts, images, and navigation retain their separate restrictions.
Recognize Chrome setup across Mac app versions
Mac settings distinguish an installed Chrome extension from one that needs enabling, and provide separate guidance when its helper needs repair. Older Mac apps keep a usable setup path with a newer Dashboard, including an unknown status when the older app cannot establish whether the extension is installed. Installation status remains separate from a live browser connection.
Keep the desktop awake for local work
The Tauri tray menu adds an optional Keep computer awake setting beside Start at Login for long-running local work. It is off by default, remembers the choice on this device, and stays active when windows close to the tray until you disable it or quit. On Linux it can also delay automatic dimming and locking; manual lock, explicit sleep, and lid behavior remain under operating-system control. The native Mac app adopts the clearer name for its existing setting, which still requires a connected, hosting, unlocked Mac.
Sources and complete change list
Improvements
- Add the optional Keep computer awake desktop setting #152420.
Limits and compatibility
Linux needs a working session manager or idle-inhibition portal. A saved preference that cannot activate is marked inactive and can still be turned off. Windows and macOS Tauri requests prevent system idle sleep without requesting that the display stay on.
Finish hosted worker cleanup across restarts
Hosted workers track unfinished commands through cancellation and node restarts, freeing occupied slots after cleanup is confirmed. Update the Gateway and the node hosts or Mac app together, and restart the updated hosts; older nodes may show Update required. Linux and macOS gain stronger cleanup, while Windows keeps a slot reserved when cleanup is uncertain. Let active workers finish before downgrading to an older version.
Sources and complete change list
Bug fixes
- Track hosted worker cleanup across cancellation and node restarts 8277325.
Improvements
- Move node worker journals off the host event loop ac63848.
Limits and compatibility
Moving launch and result bookkeeping into the background keeps occupied slots and results tracked through cancellation and cleanup. Unknown outcomes retain ownership rather than freeing slots early.
Reduce Mac app size while retaining required helpers
Mac packaging trims files the app's private worker does not need, reducing the universal app's size while retaining Apple silicon and Intel support. The packaging correction also keeps nested helpers needed by bundled subprocess support, including configured stdio MCP servers. Normal npm installations keep their CLI and Gateway functionality.
Packaging now also supports separate Apple silicon and Intel builds alongside the default universal app. Availability of signed downloads and their automatic-update feeds depends on the separate publishing work.
Sources and complete change list
Improvements
- Reduce universal macOS app package size #150773 — thanks @romneyda.
- Support separate Apple silicon and Intel Mac packages #154595 — thanks @romneyda.
Bug fixes
- Retain nested worker helpers in Mac app packaging #154291.
Limits and compatibility
Recorded size reductions come from controlled package comparisons, not a final signed release download. The later helper repair has native arm64 staging evidence; that staging does not establish publication of a new app asset.
Keep the Mac Dashboard visually consistent
The Mac Dashboard follows the native window's appearance while loading, avoiding a white flash before the selected theme appears. The collapsed-sidebar Inbox also matches the other titlebar actions and leaves room for its unread badge.
Read permitted attachments through Mac folder aliases
Audio and document attachments can be read through equivalent macOS paths such as /tmp and /private/tmp. The opened file must still be inside a permitted folder, so this fixes path handling without extending access to neighboring folders or shared workspaces.
Sources and complete change list
Bug fixes
- Read authorized media through macOS directory aliases #136218.
Read updated native controls in existing languages
Existing native-app languages receive refreshed labels for Android controls, Wear reply reading, Apple chat and progress, and Mac consent screens. The translations help explain the current controls and permissions without introducing new languages or changing what those permissions allow.
Sources and complete change list
Improvements
- Refresh native app labels and reply-reading translations #152164.
- Refresh native chat and progress translations #153464.
- Refresh translated macOS Automation permission explanations #153578.
- Translate Android controls and macOS desktop-sharing consent #153746.
- Refresh native tool-activity translations #151702.
- Translate Android chat image navigation #155571.
Bug fixes
- Refresh native download and response-stop translations and Thai wording b03f036 — thanks Peter Steinberger.
Download assistant documents from native chat
Native iOS chat now offers Download file on assistant-generated documents, handing the downloaded file to the system share sheet with Save to Files and other apps available. Shared native Mac chat adds a save panel for those documents. Downloads need current Gateway access and stay within the existing 100 MiB limit; expired or removed files need to be regenerated. Images, audio, and video keep their separate controls.
Sources and complete change list
Bug fixes
- Download assistant documents from native chat #155195 — thanks @takhoffman.
Remove unused files from Android packages
Android packages omit unused resource files, reducing what they carry without changing authentication behavior.
Sources and complete change list
Bug fixes
- Remove unused resources from Android packages #154782 — thanks @vincentkoc.
Limits and compatibility
The change removes three unused cryptographic resource tables. Recorded compressed-resource savings are not a final signed APK or installed-size measurement.
Models and Providers
TypeSafe Jev and local Decision Models give supporting plugins a way to make structured choices separately from chat. Claude Opus 5.5, GPT-6 Sol and Luna, and Grok 4.7 add new conversation choices, with their own account requirements, settings, and costs.
Models settings and runtime choices
Models settings now brings global defaults and the selected agent's provider connections into one workflow, preserving unfinished setup input during rescans. Saving credentials leaves model activation as a separate choice. A model-only change preserves a compatible saved runtime but clears an incompatible saved runtime and its native consent so configured routing can apply. Explicitly choosing an incompatible runtime, or a model whose configured native runtime is unavailable, still rejects the change without altering the session. Model and effort controls remain usable in narrow chats, with more accurate refresh feedback, supported thinking choices, and Fast preferences for delegated work. Agent-requested model changes through session_status now use Gateway checks for runtime, sandbox, worker placement, and the intended session, rejecting stale or incompatible updates without changing agent or global defaults.
Sources and complete change list
Improvements
- Unify model defaults, provider connections and Gateway discovery in Models settings #147794.
Bug fixes
- Preserve runtime choices when selecting a model #152394 — @obviyus.
- Prevent Gateway hangs for agents without runtime pins #153386 — @stackingrockss.
- Offer thinking levels only when declared labels or explicit mappings support them #145248 — @MasterSwords1, @obviyus, @itanyplus.
- Scope inherited Fast mode to the same model #153251 — @MertBasar0, @holny, @obviyus, @Oldrich333.
- Keep model refresh progress compact and accurate #153932.
- Keep model and effort pickers separate in narrow chat panes #153616.
- Give the provider-loading dialog its screen-reader name #152733 — @obviyus.
- Keep runtime selection when reapplying the same model and account #153945 — @RomneyDa.
- Allow model switches past incompatible saved runtimes #154918 — @VACInc.
- Restore Windows model runs and session-setting persistence #155071.
- Find models by ID or provider reference #155180.
- Avoid false setup failures after successful model tests #155407 — @RomneyDa.
- Validate session-status model changes through the Gateway #155826 — @shakkernerd.
Claude Opus 5.5
Claude Opus 5.5 is now selectable in the Anthropic API and Claude CLI catalogs as anthropic/claude-opus-5-5, with explicit opus-5.5 and opus-5-5 aliases. Existing selections stay unchanged, and the bare opus alias still chooses Opus 5. Thinking is always enabled, defaults to medium, and offers low through max; saved off or minimal settings use low instead. API use carries Opus 5.5-specific charges, and availability still depends on the selected account and route.
Sources and complete change list
Improvements
- Add Claude Opus 5.5 with model-specific thinking and pricing #155966.
Limits and compatibility
The shipped API catalog lists $4 per million input tokens and $20 per million output tokens, with $0.20 cache reads and $5 five-minute cache writes per million tokens. It declares a one-million-token context window and up to 128,000 output tokens. Requests omit manual thinking budgets, custom sampling, assistant prefills, and Priority Tier; forced tool selection becomes automatic. Fast mode and refusal fallback retain their direct-API-key scope.
GPT-6 Sol and Luna
GPT-6 Sol and Luna give you two new choices for text, images, and tool use through the OpenAI Responses API or ChatGPT sign-in. For embedded ChatGPT use, explicitly choose the OpenClaw runtime; setting the model alone does not select it. Existing selections and the Astra setup default stay unchanged. Luna has lower standard API rates in the shipped catalog, at $0.10 input and $0.50 output per million tokens compared with Sol's $2 input and $10 output. Different pricing tiers apply above 272,000 input tokens.
Bundled Codex 0.155.1 also lets eligible ChatGPT accounts discover and use both models through native Codex. After starting or upgrading OpenClaw, /codex models shows your account's choices. Embedded reasoning supports none through max, with medium as the default when supported; native effort choices depend on the account. The separate Luna Reserve route and its billing distinction remain unchanged.
Sources and complete change list
Improvements
- Add GPT-6 Sol and Luna API and embedded-runtime support #155967 — @fduch-stranger.
Bug fixes
- Restore Sol and Luna subscription discovery with Codex 0.155.1 #155989 — @fduch-stranger.
Limits and compatibility
The authored model metadata distinguishes a 1,050,000-token context window, a 272,000-token active-input budget, and a 128,000-token output maximum. Embedded /think off maps to none. The tested native account offered Sol efforts from low through ultra and Luna from low through max, both defaulting to medium; another account may offer narrower choices. The supported external Codex minimum remains 0.149.0, and the ACP adapter remains 1.11.0 with its Codex dependency updated.
Installed coding agents in chat
You can select installed OpenCode, Qwen Code, Pi ACP, and Kilo Code agents from Models settings and use their streamed replies in ordinary chat. Install and sign in to the app on the computer running OpenClaw, then use the discovery feedback and Check again control to resolve unavailable models. Detection alone does not confirm sign-in. Native-agent setup explains how an administrator's Continue for this chat grants Full Access, turns off optional sandboxing for that chat, and consents to the native app's permissions. Required sandbox and workspace boundaries still apply.
An explicitly selected CLI that is unavailable now reports the failure instead of silently switching to API access. Restore that CLI or explicitly choose an API route. Claude's picker labels help distinguish those routes, but an API-key account still incurs API charges through Claude CLI. Native consent must be renewed after a reset, runtime change, or stronger settings and does not carry into forks; deleting the OpenClaw session leaves the native app's history intact.
GitHub Copilot CLI models in chat
An installed, signed-in GitHub Copilot CLI can now supply models for ordinary web and channel conversations. Copilot setup uses the account running OpenClaw on that computer, with access and billing owned by Copilot; explicit bring-your-own-key settings and environment tokens can affect which account is used. Discovery is enabled by default, and disabling it stops new discovery and turns while admitted work continues. These native turns use the app's host permissions, without OpenClaw sandbox or workspace-only confinement.
Sources and complete change list
Improvements
- Select installed GitHub Copilot CLI models for ordinary chat #153799 — @obviyus.
Claude CLI launches and long-running commands
Claude CLI keeps follow-up tools and the final answer in the original turn when a foreground Bash command takes long enough to be moved into the background automatically. Commands intentionally started in the background still end the turn promptly and do not gain independent later delivery. Supported npm-installed wrappers now launch on Windows, long reasoning streams require less repeated parsing, and recovery timing stays within its existing budget when the system clock changes.
Completed Claude replies can also arrive while native background research continues, even with previews and block streaming disabled. Channel progress previews show tracked checklists and completion counts without treating a completed checklist as the end of the run.
Sources and complete change list
Improvements
- Reduce CPU work for long CLI reasoning streams #152191.
Bug fixes
- Preserve Claude CLI follow-up tools and answers after foreground Bash timeouts #149967 — @marvinthebored, @peetiegonzalez, @shakkernerd.
- Launch supported npm-installed Claude CLI wrappers on Windows #138504 — @LiuwqGit, @obviyus, @Vasanthdev2004.
- Keep CLI recovery timing stable across clock changes #150817 — @tzy-17, @altaywtf.
- Restore Claude CLI progress checklists in chat channels #150903 — @chelsealong, @fuller-stack-dev, @sennyhoney.
- Avoid unnecessary Claude session catalog rescans #154164.
- Deliver completed Claude replies while background research continues #154874 — @vacinc.
- Keep Doctor route repairs intact after Claude CLI turns #155398 — @hannnnn-l, @obviyus.
- Keep Claude turns alive through managed MCP tool timeouts #155663 — @VACInc.
Anthropic OAuth client compatibility
Direct Anthropic OAuth requests now advertise a maintained Claude client version to address newer models rejecting an outdated client identity. OpenClaw uses at least version 2.1.278 or a newer installed stable Claude CLI, with the result cached until restart. This updates request compatibility while leaving account entitlement, billing policy, and local model restrictions unchanged.
Sources and complete change list
Bug fixes
- Update Anthropic OAuth client identity for newer models #154098 — @KrasimirKralev, @SPRIC76, @Cyb3rb1ade, @raghidtawil-lab, @davidcittadini, @Kiiatkin, @fray-ai, @Oldrich333.
Grok 4.7
Grok 4.7 adds a text-and-image model choice with reasoning levels from low through xhigh. New xAI setups choose it when no primary model is selected, and web search, X search, and code execution use it when their model setting is omitted, including on existing installations. Explicit primary and tool selections stay pinned. Eligible Doctor repairs replace retired xai/auto selections while preserving account pins, fallbacks, and authored settings. Pricing above 200,000 tokens differs from the short-context catalog rates.
Sources and complete change list
Improvements
- Add Grok 4.7 and update unconfigured xAI defaults #155379 — @RomneyDa.
Xiaomi MiMo V2.6 models
Xiaomi MiMo V2.6 adds Pro, Flash, and Pro UltraSpeed for pay-as-you-go accounts, with Pro and Flash presets for regional Token Plans. New setups default to Pro when no primary model is selected, while existing selections remain. The new models support text and images, thinking controls, and retained reasoning history; Pro and Flash also prefer automatic Code Mode unless explicitly overridden. Token Plan zero-dollar catalog prices represent quota accounting, not free service.
Sources and complete change list
Improvements
- Add Xiaomi MiMo V2.6 models and new-setup defaults #155412 — @RomneyDa.
TypeSafe Jev and Decision Models
TypeSafe Jev lets supporting plugins choose among options, score supplied information, or estimate whether a condition is met. It uses the optional Decision Model role, which stays separate from chat and is off by default. Selecting a decision model does not start background work or give an agent new tools or permission to act.
The separate @openclaw/typesafe plugin is available on npm for OpenClaw and plugin API 2026.9.6 or newer. Install and enable it, add a protected API-key reference, then select Jev or Jev 1.13.0. Hosted evaluations send the supplied information to TypeSafe and incur its normal API charges. Requests can allow up to thirty seconds, with shorter caller deadlines and saved timeout settings respected. If replacing an external prototype, preserve its settings, credentials, and policy before uninstalling; uninstall --keep-files does not keep the configuration.
Local ONNX decision models
The optional ONNX plugin makes structured choices locally on the CPU without sending the supplied information to a hosted inference service. Its @openclaw/onnx package is available on npm for OpenClaw and plugin API 2026.9.6 or newer. Install and enable it, prepare one of seven model presets, and select it as a Decision Model. Five presets have pinned downloads and two require local exports; none is enabled automatically.
Evaluations can allow up to thirty seconds, with shorter deadlines still respected. Large cold models may need preloading or a smaller model. Invalid replacement preparation leaves an already-loaded model available, though failure while creating the replacement's native session can still evict it.
Local TypeSafe Kev decisions
The TypeSafe plugin also connects the Decision Model role to a local Kev server you run yourself. Install and enable @openclaw/typesafe from npm on OpenClaw and plugin API 2026.9.6 or newer, then configure the server's loopback address and select Kev. The server controls the loaded model weights, and its address applies to every request through the plugin. Local mode needs no hosted key and does not fall back to hosted Jev.
The unset timeout defaults to thirty seconds, while shorter caller deadlines and saved overrides remain in effect. A timeout or canceled request does not necessarily stop inference already running on the Kev server.
Sources and complete change list
Improvements
- Run TypeSafe decisions through a local Kev server #154059.
Model discovery and retry feedback
Model discovery can use saved credentials in custom agent directories, refresh eligible empty catalogs after their cache expires, and retain existing choices when a catalog refresh fails. Failures and Retry remain visible even while other providers are still loading, so you can act on the problem without losing a working selection. OAuth diagnostics also identify the affected agent and profile with the appropriate sign-in command.
Default merge-mode catalogs now show eligible newly discovered models alongside older saved provider rows. To restrict the available choices, use an explicit modelPolicy.allow policy or models.mode=replace; a saved provider array alone no longer limits discovery.
Sources and complete change list
Bug fixes
- Restore model discovery from custom agent directories #151458 — @obviyus.
- Refresh successful empty provider catalogs after expiry #151580 — @obviyus.
- Retain failed-refresh status after model-catalog worker recovery #151597 — @obviyus.
- Keep model discovery failures, retries and save errors visible #153703 — @obviyus.
- Explain OAuth failures during model discovery with scoped recovery guidance #139079 — @StrajnarFilip, @obviyus, @jzakirov.
- Keep model discovery timeouts stable across clock changes #155323 — @masatohoshino, @obviyus.
Limits and compatibility
- Show discovered models beyond older saved provider lists #155420 — @obviyus.
Model catalog resource use
Repeated model and authentication refreshes avoid whole-database copies and limit temporary plugin copies created by current discovery workers. Catalog preparation also reuses more existing work and stops recurring retirement checks while workers are idle. These catalog repairs take effect in newly started workers and now release retired catalog registrations after refreshes. Older scratch directories use a separate cleanup path.
Sources and complete change list
Improvements
- Stop recurring retirement polling in idle model-catalog workers #152800.
- Index configured models for repeated selection #151442 — @vincentkoc.
- Reduce repeated provider catalog copying #151849 — @vincentkoc.
- Reduce policy-lookup work in model listings #155241.
Bug fixes
- Bound model-catalog temporary copies and stop closed-client retry loops #153038 — @mrzeepek, @Conan-Scott, @ge0el, @cnflwzh, @lishewen, @zl0nline, @shakkernerd, @flyto168, @msobrosa, @islandpreneur007, @JoPaMu, @safrano9999.
- Reuse plugin source copies during model catalog refresh #153041 — @shakkernerd, @mrzeepek, @zl0nline.
- Prepare model catalogs asynchronously with consistent configuration #152142.
- Avoid repeated database copies during model refreshes #153130 — @dmlau76, @mirasrael, @vyctorbrzezowski.
- Release old model-catalog data after refreshes #154568.
Credential preparation during model requests
OpenClaw avoids more repeated storage reads, process starts, filesystem checks, and copying while preparing model credentials, allowing other Gateway work to progress during asynchronous reads. Reuse is invalidated when relevant credentials or ownership change. Credentials changed by another process can take up to 100 milliseconds to become visible through the cached path, while changes made within the running process invalidate it immediately.
Retiring catalog workers now wait for already-started OAuth refreshes to save replacement credentials, while failed Gemini credential replacement removes its staged file and retains the previous credentials for retry. Already-stranded logins may still need a fresh sign-in.
Sources and complete change list
Improvements
- Yield during stored model-credential reads #149309.
- Reduce Gateway pauses during concurrent credential reads #152140.
- Reuse unchanged authentication reads across Gateway turns #152266.
- Reduce copying during cached model-authentication reads #152504.
- Reuse authentication readers during model fallback #152016.
- Reduce filesystem work on cached credential reads #152719.
- Avoid redundant header copying before model requests #152722.
- Reuse module-loading work during model selection #152732.
Bug fixes
Provider retries and configured fallbacks
Conversations and scheduled work can reach configured alternatives sooner when a provider asks for a rate-limit wait longer than the saved retry cap. This requires a configured model fallback, a positive cap, and a request that can be replayed safely; zero disables the cap. Switching accounts or models sooner can change costs and answers. Long tasks also regain their transient-outage recovery window after a completed successful model response, while overall retry and run limits remain in force. Conversation compaction now keeps the current healthy account, including a selected fallback, in both explicitly ordered and implicit account pools; actual failures and preferred-account recovery can still change it.
Eligible background text requests can try prepared backup accounts while respecting explicit account pins, and canceled requests stop waiting for a shared credential refresh. Saved cloud failures retain their cause, partial output, and usage. Claude also retains generated partial replies and final usage when its context window fills, without completing the truncated answer. Check what already completed before retrying a failed run, because earlier tool actions may have taken effect.
Sources and complete change list
Bug fixes
- Use configured fallbacks when safe rate-limit waits exceed the saved cap #148580 — @azuretek, @altaywtf, @cookywook, @oldrich333, @binchenutrecht.
- Renew transient retry windows after successful model responses #151610.
- Retry eligible background completions with prepared backup accounts #151133 — @anyech, @obviyus.
- Retry model selection after an overlapping credential refresh #152426.
- Finish canceled requests during shared OAuth refresh #152664.
- Preserve model failure causes and cloud-worker fallback runtime #152028.
- Reach configured fallbacks after blank pre-output errors #150908 — @DonnieFi, @obviyus, @dom521, red.
- Retain Claude replies when its context window fills #155029.
- Keep healthy provider accounts through compaction #155204 — @jason-allen-oneal, @aatreya.
- Recover subscription quota after access-token expiry #155665.
Provider error messages
Budget errors no longer trigger futile retries merely because a billing-help URL contains limit-related wording. Upstream server failures also report as server errors instead of misleading timeouts, while genuine rate limits, timing failures, and overload retain their existing handling.
Opt-in diagnostic timelines show model activity and explain existing recovery decisions. OpenAI misalignment errors are also identified as provider refusals instead of malformed requests; the separate findings-review flow below governs whether a supported conversation can continue.
Sources and complete change list
Bug fixes
- Avoid futile budget-error retries caused by help URLs #151377 — @obviyus.
- Distinguish upstream server errors from genuine timeouts #141843 — @amittell, @obviyus, @jnikolaidis.
- Explain OpenAI misalignment refusals accurately #154684 — @vincentkoc.
Improvements
- Explain model activity and recovery decisions in diagnostic timelines #149465 — @RomneyDa, @vincentkoc, @1Vision365-PeterTijsma, @lraesly.
Review provider findings before continuing chat
When a provider returns a misalignment precaution, chat now shows Review findings and pauses ordinary sends, Talk, and queued input. Supported native Codex and ChatGPT Responses conversations can offer the exact provider-supplied continuation for an authorized operator to acknowledge. The pause clears only when the provider accepts that request, and earlier queued messages remain held for individual review and retry. Ordinary API-key Responses and incognito conversations can show findings without offering continuation, and missing or incomplete findings cannot authorize it.
The precaution concerns the agent's interpretation of the task and does not establish that the user violated a policy. It does not undo completed actions or bypass a refusal automatically. Model failover guidance covers the limits, including that downgrading to code from before this feature removes pause and held-message enforcement.
Sources and complete change list
Improvements
- Review provider findings before continuing a paused chat #155214.
Responses and Chat Completions tool continuity
Compatible custom Responses endpoints preserve optional tool inputs, and managed Chat Completions conversations retain the encrypted provider state needed to continue after tools. Eligible Responses stream conflicts can recover within the existing retry allowance without repeating earlier completed tools. Recovery is limited to qualifying completed responses that have not already exposed output from the failing response, and excludes provider-hosted tools.
Explicit terminal status now takes precedence over contradictory output-limit hints, avoiding an unnecessary continuation request while keeping genuine length recovery available.
Sources and complete change list
Bug fixes
- Preserve optional tool arguments on custom Responses routes that declare support for the strict field, allowing
strictto be false #151416. - Normalize malformed Responses tool-call results #151044 — @RomneyDa.
- Preserve matching provider state through tool continuations #150633 — @zhangguiping-xydt, @obviyus.
- Recover eligible Responses stream conflicts without repeating completed actions #152947.
- Respect terminal Responses status before output-limit recovery #149242 — @RomneyDa.
Tool schema compatibility
Gemini tool requests no longer include the internal optional-field metadata that could cause rejection. Plugin authors also get deeper finite-schema support in the Gemini normalizer and unsupported-keyword cleaner, avoiding recursive stack overflow in those two paths while still rejecting circular objects.
Sources and complete change list
Bug fixes
- Prevent Gemini rejection of optional-field metadata #151327 — @zesming, @Takhoffman.
- Clean deeply nested tool schemas without recursive stack overflow #152990 — @obviyus, @hpyhandsome, @wangmiao0668000666.
- Preserve provider-compatible collector schemas during refresh #154062 — @zyz619963502zyz, @obviyus, @flynnmcpoc.
Long-conversation context preparation
Configured cache-TTL pruning now removes expired tool output on eligible OpenAI and ChatGPT/Codex routes. It remains opt-in, and custom proxies must explicitly support prompt-cache keys. Preparing long conversations also avoids some repeated request-copying and Unicode cleanup work while preserving valid multilingual text and emoji.
Native Ollama compaction checks now use valid measured prompt, output, and cached-token counts, falling back to estimates when those counts are missing or invalid.
Model costs and Luna Reserve usage
Unknown model costs are now left unavailable instead of appearing as free usage, while explicitly free rates and provider-billed zero totals remain zero. Recorded charges retain their request-time pricing. Plugin consumers should handle the optional usage.costUsd field being absent.
Codex usage views now label Luna Reserve as a separate route. Unused Reserve quota does not cover ordinary Luna requests, including with Fast off, and ordinary Luna may still consume credits. This clarifies the display without enabling Reserve routing; account counters are not per-request billing receipts.
Search provider choices in coding agents
Claude Code, Codex CLI, and Gemini CLI now honor explicit search-provider and disabled-search settings. Eligible native OpenAI search also keeps its selected route through Tool Search and Code Mode. Choosing a managed provider suppresses native fallback even when that provider's connection fails, so a failed connection does not silently change your search choice.
Deepgram multichannel transcription
Deepgram prerecorded transcription now retains speech from later audio channels, including recordings whose first track is silent. It uses the best alternative from each channel in the provider's order; it does not interleave the tracks chronologically or add speaker labels.
Sources and complete change list
Bug fixes
- Retain Deepgram transcripts from later audio channels #151343 — @leon-sk668, @obviyus.
Local transcription setup checks
Doctor can identify missing commands or arguments in CLI media-tool setup, and transcription rejects those incomplete commands before launching them while retaining model fallback. It provides guidance without rewriting your settings. Audio discovery also skips Whisper model scans when whisper-cli is not installed.
ChatGPT image-generation errors
When image generation through ChatGPT sign-in fails, OpenClaw now shows the provider's available explanation or refusal. The bounded, sanitized diagnostics help explain the result while leaving the provider's policies and failure rules unchanged.
Sources and complete change list
Bug fixes
- Explain failed ChatGPT image requests with provider diagnostics 26c8cd22 — @rondavis007, Ayaan Zaidi (coauthor).
llmman local and hybrid setup
Expanded llmman guidance explains existing local and hybrid setup, model names, credentials, and troubleshooting. It documents the existing integration rather than adding a new provider or routing feature.
Sources and complete change list
Documentation
- Expand llmman local and hybrid inference setup guidance #139606 — @ericcurtin, @sallyom.
Local model server shutdown and replacement
Managed local model servers retain shutdown ownership and wait for child output and termination to settle before a replacement starts. Incomplete shutdown remains visible as an error that later requests can recheck, and Windows cleanup avoids signaling a different process that has reused the old process ID. Existing stop budgets and platform limits still apply.
xAI device sign-in validation
xAI device sign-in now rejects malformed token-response bytes before they can be saved as corrupted credentials. Successful token-refresh responses are also validated before replacing stored credentials, so malformed responses leave the old local credential intact. Provider-side token rotation can still require signing in again, and existing corrupted credentials are not repaired retroactively.
Codex accounts and migration
Codex account status now identifies the selected connection and reports a deleted profile's own errors instead of showing another subscription as active. Credential import asks for consent before inspection, and upgrade guidance distinguishes missing local profiles from provider authentication failures. Follow the agent- and profile-specific recovery guidance and verify the result with an unfiltered auth list; credentials are not imported automatically. Migration guidance also explains when secret inspection can still prompt for Keychain access. Onboarding now explains the import scope before review and apply, including that sessions and chat history are excluded, credentials require separate consent, and configuration and hooks need manual review.
Supervised turns retain their local Codex configuration and login. A shared Codex daemon still shares its login across chats, without per-chat account isolation or fallback to OpenClaw credentials. Changed policy may require a reconnect or retry.
Sources and complete change list
Bug fixes
- Correct Codex control permissions, node cleanup, and active-account reporting #151728.
- Show errors for the selected Codex account #151831.
- Preserve Codex authentication choices and migration consent, with direct
allowKeychainPrompt=falseimports skipping all credential inspection, including files #151761. - Explain missing Codex profiles after upgrades without false HTTP 401 errors #153051 — @msobrosa, @kpwillis.
- Preserve local Codex setup across supervised turns #151001 — @galiniliev, @iXandru.
Documentation
- Explain Codex import scope before onboarding review #151383 — @RomneyDa.
Codex app approvals and plugin availability
Scheduled Codex app calls retain the connected-account approval requirements captured when the schedule was created, alongside current policy. Plugin installation refreshes shared information without treating another conversation's readiness as proof that an app is usable in this one, and prompts dismiss when another connected client actually answers them. Missing configured plugins no longer restrict otherwise eligible connected apps, while a present plugin disabled by an administrator retains its restrictions. Older custom runtimes may need /new or /reset after installation.
Codex launch and restart recovery
Codex turns can start after slow process-registration reads and recover from stale records for exited processes after an OpenClaw restart. Valid native configuration forms and managed Bun launch checks also receive the intended handling. Verified setup requires a local native executable or official npm launcher, so an app-server proxy is not a substitute on that setup path. Persistent process-recovery failures still need inspection rather than manual deletion of records.
Sources and complete change list
Bug fixes
- Correct Codex TOML parsing and managed Bun launch verification #151686.
- Start Codex turns after slow registration reads #153282.
- Recover Codex turns blocked by stale process records #153454.
- Honor cancellation while opening Codex runtime artifacts #154394.
- Reject stale Codex turn selections #155817 — @shakkernerd.
Codex background text completions
Eligible local, agent-scoped Codex background titles and narratives can run with administrator hooks in a verified isolated environment. Model-callable tools, apps, and MCP remain unavailable there, and unsupported launchers may need a directly executable wrapper. Optional finalization can also choose silence without generating a missing-summary fallback, while required replies and failure reporting remain intact.
Codex workspace instructions and side questions
Resumed Codex sessions retain their captured inherited AGENTS.md instructions even if the source file changes or disappears; start a new session to load edited instructions. Eligible /btw side questions regain inherited shell tools, and cancellation settles the side question's native background terminals or reports when stopping cannot be confirmed. Main-conversation terminals and OpenClaw background jobs keep their existing lifetimes.
Sources and complete change list
Bug fixes
- Preserve Codex workspace snapshots, completion during delayed prompt saves, and side-question cleanup, while honoring explicit reasoning and permitted empty background replies #151753.
Codex remote file-transfer deadlines
Codex remote file and attachment transfers keep their existing elapsed-time budgets when the system clock moves backward, preventing a clock correction from extending the wait. Existing size, path, and cancellation limits remain in force.
Sources and complete change list
Bug fixes
- Preserve Codex remote transfer timeouts after clock corrections #155603 — @SunnyShu0925, @obviyus.
Codex child results and reply delivery
Delegated Codex work now completes from native completion events or recovered history, preventing parent commentary from being mistaken for a child's finished result. Parents can resume after yielding to deliver completed work, and eligible saved results can restore a missing final summary without repeating completed actions. Reply handling also distinguishes delivered, queued, and failed output while preserving unsent images and finalized text.
Automatic approval remains limited to one execution, with persistent trust requiring an explicit choice and empty approval forms requiring Allow or Decline. Recovery retains evidence of prior tool effects, but uncertain partial media delivery can still require checking what arrived. Updated Codex and Copilot plugins need a matching core SDK for the delegated-result repair.
Sources and complete change list
Improvements
- Copy only matching task history during harness recovery #152790 — @fuller-stack-dev.
Bug fixes
- Use native Codex events for child completion #151680.
- Recover Codex summaries after background work finishes #153538.
- Preserve Codex delivery evidence, image replies and approval scope #151863.
- Preserve multiline Codex output without repeated parsing stalls #151399.
- Reject malformed and nonterminal Codex completion events #151373.
- Preserve background tool effects in Codex retry decisions #151371.
- Deliver delegated results after a Codex parent yields #152172.
- Restore plugin worker history access and avoid update cleanup loops #153772 — @lidashi1025.
- Avoid Gateway pauses during Codex process registration and cleanup, with updated plugins requiring a host that supports asynchronous process storage #152820 — @fuller-stack-dev.
Codex conversation history and branches
Codex conversations keep their selected physical source, with stop and steer reaching the active turn and completed forks retaining their outcome. Compaction waits for confirmation, valid retained text spans can be forked when runtime policy permits, and oversized tool results can be replaced with explicit omission notices when reopening a conversation without changing its full transcript. New sender-attributed messages also preserve the submitted text needed for branching; older mismatched transcripts are not rewritten. Recent assistant explanations survive thread rotation, and successful rewinds or branch switches retire stale native context so the next turn follows the selected history.
Older adopted chats without a saved source keep their history but need fresh adoption into a new chat. Pinned chats need their original source restored, or the replacement adopted separately. Older nodes require an update and refreshed capability approval to continue, and native terminal or paired-node CLI resume requires a local stdio source. Archiving a parent protects active descendants, while required requests and tool arguments must still fit the history limits. Sandbox-required sessions cannot use host-only forks, and rewinding or switching branches can reduce prompt-cache reuse without erasing provider-side history.
Sources and complete change list
Bug fixes
- Preserve Codex history and wait for confirmed completion #151700.
- Fix Codex forks after sender-attributed messages #153552.
- Recover Codex context from oversized tool outputs #153854 — @vincentkoc.
- Retain recent Codex answers after thread rotation #155127 — @VACInc.
- Reset Codex context after rewinds and branch switches #155207.
Limits and compatibility
- Keep Codex chats and controls attached to their selected source #151854.
Inspecting full Codex tool output
Long available Codex tool responses now remain saved after a reload, with Show full output, Copy, and Download providing inspection and export of the original captured text. Recognized native Code Mode results also get readable command and text displays with expandable source and Raw details, while unknown or incomplete results keep their original representation and failed exit statuses stay visible. The output guide explains the distinction between execution output and provider responses. Older discarded text cannot be recovered, and redaction, provider truncation, and transport limits still apply, including a requested maximum of two million characters per text field. Neither view proves exactly what Codex later sends to its model.
Codex sandbox commands and cancellation
Interactive Codex sandbox commands now receive real terminals, Ctrl-C reaches interactive and noninteractive commands, and exit results identify the requested process. If command execution is allowed but process management is denied, permitted commands can finish in the foreground while background continuation and explicitly excluded shell tools remain unavailable. POSIX installations running Bun need a real Node runtime for terminal helpers. Cleanup retains owned resources until work settles, including canceled readiness probes.
With OpenClaw's sandbox exec-server and a retained sandbox lease, canceling a turn now stops its own processes and admitted child work while preserving independent background work in the same native thread. Revoking the original source can still stop its retained work; releasing the final lease cleans up children, and other native execution modes retain thread-wide cleanup.
Codex catalog and connection overhead
Small Codex catalog replies avoid waiting for a decoder worker to start, while large session lists reduce repeated scans and database work. Catalogs refresh incrementally, with full reconciliation at startup and reconnect; quiet edits or removals in older sessions may wait for a successful fifteen-minute safety cycle. Large catalog parsing moves off the Gateway's main thread, and recreated connections suppress unused notification traffic, reducing repeated processing without changing model generation.
Progressive local lists can show retained rows or loading status while slow discovery continues, and responsive providers can proceed alongside slower ones. Permanent catalog launch failures now stop repeated retries and identify the executable to repair; restart afterward, because a configuration reload does not clear that failure.
Sources and complete change list
Improvements
- Reduce database work while listing Codex sessions #151979.
- Reuse eligible Codex session rows during catalog polling #152712.
- Reduce Codex app-server framing overhead #152035.
- Reduce unused Codex notification traffic #151998.
- Refresh Codex session catalogs incrementally #152257.
- Parse large Codex catalogs outside the Gateway main thread #152352.
- Return local Codex session lists while discovery continues #154362.
- Reduce session-list delays from slow providers #155670.
Bug fixes
Starting Codex work during streaming replies
New Codex chats, delegated work, and HTTP fallback requests can start while sixteen earlier responses are still streaming. The relay separates preparing and uploading a request from keeping its response open, lets short bursts wait for capacity, and reclaims only completed idle connections. Active responses and newly opened WebSockets awaiting their first request remain protected.
Capacity remains bounded, with sixteen preparations or uploads plus sixteen waiting, separately from eighty resident HTTP operations or WebSocket connections and additional space for pending or closing work. Transport limits still apply, and sustained overload can exhaust retries. HTTP connections close after each response and native HTTP retries reconnect, while WebSocket reuse remains supported. See Codex runtime behavior for the detailed limits.
Automations and Scheduling
Scheduled work is easier to run, follow, and return to, with clearer distinctions between work that is executing, work that has finished, and results still waiting to reach you.
Run paused automations without losing their schedule
You can use Run now on a paused automation in the Agents panel without enabling its schedule. A future Once job keeps its saved occurrence even with Delete after run enabled, including when a manual run waits past that date or OpenClaw restarts. Re-enabling makes the preserved occurrence available again, while genuine schedule edits still take effect and already-deleted jobs are not restored. Manage automations explains the controls and run history.
Accepted manual runs can start after the calling tool or native agent reply finishes, without keeping that reply open for the whole job, and acknowledgement now follows a saved run receipt. Cancellation, cleared queues, and withdrawn permissions still prevent activation. If OpenClaw crashes before dispatch, the interrupted receipt remains for diagnosis without automatically replaying the run.
Sources and complete change list
Bug fixes
- Run paused automations once from the Agents panel #129310.
- Keep paused future one-shot automations after Run now; downgrading to older code can lose this protection #152126.
- Let queued manual automations start after tool completion #153865 — thanks @vincentkoc.
- Record manual automation runs before acknowledging them; pre-dispatch interruptions remain in database receipts and may not appear in task-backed run history #153360 — thanks @obviyus.
- Let accepted queued automations start after the agent replies #154320.
Let scheduled work outlive the creating conversation turn
Scheduled jobs keep their own execution and result-saving lifetime after the conversation turn that created them ends. Their command launcher remains available after background handoff, and parent conversations stay available while delegated work or its delivery is pending. Canceling a job or withdrawing message permission stops later message actions while preserving records of deliveries already accepted.
Scheduled Gateway tools must run on the Gateway that owns the job. Remove gatewayUrl and gatewayToken from same-host templates before rerunning them. Cancellation cannot recall effects already submitted to a provider.
Sources and complete change list
Bug fixes
- Keep scheduled work and delegated results alive after the creating turn #151919.
- Keep complete scheduled-job lifetimes independent of creating requests #152051.
- Preserve the Gateway launcher for scheduled commands #152451.
- Cancel pending callback work while preserving required completion #151214.
Security and trust
- Stop new scheduled message actions after cancellation or permission withdrawal 10169f04 — thanks @shakkernerd.
Create automations from the current conversation
Remote administrators can create recurring automations in a fresh chat turn under their existing permissions, including jobs attached to the current conversation. WebChat can also create announcements back to that conversation using announce or omitted delivery settings. Fresh creation rights do not carry over to management continuations or grant access to the host, providers, or additional MCP tools, and an explicit delivery.channel=webchat remains invalid.
Jobs created in a direct message can use their recorded creator account even when result delivery is disabled or goes to another channel. The account must still be configured and the recorded origin valid, with existing tool restrictions preserved.
Sources and complete change list
Bug fixes
Preserve commands and clarify automation settings
Creating or editing an automation preserves meaningful whitespace in shell commands, and invalid cron stagger values are rejected before they can partially change a job. Keyboard focus stays visible above the editor’s sticky save controls, delayed action feedback names the job you acted on, and timeout errors correctly explain that zero disables that particular timeout. Other execution limits still apply.
If an older save trimmed a command, reapply the original command to repair it. When creating jobs from scripts, omit working-directory flags to use defaults instead of passing empty strings.
Sources and complete change list
Improvements
- Avoid redundant reads for explicit-revision cron scratch writes #153941.
- Reduce database work for cron scratch-note writes #154337.
Bug fixes
- Preserve meaningful whitespace in automation shell commands #150071 — thanks @zhangguiping-xydt, @obviyus.
- Reject invalid cron stagger values before changing jobs #151740 — thanks @alix-007, @aniruddhaadak80, @obviyus.
- Keep automation form keyboard focus clear of sticky actions #152135.
- Explain the existing zero-timeout option in automation errors #152814 — thanks @kriswuli006, @aniruddhaadak80, @obviyus.
- Identify the automation behind delayed action feedback #150203.
Limits and compatibility
- Reject blank working-directory arguments when creating automations #129714.
See whether scheduled work and delivery finished
Run history now shows OK · Error or OK · Unknown when execution succeeded but overall completion failed or remains uncertain. These runs still appear under the OK execution filter, so the delivery details matter when checking whether a report reached you. Confirmed final delivery can prevent a later tool error from turning a completed report into a false failure, while progress-only messages do not count as final delivery. Repeated failed runs in a persistent conversation also retain their original errors for diagnosis.
Otherwise successful scheduled jobs can finish quietly when there is nothing to report, even with an announcement destination configured, without recovery replies or missing-summary placeholders. Direct user messages still require replies, and real execution, cancellation, child-handoff, or delivery failures remain failures. History also distinguishes loading and failed requests from confirmed empty results, with Retry available when a request fails.
Sources and complete change list
Improvements
- Avoid duplicate retained-history reads for deleted automations #152492.
- Move read-only Cron inspection into background workers #152500.
- Preserve Cron recovery history during stop and restart #153158.
- Avoid unrelated session rebuilds after cron events #151279 — thanks @jalehman.
- Reduce task-payload copying in cron cleanup #154174.
- Skip redundant schedule checks on idle automation ticks #150277 — thanks @vincentkoc.
- Reduce timer allocations for busy cron streams #151956.
Bug fixes
- Expose failed or uncertain completion in scheduled-job history #129396.
- Avoid false failures after scheduled reports are delivered #152165 — thanks @pash-openai.
- Preserve errors from repeated automation runs in persistent sessions #150315 — thanks @jalehman, @dazlarus.
- Keep notification delivery records attached to the correct task #151815.
- Let scheduled jobs finish quietly when there is nothing to report #154533 — thanks @obviyus.
- Suppress missing-summary placeholder announcements for scheduled runs #154930 — thanks @vacinc.
- Distinguish unavailable automation history from empty results #154871.
- Contain late task-notification delivery failures #155233 — thanks @jacobtomlinson.
Keep heartbeat checks responsive and outcomes clear
Overdue heartbeat checks no longer hold up scheduler startup or reload, and their results can wait for busy storage without blocking unrelated work. A successful or skipped agent no longer hides another agent’s failure in a combined heartbeat result. Background command results can also reach their idle originating conversation while unrelated sessions are busy, when automatic wake is enabled. Activity in the destination conversation or pending recovery can still defer delivery, and subagent sessions remain excluded from automatic wake.
Routine heartbeat checks with no queued events or tasks now skip a busy agent if preparation has not started, avoiding a false timeout and error backoff. Their next opportunity is the normal scheduled tick. Manual wakes, queued work, and checks already started keep their retry behavior, and real execution timeouts remain errors.
Sources and complete change list
Improvements
- Move heartbeat outcome queries into the agent database worker #147463.
- Avoid unrelated session scans during heartbeat admission #151400 — thanks @vincentkoc.
- Reduce heartbeat membership work in large agent setups #151867 — thanks @vincentkoc.
Bug fixes
- Prevent heartbeat catch-up from blocking cron startup; a handler-unavailable skipped result calls for checking startup and sidecar errors #151319.
- Avoid blocked heartbeat writes behind busy SQLite workers #152763 — thanks @fuller-stack-dev, @smfworks.
- Preserve individual agent failures in heartbeat broadcast results #129648.
- Show a copyable heartbeat command to keep results internal while leaving checks scheduled #153448 — thanks @alix-007, @obviyus, @tridefender.
- Deliver background command results despite unrelated busy sessions #152287.
- Skip untouched scheduled heartbeat checks while the agent is busy 55995369 — thanks @vincentkoc.
Resume parents and finish delegated results
Parents waiting on delegated work can resume across provider retries, and old pending result delivery no longer blocks new launches within the existing active-run limits. Eligible native children paused with sessions_yield can continue under their original task when their controlling parent sends an ordinary message, allowing the task and its chat activity to finish together. Explicit follow-ups remain separate work, and interrupted children after a restart report back for parent-directed continuation.
Queued children are recorded before startup, and native follow-ups before acceptance, while completion notices remain owed until the parent turn finishes. If follow-up acceptance is still pending, inspect the returned run before retrying. Results remain accessible through conversation compaction and cleanup, with existing access checks preserved; pending or failed saves remain visible rather than being treated as delivered results. Completion and cancellation notices keep their intended destination through delayed storage work, and an accepted or uncertain send no longer triggers fallback solely because a later save fails.
Completed child results can reach a parent after it yields, and delayed cross-session replies can resume a requester after its original connection ends. The retained permission context lasts within the running process; restart recovery and explicit retries require newly admitted authority. Later turns recognize earlier pending children without restarting them, and matching late results are accepted without resending input. Running children continue through existing completion delivery, while paused children still need a continuation through sessions_send.
Sources and complete change list
Improvements
- Reduce subagent capability-check work for large histories #152263.
- Choose explicit local placement for child sessions #153912 — thanks @galiniliev.
Bug fixes
- Resume waiting parent tasks across provider retries #151879 — thanks @jalehman.
- Preserve sub-agent cleanup during overlapping result delivery #151907.
- Unblock subagent launches after confirmed late result delivery #151949 — thanks @vacinc.
- Keep undelivered results from blocking new delegated work #152537 — thanks @damiansmazurek.
- Acknowledge queued subagent records before launch #151303.
- Track child follow-ups before acknowledging acceptance #153358.
- Preserve permitted session reads across background handoffs and resumes #141865 — thanks @takhoffman, @brokemac79, @vacinc.
- Complete eligible native paused child tasks after ordinary parent continuations; automatic continuation requires recorded task and store ownership, while older records retain explicit controls #153047.
- Keep agent results accessible through session changes #151935.
- Avoid false drain failures after private subagent timeouts #153461.
- Retain subagent completion notifications while the parent is still running #152761 — thanks @pollybot13, @shakkernerd, @bsniznd, @borclaw.
- Show direct-announcement failures after successful fallback delivery #125130 — thanks @vincentkoc, @alix-007, @shakkernerd, @alexey-pelykh.
- Deliver current subagent results past old pending cleanup #153157.
- Suppress stale tool-error replies during successful agent pauses #153779 — thanks @vacinc.
- Isolate pending system notifications by agent and conversation, with bounded transient queues; ambiguous multi-agent SDK calls must supply a resolved
agentIdor qualified session key #151652. - Settle cancelled subagent notifications and quiet repeated backlog warnings #151569 — thanks @laurenceputra.
- Suppress obsolete subagent timing warnings #151275 — thanks @jalehman.
- Deliver subagent completion after the spawning tool exits b3d3f860 — thanks Peter Steinberger.
- Protect unfinished child publication during flow maintenance #154698.
- Resume requesting sessions when delayed replies arrive #155151 — thanks @vacinc.
- Recognize pending child work from earlier turns #155253 — thanks @vacinc.
- Deliver completed subagent results after the requester yields #155348 — thanks @jalehman, @borclaw.
- Recognize late recovered subagent handoff results without replay #155357 — thanks @romneyda, @vincentkoc, @jalehman, @borclaw, @michaeljgood71, @massad1977.
- Preserve task-notification delivery through delayed storage and protect new backup scratch files 68b724b3.
Inspect live tasks and complete command details
Task details show complete command inputs with sensitive values redacted, and distinguish live Running, Queued, waiting, and Finished execution from a saved task record. Quiet background commands can still show as running, while delayed activity no longer makes finished work look active. Finished describes execution, so success and pending result delivery remain separate facts, and unavailable activity does not by itself mean failure.
Failure notices offer concise previews with full diagnostics available through tasks show, and unreadable task metadata produces an explicit error instead of a falsely empty list. Previously truncated command inputs cannot be reconstructed, and command output remains bounded.
Sources and complete change list
Improvements
- Reduce repeated work in background-job status reads #150299 — thanks @vincentkoc.
- Avoid execution lookups for queued and finished task summaries #151585 — thanks @vincentkoc.
- Avoid task-store coordination for transient streaming events #152088.
- Skip excluded task copies in filtered JSON lists #152440.
- Reduce copying when inspecting a session's latest task #152731.
- Copy only matching records when listing an agent's tasks #150297 — thanks @vincentkoc.
Bug fixes
- Distinguish live subagents from retained task records #152514 — thanks @obviyus, @samiralibabic, @dankarization.
- Show live CLI tasks as Running or Queued #152329.
- Show complete commands and live background-process status #152333.
- Show completed tasks correctly after delayed activity #152367.
- Keep finished task execution from briefly appearing unknown #152951.
- Bound background-task failure previews without losing diagnostics #151120 — thanks @bartok9, @obviyus, @jackten.
- Report unreadable task metadata instead of empty lists #151310.
- Report unavailable task metadata and isolate affected delivery previews #152180.
- Keep media task context available during unrelated task updates #153612.
- Share concurrent task-context refreshes #153361.
- Return completed tasks despite overlapping metadata updates #153371.
- Avoid unnecessary pauses when task lists retry #153328.
- Avoid full-history scans for individual task reads #153394.
- Keep task-status reads from blocking other Gateway requests #149738.
- Keep task artifact requests from blocking the Gateway #149852.
- Keep task run lookups consistent after updates #153397.
- Keep task lists readable during completion updates #153939.
- Respect refreshed task retention during cleanup #151578.
- Keep task pages valid through unchanged background updates #154791.
- Keep task pagination usable during unrelated chat activity #155542.
Keep task tracking responsive as work changes
Task tracking, maintenance, and flow reports do less repeated storage work while preserving newer progress, deletions, delivery details, and late results. Maintenance can continue around unsettled tasks, and restored or retried workflows show their committed status even when a background worker’s reply is delayed. Large task flows can also enter a waiting state without redundant result copies exhausting the worker’s memory. Individual requests can still wait for storage, and queued events become durable only when saved.
Historical task-identifier repair belongs to Doctor before ordinary runtime use. The normal openclaw update path runs it, and supported container upgrades over retained state can run exclusive Doctor maintenance automatically during startup. Keep the matching database backups for rollback. When offline repair is required, stop writers and run openclaw doctor --fix against the same state before restarting. Ambiguous identifiers produce a warning and leave the repair unchanged, and unsafe required state still refuses startup with repair guidance.
Sources and complete change list
Improvements
- Find background tasks by run or child session without scanning history #153467.
- Combine pending task refreshes into one database read #153560.
- Batch task-list refreshes during concurrent updates #153737.
- Avoid redundant task-state reads for accepted agent events #153786.
- Move execution-tracking writes off the task startup thread #153649.
- Limit pending task-flow refreshes to selected records #153806.
- Avoid duplicate task reads in flow reports #152857.
- Move active task completion persistence off the Gateway thread #151685.
- Reduce unrelated work while waiting for selected tasks #154575.
- Reduce task-maintenance work after session updates #154657.
- Limit cached subagent status reads to the requested session #155299.
- Avoid duplicate copies of captured subagent payloads before saving #155439.
Bug fixes
- Keep task activity responsive during database contention #152655.
- Keep task maintenance responsive while updates settle #153634.
- Keep delayed workflow synchronization current through cleanup #151309.
- Move initial task persistence off the Gateway thread #151634.
- Preserve current task metadata during lifecycle callbacks #151454.
- Keep concurrent managed-task updates current and correctly ordered #151590.
- Keep restored task-flow status current #153852.
- Keep task lists available during ongoing metadata updates #153926.
- Keep task-list retries from waiting on later activity #154338.
- Keep cron job lists responsive during healthy runs #154421.
- Avoid full session scans before scheduled runs #154689.
- Avoid repeated subagent registry scans during session and task reads #154727.
- Avoid redundant copies when saving large waiting task flows #154972.
- Avoid redundant task-state writes for unchanged attempt activity #155745 — thanks @vincentkoc.
Browser and Computer Use
OpenClaw can keep apps beside your conversation, show more kinds of cloud desktops, and make the browser work easier to inspect as it happens.
Open Crabbox apps beside the conversation
Ask the agent to open an app in Crabbox and show it beside your chat, then keep working with the same machine on later turns. Attached apps need a configured Crabbox profile and a persistent conversation outside a sandbox. Attached machines skip unnecessary agent startup preparation because the agent stays on its original host and workspace. Native Linux apps also need a desktop-enabled profile and the Cloud Worker Desktop lab, while web apps open in a Portal. Files must be copied or prepared on that machine explicitly. Closing the panel leaves apps running, so save the outputs you need and stop the Crabbox when finished.
Remote Portals now use their published HTTPS addresses. Managed Tailscale Portals stay private to your tailnet even when the Gateway uses Funnel, and their separate ports need to be allowed. An optional wildcard proxy needs your own DNS, TLS, access controls, and a Gateway restart. Forwarding the Gateway alone does not expose the apps. Upgrade OpenClaw and its bundled providers together, and stop attachments before downgrading.
Sources and complete change list
Improvements
- Open Linux and web apps beside the current conversation and reuse their attached Crabbox across turns. #152094
Bug fixes
- Open remote Portal apps through their published HTTPS routes, preserving app paths, queries, and owned route cleanup. #150279 Thanks @jalehman.
- Skip unused attached-Crabbox startup and honor provisioning waits. #154321
Limits and compatibility
- Manual desktop takeover pauses agent input. Handing control back requires a fresh screenshot before input resumes, and a Portal may need reopening after a Gateway restart even when its app survives.
- Browser framing and cookie rules can still prevent an app from embedding. Portal and remote-desktop browser cookies remain separate.
- Attached machines are disposable and follow their configured lifetime. Closing a view does not release the machine or stop its background apps.
- A response timeout does not cancel machine preparation. Inspect the current state before retrying. Ordinary cloud worker turns still prepare their agent runtime.
View native macOS and Windows cloud desktops
Cloud desktops now support native macOS and Windows profiles, with Fit and Actual viewing sizes. Enable the Cloud Worker Desktop lab and a desktop-enabled profile first. Properly prepared native desktops also support computer control and Browser and Terminal launchers. Native machines start cold and do not support remote display resizing. Mac setup needs macOS 15 or newer, Chrome, an unlocked worker account, passwordless sudo, and a separately signed OpenClaw Cloud Worker app with its own Accessibility and Screen Recording permissions. Windows needs its worker-account desktop active and the Crabbox desktop launcher installed. WSL2 desktops, Windows sign-in, and secure Windows screens remain unsupported, and Mac provisioning requires existing EC2 Mac Dedicated Host capacity. Live Mac desktop validation remains incomplete.
Before downgrading to an incompatible build, stop and release affected environments and conversation attachments, and wait for confirmed teardown. This includes native Mac and Windows environments and Linux environments using the new fixed launcher arguments. Closing the viewer or suspending a worker is insufficient. Linux cloud sessions also regain resized screenshots and browser reopening; an already affected browser needs a restart or a newly provisioned worker.
Sources and complete change list
Improvements
- Provision and view native macOS and Windows cloud desktops with platform-specific authentication. #152273
- Control prepared native cloud desktops and launch their apps. ff90bc7 Also enable long Git paths in transferred Windows workspaces and keep Chat following the conversation end during combined composer and goal resizing.
Bug fixes
- Deliver resized screenshots in cloud computer sessions with the coordinate mapping needed for interaction. #151573
- Reopen Linux cloud browsers after the first launch without an inherited startup-lock timeout. #153169
Limits and compatibility
- If interrupted setup leaves uncertain evidence of a running worker without its process ID, release and reprovision the machine before another launch. Native warm-image capture remains unsupported.
Control paired desktops and enable host access
Persistent paired Mac, Windows, and Linux computers now offer desktop sharing by default, with native Mac and Tauri switches and connection status. Pairing approval and an authenticated local Screen Sharing or VNC service are still required, and the switch does not turn on that operating-system service. Explicit disables and Gateway denials remain respected. Some existing computers need approval again in Devices after updating. Tauri requires a local OpenClaw CLI, and closing it to the tray leaves sharing active.
Access to the computer running the Gateway remains a separate opt-in. An administrator can enable Host Desktop from Systems, with setup guidance for missing services and macOS permissions. Labs changes, including Systems enablement, apply without restarting the Gateway when automatic configuration reload is enabled. Turning access off closes viewers but leaves system screen-sharing services and cloud workers running. Code Mode and Tool Search changes apply to future runs, and disabling Custom plugin UI requires a browser-tab reload to clear code that already ran.
Sources and complete change list
Improvements
- Enable paired desktop sharing by default with native controls, Tauri connection status, and reapproval for affected older grants. #153359
- Offer administrator host-desktop setup in Systems with guidance for macOS Screen Sharing and Remote Management permissions. #154008
- Apply Labs and desktop settings on existing connections without a Gateway restart when automatic reload is enabled. #153975
Bug fixes
- Save Host Desktop disablement from Labs while preserving its other settings. #147741 Thanks @TriDefender and @obviyus.
Limits and compatibility
- Desktop sharing, agent Computer Control, and Keep Awake remain separate controls. macOS Remote Management accounts need Observe and Control rights.
- Turning Cloud Worker Desktop back on restores access to already capable workers. It does not provision a desktop or replace a worker that lacks one.
- Use the app switch, the node's explicit disabled setting, or a Gateway deny rule to disable paired sharing. Removing a Gateway allow entry is no longer the ongoing disable mechanism after reapproval.
Keep browser actions tied to the captured controls
Browser actions and selected-area screenshots stay tied to the controls that were captured, including pages with repeated labels or frames. If a captured control disappears, the action fails instead of choosing another matching control. Browser input keeps its click and key order, healthy tabs avoid waits on stalled siblings, and form failures explain problems such as covered or disabled controls. Exact storage keys, including surrounding spaces, are preserved.
When using an existing Chrome session, captured references now survive condition waits within the same document, and the packaged helper supports controls across cross-origin frames. Navigation still retires references from the replaced document, so take a fresh snapshot before acting again. The default helper ships with OpenClaw and no longer needs an npm download at browser startup. Native coordinate input supports left and double clicks; right or middle clicks and nonzero click delays require a managed profile. A missing target is never silently replaced with another tab.
Sources and complete change list
Bug fixes
- Preserve exact browser snapshot and screenshot targets, allow action deadlines to finish, and return useful input errors. Also preserve dialog and option values, upload timeouts, pending cookie changes, and bridge connection details. #153420
- Keep actions tied to captured controls, prevent stale captures replacing newer references, clean up frame labels, preserve sibling connections, and recheck current node access without changing the selected profile. #153597
- Preserve the order of browser-extension mouse and keyboard events within each tab. #151650
- Recover browser inspection without sequential delays from stalled sibling tabs while preserving newer connections and blocked-tab rules. #153283
- Preserve spaces in quoted browser-storage keys. #151300 Thanks @zhangguiping-xydt and @obviyus.
- Preserve browser references across waits and reject stale document controls. #154215
- Keep shortened browser upload filenames portable. #153774 Thanks @xialonglee, @masatohoshino, @Gabrielnkl, and @obviyus.
- Keep remote browser upload filenames portable and usable. #154566
- Protect newer subagent tabs from stale cleanup. #155307
Limits and compatibility
- Selected-area snapshot formatting and reference numbers can change. Custom launchers need
click_atand its required feature flag for coordinate clicks. - Blank storage keys remain invalid for writes. Previously overwritten values are not recovered.
- Custom Chrome MCP executables need the equivalent document-identity repair for the same reference behavior. Omitting
mcpCommandor setting it tonpxselects the packaged Node helper, which adds about 13 MB of unpacked runtime. - Upload filename adjustments preserve file contents and do not rename existing files. Tab closures already admitted under an earlier owner can finish without removing newer tab registrations.
See browser pages and retained computer screenshots in Chat
Browser cards can show public page titles, favicons, and social images when a live screenshot is unavailable, making closed or historical pages easier to recognize. Repeated opens of the same page share a card within an activity group, while actual tabs and distinct routes stay separate. New Browser side panels use more available space without overriding your saved width. Retained computer screenshots also appear during runs and after reopening chat, with image-viewer, copy, and download controls. Discarded pixels cannot be recovered, and some saved-image layouts can still show duplicate tiles.
Public metadata fetching follows the existing default-on automaticallyFetchFavicons setting. Turning it off disables those previews while keeping live screenshots. These requests carry no browser credentials, but destination sites and image hosts can see the requested URLs and the addresses making the requests. Computer screenshots shown as observations are not automatically sent as outgoing attachments.
Sources and complete change list
Improvements
- Add public favicons, page titles, and social images to browser cards without live screenshots. #152324
- Give new Browser side panels more available width while preserving saved widths and manual resizing. #152575
- Move browser-dashboard discovery off the Gateway thread and finish accepted events during shutdown. #151952
Bug fixes
- Consolidate repeated previews of the same browser page within an activity group while keeping tool history expandable. #152281
- Display retained computer screenshots inline during active runs and after reopening chat. #153249
- Release obsolete browser activity after its final tab owner retires, preserving activity still owned by another tab or retained dashboard. #127096
Limits and compatibility
- Public page metadata may be unavailable. Disabling automatic favicon fetching also hides cached metadata previews.
- Recovered images stored only as artifacts can still appear twice when matching saved media uses an inline layout.
Recover retained cloud sessions
Restarting with several retained cloud sessions can finish recovery sooner because independent provider checks run together within a fixed limit. A submission that has not yet started can also recover after its worker reconnects, update the worker on the same machine when needed, and retry admission once. This requires a compatible worker installer and a successful reconnect. Work already handed to a worker, including interrupted tool calls, is never replayed by that retry. Cleanup guidance now reports the latest cleanup failure, so an old session error does not hide what still needs attention.
Sources and complete change list
Bug fixes
- Reduce restart waits for multiple retained cloud sessions through bounded concurrent provider checks. #154171
- Show the current conversation-worker cleanup error with bounded, redacted diagnostics. #153869 Thanks @vincentkoc and @skorfmann.
- Resume unstarted cloud submissions after worker reconnection and a required in-place worker update. #154154
Limits and compatibility
- Checks that have already started must finish before recovery proceeds, and ownership errors still prevent adopting a session. Recovery has no fixed speedup.
- A cleanup warning does not mean the provider problem is repaired or the machine is deleted. Check the current state and follow its recovery guidance.
Set up and repair the local Chrome connection
Chrome extension setup now shares one inspect, install, and verify flow across desktop apps, the CLI, and the TUI. Use openclaw browser extension setup --action inspect or /browser-setup inspect to see what still needs attention, with install and verify actions available from the same commands. Setup preserves your selected browser profile and distinguishes installation, Chrome approval, and an authenticated connection. It runs on the computer hosting the command, including the remote host when you use SSH. A remote Gateway still needs a browser node on the computer running Chrome, and Chrome's extension installation and permission approval remain required.
After a package move breaks the extension's local helper connection, deployment owners can inspect it with openclaw browser extension repair --dry-run --json, then use repair --from /absolute/old/native-host-entry.js --json from the replacement installation to repair matching registrations. This preserves existing configuration, pairing, and unrelated installations. Windows setup requires a separately available compatible BrowserBootstrap executable, and relocation repair requires manual work there. Installing or repairing the helper does not by itself mean Chrome is connected.
Sources and complete change list
Improvements
- Unify local Chrome extension setup across desktop and terminal. #152057 Thanks @fuller-stack-dev.
Bug fixes
- Repair browser connections after package relocation. #154431
Security and trust
- Validate native browser host files through their read handles. POSIX pairing and registration inspection check the opened files they actually read, rejecting unsafe substitution before pairing credentials are created while preserving owned private hardlinks. Windows keeps its separate routing. #155833
Limits and compatibility
- Default-profile macOS and Tauri startup can prepare the local helper without opening the Chrome Web Store. Chrome approval is still a separate step. Windows automatic setup depends on a compatible
OpenClaw.BrowserBootstrap.exebeing available separately. - Repair is explicit. It does not restart Chrome, open Store pages, or create missing registrations. Incomplete inspection means retaining the reported package paths and deferring cleanup.
Plugins and Integrations
The GitHub reader keeps source discussions beside your chat, remote workspaces connect that conversation to files, Memory, and Skills on another computer, and live meeting notes let you follow a capture before it ends.
Live meeting notes
You can follow meeting notes while capture continues, with updates about every five minutes when new speech arrives and final notes when capture ends. This works with captured voice and Google Meet, Microsoft Teams, and Zoom meetings. The Meetings page refreshes automatically and keeps the complete saved transcript in its own tab, so you can move between the notes and what was said. Users with write access can also generate missing notes. Transcription can lag the conversation, and model-generated notes use your configured model, with normal usage charges and existing summary input limits.
Sources and complete change list
Improvements
- Follow meeting notes and saved speech during live capture #151957.
- Save meeting captions off-thread and drain accepted speech before final notes #151760.
- Move stored meeting transcript lookups off the Gateway main thread 135f934d.
- Move meeting-note database work off the caller thread #154070.
- Move transcript list and show queries off the caller thread; retry relevant older-date reads if the timezone changes during the read #154178.
- Move transcript export recovery hashing off the caller #154414.
Bug fixes
Finish meeting audio cleanup before rejoining
Leaving a meeting now waits for audio startup already in progress and shutdown of the resulting audio runtime before reporting success. Rejoining the same meeting waits for that cleanup, while other meetings remain independent. Failed joins stay reachable while another leave attempt is needed to finish cleanup. Audio cleanup and leaving the browser meeting are separate, and a cleanup failure can still require a retry before replacement proceeds.
Sources and complete change list
Bug fixes
- Wait for meeting audio cleanup before leaving or replacing a session #155787.
Experimental FaceTime Audio
The optional FaceTime plugin adds one-to-one audio conversations with your configured agent, including spoken answers to requests that need its tools or memory. It is experimental, disabled by default, and needs a dedicated Apple Silicon Mac running macOS 14.4 or later, OpenClaw 2026.9.6, matching signed native helpers, configured audio devices, and realtime-provider credentials. Matching plugin and native distribution availability remains unconfirmed.
Setup also requires participant consent, Developer Tools access, and manually reduced macOS SIP debugging protections. Every allowed handle has owner authority, only one managed call can run at a time, and agent-initiated calls require one-shot approval. Follow the setup guide before enabling it.
Sources and complete change list
Improvements
- Add an experimental FaceTime Audio bridge for authorized agent owners #119291 — thanks @omarshahine, @romneyda.
- Move FaceTime pending-call storage off the Gateway thread #154241.
Documentation
- Clarify experimental FaceTime setup and troubleshooting #153450 — thanks @omarshahine.
Bug fixes
MCP connector sign-in from Settings
Administrators can now sign in to eligible MCP connectors directly from Settings, approve access in the browser, and return to an Authentication saved result. This works for enabled HTTP OAuth connectors using shared native credentials when you open the Gateway through its own loopback or published Tailscale address. Other account modes keep their existing sign-in paths, and saving credentials still leaves connector reachability and tool access to be checked.
MCP tool connections and plugin replacement
New CLI-backend turns keep access to their permitted OpenClaw tools after a plugin replacement, without needing a Gateway restart. Long-running MCP calls also keep their local connection alive while awaiting a result, and Bun cleanup handles a supervisor that outlives its command. Each new turn still needs an active grant, and connection keepalives neither extend deadlines nor indicate progress.
Codex-owned MCP connections also honor configured startup and tool deadlines and explicit parallel-call hints, while native read-only parallelism keeps its own rules. Expired legacy SSE connections are replaced for later calls after a message request receives a 404; the call that discovers the expiration still fails and is not replayed.
Sources and complete change list
Bug fixes
- Keep CLI bridge tools available after plugin replacement #153673 — thanks @zhangguiping-xydt, @obviyus, @kiranvk-2011.
- Keep local MCP connections alive during long tool waits #153879 — thanks @vacinc.
- Close Bun MCP cleanup control channels correctly #153459.
- Honor MCP timeout and parallel-call settings in Codex #155490.
- Recover expired legacy SSE tool connections without replaying calls #155497 — thanks @gwjr.
ACP model choices and task tracking
ACP-connected coding agents resolve model choices against the currently connected harness, including after reconnecting, and newly spawned child work appears once in the task list. Explicit model choices fail if they are unknown or ambiguous, so an unsupported selection cannot silently become another model. Failed ACPX starts also release unused session state while preserving queued retries.
Managed ACP agents now default to at most eight Tokio workers per child, or fewer when fewer CPUs are available, while preserving an inherited worker setting. This is a worker-pool default, not a total thread or CPU limit. ACPX 0.19.1 adds startup, logging, launch-admission, and cleanup fixes; let active turns finish and restart embedding hosts to load the updated runtime. Windows queue cleanup requires every participating acpx client to be updated.
Sources and complete change list
Bug fixes
- Resolve ACP model choices against the current connected harness #152850 — thanks @saariuslystoned, @shakkernerd, @jhgaylor.
- Show each newly spawned ACP task once #153071 — thanks @obviyus, @saariuslystoned, @markgenhealth.
- Release unused ACPX state after failed session starts a3f9d754.
- Adopt ACPX lifecycle fixes and preserve migration validation #155377 — thanks @vincentkoc.
- Adopt acpx 0.19.1 runtime fixes #155760 — thanks @vincentkoc.
Improvements
- Bound default worker pools for managed ACP agents #154584 — thanks @vincentkoc.
A2A task answers
When an A2A task switches models, its completed result now contains the fallback model’s actual answer. The task no longer finishes early with only the notice that a different model will be used.
Replies also complete their original A2A task under message-tool-only settings, rather than leaving the caller polling after the answer is finished. Explicit strict settings and peer isolation still apply.
Sources and complete change list
Bug fixes
On-demand Tool Search by default
Embedded and Copilot agents now use Tool Search when its setting is omitted and higher-precedence Code Mode is inactive, discovering relevant tools as needed instead of receiving every eligible tool’s full description upfront. You can turn it off in Labs or set tools.toolSearch to false; restoring direct tool descriptions also requires Code Mode to be inactive. Extra discovery turns can cost more, particularly with a small tool catalog.
Existing explicit settings keep their meaning. true selects the legacy Node code bridge, an empty object leaves Tool Search disabled, and Code Mode takes precedence. Codex’s native tool discovery is unchanged.
Sources and complete change list
Improvements
- Enable structured Tool Search by default for embedded and Copilot runs #154068.
Code Mode defaults and executor choice
Code Mode now activates automatically for catalog-preferred models when the global setting is absent, including after an upgrade. Explicit false, an empty global object, or a global object containing only options stays off unless an agent or model override enables it. Haiku 4.5 remains available through explicit activation but is excluded from automatic selection, and native Codex Code Mode is unchanged.
The default Node executor runs with the Gateway’s operating-system privileges and is not a security sandbox. Choose quickjs through tools.codeMode.executor for an isolated guest, or disable Code Mode when trusted Node execution is inappropriate. Explicit legacy quickjs-wasi choices migrate to QuickJS; choosing an executor alone does not force activation. An unavailable selected executor fails without falling back, and neither executor resumes cells after a Gateway restart.
Code Mode now executes plain JavaScript only, while its tool discovery still provides typed documentation. This is a breaking change for existing TypeScript cells. Rewrite those cells without TypeScript-only syntax and remove both language and typecheck arguments, even when their values are "javascript" or false. Eligible startup migrations remove the old tools.codeMode.languages setting; otherwise run openclaw doctor --fix. Configuration migration does not rewrite your code.
Tool inputs and results are checked at runtime, so a later error can occur after an earlier action has already completed. Structured results also reject BigInts, cycles, and failing serializers with catchable errors; convert those values explicitly to JSON-compatible data and keep your configured output limits in mind.
Sources and complete change list
Limits and compatibility
- Move Code Mode execution to JavaScript with migration guidance #154001.
Node’s memory setting is a best-effort worker heap budget, excluding external buffers and total process memory. Its live context is not bounded by maxSnapshotBytes. QuickJS isolation does not remove access to powerful tools permitted by your tool policy.
Improvements
- Reduce Code Mode JavaScript preparation overhead #154209.
- Choose trusted Node or isolated QuickJS for Code Mode #154522.
- Enable automatic Code Mode for preferred models #155614.
Bug fixes
- Preserve Code Mode completion work and structured results, including redacted configuration results within the 12,000-character limit #151372.
- Honor MiniMax M3's automatic Code Mode preference #154664.
- Report Code Mode syntax mistakes as actionable input errors #149222 — thanks @romneyda.
Malformed JavaScript reports its syntax location before dispatching any tools. Correcting it requires a new execution request; runtime errors can still follow completed effects.
GitHub reader
The GitHub reader brings public issues, pull-request discussions, commits, and expandable diffs beside your conversation, so you can inspect a reference without leaving chat. Tabs let you keep several items open, while previews and refreshable snapshots of automated checks help you follow the work. The reader is public-only and read-only, with private content and edits staying on GitHub; check results are bounded snapshots, not a merge-readiness verdict.
Documents and previews use your configured GitHub identity to avoid unnecessary anonymous rate-limit failures. Screenshots load anonymously without cookies or credentials, supporting PNG, JPEG, GIF, and WebP files up to 2 MiB. If your installation uses a restrictive plugin allowlist, add and enable github while preserving its other entries to use the reader and previews.
Sources and complete change list
Bug fixes
- Use configured GitHub credentials for full public documents #153981.
- Display public GitHub attachments and hide reader comment metadata #153004.
- Explain GitHub preview and status failures #153181.
- Restore compact PR previews and coauthor portraits #153193.
- Preserve complete characters in shortened GitHub text #153344 — thanks @xydt-juyaohui, @obviyus.
- Resolve named-project PR links to the correct repository #151057 — thanks @brokemac79, @vyctorbrzezowski.
- Clarify GitHub authorization progress and completion #150669 — thanks @romneyda.
- Prevent malformed coauthor trailers from stalling GitHub previews #152115.
- Fix false identity-change errors in GitHub previews and details #155509.
Improvements
- Inspect head-commit PR checks and navigate reader sections, with up to 100 displayed check items and a 30-second snapshot cache #153274 — thanks Vyctor (reporter).
- Read public GitHub discussions and diffs beside chat in up to ten memory-only tabs, with bounded comment and file collections #148464.
Documentation
- Explain which computer account supplies native GitHub credentials #153754 — thanks @vincentkoc.
Publishing session work to GitHub
Publishing a session’s work accepts valid recreated branches even when their reflog has expired, while preserving published history through ancestry checks and publication conditional on the exact observed remote branch. Concurrent branch changes are rejected, and later workspace edits cannot enter an already accepted snapshot. Publication errors now distinguish another operation holding the lock from unavailable storage or cancellation, making the next step clearer. A storage failure can be retried with the original request or checkpoint; cancellation before the operation acquires its lock is not automatically retryable. Canceled Doctor inspections are reported as not performed, rather than as a health result.
Session writers can publish ordinary changes from sessions they created through the configured shared GitHub account. Membership in someone else’s session does not grant that right. Adding, editing, deleting, or renaming GitHub Actions workflow files, and publishing through a personal account, require full operator write permission. Queued requests stay tied to the original requester and accepted permission ceiling across restarts; a new invitation or later promotion cannot revive an ended grant. Results GitHub already accepted can still be recorded after a disconnect, but that does not authorize another write. Uncertain readback remains pending.
This changes shared state to schema 18, which older versions refuse to read. Stop older writers and keep a verified pre-upgrade backup that captures data still in SQLite’s write-ahead log. Check recorded or uncertain GitHub effects before freshly authorizing unfinished legacy shared requests. To downgrade, use the matching older build and backup in a separate state directory; restoring local data does not undo changes already made on GitHub.
Sources and complete change list
Bug fixes
- Publish valid recreated branches without relying on reflogs #152334.
- Improve checkpoint publication admission during database contention, with the final outcome policy supplied by the following repair #152387.
- Distinguish held publication locks, retryable storage failures, and pre-grant cancellation; replace the earlier separate retry policy and label canceled Doctor inspections as not performed #152437.
- Keep GitHub publication options responsive with large pending histories #152851.
- Preserve successful GitHub publication results after disconnects #155321 — thanks @shakkernerd.
- Keep PR and CI results with the current workspace and viewer #154750 — thanks @shakkernerd.
Security and trust
- Keep queued GitHub publication bound to its original requester #154477 — thanks @shakkernerd.
- Enforce creator and workflow permissions for shared GitHub publication #154655 — thanks @shakkernerd.
Improvements
Choosing cloud sessions from an agent
Agents can discover configured cloud profiles and request an advertised operating system and machine size when starting a separate visible worktree session. The cloud-session tool path requires a live hosted Gateway, a supported provider, and the existing placement permissions. Failed or uncertain starts retain the session for inspection without silently running locally, so inspect that state before retrying. Work already assigned remotely also avoids provisioning an unrelated local Docker sandbox.
Worker startup diagnostics and shutdown
Worker launch failures now explain rejected commands and unconfirmed cancellation more clearly. Stopping a node environment attempts the remaining cleanup even if one part fails, and replacement work waits while cleanup is unresolved. This can leave capacity occupied until the old work is confirmed stopped, rather than starting another worker over it.
Portable cloud workers now include the browser assets needed for provisioning and the SQLite executable needed for authorized shell commands, at the cost of a larger runtime download. After a Gateway restart, unstarted submissions can wait up to two minutes for retained workers to reconnect, capped by the turn timeout, with one retry and Stop still available. Work already handed off is not resent, and incompatible worker runtimes still need an update.
Cloud workers also receive the conversation history preceding the request they are handling, even if later messages arrive during preparation. Supported retries before handoff retain that starting point and save the input only once.
Sources and complete change list
Bug fixes
- Explain rejected worker launches and cancellation failures #151985.
- Complete independent node cleanup attempts despite individual failures #152896.
- Restore cloud worker provisioning with bundled browser runtime assets #154654.
- Restore shell commands in portable cloud workers #154711.
- Wait for cloud workers after Gateway restart without resending #154794.
- Keep cloud-worker history tied to its admitted request #153337.
Improvements
- Move node-host configuration reads off the caller #151411.
- Avoid repeated device scans after unrelated state writes #153567.
- Reduce CPU work when choosing node targets #151687 — thanks @vincentkoc.
- Read worker transcripts away from Gateway coordination #153335.
- Move worker inventory reads and mutations off the Gateway thread #154804.
Security and trust
- Stream Crabbox downloads into checked private staging files #154622.
Returning cloud workspace changes
Cloud workspaces can return larger rebases within increased transfer limits, and transfers work on POSIX hosts whose defaults create group-writable directories. The permission repair applies only to OpenClaw-owned directories, preserving transferred file modes and the host’s defaults. Large returns remain bounded at 500,000 before-and-after records and 768 MiB of changed content or patch data, with the existing 64 MiB per-file and 256 MiB compressed rollback limits.
Uploads retain their frozen source files until transfer settles, stop further staging writes after access is revoked, and reject redirected parent paths during staging. Update the installed node runtime to receive the node-side manifest-preparation improvement; refreshing only the session bundle is insufficient.
Applying cloud results and restoring rollback snapshots preserve exact supported filenames and file contents independently of Git attributes or checkout encodings. Canceling private preparation waits for staging cleanup to settle; the host filesystem’s filename restrictions still apply.
Sources and complete change list
Bug fixes
- Restore workspace transfers on group-writable hosts #152717.
- Return cloud workspaces after large rebases #152566.
- Stop revoked workspace uploads before further writes #154402.
- Preserve worker uploads and confine workspace staging #155101.
- Preserve supported filenames and bytes during cloud workspace recovery #155837.
Improvements
- Reduce first-use cloud workspace manifest preparation #154770.
Agent documents on paired-node workspaces
Supported host integrations can point the existing agent document editor and instruction readers at the workspace on a paired node, without maintaining a local copy. This requires an explicit workspace mapping, a compatible connected node, and separate file grants, with a 16 MiB document limit. If that workspace becomes unavailable, reads fail instead of using stale local files. Owner writes remain limited to the root AGENTS, SOUL, IDENTITY, and USER documents, and an already-dispatched write cannot be undone by disconnecting.
Files, Memory, and Skills in remote workspaces
You can send uploaded files to the computer where an agent’s workspace lives and receive its finished files back in chat, with Memory files and supported workspace Skills available on that same computer. This requires an explicitly configured host integration, current file and command grants, and matching OpenClaw versions on the Gateway and paired node. Workspace Skills can be discovered, read, watched, and have their dependencies installed there; remote Skill source installation, updates, removal, and ClawHub management remain unsupported.
Transfers default to 50 MiB per file, and uploads hold the admitted file in memory. If an enabled upload fails, the turn does not start without its file; missing or denied output files fail explicitly instead of returning stale local copies. Remove saved file.create grants before downgrading to an older version.
Sources and complete change list
Improvements
- Add service-owned binary file transfers through paired nodes #152640 — thanks @kimiyu-186.
- Deliver uploaded attachments to enabled remote workspaces #152652 — thanks @kimiyu-186.
- Use paired-node workspace attachments, Memory and Skills #154087 — thanks @kimiyu-186.
- Reduce repeated encoding in general directory listing and fetch summaries while retaining filenames and the 8,192-byte output limit #151987 — thanks @vincentkoc.
Bug fixes
- Send files generated in remote workspaces with replies #152633 — thanks @kimiyu-186.
Fleet status and registry reads
Fleet status shows whether a cell is recorded as using Docker or Podman, and ordinary registry reads see newly committed cell information. The recorded engine helps identify the configuration; it does not confirm that the engine is currently running.
Finding, installing and repairing plugins
Chat plugin cards update to Installed after installation, and agent guidance favors tools you already have before suggesting more from ClawHub. Plugin archives avoid development-only dependency failures, while incomplete npm installations name missing required dependencies and can be repaired by Doctor when eligible. Repairs deferred during an update may require another Doctor run afterward. Installation fixes also cover stale paths after moving OpenClaw, equivalent Windows directory names, and native dependency asset paths.
Administrators can install directly from a plugin’s overview and follow stage progress and elapsed time through completion. Installation accepts the plugin’s declared capabilities without granting hook or model permissions, and policy warnings still require acknowledgment. Ready new plugins enable automatically, while missing required configuration or an existing disabled choice keeps them disabled. Disabled installed plugins put Enable first. The final response determines success, and uncertain outcomes retain protection against duplicate installation.
Grouped, searchable settings bring related fields and permissions together, and Ask OpenClaw opens an editable, unsent help draft for the selected plugin. Administrators can explicitly reveal a stored literal API key for a declared field at the current configuration revision; secret references and environment values are not resolved or revealed. Damaged installations get recorded-source reinstall guidance rather than a misleading consent request, while complete plugins still require capability consent.
Sources and complete change list
Bug fixes
- Prefer current bundled plugins over stale installation paths #144843 — thanks @romneyda, @fuller-stack-dev.
- Install plugin archives without development-only dependency failures #143350 — thanks @giodl73-repo, @fuller-stack-dev.
- Reject incomplete npm plugins and repair missing required dependencies c6bb12b0 — thanks @nxmxbbd, @fuller-stack-dev.
- Preserve native dependency asset paths in staged plugins #153546 — thanks @richsomeday222, @maxwell-code07.
- Recognize equivalent Windows plugin directory aliases #151245 — thanks @romneyda.
- Refresh chat plugin cards after installation #152017 — thanks @hannesrudolph.
- Reduce unnecessary ClawHub installation suggestions #153913.
- Distinguish incomplete plugin installs from missing consent #154011 — thanks @cookywook.
- Avoid first-install configuration conflicts in legacy plugins #154539 — thanks @goutamadwant, @obviyus, @maxwell-code07.
- Add missing plugin artwork and catalog categories #154888.
- Recognize the Voice category microphone icon #155197 — thanks @patrick-erichsen.
Improvements
- Simplify plugin installation and grouped settings with explicit credential inspection 97043faf — thanks @patrick-erichsen.
- Show plugin installation progress and action-specific feedback #150235 — thanks @patrick-erichsen.
- Remove redundant plugin slot-switch notices #155249 — thanks @patrick-erichsen.
- Put Enable first for disabled installed plugins #155293 — thanks @patrick-erichsen.
Plugin loading and failed setup
Plugin loading follows the current selected copy, profile, and configuration, including valid structured secret references. A failed setup keeps its original error without repeatedly initializing the same plugin, and repeated failures no longer bury distinct diagnostics in duplicates or remove healthy sibling tools. Packaged installations also skip unnecessary source parsing during plugin startup.
Dependency warnings now recognize plugin IDs despite capitalization differences, valid stored-secret references avoid false setup errors, and malformed external schemas no longer prevent healthy plugins from loading. Invalid settings and malformed bundled schemas still fail.
Sources and complete change list
Improvements
- Skip unnecessary plugin parsing during packaged startup #153694 — thanks @vincentkoc.
- Reduce redundant configuration work when toggling plugins #152794.
Bug fixes
- Keep plugin validation and full loading separate #151927.
- Use current profile and Gateway state when loading plugins #152340.
- Use current plugin selection for extraction and web setup #152661.
- Validate authored plugin secret references alongside prepared values #152236 — thanks @jalehman.
- Clean failed plugin setup without repeated initialization #152026.
- Stop retaining duplicate plugin tool diagnostics #151897.
- Avoid false missing-plugin warnings from capitalization differences #154614.
- Contain external plugin schema failures and duplicate cleanup errors #154823.
- Validate plugin setup against authored secret references #155618 — thanks @vincentkoc.
Plugin reloads during active work
Unchanged sibling plugins keep running when another workspace’s plugin changes, object keys reorder, or duplicate notifications report the same configuration. Changes to actual values, list order, sources, or policy still trigger the required refresh.
A busy plugin reload can now refuse before stopping the serving runtime, keeping chat available while an active turn or its cleanup still needs that plugin. Active search and fetch calls retain their selected plugin files until the work actually finishes. Finish the work and retry a refused replacement; it is not queued automatically.
Reloads already waiting for active calls can restore the previous runtime when its recovery files remain intact and the replacement cannot finish, including recovery after delayed cleanup succeeds within the existing 60-second window. A retirement timeout does not mean plugin files have been deleted, and cleanup that never finishes can still need operator attention.
Replacement can also proceed when the old temporary source files have disappeared, with a warning that the previous code cannot be restored. If that replacement fails, the affected plugin remains visibly failed until a replacement succeeds.
Requests crossing reloaded plugin code also retain their context and selected plugins, so provider hooks and failure handling use the intended request settings.
Sources and complete change list
Bug fixes
- Prevent plugin reload stalls after alternate-provider turns #151588 — thanks @jalehman.
- Keep cached plugins available during model-runtime refresh #151692.
- Keep the Gateway serving when a busy plugin reload is refused #151738 — thanks @jalehman.
- Retain plugin files through active calls and shutdown cleanup #153662 — thanks @sagebhardt, @novalux12, @gorkem2020, @cjn119-ui, @zanechen76.
- Recover channels after delayed plugin cleanup #151216 — thanks @vincentkoc.
- Roll back plugin reloads blocked by active calls #151273.
- Keep unchanged plugins running when object keys reorder #151281 — thanks @romneyda.
- Keep unchanged busy plugins serving during multi-workspace reloads #154236.
- Keep plugin reloads running through unchanged configuration events 1096d5ff — thanks Peter Steinberger.
- Allow plugin replacement after temporary source loss #155065 — thanks @jey2311, @mulderp82.
- Preserve plugin request context across module reloads #155925.
Improvements
- Reuse compatible plugin metadata during configuration reloads #151011 — thanks @romneyda.
Plugin storage capacity and persistence
Growing plugin caches no longer consume a shared row quota that can block replies, execution records, or background jobs. Individual namespace, expiry, value, and blob limits still apply, but total storage can grow. Keep a verified pre-update backup if you may downgrade, because older versions restore the aggregate quota. Do not delete durable ownership records to make the data fit that older limit.
Plugin temporary storage and cleanup
Managed model-catalog temporary files can now be reclaimed after a crash while live workers retain the files they need. Model discovery reuses an already loaded plugin’s files instead of creating duplicate copies, and ordinary CLI runs release their own scratch copies when they finish.
Upgrade the host, inspect with openclaw doctor, then use openclaw doctor --fix during maintenance with no other OpenClaw producer running. On Linux and macOS, Doctor can reclaim eligible legacy captures only after a complete, fresh process check. Windows, recognized containers, and incomplete or ambiguous checks remain report-only. Live, changed, managed, foreign, and symlink-target content stays protected; age alone is not a reason to delete files, and reported sizes can overcount hardlinks.
Sources and complete change list
Bug fixes
- Clean abandoned model-catalog files and identify legacy storage #153468 — thanks @zanechen76, @navras98, @sagebhardt.
- Clean up CLI plugin scratch and recover eligible old leftovers #154324 — thanks @paluj85-cloud, @cortanapham.
- Reuse plugin copies during model discovery #155159 — thanks @mulderp82, @podulator.
Plugin execution callbacks and cleanup
Plugin-requested answer revisions wait for session history to become available, and required execution-start callbacks finish before the run continues. For plugin authors, a returned startup promise now delays startup and can fail it, so do not return unrelated background work. Worker-pool closure also waits for delayed preparation and cleanup and can report their errors. Cancel preparation waits before closing their own pool, since factories that never settle can keep closure waiting.
Plugin authors also gain awaited conversation-binding inspection and activity APIs while existing synchronous APIs remain through their deprecation window. CLI and loopback MCP completion hooks again receive isolated outcomes and approved arguments without duplicate notification; these observers are best effort and do not block the tool, and results that cannot be isolated are skipped with a warning.
Sources and complete change list
Limits and compatibility
- Wait for execution-start callbacks before continuing #150396.
- Preserve deprecated channel-message exports and their existing deadline; use openclaw/plugin-sdk/channel-outbound for new helpers #151816.
Bug fixes
- Retain worker inputs through canceled preparation and retirement #152544.
- Wait for session history before plugin-requested answer revisions #140743 — thanks @petroff, @obviyus, @rmyers64.
- Finish plugin inspection cleanup after request closure 08773da2 — thanks Peter Steinberger.
- Restore plugin completion hooks for CLI and MCP tools #155206 — thanks @iuiu-py, @obviyus, @sac916, wangzifei (commit author).
- Preserve independent plugin cleanup failures in retirement reports #154746.
Improvements
Local speech command arguments
Local speech commands preserve intentionally empty quoted arguments, preventing later options from shifting into the wrong position. Ordinary replies also skip unnecessary Markdown parsing when OpenClaw checks whether they should be spoken, without changing speech policy or synthesis limits.
Background media completion
Background image, video, and music generation can complete independently of the request that started it, avoiding a wait cycle that could trap the originating request in completion work. Managed-image metadata reads also move off the Gateway’s main thread.
Restored media-task status keeps the correct requester and current completion state. Media handling can fall back to a valid URL, and a staging failure preserves other attachments while retaining existing access and size limits.
Sources and complete change list
Bug fixes
- Keep background media completion independent of its requester #151056 — thanks @romneyda.
- Keep restored media-task ownership and duplicate status current #148583.
- Preserve media URL fallback and other staged attachments #154703.
Improvements
- Move managed-image metadata reads off the Gateway thread #150628.
Visual pages in mixed PDFs
PDF extraction keeps images of low-text or visual-only pages alongside selectable text, so a text-rich page no longer hides a neighboring diagram or scanned page. This affects extraction fallback; native Anthropic and Google PDF input is unchanged. More rendered pages can increase image-token charges, while the existing 20-page default selection, 200,000-character text cap, and shared four-million-pixel budget remain.
Sources and complete change list
Bug fixes
- Preserve visual pages in mixed-text PDF extraction #152614 — thanks @zhangguiping-xydt, @obviyus.
Logbook frame-range reads
Logbook avoids fetching unused metadata when reading a range of frames, while returning the same public results.
Sources and complete change list
Improvements
- Reduce unnecessary Logbook frame-range metadata #153162.
Work conversations in Team Reports
Team Reports adds a Work sessions directory and overview preview with links directly to current conversations. Member reports also link to conversations their members currently own. These are current work views, not a reconstruction of ownership during an older reporting period, and existing viewer permissions and exclusions for archived, incognito, automated, system, and hidden sessions still apply. Stored reports, transcripts, and full downloads are unchanged.
Workboard context and board management
Workboard loads the cards relevant to the selected work or conversation, so an unrelated damaged card no longer blocks those operations. Deleting an eligible empty board is also isolated from malformed notification subscriptions on other boards. Errors in selected cards still surface, and default or nonempty boards remain protected from deletion.
Search now finds loaded cards by full ID or a case-insensitive prefix within the current filters. Blocked cards with parents explain how to unblock them before claiming, without changing eligibility or unblocking them automatically.
Sources and complete change list
Improvements
- Load only relevant Workboard cards for context and capture #153958.
Bug fixes
Web search results and cancellation
DuckDuckGo search stops parsing additional results once it has the requested valid entries, preserving their returned text and snippets. The full response is still received and checked for bot challenges.
Brave, Exa, paid Parallel, and Perplexity Search honor the requested number of structured results, including cached replies, and Brave’s LLM-context cache keeps different requested counts separate. Local trimming does not reduce upstream billing. Canceled or timed-out xAI searches stop waiting for credentials without later sending the search, while already-owned credential refresh and cleanup may finish independently. Search results also omit impossible calendar dates without dropping or reordering the results.
Sources and complete change list
Improvements
- Avoid parsing surplus DuckDuckGo results #152344.
Bug fixes
- Honor requested web-search result limits #154420.
- Honor Brave LLM-context result limits and cache counts #154602 — thanks @ly85206559, @obviyus.
- Cancel xAI searches while they wait for credentials #154559 — thanks @obviyus.
- Omit impossible Firecrawl publication dates #155032 — thanks @qingminglong, @obviyus.
- Omit impossible publication dates from search results #155365 — thanks @ly85206559, @obviyus.
Geolocation database updates
Geolocation continues using a valid downloaded database when saving its optional cache fails, and separate Gateways stage downloads independently. Cache failures produce a warning; invalid or failed downloads still use the existing cache.
Sources and complete change list
Bug fixes
- Keep geolocation lookups working when caching fails #154569.
ClickClack discussion shutdown
Stopping or restarting ClickClack waits for accepted room creation and persistence to finish, helping those operations complete before the integration closes.
Sources and complete change list
Bug fixes
- Finish accepted ClickClack operations before shutdown #151978.
Security and Privacy
Permission checks now cover more of the moments when a chat starts, a file is read, or background work continues after its original request. These changes also make credential repair and access changes clearer for people operating OpenClaw.
Native-agent consent before sending
A native-agent chat now asks for the required confirmation before saving or running its first message. An eligible administrator can choose Continue for this chat, which grants Full Access and disables optional sandboxing for that chat, then retries the original message once while keeping an inherited model selection. Declining leaves the message unsent, although an empty chat may remain. Consent applies only to that chat and runtime, and cannot waive mandatory sandbox, workspace, or remote-execution restrictions. The native-agent permission guide explains this choice.
Native hook responses arriving after their deadline also return a timeout instead of a late success. Default Codex permission checks deny on that timeout; this does not cancel work already running on the server.
Operator commands and agent attribution
Standalone tool calls now follow an authenticated operator's agent and sandbox restrictions even when no saved session exists. Automation that relied on that exception may now be refused; callers required to use a sandbox must first create and target a recorded sandboxed session. Agent shell scripts also need to send reports through available attributed session tools or normal subagent completion, so their messages retain their agent origin. The shell marker used for this check is not authentication or isolation from other processes owned by the same user.
Command errors now distinguish an unsupported command form from a human denial and explain how to retry through the approval flow. Unsupported forms remain blocked. The approvals guide also clarifies the existing approvals get --node and approvals set --node commands, with --file or --stdin supplying a replacement policy.
Role restrictions now preserve the access they still permit, such as narrowing a write credential to read-only. Built-in tools retain their permitted default access, while explicitly supplied permission lists stay exact, including an empty list. Queued and delegated work keeps the initiating operator's permission ceiling and respects later revocation; incompatible queued inputs wait in order instead of borrowing stronger permissions.
Sources and complete change list
Security and trust
- Apply operator limits to tools invoked without stored sessions #153881 — thanks @shakkernerd.
- Preserve permitted access when roles narrow broader credentials #153978 — thanks @shakkernerd.
- Preserve operator permissions across queued and delegated work #153989 — thanks @shakkernerd.
- Preserve native caller permissions and explicit restrictions #154922 — thanks @shakkernerd.
Improvements
- Move approval persistence off the Gateway thread #154619.
Bug fixes
- Distinguish unsupported command preparation from a user-denied approval #144869 — thanks @Alix-007, @obviyus, and @cipp-ashe.
Documentation
- Correct node approval inspection and replacement examples #153716 — thanks @harshitgupta31415 and @yetval.
Limits and compatibility
- Require attributed delivery for agent shell messages #150499 — thanks @RomneyDa.
Sandboxed projects and file access
Sandboxed sessions can work on an authorized registered project with worktree: true in a private Docker or Podman checkout, with accepted changes returned to the managed worktree. Host Git credentials and ignored provisioning stay outside that checkout. Explicit read-only access remains read-only, and unsupported backends refuse this workflow. Later files created only on the host need git add before entering an existing private checkout. Let pending changes finish before downgrading, and use a supporting version to recover unfinished work, as described in managed project workspaces.
File patches also recheck permission before changing files, and operator logs explain which workspace restriction rejected a patch without relaxing required roots. Automatic cleanup now follows each sandbox owner's retention settings, so one agent's shorter retention window does not prematurely remove another's working environment.
Sessions that require a sandbox now reject host-only native forks before creating the new conversation. If permissions change during creation, initialization stops and cleanup removes only the unfinished work still owned by that operation. Plugin authors should adopt sessionForkV2 and its checks immediately before native changes. The older sessionFork remains source-compatible through October 12, 2026, but does not gain those final checks.
Sources and complete change list
Improvements
- Work on managed projects inside private Docker and Podman sandboxes #152641.
- Explain the workspace restriction behind rejected patches #136126 — thanks @Marvinthebored, @Peetiegonzalez, @shakkernerd, @Haderach-Ram, and @BottaniCals.
Security and trust
- Correct literal-tilde and same-file alias patches, recheck file permissions before mutation, reject OpenShell local access failures before remote creation, and stream ONNX verification within a memory bound #154201.
- Keep temporary filename overrides within their directory #154828.
- Enforce sandbox requirements before native session forks #155358 — thanks @shakkernerd.
Bug fixes
Credential repair and background command access
Saving settings that display hidden secrets now preserves their real values, and OpenClaw rejects known redaction placeholders as credentials. If a stored Gateway token was already replaced by a placeholder, install this fix and run openclaw doctor --fix or openclaw doctor --generate-gateway-token. Doctor verifies a backup before repairing the token; then restart the Gateway and reconnect or re-pair devices with the replacement. Other corrupted secrets need a real replacement at their source.
Background commands using the optional secret proxy on the Gateway host now keep HTTPS access after the originating turn ends. Each command retains its original secrets and allowed destinations until it stops. After changing credentials or bindings, stop older commands to revoke their access immediately and start a new run and command to use the changes. Exit, cancellation, timeout, and Gateway shutdown also revoke access. This proxy does not cover sandbox, remote-node, or provider-native shell execution.
Chat media and reset permissions
Chat images, documents, and trusted audio now retain the requesting sender's file restrictions throughout preparation. Pending reads and copies stop when access is revoked, the workspace or execution location changes, or the turn is canceled, and rejected preparation removes its newly staged files. Already-produced text remains available, while previously retained attachments keep their existing retention rules. These boundaries are covered in the Control UI security model.
In Discord, /new and /reset in unbound channels now respect channel disablement, allowlists, group policy, and server command authorization before changing a session. Previously bypassed commands may now be refused, while existing configured-binding recovery exceptions remain available.
Account identity and Visitor Access
Cloudflare Access OIDC sign-in can reuse an existing OpenClaw profile, role, and history when the verified email matches a linked alias. Cloudflare admission and identity-provider email verification remain required; an unmatched email gets a separate profile with the configured default role. Tailscale profile-picture adoption also moves its database work off the main Gateway thread while preserving a picture you have explicitly chosen.
Administrators can also opt into verified GitHub credit through OIDC by configuring the trusted issuer, provider, and account-ID claim. This adds coauthor credit without changing roles or the account used to publish. Conflicting identities need an explicit users.linkEmail action; missing configuration stays email-only, and malformed trusted claims are rejected.
For the private, source-built Team plugin's Visitor Access feature, invitation expiry or revocation now closes dependent Gateway connections and cancels affected active and queued work. Saved results and independent staff access remain available. Operators must apply the restricted Guest role's accessPolicyPlugin: "visitor-access" binding as the final setup step; unavailable policy denies access, and older Gateways reject this field. Keep the binding and restrictions during recovery. The plugin remains excluded from ordinary npm packages. Failed Cloudflare policy cleanup still retries at startup or hourly and may leave provider access active until it succeeds, but it no longer extends the dependent local work. Cloudflare login sessions are not separately revoked, and an invitation issued after expiry requires fresh admission.
Sources and complete change list
Bug fixes
- Reuse matching profiles for Cloudflare OIDC sign-ins #153556.
Improvements
- Save adopted Tailscale avatars in a worker without overwriting explicit choices, including an explicitly empty image #152670.
- Enable verified GitHub credit for trusted OIDC sign-ins #153940 — thanks @shakkernerd.
Security and trust
- Retry failed Visitor Access revocations #153878 — thanks @shakkernerd.
- Revoke previous role access even when result delivery fails e0193fa.
- Validate Visitor Access permissions and guard invitation writes #153987 — thanks @shakkernerd.
- End visitor connections and work when invitations end #154461 — thanks @shakkernerd.
Session isolation
Switching session stores now stops delayed child-agent activity from bringing the old store's context into a new conversation. Changing stores does not migrate conversations, and suspended child-result delivery needs explicit recovery even if you later select the old store again. Completed task results remain available; old watches whose store ownership is unknown need fresh registration. Separately, creating an incognito session with an explicit key checks for a collision without scanning unrelated durable history, while preserving existing isolation and authorization rules.
Pending session previews and local tool inventories now recheck access and the exact conversation before returning content, while queued plugin context stays with its selected conversation across resets and conflicting names. Recovery continuations also check permission on their destination conversation. An ordinary disconnect does not cancel admitted work, but revoking its original permission can.
Sources and complete change list
Security and trust
- Keep child notifications and context in their original session store #152828.
- Recheck access before returning session previews and inventories #154336 — thanks @shakkernerd.
- Authorize recovery continuations for their destination session #155364 — thanks @shakkernerd.
Improvements
- Use exact-key checks for requested incognito sessions #152617.
Bug fixes
- Keep queued plugin context with its selected conversation #155714.
Redaction and audit processing
Secret masking avoids repeated scans of unchanged tool results and skips AWS credential checks that cannot match, while changes to output or redaction policy still trigger fresh checks. Transcript saving keeps its separate sanitization. Queued audit history writes and retention cleanup also move off the main Gateway thread. Audit collection remains best effort, so queue saturation, storage failures, or shutdown deadlines can still drop waiting metadata.
Secrets audits now reject symlinked generated models.json files and keep malformed file contents out of error messages. These checks are read-only and limited to 5 MiB per generated model file; ordinary hardlinks and parent-directory aliases remain supported.
Sources and complete change list
Improvements
- Skip impossible AWS credential matches during redaction without changing masking coverage #152484.
- Reuse sanitized tool results without skipping changes to output or policy #151638.
- Reduce repeated secret-masking work in logs and transcripts #154389.
Bug fixes
- Move queued audit writes and cleanup off the Gateway thread #152745.
Security and trust
- Reject symlinked secrets-audit files and content-bearing parse errors #155683.
Approve edited automations again before they run
Substantively editing an automation now retires its previous Always allow approval, even if you later restore the old contents. Pausing and resuming an otherwise unchanged automation keeps its approval. Older grants without this binding need one fresh approval after upgrading, so unattended jobs may wait for you to approve their next matching operation. Standing automation approvals remain tied to the work you approved. Older binaries cannot enforce the new binding, and edits made by an older version without any observable record cannot be reconstructed after upgrading again.
Sources and complete change list
Security and trust
- Require fresh automation approval after edited definitions are restored 73f058a — thanks @jacobtomlinson.
Recognize explicitly linked administrators in channels
An administrator can explicitly link a stable channel account to an existing person with users.linkChannelIdentity, then inspect or remove links with users.listChannelIdentities and users.unlinkChannelIdentity. Linked people who already have effective administrator access can use owner-only channel commands without duplicate owner lists. Display names and session identity links do not establish this connection, and channel restrictions still apply. Links do not expand conversation visibility or give a group the administrator's authority. Demotion, unlinking, reassignment, or revocation blocks pending privileged actions; a replacement grant cannot revive the original request.
Sources and complete change list
Improvements
- Recognize explicitly linked Team administrators in channels #153508.
Use your own conversations with session-only access
Administrators can grant operator.sessions.read and operator.sessions.write for conversation work without granting general settings, secrets, or administration access. A verified person with session-write access can create their own conversations using valid saved defaults or Gateway model and account selection, and Stop stays tied to the original run and caller. Shared read access does not grant permission to change someone else's conversation. Explicit personal-account selection and changing defaults still require broader write access, and these permissions are not a boundary around just one session.
Guests can also see and answer ordinary questions from their own authorized runs, including recovering pending questions after reconnecting. Joining someone else's conversation does not reveal their questions. Secret, administrative, and sessionless prompts remain privileged, answers add no permissions, and a new grant cannot take over a question whose original authority was revoked.
Sources and complete change list
Improvements
- Add opt-in session-only operator permission values #154392 — thanks @shakkernerd.
Security and trust
- Keep session access and Stop tied to the original caller #154991 — thanks @vincentkoc.
- Preserve question requester authority through delayed answers and shutdown #155335 — thanks @vincentkoc and @shakkernerd.
Bug fixes
Keep local model relays direct under managed proxy routing
The default gateway-only managed proxy mode now keeps localhost and literal loopback connections direct, fixing WebChat and Codex failures when their local model relay was sent through an external proxy. External destinations and non-loopback private, LAN, and tailnet traffic still use the proxy, while explicit proxy and block modes and application network-access checks retain their restrictions. Doctor now explains failed local connectivity; restrictive configurations may need gateway-only restored and a Gateway restart.
Sources and complete change list
Bug fixes
- Keep local WebChat and Codex calls direct under managed proxy routing #154013 — thanks @eefreenyc.
Quality-of-Life Improvements
Everyday work gets clearer progress and less repeated preparation around tools, replies, and stored conversations.
Following through on instructions
Shared agent instructions more explicitly connect your corrections and an agent's promise to check something with continuing the authorized work. They also tell an agent receiving delegated results to address fixable failed checks before stopping, while preserving approval requirements, pauses, and cancellations. These are guidance changes, so individual model behavior can still vary.
Workspace files and prompt inclusion
Configuration help now explains that skipBootstrap controls creating workspace files, while existing files can still enter the prompt. The workspace settings reference clarifies the existing contextInjection choices for the embedded runtime, including never. Those choices do not control ordinary CLI-backed prompt preparation or prevent an agent from reading files with tools.
Sources and complete change list
Documentation
- Clarify workspace-file creation and existing prompt-injection controls #118755 — @camerono
Progress and tool outcomes
Progress and conversation history suppress repetitive checks while keeping useful updates and distinct failed, blocked, completed, or unknown tool outcomes recognizable. Your channel's visibility settings still apply, so Telegram quiet mode can hide intermediate tool failures unless tool progress is enabled.
Sources and complete change list
Improvements
- Quiet repetitive polling and show accurate tool outcomes #151456 — @obviyus
Command help and read-only listings
Help and read-only commands for hooks, nodes, sandboxes, and worktrees load less unused code. JSON agent and session listings also avoid repeated lookups or terminal-only display preparation while preserving their output.
Sources and complete change list
Improvements
- Batch creation-history lookups for JSON agent lists #151471
- Defer installer loading for read-only hook reports #152433
- Defer unused hosting code in node commands #152448
- Defer unused sandbox command loading #152688
- Load worktree operations only when needed #152730
- Reduce presentation work in JSON session listings #152109
- Keep node help independent of Gateway request code #154765
Limits and compatibility
Reduced loading does not make every command faster. Sandbox explain was slower in recorded comparisons, and worktree cleanup has no established speed improvement.
Terminal input and rendering
Remote terminal typing and paste require less preparation, while tool-output redraws and scrollback reading avoid repeated work. On macOS and Linux, a terminal launched through Bun can also find a real Node installation when a shim hides it, keeping input and cursor keys working. A real Node installation is still required.
Sources and complete change list
Improvements
- Reduce remote terminal input and paste processing #151982
- Reuse prepared tool output during terminal activity updates #152008
- Reduce temporary allocations when reading terminal scrollback #152007
- Reduce redraw work for tool output without right-to-left text #152867
Bug fixes
- Keep Bun-launched terminals interactive when Node is shadowed #151750
Limits and compatibility
Rendering measurements vary by content, with some right-to-left text and link cases taking longer. These changes do not establish a uniform terminal speed or memory improvement.
Tool previews and unknown-tool feedback
Compact tool previews omit extreme array nesting instead of overflowing the formatter, without changing the original arguments used to run the tool. Plugin authors using the display metadata helper should expect values beyond 64 array levels to be omitted and a possible undefined result. Suggestions after an unknown-tool request also avoid repeated lookup preparation.
Sources and complete change list
Improvements
- Reduce repeated work when suggesting alternatives to unknown tools #152345
Limits and compatibility
- Bound deeply nested arrays in compact tool previews #152923 — @wangmiao0668000666, @obviyus, @hpyhandsome; name-only coauthor nebulacoder-v8.0
The display helper is intentionally lossy and is not a general limit on argument traversal. Keep the original arguments for validation and execution.
Preparing tool context
When messaging tools offer only sending and broadcasting, their definitions take up less model context while keeping supported options. Automation descriptions also remove repeated argument lists, and large tool outputs reuse valid text counts during context checks and trimming. Context limits and trimming rules stay the same.
Preparing agent and media requests
Agent requests skip unused diagnostics when debug logging is off, and media progress sections share a fresh task read within each turn. Large-request diagnostics and shell setup also avoid some repeated preparation before execution; these changes concern local setup work rather than media generation speed.
Sources and complete change list
Improvements
- Skip unused agent setup diagnostics #150361 — @vincentkoc
- Reduce repeated allocation when measuring large model payloads #153821
- Share fresh task reads across media prompt sections #153656
- Launch shell snapshot helpers through the spawn broker #151711
Limits and compatibility
Small diagnostic inputs can cost slightly more to process. Shell preparation retains its capture deadline, cleanup, authorization checks, and native fallback.
Processing long streamed replies
OpenClaw avoids some repeated local cleanup and rendering while receiving long replies containing comparison text or final-answer tags. The benefit depends on the reply, and the final-answer path can use more peak memory while reducing repeated processing.
Further changes skip unnecessary scans in bracket-heavy prose, cleanup in final-tagged answers, and diagnostic checks that cannot yet emit an update.
Sources and complete change list
Improvements
Reusing database workers and connections
Repeated conversation and state reads reuse eligible database connections and workers instead of repeatedly opening them. Healthy reusable resources can stay available for 30 idle minutes, reducing setup during intermittent activity while reads continue to see current data. Larger active installations can consequently retain more memory and open file handles during that window.
Node workers can now reclaim unused heap after completed operations while remaining available for reuse. Automatic retirement of idle workers under critical memory pressure requires diagnostics to stay enabled; idle garbage collection works independently and skips Bun. Applicable workers also request a 512 MiB old-generation heap cap, which can constrain large active operations.
Sources and complete change list
Improvements
- Reuse idle SQLite connections for repeated state operations #153601
- Reuse host verification when native workers open databases #153581
- Retain healthy shared-state workers across short idle periods #152341
- Reuse prepared queries in retained session readers #152610
- Skip redundant maintenance planning after warm writes #152621
- Reuse bounded Node workers for fresh state reads #151929
- Offload cached snapshot ownership bookkeeping #153112
- Reclaim unused memory from idle database workers #154408
Limits and compatibility
Incognito connections require explicit disposal because they hold the only copy of their data. Bun keeps separate worker lifetimes, unhealthy workers can retire earlier, and maintenance still runs when resources are cold, expired, or under capacity pressure. Stored-data retention rules are unchanged.
An explicit process-wide --max-old-space-size overrides the effective worker heap cap. Native allocations and transferred buffers are outside that cap. Suppressing diagnostic event recording or throttling logs preserves pressure notifications, while disabling diagnostics stops automatic pressure retirement.
Serving other work during database activity
Bursts of conversation writes leave more opportunities for other work to proceed, and saving large replies or tool results shortens the time other writers can be held up. Small requests arriving during startup or reconnect can wait up to 10 seconds for capacity instead of failing immediately, while memory and oversized-request limits still apply. Lookups through large task and conversation histories also inspect fewer unrelated records.
Selected identity, profile, command-authorization, pairing, and conversation-membership operations now move database work off the request thread, and prepared conversations can resume without waiting for unrelated writers. Pairing has an important cancellation limit while a pairing change is pending. A local abort or timeout may leave remote work running, so it is not confirmation that the remote operation stopped.
Settings saves can now refresh configuration health asynchronously while keeping late or canceled refreshes from overwriting newer settings or environment values.
Sources and complete change list
Improvements
- Shorten database writer holds when saving large replies and tool results #153818 — @todddickerson
- Reduce database work for large task and session histories #153548
- Move selected device identity reads into the shared worker 1fab25b
- Move device-pairing database work off the request thread #154671
- Reduce repeated session-membership work across viewers #155620
- Refresh configuration health asynchronously after settings writes #155344
Bug fixes
- Reduce I/O stalls during concurrent agent database writes #151909
- Wait briefly for SQLite capacity during request bursts #153437
- Reduce Gateway stalls during profile and command-authorization checks #154244
- Restore prepared sessions without unrelated writer waits #155684
Limits and compatibility
New indexes install automatically when databases open for writing and require construction time, temporary disk space, and additional work on future writes. Large-message preparation can still be synchronous, and sustained overload can still fail when the waiting deadline expires.
New or incomplete sessions still await required metadata writes. Small pairing lookups can add worker overhead, and onboarding join-code storage and other synchronous operations remain outside these changes.
Publishing live session updates
Live conversation updates avoid preparing duplicate message data that would be replaced before delivery. Each recipient still receives the version allowed by their permissions, with the existing per-client preparation intact.
Home awareness of new sessions
Creating an eligible session now queues a notice for its agent's Home conversation, including the session key and available title, creator, and creation source without copying messages. This is enabled by default, and you can opt out with session.notifyOnCreate: false in session settings. Home receives the notice on its next turn or scheduled heartbeat, without an immediate wake-up or ongoing monitoring of that conversation.
Drafts, incognito sessions, hidden internal sessions, scheduled cron runs, and Home itself are excluded. Reopening or resetting an existing session does not send another notice, and pending notices do not survive a restart.
Illustrations in older release documentation
The 2026.9.1 release guide gains interface illustrations and labeled conceptual examples to explain that older release. The figures document existing capabilities, with fictional and conceptual examples identified as such.
Sources and complete change list
Documentation
- Illustrate the historical 2026.9.1 release guide #152988
Other Bug Fixes
These fixes address interrupted work, misleading command failures, and database waits that could get in the way of everyday use.
Canceling work and finishing cleanup
Stopping a chat turn now interrupts optional idle waits and affected cleanup reads that were waiting on a stalled history rebuild. Required saves and cleanup still run, saved answers and attachment references remain intact, and an interrupted delivery check stays pending until its outcome is known. Completions canceled during connection setup now stop before contacting the provider, and PDF or image-analysis fallbacks also stop if their prepared resources are no longer valid. Requests already sent retain their existing cancellation limits.
Manually canceled background commands no longer trigger an unwanted follow-up reply just because they produced some output. Their logs remain available through process poll and process log, and cleanup failures still notify. Confirmed process cleanup is retained accurately, while an unconfirmed stop remains uncertain. Process cleanup also recognizes an exit confirmed at the existing deadline. Database cleanup at process exit makes one automatic attempt, leaving failures for explicit recovery instead of repeatedly retrying and flooding logs.
Sources and complete change list
Bug fixes
- Interrupt optional cleanup waits when an agent turn is canceled #149755. Thanks @romneyda.
- Avoid unsolicited replies after canceling background commands #153795. Thanks @vacinc.
- Authorize local shared-credential session cancellation for implicit-scope CLI calls, retaining explicit scope restrictions and remote authorization #153332. Thanks @vacinc.
- Let canceled chat turns finish cleanup during history rebuilds while preserving saved answers and pending delivery #153778. Thanks @vincentkoc.
- Preserve confirmed process cleanup after cancellation without treating canceled commands as successful execution #152107.
- Prevent canceled worker exchanges from hanging shutdown while retaining resources until cleanup and worker exit #152994.
- Stop repeated failed SQLite cleanup at process exit #154720.
- Confirm process-group exit at the cleanup deadline #154756.
- Stop cancelled completions before provider dispatch #155819. Thanks @shakkernerd.
Terminals waiting for an unresponsive node
A terminal on a paired node now reports a timeout and removes its local terminal session after the existing 30-second inactivity limit, even if the node never sends its first heartbeat. Each heartbeat renews that limit. OpenClaw requests cancellation once, but the local timeout does not confirm that the remote process has stopped.
Sources and complete change list
Bug fixes
- Close node terminals that never send a heartbeat #154769.
Invocations with a finite timeout retain their existing approval-waiting behavior. Unbounded calls without an inactivity limit remain unbounded.
Command results and edit input
Commands that stop reading their input early now return their actual exit status and error output, avoiding misleading broken-pipe failures. File edits also recover from limited newline and backslash encoding mistakes in replacement lists sent as strings, while preserving the intended literal text. Incomplete lists and malformed outer requests still fail validation without applying a partial edit.
Failed command launches preserve the original operating-system error, and valid JavaScript using dollar-prefixed names or dollar text now reaches Node without being mistaken for shell syntax. Node reports its own errors, and statements before a runtime error may already have run. An identical replacement repeated across batch and legacy edit arguments is applied once, while genuine duplicates within a batch and conflicting edits still fail without writing.
Sources and complete change list
Bug fixes
- Preserve command results when children close input early, while keeping input-admission rejection and other input faults as failures #153644. Thanks @stackingrockss.
- Recover limited string-encoding mistakes in edit replacement lists without changing valid literal text or whole-set validation #153692. Thanks @wangmiao0668000666, @obviyus, and @aniruddhaadak80.
- Preserve native command launch errors and finish cleanup f62d295. Thanks Peter Steinberger.
- Allow valid JavaScript scripts through exec #154447. Thanks @jesse-merhi and @nikolasdehor.
- Avoid duplicate replacements introduced by legacy edit arguments #155513. Thanks @mfurkanakinci, @obviyus, and @aniruddhaadak80.
Python source checks, command approvals, restrictions on ambiguous interpreter commands, and sandbox routing remain in place.
Database activity and session reads
Optional archive cleanup now waits for a later opportunity when the database is busy, instead of holding up OpenClaw. Work already accepted can finish before a database worker closes, and saving device tokens or task information avoids additional waits on the main process. State directories reached through filesystem aliases, such as macOS /var and /private/var, also avoid a timeout caused by treating those paths as different locations. Fully received results survive cleanup failures, while writes with an unknown outcome are not automatically repeated. Database requests also avoid being refused prematurely just because a busy Gateway has not yet made its access decision.
Sources and complete change list
Bug fixes
- Avoid archive-cleanup lock stalls and preserve known subagent completion outcomes through transient save failures in the live process #151594. Thanks @laurenceputra.
- Drain accepted database work before retiring shared workers and allow fresh calls after cleanup, retaining failed cleanup for explicit retry #152873.
- Tolerate changes limited to
lastReadAtin prepared session metadata and model-catalog reads #152827. - Prevent worker write timeouts through state-directory aliases, including macOS
/varand/private/var, while retaining write authorization #152190. - Avoid host-thread database waits during asynchronous state operations and retain completely received outcomes through cleanup failures #152377.
- Prevent premature database refusals when the Gateway is busy #154682. Thanks @vincentkoc.
Intact shortened diagnostics
Shortened update Doctor warnings and Skill Workshop error records avoid leaving half of an emoji at the cutoff. An affected emoji is omitted whole, so shortening the message does not introduce a broken-character symbol.
Sources and complete change list
Bug fixes
- Preserve valid Unicode surrogate pairs when shortening update warnings and Skill Workshop errors, without changing the existing text limits #150837. Thanks @xialonglee.
Command validation and diagnostics
Commands give more useful feedback for invalid agent selections and empty node invocation keys, and plugin and skill listings preserve version labels without adding duplicate prefixes. If a request times out or loses its connection after being sent, the message now advises checking its current state before retrying, because the operation may already have completed.
Sources and complete change list
Bug fixes
- Display plugin and skill version labels without duplicate prefixes #145975
- Explain uncertain outcomes after Gateway request timeouts #153370 — @liuwqgit, @obviyus, @deregtx
- Remove C1 control characters from agent console diagnostics #149075 — @vincentkoc
- Report empty node invocation keys before Gateway lookup #145032 — @wangmiao0668000666, @obviyus
- Warn about unknown outcomes after dispatched Gateway calls disconnect #154282. Thanks @masatohoshino and @obviyus.
Limits and compatibility
- Reject invalid agent selectors before routing #153387
Strict callers must supply a valid agent selector or omit it. Deprecated SDK aliases retain their blank-as-omitted behavior through the documented November 29, 2026 compatibility window. A timeout alone establishes neither success nor failure.
Returning to the intended terminal conversation
The terminal interface restores your remembered conversation even when newer conversations have similar names, and can show its model details without relying on a short search-results list. After reconnecting, old connection responses can no longer replace the current details. Existing agent scope and hidden-conversation rules still apply. Opening or attaching to a conversation now uses the agent identified by the Gateway, including when an older link names a different agent. Replies and side-question results from other agents are rejected, with existing attachment permissions unchanged.
Portable terminal upload names
When a long terminal-upload filename needs shortening, the resulting name still follows the portable rules for reserved names and trailing characters. This applies to newly staged uploads and leaves existing filenames alone.
Sources and complete change list
Bug fixes
- Preserve portable terminal-upload names after truncation #153023 — @goutamadwant, @gabrielnkl, @obviyus
Recognizing valid temporary directories
Temporary-directory checks no longer reject valid filesystem identifiers just because they use signed numbers. The shared filesystem dependency carries the fix into OpenClaw and components that use it directly.
Sources and complete change list
Bug fixes
- Accept valid temporary-directory identities through fs-safe repair #155771. Thanks @vincentkoc.
Maintainer and Internal Changes
This release includes 1175 maintainer and internal changes covering tests, development tools and implementation upkeep. The topics below keep the full change list and contributor credits available for people working on OpenClaw.
Coding-agent and provider tests
Coding-agent and provider tests use more controlled startup, clocks and cleanup, helping failures point to the behavior under test. Shared fixtures retain coverage for model selection, streamed responses and credential preparation.
Sources and complete change list
Improvements
- Avoid redundant plugin discovery in ACP tests #153234.
- Reuse database workers between isolated Codex test cases #153539.
- Reduce Codex schema and prompt test overhead #153428.
- Remove test-only command-secret injection #151052.
- Share isolated model-selection test fixtures #151820.
- Share ACP session configuration test fixtures #153866.
- Simplify provider-usage fetch assertions #137609.
- Consolidate OpenAI speech-speed test fixtures #151844.
- Share native-hook permission test inputs #151908.
- Share CLI-output test fixtures #151954.
- Reuse completion-stream chunk fixtures #152773.
- Share Responses stream test inputs #152818.
- Share repeated Anthropic transport test inputs #153056.
- Share repeated OpenRouter Fusion test configuration #153098.
- Share video-provider test fixtures #153658.
- Avoid plugin discovery in OpenRouter cache tests #154183.
- Reduce Foundry cache-eviction test time #154223.
- Reduce status model test setup overhead #154267.
- Remove fixed waits from model-refresh regression tests #154270.
- Seed test credentials without native plugin loading #152058.
- Share ACP CLI mock-call assertions #137740.
- Test timeout selection through its production resolver #147961.
- Reuse provider test workers with restorable fetch mocks #154290.
- Isolate ordinary Codex test files within worker budgets #154319.
- Consolidate image-generation result fixtures #154438.
- Verify Vertex endpoint eligibility in Anthropic tests #154479.
- Remove real-time waits from llama.cpp reload tests #154536.
- Consolidate web-search configuration tests #154709.
- Share bundled web-search manifest fixtures #154732.
- Remove wall-clock waits from Codex unsubscribe tests #154752.
- Restore Firecrawl scrape truncation tests #154820.
- Avoid unnecessary retries in native Codex finalizer tests #155008.
- Consolidate execution-target policy tests #155060.
- Share request fixtures in Codex dynamic-tool tests #155776.
Bug fixes
- Restore installed-package Code Mode validation #153442.
- Align Code Mode mock calls with JavaScript-only arguments f5aeb9e3. Thanks Peter Steinberger.
- Test late Codex output without assuming exit order #153210.
- Restore Codex conversation-binding live-test coverage #153610.
- Stabilize native Codex recovery cancellation fixtures #153642.
- Stabilize Codex subprocess tests under runner load #153648.
- Register missing Codex native-configuration tests #151344.
- Restore Codex attempt-suite test ownership #151349.
- Repair model-runtime regression setup #153480.
- Keep quota test observers armed during prewarm #152090.
- Isolate recovery tests from background session discovery #152214.
- Bind web-search test fixtures before imports #152380.
- Control renewal timing in catalog recovery tests #151856. Thanks @vincentkoc.
- Avoid early-cleanup hangs in side-question tests #152009.
- Synchronize Codex side-question cleanup tests #152030.
- Join plugin retirement during Codex test teardown #152615.
- Isolate quota tests and correct response expectations #152752.
- Make external-credential refresh tests deterministic #152771.
- Correct long-workspace account-history fixtures #152798.
- Keep simulated grace time fixed in Codex settlement tests #152966.
- Cover fractional clocks in catalog refresh tests #154152.
- Stabilize Codex rollout preview regression timing #154260.
- Stabilize embeddings HTTP test cleanup 75803008. Thanks Peter Steinberger.
- Control admission timing in native-process authority tests 9247701e. Thanks Peter Steinberger.
- Control OpenAI output retry test timing and cleanup aa099e49. Thanks Peter Steinberger.
- Control model-catalog freshness test renewal b485dd0b. Thanks Peter Steinberger.
- Keep ACPX test prompts active through control assertions b8d642df. Thanks Peter Steinberger.
- Align auth QA with shortened session errors #153946. Thanks @RomneyDa.
- Serialize requests in the ACPX Codex fixture #154383.
- Wait for sibling cleanup in spawn authority tests #154435.
- Stabilize Codex one-shot cleanup tests during cold startup #154683.
- Isolate Bedrock embedding constructor mocks #154722.
- Stabilize Codex process-readiness fixture timing #154742.
- Join revoked collector cleanup in spawn tests #154783.
- Wait for Codex turn readiness before test cancellation #155140. Thanks @Patrick-Erichsen.
- Test model readiness without wall-clock thresholds #155274.
- Isolate Goal mocks from provider authentication tests #155502. Thanks @shakkernerd.
- Synchronize Codex attempt fixtures with readiness and cleanup #155555. Thanks @vincentkoc.
- Stabilize Codex startup retry tests #155612. Thanks @jalehman.
- Synchronize QuickJS worker contention tests #155624.
- Stabilize Code Mode queue-fairness testing #155660.
- Make native Codex output-fidelity tests portable to restricted Linux hosts #156132.
Database fixture isolation and cleanup
Database tests finish pending work and close their readers before removing temporary files. Suites also reuse prepared databases where appropriate while clearing each case's state.
Sources and complete change list
Improvements
- Reduce redundant transcript work in retention-test setup #152781.
- Reduce worker setup in serial Workboard tests #151668.
- Remove duplicate database-reader cleanup mapping #154266.
- Isolate metadata retention heap scans #152063.
- Reduce serial Workboard test overhead #153904.
- Reuse Doctor plugin-repair test databases #153920.
- Reuse configuration write and recovery test preparation #153927.
- Reuse prepared Gateway test databases #153948.
- Avoid worker startup in serial Workboard tests #154086.
- Reduce serial Workboard test startup overhead #154103.
- Reduce Gateway database fixture overhead #154127.
- Reduce session-read test setup work #154238.
- Focus outbound migration tests on maintenance cleanup #154123.
- Reuse snapshot workers within Doctor SQLite test cases #153929.
- Share synchronization in Doctor maintenance-lock tests #154379.
- Add failure context to session cleanup tests #154905. Thanks @vincentkoc.
- Cover overlapping settlement in session-history WAL recovery #155009.
- Use native assertions for complete memory database buffers #155013.
- Reuse isolated operator-approval test storage #155434.
- Reuse storage fixtures for ordinary model-admission tests #155529.
- Reuse physical SQLite fixtures for session PR-access tests #155626.
Bug fixes
- Isolate agent maintenance fixtures from channel discovery #153665.
- Initialize worker-test SQLite fixtures through the runtime opener #151283.
- Close retained agent readers between test files #153749.
- Drain transcript-test databases before fixture removal #153534.
- Drain heartbeat fixture state before deleting temporary files #153591.
- Await shared-state cleanup before removing harness test files #153663. Thanks @vincentkoc.
- Close auth database readers during scoped test cleanup #151676.
- Finish test cleanup for configured session databases #151719.
- Separate database fixture cleanup from test observations #153479.
- Wait for retained Gateway work before test-store cleanup #151550.
- Recognize completed aborts in SQLite lifecycle validation #151601.
- Wait for persisted recall in citation tests #153305.
- Isolate SQLite cleanup between test files #153345.
- Isolate session retention tests from provider discovery #152785.
- Discard rejected pending writers during test cleanup #152826.
- Finish speech fixture cleanup before database closure #153064. Thanks @shakkernerd.
- Prevent archive tests from leaking filesystem mode #154138.
- Retire shared database read pools between test files #154206. Thanks @fuller-stack-dev.
- Extend shared database reader cleanup regressions #154214.
- Finish SQLite cleanup before replacing ClickClack fixtures #152061.
- Close task test workers before fixture removal #154083.
- Close session fixture identity databases before removal #151877.
- Discover installed Homebrew Python for archive fixtures #152676.
- Wait for cron cleanup ownership in test teardown #152595.
- Await database cleanup in trajectory export tests #152673.
- Finish music fixture retirement before subsequent tests #152700.
- Finish companion fixture database cleanup before deletion #152780.
- Synchronize SQLite cleanup tests after large mutations #153068.
- Make Active Memory timeout tests independent of runner delays #154049.
- Isolate the retired-agent cleanup fixture #153286.
- Drain database workers before skill-test fixture removal 103115f2. Thanks Peter Steinberger.
- Drain database workers before update-test cleanup 2a820f48. Thanks Peter Steinberger.
- Wait for session-store test maintenance and cleanup 48883d72. Thanks Peter Steinberger.
- Isolate session-list tests from fixture maintenance 4d50b52b. Thanks Peter Steinberger.
- Drain idle SQLite coordinators during test lifecycle cleanup 6110505e. Thanks Peter Steinberger.
- Await Doctor test cleanup before removing fixture state 6d65c8b7. Thanks Peter Steinberger.
- Route session-store tests to their database worker host 784631f8. Thanks Peter Steinberger.
- Isolate persisted-session read fixtures from bundled plugin startup 95221a89. Thanks Peter Steinberger.
- Drain worker test databases before removing fixtures #154355. Thanks @vincentkoc.
- Let the cron test harness own SQLite cleanup #154458.
- Retain test homes when resource cleanup fails #154759.
- Await session archive completion in conformance tests #154838.
- Finish suspension-test cleanup before deleting fixtures #154898.
- Make recovery tests observe committed outcomes #154995.
- Synchronize suspended session recovery tests #155028. Thanks @VACInc.
- Isolate disk-worker retirement observations #155124. Thanks @stevenlee-oai, @kevinlin-openai.
- Attribute teardown failures and continue independent cleanup #155312.
- Isolate agent recorder storage between tests #155366.
- Isolate navigation-lineage fixture storage #155373.
- Isolate memory-forget setup from automatic retention #155423.
- Establish valid directory groups before permission-preservation tests #155489.
- Stabilize Doctor OAuth cancellation testing #155556. Thanks @vincentkoc.
- Isolate SQLite state between config-write tests #155568.
- Isolate embeddings HTTP cleanup test state #155703. Thanks @vincentkoc.
- Finish archive-placement requests before fixture teardown #155751. Thanks @vincentkoc.
- Settle archive test work before database teardown #155701. Thanks @vincentkoc.
Agent, session and scheduling internals
Agent execution, sessions and scheduled work share more of their existing preparation and cleanup code. These changes remove repeated lookups, temporary copies and unused imports while retaining current routing and recovery rules.
Sources and complete change list
Improvements
- Consolidate agent preparation and reply dispatch #152399.
- Consolidate agent tool catalogs and model publication #152467.
- Avoid unused SQL-row preparation in automation projections #152029.
- Remove unused internal array wrappers #153233.
- Simplify API error payload parsing #151776.
- Simplify internal Gateway session-name selection #147984.
- Batch automation-name lookups for history #152054.
- Choose delivery-mirror matching before scanning replies #151806.
- Avoid duplicate file metadata reads during log polling #151961.
- Reuse unchanged canonical JSON for file logs #152082.
- Simplify file-path grouping in tool progress #151780.
- Share canonical validation with ask_user #151395. Thanks @RomneyDa.
- Avoid repeated background-worker registration scans #151997. Thanks @vincentkoc.
- Reuse normalized replies when assembling recovery text #151817.
- Simplify restart recovery ownership and admission #152969.
- Remove redundant whitespace work in paragraph planning #151695.
- Reuse normalized inbound message fields #152110.
- Reuse idle timers while processing command output #152261.
- Reuse prepared input during runtime-owner rebinding #151992.
- Use the compact JSON serializer argument consistently #152013.
- Reuse shared state within agent-event emission #152729.
- Consolidate runtime adapters and remove obsolete implementation #152277.
- Reduce repeated environment reads in runtime checks #152715.
- Consolidate cron results and watcher updates #152376.
- Avoid unnecessary copies while draining cron output #151890.
- Reduce temporary allocations in individual session broadcasts #151551.
- Share session-key normalization without changing behavior #153868.
- Reuse prepared thinking policy in session refreshes #151934.
- Consolidate session-title request ownership #153871. Thanks @VACInc.
- Consolidate session-list tool contracts #151034. Thanks @RomneyDa.
- Align session-history schemas with Gateway contracts #151038. Thanks @RomneyDa.
- Limit unused context identity normalization #151655.
- Defer optional Gateway startup initialization #151547.
- Avoid Markdown imports for progress-tool recognition #151800.
- Share auxiliary-event overflow handling in tool-call streams #149282. Thanks @vincentkoc.
- Simplify subagent recovery and control internals #151199.
- Classify task-status records in one pass #152346.
- Simplify live CLI task activity observation #152507.
- Centralize existing file-command display labels #149072. Thanks @vincentkoc.
- Remove redundant tool inventory copies #152898.
- Simplify MCP tool-inventory assembly #151612.
- Separate update repair-turn execution from orchestration fbea7971. Thanks @romneyda.
- Avoid temporary input copies in usage aggregation #151643.
- Consolidate worker and model fallback handling #152268.
- Consolidate worker placement and node execution internals #153019.
- Reuse canonical session visibility types #125265.
- Simplify agent-handler test dependencies #145422.
- Reduce dependencies loaded for Codex history preparation #154404.
- Reduce session-history reader dependencies #154740.
- Remove unused task-flow observer callbacks #154863.
- Move subagent spawn overrides into test support #154867.
- Move announcement overrides into test support #154985.
- Remove test-only conversation dependency overrides #155058.
- Remove unused Codex tool-progress state #155069.
- Simplify Gateway node-event dependencies and test fixtures #155098.
- Remove task-maintenance dependency overrides #155120.
- Remove the production agent-step test registry #155125.
- Remove task registry test runtime overrides #155157.
- Reuse resolved chat session ownership during setup #155664.
- Isolate subagent lifecycle test and benchmark fixtures #155727.
- Validate internal streamed-reply source occurrences #155821. Thanks @giodl73-repo.
- Preserve observable systemd ownership checks during activation ee8f55c4. Thanks Peter Steinberger.
Reverted changes and retained contributor credit
The temporary extension of tool and model duration histograms was reverted, leaving the existing finite buckets ending at ten seconds. Anyone who deployed the brief main-branch extension should compare common bucket boundaries or keep observations separate across the rollback. The source list also retains credit for a codec-import repair whose merge added no further changes.
Native app and platform test coverage
Swift and Android tests reuse preparation and wait for observable readiness, while Apple catalog checks follow the current app text. Windows lifecycle fixtures retain their compiled files until cleanup completes.
Sources and complete change list
Improvements
- Reduce Swift test execution overhead #154100.
- Reduce Swift test execution time #154190.
- Overlap independent Android diagnostic test observations #153472.
- Stabilize macOS readiness timing and installer tests #154269.
- Remove real waits from mocked scheduled-task tests #154488.
- Reduce Xcode 27 iOS smoke-test overhead #155417.
Bug fixes
- Wait for background width measurement in Android diff tests #152908. Thanks @saariuslystoned, @iwhatsskill.
- Remove retired iOS text from catalog expectations #153363.
- Run Windows lifecycle probes from managed compiled fixtures #148185. Thanks @jalehman.
- Isolate Windows test worker subprocess pipes 438046f8. Thanks Peter Steinberger.
- Synchronize Android release-probe timeout fixtures b4f1fec1. Thanks Peter Steinberger.
- Isolate MXC test environment overrides c9d2f750. Thanks Peter Steinberger.
- Synchronize recovery tests with worker completion #154800.
- Isolate macOS launch-agent test homes #155551. Thanks @vincentkoc.
- Observe scheduled-job refresh readiness in macOS tests #155645.
- Stabilize macOS Quick Chat release-validation tests #156134.
Gateway and command integration tests
Gateway and command tests coordinate startup, background work and teardown more explicitly. Isolated ports, profiles and workspace fixtures help preserve coverage for complete workflows without letting unrelated activity interfere with assertions.
Sources and complete change list
Improvements
- Shorten CLI cleanup process-test waits #151116. Thanks @romneyda.
- Share compaction test fixtures #153439.
- Advance Cron settlement waits in tests #153323.
- Test heartbeat repair through existing Doctor interfaces #148964.
- Reduce waits in Gateway lifecycle tests #153324.
- Remove live-node waits from offline-placement tests #151082. Thanks @RomneyDa.
- Share Gateway test gates and strengthen cancellation ordering #151274.
- Speed proxy deadline tests and bound fixture reads #153292.
- Shorten repeated-request recovery QA waits #151098. Thanks @RomneyDa.
- Reuse fresh terminal table test fixtures #153385.
- Reuse disk caches in the profile-evidence workflow test #151556.
- Avoid unused parent worktrees in spawn tests #151710.
- Consolidate native broadcast test fixtures #151591.
- Reuse deferred-promise setup in wake tests #151631.
- Consolidate command-display formatting tests #151824.
- Share voice-session test fixture helpers #154085.
- Share Talk voice-provider test fixtures #154099.
- Reuse provider fixtures in Talk harness tests #154142.
- Reuse multi-file bootstrap budget fixtures #154254.
- Reuse request guards in cron provider-preflight tests #137803.
- Reuse deferred fixtures in diagnostic-phase tests #137928.
- Reduce fake Gateway startup overhead in tests #152443.
- Share Claw resource-update test plans #151871.
- Share required-compaction test fixtures #152444.
- Share startup corpus fixtures without dropping variants #152767.
- Consolidate scalar regression cases into named tables #152855.
- Consolidate repeated startup corpus data #152964.
- Consolidate configuration diagnostic source-location tests #153590.
- Reuse shared Fleet removal fixtures #153759.
- Remove duplicate PDF helper validation tests #153808.
- Remove redundant newline chunking coverage #153998.
- Simplify bootstrap budget tests #154197.
- Reuse Doctor and Gateway test fixtures #153986.
- Remove real waits from speech timeout tests #154092.
- Remove fixed waits from terminal session-label tests #154146.
- Reuse migration runtime preparation in Doctor tests #154172.
- Consolidate warning-filter tests and private helpers #153255.
- Reduce artificial waits in workspace recovery tests #153247.
- Reuse a prepared Gateway in stream-completion tests e914feb1. Thanks Peter Steinberger.
- Cover plugin warnings in Doctor preview output #148137.
- Reduce redundant agent-management CLI process tests #153993. Thanks @romneyda.
- Reduce redundant sessions CLI process tests #153994. Thanks @RomneyDa.
- Reuse model-refresh tests for migration diagnostics #153995. Thanks @RomneyDa.
- Reduce redundant Claws lifecycle process tests #153996. Thanks @RomneyDa.
- Reduce large-buffer assertion costs in Gateway tests #154351.
- Construct authenticated test URLs at runtime #154442.
- Record the subsequently reversed Skills CLI test reduction #154579. Thanks @RomneyDa.
- Close Browser test clients before server teardown #154850.
- Reuse shared mock-call guards in cron tests #155042.
- Run Doctor output tests with the prepared runtime #155055.
- Consolidate configuration environment test fixtures #155062.
- Consolidate Gateway server test fixtures #155063. Thanks @ddupg.
- Consolidate migration and scheduler test fixtures #155064.
- Consolidate nested Markdown list tests #155217.
- Reuse Gateway test completion helpers #155319.
- Reduce repeated agent and Gateway test setup #155562.
- Skip unnecessary setup in approval rejection tests #155655.
- Reuse Gateway fixtures for configuration tests #155709.
- Test approval startup and publication ordering with settled requests 4aad139b.
Bug fixes
- Wait for Gateway and task test work before cleanup #153877.
- Restore CLI invalid-input validation coverage #151974.
- Exclude scheduled inputs from cron live-test reply assertions #153715. Thanks @vincentkoc.
- Stop cron fixture timers before deleting stores #153603. Thanks @vincentkoc.
- Prevent port reuse in desktop diagnostic tests #153429.
- Avoid cold runtime loading in diagnostic cleanup tests #153615.
- Isolate cron reload fixtures from heartbeat work #151293.
- Prevent parallel Gateway fixtures from sharing claimed ports #151737.
- Avoid Linux client-port collisions in Gateway sandbox tests cc96aefe.
- Make loopback test port allocation more reliable #151318.
- Use Gateway WebSocket transport in network fixtures #152143.
- Verify expected stranded-reply failure diagnostics #151889. Thanks @vincentkoc.
- Repair QA subagent yield and follow-up validation #152048.
- Isolate QA Gateway profiles from installed services #153659.
- Preserve QA cross-agent denial scenarios #150556. Thanks @vincentkoc.
- Stabilize timeout recovery delivery tests #152100.
- Report missed Talk test registration without cleanup hangs #152177.
- Isolate spawn-fallback tests from delayed heartbeats #152183.
- Align retry tests with durable run-specific completion #152184.
- Synchronize unstable task-list test mutations with scans #152213.
- Settle canceled MCP question fixtures before subsequent tests #152215.
- Restore triage fixture environment before cleanup #152306.
- Wait for transcript lifecycle completion in occupancy tests #152321.
- Align sandbox fixtures with pinned container identities #153536.
- Restore visible-child lifecycle test helpers #153527.
- Restore requester-routing fixtures through durable task owners #153763. Thanks @vincentkoc.
- Wait for child fixture cleanup before deleting temporary state #153785.
- Wait for task events before registry test cleanup #153302.
- Stop task-pagination test mutations before later fixtures #154177.
- Isolate redaction state in Tailscale warning tests #151922.
- Isolate subagent completion tests from Browser cleanup #152779.
- Align status timeout fixtures with token authentication #152928.
- Prevent port reuse in refused-upstream tests #153947.
- Wait for stored transcript readiness in routed tests #153351.
- Await transcript startup in selection tests #153376.
- Expose transcript startup settlement to tests #153317.
- Wait for transcript workers in producer tests #153336.
- Align WebSocket fixtures with the active Gateway transport #153559.
- Restore paired-node integration fixture admission #153526.
- Make workspace fixtures independent of permissive defaults #153413.
- Synchronize hosted lifecycle approval tests 11e376cd. Thanks Peter Steinberger.
- Stabilize heartbeat coalescing test timing 175c0b7d. Thanks Peter Steinberger.
- Await pairing approval publication in Gateway tests 2c1ea519. Thanks Peter Steinberger.
- Restore real Gateway desktop test readiness and approval ownership 538cb1ee. Thanks Peter Steinberger.
- Synchronize provisioning cancellation test deadlines 6e2ac280. Thanks Peter Steinberger.
- Wait for queued cron delivery completion in tests 720c3f4a. Thanks Peter Steinberger.
- Settle archive lifecycle test requests before teardown 94b9c471. Thanks Peter Steinberger.
- Wait for applied configuration in reload tests 97e9ce9b. Thanks Peter Steinberger.
- Prepare clock-jump delivery fixtures before settlement measurements 9a7984ef. Thanks Peter Steinberger.
- Wait for actual events in commentary-media tests b8330aee. Thanks Peter Steinberger.
- Isolate metadata lifecycle tests from CPU sampling c0533cfc. Thanks Peter Steinberger.
- Synchronize cron heartbeat tests with lifecycle events d2b9c87a. Thanks Peter Steinberger.
- Wait for coalesced heartbeat completion in cron tests dba638a9. Thanks Peter Steinberger.
- Await approval publication in signed-runtime tests dbb40250. Thanks Peter Steinberger.
- Release test database leases before Gateway startup dbdb5f9b. Thanks Peter Steinberger.
- Await cron admission events in lifecycle tests e3c65f7d. Thanks Peter Steinberger.
- Synchronize approval tests with registration acknowledgments e43f5154. Thanks Peter Steinberger.
- Join maintenance notification delivery in test teardown f469e13c. Thanks Peter Steinberger.
- Control SSH approval timing in pairing tests f87f23c4. Thanks Peter Steinberger.
- Await scheduled recovery admission in fixtures f914e0f5. Thanks Peter Steinberger.
- Synchronize cron handoff tests with completion fd2c001c. Thanks Peter Steinberger.
- Wait for session-send callbacks before fixture reset #147167.
- Make worker publication fixtures private across host umasks #154411.
- Restore built-process Skills CLI coverage #154686. Thanks @RomneyDa.
- Retain IPv6 portal test port ownership until shutdown #154833.
- Correct transcript test clocks and export assertions #154902.
- Wait for committed pairing completion in startup tests #155006.
- Await approval readiness and request cleanup #155111. Thanks @vincentkoc.
- Recover test fixtures from initial port collisions #155209.
- Prevent test probes colliding with reserved ports #155228.
- Wait for Cron test subprocess completion #155278.
- Separate storage-ownership tests from short deadlines #155294. Thanks @jalehman.
- Align reload tests with joined model publications #155455. Thanks @RomneyDa, @Patrick-Erichsen.
- Preserve real coordination clocks in worker lifecycle tests #155474. Thanks @vincentkoc.
- Preserve worker coordination clocks in placement cleanup tests #155530. Thanks @RomneyDa, @vincentkoc, @jalehman.
- Restore diagnostics fixtures after timer-leak failures #155545. Thanks @vincentkoc.
- Prepare approval workers before test request deadlines #155574.
- Prepare approval test storage before request deadlines #155589. Thanks @vincentkoc.
- Repair restored-requester Gateway fixtures #155621. Thanks @romneyda, @vincentkoc, @jalehman.
- Wait for SSH pairing approval cleanup in tests #155643. Thanks @vincentkoc.
- Prevent acquisition fixture port collisions #155687.
- Preserve clock-jump regression coverage after slow startup #155748.
- Prevent reset-hook fixtures from blocking later tests #155770.
- Recognize deletion cancellation in SQLite lifecycle tests 7345a2db. Thanks Peter Steinberger.
- Settle subagent test work before teardown #155888.
- Wait for subagent notification delivery before fixture cleanup #155910. Thanks @vincentkoc.
- Allow more time for subagent test cleanup #155960.
Media and browser processing internals
Media handling and browser snapshot processing reuse information already prepared during the same operation. Shared parsing and formatting helpers retain existing attachment selection, transcription requests and browser output.
Sources and complete change list
Improvements
- Avoid repeated CLI image eligibility classification #152159.
- Reuse attachment filename classification results #152274.
- Avoid unused browser snapshot text reconstruction #152801.
- Share Base64 alphabet decoding across media helpers #149189. Thanks @vincentkoc.
- Remove unreachable media-geometry metadata backfills #149272. Thanks @vincentkoc.
- Consolidate transcription requests and summary cleanup #152953.
- Reduce repeated attachment-selection passes #152436.
- Reduce intermediate base64 conversions in image reads #152569.
- Reuse plugin policy while constructing video tools #151617.
- Add bounded Lightpanda browser transport compatibility #154342. Thanks @vincentkoc.
- Narrow internal media SDK dependencies #154789.
Authentication and permission-check internals
Credential preparation and permission checks share existing helpers and avoid repeated reads or unused data preparation. The work retains current account selection, access rules and redaction behavior.
Sources and complete change list
Improvements
- Remove redundant auth-profile preparation work #151903.
- Prepare scoped shared credentials asynchronously #152286.
- Remove duplicate host coordination during auth-profile reads #152374.
- Move inline-key failure bookkeeping into database workers #153570.
- Share Gateway operator permission checks #153979.
- Simplify Gateway permission checks and tool routing #154120.
- Reduce unused attribution work in Gateway authorization #152586.
- Reuse redaction capture coordinates across log fields #152682.
- Reuse linked-account reads during GitHub sign-in #151508.
CI scheduling, coverage and diagnostics
CI planning accounts for current test costs and runner capacity, with fixes for cache matching and job allocation. Failure reports retain more useful diagnostics, and standalone Control UI uploads are limited to sanitized summaries. Some expensive matrices now run only in full validation or when their test files change, so source-only regressions may be found later. Compatible Linux PR and UI tests can use pinned Bun routing while required Node coverage remains.
Sources and complete change list
Improvements
- Require Playwright Chromium after CI cache misses #153030.
- Size measured Gateway CI groups from runner capacity #152864.
- Retain sanitized quota diagnostics from successful CI runs #152173.
- Capture diagnostics for stalled infrastructure test workers #152381.
- Retain bounded quota-recovery diagnostics #152003.
- Reduce QA runtime loading for workflow guard tests #153747.
- Run Gateway server tests in parallel #154181.
- Refresh Codex extension CI timing estimates #154243.
- Reuse inventory scans in CI policy tests #153165.
- Reuse validated compiled test workers in CI #154095.
- Balance extension CI jobs using measured costs #153515.
- Parallelize cron tests within existing CI budgets #154097.
- Refresh CI timing weights with deferred families preserved #152971.
- Collect per-file timing evidence for PR tooling tests #153676.
- Create typecheck capacity for agent session tests #153943.
- Parallelize Gateway database-worker tests #153144.
- Reduce Swift CI build and fixture overhead #154023. Thanks @RomneyDa.
- Separate macOS app and Swift package CI budgets #153911.
- Remove duplicate CI workflow assertions #152678.
- Remove duplicate Android workflow assertions #153586.
- Run isolated CI watcher replay cases concurrently #154018.
- Rebalance UI tests and make unused proof capture optional #154116.
- Share project setup across Windows CI partitions #154107.
- Remove unused Node CI matrix fields 2d71ebc9. Thanks Peter Steinberger.
- Select maintainer-tooling CI by changed ownership 836aeaa7.
- Bound legacy startup-check concurrency on small CI runners ea0d3c08.
- Run tooling files in parallel within existing CI limits #153820.
- Balance Windows CI and defer selected integration checks #153950.
- Run command tests across their allocated workers #154088.
- Keep dependency caches after unrelated manifest edits #154122.
- Reduce lint overhead and reuse validated typecheck state #154150.
- Publish CI dependency seeds independently and warm hosted caches #154156.
- Narrow UI CI selection and explain fallback decisions #154162.
- Use measured Windows file-worker capacity in CI #154261.
- Run auto-reply test files in parallel within CI budgets #154306.
- Run compatible Linux PR tests on a pinned Bun fork #154340.
- Increase isolated Gateway CI workers on eligible runners #154366.
- Run embedded-agent tests in parallel with lighter imports #154426.
- Repack parallel CI jobs and guard hosted-runner routing #154471.
- Let infrastructure tests use their assigned workers #154520.
- Run compatible UI tests on Bun while preserving Node coverage #154585.
- Reuse embedded-agent test inventories during planning #154710.
- Use measured workers and larger runners for CLI tests #154883.
- Select dependent tests for tooling fixture edits #154934.
- Account for isolated Gateway CI test cost #154959.
- Split CI workflow tests by responsibility #155001.
- Replay Windows CI failures with frozen test selection #155223. Thanks @RomneyDa, @vincentkoc, @jalehman.
- Name changed PR fields in security-review errors #155266. Thanks @joshavant.
- Separate large inventory capacity checks from bounded filesystem recovery #155483. Thanks @vincentkoc.
- Reduce recurring UI and Codex test costs #155586.
- Move expensive runtime matrices to release validation #155606.
- Retain passing test timings from failed workflows #155718.
Bug fixes
- Align CI readers with the published Node bytecode cache #154113.
- Reserve plugin jobs before packing core CI tests #154126.
- Validate inherited plugin CI worker allowances #151900.
- Keep hosted core lint within runner memory limits #152233.
- Allow expanded test plans within revised CI job limits #153519. Thanks @liuwqgit.
- Preserve CI guard selection and compact worker limits #151339. Thanks @RomneyDa, @shakkernerd.
- Repair compact CI worker-policy checks and selection #151427. Thanks @azuretek.
- Keep Security Review pending while CI runs #153005.
- Avoid stale Security Review job failures after reevaluation #153089. Thanks @joshavant.
- Isolate large-workspace recovery checks in CI #153466.
- Restore CI typecheck capacity by rebalancing channel tests #151564.
- Select the capacity guard for messaging test changes #151615.
- Prevent Security Review checkout failures after fork merges #153102. Thanks @joshavant.
- Preserve Docker test failures through shutdown #152002. Thanks @vincentkoc.
- Retain failed HTTP responses in Gateway test diagnostics #152407.
- Repair browser budget fixtures and historical syntax handling #151417.
- Reuse configured pnpm version evidence in Windows CI replay d93fc8ca. Thanks Peter Steinberger.
- Remove duplicate worker-test planning entry f76d38a4. Thanks Peter Steinberger.
- Bound migrated database-test CI workloads #153306.
- Keep manual CI plans within job-output limits #154993. Thanks @shakkernerd.
- Reduce Security Review checkout work and recover bounded API throttling #155054. Thanks @joshavant.
- Restrict inherited scheduled maintenance on forks #155112. Thanks @Patrick-Erichsen.
- Recover security review from inconsistent file lists #155129. Thanks @joshavant.
- Stop obsolete security review evaluations #155170. Thanks @joshavant.
- Retry temporary GitHub read failures in security checks #155196. Thanks @joshavant.
- Separate Security Review infrastructure failures from approval checks #155231. Thanks @joshavant.
- Recover Security Review after temporary status failures #155248. Thanks @joshavant.
- Run agents-support tests in forked processes #155304. Thanks @fuller-stack-dev.
- Warn about oversized core test shards while retaining ownership failures 4a93b5e5. Thanks Peter Steinberger.
- Keep the advisory test-shard limit private 9225217a. Thanks Peter Steinberger.
- Skip CI timing samples that finish after the collection cutoff #155755.
- Bound ordinary Gateway test processes to fifty files #155871.
- Keep workflow-test scratch scripts outside the checkout #155887. Thanks @vincentkoc.
Security and trust
- Limit automatic Control UI diagnostics to public summaries #152581.
Limits and compatibility
- Finalize Docker test cleanup before reporting success #155212. Thanks @vincentkoc.
Routine CI can defer checks, and canceled or coalesced main runs have no automatic catch-up. Large-inventory coverage now separates 257 physically changed files from 26,000 in-memory records. Docker scheduler consumers must read summary.json.status; failures.json.status has been removed.
Control UI browser and component tests
Control UI tests control clocks, focus and viewport state and wait for rendered elements before checking them. Shared fixtures reduce repeated setup while preserving coverage for chat, navigation, sign-in and appearance.
Sources and complete change list
Improvements
- Detect blocked loopback transport before UI fixtures start #152309.
- Remove duplicate Markdown table-copy coverage #153256.
- Reuse mobile layout browser setup across widths #153458.
- Share sidebar catalog test setup #153287.
- Reduce mention fixture setup and imports #152612.
- Stop generating test appearances after the first match #153062.
- Remove redundant pointer resets in owner-chip tests #151703.
- Reuse chat tool-stream event fixtures #154184.
- Remove redundant chat input tests #152677.
- Simplify language retry test synchronization #154168.
- Reduce garbage collection overhead in UI retention tests #152149.
- Advance provider sign-in test timers virtually #153766.
- Consolidate usage-page test fixtures #153259.
- Test theme continuity across startup, reconnects and tabs 74a59a23. Thanks @vyctorbrzezowski.
- Remove variable shadowing in chat-rail tests c1919771. Thanks Peter Steinberger.
- Reuse deferred promises in agent UI fixtures #137642.
- Test exact JSON indentation in Raw and Copy views #154361. Thanks @vyctorbrzezowski.
- Cover menu and conversation-position focus behavior #154380.
- Reuse mobile chat test pages across themes #154463.
- Make browser speech-test readiness explicit #154490.
- Use state notifications in publication tests #154768.
- Await workspace read completion in file-tab fixtures #154795.
- Remove real waits from background placement tests #154856.
- Remove hover delays from preview tooltip tests #154914.
- Consolidate isolated chat-pane lifecycle tests #154938.
- Advance browser time in debug-tray polling tests #155091.
- Share Dreaming wiki test configuration #155279.
- Reduce router retention test setup overhead #155418.
- Reduce rendering in Memory Wiki count tests #155441.
- Advance OAuth polling clocks in Model Setup tests #155450.
- Exercise Talk fallback timing without real waits #155454.
- Consolidate duplicate offline chat-abort tests #155533.
- Reduce plugin installation progress test waits #155628.
- Finish composer animation before browser layout checks #155046.
Bug fixes
- Preserve browser-test errors when diagnostic capture stalls #151555.
- Wait for iframe readiness in board layout tests #152198.
- Isolate forwarded-message browser-test styles and viewport #151673.
- Wait for plugin initializer readiness in browser tests #151785.
- Stabilize saved cloud-turn recovery test setup #153457.
- Make Agents Home refresh timing tests deterministic #151842.
- Wait for dashboard readiness in browser tests #151869.
- Reset document focus between shared UI tests #152065.
- Extract dashboard test setup to restore size checks #152089.
- Sample widget-menu fonts without stale element reads #152474.
- Prevent inherited pointer state in dropdown tests #152754.
- Stabilize Activity refresh browser timing #154063.
- Restore sidebar and chat test collection #152099.
- Keep Control UI test imports independent of Gateway state #152130.
- Wait for scheduled chat-rail focus updates in tests 08833949. Thanks Peter Steinberger.
- Wait for session roster hydration before browser assertions 35755101. Thanks Peter Steinberger.
- Observe chat-rail position at keyboard entry in tests 4f2115a1. Thanks Peter Steinberger.
- Wait for layout between chat-margin test viewport changes 9f79472f. Thanks Peter Steinberger.
- Preserve completed duration in UI test fixtures a333d707. Thanks Peter Steinberger.
- Scope optional-question completion checks to the transcript c1224ba0. Thanks Peter Steinberger.
- Await sidebar menu opening in browser tests cc253165. Thanks Peter Steinberger.
- Isolate cold short-link tests from saved startup state d44f23df. Thanks Peter Steinberger.
- Wait for mobile drawer animation before geometry assertions de531283. Thanks Peter Steinberger.
- Control clocks in meeting browser retry tests #149174. Thanks @vincentkoc.
- Retain brief chat highlights in browser test observations #154645.
- Stop retired emoji fixtures from redrawing #154811.
- Stabilize Control UI browser-test timers #154821.
- Clean up font links created by theme tests #155295.
- Restore guest-question browser test setup #155853. Thanks @vincentkoc.
Build, typecheck and source-checkout tooling
Fresh source dependency installs use cloned or copied package files so an install in another checkout cannot falsely invalidate active compiler inputs. Existing hardlinked installs need a fresh checkout and install, and copy fallback can use more disk space, as explained in the local testing guide. Build and typecheck fixes also cover Windows paths with spaces, selected compiler runtimes and custom Control UI output directories.
Sources and complete change list
Improvements
- Reuse the build wrapper's option scanner #152293. Thanks @vincentkoc.
- Run compiler shards through the native loader #153446.
- Extend type-aware lint to CommonJS test support #151385.
- Keep UI stylesheet validation scoped to relevant test graphs #153630.
- Retain compiler evidence on worker-transform failures #155219. Thanks @vincentkoc.
- Reduce compiler graph test fixture work #155226.
- Explain compiler input snapshot rejection categories #155865. Thanks @vincentkoc.
Bug fixes
- Correct configuration include validator imports #153007. Thanks @fuller-stack-dev.
- Preserve the selected compiler runtime in Bun-launched builds #151735.
- Keep Node-specific development checks on Node under Bun #151772.
- Finalize Control UI assets in custom build destinations #153571.
- Honor configured Mac worker-packaging timeouts #153380.
- Record the temporary message-helper export allowance later narrowed to the pinned surface #151881.
- Match deprecated message export limits to the actual surface #151912.
- Isolate fresh dependency installs across source checkouts #154096.
- Run Windows developer checks from paths containing spaces #151701.
- Declare existing tsx CLI shim types 80b9608a. Thanks Peter Steinberger.
- Rebalance session-storage test typechecking groups #154497.
- Preserve explicit Node compiler flags in tooling subprocesses #154509.
- Run UI build validators without extra compiler processes #154675.
- Exclude temporary test packages from compiler input scans #155086. Thanks @Patrick-Erichsen.
Subprocess, signal and cleanup tests
Process tests wait for the intended child to start and finish, use the required runtime and retain diagnostics when cleanup is incomplete. Controlled clocks remove fixture delays while preserving production timeout settings.
Sources and complete change list
Improvements
- Await node-worker recovery completion in tests #153398.
- Reduce process cleanup test waits and startup races #153343.
- Share Docker scheduler test process cleanup #152364.
- Capture operating-system evidence for stalled CLI tests #151946.
- Record test-worker exit entry for the current stop request #153050.
- Advance watchdog test deadlines with a controlled clock #152922.
- Isolate shell fixture logging dependencies #152431.
- Skip impossible renderer waits in Crabbox tests #154012.
- Finish 1Password timeout tests after descendant cleanup #154169.
- Reuse one process for read-retention tests #151423. Thanks @romneyda.
- Remove unnecessary waits from Git deadline tests #153705.
- Run independent Mantis signal tests concurrently #154256.
- Synchronize worker-lifetime tests with readiness events #154439.
- Wait for child exit before late output subscription tests #154503.
- Remove real waits from reviewer timeout tests #154612.
- Remove idle waiting from broker recovery tests #154667.
- Finish process-inspection test blockers promptly #154749.
- Make supervisor byte-activity tests deterministic #154997.
- Reduce memory-search cleanup test waits #155103.
- Wait for actual package lifecycle contention in tests #155400.
Bug fixes
- Restore Bun filesystem race-test instrumentation #151302.
- Avoid missing-worker port leaks in Bun cleanup tests #151317.
- Deliver compiler cleanup test preloads to both runtimes #153170.
- Restore dependencies for isolated macOS PR-operation tests #152350.
- Restore dependencies for macOS PR-operation tests #153520.
- Allow retired PID reuse in Windows lifecycle tests #152848.
- Match process lifecycle tests by full identity #153338.
- Retain Doctor test diagnostics through incomplete child cleanup #151161. Thanks @jalehman.
- Bind the CLI test diagnostic emitter to its process #151356.
- Isolate Crabbox fixtures and preserve startup diagnostics #152239.
- Preserve process lifecycle coverage under Bun #152175.
- Keep tooling test workers on Node under Bun #152187.
- Stabilize scheduler signal fixtures across Bash versions #152301.
- Avoid cold-start timeouts in Mantis signal tests #152342.
- Use the selected runtime in preview-process tests #152359.
- Prepare hooks CLI lifecycle fixtures before execution #152365.
- Run QA lifecycle tests without built SDK artifacts #152368.
- Make PDF cancellation regression checks deterministic #152403.
- Show sampler diagnostics when a descendant PID file is missing #151730.
- Preserve borrowed event dispatch in CLI test diagnostics #151918.
- Reduce test setup stalls and cancel fixture subprocess waits #153884.
- Keep child-process test mocks safe to reset #152064.
- Load CLI test fixtures consistently on Node and Bun #152076.
- Deliver launcher test preloads explicitly under Bun #152481.
- Select Node for module-mocked port test children #152485.
- Prevent startup races in plugin cleanup tests #154030.
- Accept exited Linux process groups in recovery tests #154134. Thanks @shakkernerd.
- Stabilize Docker scheduler cleanup tests #154326.
- Prepare speech test runtime before timeout checks #153473.
- Preserve temporary mounts during overlapping checkout tests #154187.
- Wait for worker cleanup before replay assertions 057492fa. Thanks Peter Steinberger.
- Wait for worker launch handoff in cancellation tests 5beff9c3. Thanks Peter Steinberger.
- Exercise relay startup through explicit shell mode in tests ddcd52d5. Thanks Peter Steinberger.
- Separate FIFO read checks from Python startup timing #123647.
- Stabilize recovery clocks and subprocess test fixtures #154194.
- Stabilize CLI cancellation and Mattermost timeout tests #154333.
- Synchronize terminal safety tests with rendered output #154356.
- Correct process-cleanup assertions in signal tests #154525. Thanks @vincentkoc.
- Apply shared Node policy to nested Crabbox test children #154627.
- Isolate CLI fixtures and report subprocess failures reliably #154629.
- Remove descriptor-reuse races from avatar cleanup tests #154747.
- Align Bun transport and worker test expectations #154956.
- Stabilize launcher and watcher startup tests #154981.
- Separate lifecycle termination checks from runner latency #155208.
- Stabilize test-instance refusal ordering #155213.
- Wait for subprocess readiness in timeout tests #155240. Thanks @vincentkoc.
- Bind SQLite compile-cache probes to fixture lifetime #155611. Thanks @shakkernerd.
- Isolate triage test resources and join cleanup #155736.
PR preparation, review and merge tools
PR tools provide clearer checkout, review and merge diagnostics and avoid repeated GitHub metadata requests. Supported REST paths can continue selected operations after GraphQL quota exhaustion, with reviewed-revision and merge-approval requirements still enforced. Eligible GraphQL paths also handle exhausted REST quota or persistently unknown mergeability, using the actual merging account for policy checks. Recovery of inspected refusals before submission retains fresh approval and identity checks; accepted or ambiguous merge attempts are never replayed.
Sources and complete change list
Improvements
- Read source files concurrently in coercion-helper checks #151722.
- Reuse plugin-boundary source scans #151426. Thanks @RomneyDa.
- Share grouped rendering for developer test reports #149078. Thanks @vincentkoc.
- Share test-report comparison pairing #149142. Thanks @vincentkoc.
- Reduce commit-hook formatter resource demand #152297.
- Reduce GitHub API work during PR landing #154040.
- Explain merge aborts and invalid review fields #151996.
- Use REST metadata for CI-only PR polling #152697.
- Show rejected merge observations #150647.
- Reduce GitHub reads during PR preparation and polling #153424.
- Keep PR workflows working across host tooling differences #152078.
- Reuse REST metadata when attaching the CI watcher #152893.
- Synchronize AutoReview Git startup safeguards #152039.
- Hand pending PR checks to guarded GitHub auto-merge #154307.
- Keep supported PR landing available across API quota limits #154376.
- Reduce repeated GitHub reads in maintainer PR operations #154581.
- Consolidate maintainer wrapper dependency checks #155883.
Bug fixes
- Reject incomplete CI success and trim maintainer API reads #153880.
- Report unsupported Python before workflow-check bootstrap #151222. Thanks @wangmiao0668000666, @altaywtf, @vincentkoc.
- Run line-cap checks inside ignored temporary directories #151748.
- Permit ordinary reviewed PR merges while main advances d01d83b7. Thanks Peter Steinberger.
- Release completed PR-operation locks after confirmed loader exit #152209.
- Recover interrupted PR checkouts and isolate allocation state #152069.
- Correct failed-request quota diagnostics in PR tooling #152723.
- Use REST for PR identity and reviewer assignment #153296.
- Continue CI monitoring and eligible squash landing after GraphQL quota exhaustion #153563.
- Recover accepted auto-merge requests before PR branch repair 736219b5. Thanks Peter Steinberger.
- Ignore superseded draft-skip CI gates in deferred merge admission 8e4c007a. Thanks Peter Steinberger.
- Include SQLite maintenance support in PR wrapper manifests b518db47. Thanks Peter Steinberger.
- Recognize GitHub CLI check quota errors during PR landing #154182.
- Revalidate PR observations and reuse qualified repository addresses #154212.
- Keep PR landing reads working when REST quota is exhausted #154558.
- Recover locally refused maintainer auto-merge requests #154988.
- Read merge eligibility using the authenticated writer #155087.
- Recover qualified Octopool merge refusals #155215.
- Use GraphQL when REST mergeability stays unknown #155239.
- Use merging-account identity for PR recovery checks #155245.
- Recover inspected Octopool policy timeouts before merge #155681.
- Include the required workspace helper in maintainer wrappers #155869. Thanks @vincentkoc.
Security and trust
- Verify extracted maintainer tools with complete batched Git reads #154974.
Documentation
- Follow pending PR merges through verified completion f202df3c. Thanks Peter Steinberger.
- Document guarded Octopool PR landing #155110.
Compatibility of standalone push and sync operations with older saved pr-meta.json records remains unresolved. Alternate API routes and inspected refusal recovery do not waive current revision, identity or approval checks.
CLI preparation and diagnostic formatting
Command setup and diagnostic formatting avoid unused imports, repeated scans and temporary copies. Displayed results and selection behavior remain the same.
Sources and complete change list
Improvements
- Skip unused verbose health account selection #152108.
- Count enabled plugins without a temporary array #152160.
- Reuse private authentication menu groups #152166.
- Reuse prepared task-audit summaries #152294.
- Avoid configuration I/O initialization for log paths #152305.
- Prepare model-picker provider counts once #152313.
- Load MCP tool projection only for probes #152684.
- Load database command implementations on demand #152687.
- Reuse Fleet diagnostic counts while rendering #151763.
- Reuse task lookups in Doctor recovery reports #152023.
- Defer unused native preparation during metadata checks #153347.
- Narrow CLI startup logging imports #151609.
- Simplify channel status preparation #151906.
- Reuse shared ANSI parsing in terminal pickers #150783.
- Consolidate marketplace output preparation #148783.
- Centralize daemon action output #150047.
- Reduce unnecessary updater imports and repeated checks #154757.
- Defer Canvas Gateway imports until needed #154766.
- Remove private baseline setup test overrides #154894.
- Share plugin-health section formatting #155390. Thanks @vincentkoc.
- Keep the predecessor-stop ledger constant private 57c179a7. Thanks Peter Steinberger.
Bug fixes
- Validate recorded Doctor service-stop identity fields 55700ea6. Thanks Peter Steinberger.
Messaging channel implementation maintenance
Messaging integrations share configuration types, formatting and account-preparation helpers. This maintenance retains existing routing, account ownership and attachment choices.
Sources and complete change list
Improvements
- Derive Zalo configuration types from schemas #151393. Thanks @RomneyDa.
- Align LINE and Twitch configuration types with schemas #151394. Thanks @RomneyDa.
- Reuse Matrix poll timestamp validation #149125. Thanks @vincentkoc.
- Consolidate Matrix media metadata assembly #149128. Thanks @vincentkoc.
- Share Slack Markdown preparation #149129. Thanks @vincentkoc.
- Share Discord Markdown edit rendering #149214. Thanks @vincentkoc.
- Avoid duplicate Twitch outbound account preparation #128592.
- Reuse normalized conversation-parent data #151718.
- Derive four channel configuration types from schemas #153938. Thanks @RomneyDa.
- Remove obsolete Discord modal test accommodation #153239.
- Keep message destination descriptions free of runtime imports #153163.
- Avoid credential reads for Matrix room encryption settings #152353.
- Avoid credential reads during Matrix ownership checks #152382.
- Consolidate non-send attachment preparation #150681.
- Reduce repeated channel-account selection work #151433. Thanks @vincentkoc.
- Centralize Markdown disclosure depth handling #149262. Thanks @vincentkoc.
- Reuse bounded file creation for Signal CLI downloads #154316.
- Simplify Teams file-consent helpers and tests #155050.
- Narrow Discord parameter-reader imports #155452.
Messaging channel regression tests
Messaging tests isolate credentials, temporary paths and background work, and wait for delivery or cleanup to reach the state being checked. Shared fixtures retain each channel's existing regression scenarios.
Sources and complete change list
Improvements
- Share repeated LINE card test expectations #153218.
- Reuse Matrix initialization in session-capability tests #153790.
- Reduce waits in Matrix recovery persistence tests #153278.
- Trim Matrix session-reset test setup #153252.
- Share Matrix QA CLI parsing and failure diagnostics #152087. Thanks @vincentkoc.
- Avoid fallback plugin loading in Slack startup tests #153684.
- Remove rate delays from Telegram recovery fixtures #151424. Thanks @RomneyDa.
- Reuse workers across Telegram send tests #153301.
- Exercise production channel-status helpers in tests #152400.
- Share Discord reply-fallback test setup #151723.
- Share channel option test fixtures #153874.
- Simplify SMS webhook registration assertions #137621.
- Share channel setup test fixtures #151833.
- Share channel model and capability test fixtures #153621.
- Reuse channel reply receipt fixtures #153783.
- Remove fixed waits from ingress capacity tests #154110.
- Make Feishu registration cancellation tests deterministic #154196.
- Remove a shadowed reply-pipeline test import 21cbb3cd. Thanks Peter Steinberger.
- Reuse compiled Discord audio worker fixtures 6319111d. Thanks Peter Steinberger.
- Simplify Teams Graph test assertions #137802.
- Simplify Voice Call runtime test guards #154713.
- Share Teams consent-upload test assertions #154816.
- Remove real-time waits from voice-call notification tests #154846.
- Use controlled deadlines in LINE image-set tests #154847.
- Avoid real retry waits in WhatsApp tests #154849.
- Remove real-time waits from Buzz restoration tests #154855.
- Consolidate ClickClack inbound fixtures #154877.
- Remove real waits from iMessage receipt recovery tests #155011.
- Avoid Slack startup in Mattermost authority tests #155017.
- Remove a duplicate Signal empty-input test #155056.
- Remove copied channel capability test implementations #155118.
- Reuse progress-draft test configuration #155235.
- Reuse iMessage edit and poll test callbacks #155576.
Bug fixes
- Correct channel-progress validation and observer diagnostics #153557. Thanks @vincentkoc.
- Use canonical macOS paths in Discord delivery tests #153667.
- Prevent Slack identity-recovery test teardown hangs #151641.
- Clean Telegram QA children after failed startup #151894.
- Isolate connections in Telegram proxy revocation tests #151925.
- Stabilize Telegram media fixtures and teardown #153549.
- Wait for Telegram album fixture work to complete #153599.
- Isolate session-resolution tests from bundled plugin loading #151945.
- Wait for persisted Discord capture retirement #153117.
- Verify rendered code blocks in directive-delivery tests 087ccde1. Thanks Peter Steinberger.
- Wait for encoded audio before measuring Discord test pacing 761725d0. Thanks Peter Steinberger.
- Drain Discord command test state before removal df752c82. Thanks Peter Steinberger.
- Drain Telegram recovery-test maintenance before cleanup f28edb13. Thanks Peter Steinberger.
- Preserve literal JSON in automation QA replies #154620.
- Use current configuration paths in channel-removal fixtures #154754.
- Preserve generated audio in Discord pacing fixtures #154790.
- Clean up temporary iMessage test state #154900.
- Model active speech in Discord recording tests #154913. Thanks @vincentkoc.
- Make Slack transport deadline tests independent of host stalls #155549. Thanks @vincentkoc.
- Synchronize the Telegram queued-turn retry test with reply admission #155955.
Configuration traversal and validation
Configuration handling separates pure traversal from file access and reuses validation inputs. Existing settings, error reporting and reload decisions remain intact.
Sources and complete change list
Improvements
- Share nested-container traversal in configuration diagnostics #149099. Thanks @vincentkoc.
- Share config-write notification preparation #152022. Thanks @vincentkoc.
- Separate pure config traversal from config I/O #152490.
- Retain private authored configuration provenance for internal repairs #147051. Thanks @vincentkoc, @fuller-stack-dev.
- Skip single-agent directory collision lookups #152192.
- Reduce repeated configuration comparison work #152279.
- Skip unused model-policy validator setup #152796.
- Reuse model references during configuration validation #152897.
- Derive Google Chat and WhatsApp types from validation schemas #153935. Thanks @RomneyDa.
- Derive host configuration types from validation schemas #153936. Thanks @RomneyDa.
- Derive approval, hook and MCP configuration types from schemas #153937. Thanks @romneyda.
- Skip redundant startup configuration scans #154588.
- Derive ACP and queue configuration types from schemas #154632. Thanks @RomneyDa.
- Derive agent configuration types from validation schemas #154633. Thanks @RomneyDa.
- Derive shared channel types from existing schemas #154634. Thanks @RomneyDa.
- Consolidate shared configuration types under schema owners #154635. Thanks @RomneyDa.
- Derive tool configuration types from existing schemas #155484. Thanks @RomneyDa.
Contributor guidance and technical references
Contributor guidance clarifies test-failure investigation, focused verification and database access, with updated technical references and remote-test instructions. Generated maturity reports continue to show evidence gaps alongside completed checks.
Sources and complete change list
Documentation
- Document urgent main-branch repair procedures 1894325e. Thanks Peter Steinberger.
- Document flake investigation and test-cost budgets 3b76ad84. Thanks Peter Steinberger.
- Reduce duplicate references in repository-agent replies 6f1499b0.
- Clarify bounded investigation of unresolved test failures 894fb140. Thanks Peter Steinberger.
- Retire legacy instruction-file aliases while preserving AGENTS.md 9c831c75. Thanks Peter Steinberger.
- Clarify successful screenshot delivery in contributor chat bef4c20d. Thanks Peter Steinberger.
- Clarify focused verification and when visual screenshots are required c43b7990. Thanks Peter Steinberger.
- Document worker-thread database access policy #154189.
- Refresh maturity documentation with current-taxonomy evidence #153186.
- Remove obsolete notification-history claims from protocol documentation #151604.
- Document Blacksmith artifact-directory downloads #153232.
- Clarify landing of verified main-CI repairs fd5331f1. Thanks Peter Steinberger.
- Clarify who may execute Team server updates #154425. Thanks @vincentkoc.
- Clarify cleanup of completed maintainer tasks #155716. Thanks @vincentkoc.
Repository review policy and notices
Repository review notices identify the revision, affected files and approvals contributors need. Review routing separates maintainer approvals from SecOps-owned files, whose independent merge enforcement depends on the repository ruleset.
Sources and complete change list
Improvements
- Retire automatic secops code-owner review requests #151624. Thanks @obviyus.
- Clarify dependency and security review notices #152578. Thanks @joshavant.
- Clarify maintainer review-warning introductions #152634. Thanks @joshavant.
Bug fixes
- Restore security-review comments and labels #152526. Thanks @joshavant.
Security and trust
- Separate maintainer approvals from SecOps-owned files #152415. Thanks @joshavant.
Control UI state and rendering maintenance
Control UI maintenance consolidates queued-message cleanup, session preferences and subscriptions under their existing owners. Rendering also reuses unchanged favicon colors.
Sources and complete change list
Improvements
- Consolidate queued-message and command cleanup #152398.
- Consolidate New Session worktree preferences #152455.
- Derive Agents page state from existing owners #151384. Thanks @romneyda.
- Consolidate session-query lifecycle handling #151430.
- Reuse favicon colors across unchanged session updates #152373.
- Simplify artifact preview conversion and download fixtures #155461.
SQLite, filesystem and persistence internals
Database and filesystem code share bounded reads, query preparation and record conversion, with selected database work moved to existing workers. Stored formats and data-ownership rules remain unchanged.
Sources and complete change list
Improvements
- Narrow database-worker startup imports #153279.
- Move Doctor token inventory reads to the worker #151305.
- Consolidate bounded filesystem reads and hashing #153196.
- Consolidate filesystem discovery, staging and hashing #153388.
- Reuse archive transcript-line byte counts #152693.
- Share conversation binding serialization #152134. Thanks @vincentkoc.
- Defer shared database feature loading until first use #152071.
- Batch participant reads for session identity checks #151549.
- Reuse prepared transcript freshness queries #151606.
- Share database setup across session placement reads #151662.
- Move MCP policy preparation SQL to its worker #151092.
- Move sandbox registry reads to the shared worker #151172.
- Reuse derived SQL in repeated state checks #151835.
- Consolidate session database scope resolution #151836.
- Avoid duplicate worker records when reading SSH fallback ports #151878.
- Cache repeated agent database-path construction #152525.
- Pass prepared SQLite bindings without wrapper copies #152571.
- Reuse prepared statements for session counts #152591.
- Separate subagent record conversion from database operations #153838.
- Reduce duplicate reads in subagent completion batches #151707.
- Reuse selected task IDs for delivery-state reads #152315.
- Remove host-only dependencies from shared database workers #153060.
- Reuse canonical workspace file metadata #134906.
- Narrow SQLite snapshot and backup startup imports aeff5c8d. Thanks Peter Steinberger.
- Extract reusable legacy session migration queries #153814.
- Move transcript export ownership reads to the shared worker #154173.
- Reduce transcript summary read overhead #154391.
- Reduce repeated profile reads during Web Push updates #154450.
- Reduce repeated receipt reads in worker-turn bookkeeping #154564.
- Reuse worker launch metadata during settlement #154596.
- Remove unused asynchronous database mutation scopes #154776.
- Reuse profile lookup query compilation #154830.
- Adopt shared workspace file readers #155108.
- Share transcript worker request types #155291.
- Avoid unrelated runtime loading during agent database cleanup #155809.
Security and trust
- Retire unused session-mutation authority when requests finish #150041.
Limits and compatibility
- Await private session metadata writes and preserve committed results #153216.
Private session append and metadata-write calls must now be awaited. If an append commits but rebuilding the local view fails, resolve the read failure and reopen the manager instead of retrying the committed append.
Dependency and generated metadata upkeep
Compatible dependencies and generated metadata have been refreshed within the existing release-age policy. Required version holds remain in place.
Update and package acceptance tests
Update and package tests reuse isolated preparation and distribute independent scenarios across workers. Fixture repairs preserve checks for historical upgrades, service replacement, migration and backup ownership.
Sources and complete change list
Improvements
- Distribute historical startup checks across test workers #153532.
- Remove repeated Node startup from release test polling #151331.
- Reduce repeated setup in PR and release-tooling tests #153710.
- Consolidate repeated package-lifecycle test waits #151636.
- Remove duplicate package acceptance execution #152620.
- Isolate and reuse Discord and updater test fixtures #154007.
- Reuse update test preparation with private directories #154235.
- Reuse one child process for Doctor custody tests #151425. Thanks @RomneyDa.
- Protect update restart outcomes with regressions and bounded hosted CI jobs #142102. Thanks @baovo15, @duybaovin, @fuller-stack-dev.
- Parallelize managed-update handoff tests #153569.
- Align updater interruption fixtures with shared Node policy #153651.
- Exercise Windows update paths on non-Windows CI #150839. Thanks @xydigitLybnnnn, @fuller-stack-dev, @beings1988-lab.
- Share filesystem checks in managed-update fixtures #149444.
- Select supported CI runtimes and add Node 26 package checks #154298.
- Reduce subprocess work in release-check contract tests #154335.
- Verify Node shutdown flags in release-check fixtures #154345.
- Remove duplicate release-check flag assertions #154665.
- Extend published-upgrade tests to multiple providers #155158.
- Reuse the migration runtime in Doctor input tests #155325.
- Simulate backup test lease expiry without a minute-long wait #155332.
- Avoid duplicate Doctor runtime loading in plugin-deferral tests #155372.
- Reduce unnecessary Git setup in release-input tests #155733.
- Allow more time for bundled browser MCP package checks #155931.
Bug fixes
- Restore the packaging launcher test fixture's required dependency 5741b3cb.
- Isolate Node guidance fixtures from version-manager paths #153696.
- Isolate release verification fixture state #153384.
- Seed Dreaming restart fixtures after stopping the Gateway #152038.
- Prepare SDK outside progress-consumer test deadlines #152019.
- Run Node recovery fixtures with Node #151976.
- Select Node explicitly for built recovery tests #152162.
- Repair and speed up service-update replacement tests #154263.
- Preserve workspace aliases in release-metadata fixtures #152486.
- Restore Doctor fixture coverage under Bun #152587.
- Use supported Bash in macOS workflow fixtures #152619.
- Prevent inode reuse from destabilizing backup tests #152795.
- Make service drop-in fixtures independent of permissive umasks #152807.
- Use Node for upgrade diagnostic test children #151286.
- Protect update-aware plugin migration guidance #153951. Thanks @vincentkoc.
- Allow fixture companion reinstall after Doctor preparation #153382.
- Recognize compiled plugins in upgrade validation #153410.
- Allow one required baseline restart in upgrade validation #151607.
- Separate title repair from worktree upgrade verification #153350.
- Isolate installer PATH tests from installed Node #154186.
- Avoid false pnpm version-pin test failures 1497878e. Thanks Peter Steinberger.
- Align upgrade-survivor fixtures with baseline preparation 6ee9578a. Thanks Peter Steinberger.
- Wait for initial TLS health in Gateway validation #153906. Thanks @RomneyDa.
- Preserve published plugin archives in same-version upgrade tests #154374.
- Align rollback test cache settings with the updater #154410.
- Set valid permissions for service rollback fixtures #154557.
- Report actual Gateway process identity in upgrade tests #154560. Thanks @vincentkoc.
- Recognize candidate install identities in update smoke checks #154723.
- Isolate updater subprocess test fixtures #154760.
- Preserve channel registries in update configuration tests #154761.
- Isolate update-completion fixtures from host effects #154762.
- Retain baseline startup logs in upgrade-test diagnostics #154861.
- Use supported reasoning in the live upgrade probe #155085.
- Preserve published plugin archives in upgrade tests #155093.
- Preserve child diagnostics in upgrade probe tests #155220.
- Stabilize plugin registry readback fixture timing #155536. Thanks @shakkernerd.
- Test launcher permission handling during rollback #155615. Thanks @fulgerulnegru.
- Keep Matrix Doctor fixtures until cleanup completes #155679. Thanks @vincentkoc.
- Repair launcher fixture lifetime calls #155825.
- Recognize completed deferred plugin tools in release checks #154859.
- Isolate update activation tests from shared handoff storage #155844.
- Repair native-loader and FaceTime release test setup #155892.
- Run installed-package channel checks on plain Node #155940.
Documentation
- Prepare historical upgrade tests and clarify missing-plugin-path recovery #155092.
Local test preparation and planning
Local test tools reuse verified compiled workers where supported and keep large test inventories complete. An optional offline Gateway test path is available for trusted, keyless tests on Linux with rootless Podman and a matching prepared image and toolchain; it does not support SELinux, external network access or automatic fallback to host execution.
Sources and complete change list
Improvements
- Add opt-in offline Gateway tests for trusted keyless fixtures on prepared Linux rootless Podman hosts #152318.
- Reuse verified compiled workers across local test runs #153558.
- Check directory exclusions first during test planning #151669.
- Remove duplicate tooling-routing test coverage #151592.
- Consolidate captured CI watcher fixtures #152930.
- Remove duplicate build-cache test assertions #153101.
- Reduce Git fixture copying overhead #154222.
- Reuse selection patterns when planning shared-helper tests #153650.
- Reduce repeated tooling-test compilation and readiness waits #153685.
- Reuse compiled worker fixtures in lifecycle tests #151389.
- Reuse compilation work in native test-report suites #154532.
- Move private lifecycle resets into test support #154669.
- Reduce exhaustive test-routing work #154724.
- Avoid provider loading in batch-error tests #154748.
- Move type-only tests into compiler contracts #154841.
- Reuse transform caches in serial mixed-project tests #155052.
- Preserve compiler policy and transform reuse in tests #155481. Thanks @vincentkoc.
- Reuse the prepared CLI in plugin import tests #155493.
- Reduce repeated command and tooling test setup #155503.
- Reuse JavaScript test caches across layouts and supported runtimes #155518.
- Reduce repeated CLI and tooling test setup #155564.
Bug fixes
- Restore guest-command transport for qualified Parallels test hosts #153469.
- Restore test cache reuse and consistent UI dependencies #154121.
- Preserve complete test discovery for large Git inventories #151991.
- Restore compile-cache access in Bun worker test mocks #152956.
- Prepare MCP import-boundary test children before launch 45ba3419. Thanks Peter Steinberger.
- Isolate historical Node-runner tests from host CI policy 7952e084. Thanks Peter Steinberger.
- Precompile isolated transcript timezone test fixtures 7b9ebb0f. Thanks Peter Steinberger.
- Preserve compiler-cache policy in Vitest workers 9fd45e58. Thanks Peter Steinberger.
- Prepare SQLite test programs before timed probes a3aa5390. Thanks Peter Steinberger.
- Exclude static fixtures from tooling test batches #154265.
- Isolate Git-root tests from parent repositories #154677.
- Limit fixture compilation to selected worker entries #154755.
- Run test children under the selected runtime #154809.
- Preserve original watcher-test errors when diagnostics fail #155383. Thanks @vincentkoc.
- Match SQLite fixture loader arguments to the Node child #155557.
- Preserve compiler caches across MCP CLI fixtures #155609. Thanks @vincentkoc.
Localization tooling and catalog cleanup
Localization maintenance removes entries whose interface text has already been retired and shares Android quote-validation logic. Active translations remain unchanged.
Sources and complete change list
Improvements
- Synchronize locale metadata after workspace-label removal #152977.
- Remove retired native translation entries #153626.
- Share quote handling in Android translation checks #149090. Thanks @vincentkoc.
- Remove obsolete locale memory entries #155569.
- Refresh translation memory for message-batching help dc7f1b6f.
- Remove unused Android No result translations #155864.
Documentation
- Clarify Thai question-dismissal terminology #155177.
Memory indexing and result internals
Memory file watching is separated from indexing, and diagnostics and search-result preparation reuse existing information. This is maintenance of the current Memory implementation.
Sources and complete change list
Improvements
- Extract Memory file watching from indexing #152631. Thanks @Kimiyu-186.
- Avoid repeated workspace lookups in memory diagnostics #152040.
- Consolidate memory search result preparation #152858.
- Share complete writes during memory recovery #154422.
- Remove duplicate memory-index metadata guards #155510. Thanks @vincentkoc.
Model catalog and provider processing internals
Model and provider processing avoid repeated catalog searches, metadata preparation and response parsing. Selection precedence, permission checks, provider output and fallback rules remain intact.
Sources and complete change list
Improvements
- Prepare shared authentication labels once per catalog publication #152859.
- Reuse prepared model metadata before ambient state reads #152119.
- Stop model catalog scans at the first literal match #152128.
- Skip impossible provider ownership scans #152158.
- Reuse prepared provider-authentication declarations #151570.
- Stop catalog template searches after the preferred match #151616. Thanks @vincentkoc.
- Reduce work in pending model-catalog status checks #151819.
- Reduce routine Codex request-cleanup overhead #152479.
- Index repeated provider and alias lookups #152495.
- Simplify xAI response citation selection #152686.
- Simplify Kimi citation collection #152692.
- Reuse provider-option locale comparison #151066.
- Defer provider sign-in metadata construction until selection #151943.
- Avoid reparsing complete streamed tool arguments #152904.
- Simplify compatible-provider stream readability checks #152401.
- Skip redundant scans of ordinary completion chunks #152549.
- Select Parallel MCP responses without an intermediate array #152685.
- Derive provider request types from resolver results #150413. Thanks @RomneyDa.
- Simplify model retry and recovery decisions #151995.
- Normalize only selected Firecrawl search results #152348.
- Separate model lookup from session execution imports #154763.
- Reduce repeated provider lookup work #155250.
- Skip unused activation planning for retained provider owners #155711. Thanks @vincentkoc.
Release preparation, publication and recovery tools
Release tools improve package checks, publication readback and recovery of interrupted work while preserving exact-package verification and explicit approvals. Optional early activation remains off by default and is limited to direct core publication; using it can leave the release page public while Docker distribution is still incomplete. Authorized extended-stable publication can create a GitHub release page without moving Latest, with bounded waits for npm visibility and explicit operator-approved waiver handling.
Sources and complete change list
Improvements
- Share stale package archive cleanup #151930. Thanks @vincentkoc.
- Reuse shared traversal in package staging checks #153400.
- Refresh the macOS update feed for 2026.9.5 ab0433de.
- Reduce checkout work in plugin npm publication #152405.
- Align main release metadata with 2026.9.5 #151823.
- Record explicit soak waivers in stable release evidence #151880.
- Check publication prerequisites before release dispatch #152470.
- Resume public release pages with optional early activation while Docker distribution may remain incomplete #152435.
- Allow the expanded serial upgrade validation workload #151285.
- Update the plugin prerelease advisory scanner #153942. Thanks @RomneyDa.
- Support non-Latest extended-stable release publication #154515. Thanks @RomneyDa.
- Remove duplicate Git object checks from release validation #155254.
Bug fixes
- Reject incomplete runtime dependencies in legacy npm packages #152186. Thanks @RomneyDa, @milanko77.
- Prepare legacy AI dependency locks before sealing bundles #152242. Thanks @RomneyDa.
- Handle historical plugin shrinkwraps in disposable packaging #151334. Thanks @RomneyDa.
- Register reviewed 2026.9.6 plugin scan findings #153372.
- Recover omitted merge associations during Telegram release QA #151931. Thanks @vincentkoc.
- Use GitHub-hosted runners for npm release artifacts #151633.
- Authorize Linux updater channel publication #152408.
- Reuse Linux publication requests when a release resumes #152425.
- Revalidate cached Linux publication downloads #152559.
- Restore shared runner routing for npm artifact checks #153154. Thanks @RomneyDa.
- Retry busy temporary disk images during macOS packaging #152404.
- Recognize generated config wrappers in updater inventory tooling #152411.
- Honor approved soak waivers for stable plugin bootstrap #152206.
- Align stable release performance-waiver checks #152290.
- Recover extended-stable plugin publication with trusted tooling #151282. Thanks @RomneyDa.
- Allow delayed npm publication visibility to settle #151421. Thanks @RomneyDa.
- Wait for accepted npm versions to become readable #152176.
- Restore discovered-model selection in OpenCode Go release smoke #153107. Thanks @romneyda.
- Reclaim abandoned ClawHub publication children #152432.
- Recover original npm publisher identity during release retries #152434.
- Verify delayed plugin registry visibility at the release parent #152438.
- Recover the original signed npm publishing attempt #152616.
- Record the reviewed Codex performance-helper launch #151304.
- Preserve complete historical upgrade-test selection and enforce matrix limits 21231330. Thanks @pollybot13, @fuller-stack-dev.
- Verify each package manager installed the exact candidate version e79e97b3. Thanks @aniruddhaadak80, @vincentkoc, @fuller-stack-dev.
- Repair frozen-package validation fixtures #152458. Thanks @RomneyDa.
- Record the temporary OpenCode Go smoke-model pin later replaced by discovered-model selection #152703. Thanks @RomneyDa.
- Correct extended-stable calibration and Gemini validation probes #153190. Thanks @romneyda.
- Restore authenticated release-validation plans after retries #151469.
- Read complete streamed release-validation metadata #151379. Thanks @RomneyDa.
- Check historical CLI usability before scheduling upgrade tests #151694. Thanks @milanko77.
- Validate the frozen 2026.7.35 release contracts #154476. Thanks @RomneyDa.
- Prepare bundled release packages from isolated installs #154506. Thanks @vincentkoc.
- Validate Telegram configuration for frozen 2026.7.35 packages #154546. Thanks @RomneyDa.
- Preserve Telegram release evidence across workflow reruns #154561. Thanks @RomneyDa.
- Avoid redundant npm inventory launches during package validation #154567.
- Reserve requests for reviewed dependency-advisory verification #154646.
- Extend bounded npm readback for extended-stable publishing #154824. Thanks @romneyda.
- Repair candidate waiver forwarding and npm packaging #155798.
- Repair plugin release validation checks and metadata #155818.
- Correct SQLite worker package checks and wrapper dependencies #155877.
Limits and compatibility
- Qualify the frozen 2026.7.34 SDK setup surface #152230. Thanks @RomneyDa.
- Recognize the frozen 2026.7.34 filesystem contract #152326. Thanks @romneyda.
- Record v2026.9.5 updater compatibility requirements #152472.
- Align 2026.9.6 candidate versions and applicable plugin declarations 29cde8b8. Thanks Peter Steinberger.
The package ceiling is now 320 MiB, allowing larger packages. Historical validation exceptions apply only to their named versions; these tooling changes do not establish completed release qualification or publication.
Performance benchmarks and measurement controls
Benchmarks distinguish startup preparation from completed work and retain more useful installed-package diagnostics. These changes improve how performance is measured and compared without establishing an application speedup.
Sources and complete change list
Improvements
- Verify benchmark work and separate warmup and CPU placement #149702. Thanks @vincentkoc.
- Measure installed Gateway startup and shutdown on Windows #151635.
- Compare installed Gateway startup packages on one Windows runner #151697.
- Add optional CPU profiling for installed Gateway startup #151825.
- Cover Gateway admission in catalog benchmarks #151846.
- Add manual live OpenAI Gateway concurrency profiling #154845.
- Compare Code Mode on complex benchmark workloads #155613.
- Compare Gateway resource costs with and without Kitchen Sink #155734. Thanks @vincentkoc.
- Calibrate Gateway resource measurements through plugin shutdown #155792. Thanks @vincentkoc.
- Add passive Activity recap diagnostics to mock Gateway benchmarks #155829. Thanks @vincentkoc.
- Share Gateway resource measurement across plugin test workloads #155830. Thanks @vincentkoc.
Bug fixes
- Calibrate catalog performance checks to host CPU speed #151732.
- Isolate catalog performance measurements from background work #151832.
- Retain foreground scope during catalog benchmarks #151840.
- Remove redundant catalog benchmark priority hold #151892.
- Preserve valid installed-startup CPU diagnostic captures #152888.
- Start installed Gateway benchmark fixtures under Bun #152704.
- Use current memory counters in base64 tests #154808.
- Prepare history benchmarks before test deadlines #155780.
Live provider profiling is opt-in and can incur provider charges, including background usage outside foreground turn counts. Benchmark admission controls are not hard spending caps. Kitchen Sink comparisons require the specified Linux environment and pinned fixtures; resource observations do not prove memory reclamation, absence of leaks or aggregate savings.
Plugin lifecycle and packaging regression tests
Plugin tests cover asset lookup across installation layouts, cleanup after failed preparation and package lifecycle behavior. Their fixtures isolate database state and temporary dependencies while retaining existing assertions.
Sources and complete change list
Improvements
- Cover sibling plugin assets across installation layouts #153723. Thanks @RichSomeday222, @Maxwell-Code07.
- Cover cleanup after rejected model-runtime preparation #151677.
- Replace session-catalog test waits with controlled time #151136. Thanks @RomneyDa.
- Share bounded file scanning in plugin assertions #151960. Thanks @vincentkoc.
- Reuse registry archives in plugin packaging tests #154247.
- Consolidate prerelease plugin compatibility tests #154457.
- Strengthen plugin retirement error and file-lifetime assertions #154729.
- Isolate plugin record-cache contention tests #154780.
- Load agent runtime only when test fixtures need it #154966.
- Reuse SQLite workers in plugin fixtures #155459.
- Advance retry clocks in Browser connection tests #154851.
- Reuse SQLite kernel fixtures in Workboard notification tests #155904.
Bug fixes
- Route plugin lifecycle tests to the required database workers #153582.
- Align plugin validation fixtures with runtime contracts #153561. Thanks @vincentkoc.
- Limit SDK fixture copies and isolate temporary Groq dependencies #152783.
- Avoid redundant SDK loading in Prometheus ownership tests #152782.
- Wait for actual plugin approval responses in tests 703dc02b. Thanks Peter Steinberger.
- Select transcript test captures by source identity 860c9e80. Thanks Peter Steinberger.
- Close the FaceTime audio-forwarding test driver abcbe771. Thanks Peter Steinberger.
- Observe the actual ZIP decoder in ClawHub guard tests #154597.
- Prevent premature expiry of media retention fixtures #155174. Thanks @VACInc.
- Fix worker SDK tests in built checkouts #155814.
Plugin loading, catalogs and scope internals
Plugin loading and catalogs avoid repeated path resolution, unused metadata reads and temporary allocations. Existing tool behavior, migration history and execution ownership are preserved.
Sources and complete change list
Improvements
- Skip discarded native plugin command responses #152155.
- Reuse private plugin tool catalog groups #152157.
- Reduce temporary allocations in immutable-data checks #152077.
- Avoid duplicate native plugin path lookups #152127.
- Skip unnecessary native plugin import path conversions #152227.
- Reuse plugin icon root preparation #152494.
- Reduce repeated plugin generation scope setup #152602.
- Separate metadata reads from plugin install-path resolution #152244.
- Load only pending plugin migration reports #152337.
- Reduce temporary objects in plugin runtime scopes #152101.
- Avoid traversal allocations for mutable plugin arguments #152154.
- Reduce allocations in empty plugin calls and property reads #152258.
- Align plugin cleanup wrappers and fixtures with lint checks 0051fa8f. Thanks Peter Steinberger.
- Reduce repeated plugin callback scope setup #154625.
- Consolidate Workboard workspace preflight error handling #155465. Thanks @vincentkoc.
QA Lab and channel test tooling
QA Lab keeps Evidence Archive filters within their toolbar and rejects replay reports with missing runtime results. Channel test tools also improve credential-fixture cleanup and retain clearer bounded failure diagnostics. Existing scenarios are selectable, and QA Lab controls and links receive layout and refresh fixes. Slack and Discord readiness tools require provisioned credential pools; Slack message checks make explicitly requested test writes, while Discord's read-only checks do not establish write permissions. API receipts, Gateway replies and actual client rendering remain separate checks.
Sources and complete change list
Improvements
- Consolidate Telegram test setup and retained-run recovery #151571. Thanks @obviyus.
- Add reusable Discord and Slack end-to-end QA workflows #153471. Thanks @obviyus.
- Select individual Matrix QA scenarios in workflows #153969. Thanks @RomneyDa.
- Register heartbeat session-routing coverage in QA Lab #154550. Thanks @RomneyDa.
- Register cron startup recovery in QA Lab #154601. Thanks @RomneyDa.
- Cover CLI status and health and finish retained QA fixture cleanup #154613. Thanks @RomneyDa.
- Register Gateway timeout recovery in QA Lab #154694. Thanks @RomneyDa.
- Simulate response deadlines after real HTTP admission in tests #155016.
- Share QA Lab runner-selection fixtures #155272.
- Reduce quota-recovery test setup work #155308.
- Reduce QA bus media comparison overhead #155311.
- Batch mock-provider cursor retention test requests #155328.
- Add leased Slack user OAuth readiness and message checks #155547. Thanks @obviyus.
- Check Discord QA bot readiness without QA Lab #155598. Thanks @obviyus.
Bug fixes
- Keep Evidence Archive filters inside their toolbar #152123. Thanks @vincentkoc.
- Reject replay confidence reports with missing runtime results #129544.
- Preserve QA transport preloads and packaged preparation boundaries #152944.
- Restore Telegram QA skill integration checks #151632.
- Prevent false launcher-leak failures in Telegram QA #151642.
- Avoid credential-launcher cleanup stalls in Telegram QA #151644.
- Show captured Telegram test output on subprocess errors #151675.
- Make Telegram credential-lease expiry tests deterministic #151729.
- Repair sanitized Slack QA error handling and lint compliance 44559eb3. Thanks Peter Steinberger.
- Repair QA and MCP test fixtures for current interfaces 54c31297. Thanks Peter Steinberger.
- Preserve the native Slack sender in QA runtime tests 99f7055b. Thanks Peter Steinberger.
- Repair hosted OpenShell fixture setup and cleanup eb20f68c.
- Reject stale Slack Desktop QA evidence #117344.
- Keep QA Lab controls reachable on narrow screens #152336. Thanks @vincentkoc.
- Refresh QA Lab links after URL-only changes #152397. Thanks @vincentkoc.
- Preserve failed tool receipts in QA scenarios #154198.
- Release idle database handles before temporary runtime cleanup #154617.
- Restore selectable QA coverage for waited child replies #154642. Thanks @RomneyDa.
- Check recorded terminal replies in native MCP QA #155554. Thanks @vincentkoc.
- Correct Code Mode completion checks in QA #155811.
- Bound Telegram QA credential group discovery #155601. Thanks @RomneyDa.
- Recognize nested Code Mode results in QA transcript checks #155976.
Release records and operator documentation
Historical release pages, plain Markdown mirrors and illustrations preserve earlier release records. Operator references clarify release handoffs and recovery procedures.
Sources and complete change list
Improvements
- Refresh the 2026.9.6 contribution record e6645404. Thanks Peter Steinberger.
Documentation
- Add the v2026.9.5 release page and navigation 48f3d97d. Thanks @hannesrudolph.
- Archive the published v2026.9.5 changelog and credits #152395. Thanks @hannesrudolph.
- Mirror v2026.9.5 documentation in plain Markdown #152406. Thanks @hannesrudolph.
- Illustrate v2026.9.5 release notes with hosted images #152546.
- Illustrate the September 2–4 release pages #152639.
- Clarify release handoffs and selector recovery #153322.
- Document extended-stable publication recovery #151323. Thanks @RomneyDa.
- Clarify update follow-through and Team downtime notices #154111. Thanks @vincentkoc.
- Clarify extended-stable release-page context #155210. Thanks @RomneyDa.
- Refresh model release descriptions and contribution records 008107b3. Thanks Peter Steinberger.
- Include the Codex backport in both contribution records 2e7d7793. Thanks Peter Steinberger.
- Refresh the history endpoint in the 2026.9.6 contribution records 6eed4c66. Thanks Peter Steinberger.
- Refresh the v2026.9.6 contribution-record endpoint and entries d1531b5b. Thanks Peter Steinberger.
- Refresh the contribution-record history endpoint eb377ac5. Thanks Peter Steinberger.
Remote source validation and recovery
Crabbox reports classified fetch failures without exposing raw private Git output and waits for cancellation cleanup. It can inspect and recover verified abandoned local staging, while keeping copies whose ownership or cleanup remains uncertain. Testbox validation stays in the selected checkout, restores targeted source uploads and accepts verified Microsoft OpenSSH installation locations on Windows. Stop and rewarm existing Testbox leases after preparation updates; support for live staging on filesystems without flushing does not permit recovery of unverified abandoned copies.
Sources and complete change list
Improvements
- Inspect and recover abandoned Crabbox source staging #152006. Thanks @shakkernerd.
Bug fixes
- Finish Crabbox cancellation cleanup before exit #151862. Thanks @shakkernerd.
- Keep remote validation in the selected checkout #153280.
- Keep Crabbox staging usable without supported filesystem flushing #154368.
- Admit verified Microsoft OpenSSH installations for Windows Testbox #154478. Thanks @vincentkoc.
- Restore targeted Testbox source uploads #154796.
Security and trust
- Classify Crabbox fetch failures without raw Git output #152138. Thanks @vincentkoc.
Skill installation and Workshop internals
Skill installation separates file operations from policy, and status checks avoid unnecessary installer loading. Workshop review status and skill-filter checks reuse their existing inputs without changing installation or review behavior.
Sources and complete change list
Improvements
- Separate skill file operations from installation policy #152629. Thanks @Kimiyu-186.
- Keep skill status reads independent of installer imports #152312.
- Compare skill-filter membership without sorting #152899.
- Read Workshop review status once per request #151656.
- Reuse bounded shared staging for skill downloads #154570.