Skip to content

fix(agents): retry empty post-tool final turns#93073

Merged
steipete merged 7 commits into
openclaw:mainfrom
fuller-stack-dev:codex/fix-post-tool-empty-final-reply
Jun 15, 2026
Merged

fix(agents): retry empty post-tool final turns#93073
steipete merged 7 commits into
openclaw:mainfrom
fuller-stack-dev:codex/fix-post-tool-empty-final-reply

Conversation

@fuller-stack-dev

@fuller-stack-dev fuller-stack-dev commented Jun 14, 2026

Copy link
Copy Markdown
Member

Summary

  • Fix a silent terminal-turn failure where earlier pre-tool narration made an attempt look non-empty even though the latest typed post-tool assistant message contained no visible final answer.
  • Reuse the existing single visible-answer continuation and incomplete-turn error paths. The change does not add a second tool loop, a raw tool-result fallback, or a public SDK/tool contract.
  • Base the decision on typed attempt facts: current-attempt tool activity, the latest assistant message, visible assistant content, terminal output/delivery state, and replay safety.
  • Make the embedded/Pi replay metadata fail closed for unclassified tool names. Only tools with an unconditional read-only or idempotent contract remain replay-safe; unknown/action-dependent tools surface a verify-before-retrying warning.
  • Intentionally avoid parsing assistant prose. No new regular expressions, provider phrases, tool-result interpretation, config, or public API are added.

Success means a replay-safe checking... -> tool/search -> empty final assistant trajectory receives one bounded continuation, while visible final answers, explicit silence, terminal media/delivery, async work, and side-effectful attempts retain their existing behavior.

Linked context

Supersedes #90872.

That PR established a real channel-facing problem, but its current head is 75 files and +15,999/-1,907 with public Plugin SDK/core tool-contract changes. The maintainer decision was explicit: the 15k LOC approach is not landing.

Root cause and best-fix rationale

assistantTexts and payloadCount aggregate visible text from the whole attempt. If the model says it is checking something before a tool call, that narration remains non-empty even when the latest post-tool assistant message is a typed empty stop turn. The existing empty-response recovery therefore never runs and the channel sees narration followed by silence.

The tool result itself is valid model input, including sparse values such as 0. Parsing, rewriting, or surfacing raw tool results would move responsibility to the wrong boundary and could expose unsafe output. The narrow invariant is:

After tool activity, the latest current-attempt assistant message is the final-delivery contract. If it exists but has no visible content, and no terminal output/delivery already completed the attempt, classify it as an empty final turn.

Each harness replay metadata still decides whether the one continuation is safe. The embedded/Pi replay-metadata builder now positively classifies known replay-safe tools and treats unknown/action-dependent tool names as potential side effects. If replay is unsafe, it does not continue automatically and the existing verify-before-retrying warning is used; if a safe retry is exhausted, the existing incomplete-turn warning is used.

Other harnesses inspected

Source audit used exact heads:

Harness Head Relevant completion contract
Pi d683a581b747 Agent loop branches on typed stopReason and toolCall blocks.
OpenCode 85e278b728f5 Provider adapters and session state use typed finish reasons and tool-call/tool-result parts.
Codex cdc1d592df7f Tool calls set typed needs_follow_up; empty finalized agent messages become None; the turn loop continues or ends from typed state (codex-rs/core/src/session/turn.rs, codex-rs/core/src/stream_events_utils.rs).
Gemini CLI 9e5599c323f1 Strict local/subagent execution requires the explicit complete_task tool and treats stopping without it as a protocol violation.
Goose 9d166ecee976 Structured recipe output uses an explicit final_output tool.
Hermes 2a14e8957d75 Branches on typed tool_calls. After a no-tool empty response with a recent tool role, it inserts one synthetic continuation nudge, then uses bounded generic empty-response retries/fallback; finalization strips recovery scaffolding and surfaces an explanation. Its regex in this branch recognizes provider <think> markup, not natural-language completion.
community Grok CLI fb97af83f06d Uses typed content/tool-call/tool-result/done chunks. Official Grok Build source was not available for inspection.

