OpenClaw

OpenClaw starts preserving session location across gateway restarts

OpenClaw proposes storing the session working directory in transcripts so gateway recovery does not reopen work in the wrong place. Related upgrade repair and voice-stream routing changes put persistent state and externally exposed runtime paths under the same recovery scrutiny.

← Back to homeOriginal source ↗

openclaw/openclaw PR #125484 is the inspected primary source: “fix(gateway): persist session cwd in transcript.” The related records below were inspected as supporting context rather than independent confirmation.

The facts

- openclaw/openclaw PR #125484 was created 2026-08-18T00:50:44Z and was open at inspection; its title is “fix(gateway): persist session cwd in transcript.” - openclaw/openclaw PR #125483 was created 2026-08-18T00:41:41Z and was open at inspection; its title is “fix(upgrade): repair stable state before gateway startup.” - openclaw/openclaw PR #125468 was created 2026-08-18T00:13:19Z and was open at inspection; its title is “fix(voice-call): expose realtime/streaming stream paths through tailscale serve/funnel.” - The repository reported 386563 stars, 5684 open issues, default branch main, and last push 2026-08-18T00:59:54Z. - The latest tagged-release baseline checked was v2026.8.1-beta.2 published 2026-08-15T05:36:23Z.

What changed

openclaw/openclaw PR #125484 reports: What Problem This Solves sessions.create could return and persist the requested spawnedCwd / sessionRoot while initializing the durable transcript header with the Gateway process cwd. The split was visible when an operator selected an existing managed worktree, used permissionMode: "full", and started the first turn in the same RPC: the session row said one cwd while the transcript recorded another. This is the atomic-creation variant of the workspace-isolation invariant previously discussed in #49523. Why This Change Was Made The session creation owner already has the fully prepared runtime cwd after lifecycle/worktree preparation. It now computes that value once (spawnedCwd?? sessionRoot) and passes it to both the session entry and createSessionEntryWithTranscript, so the row and transcript header commit the same fact. The repair adds no downstream guard, fallback stack, config surface, migration, or schema change. User Impact New sessions opened in a selected folder or existing managed worktree now record that location durably from creation. The initial model turn and later sessions.send turns continue from the same cwd, including full-permission coding sessions. Release-note context: fix session creation so selected worktree/folder cwd is preserved consistently across the initial transcript and follow-up turns. Evidence Pre-fix focused reproduction failed because the transcript session header contained the source/Gateway checkout instead of the requested managed

openclaw/openclaw PR #125483 reports: Summary repair the two stable-authored retired config keys under the startup migration lease before strict Gateway validation preserve the existing writable SQLite additive migration as the canonical schema owner keep status read-only while reporting migration-required task history instead of leaking a raw SQLite error let backup discover workspaces from a validated in-memory compatibility view while archiving the original config bytes Root cause Stable 2026.7.1-2 wrote meta.lastTouchedAt and agents.*.heartbeat.skipWhenBusy. Main rejected those keys before Gateway startup could reach the writable state migration that adds task_runs.tool_use_count. Read-only status still selected the current column from the older schema, and backup stopped at strict config validation. The migration primitives were already correct; the missing invariant was ordered admission into them. Safety Automatic repair is limited to the two known stable-authored paths. It refuses includes, unrelated validation errors, read/write drift, and ambiguous ownership. The config mutation uses the canonical conflict-checked writer under the startup lease, and the later drift guard accepts only the exact expected transition. No schema-version bump or historical SQLite fallback reader is added. Verification Exact pre-fix stable-state reproduction: CrabBox run Exact-head focused suite: 6 files, 182 tests passed pnpm check passed after implementation and before the final clean rebase onto two newly landed main commits Final rebase was conflict-free; the exact-head focused

openclaw/openclaw PR #125468 reports: What Problem This Solves Fixes an issue where operators using the voice-call plugin with Tailscale Serve or Funnel and realtime or streaming audio would see calls terminate after roughly one second because Twilio could not reach the promote WebSocket stream path. The webhook path was exposed, but the realtime and streaming WebSocket paths were not, and the failure produced no gateway warning. Why This Change Was Made Voice-call now resolves enabled realtime and streaming exposure routes as public-to-local path pairs and uses that canonical set across runtime tunnel startup, direct Tailscale setup/cleanup, and voicecall expose. Realtime routes preserve the public webhook prefix that the realtime handler promote; streaming routes mount the configured path Twilio emits. Tailscale mounts are symmetric and transactional, and an unconnected realtime stream token emits a bounded warning after its 30-second TTL. ngrok remains unchanged because it exposes the whole local port. User Impact Operators using Tailscale Serve or Funnel can now receive realtime and streaming voice calls without manually mounting extra WebSocket paths, including configurations where the public Tailscale webhook has an additional prefix. CLI exposure and cleanup cover the same paths, failed setup does not leave partial mounts behind or report false success, and a missing provider WebSocket connection is visible in logs instead of

Why it matters

A recovered session is not recovered if its filesystem context silently changes. Location, routing and startup repair all belong to the durable execution contract. The operator test is whether the system remains bounded and its receipts still describe the action after failure, retry or restart.

Current

The primary record was open when captured on 2026-08-18. The tagged-release baseline was v2026.8.1-beta.2 published 2026-08-15T05:36:23Z. Repository metadata, full source bodies, current pull requests and issues, releases, Google News, Hacker News, Lobsters, Metamesh and the rendered ClawCharts row were inspected. ClawCharts selected the subject; it did not prove the claim.

Evidence

The primary URL is https://github.com/openclaw/openclaw/pull/125484. Supporting records are https://github.com/openclaw/openclaw/pull/125483 and https://github.com/openclaw/openclaw/pull/125468. Source bodies, timestamps and states are preserved in the daily evidence bundle. Test counts and reproductions remain attributed to their authors unless identified as independently rerun.

Source boundary

Open work is described as open, closed work as closed, and operator reports as reports. A pull request is evidence of proposed or reviewed direction, not proof of a shipped release. Search residue, package mirrors and historically published source spines were excluded.

Operator take

Persist working-directory provenance with the transcript, validate it before reuse, and make startup repair fail visibly before the gateway accepts new work. Preserve a before-state receipt, make the smallest reversible change, and verify the original failure independently.

Caveat

Public project records are mutable. Status, scope and evidence can change after publication. This brief records the inspected state and does not authorize changes to a reader’s deployment.

Source inspected; source state, environment and release boundary remain explicit.