Bug Report
Summary
When a cron job uses delivery: announce and sends an inter-session announce step via sessions_send to a session whose lastChannel is Telegram, the agent's ANNOUNCE_SKIP reply gets delivered outbound to the user's Telegram chat instead of being suppressed.
Steps to Reproduce
- Set up a cron with
delivery: { mode: "announce" }
- Have the cron deliver a result to the user via Telegram (e.g.
channel: "telegram", to: "<user_id>")
- After delivery, the cron framework sends an inter-session announce step to the main session via
sessions_send
- The main session replies
ANNOUNCE_SKIP
- That reply gets routed to Telegram because the session's
lastChannel is Telegram
Expected Behavior
ANNOUNCE_SKIP replies to inter-session announce step messages should be silently swallowed and never delivered to any external channel.
Actual Behavior
The ANNOUNCE_SKIP string appears as a visible message in the user's Telegram chat.
Environment
- OpenClaw version: 2026.3.12
- Channel: Telegram
- Trigger: Cron with
delivery: announce + channel: telegram
Notes
- The bug appears to be in how the announce step's follow-up
sessions_send ping routes the reply - it inherits lastChannel (Telegram) and delivers outbound instead of staying internal
ANNOUNCE_SKIP is correctly suppressed in cron delivery mode but not for inter-session sessions_send paths
- Workaround: none found;
NO_REPLY also gets delivered to Telegram
Bug Report
Summary
When a cron job uses
delivery: announceand sends an inter-session announce step viasessions_sendto a session whoselastChannelis Telegram, the agent'sANNOUNCE_SKIPreply gets delivered outbound to the user's Telegram chat instead of being suppressed.Steps to Reproduce
delivery: { mode: "announce" }channel: "telegram", to: "<user_id>")sessions_sendANNOUNCE_SKIPlastChannelis TelegramExpected Behavior
ANNOUNCE_SKIPreplies to inter-session announce step messages should be silently swallowed and never delivered to any external channel.Actual Behavior
The
ANNOUNCE_SKIPstring appears as a visible message in the user's Telegram chat.Environment
delivery: announce+channel: telegramNotes
sessions_sendping routes the reply - it inheritslastChannel(Telegram) and delivers outbound instead of staying internalANNOUNCE_SKIPis correctly suppressed in cron delivery mode but not for inter-sessionsessions_sendpathsNO_REPLYalso gets delivered to Telegram