The common pattern is typed continuation/completion state, with explicit completion tools for strict workflows. None of these findings support language-regex classification or generic raw-result fallback for a normal chat turn.

Real behavior proof

  • Behavior addressed: A channel-facing agent could announce it was checking something, complete a replay-safe tool/search call, then stop with no final visible reply because the earlier narration masked the empty final assistant turn.
  • Real environment tested: The motivating failure and the discarded broad repair were observed on a live Discord-backed OpenClaw stack in fix: surface safe terminal tool fallbacks #90872. The narrow patch was also exercised locally through the real embedded xAI OAuth/provider path with xai/grok-composer-2.5-fast; the original Discord delivery path was not used.
  • Exact steps or command run after this patch: focused Vitest comparison on exact base f1b8827d20c8f1d648cdb1d4034120a67d1ff3e7 with only the original regression tests applied; the expanded post-tool safety matrix and full owner test on pre-maintainer head 92502cd8b4c3ce16c8ec493bf221512c7b36a656, plus exact-head focused Testbox proof on current head 3c55d30f9ca7223b3068fe640a5f0a3463269f3f; plus three bounded openclaw agent --local --model xai/grok-composer-2.5-fast turns covering healthy read-only search, terminal tool failure, and narration without a tool call.
  • Evidence after fix: The exact base comparison failed all three original logical regressions (6 failures across the two Vitest projects): retry resolver returned null, exhausted handling returned null, and the full runner stopped after one attempt. Pre-maintainer-head focused safety coverage passes 20/20 across the two projects, including known read-only recovery, mixed known-plus-unknown fail-closed behavior, and the side-effect-aware terminal warning. The full owner test file passes 150/150.
  • Observed result after fix: The regression trajectory receives the existing visible-answer continuation once; a visible final answer does not retry; terminal output is preserved; exhausted recovery surfaces the existing incomplete-turn error. Known read-only tools including web_search, memory_search, x_search, and tool_describe remain eligible. An unclassified tool receives no automatic retry, records replaySafe: false, and surfaces the verify-before-retrying warning. Live Composer completed one successful read-only x_search round with COMPOSER_FINAL_OK and no unnecessary retry. A denied terminal tool attempt was marked replay-invalid and was not replayed.
  • What was not tested: A post-patch live Discord reproduction. Composer did not emit an empty final assistant message after the successful live x_search round, so the exact model-generated failure was not reproduced on demand outside the deterministic captured trajectory; broad cross-channel E2E was not run.
  • Proof limitations or environment constraints: The original Discord stack and identifiers are private/redacted. One live Composer prompt produced narration without calling the requested web_search; that is a separate planning-only failure and does not prove this patch. The old PR's live after-fix output validated its discarded broad fallback approach, not this narrow patch, so it is retained only as provenance.
  • Before evidence: Redacted motivating Discord sequence recovered from the fix: surface safe terminal tool fallbacks #90872 investigation: Composer 2.5 said it was looking into the scheduler, performed a tool/search call whose result was 0, then emitted no final user-visible assistant reply.

