Skip to content

fix(cron): preserve yielded media completions#92146

Merged
vincentkoc merged 3 commits into
openclaw:mainfrom
IWhatsskill:codex/fix-cron-sessions-yield-92120
Jun 13, 2026
Merged

fix(cron): preserve yielded media completions#92146
vincentkoc merged 3 commits into
openclaw:mainfrom
IWhatsskill:codex/fix-cron-sessions-yield-92120

Conversation

@IWhatsskill

@IWhatsskill IWhatsskill commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Problem: Isolated cron media runs can call image_generate, then correctly call sessions_yield, but the attempt still enters the completion-required media wait with the already-aborted internal sessions_yield signal and turns the intentional pause into AbortError: aborted. The generated-media callback path could also bypass the requester-agent continuation for inactive isolated cron run sessions.
  • Solution: Skip the synchronous completion-required media wait only after the attempt has positively detected the intentional sessions_yield abort, and keep agent-mediated generated-media completions routed through the requester-agent before any direct media fallback.
  • What changed: Added shouldWaitForCompletionRequiredAsyncTasks, wired it into embedded attempt finalization, and tightened inactive isolated cron generated-media delivery so image_generate completions run the same cron run session first. Regression coverage now proves the wait policy, the clean yield pause, the completion callback, the same-session requester-agent handoff, a sessions_send follow-up action with generated media, and the fallback path when requester-agent media evidence is missing.
  • What did NOT change (scope boundary): No provider, channel plugin, config shape, task-registry, dependency, lockfile, migration, auth, or storage behavior changed. Direct generated-media delivery remains as a fallback when the requester-agent does not prove media delivery.

Motivation

Isolated cron workflows that generate media as an intermediate step should remain resumable after sessions_yield. The media callback path already exists; this patch prevents the paused attempt from immediately reusing its own sessions_yield abort signal and prevents inactive isolated cron media callbacks from skipping the requester-agent continuation step.

Change Type (select all)

  • Bug fix
  • Feature
  • Refactor required for the fix
  • Docs
  • Security hardening
  • Chore/infra

Scope (select all touched areas)

  • Gateway / orchestration
  • Skills / tool execution
  • Auth / tokens
  • Memory / storage
  • Integrations
  • API / contracts
  • UI / DX
  • CI/CD / infra

Linked Issue/PR

Real behavior proof (required for external PRs)

  • Behavior or issue addressed: A cron-run sessions_yield pause with an active generated-media task no longer enters the completion-required media wait using the already-aborted sessions_yield signal. The generated-media callback now enters the same inactive isolated cron run via the requester-agent first, where a follow-up sessions_send action can deliver the generated media. Normal non-yield cron media waits and direct generated-media fallback behavior remain covered.
  • Real environment tested: Fresh disposable Linux OpenClaw checkouts; before/after diagnostic base main at c692fabeba; final pushed PR branch commit 5857bb7f3ae6fee4843b327bbf8833e475287e80; Node v24.16.0, pnpm 11.2.2.
  • Exact steps or command run after this patch:
pnpm install --frozen-lockfile
pnpm tsgo:core
node --import tsx tmp-92120-real-image-proof.ts
OPENCLAW_PROOF_ARTIFACT_DIR=/tmp/openclaw-92120-proof-artifacts node --import tsx tmp/proof-92120-cron-media.ts
OPENCLAW_TEST_FAST=1 node scripts/run-vitest.mjs src/agents/subagent-announce-delivery.test.ts -t "inactive isolated cron media"
OPENCLAW_TEST_FAST=1 node scripts/run-vitest.mjs src/agents/subagent-announce-delivery.test.ts
OPENCLAW_TEST_FAST=1 node scripts/run-vitest.mjs src/agents/embedded-agent-runner/run/attempt.async-tasks.test.ts src/agents/embedded-agent-runner/sessions-yield.orchestration.test.ts src/agents/agent-run-terminal-outcome.test.ts
OPENCLAW_TEST_FAST=1 node scripts/run-vitest.mjs src/agents/tools/image-generate-background.test.ts -t "queues a completion event through the shared generated-media wake path"
git diff --check
pnpm exec oxfmt --check src/agents/embedded-agent-runner/run/attempt.async-tasks.ts src/agents/embedded-agent-runner/run/attempt.ts src/agents/embedded-agent-runner/run/attempt.async-tasks.test.ts src/agents/subagent-announce-delivery.ts src/agents/subagent-announce-delivery.test.ts
  • Evidence after fix:
