openclaw - 💡(How to fix) Fix [Bug]: Telegram polling stalls when event loop is saturated — messages lost

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…

Telegram messages are silently dropped when the OpenClaw event loop becomes saturated. The Telegram polling mechanism has no resilience against event-loop starvation — when a single agent session (marcus) blocks the event loop, the Telegram getUpdates call never completes, causing messages to queue in Telegram's servers until they expire (~24h), never reaching the agent.

The message at 21:01 CET was never received by Neon. Telegram held it for several hours but the OpenClaw Telegram polling was completely blocked.


Error Message

19:06:08+00:00 warn tools-invoke: tool execution failed: GatewayTransportError: gateway timeout after 60000ms 19:06:08+00:00 warn fetch-timeout {"subsystem":"fetch-timeout"} {"timeoutMs":10000,"elapsedMs":228185,"timerDelayMs":218185,"eventLoopDelayHint":"timer delayed 218185ms, likely event-loop starvation","operation":"fetchWithTimeout","url":"https://api.telegram.org/bot873786…7UR8/getMe"} fetch timeout reached; aborting operation 19:06:09+00:00 warn telegram/network {"subsystem":"telegram/network"} fetch fallback: DNS-resolved IP unreachable; trying alternative Telegram API IP (codes=none, reason=request-timeout) 19:06:09+00:00 warn telegram/network {"subsystem":"telegram/network"} fetch fallback: DNS-resolved IP unreachable; trying alternative Telegram API IP (codes=none, reason=request-timeout) 19:06:09+00:00 error channels/telegram {"subsystem":"channels/telegram"} [telegram] Polling stall detected (active getUpdates stuck for 228.53s); forcing restart. [diag inFlight=1 outcome=started startedAt=1778612540561 finishedAt=n/a durationMs=n/a offset=0] 19:06:09+00:00 error channels/telegram {"subsystem":"channels/telegram"} telegram deleteMyCommands failed: Network request for 'deleteMyCommands' failed! 19:06:09+00:00 error channels/telegram {"subsystem":"channels/telegram"} [telegram][diag] polling cycle finished reason=polling stall detected inFlight=0 outcome=error startedAt=1778612540561 finishedAt=1778612769092 durationMs=228531 offset=0 error=Network request for 'getUpdates' failed! 19:06:09+00:00 error channels/telegram {"subsystem":"channels/telegram"} Telegram polling runner stopped (polling stall detected); restarting in 4.24s. 19:06:09+00:00 error channels/telegram {"subsystem":"channels/telegram"} telegram deleteMyCommands(all_group_chats) failed: Network request for 'deleteMyCommands' failed! 19:06:09+00:00 error channels/telegram {"subsystem":"channels/telegram"} telegram setMyCommands failed: Network request for 'setMyCommands' failed! 19:06:09+00:00 error channels/telegram {"subsystem":"channels/telegram"} Telegram command sync failed: HttpError: Network request for 'setMyCommands' failed! 19:06:09+00:00 error channels/telegram {"subsystem":"channels/telegram"} [telegram] Polling stall detected (active getUpdates stuck for 228.38s); forcing restart. [diag inFlight=1 outcome=started startedAt=1778612540732 finishedAt=n/a durationMs=n/a offset=0] 19:06:09+00:00 error channels/telegram {"subsystem":"channels/telegram"} telegram deleteMyCommands failed: Network request for 'deleteMyCommands' failed! 19:06:09+00:00 error channels/telegram {"subsystem":"channels/telegram"} [telegram][diag] polling cycle finished reason=polling stall detected inFlight=0 outcome=error startedAt=1778612540732 finishedAt=1778612769114 durationMs=228382 offset=0 error=Network request for 'getUpdates' failed! 19:06:09+00:00 error channels/telegram {"subsystem":"channels/telegram"} Telegram polling runner stopped (polling stall detected); restarting in 4.11s. 19:06:09+00:00 error channels/telegram {"subsystem":"channels/telegram"} telegram deleteMyCommands(all_group_chats) failed: Network request for 'deleteMyCommands' failed! 19:06:09+00:00 error channels/telegram {"subsystem":"channels/telegram"} telegram setMyCommands failed: Network request for 'setMyCommands' failed! 19:06:09+00:00 error channels/telegram {"subsystem":"channels/telegram"} Telegram command sync failed: HttpError: Network request for 'setMyCommands' failed! 19:06:09+00:00 warn diagnostic {"subsystem":"diagnostic"} liveness warning: reasons=event_loop_utilization,cpu interval=228s eventLoopDelayP99Ms=0 eventLoopDelayMaxMs=0 eventLoopUtilization=1 cpuCoreRatio=1.007 active=1 waiting=0 queued=2 phase=channels.telegram.start-account recentPhases=sidecars.main-session-recovery:4ms,post-attach.update-sentinel:26ms,sidecars.restart-sentinel:38ms,sidecars.model-prewarm:888ms,post-ready.maintenance:4ms,sidecars.session-locks:1469ms work=[active=agent:marcus:main(processing,q=2,age=277s) queued=agent:marcus:main(processing,q=2,age=277s)] 19:06:09+00:00 warn diagnostic {"subsystem":"diagnostic"} stuck session: sessionId=unknown sessionKey=agent:marcus:main state=processing age=277s queueDepth=2 reason=queued_work_without_active_run classification=stale_session_state recovery=checking 19:06:09+00:00 warn diagnostic {"subsystem":"diagnostic"} stuck session recovery outcome: status=noop action=none sessionId=unknown sessionKey=agent:marcus:main lane=session:agent:marcus:main reason=no_active_work 19:10:23+00:00 error channels/telegram {"subsystem":"channels/telegram"} [telegram][diag] closing stale transport before rebuild 19:10:23+00:00 error channels/telegram {"subsystem":"channels/telegram"} [telegram][diag] rebuilding transport for next polling cycle 19:10:24+00:00 error channels/telegram {"subsystem":"channels/telegram"} [telegram][diag] closing stale transport before rebuild 19:10:24+00:00 error channels/telegram {"subsystem":"channels/telegram"} [telegram][diag] rebuilding transport for next polling cycle 19:10:24+00:00 warn fetch-timeout {"subsystem":"fetch-timeout"} {"timeoutMs":10000,"elapsedMs":255117,"timerDelayMs":245117,"eventLoopDelayHint":"timer delayed 245117ms, likely event-loop starvation","operation":"fetchWithTimeout","url":"https://api.telegram.org/bot813806…ceI8/getMe"} fetch timeout reached; aborting operation 19:10:24+00:00 warn diagnostic {"subsystem":"diagnostic"} liveness warning: reasons=event_loop_utilization,cpu interval=255s eventLoopDelayP99Ms=0 eventLoopDelayMaxMs=0 eventLoopUtilization=1 cpuCoreRatio=1.007 active=1 waiting=0 queued=2 phase=channels.telegram.start-account recentPhases=sidecars.main-session-recovery:4ms,post-attach.update-sentinel:26ms,sidecars.restart-sentinel:38ms,sidecars.model-prewarm:888ms,post-ready.maintenance:4ms,sidecars.session-locks:1469ms work=[active=agent:marcus:main(processing,q=2,age=532s) queued=agent:marcus:main(processing,q=2,age=532s)] 19:15:03+00:00 error Gateway stability failed: GatewayTransportError: gateway timeout after 10000ms 19:15:56+00:00 warn fetch-timeout {"subsystem":"fetch-timeout"} {"timeoutMs":10000,"elapsedMs":332324,"timerDelayMs":322324,"eventLoopDelayHint":"timer delayed 322324ms, likely event-loop starvation","operation":"fetchWithTimeout","url":"https://api.telegram.org/bot873786…7UR8/getMe"} fetch timeout reached; aborting operation 19:15:56+00:00 warn telegram/network {"subsystem":"telegram/network"} fetch fallback: DNS-resolved IP unreachable; trying alternative Telegram API IP (codes=none, reason=request-timeout)

