Skip to content

fix(workspace): store workspace-state.json in workspace root, not .openclaw/ subdir#53326

Closed
1qh wants to merge 1 commit into
openclaw:mainfrom
1qh:fix/workspace-state-no-dot-dir
Closed

fix(workspace): store workspace-state.json in workspace root, not .openclaw/ subdir#53326
1qh wants to merge 1 commit into
openclaw:mainfrom
1qh:fix/workspace-state-no-dot-dir

Conversation

@1qh

@1qh 1qh commented Mar 24, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Moves workspace-state.json from <workspace>/.openclaw/workspace-state.json to <workspace>/workspace-state.json
  • Removes the requirement to create a dot-prefixed subdirectory inside the workspace
  • Read falls back to the legacy .openclaw/ path for existing workspaces
  • Write always uses the new root path, no mkdir for .openclaw/ subdir

Why

Dot-prefixed directories fail on filesystems that reserve them — specifically TigerFS FUSE mounts, where . prefixes are reserved for built-in operations (.build/, .history/, .filter/, etc.). This blocks using TigerFS-mounted PostgreSQL as a workspace backend.

Also addresses the nested .openclaw/.openclaw/workspace/.openclaw/ path issue reported in #44783.

Changes

1 file, 11 insertions, 3 deletions:

  • resolveWorkspaceStatePath() → returns dir/workspace-state.json (was dir/.openclaw/workspace-state.json)
  • New resolveLegacyWorkspaceStatePath() for backward-compatible reads
  • readWorkspaceSetupStateForDir() tries new path first, falls back to legacy
  • writeWorkspaceSetupState() removes mkdir for .openclaw/ subdir (workspace root already exists)

Testing

Existing workspace tests should pass. Legacy workspaces with .openclaw/workspace-state.json are read correctly via fallback.

Closes #44783
Related: #39446 (cloud storage sync issues with .openclaw directory)

@openclaw-barnacle openclaw-barnacle Bot added agents Agent runtime and tooling size: XS labels Mar 24, 2026
@greptile-apps

greptile-apps Bot commented Mar 24, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR relocates workspace-state.json from <workspace>/.openclaw/workspace-state.json to <workspace>/workspace-state.json to fix compatibility with filesystems (like TigerFS) that reserve dot-prefixed directory names. The approach is sound: writes always go to the new path, and readWorkspaceSetupStateForDir tries the new path first and falls back to the legacy path for existing workspaces.

Key findings:

  • Logic gap in ensureAgentWorkspace: ensureAgentWorkspace reads state via readWorkspaceSetupState(statePath) directly (line 399), bypassing the legacy fallback added to readWorkspaceSetupStateForDir. For existing workspaces that only have data in .openclaw/workspace-state.json, this results in an empty state being seen by the setup logic, which could cause BOOTSTRAP.md to be unexpectedly re-created on the first run after upgrading (especially in scripted/CI workspaces where the heuristic identity/user/memory checks may not fire).
  • Migration doesn't promote to the new path: When the onboardingCompletedAt → setupCompletedAt migration in readWorkspaceSetupState fires via the legacy fallback path, it writes the migrated state back to the legacy path rather than forward to the new root path. This means the workspace will continue doing two file reads on every call to readWorkspaceSetupStateForDir until some other write moves data to the new path.

Confidence Score: 3/5

  • Safe for most users, but scripted/CI workspaces could see BOOTSTRAP.md unexpectedly re-created on first run after upgrading.
  • The fallback in readWorkspaceSetupStateForDir is correct, but ensureAgentWorkspace bypasses it and reads the new (empty) path directly. For the vast majority of interactive workspaces, the legacy migration heuristic (checking modified IDENTITY.md/USER.md or presence of .git/MEMORY.md) will save them. The risk is real but narrow: a workspace that relied solely on the JSON state file and has no user-content indicators could have BOOTSTRAP.md re-seeded. The missing-mkdir removal is safe because the workspace root is always ensured before writeWorkspaceSetupState is called.
  • src/agents/workspace.ts — specifically the readWorkspaceSetupState call at line 399 inside ensureAgentWorkspace

