Skip to content

Telegram retry regex misses grammY HttpError format — retries never fire for network errors #51525

Description

@JiraiyaETH

Summary

The Telegram retry runner (createTelegramRetryRunner) is well-built but shouldRetry never fires for the most common transient failure class because the regex doesn't match grammY's HttpError message format.

Environment

  • OpenClaw 2026.3.13
  • Node 22, grammY, undici
  • High-latency path (Malaysia → Amsterdam, ~530ms RTT)

Details

resolveTelegramShouldRetry checks error messages against:

const TELEGRAM_RETRY_RE = /429|timeout|connect|reset|closed|unavailable|temporarily/i;

grammY wraps underlying network errors in HttpError with the message:

Network request for 'sendMessage' failed!

This string contains none of the regex keywords. The actual error codes (ECONNRESET, UND_ERR_CONNECT_TIMEOUT, ETIMEDOUT) are in .cause, but formatErrorMessage only checks the top-level message.

Result: shouldRetry returns false. Retries never fire for network errors despite TELEGRAM_RETRY_DEFAULTS being correctly configured (3 attempts, 400ms base).

Observed log pattern (~40 failures/day)

[telegram] sendMessage failed: Network request for 'sendMessage' failed!
[telegram] block reply failed: HttpError: Network request for 'sendMessage' failed!
[telegram] message processing failed: HttpError: Network request for 'sendMessage' failed!

Suggested fix

Either:

  1. formatErrorMessage should traverse .cause to include nested error codes/messages (cleaner, benefits all retry paths), OR
  2. Add "Network request" to TELEGRAM_RETRY_RE (targeted fix)

Related: #17521 (locked, covers missing retry logic — this issue identifies why the existing retry logic doesn't fire)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    Priority

    None yet

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions