Skip to content

Signal: sentTranscript sync messages bypass loop protection on daemon restart #31084

@AlethiaQuizForge

Description

@AlethiaQuizForge

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", allowFrom list with 4 numbers

Steps to reproduce

  1. Send a message via signal-cli to a number on the allowFrom list
  2. Restart the gateway (openclaw gateway restart)
  3. signal-cli daemon starts and syncs recent messages
  4. The sent message arrives as a sentTranscript with the recipient's number as sender
  5. Loop protection checks if sender == bot's own number — it doesn't match (it's the recipient's number)
  6. Message passes allowFrom check (recipient is on the list)
  7. 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions