Skip to content

fix(messages): use best-effort for implicit tool-only source replies#84232

Merged
steipete merged 7 commits into
openclaw:mainfrom
tianxiaochannel-oss88:fix/slack-message-tool-durable-fallback
May 31, 2026
Merged

fix(messages): use best-effort for implicit tool-only source replies#84232
steipete merged 7 commits into
openclaw:mainfrom
tianxiaochannel-oss88:fix/slack-message-tool-durable-fallback

Conversation

@tianxiaochannel-oss88

@tianxiaochannel-oss88 tianxiaochannel-oss88 commented May 19, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Force implicit and explicit-current-source message_tool_only replies through best-effort delivery before target normalization.
  • Preserve required durable delivery when the model supplies an explicit external message target with bestEffort: false.
  • Add regression coverage for the Slack-style adapter path that lacks reconcileUnknownSend.

Root Cause

For Slack group/channel source replies with visible replies routed through the message tool, a source-channel reply could still carry bestEffort: false, including the case where the tool explicitly supplied the current source channel as target. That made the outbound runner request required durable delivery, which then failed preflight on Slack because required durable sends need reconcileUnknownSend.

Current-source replies are user-visible conversational replies, not explicit cross-channel durable sends, so they should use best-effort delivery even when the target equals the current source conversation. Explicit external targeted sends keep the existing required durable semantics.

Fixes #84078.

Real behavior proof

  • Behavior or issue addressed: message_tool_only visible source replies that omit an explicit target, or explicitly target the current source Slack channel, no longer fail the durable-send preflight when Slack lacks reconcileUnknownSend; explicit external targeted sends still keep required durable fail-closed behavior.
  • Real environment tested: Local patched OpenClaw checkout at aff69bbcc622, macOS arm64, Node.js v24.15.0, OpenClaw runtime loaded from this branch, real Slack channel adapter, real Slack Web API delivery into a dedicated test channel. Tokens, workspace URL, channel name, and full channel id are redacted.
  • Exact proof route: runMessageAction -> core outbound -> real Slack adapter -> Slack Web API.
  • Exact steps or command run after this patch: node --import tsx --input-type=module <real-slack-source-reply-proof> with the active plugin registry set to the real Slack channel plugin, sourceReplyDeliveryMode: "message_tool_only", toolContext.currentChannelProvider: "slack", and toolContext.currentChannelId set to the same redacted test channel for the two source-reply cases.
  • Evidence after fix:
{
  "status": "PASS",
  "pr": 84232,
  "branch": "fix/slack-message-tool-durable-fallback",
  "head": "aff69bbcc622",
  "route": "runMessageAction -> core outbound -> real Slack adapter -> Slack Web API",
  "channel": {
    "id": "C0B5...B7T",
    "name": "[redacted-test-channel]"
  },
  "marker": "OC84232_1779243865565",
  "sends": [
    {
      "name": "omitted-target-source-reply",
      "kind": "send",
      "channel": "slack",
      "to": "[redacted-test-channel]",
      "handledBy": "core",
      "messageId": "1779243866.436879",
      "via": "direct"
    },
    {
      "name": "explicit-current-source-target",
      "kind": "send",
      "channel": "slack",
      "to": "[redacted-test-channel]",
      "handledBy": "core",
      "messageId": "1779243867.013869",
      "via": "direct"
    }
  ],
  "externalFailure": {
    "name": "external-required-durable",
    "failedClosed": true,
    "error": "Required durable message send is unsupported for slack: missing reconcileUnknownSend"
  },
  "observedCount": 2,
  "observed": [
    {
      "ts": "1779243866.436879",
      "text": "OC84232_1779243865565 omitted target source reply",
      "bot_id": "[present]",
      "user": "[present]"
    },
    {
      "ts": "1779243867.013869",
      "text": "OC84232_1779243865565 explicit current-source target reply",
      "bot_id": "[present]",
      "user": "[present]"
    }
  ]
}
  • Observed result after fix: Both current-source message_tool_only sends completed through the core outbound path and posted to a real Slack test channel even when the input carried bestEffort: false: one omitted the target and one explicitly used the current Slack source channel as target. The explicit external targeted send with bestEffort: false failed before delivery with missing reconcileUnknownSend, preserving the required durable guard for non-source targets.
  • What was not tested: This proof did not run a full live LLM/gateway Slack inbound turn. It specifically validates the patched message-tool send path with the real Slack adapter and real Slack delivery, replacing the earlier local Slack-shaped adapter proof.