final pushed PR branch commit=5857bb7f3ae6fee4843b327bbf8833e475287e80
PROOF_REQUIRES_WITHOUT_YIELD=true
PROOF_HAS_YIELD_POLICY=true
PROOF_SHOULD_WAIT_AFTER_YIELD=false
PROOF_OUTCOME=patched_paused_no_wait

REAL_IMAGE_PROOF=PASS
IMAGE_FILE=generated-daily.png
IMAGE_EXISTS=true
IMAGE_BYTES=225
IMAGE_SHA256=3a23e2ad20572f384a5e7028862556e8c2f70c2a98a57ccefff83a4cb43565c1
CRON_RUN_SESSION=agent:main:cron:daily-media:run:run-real-image-proof
CALLBACK_SOURCE_TOOL=image_generate
CALLBACK_SOURCE_SESSION=image_generate:task-real-image-proof
REQUESTER_AGENT_CALLS=1
REQUESTER_AGENT_SESSION_KEY=agent:main:cron:daily-media:run:run-real-image-proof
FOLLOWUP_TOOL=sessions_send
FOLLOWUP_MEDIA_MATCH=true
DIRECT_FALLBACK_SENDS=0
DELIVERY_RESULT=delivered:true,path:direct
EXTERNAL_PROVIDER_USED=false

ACTUAL_GATEWAY_CRON_RUN=PASS
CRON_RPC_RUN_FORCE=PASS
JOB_SESSION_TARGET=isolated
MODEL_TOOL_SEQUENCE=image_generate,sessions_yield,sessions_send,final,final
IMAGE_PROVIDER_REQUESTS=1
CALLBACK_RESUME_SEEN=true
CALLBACK_INPUT_HAS_SOURCE_TOOL_IMAGE_GENERATE=true
SESSIONS_SEND_CALLED=true
NESTED_MAIN_FINAL_SEEN=true
DIRECT_FALLBACK_IMAGE_EVENTS=0
OPENCLAW_SAVED_IMAGE_BYTES=702
OPENCLAW_SAVED_IMAGE_SHA256=94eff542b057e38dada70a97fe6a1eb5d1737318a519eb545da0ed6a2eb4ce85

pnpm tsgo:core PASS
inactive isolated cron media focused callback/follow-up test: 4/4 PASS, 192 skipped
subagent-announce-delivery.test.ts: 98/98 PASS
attempt.async-tasks.test.ts: 8/8 PASS
agent-run-terminal-outcome.test.ts: 12/12 PASS
sessions-yield.orchestration.test.ts: 4/4 PASS
image-generate-background focused wake-path test: 2/2 PASS, 6 skipped
git diff --check PASS
oxfmt changed files PASS on 5 files
  • Observed result after fix: The paused attempt no longer waits on a sessions_yield-aborted signal. The yielded run exits as clean end_turn and is no longer active. The real image proof created an actual PNG (generated-daily.png, 225 bytes, SHA-256 3a23e2ad20572f384a5e7028862556e8c2f70c2a98a57ccefff83a4cb43565c1) and passed that media artifact through the inactive isolated cron image_generate completion callback into the same requester-agent run session. The requester-agent then emitted sessions_send with matching media evidence, and direct fallback sends stayed at 0. A separate real Gateway/Cron proof started OpenClaw's Gateway server, added and force-ran an isolated cron job through GatewayClient, invoked image_generate, paused with sessions_yield, resumed from the generated-media callback with sourceTool=image_generate, called sessions_send, reached the main session follow-up, saved the generated PNG through OpenClaw media storage, and recorded DIRECT_FALLBACK_IMAGE_EVENTS=0.
  • What was not tested: No live external image provider credential, real Google/OpenAI image generation call, full repository-wide suite, browser/UI path, production channel delivery, or real user account behavior was used. The image proof used deterministic/local provider-controlled PNG artifacts so the runner/session/media-delivery layer could be verified without provider flake.
  • Before evidence:
unpatched main commit=c692fabeba
PROOF_REQUIRES_WITHOUT_YIELD=true
PROOF_HAS_YIELD_POLICY=false
PROOF_SHOULD_WAIT_AFTER_YIELD=true
PROOF_OUTCOME=base_abort_error
PROOF_ERROR_NAME=AbortError
PROOF_ERROR_MESSAGE=aborted
PROOF_ERROR_CAUSE=sessions_yield

