-
-
Notifications
You must be signed in to change notification settings - Fork 69.6k
Signal: sentTranscript sync messages bypass loop protection on daemon restart #31084
Description
Summary
On daemon restart, signal-cli replays recently sent outgoing messages as sentTranscript (sync) messages through the receive loop. OpenClaw's loop protection does not filter these, causing the agent to process its own sent messages as inbound and reply to them.
Environment
- OpenClaw: 2026.2.26
- signal-cli: 0.14.0
- Channel config:
dmPolicy: "pairing",allowFromlist with 4 numbers
Steps to reproduce
- Send a message via signal-cli to a number on the
allowFromlist - Restart the gateway (
openclaw gateway restart) - signal-cli daemon starts and syncs recent messages
- The sent message arrives as a sentTranscript with the recipient's number as sender
- Loop protection checks if sender == bot's own number — it doesn't match (it's the recipient's number)
- Message passes
allowFromcheck (recipient is on the list) - Agent processes it as a legitimate inbound message and sends a reply
Expected behavior
sentTranscript / sync messages should be filtered out before reaching the agent. They are not inbound messages — they are sync replays of outgoing messages for multi-device consistency.
Actual behavior
The agent responds to its own previously sent messages. In our case, a test message sent to the operator triggered an automatic "What's up?" reply on daemon restart.
Impact
Any daemon restart can produce spurious replies to anyone on the allowFrom list if there are recent outgoing messages in the sync queue. For a clinic communication system, this means unexpected messages to clients or practitioners.
Workaround
Using signal-cli --disable-send-log via a wrapper script at cliPath prevents sync replay on restart. This works but disables the send log entirely, which may have side effects for multi-device sync.
Suggested fix
Filter sentTranscript / syncMessage types at the signal channel adapter level before passing messages to the agent. These message types have a distinct envelope structure in signal-cli's JSON-RPC output and should be identifiable.
Alternatively, expose an ignoreSyncMessages: true config option under channels.signal.