Tests and validation

  • Exact base reproduction: base f1b8827d20c8f1d648cdb1d4034120a67d1ff3e7 + original regression tests -> 6 failed across two projects (3 logical regressions)
  • Pre-maintainer-head focused safety matrix: node scripts/run-vitest.mjs src/agents/embedded-agent-runner/run.incomplete-turn.test.ts --reporter=dot -t "known read-only|unclassified tools|unclassified tools as replay-invalid|pre-tool narration even when silence is allowed|post-tool exact NO_REPLY" -> 20 passed across two projects
  • Full owner test: node scripts/run-vitest.mjs src/agents/embedded-agent-runner/run.incomplete-turn.test.ts --reporter=dot -> 150 passed
  • Mutation classification test: node scripts/run-vitest.mjs src/agents/tool-mutation.test.ts --reporter=dot -> 48 passed
  • Exact-head focused Testbox proof: current head 3c55d30f9ca7223b3068fe640a5f0a3463269f3f; Blacksmith Testbox-through-Crabbox tbx_01kv4v9gbv92mnv435bsqdvn9p (run) -> owner test 150/150, mutation classification 48/48
  • Live Composer healthy path: real embedded xai/grok-composer-2.5-fast + one successful read-only x_search -> final COMPOSER_FINAL_OK, no extra retry
  • Live Composer unsafe-terminal guard: denied tool attempt -> replayInvalid: true, no replay
  • CI timeout recheck: node scripts/run-vitest.mjs src/auto-reply/reply/agent-runner-payloads.test.ts --reporter=dot -t "does not dedupe text for cross-target messaging sends" -> passed (1/1); the earlier PR CI failure was the same unrelated test timing out after 127 seconds and could not be rerun from contributor permissions/workflow state
  • pnpm format:check src/agents/embedded-agent-runner/run/incomplete-turn.ts src/agents/embedded-agent-runner/run.incomplete-turn.test.ts -> passed
  • pnpm changed:lanes --json -> core, coreTests
  • pnpm check:changed -> passed on pre-maintainer head Blacksmith Testbox tbx_01kv41nef5fjxznf9p64z6yhct (run)
  • Trusted exact-head autoreview on 3c55d30f9ca7223b3068fe640a5f0a3463269f3f -> clean, no accepted/actionable findings
  • git diff --check -> clean
  • Current PR surface: source +56/-19, tests +198/-11, two files

The original regression fails on the exact base before the production change. The final head fixes it while failing closed for unclassified tools and preserving recovery for the known read-only tool surface.

Risk checklist

Did user-visible behavior change? Yes

Did config, environment, or migration behavior change? No

Did security, auth, secrets, network, or tool execution behavior change? Yes: one existing bounded continuation can now run for this previously missed typed terminal state.

Highest-risk area: retrying after tool activity could duplicate work or replace already-delivered terminal output.

Mitigation: the continuation remains limited to one attempt and is blocked by harness replay metadata, terminal output, committed delivery, accepted spawn, error, abort, timeout, and explicit-silence guards. The embedded/Pi replay builder now fails closed for unclassified or action-dependent tool names; those attempts surface a verify-before-retrying warning. The patch does not surface raw tool results.

Current review state

Ready for maintainer review at current head 3c55d30f9ca7223b3068fe640a5f0a3463269f3f. Exact-head focused Testbox proof and trusted autoreview are green; the prior exact-base reproduction, remote changed gate, and bounded live Composer safety/healthy-path checks remain recorded above. Current-head GitHub CI is running without failures observed at this refresh. The remaining proof gap is forcing the original successful-tool-then-empty-final Composer failure on the private Discord/model stack.

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

clawsweeper Bot commented Jun 14, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs real behavior proof before merge. Reviewed June 15, 2026, 3:05 AM ET / 07:05 UTC.

Summary
The PR retries replay-safe empty post-tool final assistant turns and wires replay-safety metadata through embedded, Codex, Copilot, channel-tool, plugin-manifest, SDK, and test surfaces.

PR surface: Source +221, Tests +486. Total +707 across 30 files.

Reproducibility: yes. source-reproducible: current main can treat aggregate pre-tool narration as non-empty before considering the latest empty post-tool assistant message.

Review metrics: 2 noteworthy metrics.

  • Public replay surfaces: 1 manifest field added, 2 SDK exports added. These surfaces become plugin-facing compatibility contracts unless maintainers intentionally keep them internal or document them before merge.
  • Current PR size: +790/-82 across 31 files. The branch now spans core runner, Codex/Copilot harnesses, plugins, SDK, and tests, so review must cover more than the narrow two-file recovery originally described.