Root Cause (if applicable)

  • Root cause: sessions_yield intentionally aborts the internal attempt controller with reason sessions_yield, but the post-prompt completion-required media wait still ran after that pause and reused the already-aborted signal. Separately, inactive cron generated-media completions had a stale-run shortcut that could direct-deliver media before the requester-agent continuation ran.
  • Missing detection / guardrail: The completion-required media wait policy did not distinguish a clean yield pause from an ordinary cron run that must synchronously wait for active generated-media tasks before finalizing. The inactive isolated cron delivery path also did not distinguish generated-media tools that require agent-mediated continuation from non-agent-mediated stale cron completions.
  • Contributing context (if known): Prior cron media work correctly waits for generated-media tasks when no yield path is used. The missing guard was at the handoff between intentional yield cleanup, cron media waiting, and generated-media callback delivery for inactive cron run sessions.

Regression Test Plan (if applicable)

  • Coverage level that should have caught this:
    • Unit test
    • Seam / integration test
    • End-to-end test
    • Existing coverage already sufficient
  • Target test or file: src/agents/embedded-agent-runner/run/attempt.async-tasks.test.ts, src/agents/embedded-agent-runner/sessions-yield.orchestration.test.ts, src/agents/agent-run-terminal-outcome.test.ts, src/agents/tools/image-generate-background.test.ts, and src/agents/subagent-announce-delivery.test.ts.
  • Scenario the test should lock in: A cron run with an active completion-required generated-media task still waits when no yield happened, skips that synchronous wait after a confirmed sessions_yield pause, then handles the generated-media completion through the same inactive isolated cron run session before falling back to direct media delivery only if the requester-agent did not deliver the media.
  • Why this is the smallest reliable guardrail: The bug crosses two local OpenClaw boundaries: the post-yield wait decision and the generated-media completion delivery decision. Testing those boundaries directly avoids provider flake while still proving the requested follow-up action (sessions_send) runs from the same cron run session.
  • Existing test that already covers this (if any): Existing tests covered clean yield exit, generated-media wake events, active requester media completion delivery, and normal cron media wait behavior, but not inactive isolated cron media callback continuation after sessions_yield.
  • If no new test is added, why not: New regression tests are added.

User-visible / Behavior Changes

Isolated cron workflows that intentionally yield while waiting for generated-media completion should stay in the resumable completion-event path instead of reporting AbortError: aborted immediately after the yield. When the media callback arrives after the cron run is inactive, OpenClaw now gives the same isolated cron run session the first chance to continue and send the follow-up message/action.

Diagram

image_generate starts generated-media task
  -> sessions_yield intentionally pauses the attempt
  -> post-prompt cron media wait sees yieldDetected=true and does not wait on the aborted signal
  -> generated-media completion callback arrives for image_generate:task-123
  -> inactive isolated cron run is not steered because it is no longer active
  -> requester-agent runs with sessionKey=agent:main:cron:daily-media:run:run-123
  -> requester-agent performs sessions_send follow-up with generated media
  -> direct generated-media fallback remains available only when requester-agent media evidence is missing

Security Impact (required)

  • New permissions/capabilities? No.
  • Secrets/tokens handling changed? No.
  • New/changed network calls? No.
  • Command/tool execution surface changed? No.
  • Data access scope changed? No.
  • If any Yes, explain risk + mitigation: Not applicable.

Repro + Verification

Environment

  • OS: Linux disposable test checkout.
  • Runtime/container: Node v24.16.0, pnpm 11.2.2.
  • Model/provider: No external provider call; deterministic OpenClaw source/runtime harnesses.
  • Integration/channel (if any): Embedded runner cron media wait, sessions-yield orchestration, generated-media completion wake, inactive isolated cron requester-agent delivery, sessions_send follow-up evidence, and direct generated-media fallback.
  • Relevant config (redacted): OPENCLAW_TEST_FAST=1 for focused Vitest runs.

