---
name: f007-live-relay-acceptance
description: "F-007 ruling — live bringup is persistent `api listen` via Monitor (heir to $LIVE start), NOT --once; psyche-spawn gated on --manifest + the v0.7.4 install-dir binary-resolution fix; both items Bucket 2"
metadata: 
  node_type: memory
  type: project
  originSessionId: 8bff47ac-ae57-48ac-a383-fca01d85f232
---

perri's F-007 (spt-claude-code), doyle ruling 2026-06-16. Both items **Bucket 2 (docs gap)**, NOT missing-feature. (I initially mis-recommended `--once`; operator corrected — corrected below.)

**LIVE BRINGUP MODEL (CONTEXT.md:148/167):** a live agent is brought up by firing **`spt api listen <id>` (persistent, NO --once) inside the Monitor tool** — the long-running relay loop that binds the live perch, spawns the Psyche, streams EVENTs to stdout. This is the **heir to legacy `$LIVE start <id>`** (CONTEXT.md:148 verbatim). `--once` ("drain backlog + one cycle, then exit", api/mod.rs:66) is the **degenerate path for harnesses LACKING a Monitor equivalent** — terminates per message, WRONG for Claude Code (which has Monitor). Legacy parity: `$LIVE start doyle` (via Monitor) = LIVE; `$OWL listen doyle` = READY. spt-core has the parity primitive (`api listen` via Monitor) → no missing feature.

**ITEM 1 `spt how-to live` = NO_SUCH_TOPIC** — doc gap, sibling of [[howto-subnet-w5-scope]]. Add HOW_TO_LIVE topic (live bringup via Monitor + ready-vs-live + relay-reconcile + the acceptance recipe) + registry + v1-lock bump. Fast-follow post-M11. **DONE @672b928 on m11-shell-substrate (PR #16, → v0.8.0):** HOW_TO_LIVE text + registry (`live` topic) + v1-lock bump (names {ready,send,subnet,live}); acceptance recipe → docs-site harness-contract/patterns.md; lifecycle/overview.md pointer. Preflight green (unit + workspace-clippy + traceable EXIT0 + xtask gen no-drift).

**⚠ MARKER MODEL CHANGED post-M11-W0.2 — perri's published-v0.7.3 recipe will break at v0.8.0:** on the M11 branch (→ v0.8.0) `spt api listen` NO LONGER spawns the Psyche in-process. It emits ONLY `BOUND:<id>` + `READY:<id>` on stderr and marks the perch `status=online`; the DAEMON livehost hosts the Psyche off that status (`LIVEHOST_PSYCHE:<id> pid=…` on the *daemon's* stderr, livehost.rs:212) — **`PSYCHE_SPAWNED:` is GONE** (grep-confirmed zero occurrences in tree; startup.rs:282-289 only sets online). So the v0.8.0 acceptance recipe asserts: BOUND+READY off the listen child, relayed EVENT off its stdout, and Psyche-up via the `<id>-psyche` perch online + kind `live_agent` (or LIVEHOST_PSYCHE on the daemon) — NOT PSYCHE_SPAWNED off the child. **Tell perri at v0.8.0 publish: update her F-007 int** (assert child markers BOUND/READY + psyche-perch-online, drop the PSYCHE_SPAWNED-off-child assertion; needs a live daemon for the host leg). Branch truth = live_firsthost_e2e.rs.

**`--adapter`-resolves-manifest is v0.8.0-only:** on the M11 branch manifest loads ONLY from `--manifest` (mod.rs:312); the `--adapter <name:profile>` bare-resolve is the unified-v0.8.0 "api ergonomics fix" (not on the branch yet). HOW_TO_LIVE documents it as "(v0.8.0+)" — forward-correct ONLY IF that fix lands in the v0.8.0 merge. Confirm the ergonomics fix is in before publish, else the doc claim is wrong.

**ITEM 2 non-interactive acceptance** — Bucket 2 (docs), not Bucket 3. Recipe (the harness plays Monitor's role): `api seed --pid <WINPID> --session-id <sid>` → spawn `spt api listen <id> --manifest <live manifest>` as a CHILD capturing stdout → wait READY → `spt send <id> <probe>` → read relayed EVENT off the child + assert Psyche → kill child (relay is "freely killable"). Pin OWL_SESSION_ID.

**PSYCHE-SPAWN root cause (perri's empirical gap):** spawn_psyche fires at startup.rs:288-294 (prints `PSYCHE_SPAWNED:`/`PSYCHE_SPAWN_FAIL:` to stderr) BEFORE the once/loop split — so it does NOT depend on --once-vs-persistent. It is gated on `LiveHost::new_opt` being Some, which needs a **`--manifest`** declaring `[session.psyche_init]`. perri's recipe passed only `--adapter` (a name string; manifest loads ONLY from `--manifest`, api/mod.rs:289) → manifest=None → no spawn attempted → no marker. FIX: add `--manifest`. THEN on 0.7.3 a bare psyche-binary name misses PATH → `PSYCHE_SPAWN_FAIL` → that is EXACTLY the **v0.7.4 Feature B / REQ-INSTALL-11** fix (install-dir binary resolution; on the api seam install_dir = --manifest parent dir) — already built. So perri's psyche gap = --manifest usage + the v0.7.4 fix, independently validating Feature B.

**GOTCHAS (perri-found, for the acceptance docs):** anchor pid must be the WINDOWS pid (git-bash `$$` = MSYS pid → STALE_SEED; derive WINPID via ps for --pid + --parent-pid); `send` to a never-bound perch = NO_PERCH (no queue) → `bind <id>` first, then send → QUEUED.

**Orchestration owed:** fold the how-to-live topic + this live-bringup/acceptance/psyche recipe into the post-M11 docs follow-on. Relay leg already shipped by perri. Detail in docs/SPT-CORE-FINDINGS.md F-007. Reinforces [[perri-question-triage-protocol]]; lesson: ground in CONTEXT.md before ruling (I erred recommending --once from the Rust-test path, not the Monitor model).