Root Cause

Root Cause Chain

Code Example

1. agent:marcus:main enters processing state and does not complete
2. event loop utilization hits 100% (eventLoopUtilization=1)
3. Node.js timers fire 68-322 seconds late (eventLoopDelayMs)
4. Telegram getUpdates() HTTP request cannot complete because:
   - The fetch() call needs event loop cycles to process the HTTP response
   - The event loop is completely occupied by marcus session processing
5. OpenClaw detects polling stall after 78-332 seconds
6. OpenClaw attempts to restart the Telegram polling runner
7. New getUpdates call immediately stalls again on next attempt
8. Cycle repeats indefinitely until gateway is restarted
9. Telegram eventually expires queued messages (~24h window)
10. User message is permanently lost

### Steps to reproduce

talk to multiple agents, one should hang and cause telegram also not work.

### Expected behavior

expect no errors and that my agents work.

### Actual behavior

errors, gateway frozen state no telegram messages are being received. 

### OpenClaw version

v2026.5.12-beta.1

### Operating system

Ununtu

### Install method

NPM

### Model

minimax

### Provider / routing chain

miminx

### Additional provider/model setup details

_No response_

### Logs, screenshots, and evidence
RAW_BUFFERClick to expand / collapse

Bug type

Regression (worked before, now fails)