Steps

  1. Reproduce the old decision path on unpatched main with an active cron-owned image_generation task and sessions_yield abort reason.
  2. Apply this patch and confirm the same active task still requires a wait without yield but does not require a wait after yieldDetected=true.
  3. Generate a real local PNG artifact and pass it through the inactive isolated cron image_generate completion callback.
  4. Prove the callback calls the requester-agent on the same cron run session.
  5. Prove the requester-agent follow-up contains sessions_send delivery evidence with the generated media.
  6. Prove direct generated-media fallback remains only when requester-agent media evidence is missing.
  7. Start a real OpenClaw Gateway server, create an isolated cron job through the Gateway RPC client, force-run it, let the model-provider double emit image_generate, sessions_yield, and sessions_send, then verify the generated-media callback resume and saved image artifact.
  8. Run focused and adjacent source tests for wait policy, clean yield exit, terminal outcome, image completion wake, inactive cron callback continuation, full announcement delivery, typecheck, whitespace, and formatting.

Expected

  • Non-yield cron media runs keep the synchronous generated-media wait.
  • Yielded cron media runs do not reuse the sessions_yield-aborted signal for the synchronous wait.
  • Yielded sessions still exit as clean end_turn runs and are no longer active.
  • Generated-media completions for inactive isolated cron runs route through the requester-agent on the same cron run session before direct fallback.
  • The requester-agent follow-up can send the generated media through sessions_send.
  • Direct generated-media fallback stays available when the requester-agent misses media delivery evidence.

Actual

  • Unpatched main: the simulated post-yield wait decision entered the wait and threw AbortError with cause sessions_yield.
  • Patched branch: the post-yield wait decision returned false while the non-yield media wait decision still returned true. The inactive isolated cron media callback called the requester-agent on the same cron run session and accepted sessions_send media delivery evidence for the generated PNG artifact; the fallback-only test still delivered generated media directly after requester-agent media evidence was missing.

Evidence

  • Failing test/log before + passing after
  • Trace/log snippets
  • Screenshot/recording
  • Perf numbers (if relevant)
Before:
PROOF_OUTCOME=base_abort_error
PROOF_ERROR_NAME=AbortError
PROOF_ERROR_CAUSE=sessions_yield

After:
PROOF_OUTCOME=patched_paused_no_wait
REAL_IMAGE_PROOF=PASS
IMAGE_FILE=generated-daily.png
IMAGE_EXISTS=true
IMAGE_BYTES=225
IMAGE_SHA256=3a23e2ad20572f384a5e7028862556e8c2f70c2a98a57ccefff83a4cb43565c1
ACTUAL_GATEWAY_CRON_RUN=PASS
CRON_RPC_RUN_FORCE=PASS
JOB_SESSION_TARGET=isolated
MODEL_TOOL_SEQUENCE=image_generate,sessions_yield,sessions_send,final,final
IMAGE_PROVIDER_REQUESTS=1
CALLBACK_RESUME_SEEN=true
CALLBACK_INPUT_HAS_SOURCE_TOOL_IMAGE_GENERATE=true
SESSIONS_SEND_CALLED=true
NESTED_MAIN_FINAL_SEEN=true
DIRECT_FALLBACK_IMAGE_EVENTS=0
OPENCLAW_SAVED_IMAGE_BYTES=702
OPENCLAW_SAVED_IMAGE_SHA256=94eff542b057e38dada70a97fe6a1eb5d1737318a519eb545da0ed6a2eb4ce85
FOLLOWUP_TOOL=sessions_send
FOLLOWUP_MEDIA_MATCH=true
DIRECT_FALLBACK_SENDS=0
DELIVERY_RESULT=delivered:true,path:direct
pnpm tsgo:core PASS
inactive isolated cron media focused callback/follow-up test: 4/4 PASS, 192 skipped
subagent-announce-delivery.test.ts: 98/98 PASS
attempt.async-tasks.test.ts: 8/8 PASS
agent-run-terminal-outcome.test.ts: 12/12 PASS
sessions-yield.orchestration.test.ts: 4/4 PASS
image-generate-background focused wake-path test: 2/2 PASS, 6 skipped
git diff --check PASS
oxfmt changed files PASS on 5 files

Callback/follow-up proof details:
- actual Gateway cron run passed through Gateway RPC add/run
- isolated cron job target was preserved
- model tool sequence was image_generate -> sessions_yield -> sessions_send
- generated-media callback resume included sourceTool=image_generate
- requester agent called once
- sessionKey=agent:main:cron:daily-media:run:run-real-image-proof
- sourceTool=image_generate
- sourceSessionKey=image_generate:task-real-image-proof
- delivery evidence tool=sessions_send
- delivery evidence media matches generated-daily.png
- direct fallback sendMessage was not called when requester-agent media evidence existed
- direct fallback sendMessage was called when requester-agent media evidence was missing