Tests

  • node scripts/run-vitest.mjs run --config test/vitest/vitest.infra.config.ts src/infra/outbound/message-action-runner.core-send.test.ts src/infra/outbound/message-action-runner.send-validation.test.ts src/infra/outbound/outbound-send-service.test.ts src/infra/outbound/message.test.ts
  • node scripts/run-vitest.mjs run --config test/vitest/vitest.agents-tools.config.ts src/agents/tools/message-tool.test.ts
  • node scripts/run-tsgo.mjs -p tsconfig.core.json --incremental --tsBuildInfoFile .artifacts/tsgo-cache/core.tsbuildinfo

@openclaw-barnacle openclaw-barnacle Bot added size: S triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. labels May 19, 2026
@clawsweeper

clawsweeper Bot commented May 19, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs maintainer review before merge. Reviewed May 30, 2026, 11:02 PM ET / 03:02 UTC.

Summary
The branch makes implicit and explicit-current-source message_tool_only sends best-effort before normalization while preserving required durable delivery for explicit non-current targets.

PR surface: Source +87, Tests +162. Total +249 across 2 files.

Reproducibility: yes. Source inspection on current main shows bestEffort: false still selects required durable delivery and Slack lacks reconcileUnknownSend, matching the reported preflight failure; I did not run a live current-main Slack repro in this read-only review.

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:

  • none.

Mantis proof suggestion
A real Slack transport smoke would materially reduce the remaining end-to-end proof gap for source-reply delivery. A maintainer can ask Mantis to capture proof by posting a new PR comment that starts with the OpenClaw Mantis account mention, followed by:

slack desktop smoke: verify a Slack message_tool_only source reply posts in the current channel while an explicit external required durable send still fails closed.

Risk before merge

  • [P1] Merging intentionally downgrades implicit/current-source message_tool_only sends with bestEffort: false to best-effort delivery; if current-source classification is wrong, a send that should fail closed could be delivered best-effort.
  • [P1] The supplied proof validates the direct runMessageAction path with the real Slack adapter and Slack Web API, but it does not run a full live LLM/gateway Slack inbound turn.

Maintainer options:

  1. Land With Source-Reply Semantics Accepted (recommended)
    Accept the bounded downgrade for current-source message_tool_only replies because explicit external targets and explicit non-current channels remain required durable in the patch and tests.
  2. Ask For Full Slack Inbound Proof
    Request a live Slack gateway/LLM turn if maintainers want end-to-end confirmation beyond the direct message-action route.

Next step before merge

  • [P2] No narrow automated repair remains; the next action is maintainer review of the message-delivery policy and merge if that risk is accepted.

Security
Cleared: The diff only changes outbound message routing logic and focused tests; it does not add dependencies, secret handling, CI, package, or code-execution surfaces.

Review details

Best possible solution:

Merge the bounded current-source best-effort policy if maintainers accept that visible source replies should favor delivery over durable fail-closed semantics, with optional full Slack inbound proof if they want extra assurance.

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

Yes. Source inspection on current main shows bestEffort: false still selects required durable delivery and Slack lacks reconcileUnknownSend, matching the reported preflight failure; I did not run a live current-main Slack repro in this read-only review.

Is this the best way to solve the issue?

Yes, with maintainer acceptance. The patch keeps the change local to runMessageAction, guards explicit external routes, and preserves required durable behavior for non-current targets instead of weakening the durable preflight globally.

AGENTS.md: found and applied where relevant.

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

Label changes

Label changes:

  • add proof: sufficient: Contributor real behavior proof is sufficient. The PR body includes redacted live Slack Web API output for the patched current-source path and a preserved explicit external durable failure case.

Label justifications:

  • P2: This fixes a real Slack source-reply message delivery failure with limited blast radius and no emergency data-loss or security signal.
  • merge-risk: 🚨 message-delivery: The PR changes when message-tool sends use best-effort versus required durable delivery, so a wrong source-target classification could change whether a message is delivered or fails closed.
  • 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 body includes redacted live Slack Web API output for the patched current-source path and a preserved explicit external durable failure case.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR body includes redacted live Slack Web API output for the patched current-source path and a preserved explicit external durable failure case.
Evidence reviewed

PR surface:

Source +87, Tests +162. Total +249 across 2 files.

View PR surface stats
Area Files Added Removed Net
Source 1 87 0 +87
Tests 1 162 0 +162
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 2 249 0 +249