Beta release blocker

No

Summary

Date: 2026-05-12 Time of incident: ~21:01 CET (19:01 UTC) OpenClaw version: 2026.5.12-beta.1 (1824464) Node.js: v24.14.1

Summary

Telegram messages are silently dropped when the OpenClaw event loop becomes saturated. The Telegram polling mechanism has no resilience against event-loop starvation — when a single agent session (marcus) blocks the event loop, the Telegram getUpdates call never completes, causing messages to queue in Telegram's servers until they expire (~24h), never reaching the agent.

The message at 21:01 CET was never received by Neon. Telegram held it for several hours but the OpenClaw Telegram polling was completely blocked.


Root Cause Chain

1. agent:marcus:main enters processing state and does not complete
2. event loop utilization hits 100% (eventLoopUtilization=1)
3. Node.js timers fire 68-322 seconds late (eventLoopDelayMs)
4. Telegram getUpdates() HTTP request cannot complete because:
   - The fetch() call needs event loop cycles to process the HTTP response
   - The event loop is completely occupied by marcus session processing
5. OpenClaw detects polling stall after 78-332 seconds
6. OpenClaw attempts to restart the Telegram polling runner
7. New getUpdates call immediately stalls again on next attempt
8. Cycle repeats indefinitely until gateway is restarted
9. Telegram eventually expires queued messages (~24h window)
10. User message is permanently lost

### Steps to reproduce

talk to multiple agents, one should hang and cause telegram also not work.

### Expected behavior

expect no errors and that my agents work.

### Actual behavior

errors, gateway frozen state no telegram messages are being received. 

### OpenClaw version

v2026.5.12-beta.1

### Operating system

Ununtu

### Install method

NPM

### Model

minimax

### Provider / routing chain

miminx

### Additional provider/model setup details

_No response_

### Logs, screenshots, and evidence