Human Verification (required)

  • Verified scenarios: Base-vs-patched wait decision, non-yield generated-media wait preservation, clean sessions-yield end_turn behavior, terminal-outcome coverage, image completion wake path, real generated PNG artifact, real Gateway RPC cron add/run, isolated cron target, image_generate -> sessions_yield -> callback resume -> sessions_send model sequence, OpenClaw-saved generated image artifact, inactive isolated cron callback continuation through the same requester-agent session, sessions_send follow-up with matching generated media, direct fallback after missing media evidence, full announcement delivery suite, core typecheck, formatting, and whitespace.
  • Edge cases checked: yieldDetected=true only skips the synchronous wait after the attempt has confirmed the sessions_yield abort; ordinary cron media waits still return true for active image-generation tasks; generated-media callbacks use the requester-agent path before direct fallback; non-agent-mediated stale cron completion behavior is left on the existing direct/no-op path.
  • What you did not verify: Live external image provider generation, production channel delivery, full repository-wide suite, browser/UI behavior, or real user account behavior.

Review Conversations

  • I replied to or resolved every bot review conversation I addressed in this PR.
  • I left unresolved only the conversations that still need reviewer or maintainer judgment.

The latest ClawSweeper review found a missing import and requested a stronger real image continuation proof. The import is fixed in 5857bb7f3ae6fee4843b327bbf8833e475287e80, and the real Gateway/Cron/PNG continuation proof is included above. No review conversation was resolved by this PR body update.

Compatibility / Migration

  • Backward compatible? Yes.
  • Config/env changes? No.
  • Migration needed? No.
  • If yes, exact upgrade steps: Not applicable.

Risks and Mitigations

  • Risk: The completion-required media wait could be skipped too broadly.
    • Mitigation: The helper skips only when the attempt has already positively classified the abort as sessions_yield; the regression test asserts non-yield cron media tasks still require the wait.
  • Risk: Inactive isolated cron completions could skip the requester-agent continuation.
    • Mitigation: Agent-mediated generated-media completions no longer use the stale cron direct shortcut first; the new test proves same-session requester-agent continuation and sessions_send delivery evidence.
  • Risk: Removing the old direct shortcut for generated-media cron completions could drop media delivery if the requester-agent misses the media.
    • Mitigation: A paired regression test proves direct generated-media fallback still fires after requester-agent media delivery evidence is missing.
  • Risk: Live provider behavior could differ from the deterministic source harness.
    • Mitigation: The bug is in local runner/session/delivery control flow after sessions_yield; the proof isolates that path without relying on provider availability. No external provider success is claimed.

@openclaw-barnacle openclaw-barnacle Bot added agents Agent runtime and tooling size: S proof: supplied External PR includes structured after-fix real behavior proof. labels Jun 11, 2026
@clawsweeper

clawsweeper Bot commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs maintainer review before merge. Reviewed June 11, 2026, 9:47 AM ET / 13:47 UTC.

Summary
The branch skips completion-required media waiting after a confirmed sessions_yield pause and routes agent-mediated inactive cron media callbacks through the requester agent before direct fallback.

PR surface: Source +20, Tests +124. Total +144 across 5 files.

Reproducibility: yes. Current main can reuse the sessions_yield-aborted signal in the post-prompt completion-required media wait, and the supplied before run records the matching AbortError: aborted outcome.

Review metrics: none identified.

Merge readiness
Overall: 🐚 platinum hermit
Proof: 🦞 diamond lobster
Patch quality: 🐚 platinum hermit
Result: ready for maintainer review.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Rank-up moves:

  • Confirm the listed focused validation on the exact current merge result.

Risk before merge

  • [P1] The merge changes whether generated media is delivered by the requester agent or direct recovery; a regression could duplicate or suppress the visible message.
  • [P1] The merge changes when an isolated cron attempt stops waiting and becomes resumable, so a regression could leave the run aborted, active, or paused incorrectly.
  • [P1] The focused runner and delivery tests should be confirmed on the exact current merge result because these two boundaries jointly enforce the fix.

Maintainer options:

  1. Validate the merge result and land (recommended)
    Run the focused runner, terminal-outcome, image wake-path, and delivery tests on the exact current merge result, then merge if all handoff and fallback cases pass.
  2. Pause for orchestration-owner review
    Hold the PR if merge-ref validation reveals different session activity, duplicate delivery, or fallback behavior from the supplied proof.

