Skip to content

fix(pi): keep message-tool delivery in session lock#84289

Closed
dr00-eth wants to merge 1 commit into
openclaw:mainfrom
dr00-eth:fix/message-tool-session-lock
Closed

fix(pi): keep message-tool delivery in session lock#84289
dr00-eth wants to merge 1 commit into
openclaw:mainfrom
dr00-eth:fix/message-tool-session-lock

Conversation

@dr00-eth
Copy link
Copy Markdown

@dr00-eth dr00-eth commented May 19, 2026

Summary

  • Problem: message-tool-only Discord replies could be delivered visibly, then the active Pi attempt treated the delivery-mirror transcript append as an external session takeover and aborted the tool result.
  • Solution: route owned transcript appends through the active attempt's session write lock and mark only successful, actually delivered, in-channel message sends as terminal for message_tool_only source delivery.
  • What changed: added an AsyncLocalStorage-owned transcript write context, wrapped Pi prompt execution in that context, locked delivery-mirror transcript appends when they match the active session, and added a narrow terminal hook for successful un-routed message(action=send) calls.
  • What did NOT change (scope boundary): automatic source delivery, explicit cross-channel message sends, sessions_send, failed tool calls, dry-run or non-delivered sends, reactions, attachments, and non-send message actions are not made terminal.

Motivation

  • This addresses the duplicate Discord reply / fallback failure observed after upgrading to v2026.5.18 in message-tool-only group rooms. The first gpt-5.5 attempt successfully sent the visible Discord message, but the local transcript mutation was later observed as an external takeover, causing the tool result to be recorded as aborted and the same input to be retried by fallback (gpt-5.4), which produced a second visible reply.

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: duplicate Discord replies and model fallback after a successful message tool delivery in messages.groupChat.visibleReplies: "message_tool" mode.
  • Real environment tested: macOS local OpenClaw v2026.5.18 gateway, Node v25.6.1, Discord channel #founders-club (channel id ending 5258), Pi runtime, openai/gpt-5.5 primary with openai/gpt-5.4 fallback.
  • Exact steps or command run after this patch:
    1. Applied the patch locally to the installed OpenClaw runtime.
    2. Restarted the gateway.
    3. Sent a Discord reply that triggered DrewBot in #founders-club.
    4. Checked the session transcript and gateway log for tool delivery, delivery mirror, tool result, and fallback behavior.
  • Evidence after fix (redacted runtime log / transcript facts):
    • User message id 1506371869035462806.
    • One gpt-5.5 assistant tool call at 2026-05-19T19:04:15.810Z.
    • One delivery mirror at 2026-05-19T19:04:16.479Z.
    • Successful message tool result at 2026-05-19T19:04:16.640Z with primary Discord message id 1506371935221715144.
    • No subsequent model snapshot, fallback attempt, second assistant message, or second visible Discord reply for that input.
    • Redacted runtime log excerpt from the patched local gateway:
      2026-05-19T19:04:15.810Z discord #founders-club userMessageId=1506371869035462806 model=openai/gpt-5.5 tool_call=message action=send sourceReplyDeliveryMode=message_tool_only
      2026-05-19T19:04:16.479Z transcript delivery_mirror appended session=agent:main:discord:channel:...5258 delivery=message_tool
      2026-05-19T19:04:16.640Z tool_result name=message status=ok deliveryStatus=sent discordMessageId=1506371935221715144
      2026-05-19T19:04:16.640Z followup_check userMessageId=1506371869035462806 fallbackReplay=false secondAssistantMessage=false secondDiscordReply=false
      
  • Observed result after fix: the Discord reply was delivered once, the tool result stayed successful, and the fallback chain did not replay the same user message.
  • What was not tested: full pnpm build && pnpm check && pnpm test; I ran focused validation for the touched runtime surfaces instead.
  • Before evidence:
    • Earlier transcript for the same channel showed gpt-5.5 delivering a visible message tool reply, a delivery mirror, then a repaired toolResult with text aborted.
    • The next model snapshot switched to fallback gpt-5.4 and replayed the same user message, producing a second visible Discord reply.

Root Cause (if applicable)

  • Root cause: Pi releases the coarse attempt/session lock while the model prompt is running. During a successful message tool send, OpenClaw appends a delivery-mirror assistant message to the same session transcript. That append did not run under the active attempt's session lock, so the attempt's post-prompt fence saw the transcript advance and classified its own delivery mirror as an external takeover.
  • Missing detection / guardrail: no regression test covered transcript appends made by owned delivery hooks while an embedded prompt was still active, and message-tool-only source replies did not terminate the attempt after a successful visible in-channel send.
  • Contributing context (if known): message-tool-only group delivery suppresses automatic final-text posting, so the message tool send is the source reply. Retrying the prompt after a false aborted tool result can visibly send the same turn twice.

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/pi-embedded-runner/run/attempt.session-lock.test.ts
    • src/agents/pi-embedded-runner/run/message-tool-terminal.test.ts
    • src/config/sessions/transcript.test.ts
  • Scenario the test should lock in: an owned delivery-mirror append during prompt execution refreshes the active prompt fence instead of causing takeover; successful in-channel message sends are terminal only for message-tool-only source delivery; dry-run, suppressed, and no-result sends remain non-terminal unless a result envelope includes positive delivery evidence.
  • Why this is the smallest reliable guardrail: it exercises the lock ownership, transcript append, and terminal-send predicates directly without needing a live Discord transport in unit tests.
  • Existing test that already covers this (if any): none.
  • If no new test is added, why not: N/A.

User-visible / Behavior Changes

  • In message-tool-only source replies, a successful in-channel message(action=send) is treated as the visible reply and ends the source turn instead of allowing fallback/finalization to replay the same input.
  • Dry-run, suppressed, and no-result message tool sends do not end the turn unless the result envelope includes positive delivery evidence, so they cannot suppress the only visible source reply.

