Skip to content

fix(telegram): topic replies stall after session conflicts#96550

Merged
obviyus merged 1 commit into
openclaw:mainfrom
VACInc:fix/telegram-spool-session-conflict
Jun 25, 2026
Merged

fix(telegram): topic replies stall after session conflicts#96550
obviyus merged 1 commit into
openclaw:mainfrom
VACInc:fix/telegram-spool-session-conflict

Conversation

@VACInc

@VACInc VACInc commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

Summary

Back off retryable Telegram spool replays that fail with reply session initialization conflicted... so one pending update cannot hot-loop the lane.

This PR is now narrowed to the Telegram follow-up only. The reply-session writer-lane/root fix landed separately in #96847, so the overlapping session-store changes and extra stale-snapshot retry layer were removed from this branch.

What Problem This Solves

If a Telegram spooled update still hits a retryable reply-session initialization conflict, current main immediately releases it back to pending. The drain loop can reclaim the same update every tick, repeatedly fail before an agent turn starts, and keep later same-DM/topic updates stuck behind the hot-looping row.

Why This Change Was Made

Telegram now persists the retry error metadata already supported by the shared ingress queue. When the pending update's last error is a reply-session initialization conflict, the drain loop waits with capped exponential backoff before retrying that update again.

The same lane is reserved during the backoff window, so later messages in the same DM/topic do not overtake the conflicted update. Other lanes can still drain.

Upgrade And Data Compatibility

No new persisted fields or migrations. The change uses existing attempts, lastAttemptAt, and lastError ingress-queue fields.

User Impact

Telegram DMs and forum topics should stop hammering the gateway if a retryable session-init conflict remains after #96847. Same-lane ordering is preserved, and unrelated lanes can continue.

Review Updates

Addressed ClawSweeper feedback:

Evidence

node scripts/run-vitest.mjs extensions/telegram/src/polling-session.test.ts -t "backs off retryable reply session init conflicts"

Test Files  1 passed (1)
Tests       2 passed | 62 skipped (64)
pnpm exec oxfmt --check --threads=1 extensions/telegram/src/polling-session.ts extensions/telegram/src/polling-session.test.ts extensions/telegram/src/telegram-ingress-spool.ts

All matched files use the correct format.
git diff --check origin/main...HEAD

(no output)
.agents/skills/autoreview/scripts/autoreview --mode branch --base origin/main

autoreview clean: no accepted/actionable findings reported
overall: patch is correct (0.79)

What Was Not Tested

No full suite. No new live Telegram/Mantis proof was collected in this pass; the new regression covers both topic and direct-message lane behavior without private identifiers.

@openclaw-barnacle openclaw-barnacle Bot added channel: telegram Channel integration: telegram size: S labels Jun 24, 2026
@clawsweeper

clawsweeper Bot commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs real behavior proof before merge. Reviewed June 25, 2026, 4:16 PM ET / 20:16 UTC.

Summary
The branch combines serialized reply-session stale-snapshot retries with Telegram spooled-update retry metadata and backoff for reply-session initialization conflicts.

PR surface: Source +123, Tests +235. Total +358 across 10 files.

Reproducibility: yes. at source level: current main still releases retryable Telegram spooled failures without conflict-specific backoff, and #96837 documents the SQLite pending retry loop. I did not run a live Telegram reproduction in this read-only review.

Review metrics: 2 noteworthy metrics.

  • Merged overlap: 1 overlapping PR already merged; 5 files remain different. The branch is dirty because the writer-lane layer landed on main, so maintainers should review the refreshed unique backoff delta.
  • Retry/order surfaces: 2 runtime behaviors changed. The PR changes both reply-session retry handling and Telegram spooled replay scheduling before messages reach agent execution.

Stored data model
Persistent data-model change detected: serialized state: src/auto-reply/reply/session.test.ts, serialized state: src/auto-reply/reply/session.ts, serialized state: src/config/sessions/session-accessor.ts, serialized state: src/config/sessions/store-writer.test.ts, serialized state: src/config/sessions/store-writer.ts, serialized state: src/config/sessions/store.ts, and 3 more. Confirm migration or upgrade compatibility proof before merge.

Merge readiness
Overall: 🦐 gold shrimp
Proof: 🦐 gold shrimp
Patch quality: 🐚 platinum hermit
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:

Proof guidance:

  • [P1] Needs stronger real behavior proof before merge: The PR body has focused tests plus live overlay/log evidence, but it does not show an affected current-head Telegram topic or DM reply being processed and answered; add redacted live output, logs, screenshot, recording, or Mantis proof and update the PR body.