Next step before merge

  • The PR is still necessary and has no actionable patch defect; maintainers should confirm exact merge-ref validation and own the session/message-delivery risk decision.

Security
Cleared: The focused orchestration and test diff adds no dependency, permission, secret, network, install, workflow, or supply-chain surface.

Review details

Best possible solution:

Land the narrow yield guard and requester-agent-first ordering after exact merge-ref validation confirms ordinary cron waits, clean yield pause, same-session callback continuation, sessions_send media delivery, and direct fallback only when requester-agent media evidence is absent.

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

Yes. Current main can reuse the sessions_yield-aborted signal in the post-prompt completion-required media wait, and the supplied before run records the matching AbortError: aborted outcome.

Is this the best way to solve the issue?

Yes. The branch repairs the two narrow boundaries responsible for the failure, preserves normal non-yield cron waiting, and retains direct media fallback when requester-agent delivery cannot prove the expected media.

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 047785eb30c0.

Label changes

Label justifications:

  • P1: The regression aborts isolated cron media workflows after a successful yield and prevents their intended follow-up action.
  • merge-risk: 🚨 message-delivery: The patch changes whether generated media is delivered by the requester agent or direct fallback, so ordering errors could duplicate or suppress delivery.
  • merge-risk: 🚨 session-state: The patch changes post-yield waiting and callback continuation for an inactive isolated cron run session.
  • rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🦞 diamond lobster and patch quality is 🐚 platinum hermit.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (live_output): The PR contains convincing before/after live output and a real Gateway/Cron run proving same-session callback continuation, sessions_send, saved generated media, and zero direct fallback events after the fix.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR contains convincing before/after live output and a real Gateway/Cron run proving same-session callback continuation, sessions_send, saved generated media, and zero direct fallback events after the fix.
Evidence reviewed

PR surface:

Source +20, Tests +124. Total +144 across 5 files.

View PR surface stats
Area Files Added Removed Net
Source 3 22 2 +20
Tests 2 128 4 +124
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 5 150 6 +144

What I checked:

  • Current-main reproduction path: After detecting the intentional sessions_yield abort, current main clears the ordinary aborted state but later invokes the completion-required media wait with the same aborted attempt signal, matching the reported AbortError. (src/agents/embedded-agent-runner/run/attempt.ts:4485, 047785eb30c0)
  • Narrow wait fix: The branch adds a decision helper that bypasses only the post-prompt media wait after a positively detected yield; ordinary cron media waits continue through the existing predicate. (src/agents/embedded-agent-runner/run/attempt.async-tasks.ts:163, 5857bb7f3ae6)
  • Requester-first delivery fix: The inactive-cron direct-delivery shortcut now excludes generated-media completions requiring agent mediation, allowing the same requester session to continue before the existing media-evidence fallback is considered. (src/agents/subagent-announce-delivery.ts:1387, 5857bb7f3ae6)
  • Regression coverage: The added tests cover yield-aware waiting, requester-agent continuation using the same inactive cron session, sessions_send media evidence, and direct fallback when requester delivery does not prove the expected media. (src/agents/subagent-announce-delivery.test.ts:4019, 5857bb7f3ae6)
  • Real behavior proof: The PR records the pre-fix AbortError and a post-fix real Gateway/Cron run that yields, resumes from the image callback in the same cron session, calls sessions_send, saves generated PNG media, and records zero direct fallback image events. (5857bb7f3ae6)
  • Merge compatibility: The focused five-file patch applies to the reviewed current-main SHA without merge-tree conflicts, and the earlier lifecycle-terminal wait site remains unchanged. (src/agents/embedded-agent-runner/run/attempt.ts:3302, 047785eb30c0)

Likely related people:

  • jriff: Jacob Riff introduced the sessions_yield cooperative turn-ending feature in the merged feature commit, making him a strong routing candidate for yield semantics. (role: introduced behavior; confidence: high; commits: 3fa91cd69d5d; files: src/agents/embedded-agent-runner/run/attempt.ts)
  • Vincent Koc: Current-main blame and recent history carry the async-task wait and generated-media delivery orchestration through the latest release and subsequent main updates. (role: recent area contributor; confidence: medium; commits: 5181e4f7c82b, 25bea065964e; files: src/agents/embedded-agent-runner/run/attempt.async-tasks.ts, src/agents/embedded-agent-runner/run/attempt.ts, src/agents/subagent-announce-delivery.ts)
  • steipete: Repository shortlog shows Peter Steinberger as the most frequent contributor across the central embedded-runner and delivery files, and the PR discussion already routes the change to him. (role: adjacent owner; confidence: medium; files: src/agents/embedded-agent-runner/run/attempt.ts, src/agents/embedded-agent-runner/run/attempt.async-tasks.ts, src/agents/subagent-announce-delivery.ts)
  • Ted Li: Ted Li previously changed persisted state handling after clean sessions_yield, which is adjacent to the paused-versus-aborted terminal-state invariant affected here. (role: prior yield-state contributor; confidence: medium; commits: 7f071a6a8eaa; files: src/agents/embedded-agent-runner/run/attempt.ts)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