Stored data model
Persistent data-model change detected: vector/embedding metadata: src/agents/channel-tool-metadata.test.ts, vector/embedding metadata: src/agents/channel-tool-metadata.ts, vector/embedding metadata: src/agents/channel-tools.ts, vector/embedding metadata: src/agents/tool-replay-safety.test.ts, vector/embedding metadata: src/plugin-sdk/agent-harness-runtime.ts. Confirm migration or upgrade compatibility proof before merge.

Merge readiness
Overall: 🦪 silver shellfish
Proof: 🦪 silver shellfish
Patch quality: 🦐 gold shrimp
Result: blocked until stronger real behavior proof is added.

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

Rank-up moves:

  • Resolve or document the public replaySafe manifest and SDK contract.
  • [P1] Add redacted live/log proof of a replay-safe empty-final recovery, or get explicit maintainer acceptance of deterministic proof.

Proof guidance:

  • [P1] Needs stronger real behavior proof before merge: The PR has tests and live safety/healthy-path logs, but it still says the exact post-patch live empty-final recovery was not reproduced. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.

Risk before merge

  • [P1] The new fail-closed replay whitelist can change upgrade behavior for plugin/custom tools that previously retried under name heuristics, surfacing verify-before-retrying warnings instead of automatic recovery.
  • [P1] The PR adds a public-looking manifest field and SDK exports for replay safety, but the field is not documented and is only effective for hard-coded allowlisted names.
  • [P1] The PR body still states the exact live successful-tool-then-empty-final failure was not reproduced after this patch.

Maintainer options:

  1. Settle The Public Replay Contract (recommended)
    Before merge, either keep replay-safety metadata internal to bundled tools or document the manifest/SDK semantics with tests that show how non-allowlisted plugin tools behave.
  2. Accept The Whitelist As A Maintainer Decision
    Maintainers can explicitly accept that only audited hard-coded names may ever become replay-safe, even when plugin manifests set replaySafe.
  3. Pause For Exact Live Proof
    Pause merge until the contributor or maintainer supplies redacted logs or output showing this patch recovers the exact post-tool empty-final state without duplicated side effects.

Next step before merge

  • [P1] Human review is needed because the remaining blockers are API/compatibility judgment and real behavior proof, not an automation-safe repair.

Security
Cleared: No dependency, workflow, package, secret-handling, or supply-chain regression was found; replay duplication remains a functional compatibility risk.

Review findings

  • [P1] Define the replaySafe manifest contract before exposing it — src/plugins/manifest.ts:508-509
Review details

Best possible solution:

Resolve whether replay-safe tool metadata is an intentional public plugin/SDK contract, document and test that contract if kept, and require maintainer acceptance or real logs for the exact empty-final recovery before merge.

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

Yes, source-reproducible: current main can treat aggregate pre-tool narration as non-empty before considering the latest empty post-tool assistant message.

Is this the best way to solve the issue?

No for merge readiness: the typed-state fix is the right layer versus the superseded broad fallback PR, but the public plugin/SDK replay contract and proof gap still need maintainer resolution.

Full review comments:

  • [P1] Define the replaySafe manifest contract before exposing it — src/plugins/manifest.ts:508-509
    Adding replaySafe to PluginManifestToolMetadata makes this look like a plugin manifest contract, but the runtime still ignores a true declaration unless the tool name is already in the hard-coded replay allowlist. An external plugin can set toolMetadata.example_search.replaySafe: true and remain replay-unsafe, so keep this internal or document and test the real public semantics before merge.
    Confidence: 0.86

Overall correctness: patch is incorrect
Overall confidence: 0.86

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 1c30bb8ce639.

Label changes

Label justifications:

  • P1: The PR targets a broken agent/channel workflow where users can see pre-tool narration followed by no final answer after tool activity.
  • merge-risk: 🚨 compatibility: The diff changes retry eligibility for existing tool names and adds plugin-facing replay metadata whose upgrade semantics are not settled.
  • rating: 🦪 silver shellfish: Overall readiness is 🦪 silver shellfish; proof is 🦪 silver shellfish and patch quality is 🦐 gold shrimp.
  • status: 📣 needs proof: The PR needs real behavior proof before ClawSweeper can clear the contributor ask. Needs stronger real behavior proof before merge: The PR has tests and live safety/healthy-path logs, but it still says the exact post-patch live empty-final recovery was not reproduced. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.