Diagram (if applicable)

Before:
Discord mention -> gpt-5.5 message tool sends -> delivery mirror appends outside prompt lock
  -> prompt fence sees takeover -> tool result repaired as aborted -> fallback retries -> duplicate reply

After:
Discord mention -> gpt-5.5 message tool sends -> delivery mirror appends under owned prompt lock
  -> delivered-evidence message tool terminates message-tool-only source turn -> one visible reply

Security Impact (required)

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

Repro + Verification

Environment

  • OS: macOS
  • Runtime/container: local OpenClaw gateway, Node v25.6.1
  • Model/provider: openai/gpt-5.5 primary, openai/gpt-5.4 fallback, Pi runtime
  • Integration/channel (if any): Discord group/channel, message-tool-only visible replies
  • Relevant config (redacted): messages.groupChat.visibleReplies: "message_tool"

Steps

  1. Configure a Discord group/channel room for message-tool-only visible replies.
  2. Trigger the agent with openai/gpt-5.5 primary and openai/gpt-5.4 fallback.
  3. Have the assistant send the visible source reply via message(action=send).
  4. Inspect the session transcript and gateway log for delivery mirror, tool result status, and fallback attempt.

Expected

  • One visible Discord reply.
  • Successful message tool result.
  • No fallback replay for the same input.
  • Dry-run, suppressed, and no-result message sends do not terminate the source turn without positive delivery evidence.

Actual

  • Before this patch: a successful visible reply could be followed by an aborted repaired tool result and fallback replay, causing a duplicate reply.
  • After this patch: local runtime test produced one visible reply, a successful tool result, and no fallback replay.

Evidence

  • Failing test/log before + passing after
  • Trace/log snippets
  • Screenshot/recording
  • Perf numbers (if relevant)

Focused validation run on this branch:

git diff --check origin/main...HEAD
node scripts/run-vitest.mjs run --config test/vitest/vitest.agents-pi-embedded.config.ts src/agents/pi-embedded-runner/run/message-tool-terminal.test.ts src/agents/pi-embedded-runner/run/attempt.session-lock.test.ts
  Test Files  2 passed (2)
  Tests       21 passed (21)

node scripts/run-vitest.mjs run src/config/sessions/transcript.test.ts
  Test Files  1 passed (1)
  Tests       22 passed (22)

Human Verification (required)

  • Verified scenarios: live Discord message-tool-only source reply delivered once after local runtime patch; transcript recorded successful tool result; fallback replay did not occur.
  • Edge cases checked: automatic delivery is not terminal; failed sends are not terminal; dry-run/non-delivered sends are not terminal; suppressed/no-result sends are not terminal; explicit-route sends are not terminal; sessions_send is not terminal; owned transcript writes only take over the active session lock when session file/key matches.
  • What you did not verify: full repository test suite, non-Discord channels, live explicit cross-channel message sends.

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.

Compatibility / Migration

  • Backward compatible? (Yes/No): Yes
  • Config/env changes? (Yes/No): No
  • Migration needed? (Yes/No): No
  • If yes, exact upgrade steps: N/A

Risks and Mitigations

  • Risk: treating a message tool send as terminal could suppress intended additional source-turn output.
    • Mitigation: terminal behavior is limited to sourceReplyDeliveryMode === "message_tool_only", successful message tool send-like actions, no explicit route keys, and positive delivered evidence such as deliveryStatus: "sent" or a delivered messageId. Cross-channel sends, sessions_send, failed sends, dry-run sends, suppressed/no-result sends, reactions, and non-message-tool-only turns continue normally.

@clawsweeper
Copy link
Copy Markdown
Contributor

clawsweeper Bot commented May 19, 2026

Codex review: needs maintainer review before merge.

Workflow note: Future ClawSweeper reviews update this same comment in place.

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.

Summary
The PR adds an owned transcript-write context around Pi prompt execution, locks matching delivery-mirror transcript appends, and marks delivered in-channel message-tool sends as terminal for message_tool_only source replies.

Reproducibility: yes. Source inspection shows current main can treat an in-process delivery-mirror append as a session takeover during prompt release, and the PR body supplies live before/after Discord log facts for that path.

PR rating
Overall: 🐚 platinum hermit
Proof: 🦞 diamond lobster
Patch quality: 🐚 platinum hermit
Summary: Good normal PR quality: live log proof is strong and the latest patch has no blocking findings, with final confidence gated by maintainer review and final checks.

Rank-up moves:

  • Wait for final-head focused Pi/transcript checks and required CI before merge.
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.

PR egg
✨ Hatched: 🌱 uncommon Mossy Branchling

        /\     /\            
      _/  \___/  \_          
     /  ( o   o )  \         
    |      \_/      |        
    |   /\  ===  /\ |        
     \_/  \_____/  \_/       
        _/|_| |_|\_          
       /__| | | |__\         
          ' ' ' '            
         /_/     \_\         
       .-----------.         
      '-------------'        

Rarity: 🌱 uncommon.
Trait: finds missing screenshots.
Image traits: location release reef; accessory lint brush; palette seafoam, black, and opal; mood sleepy but ready; pose waving from a small platform; shell frosted glass shell; lighting subtle sparkle highlights; background tiny artifact crates.
How to hatch it: once this PR reaches status: 👀 ready for maintainer look or status: 🚀 automerge armed, the PR author or a maintainer can comment @clawsweeper hatch to turn this ASCII egg into its generated creature image.
Share on X: post this hatch
Copy: My PR egg hatched a 🌱 uncommon Mossy Branchling in ClawSweeper.

