Skip to content

Build1 publisher3 min readPublished

Stale OpenClaw bot accounts kept sending hourly Telegram messages after the channel was disabled

OpenClaw's Telegram enabled flag stopped inbound polling while cron-driven sends kept firing hourly through three stale bot accounts, one operator reports. The dashboard showed the channel off, and the sends ended only when the bot tokens left the secrets directory.

The Engineer · Build desk

Illustration accompanying Stale OpenClaw bot accounts kept sending hourly Telegram messages after the channel was disabled

What happened

  • The operator set enabled: false at the top level and on each bot account, and both the config file and the dashboard showed the channel as off.
  • No status indicator flagged the outbound sends; the operator found them only by reading the raw gateway log line by line.
  • The working fix moved all five Telegram bot token files out of the secrets directory into a disabled folder.
  • The bot accounts were later deleted at BotFather, and Telegram ownership moved out of OpenClaw into Hermes as the single control plane.

Compiled by The EngineerSomething wrong?How this is made

Why it matters

  • constraint A false flag and a green dashboard vouch only for the path the flag gates, so schedule-driven sends have to be verified against the raw gateway log.
  • decision Shutting off a channel becomes a choice between a flag each code path must honor and a revoked credential that every path needs in order to send.
  • exposure Duplicate bot accounts left over from earlier setups remain live senders for as long as their token files sit in the secrets directory.

The setting was three lines of YAML:

```yaml channels: telegram: enabled: false ```

The author runs OpenClaw, an npm package plus a native Mac app, pinned at [email protected], and wrote none of it [1]. They also run Hermes, a deployed copy of Nous Research's MIT-licensed hermes-agent [2]. Their diagnosis of the Telegram failure is narrow. "It said nothing about whether anything could still go out. Same boolean, two different claims," the author wrote of the flag [8].

Two trigger paths sat behind that one switch. Inbound polling runs because the gateway is listening, and the flag stopped the listening [4]. A cron job runs because the clock fired it. The log fits a scheduled job that looked up an account and its token and sent, without consulting the flag [4][9]. The post does not include the scheduler's code or the flag's documentation, so which check the job skipped is not established.

The author declines to call it a bug. They wrote that "the flag almost certainly does exactly what it promises for the path it governs" [10]. I think that is the right reading of one operator's logs from one version. Their advice is broader: "If you operate anything with both a request-driven path and a schedule-driven path gated by the same nominal switch, don't assume they obey it identically." [11]

The token move is the part I would copy. A config flag is a check that each code path has to remember to make. A missing credential fails every path at authentication, including paths the operator forgot existed. "No token, no code path (scheduled or otherwise) can authenticate and send," the author wrote [9]. Handing Telegram to Hermes alone ended a setup of "two systems each partially able to trigger sends" [7].

The author folds all four incidents in the post into one rule: "a system's report of its own state is a claim, not a fact" [15]. In the second, an upgrade from 2026.7.1-2 to 2026.8.1 left twelve stale files that OpenClaw's doctor --fix and --repair commands were supposed to clear [12]. The author tried every flag combination the tool exposed, and the files stayed [12]. They renamed the files to match the tool's own remediation convention, backed up the originals first, and approved each batch individually from a phone [13].

Hermes produced the third. Its persona spec went through at least seven dated revisions, growing from one sentence to 364 lines [14]. One example logged as "Bad" has the model suggesting a clarifying question instead of asking one [16]. Enforcement then moved out of the prose and into code that runs before the model gets a turn [14].

What to watch

  • Whether an OpenClaw release after 2026.9.4 documents which paths channels.telegram.enabled governs, or makes cron-driven sends honor it.
  • Whether other OpenClaw operators report scheduled outbound traffic from channels they had set to disabled.
  • Whether a later doctor --fix or --repair release clears the stale files left by the 2026.7.1-2 to 2026.8.1 upgrade.
Loading claim ledger
Loading source directory links
Loading share composer
Loading topic controls
Loading related stories