OpenClaw v2026.5.12 Release Summary
OpenClaw v2026.5.12 Release Summary
Key Changes
OpenClaw v2026.5.12 focuses on infrastructure stability, security hardening, and the expansion of the Codex harness. The release introduces critical fixes for event-loop saturation and configuration data loss, while refining how plugins and sandboxes are validated.
Infrastructure & Stability
- Telegram Polling Resilience: To prevent message loss during event-loop saturation, Telegram polling ingress has been moved to an isolated worker with a durable local spool. This ensures that
getUpdatescalls continue to function even when the main thread is blocked by heavy agent processing. - Configuration Safety: A critical fix prevents config data loss during version upgrades. The system now creates a
.pre-updatesnapshot and disablesallowConfigSizeDropduring update-triggered doctor runs to ensure user-authored credentials and plugin records are not accidentally stripped. - Concurrent Config Mutations: Config mutations are now serialized centrally, allowing concurrent commands to rebase safe changes instead of clobbering each other.
Security & Hardening
- Plugin Install Scanning: Security scanning during plugin installation has been expanded. The system now scans executable runtime and setup entries, and performs a post-install scan of the installed runtime tree (including
node_modules) to detect dangerous code patterns in dependencies. - Sandbox Security: On Windows, the sandbox now explicitly blocks
USERPROFILEcredential roots to prevent unauthorized access to.sshor.codexfolders, even if theHOMEenvironment variable is redirected. - Auth & Scope Enforcement:
- Node-role device token management now requires
adminscope. - Browser-origin Control UI sessions now require explicit device pairing before operator scopes are honored.
- Setup-code bootstrap is now node-only and requires explicit pairing approval before returning durable tokens.
- Node-role device token management now requires
Codex & Agent Enhancements
- Codex Harness Integration:
- Codex now supports routing plugin LLM completions through the Codex runtime, allowing context-engine plugins (like
lossless-claw) to use Codex OAuth instead of requiring a directOPENAI_API_KEY. - Cron-triggered Codex turns now receive specific automation instructions to execute payloads directly, avoiding timeouts caused by unnecessary workspace bootstrapping.
- Lossless-managed Codex sessions now rotate incompatible native threads to prevent context-window overflows caused by stale hidden history.
- Codex now supports routing plugin LLM completions through the Codex runtime, allowing context-engine plugins (like
- Agent Coordination: The
session.agentToAgent.maxPingPongTurnsceiling has been raised from 5 to 20 to support more complex multi-agent coordination chains. - Tooling: Added
tools.toolsBySenderto allow operators to restrict dangerous tools (likeexecorwrite) on a per-user basis at the schema level, making them invisible to the LLM for restricted users.
Channel & UI Updates
- Telegram: Added support for localized command menu descriptions via
setMyCommandsand fixed HTML formatting for cron announce deliveries. - Control UI: The session picker now visually nests subagent sessions under their parent using a
└─prefix for better clarity. - iMessage: Fixed a bug where media-only sends included a visible
<media:image>placeholder text.
Impact
Fixed Issues
- #81132: Fixed Telegram polling stalls during event-loop saturation.
- #80077: Resolved critical config wipe during v2026.5.7 updates.
- #81395: Fixed subagent runtime bypass that caused billing issues for Claude CLI users.
- #80677: Resolved stuck Telegram lanes after tool failures and auto-compaction.
- #81181: Fixed erroneous "Failed to download media" replies in Telegram groups with
requireMention: true.
Performance Improvements
- Transcript Memory: Session transcript reads now use streaming helpers instead of loading full files into memory, significantly reducing RSS delta for large transcripts (e.g., from 252 MiB to 27 MiB for a 200 MiB file).
- Media Fetching: The system now skips buffering response bodies for bodyless media responses (HEAD probes), reducing heap waste.
Upgrade Guide
Breaking Changes & Migration
- iMessage Sender Allowlist: Sender allowlist matching now strictly requires normalized sender handles. Conversation-scoped IDs (chat GUIDs) are no longer accepted as proof of sender identity. Users must update their
allowFromconfigurations to use sender handles. - Trusted Proxy Validation: Trusted-proxy authentication now rejects non-loopback peers that are local interface addresses. Deployments using the gateway host's own LAN address in
gateway.trustedProxiesmust migrate to a distinct proxy peer address or use the loopback path. - pnpm Upgrade: The workspace has been upgraded to pnpm 11. Users performing git source installs will find that build allowlists are now managed via
pnpm-workspace.yaml#allowBuilds.
Sources
- Releasev2026.5.12 — openclaw 2026.5.12
- PRfix(security): classify dangerous Windows sandbox binds first
- PRfeat(acp): add backend provider failover for UNAVAILABLE errors
- PRfix(security): add session transcript redaction guards at bare appendMessage call sites
- PRfix(config): serialize concurrent config mutations
- PRfix(imessage): keep pasted links, ignore Apple preview blobs
- PRfix(sessions): classify spawn-child sessions correctly; extract shared classifier
- PRfix(sessions): report ACP-runtime metadata for ACP-keyed sessions
- PRfix(security): inline redact into appendSessionTranscriptMessage
- PRfix: prevent config data loss during version upgrade
- PR[AI-assisted] fix(channel): refresh WeCom onboarding install
- PRfix(agents): escalate LLM idle timeout to model fallback after profile rotation
- PRfix(telegram): detect same-bot token rotation via fingerprinted offset state
- PR[Fix] Add incremental chat delta payloads
- PRGate node surfaces on pairing approval
- PRfix(acp): drop unsupported timeout config option for claude-agent-acp
- PRRestrict chat sender allowlist matching [AI]
- PRfix(anthropic): enable Claude CLI session-expired history reseed
- PRInherit tool restrictions for delegated sessions [AI]
- PRfix: scan plugin runtime entries during install [AI]
- PRLimit hook CLI tool authority [AI]
- PRfix(plugins): scan installed dependency runtime code [AI]
- PRRequire admin scope for node device token management [AI]
- PRbrowser: enforce navigation checks for act interactions [AI]
- PRValidate node exec event provenance [AI]
- PR[AI-assisted] fix(docker): pin setup-time container paths
- PRfix(imessage): avoid visible media placeholder text
- PR[AI-assisted] fix(agents): normalize array tool schemas
- PRfix(codex): rotate incompatible context-engine threads
- PRfix(gateway): forward temperature and top_p through OpenAI-compatible HTTP APIs
- PRRequire Control UI pairing before proxy-scoped access [AI]
- PRRequire explicit browser device pairing [AI]
- PRHarden trusted-proxy source validation [AI]
- PRRequire approval for setup-code device pairing [AI]
- PRFix stale diagnostic lanes for reply runs
- PRfeat(telegram): localized command menu descriptions
- PRgateway: pass Talk session scope to resolver [AI]
- PR[Fix] Carry transcript update sequence
- PRfix: restore Codex cron automation compatibility
- PRfix: route plugin LLM completions through Codex runtime
- PR[AI-assisted] fix(plugins): discover setup provider env vars
- PRRoute Codex message tool replies back to WebChat and TUI
- PRfix(onboard): forward provider auth flags through wizard
- PRfix(gateway): suppress startup liveness warnings
- PRfix(migrate): drop trailing periods from migrate item messages
- PRfix(browser): request admin scope for CLI control
- PRFix/weixin catalog update 2.4.3
- PRFix Telegram polling ingress under event-loop stalls
- PRFix Telegram cron HTML announce formatting
- PRFix subagent default model precedence
- PRfix(telegram): skip unmentioned group media before download
- PRHandle generic provider internal errors
- PRfeat(session): raise maxPingPongTurns ceiling from 5 to 20 (#52382)
- PRfeat(slack): add replyBroadcast parameter for thread reply channel broadcast
- PRfix(exec): skip heartbeat wake for subagent sessions
- PRfeat(tools): per-sender tool capability tiers via toolsBySender
- PR[Feat] expose session lineage metadata
- PR[Feat] Add upload archive install RPC
- PR[Feat] Add single-job cron get path
- PRfix(ui): prevent webchat sends into isolated heartbeat sessions
- PRdocs(subagents): document announce timeout
- PRControl UI/sessions: nest subagent sessions under parent with visual prefix
- PREnable realtime Talk instructions config
- PRfix(agents): preserve active exec references across compaction
- PRbuild(pnpm): upgrade workspace to pnpm 11
- PRfix(agents): forward explicit per-run timeout to LLM idle watchdog
- PRAdd /context map treemap
- PRfix(runtime): detect Fly Machines as containers
- PR[security] redact persisted tool result details
- PRchore(pnpm): align pnpm 11 follow-up surfaces
- PRDocs: announce BlueBubbles to iMessage migration
- PREnforce gateway command scopes by caller context [AI]
- PRfix(qqbot): authorize approval button callbacks [AI]
- PRRecognize PowerShell -ec inline commands [AI]
- PRfix(node-pairing): replace changed pending requests [AI]
- PRfix(memory-wiki): require admin scope for ingest [AI]
- PREnforce Slack plugin approval button authorization [AI]
- PRValidate Control UI loopback retry endpoints [AI]
- PRHarden exported markdown link rendering [AI]
- PRfix(gateway): honor minimal discovery mode for wide-area DNS-SD [AI]
- PRmemory-wiki: require write scope for Obsidian search [AI]
- PRScrub streamable MCP redirect headers [AI]
- PRslack: enforce reaction notification policy [AI]
- PRfix(onboard): accept Codex auth in model check
- PRfix: surface silent model fallback failures
- PRfix: skip metadata for build-excluded bundled plugins
- PRfix(azure):Drain split provider stream frames
- PRRate limit Google Chat webhook requests [AI]
- PRfix(feishu): normalize webhook rate-limit client keys [AI]
- PRfix(auth): prevent bootstrap pairing scope changes [AI]
- PRfix(telegram): render supported HTML replies
- PREnforce inline shell wrapper payload matching [AI]
- PRPersist Docker auth profile key mount
- PRfix: detect carried exec command forms [AI]
- PRReject truncated exec approval commands [AI]
- PRRequire auth for sandbox browser CDP relay [AI]
- PRfix(telegram): fall back to root groups on empty account allowlist
- PRfix(commitments): write json output to stdout
- PRfix(whatsapp): drain debounced inbound before close
- PRAllow pnpm source updates to build OpenClaw
- PRfix(codex): keep post-tool watchdog armed
- PRfeat(imessage): add tapback reaction support as inbound agent events
- PRfix(skills): normalize backslashes in compacted skill paths on Windows
- PRfix(microsoft-foundry): replace unsafe non-null assertion in subscription lookup
- PRfix(gateway): resolve inflight deduplication race for send and poll
- PRfix(infra): keep retryAsync delays above server-supplied Retry-After
- PRfix(auto-reply): guard FOLLOWUP_QUEUES delete against late drain finally
- PRfix(gateway): clear nodeWakeById on no-registration early-return
- PRfix(feishu): accept nested schema 2 card identity
- PRfix(memory): preserve session corpus labels
- PRfix(agents): restore compaction gateway logs
- PRfix(memory-search): label session hits with sessions corpus
- PR[plugin sdk] Consolidate workflow seams and fixtures
- PR[AI-assisted] fix(providers): use llama.cpp runtime context cap
- PRfix(memory-core): cap MEMORY.md size during dreaming promotions to pr…
- PRfix(bonjour): cap advertiser restarts in a sliding window (#74209)
- PRfix(doctor): don't flag the live compatibility agent dir as orphan
- PRfix(bonjour): avoid probing watchdog repair loops
- PRFix TUI exit after gateway disconnect
- PRfix(agents): use run workspace for post-compaction context
- PRfix(agents): recover read offsets beyond EOF
- PR[plugin sdk] Add session action gateway protocol
- PRfix(memory): skip cron warnings without gateway context
- PRfix(tasks): route group acp completions through parent
- PRfix(doctor): repair managed plugin openclaw peer links
- PRfix: preserve gateway install env sources
- PRfix(doctor): surface GH_CONFIG_DIR hint when gh auth lives at a different HOME
- PRfix(cron): mark active-jobs on manual-run path to suppress transient lost marker
- PRbuild: clean up Node.js 26 deprecation warnings
- PRfix(doctor): consolidate Gateway service config panels into a single note (#80287)
- PRRedact persisted secret-shaped payloads [AI]
- PRfix(matrix): gate name-based allowlist resolution [AI]
- PRMake exec command highlighting optional
- PR[Fix] Scope session resolve store loads
- PRMirror Codex native subagents into task registry
- PRfix(yuanbao) support sourceReplyDeliveryMode: "automatic" for group chat
- PR[codex] Fix Codex app-server OAuth harness auth
- PRfix(codex): mark native tools active for diagnostics
- PRfix(browser): add pageReady to Chrome MCP existing-session status
- PR[Fix] Share streaming event envelopes
- PR[Fix] Block memory extra path symlink traversal
- PR[Fix] Cache selected channel registry lookups
- PRFix Telegram thinking status defaults
- PRExpose native tool completions to plugin hooks
- PRfix(telegram): honor force document for videos
- PR[codex] fix update v-prefixed version verify
- PRFix Telegram legacy message cache recovery
- PRfix: stabilize code-mode follow-up tool display and replay
- PRfix: honor configured media generation timeouts
- PRTelegram: keep topic context after reset boundary
- PRfix(matrix): default markdown tables to bullets across Matrix clients
- PRfix(slack): forward agent identity to draft stream initial message
- PRfix(slack): retain channel history when requireMention is false
- PRfix(doctor): case-insensitive safe-bin trusted dir matching on macOS/Windows
- PRfeat(slack): add allowBots "mentions" mode (parity with Discord)
- PRCron: honor server_error retries
- PRfix(slack): fetch fresh download URL via files.info for DM file attachments
- PRfix(slack): add mrkdwn formatting hints to messageToolHints
- PRfix(delivery): track and log silent delivery failures
- PRfix(slack): include API error details in log messages
- PRfix(agents): replace blank tool names with sentinel to prevent dispatch loops
- PRfeat(delivery): surface deliveryStatus in --json output
- PRfix(acpx): add windowsHide to MCP proxy spawn on Windows
- PRfix(gateway): restore runtime-postbuild sync in watch mode
- PRfix(gateway): reject malformed session kill paths
- PRfix(telegram): show full provider/model label for nested OpenRouter ids
- PRfix(infra): dedupe system events by (text, contextKey)
- PRfix(slack): respect dmScope when updating main session route for DMs
- PRfix(slack): honor configured ACP bindings
- PRfix(slack): make download-file fileId requirement self-evident to LLMs
- PRfix(moonshot): accept moonshotai/<model> as direct-API alias
- PRfix(slack): harden thread continuation gating
- PRfix(gateway): redact fast-path console logs
- PRfix(exec-approvals): lazy-load command explainer
- PRfix(whatsapp): downgrade recovered watchdog disconnects
- PRfix(feishu): keep group_topic message-tool replies inside the topic
- PRfix(browser): extend existing-session status probe
- PRfix(telegram): keep no-response DM turns quiet (no silent-reply rewrite)
- PR[Fix] Remove reverted plugin allow entries
- PRFix agent model override gateway scope
- PR[AI-assisted] fix(whatsapp): delta repeated tool preambles
- PRfix(whatsapp): pass routing ctx to transcribeFirstAudio so echoTranscript can deliver (#79778)
- PRfix: handle Telegram select callbacks safely
- PRfix(slack): wake interactive reply sessions
- PRfix(imessage): wire reply attachments through send-rich --file (with feature gate)
- PRtest: sandbox audit-exec-surface under HOME tempdir
- PRfix(onboard): custom provider context window vs compaction floor (#79428)
- PR[codex] Map ACP thinking to advertised effort key
- PRfix(agents): surface exec failures after claimed success
- PRfix(imessage): WARN-log when private API bridge is unavailable
- PRfix(telegram): preserve debounce for partial draft fragments
- PRFix Copilot token integration identity
- PRfix(config): persist explicit default values
- PRfix(cli): return null for unknown non-plugin commands instead of suggesting plugins.allow
- PRfix(doctor): invalidate persisted plugin registry when a diagnostic source path no longer exists
- PRfix(codex): normalize thread id/sessionId cross-fill before schema validation
- PR[Fix] Wait for Pi abort settle before cleanup
- PRSupport Kimi Anthropic thinking streams
- PRfix(plugins): retry npm alias override installs
- PRDisable non-POSIX command approval highlights
- PRfix: abort generic no-progress tool loops
- PRTelegram: keep verbose tool results separate from final answers
- PRfix: enable native require fast path on Windows for plugin-sdk root alias