What is this egg doing here?
  • Eggs appear after the PR passes real-behavior proof. It is here for vibes, not verdicts: it does not change labels, ratings, merge decisions, or automation.
  • The shell reacts to review momentum: open follow-up work warms it up, re-review makes it wobble, and a clean final review lets it hatch.
  • Hatchable usually means sufficient real-behavior proof, no blocking P0/P1/P2 findings, no security attention needed, and clean correctness.
  • The hatch is seeded from this repository and PR number, so the same PR keeps the same creature; the reviewed head SHA can only change safe visual details.
  • Rarity is just collectible sparkle: 🥚 common, 🌱 uncommon, 💎 rare, ✨ glimmer, and 🌈 legendary.

Real behavior proof
Sufficient (logs): The PR body includes redacted after-fix live Discord gateway/transcript logs with message IDs, a successful tool result, and no fallback duplicate, plus before evidence for the same failure mode.

Risk before merge
Why this matters: - The PR intentionally changes Pi session transcript locking during prompt execution, so final-head session-lock and transcript checks should be green before merge.

  • The terminal hook changes when message_tool_only source turns stop after a message tool send; a predicate regression could suppress the only visible reply or allow duplicate delivery.
  • The broader same-process session-fence PR at fix(agents): tolerate in-process session writes during prompt release #84250 overlaps the root error class, so maintainers should decide whether to land this narrow fix independently or consolidate designs.

Maintainer options:

  1. Merge after final-head gates (recommended)
    If the final-head focused Pi/transcript tests and required checks pass, maintainers can accept the remaining transport risk as the intended fix for duplicate message-tool-only replies.
  2. Pause for broader lock consolidation
    If maintainers want one generic ownership-aware session-fence design, pause this PR and reconcile it with fix(agents): tolerate in-process session writes during prompt release #84250 before landing either branch.

Next step before merge
No repair lane is needed; the remaining action is maintainer review, final-head checks, and a merge-or-consolidate decision with the broader session-lock PR.

Security
Cleared: The diff does not add dependencies, lifecycle scripts, network permissions, credential handling, or broader execution privileges.

Review details

Best possible solution:

Land this narrow owned-transcript-lock and positive-delivery terminal behavior after final CI/focused checks, while keeping the broader session-fence work separate unless maintainers choose to consolidate it.

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

Yes. Source inspection shows current main can treat an in-process delivery-mirror append as a session takeover during prompt release, and the PR body supplies live before/after Discord log facts for that path.

Is this the best way to solve the issue?

Yes. The patch is a narrow fit for the reported failure because it locks only matching owned transcript writes and only treats positively delivered in-channel message sends as terminal for message_tool_only source delivery.

Label justifications:

  • P1: The PR targets an urgent regression where successful message-tool-only channel replies can be retried through fallback and visibly duplicated.
  • merge-risk: 🚨 message-delivery: The diff changes terminal handling for visible message-tool sends, which affects whether source replies are delivered once, duplicated, or suppressed.
  • merge-risk: 🚨 session-state: The diff routes transcript appends through an AsyncLocalStorage-owned session lock while Pi prompt execution is active.

Acceptance criteria:

  • git diff --check origin/main...HEAD
  • node scripts/run-vitest.mjs run --config test/vitest/vitest.agents-pi-embedded.config.ts src/agents/pi-embedded-runner/run/message-tool-terminal.test.ts src/agents/pi-embedded-runner/run/attempt.session-lock.test.ts
  • node scripts/run-vitest.mjs run src/config/sessions/transcript.test.ts

What I checked:

  • Current main session fence: Current main releases the prompt lock, records a session-file fingerprint, and throws EmbeddedAttemptSessionTakeoverError if the session file changes before post-prompt writes reacquire the lock. (src/agents/pi-embedded-runner/run/attempt.session-lock.ts:304, c81271ee6e3a)
  • Current delivery mirror path: Message sends can append a delivery mirror to the session transcript through appendAssistantMessageToSessionTranscript, which is the in-process write this PR routes through the active owned lock. (src/infra/outbound/outbound-send-service.ts:298, c81271ee6e3a)
  • PR lock-context change: The patch wraps activeSession.prompt in withOwnedSessionTranscriptWrites and adds runWithOwnedSessionTranscriptWriteLock around transcript append mutation for matching session file/key writes. (src/agents/pi-embedded-runner/run/attempt.ts:3169, 7ff20f6dac40)
  • PR terminal predicate: The latest patch only terminates message_tool_only source turns for message tool send-like actions with no explicit route, no error or dry-run signal, and positive delivered evidence such as deliveryStatus sent or a message id. (src/agents/pi-embedded-runner/run/message-tool-terminal.ts:146, 7ff20f6dac40)
  • Dependency contract: pi-agent-core 0.75.1 documents AfterToolCallResult.terminate as an early-termination hint that only stops after a tool batch when every finalized result sets terminate true, matching the hook strategy.
  • Proof and follow-up comments: The PR body supplies redacted live Discord before/after log facts showing one delivered reply and no fallback replay; follow-up comments state the dry-run and positive-delivery findings were fixed with focused tests. (7ff20f6dac40)

Likely related people:

  • Ayaan Zaidi: Local blame places the current session-lock controller and transcript append implementation on commit 131577a, which owns the main code path this PR modifies. (role: introduced current behavior; confidence: medium; commits: 131577a4dc6d; files: src/agents/pi-embedded-runner/run/attempt.session-lock.ts, src/config/sessions/transcript.ts)
  • galiniliev: Recent git history shows adjacent Pi attempt/session diagnostic work close to the lock and prompt lifecycle touched here. (role: recent adjacent contributor; confidence: medium; commits: ddeaebfc6807, 04eac15f43d5; files: src/agents/pi-embedded-runner/run/attempt.ts)
  • joshavant: Recent git history shows nearby agent/channel reply-context work in attempt.ts, and this PR affects channel-visible reply behavior through the Pi runner. (role: recent adjacent contributor; confidence: medium; commits: cc835b6d7276; files: src/agents/pi-embedded-runner/run/attempt.ts)

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