Mantis proof suggestion
A live Telegram transcript would directly show whether affected topic or DM replies continue instead of stalling or hot-looping after reply-session initialization conflicts. A maintainer can ask Mantis to capture proof by posting this exact PR comment:

@openclaw-mantis telegram live: verify an affected topic or DM reply is processed and answered after reply-session initialization conflicts, with later same-lane updates not overtaking it.

Risk before merge

  • [P1] The branch is currently conflicting against current main after fix(auto-reply): serialize reply session initialization #96847 merged, so maintainers need a refreshed merge result before judging the final patch.
  • [P1] The public proof shows tests, overlay install, service health, and absence of matching error logs, but not an affected Telegram topic or DM reply being processed and answered on the current head.
  • [P1] The remaining diff changes Telegram spooled retry timing and same-lane ordering around session-state failures, so green unit tests alone do not settle message-delivery and session-state behavior.

Maintainer options:

  1. Rebase To The Backoff Follow-Up (recommended)
    Resolve the merged writer-lane overlap, keep only the still-needed Telegram backoff/retry pieces, and add current-head Telegram proof before merge.
  2. Accept Source-Level Backoff Proof
    Maintainers can intentionally accept the focused tests and redacted logs without visible Telegram proof, but message-delivery behavior would remain less proven.
  3. Pause Behind The Remaining Session Cluster
    If maintainers want the skillsSnapshot subcase resolved first, pause this PR and use fix(sessions): align reply init revision with persisted skillsSnapshot #96699 or a successor as the canonical session-state path.

Next step before merge

  • [P1] Maintainers need to resolve the merged-overlap conflict, choose the final backoff follow-up shape, and require Telegram real-behavior proof; this is not a narrow automated repair lane.

Security
Cleared: No concrete security or supply-chain concern was found; the diff touches runtime retry/session logic and tests without dependency, workflow, secret, permission, or package-resolution changes.

Review details

Best possible solution:

Rebase and narrow this PR against current main, keep the Telegram conflict backoff if maintainers want it as the follow-up to the merged writer-lane fix, and add redacted current-head Telegram topic or DM proof before merge.

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

Yes at source level: current main still releases retryable Telegram spooled failures without conflict-specific backoff, and #96837 documents the SQLite pending retry loop. I did not run a live Telegram reproduction in this read-only review.

Is this the best way to solve the issue?

Unclear as submitted: the remaining Telegram backoff is a plausible follow-up, but the branch should be rebased and narrowed after #96847 merged. It also needs current-head Telegram proof before the solution is merge-ready.

AGENTS.md: found and applied where relevant.

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

Label changes

Label justifications:

  • P1: The PR targets a user-visible Telegram reply stall and retry loop that can block real inbound messages while the gateway remains live.
  • merge-risk: 🚨 session-state: The diff changes reply-session initialization retry behavior around persisted session metadata conflicts.
  • merge-risk: 🚨 message-delivery: The diff changes Telegram spooled retry timing and same-lane ordering before queued replies reach agent processing.
  • rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🦐 gold shrimp and patch quality is 🐚 platinum hermit.
  • 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 body has focused tests plus live overlay/log evidence, but it does not show an affected current-head Telegram topic or DM reply being processed and answered; add redacted live output, logs, screenshot, recording, or Mantis proof and update the PR body.
  • mantis: telegram-visible-proof: Mantis should capture Telegram visible proof. The PR changes visible Telegram reply continuity and same-lane ordering, which can be demonstrated in a short Telegram proof run.
Evidence reviewed

PR surface:

Source +123, Tests +235. Total +358 across 10 files.

View PR surface stats
Area Files Added Removed Net
Source 7 162 39 +123
Tests 3 235 0 +235
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 10 397 39 +358