```shell
# Evidence

### System State During Incident

| Metric | Value |
|--------|-------|
| eventLoopUtilization | 1 (100% saturated) |
| cpuCoreRatio | 1.007-1.01 (1 core fully used) |
| Stuck session | `agent:marcus:main` (age: 245s → 532s) |
| Queue depth | 1→2 (marcus accumulating work) |
| Stuck session recovery | `status=noop action=none reason=no_active_work` |

### Timer Delays (event loop starvation evidence)

| Time (CET) | Timer Delay | Operation |
|------------|-------------|-----------|
| 20:56 | 68,181ms | Telegram getMe |
| 20:56 | 79,327ms | Telegram getMe |
| 20:59 | 122,335ms | Telegram getUpdates |
| 21:02 | 145,011ms | Telegram getMe |
| 21:06 | 218,185ms | Telegram getMe |
| 21:15 | 322,324ms | Telegram getUpdates |

### Polling Stall Events

| Time (CET) | Stall Duration | Outcome |
|------------|----------------|---------|
| 20:59 | 132.94s | restart in 2.27s |
| 21:06 | 228.53s | restart in 4.24s |
| 21:15 | 332.46s | restart in 6.81s |

Each stall caused cascading failures:
- `deleteMyCommands` failed
- `setMyCommands` failed
- `getUpdates` never returned

### Stuck Session Detection — No Recovery


stuck session: sessionId=unknown sessionKey=agent:marcus:main state=processing age=277s queueDepth=2 reason=queued_work_without_active_run classification=stale_session_state recovery=checking

stuck session recovery outcome: status=noop action=none sessionId=unknown sessionKey=agent:marcus:main lane=session:agent:marcus:main reason=no_active_work


The stuck session detector identifies the problem but **cannot recover** — `status=noop` means no action was taken.

---

## Why This Is a Bug (Not a Configuration Issue)

1. **Telegram polling should not be blockable by a single agent session** — The Telegram channel runs independently and should have event-loop priority for receiving messages.

2. **Stuck session recovery is ineffective** — The detector identifies `agent:marcus:main` as stuck with `queued_work_without_active_run`, but the recovery does nothing (`noop`).

3. **Event loop starvation is not handled** — When `eventLoopUtilization=1` and `eventLoopDelayMaxMs=0` (meaning timers fire late but we can't measure how late), the system continues rather than taking corrective action.

4. **The Telegram polling runner restart doesn't help** — Even after a polling restart, the new `getUpdates` call immediately stalls because the event loop is still saturated.

5. **No circuit breaker** — After N consecutive polling stalls, the system should stop retrying and alert — instead it loops forever.

---

19:06:08+00:00 warn tools-invoke: tool execution failed: GatewayTransportError: gateway timeout after 60000ms
Gateway target: ws://127.0.0.1:18789
Source: local loopback
Config: /home/najef/.openclaw/openclaw.json
Bind: loopback
19:06:08+00:00 warn fetch-timeout {"subsystem":"fetch-timeout"} {"timeoutMs":10000,"elapsedMs":228185,"timerDelayMs":218185,"eventLoopDelayHint":"timer delayed 218185ms, likely event-loop starvation","operation":"fetchWithTimeout","url":"https://api.telegram.org/bot873786…7UR8/getMe"} fetch timeout reached; aborting operation
19:06:09+00:00 warn telegram/network {"subsystem":"telegram/network"} fetch fallback: DNS-resolved IP unreachable; trying alternative Telegram API IP (codes=none, reason=request-timeout)
19:06:09+00:00 warn telegram/network {"subsystem":"telegram/network"} fetch fallback: DNS-resolved IP unreachable; trying alternative Telegram API IP (codes=none, reason=request-timeout)
19:06:09+00:00 error channels/telegram {"subsystem":"channels/telegram"} [telegram] Polling stall detected (active getUpdates stuck for 228.53s); forcing restart. [diag inFlight=1 outcome=started startedAt=1778612540561 finishedAt=n/a durationMs=n/a offset=0]
19:06:09+00:00 error channels/telegram {"subsystem":"channels/telegram"} telegram deleteMyCommands failed: Network request for 'deleteMyCommands' failed!
19:06:09+00:00 error channels/telegram {"subsystem":"channels/telegram"} [telegram][diag] polling cycle finished reason=polling stall detected inFlight=0 outcome=error startedAt=1778612540561 finishedAt=1778612769092 durationMs=228531 offset=0 error=Network request for 'getUpdates' failed!
19:06:09+00:00 error channels/telegram {"subsystem":"channels/telegram"} Telegram polling runner stopped (polling stall detected); restarting in 4.24s.
19:06:09+00:00 error channels/telegram {"subsystem":"channels/telegram"} telegram deleteMyCommands(all_group_chats) failed: Network request for 'deleteMyCommands' failed!
19:06:09+00:00 error channels/telegram {"subsystem":"channels/telegram"} telegram setMyCommands failed: Network request for 'setMyCommands' failed!
19:06:09+00:00 error channels/telegram {"subsystem":"channels/telegram"} Telegram command sync failed: HttpError: Network request for 'setMyCommands' failed!
19:06:09+00:00 error channels/telegram {"subsystem":"channels/telegram"} [telegram] Polling stall detected (active getUpdates stuck for 228.38s); forcing restart. [diag inFlight=1 outcome=started startedAt=1778612540732 finishedAt=n/a durationMs=n/a offset=0]
19:06:09+00:00 error channels/telegram {"subsystem":"channels/telegram"} telegram deleteMyCommands failed: Network request for 'deleteMyCommands' failed!
19:06:09+00:00 error channels/telegram {"subsystem":"channels/telegram"} [telegram][diag] polling cycle finished reason=polling stall detected inFlight=0 outcome=error startedAt=1778612540732 finishedAt=1778612769114 durationMs=228382 offset=0 error=Network request for 'getUpdates' failed!
19:06:09+00:00 error channels/telegram {"subsystem":"channels/telegram"} Telegram polling runner stopped (polling stall detected); restarting in 4.11s.
19:06:09+00:00 error channels/telegram {"subsystem":"channels/telegram"} telegram deleteMyCommands(all_group_chats) failed: Network request for 'deleteMyCommands' failed!
19:06:09+00:00 error channels/telegram {"subsystem":"channels/telegram"} telegram setMyCommands failed: Network request for 'setMyCommands' failed!
19:06:09+00:00 error channels/telegram {"subsystem":"channels/telegram"} Telegram command sync failed: HttpError: Network request for 'setMyCommands' failed!
19:06:09+00:00 warn diagnostic {"subsystem":"diagnostic"} liveness warning: reasons=event_loop_utilization,cpu interval=228s eventLoopDelayP99Ms=0 eventLoopDelayMaxMs=0 eventLoopUtilization=1 cpuCoreRatio=1.007 active=1 waiting=0 queued=2 phase=channels.telegram.start-account recentPhases=sidecars.main-session-recovery:4ms,post-attach.update-sentinel:26ms,sidecars.restart-sentinel:38ms,sidecars.model-prewarm:888ms,post-ready.maintenance:4ms,sidecars.session-locks:1469ms work=[active=agent:marcus:main(processing,q=2,age=277s) queued=agent:marcus:main(processing,q=2,age=277s)]
19:06:09+00:00 warn diagnostic {"subsystem":"diagnostic"} stuck session: sessionId=unknown sessionKey=agent:marcus:main state=processing age=277s queueDepth=2 reason=queued_work_without_active_run classification=stale_session_state recovery=checking
19:06:09+00:00 warn diagnostic {"subsystem":"diagnostic"} stuck session recovery outcome: status=noop action=none sessionId=unknown sessionKey=agent:marcus:main lane=session:agent:marcus:main reason=no_active_work
19:09:07+00:00 info gateway/ws {"subsystem":"gateway/ws"} ⇄ res ✓ status 178392ms conn=d9214b39…f5d3 id=57144168…51ba
19:09:07+00:00 info gateway/ws {"subsystem":"gateway/ws"} ⇄ res ✓ status 178395ms conn=d9214b39…f5d3 id=ebd4ca09…3ea4
19:09:07+00:00 info gateway/ws {"subsystem":"gateway/ws"} ⇄ res ✓ status 178398ms conn=d9214b39…f5d3 id=a4b948ab…f3a0
19:10:23+00:00 error channels/telegram {"subsystem":"channels/telegram"} [telegram][diag] closing stale transport before rebuild
19:10:23+00:00 error channels/telegram {"subsystem":"channels/telegram"} [telegram][diag] rebuilding transport for next polling cycle
19:10:24+00:00 error channels/telegram {"subsystem":"channels/telegram"} [telegram][diag] closing stale transport before rebuild
19:10:24+00:00 error channels/telegram {"subsystem":"channels/telegram"} [telegram][diag] rebuilding transport for next polling cycle
19:10:24+00:00 info channels/telegram {"subsystem":"channels/telegram"} Telegram menu text exceeded the conservative 5700-character payload budget; shortening descriptions to keep 61 commands visible.
19:10:24+00:00 warn fetch-timeout {"subsystem":"fetch-timeout"} {"timeoutMs":10000,"elapsedMs":255117,"timerDelayMs":245117,"eventLoopDelayHint":"timer delayed 245117ms, likely event-loop starvation","operation":"fetchWithTimeout","url":"https://api.telegram.org/bot813806…ceI8/getMe"} fetch timeout reached; aborting operation
19:10:24+00:00 warn diagnostic {"subsystem":"diagnostic"} liveness warning: reasons=event_loop_utilization,cpu interval=255s eventLoopDelayP99Ms=0 eventLoopDelayMaxMs=0 eventLoopUtilization=1 cpuCoreRatio=1.007 active=1 waiting=0 queued=2 phase=channels.telegram.start-account recentPhases=sidecars.main-session-recovery:4ms,post-attach.update-sentinel:26ms,sidecars.restart-sentinel:38ms,sidecars.model-prewarm:888ms,post-ready.maintenance:4ms,sidecars.session-locks:1469ms work=[active=agent:marcus:main(processing,q=2,age=532s) queued=agent:marcus:main(processing,q=2,age=532s)]
19:14:34+00:00 info gateway/ws {"subsystem":"gateway/ws"} ⇄ res ✓ status 249810ms conn=d9214b39…f5d3 id=76fe1d6f…a9fa
19:14:34+00:00 info gateway/ws {"subsystem":"gateway/ws"} ⇄ res ✓ status 249814ms conn=d9214b39…f5d3 id=83b521aa…072d
19:14:34+00:00 info gateway/ws {"subsystem":"gateway/ws"} ⇄ res ✓ status 249816ms conn=d9214b39…f5d3 id=ed394dda…ac07
19:14:34+00:00 info gateway/ws {"subsystem":"gateway/ws"} ⇄ res ✓ status 249817ms conn=d9214b39…f5d3 id=211ae891…7a4a
19:14:34+00:00 info gateway/ws {"subsystem":"gateway/ws"} ⇄ res ✓ status 249820ms conn=d9214b39…f5d3 id=c6a03bdd…83d5
19:14:35+00:00 info gateway/ws {"subsystem":"gateway/ws"} ⇄ res ✓ sessions.list 1470265ms conn=d9214b39…f5d3 id=721696ee…8790
19:15:03+00:00 error Gateway stability failed: GatewayTransportError: gateway timeout after 10000ms
Gateway target: ws://127.0.0.1:18789
Source: local loopback
Config: /home/najef/.openclaw/openclaw.json
Bind: loopback
19:15:56+00:00 warn fetch-timeout {"subsystem":"fetch-timeout"} {"timeoutMs":10000,"elapsedMs":332324,"timerDelayMs":322324,"eventLoopDelayHint":"timer delayed 322324ms, likely event-loop starvation","operation":"fetchWithTimeout","url":"https://api.telegram.org/bot873786…7UR8/getMe"} fetch timeout reached; aborting operation
19:15:56+00:00 warn telegram/network {"subsystem":"telegram/network"} fetch fallback: DNS-resolved IP unreachable; trying alternative Telegram API IP (codes=none, reason=request-timeout)
19:15:56+00:00 warn telegram/network {"subsystem":"telegram/network"} fetch fallback: DNS-resolved IP unreachable; trying alternative Telegram API IP (codes=none, reason=request-timeout)
19:15:56+00:00 error channels/telegram {"subsystem":"channels/telegram"} [telegram] Polling stall detected (active getUpdates stuck for 332.46s); forcing restart. [diag inFlight=1 outcome=started startedAt=1778613024070 finishedAt=n/a durationMs=n/a offset=0]
19:15:56+00:00 error channels/telegram {"subsystem":"channels/telegram"} telegram deleteMyCommands failed: Network request for 'deleteMyCommands' failed!
19:15:56+00:00 error channels/telegram {"subsystem":"channels/telegram"} [telegram][diag] polling cycle finished reason=polling stall detected inFlight=0 outcome=error startedAt=1778613024070 finishedAt=1778613356535 durationMs=332465 offset=0 error=Network request for 'getUpdates' failed!
19:15:56+00:00 error channels/telegram {"subsystem":"channels/telegram"} Telegram polling runner stopped (polling stall detected); restarting in 6.71s.
19:15:56+00:00 error channels/telegram {"subsystem":"channels/telegram"} telegram deleteMyCommands(all_group_chats) failed: Network request for 'deleteMyCommands' failed!
19:15:56+00:00 error channels/telegram {"subsystem":"channels/telegram"} telegram setMyCommands failed: Network request for 'setMyCommands' failed!
19:15:56+00:00 error channels/telegram {"subsystem":"channels/telegram"} Telegram command sync failed: HttpError: Network request for 'setMyCommands' failed!
19:15:56+00:00 error channels/telegram {"subsystem":"channels/telegram"} [telegram] Polling stall detected (active getUpdates stuck for 332.36s); forcing restart. [diag inFlight=1 outcome=started startedAt=1778613024193 finishedAt=n/a durationMs=n/a offset=0]
19:15:56+00:00 error channels/telegram {"subsystem":"channels/telegram"} telegram deleteMyCommands failed: Network request for 'deleteMyCommands' failed!
19:15:56+00:00 error channels/telegram {"subsystem":"channels/telegram"} [telegram][diag] polling cycle finished reason=polling stall detected inFlight=0 outcome=error startedAt=1778613024193 finishedAt=1778613356552 durationMs=332359 offset=0 error=Network request for 'getUpdates' failed!
19:15:56+00:00 error channels/telegram {"subsystem":"channels/telegram"} Telegram polling runner stopped (polling stall detected); restarting in 6.81s.
19:15:56+00:00 error channels/telegram {"subsystem":"channels/telegram"} telegram deleteMyCommands(all_group_chats) failed: Network request for 'deleteMyCommands' failed!
19:15:56+00:00 error channels/telegram {"subsystem":"channels/telegram"} telegram setMyCommands failed: Network request for 'setMyCommands' failed!
19:15:56+00:00 error channels/telegram {"subsystem":"channels/telegram"} Telegram command sync failed: HttpError: Network request for 'setMyCommands' failed!
19:15:56+00:00 warn diagnostic {"subsystem":"diagnostic"} liveness warning: reasons=event_loop_utilization,cpu interval=332s eventLoopDelayP99Ms=0 eventLoopDelayMaxMs=0 eventLoopUtilization=1 cpuCoreRatio=1.008 active=1 waiting=0 queued=2 phase=channels.telegram.start-account recentPhases=sidecars.main-session-recovery:4ms,post-attach.update-sentinel:26ms,sidecars.restart-sentinel:38ms,sidecars.model-prewarm:888ms,post-ready.maintenance:4ms,sidecars.session-locks:1469ms work=[active=agent:marcus:main(processing,q=2,age=864s) queued=agent:marcus:main(processing,q=2,age=864s)]
19:15:56+00:00 warn diagnostic {"subsystem":"diagnostic"} stuck session: sessionId=unknown sessionKey=agent:marcus:main state=processing age=864s queueDepth=2 reason=queued_work_without_active_run classification=stale_session_state recovery=checking


19:15:56+00:00 warn diagnostic {"subsystem":"diagnostic"} stuck session recovery outcome: status=noop action=none sessionId=unknown sessionKey=agent:marcus:main lane=session:agent:marcus:main reason=no_active_work
19:16:57+00:00 warn Config warnings:
- plugins.entries.active-memory: plugin disabled (disabled in config) but config is present
- plugins.entries.device-pair: plugin disabled (not in allowlist) but config is present
- plugins.entries.lossless-claw: plugin disabled (disabled in config) but config is present

Impact and severity

Suggested Fixes (Priority Order)

  1. Give Telegram polling its own event-loop scheduling priority — Use setImmediate or dedicated worker thread for getUpdates calls so they don't starve on the main event loop.

  2. Make stuck session recovery actually recover — When agent:marcus:main is detected as stale_session_state, cancel the pending API call or interrupt the session, don't just noop.

  3. Add Telegram circuit breaker — After 3 consecutive polling stalls with increasing duration, stop retrying and emit a CRITICAL alert. Don't loop forever.

  4. Event-loop backpressure — When eventLoopUtilization=1 for >X seconds, pause new work from being queued to agent:marcus:main until the event loop recovers.

  5. Polling offset persistence — If the Telegram poll is restarting repeatedly, maintain the offset so messages don't get re-delivered after recovery.

telegram-polling-stall-evidence-2026-05-12.json

Additional information

No response

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

FAQ

Expected behavior

expect no errors and that my agents work.

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING

openclaw - 💡(How to fix) Fix [Bug]: Telegram polling stalls when event loop is saturated — messages lost