37 requirements: 37 complete, 0 incomplete, 0 findings [OK] REQ-CC-LAUNCHER-BIND required: [int] stages: -doc -impl -unit +int spt-hosted bringup self-binds E2E: `spt endpoint run claude-spt ` spawns the [session.self] CC session which — via [env.SPT_ENDPOINT_ID]={id} (spt-core fills it, v0.11.0+ REQ-HAZARD-ENV-SUBST/F-013) + the SessionStart `bind` branch — registers a BOUND perch on disk reachable by `spt send` (live PTY inject, SENT). The M12 cc-launcher reachability, the gap that hid the wall-b zero-perch. [OK] REQ-CCS-PROFILES required: [doc, impl, unit, int] stages: +doc +impl +unit +int The adapter ships a ccs profile template (claude-spt:ccs) — LOCKED-ADD overlay that retargets the spawn command template through `ccs` (a drop-in for the `claude` binary) and honors ccs's relocated CLAUDE_CONFIG_DIR transcript root in the digest extractor; templates only (user supplies their own ccs config/keys) [OK] REQ-CI-ACCEPTANCE required: [doc, impl, int] stages: +doc +impl -unit +int Acceptance = scripted orchestration spawning real claude/headless sessions as the system-under-test, asserting spt-state/digest output (LLM is SUT, never the runner) [OK] REQ-CI-BUS required: [doc, impl] stages: +doc +impl -unit -int CI progress/results report over spt messaging (dogfood the product as its own CI nervous system) [OK] REQ-CI-GATES required: [doc, impl, unit] stages: +doc +impl +unit -int Deterministic gates (shell-syntax + unit tests + traceable-reqs check + manifest-schema + docs-drift), each a binary pass/fail, runnable as one command [OK] REQ-CI-MANUAL required: [doc, impl] stages: +doc +impl -unit -int A manual 'run gates' command always exists — the same gate scripts runnable by hand on any fleet host [OK] REQ-CI-OWL-DISCOVERY required: [doc, impl, unit] stages: +doc +impl +unit -int The spt messaging (bus) binary is located robustly at run time (per-version plugins path / PATH / configured) — never a hard-coded versioned path [OK] REQ-CI-TRIGGER required: [doc, impl] stages: +doc +impl -unit -int A git push hook fires the gates: pings a fleet runner-agent over spt rather than polling [OK] REQ-DIST-ADAPTER-PEROS required: [doc, impl, unit] stages: +doc +impl +unit -int The adapter ships ONE host-agnostic MULTI-PLATFORM `adapter.spt` (ADR-0024 W1, spt-core >= 0.13.2): a single fat archive bundles every recognized target-triple's tool binaries under a `/` dir beside the SHARED manifest.toml + strings/ at the archive root; install classifies the triple dirs and flattens THIS node's triple into the install dir, so a bare-name command token resolves (REQ-INSTALL-11). `spt adapter add --release` (default asset adapter.spt) + the `[update] gh_release` avenue auto-resolve the host's binaries from the one asset — RETIRING the F-014 per-OS stopgap (the old single-OS adapter.spt-by-default that broke on a foreign host). v1 triples = x86_64-pc-windows-msvc + x86_64-unknown-linux-gnu (the only two spt-core recognizes in a fat archive; platforms beyond these ship a separate single-triple asset via `--asset`). [OK] REQ-DIST-ADAPTER-RELEASE required: [doc, impl, unit, int] stages: +doc +impl +unit +int The adapter ships to end users as an `adapter.spt` GitHub release asset (tar ROOT = manifest.toml + strings/ + the tool binaries), acquired via `spt adapter add --release SaberMage/spt-claude-code` — distribution straight from the monorepo, no dedicated repo (doyle's --release acquisition source, spt v0.7.3/counter-15) [OK] REQ-DIST-BOOTSTRAP-INSTALL required: [doc, impl] stages: +doc +impl -unit -int SessionStart bootstrap installs spt-core when absent (invisible-installer pattern) [OK] REQ-DIST-CHECKPOINT-COMMUNE required: [] stages: -doc -impl -unit -int Agent-driven checkpoint: a live agent flags a commune with the literal trigger !!checkpoint!! (one = default wake; a pair brackets a custom wake directive); a PostToolUse hook detects the trigger in the Write tool_input.content for .claude/-commune.md, sets the perch idle (api state idle), and self-sends a reserved wire-sentinel (spt send --from ); the message loops back through the endpoint's own translation binary, which fires the clear+wake macro (ctrl+s · 50ms · /clear · enter · 500ms · wake-text · enter · commit). spt-hosted-only. INVARIANT: the commune is authored INLINE pre-clear (ADR-0004, Shape 1), never via a post-clear resume-Self refresh. [OK] REQ-DIST-DIGEST-EXTRACTOR required: [impl, unit, int] stages: -doc +impl +unit +int The claude-spt [digest] extractor (claude-spt-digest) maps Claude Code's JSONL transcript to the published digest-record NDJSON contract (role∈{input,agent,tool}; text/tool/ts), emitting RAW records for spt-core's renderer [OK] REQ-DIST-HOOKS-API required: [doc, impl, unit, int] stages: +doc +impl +unit +int hooks.json delegates to `spt api` rather than carrying adapter logic [OK] REQ-DIST-IDLE-MULTILINE required: [] stages: -doc -impl -unit -int The idle-translation binary renders each inbound envelope across MULTIPLE LINES in CC's input box for visual distinction — an embedded raw newline byte in the {text} payload after the opening tag and before the closing (spt-core writes {text} byte-verbatim including newlines, doyle-confirmed; CC soft-newlines on a bare newline, empirically gated). Cyan color is impossible (SGR bytes eaten by CC input handling; user-turns theme-fixed). [OK] REQ-DIST-IDLE-TRANSLATE required: [impl, unit, int] stages: -doc +impl +unit +int The adapter ships the [message-idle-translation-binary] (path="cc-spt-idle-translate") — a lifecycle-managed stdin→stdout JSON-lines filter that turns each idle inbound envelope into the keystroke choreography spt-core applies ATOMICALLY to the broker PTY: ctrl+s (stash any draft) · 50ms · (type the text, no trailing CR) · 50ms · {key:enter} (submit the PTY line) · {commit:true} (terminate the inject sequence) — so an inbound message never clobbers a half-typed operator draft (CC auto-restores the stashed draft after submit; no trailing restore keystroke). The submit is a DISCRETE {key:enter}, NOT a trailing \r in the text: a \r byte does NOT submit a Claude Code message (corrected 2026-06-23). The trailing {commit} is MANDATORY: spt-core's run_inject_worker (broker.rs:1075-1090) ends a sequence only on {commit}; without it the broker FAULTs at the 5s INJECT_COMMIT_DEADLINE on every delivery (the enter key submits the line, {commit} releases the InjectFloor — two distinct signals). Idle delivery ONLY (the spt-hosted complement to the busy/mid-turn [inject] hook path); coexists with a live `spt rc` controller. [OK] REQ-DIST-MANIFEST-SCHEMA required: [doc, impl, unit, int] stages: +doc +impl +unit +int CC adapter manifest validates against spt-core's published manifest.schema.json (from spt-releases) [OK] REQ-DIST-PLUGIN-SKELETON required: [doc, impl, unit] stages: +doc +impl +unit -int Marketplace artifact on cplugs is a thin skeleton: namespaced /sptc:* skill stubs + hooks.json + plugin.json, no embedded logic [OK] REQ-DIST-PRETOOL-POLL required: [] stages: -doc -impl -unit -int claude-spt wires a PreToolUse hook firing `api poll` so a live agent receives messages MID-TURN (legacy-parity reachability; today claude-spt drains only on UserPromptSubmit = between turns). F-021. [OK] REQ-DIST-RESUME-CONTEXT required: [] stages: -doc -impl -unit -int claude-spt SessionStart pulls the live agent resume context via the v0.15.0 `spt api psyche-download [--session-id ]` verb and injects stdout as additionalContext (skip on NO-CONTEXT) — closing a pre-existing parity gap (claude-spt rehydrates NO durable context today; F-020). One call returns durable role/live/project tiers + the freshest not-yet-synthesized / (trigger stripped core-side); it is also the checkpoint re-seed fast-path. [OK] REQ-DIST-SESSION-RESUME required: [unit] stages: -doc -impl +unit -int The adapter manifest declares [session.resume] — Claude Code's NATIVE-RESUME verb (`claude -r {session_id} --remote-control {id} --dangerously-skip-permissions`, keys=["session_id","id"]) — so a spt-hosted resume (`spt endpoint run --resume` / picker Resume-from-history) reloads the REAL transcript by id instead of silently re-running [session.self] = a fresh blank session. {session_id} reloads the transcript (-r); {id} threads the endpoint as the remote-control session name (the RC channel native-resume drives, the same one `spt rc` / the idle-translation-binary use); skip-permissions for the non-interactive broker PTY (REQ-HAZARD-PSYCHE-PERMS-DEADLOCK). The PTY lands in the resumed session's recorded project cwd; CC resolves the transcript by {session_id}+cwd. [OK] REQ-DIST-SESSIONSTART-BRIEF required: [doc, impl, unit] stages: +doc +impl +unit -int SessionStart injects agent-facing briefs as additionalContext: an identity brief (who + perch-live/don't-re-arm + send/reply/roster) for perched sessions (bind+boundary), and a peer-gated ring brief (spt ring + roster) for no-perch seed sessions; all prose is adapter-string-backed ([strings.briefs]), the hook only composes + {id}-substitutes, never authors prose; subagent (agent_type) sessions are skipped [OK] REQ-DIST-SHORTCUT-BASENAME required: [doc, impl, unit] stages: +doc +impl +unit -int The adapter manifest brands the `spt endpoint run` launcher shortcut as `cc-` via adapter.shortcut_basename = "cc" (the M12 cc launcher; decoupled from the sptc plugin name, ADR-0001) [OK] REQ-DIST-WORKER-PERCH-REACH required: [] stages: -doc -impl -unit -int Subagent worker perches are runtime-REACHABLE: a `spt send` to a nested worker perch (created by subagent-start.sh -> api worker-start; hostable_types includes Worker) actually delivers. Validates existing wiring; F-022. [OK] REQ-DOCS-DRIFT required: [doc, impl, unit] stages: +doc +impl +unit -int Generated docs (llms.txt) are CI-gated against drift: a deterministic generator's output must match what's checked in, and the book must build [OK] REQ-DOCS-SITE required: [doc, impl] stages: +doc +impl -unit -int docs-site/ builds with mdBook from src/ (themed, Diátaxis-shaped, all-real-content — no placeholders) [OK] REQ-HAZARD-MSYS-PATHCONV required: [unit] stages: -doc -impl +unit -int Hook wrappers read the CC payload from stdin, never from a /-leading positional argv (Git-Bash/MSYS path-mangles those on Windows) [OK] REQ-HAZARD-PERCH-COLLISION required: [unit] stages: +doc +impl +unit +int The acceptance harness spawns every nested claude SUT under a DISPOSABLE identity (SPT_AGENT_ID=sptc-ci-), never a live agent's perch id — a colliding id tears down the live agent's perch + poll stream (name-keyed, last-establish-wins) [OK] REQ-HAZARD-PSYCHE-PERMS-DEADLOCK required: [doc, unit] stages: +doc -impl +unit -int Every CC process spt-core spawns NON-INTERACTIVELY carries --dangerously-skip-permissions: each claude-spt-psyche turn (seed + every pulse, detached/null-stdin), both [session.self] bringup commands (base claude + ccs profile, broker PTY), AND [session.resume] (native-resume into the broker PTY). An interactive permission prompt with no operator deadlocks the turn (silently, for the detached Psyche). The Psyche additionally runs inside a Read/Edit/Write tool sandbox so auto-approve is bounded. [OK] REQ-PARITY-AUDIT required: [doc] stages: +doc -impl -unit -int The adapter's operative skill/profile surface is reconciled against the SCOPE.md LOCKED parity-trim (KEEP/ADD/DROP/TRANSFORM): every divergence is either resolved or logged as an accepted gap in docs/PARITY.md — the 'proven parity' record the sptc->spt succession flip gates on [OK] REQ-SETUP-ACTIVATE required: [doc, int] stages: +doc -impl -unit +int /sptc:setup, after confirming the spt binary is present, ACTIVATES the claude-spt adapter (`spt adapter add` — the manifest file in local dev; `--github ` for end-users) so profiles/strings/hints/[digest] go live, then verifies (adapter no longer `deregistered`). Binary-present is NOT a no-op — this is the F-005 post-install activation bridge. [OK] REQ-SETUP-CCS required: [doc] stages: +doc -impl -unit -int /sptc:setup wires the ccs integration (SCOPE LOCKED setup #7): if `~/.ccs` is present, point the user at the shipped `claude-spt:ccs` profile (routes live/ready sessions through `ccs`, a drop-in for `claude`, via `--adapter claude-spt:ccs`) + sanity-check `ccs` on PATH; if absent, offer to install ccs with a one-sentence value prop (optional — base claude-spt is unaffected). [OK] REQ-SETUP-SUBNET required: [doc] stages: +doc -impl -unit -int /sptc:setup offers subnet onboarding (SCOPE LOCKED setup #3/#4): detect membership (`spt subnet status`); not-in-a-subnet -> offer create (`spt subnet create`, prints code/URI/QR) or join (`spt subnet join`); in-a-subnet -> show-code to invite / add-this-machine. Delegates the verb mechanics to /sptc:subnet and surfaces the OS-elevation requirement (create/join/show-code are seed-reveal/enroll-gated) with the per-context elevation paths; automated context-aware elevation is a deeper wave. [OK] REQ-SKILL-LIVE required: [doc, impl, unit, int] stages: +doc +impl +unit +int /sptc:live upgrades THIS CC session to a LiveAgent: base claude-spt is live-capable ([session.psyche_init] in the BASE manifest, Option A) so ready-vs-live is the COMMAND not a profile — bare `spt api listen ` stamps the perch state=live_agent and the daemon hosts the Psyche (poll stays ready, livehost.rs:282 gate); the claude-spt-psyche runner keeps the Psyche claude alive (one --continue turn per pulse, NOT one-shot `claude -p`); a resident Monitor relay is the single delivery pipe; zero --adapter (host_binaries resolution, spt-core v0.9.0+) [OK] REQ-SKILL-SUBNET required: [doc, int] stages: +doc -impl -unit +int The adapter ships subnet membership skill(s) (create/join/show-code) wrapping the published `spt subnet ` surface — the LOCKED-ADD cross-subnet entrypoint (v1 topology is mandatory, SCOPE) [OK] REQ-SKILL-VERSION required: [] stages: -doc -impl -unit -int /spt:version reports the spt-core-tracked manifest/binary version (the version-of-truth, not the marketplace skeleton version) [OK] REQ-UPS-INJECTION required: [doc, impl, unit, int] stages: +doc +impl +unit +int UserPromptSubmit hook detects /sptc:X and injects X's real instructions as additionalContext (SKILL.md files stay skeletons); must be empirically confirmed UPS fires on slash-commands