What I checked:

  • Repository policy applied: Root AGENTS.md and the scoped outbound AGENTS.md were read; the review applied the repository guidance that message-delivery fallback changes are merge-risk sensitive and should have focused outbound tests. (AGENTS.md:1, 4dad7bd93b6c)
  • Current main still maps bestEffort false to required durable delivery: On current main, executeSendAction still selects queuePolicy = "required" when bestEffort === false, so the reported path remains present without this PR. (src/infra/outbound/outbound-send-service.ts:263, 4dad7bd93b6c)
  • Required durable message sends require reconcileUnknownSend: Current main derives required message-send capabilities with reconcileUnknownSend: true and throws the reported missing-capability error when support is absent. (src/infra/outbound/message.ts:219, 4dad7bd93b6c)
  • Slack adapter lacks reconcileUnknownSend: The Slack outbound adapter declares durable final text/media/payload/reply/thread/messageSendingHooks support, but not reconcileUnknownSend, matching the failure condition. (extensions/slack/src/channel.ts:428, 4dad7bd93b6c)
  • PR diff is bounded to the policy point and regression tests: The PR adds current-source target detection plus a non-current-channel guard in runMessageAction, with tests for implicit source replies, explicit current-source replies, external targets, and explicit other-channel sends. (src/infra/outbound/message-action-runner.ts:543, 8834e1c9c593)
  • Real Slack proof supplied: The PR body includes redacted live Slack Web API output showing two current-source sends delivered through the real Slack adapter and an explicit external required durable send still failing closed with missing reconcileUnknownSend. (8834e1c9c593)