Evidence reviewed

PR surface:

Source +221, Tests +486. Total +707 across 30 files.

View PR surface stats
Area Files Added Removed Net
Source 21 285 64 +221
Tests 9 504 18 +486
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 30 789 82 +707

What I checked:

  • Repository policy applied: Root and scoped AGENTS.md guidance was read; plugin SDK and manifest changes are compatibility-sensitive and Codex-related verdicts require direct sibling Codex source inspection. (AGENTS.md:18, 1c30bb8ce639)
  • Current main misses the reported state: Current main returns false for empty-response recovery when payloadCount is nonzero or aggregate assistantTexts are nonempty, so earlier pre-tool narration can mask a latest empty post-tool assistant turn. (src/agents/embedded-agent-runner/run/incomplete-turn.ts:678, 1c30bb8ce639)
  • PR classifies the typed latest assistant: The PR adds post-tool latest-assistant empty-turn classification and lets that state bypass aggregate payload/text guards before returning the existing empty-response retry instruction. (src/agents/embedded-agent-runner/run/incomplete-turn.ts:620, c504aed7e706)
  • Replay safety fails closed for unknown tools: The PR replaces mutating-name replay metadata with a replaySafe-positive tool-meta check, making unclassified tool results potential side effects before automatic retry. (src/agents/embedded-agent-runner/run/incomplete-turn.ts:251, c504aed7e706)
  • Public manifest field added: The PR accepts a new toolMetadata.replaySafe manifest field, but current public manifest docs only describe toolMetadata as availability evidence and do not define replay-safety semantics. (src/plugins/manifest.ts:508, c504aed7e706)
  • Manifest opt-in is not a general opt-in: isAgentToolReplaySafe ignores declaredReplaySafe true unless the normalized name is already in the hard-coded allowlist, so a public manifest field can be set on an external tool without making that tool replay-safe. (src/agents/tool-replay-safety.ts:31, c504aed7e706)