Comments Outside Diff (2)

  1. src/agents/workspace.ts, line 399 (link)

    P2 ensureAgentWorkspace bypasses the legacy fallback

    ensureAgentWorkspace reads state via readWorkspaceSetupState(statePath) directly (new path only), while the fallback-aware reader readWorkspaceSetupStateForDir is only used by isWorkspaceSetupCompleted. This means existing workspaces that have state exclusively in .openclaw/workspace-state.json will see state = { version: 1 } here (no setupCompletedAt, no bootstrapSeededAt), and will fall through to the legacy-migration branch (lines 416–455).

    For the common case—where IDENTITY.md/USER.md have been modified or a .git dir/MEMORY.md exists—the migration heuristic will correctly set setupCompletedAt. However, for a workspace where the user never touched those files but setup was previously recorded only via the JSON state (e.g. a CI or scripted workspace), BOOTSTRAP.md would be unexpectedly re-created on the next run after upgrading.

    The fix is to use readWorkspaceSetupStateForDir here (returning the resolved dir too) or to inline the same try-legacy fallback:

    let state = await readWorkspaceSetupStateForDir(rawDir);

    Since dir is already the resolved path, you'd need to expose a helper that accepts the pre-resolved path, or simply inline the two-path read pattern.

    Prompt To Fix With AI
    This is a comment left during a code review.
    Path: src/agents/workspace.ts
    Line: 399
    
    Comment:
    **`ensureAgentWorkspace` bypasses the legacy fallback**
    
    `ensureAgentWorkspace` reads state via `readWorkspaceSetupState(statePath)` directly (new path only), while the fallback-aware reader `readWorkspaceSetupStateForDir` is only used by `isWorkspaceSetupCompleted`. This means existing workspaces that have state exclusively in `.openclaw/workspace-state.json` will see `state = { version: 1 }` here (no `setupCompletedAt`, no `bootstrapSeededAt`), and will fall through to the legacy-migration branch (lines 416–455).
    
    For the common case—where `IDENTITY.md`/`USER.md` have been modified or a `.git` dir/`MEMORY.md` exists—the migration heuristic will correctly set `setupCompletedAt`. However, for a workspace where the user never touched those files but setup was previously recorded only via the JSON state (e.g. a CI or scripted workspace), `BOOTSTRAP.md` would be unexpectedly re-created on the next run after upgrading.
    
    The fix is to use `readWorkspaceSetupStateForDir` here (returning the resolved dir too) or to inline the same try-legacy fallback:
    
    ```typescript
    let state = await readWorkspaceSetupStateForDir(rawDir);
    ```
    
    Since `dir` is already the resolved path, you'd need to expose a helper that accepts the pre-resolved path, or simply inline the two-path read pattern.
    
    How can I resolve this? If you propose a fix, please make it concise.
  2. src/agents/workspace.ts, line 248 (link)

    P2 Legacy-path migration doesn't forward to the new root path

    When readWorkspaceSetupState is invoked via the fallback in readWorkspaceSetupStateForDir (i.e. statePath is the old .openclaw/workspace-state.json), the onboardingCompletedAt → setupCompletedAt migration re-writes back to the legacy path. The new workspace-state.json at the workspace root is never created in this code path, so every subsequent read still goes through the two-file fallback until something else triggers a write (e.g. ensureAgentWorkspace).

    Consider promoting the migrated state to the new path here, or ensuring that readWorkspaceSetupStateForDir writes a copy to the new path after a successful legacy read.

    Prompt To Fix With AI
    This is a comment left during a code review.
    Path: src/agents/workspace.ts
    Line: 248
    
    Comment:
    **Legacy-path migration doesn't forward to the new root path**
    
    When `readWorkspaceSetupState` is invoked via the fallback in `readWorkspaceSetupStateForDir` (i.e. `statePath` is the old `.openclaw/workspace-state.json`), the `onboardingCompletedAt → setupCompletedAt` migration re-writes back to the legacy path. The new `workspace-state.json` at the workspace root is never created in this code path, so every subsequent read still goes through the two-file fallback until something else triggers a write (e.g. `ensureAgentWorkspace`).
    
    Consider promoting the migrated state to the new path here, or ensuring that `readWorkspaceSetupStateForDir` writes a copy to the new path after a successful legacy read.
    
    How can I resolve this? If you propose a fix, please make it concise.
Prompt To Fix All With AI
This is a comment left during a code review.
Path: src/agents/workspace.ts
Line: 399

Comment:
**`ensureAgentWorkspace` bypasses the legacy fallback**

`ensureAgentWorkspace` reads state via `readWorkspaceSetupState(statePath)` directly (new path only), while the fallback-aware reader `readWorkspaceSetupStateForDir` is only used by `isWorkspaceSetupCompleted`. This means existing workspaces that have state exclusively in `.openclaw/workspace-state.json` will see `state = { version: 1 }` here (no `setupCompletedAt`, no `bootstrapSeededAt`), and will fall through to the legacy-migration branch (lines 416–455).

For the common case—where `IDENTITY.md`/`USER.md` have been modified or a `.git` dir/`MEMORY.md` exists—the migration heuristic will correctly set `setupCompletedAt`. However, for a workspace where the user never touched those files but setup was previously recorded only via the JSON state (e.g. a CI or scripted workspace), `BOOTSTRAP.md` would be unexpectedly re-created on the next run after upgrading.

The fix is to use `readWorkspaceSetupStateForDir` here (returning the resolved dir too) or to inline the same try-legacy fallback:

```typescript
let state = await readWorkspaceSetupStateForDir(rawDir);
```

Since `dir` is already the resolved path, you'd need to expose a helper that accepts the pre-resolved path, or simply inline the two-path read pattern.

How can I resolve this? If you propose a fix, please make it concise.

---

This is a comment left during a code review.
Path: src/agents/workspace.ts
Line: 248

Comment:
**Legacy-path migration doesn't forward to the new root path**

When `readWorkspaceSetupState` is invoked via the fallback in `readWorkspaceSetupStateForDir` (i.e. `statePath` is the old `.openclaw/workspace-state.json`), the `onboardingCompletedAt → setupCompletedAt` migration re-writes back to the legacy path. The new `workspace-state.json` at the workspace root is never created in this code path, so every subsequent read still goes through the two-file fallback until something else triggers a write (e.g. `ensureAgentWorkspace`).

Consider promoting the migrated state to the new path here, or ensuring that `readWorkspaceSetupStateForDir` writes a copy to the new path after a successful legacy read.

How can I resolve this? If you propose a fix, please make it concise.

Reviews (1): Last reviewed commit: "fix(workspace): store workspace-state.js..." | Re-trigger Greptile

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 5de40ea1fa

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/agents/workspace.ts
@@ -204,6 +204,10 @@ async function fileExists(filePath: string): Promise<boolean> {
}