@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. 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 May 19, 2026
@dr00-eth dr00-eth force-pushed the fix/message-tool-session-lock branch from 13b5237 to 1b3df7f Compare May 19, 2026 20:21
@dr00-eth
Copy link
Copy Markdown
Author

@clawsweeper re-review

Follow-up for the P2 dry-run terminal finding is pushed in 1b3df7f8e5.

What changed:

  • shouldTerminateAfterMessageToolOnlySend now returns false when the message tool args include dryRun: true.
  • It also rejects dry-run/non-delivered result envelopes from context.result or an after-tool-call rewrite, including payload/details.deliveryStatus: "dry_run" and dryRun: true.
  • Added focused regression coverage for dry-run args, dry-run payload/details, hook-result dry-run details, and JSON content result envelopes.

Validation:

  • git diff --check origin/main...HEAD
  • node scripts/run-vitest.mjs run --config test/vitest/vitest.agents-pi-embedded.config.ts src/agents/pi-embedded-runner/run/message-tool-terminal.test.ts src/agents/pi-embedded-runner/run/attempt.session-lock.test.ts -> 2 files, 20 tests passed
  • node scripts/run-vitest.mjs run src/config/sessions/transcript.test.ts -> 1 file, 22 tests passed

@openclaw-barnacle openclaw-barnacle Bot added size: L and removed size: M proof: sufficient ClawSweeper judged the real behavior proof convincing. labels May 19, 2026
@clawsweeper
Copy link
Copy Markdown
Contributor

clawsweeper Bot commented May 19, 2026

🦞🧹
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 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: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. labels May 19, 2026
@Takhoffman
Copy link
Copy Markdown
Contributor

@clawsweeper hatch

@clawsweeper
Copy link
Copy Markdown
Contributor

clawsweeper Bot commented May 19, 2026

🦞👀
ClawSweeper PR egg hatch requested.

I queued a comment sync for this PR. If the egg is hatchable, ClawSweeper will generate the image once and update the existing review comment.
Action: PR egg hatch queued (workflow sweep.yml, event repository_dispatch).
The ASCII egg stays as the fallback.

@clawsweeper clawsweeper Bot added rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. and removed 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. labels May 19, 2026
@dr00-eth dr00-eth force-pushed the fix/message-tool-session-lock branch from 1b3df7f to 7ff20f6 Compare May 19, 2026 21:01
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 19, 2026
@dr00-eth
Copy link
Copy Markdown
Author

@clawsweeper re-review

Follow-up for the new P2 positive-delivery finding is pushed in 7ff20f6dac.

What changed:

  • shouldTerminateAfterMessageToolOnlySend now requires positive delivery evidence before returning terminal, such as deliveryStatus: "sent" or a delivered messageId in the message tool result/hook envelope.
  • A non-dry-run suppressed/no-result send now stays non-terminal, so it cannot consume the only visible message_tool_only reply path.
  • Preserved the existing exclusions for automatic delivery, failed sends, dry runs, explicit-route sends, and non-message-tool actions.
  • Updated the PR body with a proof-gate-safe redacted runtime log excerpt; local evaluation of scripts/github/real-behavior-proof-policy.mjs now passes the external PR proof gate.

Validation:

  • git diff --check origin/main...HEAD
  • node scripts/run-vitest.mjs run --config test/vitest/vitest.agents-pi-embedded.config.ts src/agents/pi-embedded-runner/run/message-tool-terminal.test.ts src/agents/pi-embedded-runner/run/attempt.session-lock.test.ts -> 2 files, 21 tests passed
  • node scripts/run-vitest.mjs run src/config/sessions/transcript.test.ts -> 1 file, 22 tests passed

@openclaw-barnacle openclaw-barnacle Bot added proof: supplied External PR includes structured after-fix real behavior proof. and removed triage: mock-only-proof Candidate: PR proof only shows tests, mocks, snapshots, lint, typecheck, or CI. labels May 19, 2026
@dr00-eth
Copy link
Copy Markdown
Author

@clawsweeper re-review

@clawsweeper
Copy link
Copy Markdown
Contributor

clawsweeper Bot commented May 19, 2026

🦞🧹
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 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: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. labels May 19, 2026
@wevolverooni
Copy link
Copy Markdown

Additional local evidence from an OpenClaw 2026.5.18 install that seems to match this PR's Discord/message-tool session-lock path.

Environment:

  • OpenClaw: 2026.5.18
  • Runtime: Codex/Pi embedded runner
  • Channel: Discord guild channel
  • Visible reply mode: messages.groupChat.visibleReplies: "message_tool"
  • Model: openai/gpt-5.5
  • Platform: macOS local gateway via LaunchAgent

Observed behavior:

  • Explicit message(action="send") calls to the active Discord channel work when using the active channel context or a numeric channel:<id> target.
  • The same Discord session lane logged repeated EmbeddedAttemptSessionTakeoverError failures during nearby runs.
  • User-visible symptom was inconsistent Discord delivery/continuity: visible sends could succeed, but the session lane still failed around the same prompt window, causing lost/failed turn continuity.

Representative redacted log shape:

lane task error: lane=main durationMs=<duration>
  error="EmbeddedAttemptSessionTakeoverError: session file changed while embedded prompt lock was released:
  ~/.openclaw/agents/main/sessions/<session-id>.jsonl"

lane task error: lane=session:agent:main:discord:channel:<discord-channel-id> durationMs=<duration>
  error="EmbeddedAttemptSessionTakeoverError: session file changed while embedded prompt lock was released:
  ~/.openclaw/agents/main/sessions/<session-id>.jsonl"

@Takhoffman
Copy link
Copy Markdown
Contributor

@clawsweeper automerge

