Context
During the 2026-05-03 Codex wake stabilization run, @neo-gpt sent a coordination broadcast to AGENT:* for the #10666 cleanup lane. The bridge then woke Codex on that same broadcast:
- Wake digest latest message:
"#10666 assigned to Gemini — Codex wake cleanup PR lane" from @neo-gpt
- Mailbox truth confirmed the wake was the sender's own broadcast, not a new peer request.
The content was trustworthy because it was our own broadcast, but the wake still created operational noise and forced a mailbox poll/no-op during an active coordination loop.
The Problem
AGENT:* broadcasts currently reach the sender's wake path. That has a useful audit property — the sender can see their broadcast in the graph — but it is poor as a wake-delivery default:
- The sender already has the broadcast content in active context.
- Wake injection is treated as an interrupt and triggers
list_messages({status: 'unread'}) as canonical truth.
- Self-wakes inflate unread/no-op load during already fragile bridge and heartbeat testing.
- Repeated self-wake noise has appeared in prior wake cycles, not just this one.
This is not a request to remove broadcast visibility. It is a request to separate broadcast persistence/audit from wake delivery back to the originator.
The Architectural Reality
The current wake path treats AGENT:* as matching every SENT_TO_ME subscription, including the sender:
ai/scripts/bridge-daemon.mjs:314 matches entity.target === agentIdentity || entity.target === 'AGENT:*'.
ai/mcp/server/memory-core/services/MailboxService.mjs:361 similarly includes targetNode === target || targetNode === 'AGENT:*' for inbox listing.
AGENT:* broadcast semantics are intentional and already grounded by #10174 and #10179; those tickets should not be reopened by this work.
The right boundary is therefore wake delivery policy, not broadcast graph storage. The sender-visible audit/outbox record can remain, while the bridge/wake substrate suppresses same-sender wake interrupts by default.
The Fix
Add an explicit sender-exclusion rule for broadcast wake delivery:
- When evaluating a
SENT_TO_ME wake subscription for AGENT:*, load the message's sender identity.
- If
message.properties.from === sub.properties.agentIdentity, suppress the wake by default.
- Preserve sender visibility in outbox/all-message views so audits and handoffs remain possible.
- Provide an explicit opt-in shape only if needed, e.g.
includeSender, wakeSelf, or an equivalent clearly named metadata flag.
The implementation should choose the narrowest owning layer after inspecting current WakeSubscriptionService, bridge-daemon, and MailboxService responsibilities.
Acceptance Criteria
Out of Scope
- Redesigning
AGENT:* sentinel semantics.
- Changing the reachable-counterparty trust rules from #10179.
- Reworking mailbox permissions or role/human addressing.
- Solving #10442 metadata merge semantics.
- Changing session-sunset self-DM /
wakeSuppressed handoff behavior.
Avoided Traps
- Dropping sender visibility entirely. Rejected because auditability and outbox continuity remain useful.
- Treating all self-addressed messages as noise. Rejected because deliberate self-DM and sunset handoff flows have different semantics.
- Fixing this in agent etiquette only. Rejected because wake noise is a substrate-level fanout policy issue; every agent would otherwise need to rediscover the no-op locally.
Related
- #10174 — seeded
AGENT:* broadcast sentinel.
- #10179 — broadcast reachability for first-message bootstrap.
- #10442 — adjacent metadata merge semantics, not a duplicate.
- #10517 — HarnessPresence and wakePolicy routing.
- #10666 — current Codex wake cleanup lane that surfaced the noise during live stabilization.
Origin Session ID: d9cd4943-3285-47a6-b629-c05a9a2a38e4
Retrieval Hint: query_raw_memories(query="broadcast sender self wake AGENT:* sender exclusion own broadcast wake noise")
Context
During the 2026-05-03 Codex wake stabilization run,
@neo-gptsent a coordination broadcast toAGENT:*for the #10666 cleanup lane. The bridge then woke Codex on that same broadcast:"#10666 assigned to Gemini — Codex wake cleanup PR lane"from@neo-gptThe content was trustworthy because it was our own broadcast, but the wake still created operational noise and forced a mailbox poll/no-op during an active coordination loop.
The Problem
AGENT:*broadcasts currently reach the sender's wake path. That has a useful audit property — the sender can see their broadcast in the graph — but it is poor as a wake-delivery default:list_messages({status: 'unread'})as canonical truth.This is not a request to remove broadcast visibility. It is a request to separate broadcast persistence/audit from wake delivery back to the originator.
The Architectural Reality
The current wake path treats
AGENT:*as matching everySENT_TO_MEsubscription, including the sender:ai/scripts/bridge-daemon.mjs:314matchesentity.target === agentIdentity || entity.target === 'AGENT:*'.ai/mcp/server/memory-core/services/MailboxService.mjs:361similarly includestargetNode === target || targetNode === 'AGENT:*'for inbox listing.AGENT:*broadcast semantics are intentional and already grounded by #10174 and #10179; those tickets should not be reopened by this work.The right boundary is therefore wake delivery policy, not broadcast graph storage. The sender-visible audit/outbox record can remain, while the bridge/wake substrate suppresses same-sender wake interrupts by default.
The Fix
Add an explicit sender-exclusion rule for broadcast wake delivery:
SENT_TO_MEwake subscription forAGENT:*, load the message's sender identity.message.properties.from === sub.properties.agentIdentity, suppress the wake by default.includeSender,wakeSelf, or an equivalent clearly named metadata flag.The implementation should choose the narrowest owning layer after inspecting current
WakeSubscriptionService,bridge-daemon, andMailboxServiceresponsibilities.Acceptance Criteria
AGENT:*broadcasts from@neo-gptno longer wake@neo-gptby default.Out of Scope
AGENT:*sentinel semantics.wakeSuppressedhandoff behavior.Avoided Traps
Related
AGENT:*broadcast sentinel.Origin Session ID: d9cd4943-3285-47a6-b629-c05a9a2a38e4
Retrieval Hint:
query_raw_memories(query="broadcast sender self wake AGENT:* sender exclusion own broadcast wake noise")