What I checked:

  • Root policy applied: Root review policy requires full-surface review, source/test/current behavior proof, and Telegram-visible proof when feasible for user-visible Telegram behavior. (AGENTS.md:29, d2da8c79d9b8)
  • Telegram proof standard applied: The Telegram maintainer note requires real Telegram proof for behavior PRs touching transport, topics, callbacks, authorization, or reply context. (.agents/maintainer-notes/telegram.md:37, d2da8c79d9b8)
  • Current main already has the writer-lane layer: Current main initializes reply sessions inside runExclusiveSessionStoreWrite and uses a reentrant guarded commit, matching the writer-lane layer from the overlapping merged PR. (src/auto-reply/reply/session.ts:294, d2da8c79d9b8)
  • Current main still retries Telegram conflicts immediately: Current main releases retryable Telegram spooled failures without passing the error to the queue, so it has no conflict-specific backoff input. (extensions/telegram/src/polling-session.ts:779, d2da8c79d9b8)
  • Shared queue already supports retry metadata: The shared ingress queue records attempts, lastAttemptAt, and optional lastError on release, so the PR uses existing persisted queue metadata rather than adding a schema field. (src/channels/message/ingress-queue.ts:636, d2da8c79d9b8)
  • PR head adds targeted Telegram backoff: PR head persists formatted retry errors, detects reply-session initialization conflicts, and reserves the same Telegram lane during the backoff window. (extensions/telegram/src/polling-session.ts:175, 27af2956613e)