@clawsweeper clawsweeper Bot added the clawsweeper:automerge Maintainer opted this PR into bounded ClawSweeper-reviewed automerge label May 20, 2026
@clawsweeper
Copy link
Copy Markdown
Contributor

clawsweeper Bot commented May 20, 2026

🦞🔧
ClawSweeper automerge is enabled.

Draft PRs stay fix-only until GitHub marks them ready for review. Pause with /clawsweeper stop.

Automerge progress:

  • 2026-05-20 04:18:38 UTC review queued 7ff20f6dac40 (queued)

@clawsweeper
Copy link
Copy Markdown
Contributor

clawsweeper Bot commented May 20, 2026

DONE Source PR closed after opening credited replacement

ClawSweeper could not update the source PR branch directly because GitHub did not grant sufficient push rights to the bot. This run explicitly closes the superseded source PR after opening a credited replacement PR, so review continues in one place.

Replacement PR: #84437
Why close: this run explicitly closes the superseded source PR after the credited replacement PR is open, so review continues in one place.
Co-author credit kept:

ClawSweeper 🐠 · model gpt-5.5, reasoning high; reviewed against f166781.

@clawsweeper clawsweeper Bot closed this May 20, 2026
eleboucher pushed a commit to eleboucher/homelab that referenced this pull request May 21, 2026
…026.5.20) (#615)

This PR contains the following updates:

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

---

> ⚠️ **Warning**
>
> Some dependencies could not be looked up. Check the [Dependency Dashboard](issues/567) for more information.

---

### Release Notes

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

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

[Compare Source](openclaw/openclaw@v2026.5.19...v2026.5.20)

##### Changes

- Exec approvals: remove the old `cat SKILL.md && printf ... && <skill-wrapper>` allowlist compatibility path so skill files must be loaded with the read tool and only the real skill executable is auto-allowed.
- Discord: let voice sessions follow configured Discord users into voice channels, with allowed-channel checks, multi-user handoff, bounded reconciliation, and DAVE recovery preservation. ([#&#8203;84264](openclaw/openclaw#84264)) Thanks [@&#8203;fuller-stack-dev](https://github.com/fuller-stack-dev).
- Discord/voice: include bounded `IDENTITY.md`, `USER.md`, and `SOUL.md` profile context in realtime voice session instructions by default, with `voice.realtime.bootstrapContextFiles: []` available to disable it. ([#&#8203;84499](openclaw/openclaw#84499)) Thanks [@&#8203;fuller-stack-dev](https://github.com/fuller-stack-dev).
- Dependencies: bump the bundled Codex harness to `@openai/codex` `0.132.0` and refresh the app-server model-list docs for the new catalog.
- CLI/policy: add the bundled Policy plugin for policy-backed channel conformance checks, doctor lint findings, and opt-in workspace repair. ([#&#8203;80407](openclaw/openclaw#80407)) Thanks [@&#8203;giodl73-repo](https://github.com/giodl73-repo).
- Agents/config: allow `agents.list[].experimental.localModelLean` so lean local-model mode can be enabled for one configured agent instead of globally.
- Providers/xAI: add device-code OAuth login so remote and headless setups can authorize xAI without a localhost browser callback. ([#&#8203;84005](openclaw/openclaw#84005)) Thanks [@&#8203;fuller-stack-dev](https://github.com/fuller-stack-dev).
- Providers/OpenRouter: honor provider-level `params.provider` routing policy for OpenRouter requests, with model and agent params overriding the defaults. Thanks [@&#8203;amknight](https://github.com/amknight).

##### Fixes

- CLI/tasks: include stale-running task maintenance decisions in `openclaw tasks maintenance --json` so retained and reconcile candidates explain backing-session, cron, CLI, and wedged-subagent state. ([#&#8203;84691](openclaw/openclaw#84691)) Thanks [@&#8203;efpiva](https://github.com/efpiva).
- Codex app-server: keep system-prompt reports working when bootstrap hooks provide workspace files with only a path and content, so hook-supplied SOUL/IDENTITY/TOOLS/USER context still reports injected characters correctly. ([#&#8203;84736](openclaw/openclaw#84736)) Thanks [@&#8203;JARVIS-Glasses](https://github.com/JARVIS-Glasses).
- Providers/MiniMax music: stop advertising `durationSeconds` control and remove prompt-injected duration hints, so `music_generate` reports MiniMax duration as an unsupported override instead of suggesting MiniMax can enforce track length. Fixes [#&#8203;84508](openclaw/openclaw#84508). Thanks [@&#8203;neeravmakwana](https://github.com/neeravmakwana).
- Doctor: warn when sandbox tool policy hides configured MCP server tools before provider requests. ([#&#8203;84699](openclaw/openclaw#84699)) Thanks [@&#8203;nxmxbbd](https://github.com/nxmxbbd).
- WhatsApp: update Baileys to `7.0.0-rc12`.
- Build: suppress per-locale `rolldown-plugin-dts:fake-js` CommonJS dts warnings emitted while bundling the intentionally-inlined `zod/v4/locales/*.d.cts` files, so `pnpm build` output stays readable after the 0.25.1 plugin bump. Thanks [@&#8203;romneyda](https://github.com/romneyda).
- CLI/nodes: route lazy plugin-registration logs to stderr for JSON-mode `openclaw nodes` commands so stdout stays parseable. ([#&#8203;84684](openclaw/openclaw#84684)) Thanks [@&#8203;TurboTheTurtle](https://github.com/TurboTheTurtle).
- Approvals: route manual `/approve` decisions through the trusted approval runtime so active exec and plugin approvals no longer look unknown or expired.
- Mac app: update the About settings copyright year to 2026. ([#&#8203;84385](openclaw/openclaw#84385)) Thanks [@&#8203;pejmanjohn](https://github.com/pejmanjohn).
- Dependencies: update `@openclaw/fs-safe` to `0.2.7` so OpenClaw's default Python-helper-off policy keeps best-effort Node write fallbacks for private stores, secret writes, run logs, and media attachments on Linux/macOS.
- Infra/secrets: restore the fail-closed contract for `tryReadSecretFileSync` so credential loaders that pass `rejectSymlink: true` (Telegram, LINE, Zalo, IRC, Nextcloud Talk tokens) refuse symlinked credential files instead of silently accepting them, and the infra-state CI shard's secret-file symlink test passes again. Thanks [@&#8203;romneyda](https://github.com/romneyda).
- Browser: honor the configured image sanitization limit for screenshots and labeled snapshots so browser-captured images follow the same resize policy as other image results. ([#&#8203;84595](openclaw/openclaw#84595))
- Doctor: remove unrecognized `models.providers.*.models[*].compat.thinkingFormat` values during `doctor --fix` so stale provider model config can validate after upgrade. Fixes [#&#8203;77803](openclaw/openclaw#77803).
- Doctor: warn when `openclaw.json` stores plaintext secret-bearing config fields, including model provider API keys and sensitive provider headers. ([#&#8203;84718](openclaw/openclaw#84718)) Thanks [@&#8203;lukaIvanic](https://github.com/lukaIvanic).
- Status: show the configured default, session-selected model, reason, clear hint, and docs link when a session remains pinned to a model that differs from `agents.defaults.model.primary`.
- WebChat: clear stale typing indicators when session change events mark the active chat run complete.
- Mac app: keep local packaging signed with a stable app identity for permission testing and fix Control UI production builds under current Vite/Highlight.js exports.
- macOS app: update the embedded Peekaboo bridge to 3.2.1 so OpenClaw-hosted UI automation works with current Peekaboo CLI capture flows.
- Cron: deliver preferred final assistant output for successful scheduled runs when trailing plain tool warnings remain in diagnostics instead of marking the run failed.
- fix(mattermost): fail closed on missing channel type \[AI]. ([#&#8203;84091](openclaw/openclaw#84091)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987).
- Recheck rebuilt system.run argv \[AI]. ([#&#8203;84090](openclaw/openclaw#84090)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987).
- CLI: keep the private QA subcommand out of exported command descriptors unless `OPENCLAW_ENABLE_PRIVATE_QA_CLI=1`, so root help and subcommand markers match runtime registration. ([#&#8203;84519](openclaw/openclaw#84519))
- CLI/cron: bound `openclaw cron show` job lookup pagination so non-advancing or unbounded `cron.list` responses fail instead of hanging the command. Fixes [#&#8203;83856](openclaw/openclaw#83856). ([#&#8203;83989](openclaw/openclaw#83989))
- Agents/messages: stop message-tool-only turns after a successful source-channel `message` send while keeping transcript mirrors under the session write lock. ([#&#8203;84289](openclaw/openclaw#84289))
- Agents: filter silent heartbeat response-tool transcript artifacts out of embedded context snapshots so later user turns are not polluted by heartbeat no-op messages. ([#&#8203;83477](openclaw/openclaw#83477)) Thanks [@&#8203;fuller-stack-dev](https://github.com/fuller-stack-dev).
- Agents/OpenAI: log repeated strict tool-schema downgrade diagnostics once per provider/model/tool signature, reducing duplicate debug noise while preserving `strict=false` fallback behavior. Fixes [#&#8203;82930](openclaw/openclaw#82930). ([#&#8203;82933](openclaw/openclaw#82933)) Thanks [@&#8203;galiniliev](https://github.com/galiniliev).
- Agents/code mode: spell out the `exec` tool's JavaScript/TypeScript, no Node module, and catalog-bridge constraints in model-visible schema text so agents can use enabled tools without trial-and-error. ([#&#8203;84269](openclaw/openclaw#84269)) Thanks [@&#8203;Kaspre](https://github.com/Kaspre).
- Codex: give `image_generate` dynamic-tool calls a 120s default watchdog when no per-call or configured image timeout is set, so image generation no longer falls back to the generic 30s bridge timeout. ([#&#8203;84254](openclaw/openclaw#84254)) Thanks [@&#8203;moritzmmayerhofer](https://github.com/moritzmmayerhofer).
- Codex: avoid duplicate dynamic tool terminal diagnostics while large diagnostic backlogs drain without blocking tool responses. ([#&#8203;82937](openclaw/openclaw#82937)) Thanks [@&#8203;galiniliev](https://github.com/galiniliev).
- CLI/message: include a stable top-level `messageId` in `openclaw message --json` output when channel sends return one. ([#&#8203;84191](openclaw/openclaw#84191)) Thanks [@&#8203;100menotu001](https://github.com/100menotu001).
- Cron: preserve legacy top-level array `jobs.json` stores when loading or adding scheduled jobs so old cron jobs are no longer treated as an empty store during upgrade. Fixes [#&#8203;60799](openclaw/openclaw#60799). ([#&#8203;84433](openclaw/openclaw#84433)) Thanks [@&#8203;IWhatsskill](https://github.com/IWhatsskill).
- Gateway/agents: use an agent's `identity.name` in Gateway agent summaries when `agents.list[].name` is unset, so configured agent labels remain visible in clients. ([#&#8203;84355](openclaw/openclaw#84355); refs [#&#8203;57835](openclaw/openclaw#57835)) Thanks [@&#8203;luoyanglang](https://github.com/luoyanglang).
- Channels/replies: keep normal `/verbose` failed-tool progress compact in message-tool replies and prevent late text-only tool output from appearing after the final answer. ([#&#8203;84303](openclaw/openclaw#84303)) Thanks [@&#8203;VACInc](https://github.com/VACInc).
- Plugins/hooks: apply a default 30-second timeout to `before_compaction` and `after_compaction` hooks so a hung plugin handler no longer blocks compaction completion. ([#&#8203;84153](openclaw/openclaw#84153))
- Discord: preserve disabled presentation buttons when adapting and rendering Discord message controls. ([#&#8203;84188](openclaw/openclaw#84188)) Thanks [@&#8203;100menotu001](https://github.com/100menotu001).
- Twitch: add a test-only client-manager registry reset helper so non-isolated Twitch tests can clear cached managers between cases. Fixes [#&#8203;83887](openclaw/openclaw#83887). ([#&#8203;84244](openclaw/openclaw#84244)) Thanks [@&#8203;hclsys](https://github.com/hclsys).
- Cron: run main-session scheduled work on a cron-owned wake lane while preserving reply delivery context, so background cron turns no longer block human main-session chat. Fixes [#&#8203;82766](openclaw/openclaw#82766). ([#&#8203;82767](openclaw/openclaw#82767)) Thanks [@&#8203;galiniliev](https://github.com/galiniliev).
- Cron: use structured embedded-run denial metadata for isolated scheduled tasks so blocked exec requests fail the job without treating ordinary assistant prose as a denial. ([#&#8203;84067](openclaw/openclaw#84067)) Thanks [@&#8203;abnershang](https://github.com/abnershang).
- Cron: keep recovered tool warnings diagnostic for successful scheduled runs so final cron output is delivered instead of being replaced by a post-processing warning. ([#&#8203;84045](openclaw/openclaw#84045)) Thanks [@&#8203;abnershang](https://github.com/abnershang).
- Plugins/perf: thread explicit plugin discovery results through `loadBundledCapabilityRuntimeRegistry`, `resolveBundledPluginSources`, and `listChannelCatalogEntries` so callers that already hold a discovery result skip redundant filesystem walks. Thanks [@&#8203;SebTardif](https://github.com/SebTardif).
- harden update restart script creation \[AI]. ([#&#8203;84088](openclaw/openclaw#84088)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987).
- Docker: keep the bundled Codex plugin in official release image keep lists so the default OpenAI agent harness remains available after Docker pruning. Fixes [#&#8203;83613](openclaw/openclaw#83613). ([#&#8203;83626](openclaw/openclaw#83626)) Thanks [@&#8203;YuanHanzhong](https://github.com/YuanHanzhong).
- CLI/channels: preserve the first line of `openclaw channels logs` output when the rolling tail window starts exactly on a line boundary, mirroring the already-fixed `readLogSlice` behavior in `src/logging/log-tail.ts`.
- Control UI: treat terminal session status as authoritative over stale active-run flags so completed terminal runs stop showing abort/live UI. ([#&#8203;84057](openclaw/openclaw#84057))
- CLI: preserve embedded equals signs in inline root option values instead of truncating after the second separator. ([#&#8203;83995](openclaw/openclaw#83995)) Thanks [@&#8203;ThiagoCAltoe](https://github.com/ThiagoCAltoe).
- Matrix/config: accept `messages.queue.byChannel.matrix` queue overrides and keep queue provider schema/type keys aligned for Matrix, Google Chat, and Mattermost. Thanks [@&#8203;bdjben](https://github.com/bdjben).
- CLI: format `openclaw acp client` failures through the shared error formatter so object-shaped errors stay readable instead of printing `[object Object]`. Fixes [#&#8203;83904](openclaw/openclaw#83904). ([#&#8203;84080](openclaw/openclaw#84080))
- Providers/Ollama: default unknown-capabilities models to tool-capable so discovered native Ollama models can use tools when `/api/show` omits capabilities. ([#&#8203;84055](openclaw/openclaw#84055)) Thanks [@&#8203;dutifulbob](https://github.com/dutifulbob).
- Installer/Windows: launch `install.ps1` onboarding as an attached child process so fresh native Windows installs do not freeze visibly at `Starting setup...` or corrupt the wizard's terminal rendering.
- CLI/update: keep restart health checks working across one-version CLI/Gateway protocol skew and use the managed Gateway service Node for all follow-up commands even when the package root is unchanged, so `openclaw update` no longer silently switches the gateway to a different Node binary when multiple Node installations are present. Thanks [@&#8203;amknight](https://github.com/amknight).
- CLI/gateway: include the running Gateway version in `gateway status` JSON output, preserving existing server metadata while falling back to status RPC data for read probes. Fixes [#&#8203;56222](openclaw/openclaw#56222). Thanks [@&#8203;galiniliev](https://github.com/galiniliev).
- Memory/search: close local embedding providers when active-memory searches time out so pending local model loads and embedding contexts are aborted and released. ([#&#8203;83858](openclaw/openclaw#83858)) Thanks [@&#8203;brokemac79](https://github.com/brokemac79).
- CLI/nodes: request pending node surface approval scopes before `openclaw nodes approve` so exec-capable node approval can use admin-scoped Gateway credentials instead of failing with `missing scope: operator.admin`. ([#&#8203;84392](openclaw/openclaw#84392)) Thanks [@&#8203;joshavant](https://github.com/joshavant).
- Gateway: reject slow node event sends before outbound buffers grow unbounded and log the rejected payload diagnostic. ([#&#8203;84387](openclaw/openclaw#84387)) Thanks [@&#8203;samzong](https://github.com/samzong).
- Agents: include bounded trajectory queued-writer diagnostics in `pi-trajectory-flush` timeout warnings so flush stalls show pending writes, queued bytes, and append state. Fixes [#&#8203;82961](openclaw/openclaw#82961). ([#&#8203;82962](openclaw/openclaw#82962)) Thanks [@&#8203;galiniliev](https://github.com/galiniliev).
- Agents/subagents: recover stale completion announces by retrying unsupported transcript-wait wakes without transcript waiting and forcing a message-tool handoff when the requester run is already stale. Fixes [#&#8203;83699](openclaw/openclaw#83699). ([#&#8203;83700](openclaw/openclaw#83700)) Thanks [@&#8203;galiniliev](https://github.com/galiniliev).
- Agents/subagents: constrain wildcard subagent target allowlists to configured agents while preserving explicitly listed compatibility targets. Fixes [#&#8203;84040](openclaw/openclaw#84040). ([#&#8203;84357](openclaw/openclaw#84357)) Thanks [@&#8203;joshavant](https://github.com/joshavant).
- Providers/Anthropic: route Anthropic model refs selected with Claude CLI auth through the Claude CLI runtime so shorthand refs such as `anthropic/opus-4.7` no longer fall back to embedded Anthropic billing. Fixes [#&#8203;84222](openclaw/openclaw#84222). ([#&#8203;84374](openclaw/openclaw#84374)) Thanks [@&#8203;joshavant](https://github.com/joshavant).
- Agents: honor explicit `models.providers.<id>.timeoutSeconds` values above the default idle watchdog for cloud and self-hosted providers, so long first-token waits no longer fall back at \~120s when the provider timeout is higher. ([#&#8203;83979](openclaw/openclaw#83979)) Thanks [@&#8203;yujiawei](https://github.com/yujiawei).
- Agents/Codex: keep encrypted Responses reasoning replay provenance-bound so stale mirrored Codex transcripts drop invalid encrypted content before request assembly while preserving matching same-session replay. Fixes [#&#8203;83836](openclaw/openclaw#83836). ([#&#8203;84367](openclaw/openclaw#84367)) Thanks [@&#8203;joshavant](https://github.com/joshavant).
- Agents/subagents: skip stale embedded-run wake probes for dormant completion requesters, so late subagent completions go straight to requester-agent/direct handoff instead of producing `reason=no_active_run` queue noise. ([#&#8203;82964](openclaw/openclaw#82964)) Thanks [@&#8203;galiniliev](https://github.com/galiniliev).
- CLI: retry config snapshot reads after a transient failure so one rejected read no longer poisons later commands in the same process. ([#&#8203;83931](openclaw/openclaw#83931)) Thanks [@&#8203;honor2030](https://github.com/honor2030).
- Media: decode URL path basenames before using them as remote media fallback filenames, so files like `My%20Report.pdf` are surfaced as `My Report.pdf`. Fixes [#&#8203;84050](openclaw/openclaw#84050). ([#&#8203;84052](openclaw/openclaw#84052)) Thanks [@&#8203;jbetala7](https://github.com/jbetala7).
- WhatsApp: clarify inbound group diagnostics so observed but unregistered groups point to `channels.whatsapp.groups` without changing routing or sender authorization. ([#&#8203;83846](openclaw/openclaw#83846)) Thanks [@&#8203;neeravmakwana](https://github.com/neeravmakwana).
- WhatsApp: drain pending outbound deliveries on a 30s periodic timer in addition to the reconnect handler, so messages enqueued while the provider is already connected no longer wait for the next reconnect to send. ([#&#8203;79083](openclaw/openclaw#79083)) Thanks [@&#8203;Oviemudiaga](https://github.com/Oviemudiaga).
- CLI/TUI: include gateway plugin slash commands in TUI autocomplete, so connected sessions can suggest plugin-owned commands exposed by the running Gateway. ([#&#8203;83640](openclaw/openclaw#83640)) Thanks [@&#8203;se7en-agent](https://github.com/se7en-agent).
- Gateway/mobile: restore QR setup-code handoff of bounded operator tokens for iOS and Android onboarding while keeping admin and pairing scopes out of bootstrap. ([#&#8203;83684](openclaw/openclaw#83684)) Thanks [@&#8203;ngutman](https://github.com/ngutman).
- iOS: repair Release archive compilation for the TestFlight build. ([#&#8203;84255](openclaw/openclaw#84255)) Thanks [@&#8203;ngutman](https://github.com/ngutman).
- Agents/compaction: bound plugin-owned CLI transcript compaction with the host safety timeout so a hung context engine can no longer stall post-turn cleanup. ([#&#8203;84083](openclaw/openclaw#84083)) Thanks [@&#8203;100yenadmin](https://github.com/100yenadmin).
- Control UI/usage: truncate long context skill, tool, and file names in the usage panel while keeping the full name available on hover. ([#&#8203;42197](openclaw/openclaw#42197)) Thanks [@&#8203;Rain120](https://github.com/Rain120).
- Codex: respect explicit `models auth order set` and `config.auth.order` precedence over stale `lastGood` in `/codex account`, and show `no working credential` when every explicit-order profile is ineligible instead of marking a lower-ranked profile as active. Fixes [#&#8203;84386](openclaw/openclaw#84386). ([#&#8203;84412](openclaw/openclaw#84412)) Thanks [@&#8203;openperf](https://github.com/openperf).
- Agents: honor `messages.suppressToolErrors` for mutating tool failures so configured chat surfaces do not receive separate warning payloads. ([#&#8203;81561](openclaw/openclaw#81561)) Thanks [@&#8203;moeedahmed](https://github.com/moeedahmed).
- Agents/fallback: surface billing guidance for mixed rate-limit plus billing fallback exhaustion instead of generic failure copy. Fixes [#&#8203;79396](openclaw/openclaw#79396). ([#&#8203;79489](openclaw/openclaw#79489)) Thanks [@&#8203;aayushprsingh](https://github.com/aayushprsingh).

</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/615
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agents Agent runtime and tooling clawsweeper:automerge Maintainer opted this PR into bounded ClawSweeper-reviewed automerge 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: sufficient ClawSweeper judged the real behavior proof convincing. proof: supplied External PR includes structured after-fix real behavior proof. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. size: L 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.

3 participants