function resolveWorkspaceStatePath(dir: string): string {
return path.join(dir, WORKSPACE_STATE_FILENAME);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve legacy state when moving workspace state path

Changing resolveWorkspaceStatePath to <workspace>/workspace-state.json means ensureAgentWorkspace now reads only the new location, so legacy completion markers in <workspace>/.openclaw/workspace-state.json are ignored during initialization. In legacy workspaces where IDENTITY.md/USER.md are still template-default and there is no .git or memory indicator (for example when git was unavailable during original setup), the migration heuristics will treat the workspace as new and recreate BOOTSTRAP.md, effectively regressing a previously completed setup; loading with legacy fallback (or migrating legacy state before bootstrap decisions) avoids this.

Useful? React with 👍 / 👎.

@1qh
1qh force-pushed the fix/workspace-state-no-dot-dir branch from 5de40ea to b8e5eae Compare March 24, 2026 03:05

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: b8e5eae26c

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/agents/workspace.ts
Comment on lines 206 to +207
function resolveWorkspaceStatePath(dir: string): string {
return path.join(dir, WORKSPACE_STATE_FILENAME);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Use a namespaced state filename in workspace root

Storing state at path.join(dir, "workspace-state.json") can clobber an existing project file with the same name. In ensureAgentWorkspace, a non-OpenClaw JSON file at that path is parsed as an empty state (no markers) and then overwritten once bootstrap/setup markers are persisted, which creates a concrete data-loss path for repositories that already use workspace-state.json. Please namespace the filename (or detect and skip foreign files) before writing.

Useful? React with 👍 / 👎.

@1qh
1qh force-pushed the fix/workspace-state-no-dot-dir branch from b8e5eae to 6deb670 Compare March 24, 2026 03:46

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 6deb670138

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/agents/workspace.ts
@@ -389,6 +397,9 @@ export async function ensureAgentWorkspace(params?: {
await writeFileIfMissing(heartbeatPath, heartbeatTemplate);

let state = await readWorkspaceSetupState(statePath);
if (!state.setupCompletedAt && !state.bootstrapSeededAt) {
state = await readWorkspaceSetupState(resolveLegacyWorkspaceStatePath(dir));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Treat legacy state lookup as best-effort

This fallback read can break the very filesystems this change targets: when the new root state has no markers (including first run), it immediately reads .openclaw/workspace-state.json, but readWorkspaceSetupState only swallows ENOENT and rethrows other I/O errors. On dot-restricted backends (e.g., TigerFS-style reserved . paths), that legacy read can raise EPERM/EINVAL, aborting ensureAgentWorkspace before the new root state is persisted. Please catch and ignore non-ENOENT legacy lookup failures (or otherwise make legacy probing optional) so initialization can proceed using the new path.

Useful? React with 👍 / 👎.

@1qh

1qh commented Mar 24, 2026

Copy link
Copy Markdown
Contributor Author

Thanks for the review! Two responses:

Legacy fallback: Already handled — readWorkspaceSetupStateForDir() and ensureAgentWorkspace both fall back to the legacy .openclaw/workspace-state.json path if the new root-level file doesn't have markers. See the updated diff.

Namespaced filename: Considered using .openclaw-state.json (dot-prefixed file) but TigerFS rejects ALL dot-prefixed entries (files AND directories), not just directories. Using workspace-state.json in the root is the simplest approach. Name collision risk is low since this is OpenClaw's managed workspace directory, not a general-purpose project root. If collision avoidance is preferred, we could use _openclaw-state.json (underscore prefix) — TigerFS allows underscores.

@1qh
1qh force-pushed the fix/workspace-state-no-dot-dir branch from 6deb670 to 6ced9ff Compare March 24, 2026 17:24

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 6ced9ff7ee

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/agents/workspace.ts
Comment on lines +400 to +401
if (!state.setupCompletedAt && !state.bootstrapSeededAt) {
state = await readWorkspaceSetupState(resolveLegacyWorkspaceStatePath(dir));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Persist migrated legacy state at the new root path

When fallback reads state from resolveLegacyWorkspaceStatePath(dir) here, stateDirty is still false, so the later if (stateDirty) write never creates <workspace>/workspace-state.json. That means existing workspaces keep depending on .openclaw/workspace-state.json, and if that dot-prefixed directory is omitted or unsupported on the target filesystem, setup markers are lost and ensureAgentWorkspace can reclassify a completed workspace as uninitialized. Please mark fallback-loaded legacy state as dirty (or explicitly write it) to complete migration.

Useful? React with 👍 / 👎.

…enclaw/ subdir

Moves workspace-state.json from <workspace>/.openclaw/workspace-state.json
to <workspace>/workspace-state.json. This removes the requirement to create
a dot-prefixed subdirectory inside the workspace, which fails on filesystems
that reserve dot-prefixed paths (e.g., TigerFS FUSE mounts).

Read falls back to the legacy .openclaw/ path for existing workspaces.
Write always uses the new root path.

Closes openclaw#44783
@1qh
1qh force-pushed the fix/workspace-state-no-dot-dir branch from 6ced9ff to ac72618 Compare March 29, 2026 20:47

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: ac726188df

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread src/agents/workspace.ts
if (state.setupCompletedAt || state.bootstrapSeededAt) {
return state;
}
return await readWorkspaceSetupState(resolveLegacyWorkspaceStatePath(resolved));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Make legacy fallback read best-effort for status checks

readWorkspaceSetupStateForDir now unconditionally probes the legacy .openclaw/workspace-state.json when the new root file has no markers (the common first-run state), but readWorkspaceSetupState only suppresses ENOENT and rethrows other I/O errors. On dot-restricted filesystems (the same environment this change targets), that legacy probe can raise EPERM/EINVAL, causing isWorkspaceSetupCompleted to throw instead of returning a status; callers like agents.files.list then fall back to hideBootstrap=false, so completed workspaces can be misclassified and shown with BOOTSTRAP again. The legacy probe should be treated as best-effort and ignored on non-ENOENT legacy-path errors.

Useful? React with 👍 / 👎.

@openclaw-barnacle

Copy link
Copy Markdown

This pull request has been automatically marked as stale due to inactivity.
Please add updates or it will be closed.

@openclaw-barnacle openclaw-barnacle Bot added the stale Marked as stale due to inactivity label Apr 29, 2026
@clawsweeper

clawsweeper Bot commented Apr 29, 2026

Copy link
Copy Markdown
Contributor

Thanks for the context here. I swept through the related work, and this is now duplicate or superseded.

Current main and the latest release still use the nested workspace state path, so this PR is not obsolete. The branch remains useful but not merge-ready because the diff still has compatibility/session-state defects, no after-fix real environment proof, and needs a rebase across later workspace bootstrap work.

Canonical path: Close this PR as superseded by #71230.

So I’m closing this here and keeping the remaining discussion on #71230.

Review details

Best possible solution:

Close this PR as superseded by #71230.

Do we have a high-confidence way to reproduce the issue?

Yes for the source-level behavior: current main and v2026.5.22 still resolve and test setup state under <workspace>/.openclaw/workspace-state.json, and the PR head still has the fallback/migration defects by inspection. I did not live-run TigerFS in this read-only review, so the filesystem-specific failure remains discussion-backed rather than directly reproduced here.

Is this the best way to solve the issue?

No. The goal is the right implementation area, but this patch needs a safer filename/collision policy, best-effort legacy probing, legacy-state promotion, and a current-main rebase before it is the maintainable fix.

Security review:

Security review cleared: The diff changes workspace setup-state file placement only and does not introduce dependency, CI, permission, secret-handling, package execution, or artifact-download risk.

What I checked:

  • linked superseding PR: fix(agents): repair stale bootstrap completion #71230 (fix(agents): repair stale bootstrap completion) is merged at 2026-04-24T22:41:11Z.
  • cluster evidence: the durable review links that PR in the work cluster or recommended risk path.
  • no human follow-up: live comments and timeline hydrated by apply contain no non-automation activity after the ClawSweeper review.

Likely related people:

  • gumadeiras: Commit 28b78b25b721 introduced workspace setup-state persistence and the nested state resolver now being changed. (role: introduced behavior; confidence: high; commits: 28b78b25b721; files: src/agents/workspace.ts)
  • Patrick-Erichsen: Merged PR fix(agents): repair stale bootstrap completion #71230 repaired stale workspace bootstrap completion in the same state lifecycle and added focused tests. (role: recent adjacent contributor; confidence: medium; commits: 137f5c3a8b3c; files: src/agents/workspace.ts, src/agents/workspace.test.ts)
  • steipete: Path history and shortlog show repeated recent maintenance of src/agents/workspace.ts and src/agents/workspace.test.ts, with the highest commit count in the sampled workspace files. (role: recent area contributor; confidence: medium; commits: de022bb69dde; files: src/agents/workspace.ts, src/agents/workspace.test.ts)

Codex review notes: model gpt-5.5, reasoning high; reviewed against 996d07ee466c.

@clawsweeper

clawsweeper Bot commented Apr 29, 2026

Copy link
Copy Markdown
Contributor

Codex review: found issues before merge.

What this changes:

The PR changes src/agents/workspace.ts to write workspace setup state at <workspace>/workspace-state.json, fallback-read legacy <workspace>/.openclaw/workspace-state.json, and stop creating the dot-prefixed state directory.

Maintainer follow-up before merge:

This is an open implementation PR with blocking review findings plus a maintainer-facing product/data-loss choice around the root state filename; the next step is maintainer review or author revision, not an autonomous replacement PR.

Review findings:

  • [P1] Make legacy state probes best-effort — src/agents/workspace.ts:269
  • [P2] Avoid overwriting foreign workspace-state files — src/agents/workspace.ts:207
  • [P2] Promote fallback state to the new location — src/agents/workspace.ts:401
Review details

Best possible solution:

Revise this PR around the same goal: keep workspace setup state out of dot-prefixed workspace entries, choose a collision-resistant non-dot filename or detect foreign files before writing, treat legacy dot-path probes as best-effort, promote successfully loaded legacy state to the new location, and add focused tests for first-run, legacy migration, collision handling, and dot-path I/O failures.

Full review comments:

  • [P1] Make legacy state probes best-effort — src/agents/workspace.ts:269
    readWorkspaceSetupStateForDir now probes .openclaw/workspace-state.json whenever the new root file has no markers, but readWorkspaceSetupState() rethrows non-ENOENT errors. On the dot-restricted filesystems this PR targets, that can make status checks and initialization fail before the new root state is created; catch and ignore legacy-probe I/O errors in the fallback paths.
    Confidence: 0.91
  • [P2] Avoid overwriting foreign workspace-state files — src/agents/workspace.ts:207
    Writing OpenClaw state to <workspace>/workspace-state.json can clobber a project file with the same generic name. If that file parses without OpenClaw markers, the setup flow treats it as empty state and later overwrites it, so use a safer non-dot name or detect foreign files before writing.
    Confidence: 0.88
  • [P2] Promote fallback state to the new location — src/agents/workspace.ts:401
    When ensureAgentWorkspace loads state from the legacy path, stateDirty remains false, so the later write never creates the new root state file. Existing workspaces keep depending on the dot-prefixed directory and can lose completion markers if that directory is unavailable; persist fallback-loaded state to the new path.
    Confidence: 0.86

Overall correctness: patch is incorrect
Overall confidence: 0.9

Acceptance criteria:

  • pnpm test src/agents/workspace.test.ts
  • pnpm exec oxfmt --check --threads=1 src/agents/workspace.ts src/agents/workspace.test.ts
  • pnpm check:changed in Testbox before handoff if the PR is revised

What I checked:

Likely related people:

  • gumadeiras: Commit metadata shows 28b78b25b721 introduced workspace setup-state persistence, the state constants, and the resolver behavior now being changed. (role: introduced behavior; confidence: high; commits: 28b78b25b721; files: src/agents/workspace.ts)
  • steipete: Recent GitHub path history shows repeated maintenance in src/agents/workspace.ts, src/agents/workspace.test.ts, and src/agents/workspace-default.ts, including workspace import trimming and setup wizard refactors; recent path counts are dominated by Peter Steinberger. (role: recent maintainer; confidence: medium; commits: 3db60f7eab84, 656848dcd7d0, 242188b7b14c; files: src/agents/workspace.ts, src/agents/workspace.test.ts, src/agents/workspace-default.ts)
  • Patrick-Erichsen: Merged fix(agents): repair stale bootstrap completion #71230 recently repaired stale bootstrap completion and added focused tests in the same workspace setup-state path that this PR needs to rebase across. (role: adjacent owner; confidence: medium; commits: 137f5c3a8b3c; files: src/agents/workspace.ts, src/agents/workspace.test.ts)

Remaining risk / open question:

  • The final non-dot filename or foreign-file policy needs maintainer judgment because workspace-state.json is a generic root filename inside a user-visible workspace.
  • The PR head predates later workspace bootstrap repairs on main, especially fix(agents): repair stale bootstrap completion #71230, so a rebase needs behavior review around stale bootstrap reconciliation.
  • This review verified the dot-restricted failure path from code and PR discussion, not with a live TigerFS mount; regression tests should mock non-ENOENT legacy dot-path failures.

Codex review notes: model gpt-5.5, reasoning high; reviewed against e46dccb35374.

@openclaw-barnacle openclaw-barnacle Bot removed the stale Marked as stale due to inactivity label Apr 30, 2026
@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. P2 Normal backlog priority with limited blast radius. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. labels May 19, 2026
@openclaw-barnacle openclaw-barnacle Bot added the triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. label May 19, 2026
@clawsweeper clawsweeper Bot added the merge-risk: 🚨 session-state 🚨 May lose, corrupt, stale, or mis-associate session, agent, or context state. label May 19, 2026
@clawsweeper

clawsweeper Bot commented May 20, 2026

Copy link
Copy Markdown
Contributor

ClawSweeper PR egg

🎁 Pass real behavior proof to wake the egg and unlock a hatchable treat.

Where did the egg go?
  • The egg game starts only after the PR passes the real-behavior proof check.
  • Before that, no creature or rarity is rolled. The treat waits for real proof.
  • This is still just collectible flavor: proof affects review readiness, not creature quality.

@clawsweeper

clawsweeper Bot commented May 24, 2026

Copy link
Copy Markdown
Contributor

ClawSweeper applied the proposed close for this PR.

eleboucher pushed a commit to eleboucher/homelab that referenced this pull request Jun 16, 2026
…26.6.8) (#1144)

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [ghcr.io/openclaw/openclaw](https://openclaw.ai) ([source](https://github.com/openclaw/openclaw)) | patch | `2026.6.6` → `2026.6.8` |

---

### Release Notes

<details>
<summary>openclaw/openclaw (ghcr.io/openclaw/openclaw)</summary>

### [`v2026.6.8`](https://github.com/openclaw/openclaw/blob/HEAD/CHANGELOG.md#202668)

[Compare Source](openclaw/openclaw@v2026.6.6...v2026.6.8)

##### Highlights

- Telegram and WhatsApp channel delivery are richer and less brittle: Telegram can send structured rich text with tables, lists, expandable blockquotes, prompt-preserving CLI backend delivery, retired native draft migration, and safer rich-media boundaries, while WhatsApp now honors configured ACP bindings. ([#&#8203;92679](openclaw/openclaw#92679), [#&#8203;84082](openclaw/openclaw#84082), [#&#8203;89421](openclaw/openclaw#89421), [#&#8203;92513](openclaw/openclaw#92513)) Thanks [@&#8203;obviyus](https://github.com/obviyus), [@&#8203;jzakirov](https://github.com/jzakirov), [@&#8203;spacegeologist](https://github.com/spacegeologist), and [@&#8203;TurboTheTurtle](https://github.com/TurboTheTurtle).
- Agent and Gateway recovery is sharper across account-scoped DM sends, generated media completions, restart shutdown aborts, yielded subagent pauses, yielded cron media, heartbeat dedupe, session identity prompts, and unknown OpenAI agent selector rejection. ([#&#8203;92788](openclaw/openclaw#92788), [#&#8203;91246](openclaw/openclaw#91246), [#&#8203;91357](openclaw/openclaw#91357), [#&#8203;92631](openclaw/openclaw#92631), [#&#8203;92146](openclaw/openclaw#92146), [#&#8203;91287](openclaw/openclaw#91287), [#&#8203;92468](openclaw/openclaw#92468), [#&#8203;92510](openclaw/openclaw#92510)) Thanks [@&#8203;yetval](https://github.com/yetval), [@&#8203;TurboTheTurtle](https://github.com/TurboTheTurtle), [@&#8203;ooiuuii](https://github.com/ooiuuii), [@&#8203;openperf](https://github.com/openperf), [@&#8203;IWhatsskill](https://github.com/IWhatsskill), [@&#8203;ZengWen-DT](https://github.com/ZengWen-DT), and [@&#8203;zhangguiping-xydt](https://github.com/zhangguiping-xydt).
- Provider/model handling expands and tightens with GLM-5.2, Claude Haiku 4.5 catalog rows, OpenRouter and Google Vertex provider-prefix normalization, managed SecretRef auth, bounded model browse discovery, storeless OpenAI Responses replay gating, and Claude 4.5 Copilot tool-streaming safety. ([#&#8203;92796](openclaw/openclaw#92796), [#&#8203;90116](openclaw/openclaw#90116), [#&#8203;92627](openclaw/openclaw#92627), [#&#8203;91218](openclaw/openclaw#91218), [#&#8203;90686](openclaw/openclaw#90686), [#&#8203;92247](openclaw/openclaw#92247), [#&#8203;90706](openclaw/openclaw#90706), [#&#8203;75393](openclaw/openclaw#75393)) Thanks [@&#8203;arkyu2077](https://github.com/arkyu2077), [@&#8203;liuhao1024](https://github.com/liuhao1024), [@&#8203;bymle](https://github.com/bymle), [@&#8203;rohitjavvadi](https://github.com/rohitjavvadi), [@&#8203;samson910022](https://github.com/samson910022), [@&#8203;snowzlm](https://github.com/snowzlm), and [@&#8203;Kailigithub](https://github.com/Kailigithub).
- `/usage` and reply payload hooks now have a native full footer renderer, default template, fixed-decimal formatting, credential-aware limits, better partial-count handling, and warnings for broken templates instead of silent bad output. ([#&#8203;92657](openclaw/openclaw#92657), [#&#8203;89835](openclaw/openclaw#89835), [#&#8203;89629](openclaw/openclaw#89629)) Thanks [@&#8203;Marvinthebored](https://github.com/Marvinthebored).
- UI and mobile flows are steadier: workspace files can collapse and start collapsed, WebChat backscroll survives streaming, the sidebar session picker remains interactive above the desktop workbench, reset soft args survive UI dispatch, stale dashboard session parent lineage is preserved, and iOS reconnects stale foreground gateways. ([#&#8203;92779](openclaw/openclaw#92779), [#&#8203;92622](openclaw/openclaw#92622), [#&#8203;92705](openclaw/openclaw#92705), [#&#8203;91353](openclaw/openclaw#91353), [#&#8203;90658](openclaw/openclaw#90658), [#&#8203;92552](openclaw/openclaw#92552)) Thanks [@&#8203;shakkernerd](https://github.com/shakkernerd), [@&#8203;TurboTheTurtle](https://github.com/TurboTheTurtle), [@&#8203;NianJiuZst](https://github.com/NianJiuZst), [@&#8203;zhouhe-xydt](https://github.com/zhouhe-xydt), [@&#8203;luoyanglang](https://github.com/luoyanglang), and [@&#8203;Solvely-Colin](https://github.com/Solvely-Colin).
- Memory, state, and diagnostics recover cleaner: oversized OpenAI embedding batches split before 431s, QMD memory search stays available in transient mode, SQLite avoids WAL on NFS state volumes, stuck-session recovery scheduling no longer resets warning backoff, and Infinity chunk limits stay genuinely unbounded. ([#&#8203;92650](openclaw/openclaw#92650), [#&#8203;92618](openclaw/openclaw#92618), [#&#8203;92639](openclaw/openclaw#92639), [#&#8203;91247](openclaw/openclaw#91247), [#&#8203;92752](openclaw/openclaw#92752), [#&#8203;92735](openclaw/openclaw#92735)) Thanks [@&#8203;mushuiyu886](https://github.com/mushuiyu886), [@&#8203;TurboTheTurtle](https://github.com/TurboTheTurtle), [@&#8203;849261680](https://github.com/849261680), [@&#8203;gnanam1990](https://github.com/gnanam1990), and [@&#8203;yhterrance](https://github.com/yhterrance).

##### Changes

- Providers/models: add GLM-5.2 support and Claude Haiku 4.5 catalog entries while keeping provider-qualified model IDs normalized across OpenRouter and Google Vertex paths. ([#&#8203;92796](openclaw/openclaw#92796), [#&#8203;90116](openclaw/openclaw#90116), [#&#8203;92627](openclaw/openclaw#92627), [#&#8203;91218](openclaw/openclaw#91218)) Thanks [@&#8203;arkyu2077](https://github.com/arkyu2077), [@&#8203;liuhao1024](https://github.com/liuhao1024), and [@&#8203;bymle](https://github.com/bymle).
- Channel plugins: ship Telegram rich-message delivery and WhatsApp ACP binding support, including rich prompt handoff to CLI backends and transport fixtures for richer drafts. ([#&#8203;92679](openclaw/openclaw#92679), [#&#8203;92513](openclaw/openclaw#92513)) Thanks [@&#8203;obviyus](https://github.com/obviyus) and [@&#8203;TurboTheTurtle](https://github.com/TurboTheTurtle).
- Agent commands: support `/btw` in CLI-backed sessions and keep CLI usage-error exits classified as usage failures instead of successful runs. ([#&#8203;92669](openclaw/openclaw#92669), [#&#8203;92162](openclaw/openclaw#92162)) Thanks [@&#8203;joshavant](https://github.com/joshavant) and [@&#8203;Pandah97](https://github.com/Pandah97).
- Usage hooks: add built-in full footer rendering, default footer templates, per-turn usage state, credential-aware limits, and fixed-decimal formatting for usage-bar templates. ([#&#8203;92657](openclaw/openclaw#92657), [#&#8203;89835](openclaw/openclaw#89835), [#&#8203;89629](openclaw/openclaw#89629)) Thanks [@&#8203;Marvinthebored](https://github.com/Marvinthebored).
- Docs and operator guidance: document node config examples, clarify before-install hook scope, correct agent default concurrency comments, refresh ZAI provider docs, and update channel/group docs for current Telegram and WhatsApp behavior. ([#&#8203;92677](openclaw/openclaw#92677), [#&#8203;92766](openclaw/openclaw#92766), [#&#8203;92695](openclaw/openclaw#92695)) Thanks [@&#8203;liuhao1024](https://github.com/liuhao1024), [@&#8203;sallyom](https://github.com/sallyom), and [@&#8203;ArielSmoliar](https://github.com/ArielSmoliar).

##### Fixes

- Onboarding/skills: show the Homebrew install recommendation only on macOS and Linux, so FreeBSD and other unsupported platforms no longer get a misleading brew prompt. Fixes [#&#8203;68893](openclaw/openclaw#68893); carries forward [#&#8203;68894](openclaw/openclaw#68894), [#&#8203;68910](openclaw/openclaw#68910), [#&#8203;68941](openclaw/openclaw#68941), [#&#8203;68943](openclaw/openclaw#68943), [#&#8203;69002](openclaw/openclaw#69002), and [#&#8203;69545](openclaw/openclaw#69545). Thanks [@&#8203;yurivict](https://github.com/yurivict), [@&#8203;Sanjays2402](https://github.com/Sanjays2402), [@&#8203;Eruditi](https://github.com/Eruditi), [@&#8203;JustInCache](https://github.com/JustInCache), [@&#8203;nnish16](https://github.com/nnish16), and [@&#8203;Mlightsnow](https://github.com/Mlightsnow).
- Channels and delivery: preserve account-scoped DM channel send policy, rich Telegram final replies, rich Telegram tables and lists, Telegram thread-create CLI remapping, Slack outbound `message_sent` hooks, contributed message-tool schema optionality, same-channel generated media completions, and channel chunking around surrogate pairs and Infinity limits. ([#&#8203;92788](openclaw/openclaw#92788), [#&#8203;92679](openclaw/openclaw#92679), [#&#8203;89421](openclaw/openclaw#89421), [#&#8203;89943](openclaw/openclaw#89943), [#&#8203;91137](openclaw/openclaw#91137), [#&#8203;91246](openclaw/openclaw#91246), [#&#8203;92735](openclaw/openclaw#92735)) Thanks [@&#8203;yetval](https://github.com/yetval), [@&#8203;obviyus](https://github.com/obviyus), [@&#8203;spacegeologist](https://github.com/spacegeologist), [@&#8203;rishitamrakar](https://github.com/rishitamrakar), [@&#8203;lundog](https://github.com/lundog), [@&#8203;TurboTheTurtle](https://github.com/TurboTheTurtle), and [@&#8203;yhterrance](https://github.com/yhterrance).
- Auto-reply/groups: keep ordinary group text replies on automatic final-reply delivery while allowing `message(action=send)` for files, images, and other attachments to the same group or topic. Carries forward [#&#8203;43276](openclaw/openclaw#43276); refs [#&#8203;48004](openclaw/openclaw#48004). Thanks [@&#8203;NayukiChiba](https://github.com/NayukiChiba) and [@&#8203;ShakaRover](https://github.com/ShakaRover).
- Auto-reply/skills: preserve multiline payloads for `/skill` and direct skill slash commands while keeping command-head normalization for aliases, colon syntax, and bot mentions. Fixes [#&#8203;79155](openclaw/openclaw#79155); carries forward [#&#8203;81305](openclaw/openclaw#81305). Thanks [@&#8203;web3blind](https://github.com/web3blind).
- iMessage: normalize leading NUL sent-message echo prefixes while preserving interior NUL bytes and the leading attributedBody marker handling from [#&#8203;73942](openclaw/openclaw#73942). Carries forward [#&#8203;63581](openclaw/openclaw#63581). Thanks [@&#8203;drvoss](https://github.com/drvoss).
- Discord: give generated auto-thread titles a 60-second timeout and 4,096-token reasoning-model output budget, clamped to the selected model output cap. ([#&#8203;64734](openclaw/openclaw#64734)) Thanks [@&#8203;hanamizuki](https://github.com/hanamizuki).
- Agent, cron, and Gateway runtime: mark active main sessions before restart shutdown aborts, pause yielded subagent runs whose terminal also signals abort, preserve yielded media completions, de-duplicate main-session heartbeat events, expose session identity in runtime prompts, reject unknown OpenAI agent selectors, keep generated media completions and slash-command block replies in WebChat, preserve fresh post-compaction usage while clearing stale usage snapshots, and require admin privileges for HTTP session/model override surfaces. ([#&#8203;91357](openclaw/openclaw#91357), [#&#8203;92631](openclaw/openclaw#92631), [#&#8203;92146](openclaw/openclaw#92146), [#&#8203;91287](openclaw/openclaw#91287), [#&#8203;92468](openclaw/openclaw#92468), [#&#8203;92510](openclaw/openclaw#92510), [#&#8203;91246](openclaw/openclaw#91246), [#&#8203;50795](openclaw/openclaw#50795), [#&#8203;50845](openclaw/openclaw#50845), [#&#8203;82874](openclaw/openclaw#82874), [#&#8203;92651](openclaw/openclaw#92651), [#&#8203;92646](openclaw/openclaw#92646)) Thanks [@&#8203;ooiuuii](https://github.com/ooiuuii), [@&#8203;openperf](https://github.com/openperf), [@&#8203;IWhatsskill](https://github.com/IWhatsskill), [@&#8203;ZengWen-DT](https://github.com/ZengWen-DT), [@&#8203;zhangguiping-xydt](https://github.com/zhangguiping-xydt), [@&#8203;Hollychou924](https://github.com/Hollychou924), [@&#8203;leno23](https://github.com/leno23), and [@&#8203;TurboTheTurtle](https://github.com/TurboTheTurtle).
- Agents/exec: default empty-success background completion notices on only for real chat channels, preserving explicit opt-outs and keeping generic providers silent while carrying forward the narrow UX intent from [#&#8203;39726](openclaw/openclaw#39726) and [#&#8203;46926](openclaw/openclaw#46926). Thanks [@&#8203;Sapientropic](https://github.com/Sapientropic) and [@&#8203;wenkang-xie](https://github.com/wenkang-xie).
- Providers and model replay: preserve storeless OpenAI Responses replay compatibility, avoid eager tool streaming for Claude 4.5 in Copilot, honor profile auth for SecretRef model entries, bound model browsing, strip provider prefixes where runtimes need bare IDs, and surface nested embedding fetch failures. ([#&#8203;90706](openclaw/openclaw#90706), [#&#8203;75393](openclaw/openclaw#75393), [#&#8203;90686](openclaw/openclaw#90686), [#&#8203;92247](openclaw/openclaw#92247), [#&#8203;92627](openclaw/openclaw#92627), [#&#8203;91218](openclaw/openclaw#91218), [#&#8203;92628](openclaw/openclaw#92628)) Thanks [@&#8203;snowzlm](https://github.com/snowzlm), [@&#8203;Kailigithub](https://github.com/Kailigithub), [@&#8203;rohitjavvadi](https://github.com/rohitjavvadi), [@&#8203;samson910022](https://github.com/samson910022), [@&#8203;liuhao1024](https://github.com/liuhao1024), [@&#8203;bymle](https://github.com/bymle), and [@&#8203;mushuiyu886](https://github.com/mushuiyu886).
- Memory, state, diagnostics, and config: split header-too-large embedding batches, keep QMD memory search enabled in transient mode, avoid SQLite WAL on NFS volumes, preserve recovery scheduling outside stuck-session warning backoff, and keep shell environment fallbacks contained in config write tests. ([#&#8203;92650](openclaw/openclaw#92650), [#&#8203;92618](openclaw/openclaw#92618), [#&#8203;92639](openclaw/openclaw#92639), [#&#8203;91247](openclaw/openclaw#91247), [#&#8203;92752](openclaw/openclaw#92752)) Thanks [@&#8203;mushuiyu886](https://github.com/mushuiyu886), [@&#8203;TurboTheTurtle](https://github.com/TurboTheTurtle), [@&#8203;849261680](https://github.com/849261680), and [@&#8203;gnanam1990](https://github.com/gnanam1990).
- Workspace setup state: store setup completion outside the workspace dot directory using an OpenClaw-named root file, migrate valid legacy state forward, and avoid clobbering generic root `workspace-state.json` files for TigerFS-style dot-path compatibility. This Clownfish replacement carries forward the focused [#&#8203;53326](openclaw/openclaw#53326) fix idea because the original branch was closed and uneditable. ([#&#8203;53326](openclaw/openclaw#53326), [#&#8203;44783](openclaw/openclaw#44783), [#&#8203;39446](openclaw/openclaw#39446)) Thanks [@&#8203;1qh](https://github.com/1qh).
- UI/mobile/TUI: preserve dashboard session parent lineage, WebChat backscroll, reset soft command args, sidebar session picker interactivity, collapsed workspace files, resolved `/model` confirmation refs, and stale foreground iOS Gateway reconnects. ([#&#8203;90658](openclaw/openclaw#90658), [#&#8203;92622](openclaw/openclaw#92622), [#&#8203;91353](openclaw/openclaw#91353), [#&#8203;92705](openclaw/openclaw#92705), [#&#8203;92779](openclaw/openclaw#92779), [#&#8203;92773](openclaw/openclaw#92773), [#&#8203;92552](openclaw/openclaw#92552)) Thanks [@&#8203;luoyanglang](https://github.com/luoyanglang), [@&#8203;TurboTheTurtle](https://github.com/TurboTheTurtle), [@&#8203;zhouhe-xydt](https://github.com/zhouhe-xydt), [@&#8203;NianJiuZst](https://github.com/NianJiuZst), [@&#8203;shakkernerd](https://github.com/shakkernerd), [@&#8203;NarahariRaghava](https://github.com/NarahariRaghava), and [@&#8203;Solvely-Colin](https://github.com/Solvely-Colin).
- TUI: reload the active session after external `/new` or `/reset` session-change events so stale transcript and stream state clear promptly. Fixes [#&#8203;38966](openclaw/openclaw#38966); carries forward [#&#8203;40472](openclaw/openclaw#40472). Thanks [@&#8203;yizhanzjz](https://github.com/yizhanzjz) and [@&#8203;wsyjh8](https://github.com/wsyjh8).
- Control UI: preserve Gateway Access tokens during same-normalized WebSocket URL edits and reload gateway-scoped tokens when switching endpoints. Fixes [#&#8203;41545](openclaw/openclaw#41545); repairs [#&#8203;42001](openclaw/openclaw#42001) with additional source PRs [#&#8203;41546](openclaw/openclaw#41546), [#&#8203;41552](openclaw/openclaw#41552), and [#&#8203;41718](openclaw/openclaw#41718). Thanks [@&#8203;wsyjh8](https://github.com/wsyjh8), [@&#8203;llagy0020](https://github.com/llagy0020), [@&#8203;llagy007](https://github.com/llagy007), [@&#8203;pingfanfan](https://github.com/pingfanfan), and [@&#8203;zheliu2](https://github.com/zheliu2).
- Gateway CLI: tolerate a single transient clean WebSocket close before `hello-ok` so one-shot RPC calls reconnect instead of failing noisily, while repeated clean pre-hello closes still surface. Carries forward source PRs [#&#8203;54475](openclaw/openclaw#54475) and [#&#8203;54774](openclaw/openclaw#54774); [#&#8203;85253](openclaw/openclaw#85253) covered adjacent connect assembly diagnostics. Thanks [@&#8203;ruanrrn](https://github.com/ruanrrn).
- Gateway/Linux: keep root-owned systemd user service lifecycle commands on root's user manager when a stale `SUDO_USER` remains in a root shell with root's user bus environment. Fixes [#&#8203;81410](openclaw/openclaw#81410). Thanks [@&#8203;Ericksza](https://github.com/Ericksza) and [@&#8203;ChuckClose-tech](https://github.com/ChuckClose-tech).
- Release and test reliability: extend slow Gateway/full-suite watchdogs, split local full-suite shards when throttled, stabilize plugin auth marker fixtures, avoid brittle provider-ref error text, and keep QA Lab bootstrap selection assertions aligned with flow-only scenarios. ([#&#8203;92652](openclaw/openclaw#92652))
- macOS Peekaboo bridge: update the embedded Peekaboo package to 3.5.2 and route bundled-skill CLI commands through the OpenClaw app bridge so they inherit its Screen Recording and Accessibility grants.
- Agent routing: route subagent RPC callbacks addressed to an agent-shaped `--to` target to the correct session key instead of falling back to the main session, so WeChat (and other channel) session-key callbacks reach the intended subagent session. ([#&#8203;90231](openclaw/openclaw#90231)) Thanks [@&#8203;zhangguiping-xydt](https://github.com/zhangguiping-xydt).
- Cron: preserve model, fallback, thinking, timeout, light-context, unsafe-content, and tool allow-list overrides on implicit text payloads by promoting them to agent turns, while explicit system events still prune those fields. Fixes [#&#8203;28905](openclaw/openclaw#28905); carries forward [#&#8203;64060](openclaw/openclaw#64060) and [#&#8203;73946](openclaw/openclaw#73946). Thanks [@&#8203;liaoandi](https://github.com/liaoandi).
- QQBot delivery: keep markdown table chunks self-contained across message boundaries by preserving table state across block deliveries, flushing unfinished table-row fragments as plain text, and detecting short pipe-terminated rows by column count so split rows are not sent as malformed markdown. ([#&#8203;92428](openclaw/openclaw#92428)) Thanks [@&#8203;sliverp](https://github.com/sliverp).

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these updates again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xMDEuMSIsInVwZGF0ZWRJblZlciI6IjQzLjEwMS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJyZW5vdmF0ZS9jb250YWluZXIiLCJ0eXBlL3BhdGNoIl19-->

Reviewed-on: https://git.erwanleboucher.dev/eleboucher/homelab/pulls/1144
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agents Agent runtime and tooling merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. merge-risk: 🚨 session-state 🚨 May lose, corrupt, stale, or mis-associate session, agent, or context state. P2 Normal backlog priority with limited blast radius. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. size: XS status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Workspace directory has unnecessarily nested path structure

1 participant