How this review workflow works
  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

@clawsweeper clawsweeper Bot added rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. P1 High-priority user-facing bug, regression, or broken workflow. merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. merge-risk: 🚨 session-state 🚨 May lose, corrupt, stale, or mis-associate session, agent, or context state. labels Jun 11, 2026
@IWhatsskill

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. 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. labels Jun 11, 2026
@IWhatsskill
IWhatsskill marked this pull request as ready for review June 11, 2026 13:42
@vincentkoc
vincentkoc force-pushed the codex/fix-cron-sessions-yield-92120 branch from 5857bb7 to 47add4b Compare June 13, 2026 11:19
@vincentkoc vincentkoc changed the title [AI-assisted] Fix isolated cron sessions_yield media wait abort fix(cron): preserve yielded media completions Jun 13, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label Jun 13, 2026

@vincentkoc vincentkoc left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Land-ready after maintainer review.

Summary:

  • Keeps isolated cron sessions_yield media runs resumable by skipping the synchronous media wait only after a confirmed yield abort.
  • Routes inactive isolated cron generated-media completions through the requester-agent before direct generated-media fallback.
  • Retitled the PR to remove non-product metadata from the title.

Verification:

  • git diff --check origin/main...HEAD
  • node_modules/.bin/oxfmt --check src/agents/embedded-agent-runner/run/attempt.async-tasks.ts src/agents/embedded-agent-runner/run/attempt.ts src/agents/embedded-agent-runner/run/attempt.async-tasks.test.ts src/agents/subagent-announce-delivery.ts src/agents/subagent-announce-delivery.test.ts
  • .agents/skills/autoreview/scripts/autoreview --mode branch --base origin/main -> clean
  • Crabbox Azure targeted proof: run_3bc310d3d0dd / cbx_be8ac7935509 / amber-prawn, node scripts/run-vitest.mjs src/agents/embedded-agent-runner/run/attempt.async-tasks.test.ts src/agents/subagent-announce-delivery.test.ts -> 8 + 98 tests passed
  • GitHub PR checks on 47add4b7937f1e15bbd07440ec8471e3ebed82c2: 135 successful, 0 failing, 0 pending

Notes:

  • Local focused tests were attempted but timed out behind another pane's heavy-check lock; Crabbox covered the same targeted test command successfully.

@vincentkoc
vincentkoc merged commit 84519f7 into openclaw:main Jun 13, 2026
168 of 171 checks passed
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Jun 14, 2026
* fix(agents): preserve sessions_yield media pauses

* fix(agents): resume cron media completions

* fix(agents): restore cron media wait predicate import

---------

Co-authored-by: WhatsSkiLL <[email protected]>
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
wangmiao0668000666 pushed a commit to wangmiao0668000666/openclaw that referenced this pull request Jun 17, 2026
* fix(agents): preserve sessions_yield media pauses

* fix(agents): resume cron media completions

* fix(agents): restore cron media wait predicate import

---------

Co-authored-by: WhatsSkiLL <[email protected]>
badgerbees pushed a commit to badgerbees/openclaw that referenced this pull request Jul 8, 2026
* fix(agents): preserve sessions_yield media pauses

* fix(agents): resume cron media completions

* fix(agents): restore cron media wait predicate import

---------

Co-authored-by: WhatsSkiLL <[email protected]>
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: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. merge-risk: 🚨 session-state 🚨 May lose, corrupt, stale, or mis-associate session, agent, or context state. P1 High-priority user-facing bug, regression, or broken workflow. proof: supplied External PR includes structured after-fix real behavior proof. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. size: S status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: image_generate in isolated cron session — agent correctly uses sessions_yield but runner aborts with AbortError after callback is delivered

2 participants