Likely related people:

  • steipete: Recent commit history for message.ts, outbound-send-service.ts, and Slack channel code includes the durable lifecycle, best-effort option, message delivery API consolidation, target resolution, and Slack routing work. (role: recent area contributor and durable lifecycle author; confidence: high; commits: 2ead1502c9bf, 5dc704361f6f, a4b17d65a8ff; files: src/infra/outbound/message.ts, src/infra/outbound/outbound-send-service.ts, src/infra/outbound/message-action-runner.ts)
  • BunsDev: Recent history for message.ts includes gateway recovery and media delivery hardening in the same outbound delivery path. (role: adjacent outbound delivery contributor; confidence: medium; commits: df0ee092f017; files: src/infra/outbound/message.ts)
  • joshavant: Recent history for message.ts includes outbound payload normalization planning, which is adjacent to the durable send payload path this PR exercises. (role: adjacent payload normalization contributor; confidence: medium; commits: c4764095f859; files: src/infra/outbound/message.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. P2 Normal backlog priority with limited blast radius. merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. labels May 19, 2026
@openclaw-barnacle openclaw-barnacle Bot added proof: supplied External PR includes structured after-fix real behavior proof. and removed triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. labels May 19, 2026
@tianxiaochannel-oss88

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented May 19, 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. and removed rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. labels May 19, 2026
@openclaw-barnacle openclaw-barnacle Bot added triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. and removed proof: supplied External PR includes structured after-fix real behavior proof. labels May 20, 2026
@tianxiaochannel-oss88

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@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: 🦪 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 May 20, 2026
@clawsweeper

clawsweeper Bot commented May 20, 2026

Copy link
Copy Markdown
Contributor

ClawSweeper PR egg

✨ Hatched: 🥚 common Velvet Merge Sprite

Hatch command

Comment @clawsweeper hatch when this PR is hatchable.

Hatchability rules:

  • Merged PRs are hatchable.
  • Open PRs are hatchable when they are status: 👀 ready for maintainer look, status: 🚀 automerge armed, or labeled clawsweeper:automerge.
  • Closed unmerged PRs are hatchable only when one of those hatchable labels is still present in the durable record.

Rarity: 🥚 common.
Trait: guards the happy path.
Image traits: location proof lagoon; accessory tiny test log scroll; palette cobalt, lime, and pearl; mood curious; pose waving from a small platform; shell polished stone shell; lighting moonlit rim light; background quiet workflow signs.
Share on X: post this hatch
Copy: My PR egg hatched a 🥚 common Velvet Merge Sprite 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.
  • Hatchability usually comes from sufficient real-behavior proof, no blocking P0/P1/P2 findings, no security attention needed, and clean correctness. A merged PR is already final, so merge makes the egg hatchable independently.
  • 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.

@openclaw-barnacle openclaw-barnacle Bot added proof: supplied External PR includes structured after-fix real behavior proof. and removed triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. proof: sufficient ClawSweeper judged the real behavior proof convincing. labels May 20, 2026
@tianxiaochannel-oss88 tianxiaochannel-oss88 marked this pull request as ready for review May 20, 2026 02:48
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 20, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 30, 2026
@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. 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 30, 2026
@clawsweeper

clawsweeper Bot commented May 30, 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. and removed rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. labels May 30, 2026
@clawsweeper clawsweeper Bot added 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. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. labels May 30, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 30, 2026
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 30, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 31, 2026
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 31, 2026
@steipete

Copy link
Copy Markdown
Contributor

Maintainer verification before merge:

Behavior addressed: Slack message_tool_only source replies can fail when the outbound path treats the send as required durable delivery, because Slack does not expose reconcileUnknownSend.
Real environment tested: GitHub CI on PR head 8834e1c9c593f48a581401d9401591eb3aacc453; source review against current main after 66775c037e3.
Exact steps or command run after this patch: /opt/homebrew/opt/gh/bin/gh pr checks 84232 --watch=false; /opt/homebrew/opt/gh/bin/gh pr diff 84232 --patch.
Evidence after fix: CI 114 pass / 0 fail / 0 pending; Real behavior proof passed; targeted tests cover implicit source reply, explicit current-source target, explicit other conversation, and explicit other channel.
Observed result after fix: current-source message-tool replies use best-effort delivery while explicit non-current target/channel sends keep required durable semantics.
What was not tested: no fresh local Slack live send was run in this checkout; relied on PR real-behavior proof plus exact-head CI.

@steipete steipete merged commit f547ea7 into openclaw:main May 31, 2026
152 of 153 checks passed
vincentkoc added a commit that referenced this pull request May 31, 2026
…n-rotation-current

* origin/main: (52 commits)
  fix(agents): prevent embedded runtime shadowing
  fix(outbound): route source replies through configured channels
  refactor(cron): split tool and doctor repair helpers
  perf: reduce tui refresh work
  feat: default exec shell snapshots
  fix(ui): keep chat usable during session loading
  fix(cron): guard flat atMs canonicalization
  refactor(cron): keep runtime on canonical sqlite rows
  fix(codex): restore bounded recovery continuity
  refactor: clean up ACP package metadata and helpers (#88659)
  fix(discord): ping mention-bearing final replies
  fix(telegram): preserve usage footer for tool-only replies
  fix(agents): avoid alias setup load for matching refs
  chore(ui): translate thinking default label
  fix(agents): preserve runtime tools in lean mode (#88381)
  fix(messages): use best-effort for implicit tool-only source replies (#84232)
  docs: raise bulk PR close threshold
  feat: add exec shell snapshot cache
  fix: use typed tui empty session defaults
  perf: speed up tui session refresh
  ...

# Conflicts:
#	src/tui/tui-command-handlers.test.ts
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Jun 1, 2026
…penclaw#84232)

fix(messages): use best-effort for implicit tool-only source replies

Preserve durable required-send semantics for explicit non-current targets while allowing current-source `message_tool_only` replies to be delivered through best-effort outbound sends. This fixes Slack source replies that otherwise fail when the adapter has no `reconcileUnknownSend` hook.

Fixes openclaw#84078.
SYU8384 pushed a commit to SYU8384/openclaw that referenced this pull request Jun 3, 2026
…penclaw#84232)

fix(messages): use best-effort for implicit tool-only source replies

Preserve durable required-send semantics for explicit non-current targets while allowing current-source `message_tool_only` replies to be delivered through best-effort outbound sends. This fixes Slack source replies that otherwise fail when the adapter has no `reconcileUnknownSend` hook.

Fixes openclaw#84078.
sablehead pushed a commit to sablehead/openclaw that referenced this pull request Jun 10, 2026
…penclaw#84232)

fix(messages): use best-effort for implicit tool-only source replies

Preserve durable required-send semantics for explicit non-current targets while allowing current-source `message_tool_only` replies to be delivered through best-effort outbound sends. This fixes Slack source replies that otherwise fail when the adapter has no `reconcileUnknownSend` hook.

Fixes openclaw#84078.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. P2 Normal backlog priority with limited blast radius. 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: M 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.

Slack message_tool_only source replies fail because durable send requires reconcileUnknownSend

3 participants