---
status: accepted
---

# Active-turn delivery uses safe boundaries

Peer messages made available during an active OMP turn use their published channel directly. A live-listener arrival is surfaced immediately through the turn's native steering rail; the steer never wakes the endpoint or starts a nested turn, and the context hook expands its inert sender stub into the complete envelope at the first proven boundary before the next tool or model continuation. Separately, spt-core retains `--active-only` messages in its durable spool until an active context boundary runs authenticated `api poll --include-deferred` and surfaces that command's stdout at that boundary. The adapter does not merge the listener and poll channels into a synthetic ordered queue or infer cross-channel chronology: the listener surfaces messages as it receives them, and poll surfaces messages when it polls them. Listener arrivals during context assembly steer the next boundary. Enqueueing a steer is not reported as model-context delivery; returning the complete envelope from the context hook is the published adapter-contract transfer. If a turn ends before that boundary, unpolled active-only messages remain in spt-core custody while listener arrivals cross to ordinary idle delivery from extension memory. The published `poll` and listener surfaces are destructive drains without a receipt or acknowledgment operation, so the adapter does not duplicate spt-core's spool with a second durable custody system; process failure after core emission and before OMP consumption remains a public-contract limitation. Always waiting for the next turn was rejected because it leaves live agents unreachable during long work. Extension-memory-only context injection without an explicit steer was rejected because it can persist history after an ACP request is already assembled without guaranteeing another model continuation. Arbitrary event injection and forced interruption were rejected because they make model context and tool intent unpredictable.
