---
name: live-delivery-model-and-dupmsg
description: "claude-spt live-agent inbound delivery contract (relay/translate/hook, NEVER raw PTY) + the 2026-07-08 duplicate-inbound core bug I confirmed for doyle"
metadata: 
  node_type: memory
  type: reference
  originSessionId: 9f809150-e92c-474b-8ff6-ee237b441071
---

**claude-spt delivers inbound to a LIVE agent via ADAPTER-owned channels ONLY** (confirmed to doyle 2026-07-08, duplicate-inbound triage):
1. Operator-launched live agent → resident **Monitor relay** (`spt api listen <id>`) EVENT stream. [REQ-SKILL-LIVE]
2. Broker-held / spt-hosted live session → the **translation binary** (`claude-spt translate`) types the EVENT with a PROPER choreography: ctrl+s → framed text → **discrete `{key:enter}`** (this is what SUBMITS on modern CC TUI) → `{commit}`. [translate.rs commands_for_event]
3. **Hook drain** → `<sptc_messages>` from `api poll` as additionalContext (UPS busy→poll, PreToolUse mid-turn, Stop backstop).

**NEVER uses core's raw broker PTY-inject (bare payload + CR).** A bare `\r` does NOT submit on modern CC TUI (soft-newlines / stalls in the input field) = the F-019 / REQ-MSG-DELIVERY-AXES failure the translation binary exists to REPLACE. `state:live_agent` ALREADY means a self-reader exists — **"no relay" != "no reader."** `controllable:true` = PTY reachable for **attach / Remote Control only**, NOT a message-delivery channel.

**The dup-inbound bug (doyle's RCA, core-side):** doyle = live_agent + online + controllable:true + NO relay → `is_spt_hosted_no_relay(doyle)=TRUE` (inject.rs:37-49) → a send routes via `try_spt_hosted_inject` → raw-types the EVENT into the broker-held PTY (STUCK, no submit) WHILE the hook (sptc_messages) ALSO delivers = the duplicate + the stuck-in-input garbage the operator saw. **Fix (core, I confirmed): exclude `state:live_agent` from the inject-delivery predicate — deliver ONCE via the adapter channel, never also PTY-type.** Adapter needs NO change. Full confirm written to `C:\Users\decid\AppData\Local\Temp\F-dupmsg-adapter-confirm.md`. **doyle MINTED REQ-LIVE-AGENT-NO-INJECT-DELIVERY (F-033) @79db602, queued required_stages=[], activates at a delivery-correctness fix milestone. Adapter unchanged; my SKILL-LIVE-SPT-HOSTED-BRANCH + force-native invariants banked in the REQ for build scoping. I owe the live-verify (repro dup on a no-relay live agent → confirm single-delivery post-fix) when that milestone lands.**

Related: [[live-perch-monitor-reachability]], REQ-SKILL-LIVE-SPT-HOSTED-BRANCH (spt-hosted session must not arm a 2nd Monitor — inbound already broker-delivered), the `--force-native` self-send routing (checkpoint/rename/role_edit go through translate stdin, never the active-poll channel).
