OpenClaw Weekly Dev Update: July 27 – August 2, 2026
- Commits summarized
- 3,525
- Period
- Jul 27 - Aug 02, 2026
- Published
- Aug 03, 2026
OpenClaw Weekly Dev Update: July 27 – August 2, 2026
Who should read this: Developers, self-hosters, and platform integrators tracking upstream changes to OpenClaw's agent runtime, UI, channel integrations, and CLI tooling.
This is a highlights report drawn from 200 commit summaries out of 3,525 total commits in the period. These are the most impactful changes: bug fixes, performance work, refactors to shared infrastructure, and new features that affect the developer or operator experience.
🐛 Agents & AI
Preserved native runtime controls on Codex routes
Fixes a gap where Codex routes could lose native runtime control values (fast mode aliases, cutoff settings). The change validates and preserves these controls through the route lifecycle.
- Commit b6dcb8c3 — test coverage for auth migration isolation.
- Commit 5e841bc2 — preserve Codex runtime controls, cover shipped fast cutoff aliases, and validate native runtime control values.
- Commit 8e78ee45 — clarify provider request param classifier.
Claude stall recovery preserves cache
Agents recovering from a stalled Claude response now preserve the cache state instead of starting from scratch. This avoids cold forks during recovery. Includes checkpointing of fork retries and cold-reseed handling for downgraded forks.
- Commit 5ae8a4f4 — preserve Claude cache during stalled CLI recovery, harden recovery, reject partial output, rewind to safe checkpoint.
Tool Search now uses BM25 ranking and proper tokenization
Tool Search was using fragile substring matching that made tools unreachable (e.g., "scheduling" matched nothing against "Schedule a recurring task"). Replaced with Okapi BM25 over a Unicode-aware tokenizer with stopword removal, light English stemming, and camelCase splitting. A query-expansion table maps common intents to tool vocabulary. Literal matches tier above scored expansion hits.
- Commit d413fbd8 — BM25 ranking, camelCase splitting, expansion discounting, plural normalization, trigger collision fixes.
Responses stream processing unified
Two months of divergent stream processors for the OpenAI Responses API have been unified into a single canonical pipeline. Removes obsolete helpers and trims the surface area.
- Commit fdfe5125 — unify Responses stream processing, preserve unindexed output boundaries, remove obsolete helpers.
Abort reasons preserved for restart recovery
Abort reasons (cancellation, timeout, etc.) are now preserved as codes so restart recovery logic can read a structured reason instead of guessing. Transport layers only rethrow coded abort reasons.
- Commit a348a63c — preserve abort reasons, rethrow only coded abort reasons, prove restart abort code reaches the recovery verdict.
Reduced reply delay with model policy configuration
When a model policy is configured, model selection metadata is now reused via a snapshot, avoiding redundant resolution on every reply. Covered with concurrent snapshot reuse tests.
- Commit 47d37ddd — reuse model selection metadata snapshot, cover concurrent model policy snapshot reuse.
🖥️ UI / Labs
Labs roster completed with remaining experimental gates
Labs now exposes Tool Search mode, lean local-model tools, and message audit metadata in addition to the two original entries. The registry was updated to support non-boolean gates (mode values, audit levels). Tool Search writes mode: "directory"; audit offers direct with a restart hint.
- Commit a3283af7 — complete Labs roster, mode-based gates, read-enabled overrides, restart hint for audit.
Durable session board face and dashboards index
The session "board face" preference (which view a thread opens on) is now persisted server-side in SessionEntry.boardFace, surviving device switches and session list evictions. A new /dashboards index lists threads whose preferred face is "dashboard".
- Commit 8b66fc10 — persist boardFace, add dashboards index, update Swift bindings and docs map, reject pre-rename
faceparam.
Quick Chat geometry fixes (Linux/macOS companion)
Two geometry bugs in Quick Chat: mixed coordinate spaces (pixel density mismatch between monitors) and unanchored widget growth that pushed content off-screen. Both fixed with coordinate-space re-expression and conditional re-anchoring.
- Commit 730b341f — coordinate-space fix for multi-monitor, re-anchor only on actual resize.
🐧 Linux / macOS Companion
macOS tray icon fixed
The macOS tray icon was rendering as a solid white square because the alpha-channel-only template image was opaque. A dedicated template silhouette (tray-template.svg) now renders the mascot correctly on macOS. Other platforms keep the full-color icon.
- Commit e6a6d478 — add tray-template.svg, select only on macOS.
macOS companion build restored after Quick Chat regression
The Tauri companion stopped compiling for macOS when Quick Chat landed, because WebviewWindowBuilder::transparent needs the macos-private-api feature. Now enabled alongside the matching config flag. A new per-PR macOS cargo check (upgraded to cargo test) prevents future silent breakage. Rust test suite also fixed: an outdated assertion about TLS-pinned capabilities was corrected, and an rpath is emitted for Swift runtime linking.
- Commit e94796e4 — restore macOS companion build, enable macos-private-api, add per-PR macOS cargo check, fix Swift rpath, correct TLS-pinned capabilities assertion.
Tray gateway operations serialized
Tray gateway operations (connect, disconnect, menu actions) are now serialized to prevent races when the user interacts rapidly.
- Commit de92c557 — serialize tray gateway operations.
🔌 Channels & Integrations
LINE message size limits enforced
Replies now respect LINE's hard limits on postback data length and action button URIs. Oversized actions surface fallbacks, and all action types (flex, imagemap, carousel) are normalized at builder boundaries. Limits are counted by code point, not byte.
- Commit 0c35fd57 — cap flex postback data and action URIs, surface unavailable oversized actions, normalize at builder boundaries, count by code point.
Telegram forum topics no longer answered twice
A bug caused Telegram forum topics to create duplicate conversations per topic, resulting in double replies. Fixed with doctor repair for existing duplicates. The General topic identity is also repaired.
- Commit 71eb9a3e — fix duplicate conversation per topic, repair General topic identity.
Telegram dispatch dedupe scoped by bot identity
Dispatch deduplication was global, causing cross-bot interference. Now scoped by bot identity, with a documented key cutover.
- Commit 0ac926b8 — scope dispatch dedupe by bot identity, require bot identity for dedupe, document cutover.
Discord interaction deferrals cleared on cancel
Cancelled Discord interaction defers are now properly cleared, preventing stale defers from blocking subsequent interactions.
- Commit 1b16d12b — clear cancelled interaction defers.
Thread addressing declared as a channel trait
Thread addressing is now a declared channel capability rather than being implicitly assumed. Tasks use this to gate direct parent-review delivery.
- Commit 37182b90 — declare thread addressing as channel trait, require declared capability for direct delivery, document no-target-parsing tradeoff.
Explicit-reply-tag opt-out honored
Channels can now declare they opt out of explicit reply tags. The default is stated truthfully in docs, and the reply delivery logic honors the declaration.
- Commit a2eceb9b — honor channel-declared explicit-reply-tag opt-out, update docs.
🔐 Auth & Accounts
Profile migration boot loop fixed
When a non-main agent store deliberately deduplicated an OAuth credential already owned by the main store, the migration verification treated it as data loss and aborted. This caused a boot loop: the runtime refuses to start while legacy credentials exist, and doctor --fix had just failed. Now treats deduplicated profiles as verified.
- Commit f42cb653 — treat deduped profiles as verified, break boot loop.
Assistant agent identity no longer fabricated as "main"
The assistant agent identity was hardcoded to "main" before roster resolution, causing "unknown agent id 'main'" flashes on every page reload for installs with retired main agents. Now carries no agent id until roster resolution.
- Commit bb55d448 — drop fabricated "main" agent identity, carry no agent id until roster resolves.
OpenAI onboarding models account-aware
Onboarding model lists are now filtered by the connected OpenAI account, showing only models the account has access to.
- Commit 04bb2b7e — make onboarding models account-aware.
⚡ Performance
ACP meta reads no longer scan entire session store
Every per-session ACP meta read was listing and JSON-parsing the entire session store to find one row, making sessions.list O(rows²). A profile showed 12.7s of a 78.5s window in this path. Now uses exact single-row probes, with a case-variant fallback that scans keys (not parsed entries).
- Commit 570eab59 — exact read-only probes, split store binding out of session-meta, case-variant fallback scans keys only.
Admin usage aggregation shared across providers
Admin usage aggregation logic was duplicated across provider implementations. Now shared via a common utility.
- Commit f88d6185 — share admin usage aggregation.
🛠️ CLI & Tooling
Bun runtime support
OpenClaw can now run under Bun runtimes that provide node:sqlite. Includes a workaround for Bun's rejection of non-spawn options in execa. Docs updated with caveats about Bun install workspace behavior.
- Commit a05cfd47 — allow Bun runtimes with node:sqlite, drop execa buffer encoding under Bun, cite upstream issue.
Better CI fallback when remote never ran the checks
When Blacksmith (the CI remote) is unreachable due to lease/DNS/network failures, the tooling now falls back to local execution instead of surfacing exit 1 (which looked like a failure). Uses a positive pre-dispatch signature to distinguish "never ran" from "ran and failed".
- Commit c5d6dcfc — fall back to local execution when remote never ran, require positive pre-dispatch evidence.
Control UI mock server gets cron fixtures and opt-in approval
The mock Control UI server now serves cron fixtures and requires --fixture=approval for exec approval, making development testing more realistic.
- Commit fa2b8469 — add cron fixtures.
- Commit c59d3813 — make mock exec approval opt-in via
--fixture=approval.
Escaped newline shell words rejected
The shell word parser now rejects escaped newlines in shell words, preventing a class of injection vectors.
- Commit 95f56b84 — reject escaped newline shell words.
🔄 Changelog
Noted fixes
A changelog entry was committed covering the most notable fixes in this period:
- Codex runtime controls
- WAL verification
- Model-policy latency improvements
- Claude stall-recovery fixes
Highlights from 200 of 3,525 commits in the period. For the full log, see the commit history.