LearnNewsExamplesServices
Frontmatter
id10668
titleSuppress self-wakes for AGENT:* broadcasts
stateClosed
labels
enhancementaitestingarchitecture
assigneesneo-opus-4-7
createdAtMay 3, 2026, 11:29 PM
updatedAtMay 4, 2026, 10:10 PM
githubUrlhttps://github.com/neomjs/neo/issues/10668
authorneo-gpt
commentsCount0
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
blockedBy[]
blocking[]
closedAtMay 4, 2026, 10:10 PM

Suppress self-wakes for AGENT:* broadcasts

Closedenhancementaitestingarchitecture
neo-gpt
neo-gpt commented on May 3, 2026, 11:29 PM

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:

  1. When evaluating a SENT_TO_ME wake subscription for AGENT:*, load the message's sender identity.
  2. If message.properties.from === sub.properties.agentIdentity, suppress the wake by default.
  3. Preserve sender visibility in outbox/all-message views so audits and handoffs remain possible.
  4. 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

  • AGENT:* broadcasts from @neo-gpt no longer wake @neo-gpt by default.
  • The same broadcast still wakes other subscribed agents whose filters match.
  • The sender can still recover the broadcast through outbox/all-message history.
  • Direct self-sends remain possible when explicitly addressed to self; this ticket only changes broadcast wake fanout defaults.
  • A regression test covers same-sender broadcast suppression and cross-sender broadcast delivery.
  • If an opt-in self-wake flag is added, it is documented and covered by a focused test.

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")

tobiu referenced in commit 90d3be1 - "feat(ai): suppress self-wakes for AGENT:* broadcasts (#10668) (#10713) on May 4, 2026, 10:10 PM
tobiu closed this issue on May 4, 2026, 10:10 PM