Likely related people:

  • obviyus: Authored and merged the current-main reply-session writer-lane serialization layer that overlaps most of this branch's shared session-store changes. (role: recent overlapping fix author; confidence: high; commits: d2da8c79d9b8, dc09324ec2e1, d4819948f37d; files: src/auto-reply/reply/session.ts, src/shared/store-writer-queue.ts, extensions/telegram/src/polling-session.ts)
  • jalehman: Recent GitHub path history shows the guarded reply-session initialization and session accessor refactors this PR builds on. (role: reply-session initialization feature-history contributor; confidence: high; commits: 95e37f8e9517, 7e2b2d2987b2, b58e6e0734f2; files: src/auto-reply/reply/session.ts, src/config/sessions/session-accessor.ts)
  • joshavant: Recent merged history includes Telegram spooled buffered replay and retry guard work in the same polling-session path. (role: Telegram spooled replay area contributor; confidence: medium; commits: 9921825e1795; files: extensions/telegram/src/polling-session.ts, extensions/telegram/src/telegram-ingress-spool.ts)
  • vincentkoc: History shows the shared store writer queue abstraction that current main and this PR rely on for same-store serialization. (role: shared store-writer queue contributor; confidence: medium; commits: 27e13933c0f3, 884a6a113ccf; files: src/shared/store-writer-queue.ts, src/config/sessions/store-writer.ts, src/config/sessions/store.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. mantis: telegram-visible-proof Mantis should capture Telegram visible proof. P1 High-priority user-facing bug, regression, or broken workflow. merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. labels Jun 24, 2026
@clawsweeper
clawsweeper Bot temporarily deployed to qa-live-shared June 24, 2026 20:39 Inactive
@VACInc
VACInc force-pushed the fix/telegram-spool-session-conflict branch from 278521d to dce5d66 Compare June 24, 2026 22:12
@openclaw-barnacle openclaw-barnacle Bot removed the channel: telegram Channel integration: telegram label Jun 24, 2026
@VACInc

VACInc commented Jun 24, 2026

Copy link
Copy Markdown
Contributor Author

Updated head dce5d661bb56ffb4f610d522b8cb5a4c1d7775d5 after rebasing onto latest origin/main.

What changed since the earlier version:

  • Removed the broad Telegram reply-session-init-conflict dead-letter classifier after review showed the conflict is retryable and dead-lettering it can drop a legitimate update.
  • Kept the fix at the reply-session owner boundary: bounded fresh-snapshot retries now absorb stacked same-session initialization commits.

Focused validation rerun:

  • node scripts/run-vitest.mjs src/auto-reply/reply/session.test.ts -t "retries stacked stale snapshots" passed: 1 test passed, 119 skipped.
  • pnpm exec oxfmt --check --threads=1 src/auto-reply/reply/session.ts src/auto-reply/reply/session.test.ts passed.
  • git diff --check origin/main...HEAD passed with no output.
  • .agents/skills/autoreview/scripts/autoreview --mode branch --base origin/main passed with no accepted/actionable findings.

@VACInc
VACInc force-pushed the fix/telegram-spool-session-conflict branch from dce5d66 to 8e24cb1 Compare June 25, 2026 02:53
@openclaw-barnacle openclaw-barnacle Bot added the channel: telegram Channel integration: telegram label Jun 25, 2026
@VACInc

VACInc commented Jun 25, 2026

Copy link
Copy Markdown
Contributor Author

Updated head 8e24cb1c873f326eb5149e507e2d35695101145c after rebasing onto latest origin/main.

New live finding from a private Telegram topic: bounded session-init retries were present in dist, but one retryable spooled update still hot-looped the same reply session initialization conflicted failure while the topic lane was busy. This update keeps the conflict retryable, persists retry error metadata on release, backs off only that retryable session-init conflict, and reserves the lane during backoff so later same-topic updates cannot overtake it.

Focused validation rerun:

  • node scripts/run-vitest.mjs src/auto-reply/reply/session.test.ts -t "retries stacked stale snapshots" passed: 1 test passed, 119 skipped.
  • node scripts/run-vitest.mjs extensions/telegram/src/polling-session.test.ts -t "(backs off retryable reply session init conflicts|dead-letters missing harness failures|dead-letters wrapped missing harness failures|dead-letters grammY BotError-wrapped missing harness failures|dead-letters buffered spooled claims when dispatch dedupe rollback fails)" passed: 5 tests passed, 58 skipped.
  • pnpm exec oxfmt --check --threads=1 extensions/telegram/src/polling-session.ts extensions/telegram/src/polling-session.test.ts extensions/telegram/src/telegram-ingress-spool.ts src/auto-reply/reply/session.ts src/auto-reply/reply/session.test.ts passed.
  • git diff --check origin/main...HEAD passed with no output.
  • .agents/skills/autoreview/scripts/autoreview --mode branch --base origin/main passed with no accepted/actionable findings.

@VACInc
VACInc force-pushed the fix/telegram-spool-session-conflict branch from 8e24cb1 to d54fc48 Compare June 25, 2026 14:06
@openclaw-barnacle openclaw-barnacle Bot added the triage: needs-pr-context Candidate: external PR body lacks required problem context or evidence. label Jun 25, 2026
@VACInc

VACInc commented Jun 25, 2026

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

Rebased onto latest origin/main and refreshed the live overlay.

Head: d54fc48743ee633d717b705987f42980502ecc16
Base after fetch: 2e6e17f7c50237bb0dd8a40414d29d27ee80a9d8

Focused validation on the rebased head:

  • node scripts/run-vitest.mjs extensions/telegram/src/polling-session.test.ts -t "backs off retryable reply session init conflicts" passed: 1 test passed, 62 skipped.
  • node scripts/run-vitest.mjs src/auto-reply/reply/session.test.ts -t "retries stacked stale snapshots" passed: 1 test passed, 119 skipped.
  • git diff --check origin/main...HEAD produced no output.

Live overlay proof:

  • OPENCLAW_UPDATE_INCLUDE_PRS=96550 oc-update /home/vac/openclaw reset to latest origin/main, applied this PR, rebuilt core/UI, reinstalled the daemon, and the second gateway health check passed.
  • The live built runtime contains both the bounded reply-session stale-snapshot retry and the Telegram spool conflict backoff.
  • Post-restart Gateway logs had no entries for the redacted private topic marker, reply session initialization conflicted, or spooled update .*failed; keeping for retry.

Private Telegram links, chat IDs, message IDs, account identifiers, raw session routes, phone numbers, and endpoint details were intentionally redacted from public proof.

@clawsweeper

clawsweeper Bot commented Jun 25, 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.

@openclaw-barnacle openclaw-barnacle Bot removed the triage: needs-pr-context Candidate: external PR body lacks required problem context or evidence. label Jun 25, 2026
@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 Jun 25, 2026
@VACInc
VACInc force-pushed the fix/telegram-spool-session-conflict branch from d54fc48 to 1bf7951 Compare June 25, 2026 19:23
@clawsweeper clawsweeper Bot added rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. merge-risk: 🚨 session-state 🚨 May lose, corrupt, stale, or mis-associate session, agent, or context state. and removed rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. labels Jun 25, 2026
@obviyus obviyus self-assigned this Jun 25, 2026
@obviyus
obviyus force-pushed the fix/telegram-spool-session-conflict branch from 27af295 to d8d6f94 Compare June 25, 2026 20:36
@obviyus

obviyus commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

Updated this branch after the #96847 overlap landed.

What changed:

  • narrowed the PR to the Telegram spool backoff follow-up only;
  • removed the redundant reply-session/store-writer changes and extra stale-snapshot retry layer;
  • added direct-message coverage alongside topic coverage for the same-lane backoff behavior;
  • refreshed the PR body with current scope and evidence.

Validation:

  • node scripts/run-vitest.mjs extensions/telegram/src/polling-session.test.ts -t "backs off retryable reply session init conflicts"
  • pnpm exec oxfmt --check --threads=1 extensions/telegram/src/polling-session.ts extensions/telegram/src/polling-session.test.ts extensions/telegram/src/telegram-ingress-spool.ts
  • git diff --check origin/main...HEAD
  • .agents/skills/autoreview/scripts/autoreview --mode branch --base origin/main

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 25, 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.

@obviyus
obviyus merged commit 13ecca5 into openclaw:main Jun 25, 2026
52 of 55 checks passed
@obviyus

obviyus commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

Landed via rebase onto main.

  • Scoped tests: node scripts/run-vitest.mjs extensions/telegram/src/polling-session.test.ts -t "backs off retryable reply session init conflicts"
  • Format/checks: pnpm exec oxfmt --check --threads=1 extensions/telegram/src/polling-session.ts extensions/telegram/src/polling-session.test.ts extensions/telegram/src/telegram-ingress-spool.ts; git diff --check origin/main...HEAD
  • Review: .agents/skills/autoreview/scripts/autoreview --mode branch --base origin/main clean
  • Telegram E2E: bot-to-bot mock SUT returned OPENCLAW_E2E_OK
  • Changelog: release-owned, not updated for this focused runtime fix
  • Land commit: d8d6f94
  • Merge commit: 13ecca5

Thanks @VACInc!

zw-xysk added a commit to zw-xysk/openclaw that referenced this pull request Jul 6, 2026
Port bounded retry-with-backoff to Signal's debounce flush path,
matching the existing Slack/Telegram behavior for the same error
class (openclaw#99647, openclaw#96550).

  - isRetryableSignalInboundError(): walks error cause chain matching
    "reply session initialization conflicted for ..."
  - flushWithRetry(): wraps handleSignalInboundMessage with up to 3
    retries at 1s intervals
  - 6 proof tests (3 fake-timer + 3 real-environment wall-clock)
  - isRetryableSignalInboundError exported for external verification

Fixes openclaw#100944
zw-xysk added a commit to zw-xysk/openclaw that referenced this pull request Jul 6, 2026
Port bounded retry-with-backoff to Signal's debounce flush path,
matching the existing Slack/Telegram behavior for the same error
class (openclaw#99647, openclaw#96550).

  - isRetryableSignalInboundError(): walks error cause chain matching
    "reply session initialization conflicted for ..."
  - flushWithRetry(): wraps handleSignalInboundMessage with up to 3
    retries at 1s intervals
  - 6 proof tests (3 fake-timer + 3 real-environment wall-clock)
  - isRetryableSignalInboundError exported for external verification

Fixes openclaw#100944
zw-xysk added a commit to zw-xysk/openclaw that referenced this pull request Jul 6, 2026
Port bounded retry-with-backoff to Signal's debounce flush path,
matching the existing Slack/Telegram behavior for the same error
class (openclaw#99647, openclaw#96550).

  - isRetryableSignalInboundError(): walks error cause chain matching
    "reply session initialization conflicted for ..."
  - flushWithRetry(): wraps handleSignalInboundMessage with up to 3
    retries at 1s intervals
  - 6 proof tests (3 fake-timer + 3 real-environment wall-clock)
  - isRetryableSignalInboundError exported for external verification

Fixes openclaw#100944
zw-xysk added a commit to zw-xysk/openclaw that referenced this pull request Jul 7, 2026
Port bounded retry-with-backoff to Signal's debounce flush path,
matching the existing Slack/Telegram behavior for the same error
class (openclaw#99647, openclaw#96550).

  - isRetryableSignalInboundError(): walks error cause chain matching
    "reply session initialization conflicted for ..."
  - flushWithRetry(): wraps handleSignalInboundMessage with up to 3
    retries at 1s intervals
  - 6 proof tests (3 fake-timer + 3 real-environment wall-clock)
  - isRetryableSignalInboundError exported for external verification

Fixes openclaw#100944
zw-xysk added a commit to zw-xysk/openclaw that referenced this pull request Jul 7, 2026
Port bounded retry-with-backoff to Signal's debounce flush path,
matching the existing Slack/Telegram behavior for the same error
class (openclaw#99647, openclaw#96550).

  - isRetryableSignalInboundError(): walks error cause chain matching
    "reply session initialization conflicted for ..."
  - flushWithRetry(): wraps handleSignalInboundMessage with up to 3
    retries at 1s intervals
  - 6 proof tests (3 fake-timer + 3 real-environment wall-clock)
  - isRetryableSignalInboundError exported for external verification

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

Labels

channel: telegram Channel integration: telegram mantis: telegram-visible-proof Mantis should capture Telegram visible proof. 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. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. size: S 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