Likely related people:

  • steipete: Authored the current PR's maintainer follow-up commits and merged adjacent incomplete-turn fixes fix(agents): detect truncated API responses to prevent silent session hang #89160 and fix(agents): retry thinking-only errored turns #92191. (role: recent area contributor and merger; confidence: high; commits: c504aed7e706, ecaebfc51b4a, 81924cfd5e61; files: src/agents/embedded-agent-runner/run/incomplete-turn.ts, src/agents/embedded-agent-runner/run.incomplete-turn.test.ts)
  • ai-hpc: Authored the recently merged thinking-only errored-turn retry work that shaped the same incomplete-turn recovery surface. (role: recent adjacent feature contributor; confidence: medium; commits: ecaebfc51b4a; files: src/agents/embedded-agent-runner/run/incomplete-turn.ts, src/agents/embedded-agent-runner/run.incomplete-turn.test.ts)
  • joelnishanth: Authored the recently merged length-limited response fix that changed nearby incomplete-turn and terminal-state guards. (role: recent adjacent contributor; confidence: medium; commits: 81924cfd5e61; files: src/agents/embedded-agent-runner/run/incomplete-turn.ts, src/agents/embedded-agent-runner/run.incomplete-turn.test.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: 🧂 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. P1 High-priority user-facing bug, regression, or broken workflow. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. labels Jun 14, 2026
@fuller-stack-dev

Copy link
Copy Markdown
Member Author

@clawsweeper re-review

Addressed the fail-closed finding on 92502cd8: embedded/Pi replay metadata now treats unclassified or action-dependent tool names as potential side effects. Unknown post-tool empty-final turns do not auto-retry and surface the verify-before-retrying warning; known read-only paths remain eligible, including web_search, memory_search, x_search, and tool_describe.

Proof: focused safety matrix 20/20, owner test 150/150, mutation tests 48/48, final Testbox tbx_01kv41nef5fjxznf9p64z6yhct green, and fresh autoreview clean. The exact live model-generated empty-final remains the documented proof gap.

@clawsweeper

clawsweeper Bot commented Jun 14, 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: 🦪 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: 🔁 re-review loop A fresh ClawSweeper review was explicitly requested after the latest review. and removed 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. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels Jun 14, 2026
@steipete steipete self-assigned this Jun 15, 2026
@steipete
steipete force-pushed the codex/fix-post-tool-empty-final-reply branch from 92502cd to 3c55d30 Compare June 15, 2026 05:13
@fuller-stack-dev

Copy link
Copy Markdown
Member Author

@clawsweeper re-review

Current head 3c55d30f9ca7223b3068fe640a5f0a3463269f3f includes the fail-closed unknown-tool repair plus the maintainer follow-up assertion for the verify-before-retrying warning.

Exact-head proof: Blacksmith Testbox-through-Crabbox tbx_01kv4v9gbv92mnv435bsqdvn9p (run) passed the owner test 150/150 and mutation classification 48/48; git diff --check is clean; trusted autoreview is clean with no accepted/actionable findings. The PR body now distinguishes prior-head proof from this current-head refresh. Current-head CI has no failing checks observed and remains in progress. The model-generated live Discord empty-final remains the documented proof gap.

@clawsweeper

clawsweeper Bot commented Jun 15, 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: 🦪 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. and removed rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 🔁 re-review loop A fresh ClawSweeper review was explicitly requested after the latest review. labels Jun 15, 2026
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Jun 16, 2026
Recover assistant turns that complete tool work without producing a visible final answer, while preserving intentional silent replies.

Use concrete tool-instance replay safety across embedded, Codex, and Copilot runtimes so unknown, mutating, async-started, and durable recall operations fail closed. Preserve genuine empty Codex final items without promoting commentary or tool-progress echoes.

Supersedes openclaw#90872. Thanks @fuller-stack-dev.

Co-authored-by: fuller-stack-dev <[email protected]>
wangmiao0668000666 pushed a commit to wangmiao0668000666/openclaw that referenced this pull request Jun 17, 2026
Recover assistant turns that complete tool work without producing a visible final answer, while preserving intentional silent replies.

Use concrete tool-instance replay safety across embedded, Codex, and Copilot runtimes so unknown, mutating, async-started, and durable recall operations fail closed. Preserve genuine empty Codex final items without promoting commentary or tool-progress echoes.

Supersedes openclaw#90872. Thanks @fuller-stack-dev.

Co-authored-by: fuller-stack-dev <[email protected]>
crh-code pushed a commit to crh-code/openclaw that referenced this pull request Jun 18, 2026
Recover assistant turns that complete tool work without producing a visible final answer, while preserving intentional silent replies.

Use concrete tool-instance replay safety across embedded, Codex, and Copilot runtimes so unknown, mutating, async-started, and durable recall operations fail closed. Preserve genuine empty Codex final items without promoting commentary or tool-progress echoes.

Supersedes openclaw#90872. Thanks @fuller-stack-dev.

Co-authored-by: fuller-stack-dev <[email protected]>
badgerbees pushed a commit to badgerbees/openclaw that referenced this pull request Jul 8, 2026
Recover assistant turns that complete tool work without producing a visible final answer, while preserving intentional silent replies.

Use concrete tool-instance replay safety across embedded, Codex, and Copilot runtimes so unknown, mutating, async-started, and durable recall operations fail closed. Preserve genuine empty Codex final items without promoting commentary or tool-progress echoes.

Supersedes openclaw#90872. Thanks @fuller-stack-dev.

Co-authored-by: fuller-stack-dev <[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 extensions: codex extensions: copilot extensions: memory-core Extension: memory-core extensions: xai merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. P1 High-priority user-facing bug, regression, or broken workflow. proof: supplied External PR includes structured after-fix real behavior proof. rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. size: L status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants