Skip to content

fix: cron text payload silently ignores model override#64060

Closed
liaoandi wants to merge 3 commits into
openclaw:mainfrom
liaoandi:fix/cron-text-payload-model-ignored
Closed

fix: cron text payload silently ignores model override#64060
liaoandi wants to merge 3 commits into
openclaw:mainfrom
liaoandi:fix/cron-text-payload-model-ignored

Conversation

@liaoandi

Copy link
Copy Markdown
Contributor

Bug

openclaw cron edit --model has no effect when the cron payload uses the text field instead of message.

When kind is not explicitly set, coercePayload() infers systemEvent from the presence of text, then strips all agentTurn-only fields including model. The model override is silently discarded.

This was reported in #28905 (closed as stale) — this PR provides the root-cause fix.

Fix

In coercePayload(), when text is present alongside agentTurn-only fields (detected by the existing hasAgentTurnPayloadHint()), infer agentTurn and promote textmessage instead of inferring systemEvent.

Before

payload: { text: "Run sync", model: "anthropic/claude-sonnet-4-6" }
→ kind: "systemEvent" → model deleted → runs on system default (haiku)

After

payload: { text: "Run sync", model: "anthropic/claude-sonnet-4-6" }
→ kind: "agentTurn", message: "Run sync", model preserved → runs on sonnet

Test plan

  • Added test for normalizeCronJobCreate with text + model → verifies promotion to agentTurn
  • Added test for normalizeCronJobPatch with text + model → verifies promotion to agentTurn
  • Existing test for explicit kind: "systemEvent" + model → still prunes model (no behavior change)
  • All 53 cron normalize tests pass
  • pnpm check passes

Closes #28905

@greptile-apps

greptile-apps Bot commented Apr 10, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

The PR correctly fixes coercePayload so that a nested payload: { text, model } promotes to agentTurn instead of silently discarding model. However, the parallel function inferTopLevelPayload — called when fields are passed at the top level without a nested payload object — has the identical bug and was not updated.

  • P1: inferTopLevelPayload (lines 296–311) still returns { kind: \"systemEvent\", text } when text + agentTurn-only fields (e.g. model) are present at the top level. Because the inferred kind is systemEvent, copyTopLevelAgentTurnFields is skipped and stripLegacyTopLevelFields silently drops model. The fix is the same pattern applied here to coercePayload.

Confidence Score: 4/5

Nested-payload path is fixed correctly; the top-level-fields path has the same silent model-discard bug and needs a parallel one-liner fix before merging.

The coercePayload fix and tests are correct and well-structured. One P1 gap remains: inferTopLevelPayload was not updated with the matching hasAgentTurnPayloadHint check, so callers using the legacy top-level-fields form ({ text, model } without a nested payload) still lose their model override silently.

src/cron/normalize.ts — inferTopLevelPayload at lines 296–311

Comments Outside Diff (1)

  1. src/cron/normalize.ts, line 296-311 (link)

    P1 Parallel bug in inferTopLevelPayload not fixed

    inferTopLevelPayload is called when the caller passes top-level fields without a nested payload object (e.g. { name: "job", schedule: {...}, text: "hello", model: "sonnet" }). It has the same logic gap: text present → returns { kind: "systemEvent", text } unconditionally, without checking hasAgentTurnPayloadHint. Because the resulting kind is systemEvent, copyTopLevelAgentTurnFields (line 505) is skipped and stripLegacyTopLevelFields silently drops model.

    Prompt To Fix With AI
    This is a comment left during a code review.
    Path: src/cron/normalize.ts
    Line: 296-311
    
    Comment:
    **Parallel bug in `inferTopLevelPayload` not fixed**
    
    `inferTopLevelPayload` is called when the caller passes top-level fields without a nested `payload` object (e.g. `{ name: "job", schedule: {...}, text: "hello", model: "sonnet" }`). It has the same logic gap: `text` present → returns `{ kind: "systemEvent", text }` unconditionally, without checking `hasAgentTurnPayloadHint`. Because the resulting kind is `systemEvent`, `copyTopLevelAgentTurnFields` (line 505) is skipped and `stripLegacyTopLevelFields` silently drops `model`.
    
    
    
    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/cron/normalize.ts
Line: 296-311

Comment:
**Parallel bug in `inferTopLevelPayload` not fixed**

`inferTopLevelPayload` is called when the caller passes top-level fields without a nested `payload` object (e.g. `{ name: "job", schedule: {...}, text: "hello", model: "sonnet" }`). It has the same logic gap: `text` present → returns `{ kind: "systemEvent", text }` unconditionally, without checking `hasAgentTurnPayloadHint`. Because the resulting kind is `systemEvent`, `copyTopLevelAgentTurnFields` (line 505) is skipped and `stripLegacyTopLevelFields` silently drops `model`.

```suggestion
function inferTopLevelPayload(next: UnknownRecord) {
  const message = normalizeOptionalString(next.message) ?? "";
  if (message) {
    return { kind: "agentTurn", message } satisfies UnknownRecord;
  }

  const text = normalizeOptionalString(next.text) ?? "";
  if (text && hasAgentTurnPayloadHint(next)) {
    // text + agentTurn-only fields → promote to agentTurn, text→message.
    return { kind: "agentTurn", message: text } satisfies UnknownRecord;
  }
  if (text) {
    return { kind: "systemEvent", text } satisfies UnknownRecord;
  }

  if (hasAgentTurnPayloadHint(next)) {
    return { kind: "agentTurn" } satisfies UnknownRecord;
  }

  return null;
}
```

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

Reviews (1): Last reviewed commit: "cron: promote text payload to agentTurn ..." | Re-trigger Greptile

@clawsweeper

clawsweeper Bot commented Apr 27, 2026

Copy link
Copy Markdown
Contributor

Codex review: keeping this open for maintainer follow-up; there is still a little grit to resolve.

Keep open. Current main and the latest release still classify implicit cron text payloads as systemEvent before considering agent-turn hints, so nested and legacy top-level text plus model inputs can still drop the model override. This PR remains a focused implementation candidate, and the later branch discussion says the earlier top-level gap was addressed.

Best possible solution:

Keep this PR open and review or land this branch, or an equivalent mainline fix, that updates both coercePayload() and inferTopLevelPayload() so text plus agent-turn-only fields promotes to agentTurn while preserving explicit systemEvent pruning. Keep the nested and top-level create/patch regression tests and refresh the changelog against current main before merge.

What I checked:

  • Current main nested payload behavior: coercePayload() still sets missing-kind payloads with text to systemEvent before checking hasAgentTurnPayloadHint(). The systemEvent cleanup then deletes model, fallbacks, thinking, and other agent-turn-only fields, so nested payload: { text, model } can still lose the override on main. (src/cron/normalize.ts:172, a820a307dfeb)
  • Current main top-level behavior: inferTopLevelPayload() still returns { kind: "systemEvent", text } as soon as top-level text is present. Because the payload is not agentTurn, the later copy step does not preserve top-level model, and stripLegacyTopLevelFields() removes that field from the normalized job. (src/cron/normalize.ts:306, a820a307dfeb)
  • Documented model precedence: The cron docs say --model is the job primary, per-job payload model is above stored cron-session and agent/default model selection, and allowed models should reach the isolated agent run. That documented behavior conflicts with silently stripping the model during normalization. Public docs: docs/automation/cron-jobs.md. (docs/automation/cron-jobs.md:132, a820a307dfeb)
  • Current tests miss the exact regression: Current-main tests cover model-only payload inference and explicit systemEvent pruning, but the checked test ranges do not include regression coverage for nested or top-level text plus model promotion. The PR's added tests target that missing surface. (src/cron/normalize.test.ts:659, a820a307dfeb)
  • Latest release still has the old ordering: The latest release tag v2026.4.26 points at be8c24633aaa7ef0425ae1178f096ee8dd6226c0, and tag inspection of src/cron/normalize.ts shows the same text before agent-turn-hint ordering in both coercePayload() and inferTopLevelPayload(). This is not already shipped as implemented. (src/cron/normalize.ts:162, be8c24633aaa)
  • PR discussion and security pass: The supplied PR context shows Greptile identified a parallel top-level gap, then later comments from the contributor and Vincent Koc say the branch was updated to cover that path. The supplied file list is limited to CHANGELOG.md, src/cron/normalize.ts, and src/cron/normalize.test.ts; no workflows, action refs, dependency sources, lockfiles, install/build/release scripts, secrets handling, package publishing metadata, downloaded artifacts, or generated/vendor code are in scope. (a75513ec6b80)

Likely related people:

  • steipete: The available local blame for the central coercePayload() and inferTopLevelPayload() lines points to Peter Steinberger in grafted current-main history, and prior review context links Peter to recent cron normalization and cron delivery/session maintenance. (role: recent maintainer / current-line owner; confidence: medium; commits: 7b2b0d07, 7999767a0fd4, 934927fd13ed; files: src/cron/normalize.ts, src/cron/normalize.test.ts, docs/automation/cron-jobs.md)
  • tyler6204: CONTRIBUTING.md lists Tyler Yust for cron, and the supplied prior review context ties Tyler to the larger cron scheduler/normalization expansion that added top-level payload inference, agent-turn field copying, and legacy field stripping. (role: cron domain owner / introduced related behavior; confidence: medium; commits: d90cac990c8f, 75001a049007, 64df61f69743; files: src/cron/normalize.ts, src/cron/normalize.test.ts)
  • vincentkoc: The PR discussion says Vincent Koc pushed a narrow repair to this branch, and the supplied prior review context identifies him as a recent adjacent maintainer for legacy cron row normalization in the same files. (role: recent adjacent maintainer / branch repair; confidence: medium; commits: e0546edd9820, a75513ec6b80; files: src/cron/normalize.ts, src/cron/normalize.test.ts)
  • rodrigouroz: The supplied prior review context links Rodrigo Uroz to the model-only payload inference path and tests that established agent-turn-only fields as normalization hints, which this PR extends to text plus model. (role: adjacent inference behavior; confidence: low; commits: 89dccc79a7b1; files: src/cron/normalize.ts, src/cron/normalize.test.ts)

Remaining risk / open question:

  • Closing this PR now would leave the documented cron model-precedence behavior unfixed on current main.
  • The local checkout history is grafted around the release baseline, so ownership routing uses local blame plus the supplied prior review context rather than a complete local feature-history graph.

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

@liaoandi

Copy link
Copy Markdown
Contributor Author

Follow-up note: the top-level path called out in the earlier review is addressed by commit 8aaf0d9.

That commit updates inferTopLevelPayload() so top-level { text, model } is inferred as agentTurn with text promoted to message, matching the nested payload: { text, model } behavior. It also adds create/patch regression coverage for the top-level path.

Local verification:

node --no-maglev node_modules/vitest/vitest.mjs run --config vitest.config.ts src/cron/normalize.test.ts
Test Files  1 passed (1)
Tests       55 passed (55)

The current PR head is 8aaf0d92, and the GitHub check rollup is green.

liaoandi and others added 3 commits April 28, 2026 07:33
…lds are present

When a cron payload uses the text field alongside agentTurn-only fields
(model, fallbacks, thinking, etc.), coercePayload now infers agentTurn
instead of systemEvent, converting text to message.

Previously the model override was silently deleted because systemEvent
payloads strip all agentTurn-only fields. This caused openclaw cron edit
--model to have no effect on text-based payloads.

Closes openclaw#28905
@vincentkoc

Copy link
Copy Markdown
Member

ProjectClownfish pushed a narrow repair to this branch so the original contributor path can stay canonical.

Source PR: #64060
Validation: pnpm -s vitest run --config vitest.config.ts src/cron/normalize.test.ts; pnpm check:changed
Contributor credit is preserved in the branch history and PR context.

@openclaw-clownfish

Copy link
Copy Markdown
Contributor

ProjectClownfish could not safely update this branch, so it opened a narrow replacement PR instead.

Replacement PR: #73946
Source PR: #64060
Contributor credit is preserved in the replacement PR body and changelog plan.

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

clawsweeper Tracked by ClawSweeper automation size: S

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Cron model field overridden by agent default model

2 participants