> ## Documentation Index
> Fetch the complete documentation index at: https://prism.ntecdev.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# SPEC-037 v0.1: Backend-side signal piggyback for reliable agent-to-agent delivery

> Backend-side signal piggyback for reliable agent-to-agent delivery

<Info>**Status:** `draft` · **Version** `0.1` · Filed 2026-04-25</Info>

SPEC-037 v0.1 — Backend-side signal piggyback for reliable agent-to-agent delivery without LAN Redis exposure.

PROBLEM: Agent-to-agent signals (SPEC-034) silently dropped between off-server1 agents. Root cause is NOT the MCP protocol limitation. PiggybackStrategy + ChannelsPushStrategy + verb-response decorator are correctly implemented. Breakdown is the SUBSCRIBER TRANSPORT: mcp/subscriber.py requires PRISM\_REDIS\_URL set; LAN clients don't have it; subscriber doesn't run; strategy buffer never fed; pending\_signals\[] always empty.

EVIDENCE (2026-04-24/25 session): three signals — fb9e0370, 924ca769, 08aaa081 — all marked delivered\_at via channels\_push but agents never saw them. Recovery only via direct postgres query or manual reset + re-prism\_start startup\_drain.

FIX: backend appends pending\_signals\[] on every authenticated verb response. Stop pre-marking delivered\_at on send. Eliminates subscriber-transport dependency. No LAN Redis exposure, no SSE endpoint, no firewall holes.

DESIGN:
§1 Backend drain: every authenticated verb response (excl. /controller/heartbeat) drains undelivered signals for caller's identity, atomically marks delivered\_at + delivery\_method='piggyback', returns in pending\_signals\[].
§2 Stop pre-marking delivered\_at in send\_signal — let actual delivery be only writer.
§3 Dedupe: verb response decorator merges backend pending + in-process strategy buffer by signal\_id.
§4 New prism\_signals\_pending verb for proactive polling.
§5 delivery\_method taxonomy: piggyback (NEW backend), startup\_drain (unchanged), broadcast (unchanged), channels\_push (real push when SDK lands), subscriber\_buffer (NEW client-side strategy drain).
§6 Three-phase rollout: this SPEC (universal drain), Phase 2 (real MCP channels push), Phase 3 (Claude Code hook).

CONTRACT: no silent signal loss between any two agents. delivered\_at honest. No new infrastructure for LAN clients.

NON-GOALS: removing strategy abstraction, real MCP server-push, LAN Redis exposure, changing startup\_drain.

BACKWARDS COMPAT: pre-upgrade clients ignore pending\_signals (fall back to startup\_drain). In-cluster subscribers continue working — dedupe handles overlap.

ROLLOUT: single commit. Files: backend/app/auth/authforge.py (drain), backend/app/services/signal\_service.py (stop pre-mark + drain function), backend/app/routers/signal.py (new endpoint), mcp/server.py (verb + dedupe), mcp/client.py (client method). No migration. Deploy via rsync + compose rebuild.

RELATED: SPEC-034 (extends), SPEC-035 (complements — engagement routing picks target, this ensures target receives), SPEC-032 (reduces dependence). Sibling: SPEC-036 (scaffolder fix by Lola, distinct concern).
