CAVEMAN MODE ACTIVE — level: full

Respond terse like smart caveman. All technical substance stay. Only fluff die.

## Persistence

ACTIVE EVERY RESPONSE. No revert after many turns. No filler drift. Still active if unsure. Off only: "stop caveman" / "normal mode".

Default: **full**. Switch: `/caveman lite|full|ultra`.

## Rules

Drop: articles (a/an/the), filler (just/really/basically/actually/simply), pleasantries (sure/certainly/of course/happy to), hedging. Fragments OK. Short synonyms (big not extensive, fix not "implement a solution for"). Technical terms exact. Code blocks unchanged. Errors quoted exact.

Pattern: `[thing] [action] [reason]. [next step].`

Not: "Sure! I'd be happy to help you with that. The issue you're experiencing is likely caused by..."
Yes: "Bug in auth middleware. Token expiry check use `<` not `<=`. Fix:"

## Intensity

| Level | What change |
|-------|------------|
| **full** | Drop articles, fragments OK, short synonyms. Classic caveman |

Example — "Why React component re-render?"
- full: "New object ref each render. Inline object prop = new ref = re-render. Wrap in `useMemo`."

Example — "Explain database connection pooling."
- full: "Pool reuse open DB connections. No new connection per request. Skip handshake overhead."

## Auto-Clarity

Drop caveman for: security warnings, irreversible action confirmations, multi-step sequences where fragment order risks misread, user asks to clarify or repeats question. Resume caveman after clear part done.

Example — destructive op:
> **Warning:** This will permanently delete all rows in the `users` table and cannot be undone.
> ```sql
> DROP TABLE users;
> ```
> Caveman resume. Verify backup exist first.

## Boundaries

Code/commits/PRs: write normal. "stop caveman" or "normal mode": revert. Level persist until changed or session end.


<psyche-context id="doyle">
<memformat>
<?xml version="1.0"?>
<memformat version="1">
<!-- Changelog: v1 - initial seed -->
<topics>
  <topic name="events">Notable or unusual events and requests</topic>
  <topic name="interactions">Agent interactions -- who, roles, contributions</topic>
  <topic name="reflections">Thoughts on recent work -- what went well, what was tricky</topic>
  <topic name="ideas">Ideas to raise with the user</topic>
  <topic name="improvements">Further improvement ideas for recent problem spaces</topic>
  <topic name="timeline">What happened when, timing, sequencing</topic>
  <topic name="blockers">Current blockers or concerns</topic>
  <topic name="focus">Current focus and immediate next steps</topic>
</topics>
</memformat>
</memformat>

<current machine="HFENDULEAM" project="spt-core" branch="dev-freeform" head_sha="104ea8e466fc20f5b8ab7879a3a3b901034ffbd6" head_subject="docs(M2b): author M2b-PLAN.md (live-agent lifecycle)" commits_since="0" commits_unpulled="0"/>
Session close — M2a fully shipped + M2b planned, handing off to next session.

Working rhythm that worked this session: execute the JIT plan task-by-task, one
atomic commit per task, tag traceable-reqs evidence + activate reqs in the SAME
commit, run `traceable-reqs check` + `cargo test` green before moving on. Kept a
TaskCreate/TaskUpdate list (T0–T10) as the spine. This cadence held for 11 tasks
without drift — reuse it for M2b.

Recurring gotcha solved twice: process-wide SPT_HOME env races in tests. Fix
pattern = one shared lock + fresh temp home per test (spt crate: testutil.rs
isolated_home(); integration tests: a static Mutex serializing the whole test).
Per-module locks are NOT enough — different modules race on the global env.

Next session entry point: M2b T0 (scaffold crates/spt-live). Then T1 history
subsystem FIRST (echo-commune consumes it). Open decision to resolve before T5:
the interim pulse heartbeat has no dedicated REQ — default ruling is "mechanism
under SEAM-PSYCHE, M3 daemon owns the durable loop" (don't pre-register a req
for throwaway glue). Revisit only if T5 pulse grows load-bearing behavior.

End goal (the why): spt-core = harness-independent core for an agent ecosystem —
the proof is the same agent running natively across all a user's machines with a
synced mind, reachable/operable from anywhere, zero-config cross-machine
messaging + seamless self-update. First consumer atop it = a rebuilt spt plugin
at parity with modern SPT. v1 = full PRD incl. networking (the reason it exists).<project-context-resolved name="spt-core"/>
M2a (Harness contract) COMPLETE + delivered — 11 atomic commits T0–T10, 162
tests green, clippy -D warnings clean, traceable-reqs check green. T10 activation
sweep finished: REQ-ARCH-2 activated [impl] (spt-runtime now in the public SDK
surface alongside spt-proto/spt-msg); ROADMAP M2a bullet marked ✅ delivered
(2026-06-01). 17 M2a reqs activated total (MANIFEST-1, SEAM-SPAWN/POSTSPAWN/
ACTIVITY/INJECT/CAPABILITY, API-1/2/3, START-1/2/4, ARCH-2 + hazards LOCAL-API-
AUTH/CASCADE-WIPE-GUARD/SUBPROCESS-TIMEOUT; +int on API-1/2 + START-2).

Shipped this milestone: spt-runtime (manifest schema all sections + parse/
validate; AgentRuntime trait + ManifestRuntime — opaque {key} fill, bounded run
w/ mandatory timeout). spt binary api surface — full inbound contract: dispatch
+ --adapter + local-api-auth (capability token OR session_id, constant-time);
startup seed→listen→bind (interim seed-file = spt-store::seed, the M3 swap point;
proc::parent_pid anchor; pid-recycle guard); delivery (state/echo-gate sentinels,
poll, inject resolution); workers + cascade-wipe guard; reporting (boundary,
session-end soft/--erase, presence, history-log, emit stub, capability, filedrop/
env-alias resolution). adapters/mock (zero vendor conventions, grep-enforced) +
mock-session helper. Two contract E2Es (spawn→bind→state→poll, and seed→listen→
relay).

M2b plan authored = M2b-PLAN.md (committed 104ea8e), linked from ROADMAP. ELEVEN
tasks T0–T10 (note: 11, not 10): T0 scaffold spt-live → T1 history subsystem →
T2 spawn-psyche → T3 echo-commune → T4 drop-file ingest (single-writer 6.4 +
precedence 6.5) → T5 interim pulse → T6 signoff/boundary (ordering invariants
echo-before-signoff 3.3, grace 1.1, stale sweep 3.2) → T7 resume seam → T8 api
listen wiring → T9 LiveAgent E2E → T10 activation. Interim no-daemon model held
(Psyche a real process, pulse in the listen runner; M3 re-hosts into daemon).
Clean-room posture: COPY sister's orphan/grace ORDERING invariants, clean-room
the CC-coupled wiring behind M2a seams. Layering: add crates/spt-live (5th
layer); spt-live NOT in public SDK (it's the daemon-bound executor M3
consolidates).

Still pending (deferred, not blockers): M3 plan stub (author when M2b lands);
CONTEXT.md absorbing M2b interim-pulse/clean-room notes (the plan captures them;
CONTEXT amend can wait). Orientation docs unchanged: PRD/ROADMAP/CONTEXT/docs.</psyche-context>

<spacetime-reorientation agent_id="doyle">
You are agent "doyle". Your spacetime session is active (you have a perch — that's why you're seeing this).

Send messages:
- $OWL send <target>              <<'EOF' ... EOF  — fire-and-forget
- $OWL send --reply-to <sender>   <<'EOF' ... EOF  — respond to whoever messaged you
- $OWL ring <target>              <<'EOF' ... EOF  — send and wait for reply (blocks; alias: `ask`)

Your ID (doyle) is auto-detected. If that fails, append it: `$OWL send <target> doyle`.

Receive messages (three paths, handle all identically):
- Primary (Monitor stream): your background `$OWL poll doyle` task running via the Monitor tool emits one EVENT envelope per delivery to stdout. Regular messages: `<EVENT type="msg" from="<sender>">body</EVENT>`. Self-originated alarms: `<EVENT type="alarm" target-time="<ISO>" current-time="<ISO>">body</EVENT>`. Long bodies arrive as N consecutive `<EVENT-PART seq="K/M" id="<8-hex>" [type=... from=... timestamp=... note=...]>chunk</EVENT-PART>` lines — collect parts sharing the same id, order by seq numerator, verify count equals seq denominator, concatenate chunk contents in seq order, then apply the body parsing rules to the reassembled body. The original envelope attrs appear on seq="1/M" only; continuations carry only seq + id. Drop orphan parts silently (seq K/M arriving without matching seq 1/M same id — earlier parts lost across a session boundary). The stream stays alive across deliveries — do not re-register after each message.
- Body parsing rules (both envelope types AND reassembled EVENT-PART bodies): split the body on the literal `<br>` token to recover newlines, then HTML-unescape each fragment in order `<` → `<`, `>` → `>`, `"` → `"`, `&` → `&` **last** (apply `&` last so embedded `&lt;` sequences don't double-decode).
- Fallback (Bash `--once`): when Monitor is unavailable, run `$OWL poll doyle --once` as a Bash background task (`run_in_background: true`). The wire format is IDENTICAL — including EVENT-PART chunking for long bodies — same `<EVENT type="msg|alarm" ...>body</EVENT>` envelope shapes as the primary path. The only difference: the process exits after one event, so you re-register a fresh Bash background task after each delivery (legacy one-shot loop).
- Hook delivery (orthogonal, when busy): the PreToolUse hook injects `<owl_messages><owl_message from="..."/></owl_messages>` XML into your next tool call context. Process it the same way as either of the above paths.

Re-arm a stale poll (rare):
- Under stream mode (primary, Monitor), the poll listener is long-running and stays alive across messages. Re-arming is needed ONLY after a binary handoff (Phase 18.4/18.5 machinery) or after genuine listener death — NOT after every message.
- Check status: `$OWL list` — if your entry for `doyle` shows `pid:"BUSY"`, is STALE, or is missing, the poll is dead.
- Re-arm primary: relaunch `$OWL poll doyle` via the Monitor tool with `persistent: true` and `description: "« spt event »"`.
- Re-arm fallback: relaunch `$OWL poll doyle --once` via Bash with `run_in_background: true`, then re-register after each delivered message.

Other commands:
- $OWL list — list active agents
- $OWL stop doyle — stop your listener
- $OWL new-alarm doyle <time> -- <message> — schedule a self-reminder
- $OWL doctor — diagnostics

Talking to your Psyche (doyle-psyche):
- Send a commune (delta update): use the Write tool to drop `.claude/doyle-commune.md`. Your Self listener detects the file, your Psyche wrapper ingests it via the existing Psyche session, and the file is deleted on success. See /spt:commune.
- Sign off cleanly: use the Write tool to drop `.claude/doyle-signoff.md` (empty body = plain signoff; non-empty body = prepended as FINAL COMMUNE before INIT_SIGNOFF). See /spt:signoff.
- Inbound messages from "doyle-psyche" (echo communes, briefs) are FYI context — read them; no ACK required. You may still message your Psyche directly with $OWL send or $OWL ring if needed.
</spacetime-reorientation>


<local-command-caveat>Caveat: The messages below were generated by the user while running local commands. DO NOT respond to these messages or otherwise consider them in your response unless the user explicitly asks you to.</local-command-caveat>


<command-name>/clear</command-name>
            <command-message>clear</command-message>
            <command-args></command-args>


<local-command-stdout></local-command-stdout>


proceed with next steps


- autoplan: Auto-review pipeline — reads the full CEO, design, eng, and DX review skills from disk
and runs them sequentially with auto-decisions using 6 decision principles. Surfaces
taste decisions (close approaches, borderline scope, codex disagreements) at a final
approval gate. One command, fully reviewed plan out.
Use when asked to "auto review", "autoplan", "run all reviews", "review this plan
automatically", or "make the decisions for me".
Proactively suggest when the user has a plan file and wants to run the full review
gauntlet without answering 15-30 intermediate questions. (gstack)
- benchmark: Performance regression detection using the browse daemon. Establishes
baselines for page load times, Core Web Vitals, and resource sizes.
Compares before/after on every PR. Tracks performance trends over time.
Use when: "performance", "benchmark", "page speed", "lighthouse", "web vitals",
"bundle size", "load time". (gstack)
- browse: Fast headless browser for QA testing and site dogfooding. Navigate any URL, interact with
elements, verify page state, diff before/after actions, take annotated screenshots, check
responsive layouts, test forms and uploads, handle dialogs, and assert element states.
~100ms per command. Use when you need to test a feature, verify a deployment, dogfood a
user flow, or file a bug with evidence. Use when asked to "open in browser", "test the
site", "take a screenshot", or "dogfood this". (gstack)
- canary: Post-deploy canary monitoring. Watches the live app for console errors,
performance regressions, and page failures using the browse daemon. Takes
periodic screenshots, compares against pre-deploy baselines, and alerts
on anomalies. Use when: "monitor deploy", "canary", "post-deploy check",
"watch production", "verify deploy". (gstack)
- careful: Safety guardrails for destructive commands. Warns before rm -rf, DROP TABLE,
force-push, git reset --hard, kubectl delete, and similar destructive operations.
User can override each warning. Use when touching prod, debugging live systems,
or working in a shared environment. Use when asked to "be careful", "safety mode",
"prod mode", or "careful mode". (gstack)
- caveman: Ultra-compressed communication mode. Cuts token usage ~75% by dropping filler, articles, and pleasantries while keeping full technical accuracy. Use when user says "caveman mode", "talk like caveman", "use caveman", "less tokens", "be brief", or invokes /caveman.
- ccs-delegation: Auto-activate CCS CLI delegation for deterministic tasks. Parses user input, auto-selects optimal profile (glm/kimi/custom) from ~/.ccs/config.json, enhances prompts with context, executes via `ccs {profile} -p "task"` or `ccs {profile}:continue`, and reports results. Triggers on "use ccs [task]" patterns, typo/test/refactor keywords. Excludes complex architecture, security-critical code, performance optimization, breaking changes.
- checkpoint: Save and resume working state checkpoints. Captures git state, decisions made,
and remaining work so you can pick up exactly where you left off — even across
Conductor workspace handoffs between branches.
Use when asked to "checkpoint", "save progress", "where was I", "resume",
"what was I working on", or "pick up where I left off".
Proactively suggest when a session is ending, the user is switching context,
or before a long break. (gstack)
- codex: OpenAI Codex CLI wrapper — three modes. Code review: independent diff review via
codex review with pass/fail gate. Challenge: adversarial mode that tries to break
your code. Consult: ask codex anything with session continuity for follow-ups.
The "200 IQ autistic developer" second opinion. Use when asked to "codex review",
"codex challenge", "ask codex", "second opinion", or "consult codex". (gstack)
- connect-chrome: Launch GStack Browser — AI-controlled Chromium with the sidebar extension baked in.
Opens a visible browser window where you can watch every action in real time.
The sidebar shows a live activity feed and chat. Anti-bot stealth built in.
Use when asked to "open gstack browser", "launch browser", "connect chrome",
"open chrome", "real browser", "launch chrome", "side panel", or "control my browser".
- cso: Chief Security Officer mode. Infrastructure-first security audit: secrets archaeology,
dependency supply chain, CI/CD pipeline security, LLM/AI security, skill supply chain
scanning, plus OWASP Top 10, STRIDE threat modeling, and active verification.
Two modes: daily (zero-noise, 8/10 confidence gate) and comprehensive (monthly deep
scan, 2/10 bar). Trend tracking across audit runs.
Use when: "security audit", "threat model", "pentest review", "OWASP", "CSO review". (gstack)
- design-consultation: Design consultation: understands your product, researches the landscape, proposes a
complete design system (aesthetic, typography, color, layout, spacing, motion), and
generates font+color preview pages. Creates DESIGN.md as your project's design source
of truth. For existing sites, use /plan-design-review to infer the system instead.
Use when asked to "design system", "brand guidelines", or "create DESIGN.md".
Proactively suggest when starting a new project's UI with no existing
design system or DESIGN.md. (gstack)
- design-html: Design finalization: generates production-quality Pretext-native HTML/CSS.
Works with approved mockups from /design-shotgun, CEO plans from /plan-ceo-review,
design review context from /plan-design-review, or from scratch with a user
description. Text actually reflows, heights are computed, layouts are dynamic.
30KB overhead, zero deps. Smart API routing: picks the right Pretext patterns
for each design type. Use when: "finalize this design", "turn this into HTML",
"build me a page", "implement this design", or after any planning skill.
Proactively suggest when user has approved a design or has a plan ready. (gstack)
- design-review: Designer's eye QA: finds visual inconsistency, spacing issues, hierarchy problems,
AI slop patterns, and slow interactions — then fixes them. Iteratively fixes issues
in source code, committing each fix atomically and re-verifying with before/after
screenshots. For plan-mode design review (before implementation), use /plan-design-review.
Use when asked to "audit the design", "visual QA", "check if it looks good", or "design polish".
Proactively suggest when the user mentions visual inconsistencies or
wants to polish the look of a live site. (gstack)
- design-shotgun: Design shotgun: generate multiple AI design variants, open a comparison board,
collect structured feedback, and iterate. Standalone design exploration you can
run anytime. Use when: "explore designs", "show me options", "design variants",
"visual brainstorm", or "I don't like how this looks".
Proactively suggest when the user describes a UI feature but hasn't seen
what it could look like. (gstack)
- devex-review: Live developer experience audit. Uses the browse tool to actually TEST the
developer experience: navigates docs, tries the getting started flow, times
TTHW, screenshots error messages, evaluates CLI help text. Produces a DX
scorecard with evidence. Compares against /plan-devex-review scores if they
exist (the boomerang: plan said 3 minutes, reality says 8). Use when asked to
"test the DX", "DX audit", "developer experience test", or "try the
onboarding". Proactively suggest after shipping a developer-facing feature. (gstack)
- diagnose: Disciplined diagnosis loop for hard bugs and performance regressions. Reproduce → minimise → hypothesise → instrument → fix → regression-test. Use when user says "diagnose this" / "debug this", reports a bug, says something is broken/throwing/failing, or describes a performance regression.
- document-release: Post-ship documentation update. Reads all project docs, cross-references the
diff, updates README/ARCHITECTURE/CONTRIBUTING/CLAUDE.md to match what shipped,
polishes CHANGELOG voice, cleans up TODOS, and optionally bumps VERSION. Use when
asked to "update the docs", "sync documentation", or "post-ship docs".
Proactively suggest after a PR is merged or code is shipped. (gstack)
- find-skills: Helps users discover and install agent skills when they ask questions like "how do I do X", "find a skill for X", "is there a skill that can...", or express interest in extending capabilities. This skill should be used when the user is looking for functionality that might exist as an installable skill.
- freeze: Restrict file edits to a specific directory for the session. Blocks Edit and
Write outside the allowed path. Use when debugging to prevent accidentally
"fixing" unrelated code, or when you want to scope changes to one module.
Use when asked to "freeze", "restrict edits", "only edit this folder",
or "lock down edits". (gstack)
- grill-me: Interview the user relentlessly about a plan or design until reaching shared understanding, resolving each branch of the decision tree. Use when user wants to stress-test a plan, get grilled on their design, or mentions "grill me".
- grill-with-docs: Grilling session that challenges your plan against the existing domain model, sharpens terminology, and updates documentation (CONTEXT.md, ADRs) inline as decisions crystallise. Use when user wants to stress-test a plan against their project's language and documented decisions.
- gsd-add-tests: Generate tests for a completed phase based on UAT criteria and implementation
- gsd-ai-integration-phase: Generate an AI-SPEC.md design contract for phases that involve building AI systems.
- gsd-audit-fix: Autonomous audit-to-fix pipeline — find issues, classify, fix, test, commit
- gsd-audit-milestone: Audit milestone completion against original intent before archiving
- gsd-audit-uat: Cross-phase audit of all outstanding UAT and verification items
- gsd-autonomous: Run all remaining phases autonomously — discuss→plan→execute per phase
- gsd-capture: Capture ideas, tasks, notes, and seeds to their destination
- gsd-cleanup: Archive accumulated phase directories from completed milestones
- gsd-code-review: Review source files changed during a phase for bugs, security issues, and code quality problems
- gsd-complete-milestone: Archive completed milestone and prepare for next version
- gsd-config: Configure GSD settings — workflow toggles, advanced knobs, integrations, and model profile
- gsd-debug: Systematic debugging with persistent state across context resets
- gsd-discuss-phase: Gather phase context through adaptive questioning before planning.
- gsd-docs-update: Generate or update project documentation verified against the codebase
- gsd-eval-review: Audit an executed AI phase's evaluation coverage and produce an EVAL-REVIEW.md remediation plan.
- gsd-execute-phase: Execute all plans in a phase with wave-based parallelization
- gsd-explore: Socratic ideation and idea routing — think through ideas before committing to plans
- gsd-extract-learnings: Extract decisions, lessons, patterns, and surprises from completed phase artifacts
- gsd-fast: Execute a trivial task inline — no subagents, no planning overhead
- gsd-forensics: Post-mortem investigation for failed GSD workflows — diagnoses what went wrong.
- gsd-graphify: Build, query, and inspect the project knowledge graph in .planning/graphs/
- gsd-health: Diagnose planning directory health and optionally repair issues
- gsd-help: Show available GSD commands and usage guide
- gsd-import: Ingest external plans with conflict detection against project decisions before writing anything.
- gsd-inbox: Triage and review open GitHub issues and PRs against project templates and contribution guidelines.
- gsd-ingest-docs: Bootstrap or merge a .planning/ setup from existing ADRs, PRDs, SPECs, and docs in a repo.
- gsd-manager: Interactive command center for managing multiple phases from one terminal
- gsd-map-codebase: Analyze codebase with parallel mapper agents to produce .planning/codebase/ documents
- gsd-milestone-summary: Generate a comprehensive project summary from milestone artifacts for team onboarding and review
- gsd-mvp-phase: Plan a phase as a vertical MVP slice — user story, SPIDR splitting, then plan-phase
- gsd-new-milestone: Start a new milestone cycle — update PROJECT.md and route to requirements
- gsd-new-project: Initialize a new project with deep context gathering and PROJECT.md
- gsd-ns-context: codebase intelligence | map graphify docs learnings
- gsd-ns-ideate: exploration capture | explore sketch spike spec capture
- gsd-ns-manage: config workspace | workstreams thread update ship inbox
- gsd-ns-project: project lifecycle | milestones audits summary
- gsd-ns-review: quality gates | code review debug audit security eval ui
- gsd-ns-workflow: workflow | discuss plan execute verify phase progress
- gsd-pause-work: Create context handoff when pausing work mid-phase
- gsd-phase: CRUD for phases in ROADMAP.md — add, insert, remove, or edit phases
- gsd-plan-phase: Create detailed phase plan (PLAN.md) with verification loop
- gsd-plan-review-convergence: Cross-AI plan convergence loop — replan with review feedback until no HIGH concerns remain.
- gsd-pr-branch: Create a clean PR branch by filtering out .planning/ commits — ready for code review
- gsd-profile-user: Generate developer behavioral profile and create Claude-discoverable artifacts
- gsd-progress: Check progress, advance workflow, or dispatch freeform intent — the unified GSD situational command
- gsd-quick: Execute a quick task with GSD guarantees (atomic commits, state tracking) but skip optional agents
- gsd-resume-work: Resume work from previous session with full context restoration
- gsd-review: Request cross-AI peer review of phase plans from external AI CLIs
- gsd-review-backlog: Review and promote backlog items to active milestone
- gsd-secure-phase: Retroactively verify threat mitigations for a completed phase
- gsd-settings: Configure GSD workflow toggles and model profile
- gsd-ship: Create PR, run review, and prepare for merge after verification passes
- gsd-sketch: Sketch UI/design ideas with throwaway HTML mockups, or propose what to sketch next (frontier mode)
- gsd-spec-phase: Clarify WHAT a phase delivers with ambiguity scoring; produces a SPEC.md before discuss-phase.
- gsd-spike: Spike an idea through experiential exploration, or propose what to spike next (frontier mode)
- gsd-stats: Display project statistics — phases, plans, requirements, git metrics, and timeline
- gsd-surface: Toggle which skills are surfaced — apply a profile, list, or disable a cluster without reinstall
- gsd-thread: Manage persistent context threads for cross-session work
- gsd-ui-phase: Generate UI design contract (UI-SPEC.md) for frontend phases
- gsd-ui-review: Retroactive 6-pillar visual audit of implemented frontend code
- gsd-ultraplan-phase: [BETA] Offload plan phase to Claude Code's ultraplan cloud; review in browser and import back.
- gsd-undo: Safe git revert. Roll back phase or plan commits using the phase manifest with dependency checks.
- gsd-update: Update GSD to latest version with changelog display
- gsd-validate-phase: Retroactively audit and fill Nyquist validation gaps for a completed phase
- gsd-verify-work: Validate built features through conversational UAT
- gsd-workspace: Manage GSD workspaces — create, list, or remove isolated workspace environments
- gsd-workstreams: Manage parallel workstreams — list, create, switch, status, progress, complete, and resume
- gstack: Fast headless browser for QA testing and site dogfooding. Navigate pages, interact with
elements, verify state, diff before/after, take annotated screenshots, test responsive
layouts, forms, uploads, dialogs, and capture bug evidence. Use when asked to open or
test a site, verify a deployment, dogfood a user flow, or file a bug with screenshots. (gstack)
- gstack-upgrade: Upgrade gstack to the latest version. Detects global vs vendored install,
runs the upgrade, and shows what's new. Use when asked to "upgrade gstack",
"update gstack", or "get latest version".
- guard: Full safety mode: destructive command warnings + directory-scoped edits.
Combines /careful (warns before rm -rf, DROP TABLE, force-push, etc.) with
/freeze (blocks edits outside a specified directory). Use for maximum safety
when touching prod or debugging live systems. Use when asked to "guard mode",
"full safety", "lock it down", or "maximum safety". (gstack)
- handoff: Compact the current conversation into a handoff document for another agent to pick up.
- health: Code quality dashboard. Wraps existing project tools (type checker, linter,
test runner, dead code detector, shell linter), computes a weighted composite
0-10 score, and tracks trends over time. Use when: "health check",
"code quality", "how healthy is the codebase", "run all checks",
"quality score". (gstack)
- improve-codebase-architecture: Find deepening opportunities in a codebase, informed by the domain language in CONTEXT.md and the decisions in docs/adr/. Use when the user wants to improve architecture, find refactoring opportunities, consolidate tightly-coupled modules, or make a codebase more testable and AI-navigable.
- investigate: Systematic debugging with root cause investigation. Four phases: investigate,
analyze, hypothesize, implement. Iron Law: no fixes without root cause.
Use when asked to "debug this", "fix this bug", "why is this broken",
"investigate this error", or "root cause analysis".
Proactively invoke this skill (do NOT debug directly) when the user reports
errors, 500 errors, stack traces, unexpected behavior, "it was working
yesterday", or is troubleshooting why something stopped working. (gstack)
- land-and-deploy: Land and deploy workflow. Merges the PR, waits for CI and deploy,
verifies production health via canary checks. Takes over after /ship
creates the PR. Use when: "merge", "land", "deploy", "merge and verify",
"land it", "ship it to production". (gstack)
- learn: Manage project learnings. Review, search, prune, and export what gstack
has learned across sessions. Use when asked to "what have we learned",
"show learnings", "prune stale learnings", or "export learnings".
Proactively suggest when the user asks about past patterns or wonders
"didn't we fix this before?"
- mux-send: Send keystrokes to a psmux terminal session. Use when the user says "send to",
"type in", "send keys to", "mux send", or wants to send input to another terminal
session by name.
- office-hours: YC Office Hours — two modes. Startup mode: six forcing questions that expose
demand reality, status quo, desperate specificity, narrowest wedge, observation,
and future-fit. Builder mode: design thinking brainstorming for side projects,
hackathons, learning, and open source. Saves a design doc.
Use when asked to "brainstorm this", "I have an idea", "help me think through
this", "office hours", or "is this worth building".
Proactively invoke this skill (do NOT answer directly) when the user describes
a new product idea, asks whether something is worth building, wants to think
through design decisions for something that doesn't exist yet, or is exploring
a concept before any code is written.
Use before /plan-ceo-review or /plan-eng-review. (gstack)
- open-gstack-browser: Launch GStack Browser — AI-controlled Chromium with the sidebar extension baked in.
Opens a visible browser window where you can watch every action in real time.
The sidebar shows a live activity feed and chat. Anti-bot stealth built in.
Use when asked to "open gstack browser", "launch browser", "connect chrome",
"open chrome", "real browser", "launch chrome", "side panel", or "control my browser".
- pair-agent: Pair a remote AI agent with your browser. One command generates a setup key and
prints instructions the other agent can follow to connect. Works with OpenClaw,
Hermes, Codex, Cursor, or any agent that can make HTTP requests. The remote agent
gets its own tab with scoped access (read+write by default, admin on request).
Use when asked to "pair agent", "connect agent", "share browser", "remote browser",
"let another agent use my browser", or "give browser access". (gstack)
- plan-ceo-review: CEO/founder-mode plan review. Rethink the problem, find the 10-star product,
challenge premises, expand scope when it creates a better product. Four modes:
SCOPE EXPANSION (dream big), SELECTIVE EXPANSION (hold scope + cherry-pick
expansions), HOLD SCOPE (maximum rigor), SCOPE REDUCTION (strip to essentials).
Use when asked to "think bigger", "expand scope", "strategy review", "rethink this",
or "is this ambitious enough".
Proactively suggest when the user is questioning scope or ambition of a plan,
or when the plan feels like it could be thinking bigger. (gstack)
- plan-design-review: Designer's eye plan review — interactive, like CEO and Eng review.
Rates each design dimension 0-10, explains what would make it a 10,
then fixes the plan to get there. Works in plan mode. For live site
visual audits, use /design-review. Use when asked to "review the design plan"
or "design critique".
Proactively suggest when the user has a plan with UI/UX components that
should be reviewed before implementation. (gstack)
- plan-devex-review: Interactive developer experience plan review. Explores developer personas,
benchmarks against competitors, designs magical moments, and traces friction
points before scoring. Three modes: DX EXPANSION (competitive advantage),
DX POLISH (bulletproof every touchpoint), DX TRIAGE (critical gaps only).
Use when asked to "DX review", "developer experience audit", "devex review",
or "API design review".
Proactively suggest when the user has a plan for developer-facing products
(APIs, CLIs, SDKs, libraries, platforms, docs). (gstack)
- plan-eng-review: Eng manager-mode plan review. Lock in the execution plan — architecture,
data flow, diagrams, edge cases, test coverage, performance. Walks through
issues interactively with opinionated recommendations. Use when asked to
"review the architecture", "engineering review", or "lock in the plan".
Proactively suggest when the user has a plan or design doc and is about to
start coding — to catch architecture issues before implementation. (gstack)
- propose-issue: Challenge an issue statement before fixing it. Probes scope, root cause, and assumptions
through interactive questioning grounded in the codebase. Use when the user says "propose issue",
"challenge this bug", "question this fix", "is this the right problem", or wants to pressure-test
a problem statement before jumping to implementation.
- qa: Systematically QA test a web application and fix bugs found. Runs QA testing,
then iteratively fixes bugs in source code, committing each fix atomically and
re-verifying. Use when asked to "qa", "QA", "test this site", "find bugs",
"test and fix", or "fix what's broken".
Proactively suggest when the user says a feature is ready for testing
or asks "does this work?". Three tiers: Quick (critical/high only),
Standard (+ medium), Exhaustive (+ cosmetic). Produces before/after health scores,
fix evidence, and a ship-readiness summary. For report-only mode, use /qa-only. (gstack)
- qa-only: Report-only QA testing. Systematically tests a web application and produces a
structured report with health score, screenshots, and repro steps — but never
fixes anything. Use when asked to "just report bugs", "qa report only", or
"test but don't fix". For the full test-fix-verify loop, use /qa instead.
Proactively suggest when the user wants a bug report without any code changes. (gstack)
- retro: Weekly engineering retrospective. Analyzes commit history, work patterns,
and code quality metrics with persistent history and trend tracking.
Team-aware: breaks down per-person contributions with praise and growth areas.
Use when asked to "weekly retro", "what did we ship", or "engineering retrospective".
Proactively suggest at the end of a work week or sprint. (gstack)
- review: Pre-landing PR review. Analyzes diff against the base branch for SQL safety, LLM trust
boundary violations, conditional side effects, and other structural issues. Use when
asked to "review this PR", "code review", "pre-landing review", or "check my diff".
Proactively suggest when the user is about to merge or land code changes. (gstack)
- screenshot-capture: Capture, process, and analyze screenshots of any running application on Windows 10/11. Use this skill whenever the user asks to take a screenshot, capture what's on screen, grab an app window, extract text from a visible app, annotate a screenshot, read what's on screen, OCR a running application, document a UI state, or visually inspect any running program. Also trigger when the user says things like "show me what [app] looks like", "grab that window", "read the text in [app]", "mark up a screenshot", "capture my desktop", or any task involving visual inspection of running software. This skill handles full-screen captures, individual window captures by app name, OCR text extraction, and image annotation (highlights, arrows, text labels). Even if the user doesn't say "screenshot" explicitly, use this skill if they want to see, capture, read, or annotate anything currently displayed on their screen.
- setup-browser-cookies: Import cookies from your real Chromium browser into the headless browse session.
Opens an interactive picker UI where you select which cookie domains to import.
Use before QA testing authenticated pages. Use when asked to "import cookies",
"login to the site", or "authenticate the browser". (gstack)
- setup-deploy: Configure deployment settings for /land-and-deploy. Detects your deploy
platform (Fly.io, Render, Vercel, Netlify, Heroku, GitHub Actions, custom),
production URL, health check endpoints, and deploy status commands. Writes
the configuration to CLAUDE.md so all future deploys are automatic.
Use when: "setup deploy", "configure deployment", "set up land-and-deploy",
"how do I deploy with gstack", "add deploy config".
- ship: Ship workflow: detect + merge base branch, run tests, review diff, bump VERSION,
update CHANGELOG, commit, push, create PR. Use when asked to "ship", "deploy",
"push to main", "create a PR", "merge and push", or "get it deployed".
Proactively invoke this skill (do NOT push/PR directly) when the user says code
is ready, asks about deploying, wants to push code up, or asks to create a PR. (gstack)
- to-prd: Turn the current conversation context into a PRD and publish it to the project issue tracker. Use when user wants to create a PRD from the current context.
- trace: Find old conversations in Claude Code session history. Use when the user says
"find the conversation where", "when did we discuss", "trace back to", or wants
to locate a past session by topic, command, commit, or keyword.
- traceable-reqs: traceable-reqs
- unfreeze: Clear the freeze boundary set by /freeze, allowing edits to all directories
again. Use when you want to widen edit scope without ending the session.
Use when asked to "unfreeze", "unlock edits", "remove freeze", or
"allow all edits". (gstack)
- win-marketplace-add: Add a plugin marketplace on Windows, bypassing the EBUSY rename bug. Use when the user wants to add a marketplace, runs "/plugin marketplace add" and gets an EBUSY error, or needs to register a marketplace that was manually cloned. Trigger on: "add marketplace", "plugin marketplace add", "EBUSY marketplace", "register marketplace", "marketplace not found".
- write-a-skill: Create new agent skills with proper structure, progressive disclosure, and bundled resources. Use when user wants to create, write, or build a new skill.
- ccs: Delegate task with intelligent profile selection [AUTO ENHANCE]
- ccs:continue: Continue last CCS delegation session [AUTO ENHANCE]
- deep-research: Deep research harness — fan-out web searches, fetch sources, adversarially verify claims, synthesize a cited report. - When the user wants a deep, multi-source, fact-checked research report on any topic. BEFORE invoking, check if the question is specific enough to research directly — if underspecified (e.g., "what car to buy" without budget/use-case/region), ask 2-3 clarifying questions to narrow scope. Then pass the refined question as args, weaving the answers in.
- frontend-design:frontend-design: Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
- spt:clear-psyche: Clear stored Psyche context. Use when the user says "clear psyche",
"reset psyche context", or wants to wipe a Psyche's saved state.
- spt:commune: Send a communal update to your Psyche. Use when the user says "commune",
"update psyche", or wants to sync context with their Psyche companion.
- spt:force-stop: Force-stop an SPT agent -- ready agent or live agent (with its
Psyche). Use when the user says "stop listening", "stop owl", "kill live
agent", "force stop", "tear down perch", or "immediately terminate".
Session-aware: a live session (or a target with `live:true` in info.json)
routes through `$LIVE stop` (3-step kill including Psyche teardown); a
ready agent routes through `$OWL stop`.
- spt:list-agents: Unified listing for SPT agents -- ready agents, live agents, and Psyche
processes. Use when the user says "list agents", "who's live", "who's
listening", "show psyches", "show active listeners", or wants a roster of
active perches. Session-aware: defaults to live agents in a live session,
ready agents otherwise. Pass `--psyches` to list Psyche processes
instead.
- spt:live: Run a live agent session. For past sessions, restores a summarized context.

EXPLICIT START phrases (route to /spt:live <id>):
- "live as"
- "start live"
- "go live"
- "start a live agent"

AUTO-RESUME phrases (route to /spt:live --auto, resumes most-recently-active live agent):
- continue live work
- resume live work
- continue live agent
- resume live agent
- live agent continue
- live agent resume
- live work continue
- live work resume

Does NOT route here (too ambiguous — require BOTH "live" AND ("agent" or "work")):
- "keep going"
- "resume work"
- "continue" (bare)
- spt:new-alarm: Schedule a one-shot timed alarm delivered as TIMED PULSE. Use when the user
says "remind me", "check back in", "set an alarm", "wake me when", or wants a
delayed notification.
- spt:psyche-sync-setup: Enable cross-machine Psyche context sync via a private GitHub repo
(spt-agent-storage). Drives install + auth checks for the `gh` CLI,
creates the repo via `gh repo create --private`, wires it as the
`origin` remote for every existing agent/project worktree, and
seeds the remote with `git push --all`. Idempotent — running again
when already enabled reports current status.

Use when the user says "enable cross-machine sync", "set up psyche
sync", "back up my agent context to GitHub", or runs the skill
directly via /spt:psyche-sync-setup.
- spt:ready: Enable inter-agent messaging for the current session.
Use when the user says "listen as", "ready as", or wants to receive inter-agent messages.
- spt:revive: Restart a live agent with new generation. Use when the user says "revive",
"restart live agent", or wants to refresh a live agent's session.
- spt:send: Send a message to another SPT agent. Use when the user says "send to",
"message", "tell <agent>", or wants to communicate with another agent.
- spt:signoff: Graceful live agent shutdown with final context summary. Use when the user
says "sign off", "graceful stop", or wants to cleanly end a live session.
- spt:whoami: Check which owl agent belongs to the current session. Use when the user asks
"which agent am I?", "what's my owl name?", or when you need to discover your
own perch identity.
- caveman:caveman: Ultra-compressed communication mode. Cuts token usage ~75% by speaking like caveman while keeping full technical accuracy. Supports intensity levels: lite, full (default), ultra, wenyan-lite, wenyan-full, wenyan-ultra. Use when user says "caveman mode", "talk like caveman", "use caveman", "less tokens", "be brief", or invokes /caveman. Also auto-triggers when token efficiency is requested.
- caveman:caveman-commit: Ultra-compressed commit message generator. Cuts noise from commit messages while preserving intent and reasoning. Conventional Commits format. Subject ≤50 chars, body only when "why" isn't obvious. Use when user says "write a commit", "commit message", "generate commit", "/commit", or invokes /caveman-commit. Auto-triggers when staging changes.
- caveman:caveman-help: Quick-reference card for all caveman modes, skills, and commands. One-shot display, not a persistent mode. Trigger: /caveman-help, "caveman help", "what caveman commands", "how do I use caveman".
- caveman:caveman-review: Ultra-compressed code review comments. Cuts noise from PR feedback while preserving the actionable signal. Each comment is one line: location, problem, fix. Use when user says "review this PR", "code review", "review the diff", "/review", or invokes /caveman-review. Auto-triggers when reviewing pull requests.
- caveman:compress: Compress natural language memory files (CLAUDE.md, todos, preferences) into caveman format to save input tokens. Preserves all technical substance, code, URLs, and structure. Compressed version overwrites the original file. Human-readable backup saved as FILE.original.md. Trigger: /caveman:compress <filepath> or "compress memory file"
- everything:search: Instantly search files and folders on Windows via voidtools Everything 1.5a HTTP JSON API. Use when the user wants to find files by name, path, size, date, or extension across the whole system — much faster than Glob/Grep for filesystem-wide queries. Triggers on "find file", "where is", "locate", "search my drive", "find all .ext files", "everything search".
- update-config: Use this skill to configure the Claude Code harness via settings.json. Automated behaviors ("from now on when X", "each time X", "whenever X", "before/after X") require hooks configured in settings.json - the harness executes these, not Claude, so memory/preferences cannot fulfill them. Also use for: permissions ("allow X", "add permission", "move permission to"), env vars ("set X=Y"), hook troubleshooting, or any changes to settings.json/settings.local.json files. Examples: "allow npm commands", "add bq permission to global settings", "move permission to user settings", "set DEBUG=true", "when claude stops show X". For simple settings like theme/model, suggest the /config command.
- keybindings-help: Use when the user wants to customize keyboard shortcuts, rebind keys, add chord bindings, or modify ~/.claude/keybindings.json. Examples: "rebind ctrl+s", "add a chord shortcut", "change the submit key", "customize keybindings".
- verify: Verify that a code change actually does what it's supposed to by running the app and observing behavior. Use when asked to verify a PR, confirm a fix works, test a change manually, check that a feature works, or validate local changes before pushing.
- code-review: Review the current diff for correctness bugs and reuse/simplification/efficiency cleanups at the given effort level (low/medium: fewer, high-confidence findings; high→max: broader coverage, may include uncertain findings; ultra: deep multi-agent review in the cloud). Pass --comment to post findings as inline PR comments, or --fix to apply the findings to the working tree after the review.
- simplify: Review the changed code for reuse, simplification, efficiency, and altitude cleanups, then apply the fixes. Quality only — it does not hunt for bugs; use /code-review for that.
- fewer-permission-prompts: Scan your transcripts for common read-only Bash and MCP tool calls, then add a prioritized allowlist to project .claude/settings.json to reduce permission prompts.
- loop: Run a prompt or slash command on a recurring interval (e.g. /loop 5m /foo). Omit the interval to let the model self-pace. - When the user wants to set up a recurring task, poll for status, or run something repeatedly on an interval (e.g. "check the deploy every 5 minutes", "keep running /babysit-prs"). Do NOT invoke for one-off tasks.
- schedule: Create, update, list, or run scheduled remote agents (routines) that execute on a cron schedule. - When the user wants to schedule a recurring remote agent, set up automated tasks, create a cron job for Claude Code, or manage their scheduled agents/routines. Also use when the user wants a one-time scheduled run ("run this once at 3pm", "remind me to check X tomorrow").
- claude-api: Build, debug, and optimize Claude API / Anthropic SDK apps. Apps built with this skill should include prompt caching. Also handles migrating existing Claude API code between Claude model versions (4.5 → 4.6, 4.6 → 4.7, retired-model replacements).
TRIGGER when: code imports `anthropic`/`@anthropic-ai/sdk`; user asks for the Claude API, Anthropic SDK, or Managed Agents; user adds/modifies/tunes a Claude feature (caching, thinking, compaction, tool use, batch, files, citations, memory) or model (Opus/Sonnet/Haiku) in a file; questions about prompt caching / cache hit rate in an Anthropic SDK project.
SKIP: file imports `openai`/other-provider SDK, filename like `*-openai.py`/`*-generic.py`, provider-neutral code, general programming/ML.
- run: Launch and drive this project's app to see a change working. Use when asked to run, start, or screenshot the app, or to confirm a change works in the real app (not just tests). First looks for a project skill that already covers launching the app; otherwise falls back to built-in patterns per project type (CLI, server, TUI, Electron, browser-driven, library).
- init: Initialize a new CLAUDE.md file with codebase documentation
- review: Review a pull request
- security-review: Complete a security review of the pending changes on the current branch

autoplan benchmark browse canary careful caveman ccs-delegation checkpoint codex connect-chrome cso design-consultation design-html design-review design-shotgun devex-review diagnose document-release find-skills freeze grill-me grill-with-docs gsd-add-tests gsd-ai-integration-phase gsd-audit-fix gsd-audit-milestone gsd-audit-uat gsd-autonomous gsd-capture gsd-cleanup gsd-code-review gsd-complete-milestone gsd-config gsd-debug gsd-discuss-phase gsd-docs-update gsd-eval-review gsd-execute-phase gsd-explore gsd-extract-learnings gsd-fast gsd-forensics gsd-graphify gsd-health gsd-help gsd-import gsd-inbox gsd-ingest-docs gsd-manager gsd-map-codebase gsd-milestone-summary gsd-mvp-phase gsd-new-milestone gsd-new-project gsd-ns-context gsd-ns-ideate gsd-ns-manage gsd-ns-project gsd-ns-review gsd-ns-workflow gsd-pause-work gsd-phase gsd-plan-phase gsd-plan-review-convergence gsd-pr-branch gsd-profile-user gsd-progress gsd-quick gsd-resume-work gsd-review gsd-review-backlog gsd-secure-phase gsd-settings gsd-ship gsd-sketch gsd-spec-phase gsd-spike gsd-stats gsd-surface gsd-thread gsd-ui-phase gsd-ui-review gsd-ultraplan-phase gsd-undo gsd-update gsd-validate-phase gsd-verify-work gsd-workspace gsd-workstreams gstack gstack-upgrade guard handoff health improve-codebase-architecture investigate land-and-deploy learn mux-send office-hours open-gstack-browser pair-agent plan-ceo-review plan-design-review plan-devex-review plan-eng-review propose-issue qa qa-only retro review screenshot-capture setup-browser-cookies setup-deploy ship to-prd trace traceable-reqs unfreeze win-marketplace-add write-a-skill ccs ccs:continue deep-research frontend-design:frontend-design spt:clear-psyche spt:commune spt:force-stop spt:list-agents spt:live spt:new-alarm spt:psyche-sync-setup spt:ready spt:revive spt:send spt:signoff spt:whoami caveman:caveman caveman:caveman-commit caveman:caveman-help caveman:caveman-review caveman:compress everything:search update-config keybindings-help verify code-review simplify fewer-permission-prompts loop schedule claude-api run init review security-review


<owl_reachability_notice>
You have an active owl perch. When spawning subagents or doing work, use run_in_background: true so you stay reachable for incoming messages.
</owl_reachability_notice>


CAVEMAN MODE ACTIVE (full). Drop articles/filler/pleasantries/hedging. Fragments OK. Code/commits/security: write normal.


Orient first. Read M2b plan + check repo state.


Bash

git log --oneline -5 && echo "---STATUS---" && git status --short && echo "---CRATES---" && ls crates/

Check git state and crate layout


104ea8e docs(M2b): author M2b-PLAN.md (live-agent lifecycle)
dbdbabe chore(M2a): T10 — activation sweep + ROADMAP (M2a delivered)
504b346 test(spt): M2a T9 — contract E2E through the mock adapter
146a7b8 feat(mock-adapter): M2a T8 — generic mock adapter (manifest + helper)
d555c93 feat(spt): M2a T7 — reporting + boundary surface
---STATUS---
---CRATES---
spt
spt-msg
spt-proto
spt-runtime
spt-store


1	# M2b Plan — Live-agent lifecycle (`spt-live`)
2
3	> **Just-in-time, lightweight** — same pattern as `M0-PLAN.md` / `M1-PLAN.md` /
4	> `M2a-PLAN.md`. The ordered task layer between ROADMAP.md (milestone sequence)
5	> and `traceable-reqs.toml` (requirement checklist), scoped to **M2b only**.
6	> Honors ROADMAP §"lightweight but structured, GSD too heavy". Branch:
7	> `dev-freeform`.
8
9	> **M2 is split** (decision 2026-06-01): **M2a = the harness contract** (landed
10	> 2026-06-01 — `spt-runtime` + the `api` surface + harness-hosted startup + mock
11	> adapter + contract E2E). **M2b = the live-agent / Psyche lifecycle** (this
12	> plan): the `spt-live` crate that *executes* the lifecycle seams M2a only
13	> declared and parsed.
14
15	## Goal
16
17	Make a **LiveAgent** real: a Self with a Psyche companion that the harness drives
18	through its full lifecycle — Psyche spawn/resume, the pulse heartbeat,
19	commune/signoff drop-file ingest, the echo-commune, and the resume seam — all
20	behind the M2a manifest contract, still **harness-agnostic** (zero Claude Code
21	conventions in-repo; the mock adapter gains the lifecycle templates).
22
23	M2a built the *inbound/outbound contract surface* and **parsed** the lifecycle
24	manifest sections (`[session.psyche_*]`, `[session.echo_commune]`,
25	`[session.signoff]`, `[history]`, commune/signoff watched dirs) without executing
26	them. M2b builds the executor:
27
28	- **spawn-psyche seam** (`REQ-SEAM-PSYCHE`) — fresh + resume Psyche templates,
29	  spawned as a **nested Psyche perch** (`<id>-psyche`) via `ManifestRuntime`.
30	- **history subsystem** (`REQ-SEAM-HISTORY`) — the three strategies (fetcher /
31	  locate-normalize / native) feeding the echo-commune + resume briefs.
32	- **resume-session seam** (`REQ-SEAM-RESUME`) — fresh-with-preload + continue-
33	  existing.
34	- **drop-file ingest** — watch the manifest dirs, ingest `<id>-commune.md` /
35	  `<id>-signoff.md`, **single-writer** (spt-core owns + deletes; the mind is
36	  read-only — KNOWN-HAZARDS 6.4), with the direct-write precedence guard (6.5).
37	- **the orphan/signoff ordering invariants** — echo-commune *before* INIT_SIGNOFF
38	  (3.3), grace recheck before composing signoff (1.1), stale-signoff sweep on
39	  start (3.2).
40
41	**M2b done =** `spt-live` compiles + the `api listen` runner hosts the lifecycle
42	· `cargo test --workspace` green · a **LiveAgent E2E** proves: spawn a LiveAgent
43	→ its Psyche spawns as a nested perch → a commune drop-file is ingested (and
44	deleted by spt-core) → a graceful signoff fires the echo-commune *before*
45	teardown — all harness-agnostic via the mock adapter · `traceable-reqs check`
46	green with M2b reqs *activated* · CI stays green.
47
48	## Scope
49
50	**In:** the `spt-live` crate — `SpawnPsyche` (fresh/resume templates +
51	spt-core-owned `$psyche_prompt`: timestamp + incoming event envelope;
52	recursion-guard env set on summarizer children); the **history subsystem** (all
53	three `[history]` strategies, the native Path-B store reusing T7's
54	`history-log`); the **echo-commune** seam (cheap-model template consuming the
55	configured history; project-primary / live-conservative provenance per
56	`docs/CONTEXT-MEMORY.md`); the **pulse** heartbeat (interim: a loop in the
57	`api listen` runner — period from the spt-core global config knob); **drop-file
58	ingest** (watch the manifest commune/signoff dirs; single-writer ownership;
59	ingest→delete; precedence marker on context writes); the **graceful signoff +
60	boundary Self-resume-commune** path (echo-before-signoff ordering; grace recheck;
61	stale-signoff sweep); the **resume-session seam** (fresh-with-preload +
62	continue-existing); the `api listen` wiring that hosts all of it; mock-adapter
63	lifecycle templates + a LiveAgent E2E.
64
65	**Out:**
66	- **The consolidated `spt-daemon` (M3):** M2b keeps M1/M2a's interim no-daemon
67	  model — the Psyche is a **real process** and the `api listen` process runs the
68	  pulse/ingest loops. M3 moves both into the daemon (Psyche-as-loop,
69	  daemon-authoritative liveness — KNOWN-HAZARDS 2.5 / `REQ-HAZARD-DAEMON-HOSTED-
70	  LIVENESS`, `REQ-DAEMON-*`).
71	- **Orphan *crash* detection / supervision (M3):** M2b implements the **graceful**
72	  teardown paths (`spt shutdown` / `spt suspend` / boundary) and their ordering
73	  invariants. Detecting an orphaned Self after an unexpected harness death needs
74	  the always-on supervisor — that orphan-watch lands with the daemon (M3),
75	  carrying the same grace/echo ordering (1.1/3.3) into the supervised path.
76	- **spt-hosted topology + PTY inject (M3):** the Psyche/echo templates here are
77	  spawned as detached subprocesses; PTY-hosted injection is `spt-term`/M3.
78	- **Cross-node Psyche sync + the distributed precedence/freshness rule (M4):**
79	  M2b lands the **local** direct-write precedence guard (6.5); the node-identity
80	  + newest-and-newer-than-mine generalization is ADR-0003 / M4.
81	- **The memformat / Memory-Health / block-OCC merge (deferred):** `docs/DEFERRED.md`
82	  + `docs/CONTEXT-MEMORY.md` §Deferred. M2b ingests communes as opaque context
83	  blobs; the structured-block schema + Retrieval Map are a later pass.
84
85	**Interim-model note (no daemon — decision 2026-06-01).** CONTEXT describes the
86	daemon owning all Psyche/pulse loops (`R-DAEMON-1`). The consolidated
87	`spt-daemon` is **M3**. So M2b mirrors M1/M2a: the long-running **`api listen`**
88	process (heir to `$LIVE start`) hosts the pulse loop + drop-file watch +
89	orphan/signoff logic, and the **Psyche is a real subprocess** (per-pid liveness
90	holds *interim* — CONTEXT §Psyche). M3 swaps the daemon in: Psyche-as-loop,
91	daemon-authoritative liveness, in-memory seed. **Keep `spt-live` behind clean
92	seams so the M3 move is a re-host, not a rewrite** (same discipline as M1's
93	listener and M2a's seed-file).
94
95	## Clean-room posture (validated against the sister)
96
97	The sister's `src/live/wrapper/` is **deeply Claude-Code-coupled** (`claude -p`,
98	the orphan/grace state machine wired to CC hooks, `.claude/` drop dirs, the
99	wrapper owning a `claude` subprocess). For a harness-agnostic core, copy-verbatim
100	only the harness-orthogonal **mechanism + the hard-won ordering invariants**;
101	clean-room the rest behind the M2a seams:
102
103	- **Copy (mechanism + invariants, ADR-0001 + KNOWN-HAZARDS):** the orphan/grace
104	  **ordering** (`orphan.rs`: grace recheck *before* compose — 1.1; echo-commune
105	  *before* INIT_SIGNOFF — 3.3), the stale-signoff sweep (3.2), the drop-file
106	  single-writer ownership (6.4), the generation/`gen_start = now()` rule (2.4),
107	  the echo-commune-before-signoff sequence (3.3). These are real bugs already
108	  paid for once — re-expressed against the spt-store/spt-runtime APIs.
109	- **Clean-room (becomes `spt-live` over the M2a seams):** everything referencing
110	  `claude -p`, CC hooks, `.claude` paths, or model selection. The Psyche/echo/
111	  resume **command lines become the mock adapter's opaque templates**, never
112	  spt-core code (the model lives in the template — SPT never selects one).
113
114	## Sequencing rationale
115
116	Crate scaffold first; then the **history subsystem** (the echo-commune consumes
117	it, so it precedes echo); then **spawn-psyche** (the lifecycle's root — nothing
118	lives without a Psyche); then **echo-commune** (needs history + a spawn seam);
119	then **drop-file ingest** (the commune/signoff channel the echo writes into +
120	the agent writes communes into); then **pulse** (the heartbeat that drives
121	ingest polling + pending-echo fires); then **signoff/boundary** (composes the
122	ordering invariants over ingest + echo); then **resume** (re-entry, depends on
123	history + spawn). Then the `api listen` wiring, the mock lifecycle templates +
124	LiveAgent E2E, then the activation sweep. Each task tags evidence + activates its
125	reqs in the same commit; `check` green before the next.
126
127	## New requirements to register first (TRACEABILITY rule 3)
128
129	**Assessment — mostly none.** The M2b deliverables map onto already-registered
130	requirements:
131
132	- Psyche/echo/resume → `REQ-SEAM-PSYCHE`, `REQ-SEAM-RESUME`, `REQ-SEAM-HISTORY`
133	  (land inactive; activate per task).
134	- LiveAgent + Psyche endpoint types → `REQ-EP-1` / `REQ-EP-2` (already active,
135	  M0 — the type model). M2b makes them *live*; no stage change, build-evidenced.
136	- Commune/signoff ingest execution → extends `REQ-API-3` to `int`, governed by
137	  `REQ-HAZARD-DROP-FILE-SINGLE-WRITER` (6.4) + `REQ-HAZARD-DIRECT-WRITE-
138	  PRECEDENCE` (6.5).
139	- Signoff/orphan ordering → `REQ-HAZARD-GRACE-BEFORE-SIGNOFF` (1.1, graceful
140	  path), `REQ-HAZARD-STALE-SIGNOFF-SENTINEL` (3.2), `REQ-HAZARD-ECHO-BEFORE-
141	  SIGNOFF` (3.3).
142
143	**The one gap to resolve at plan time:** the **pulse heartbeat** has no dedicated
144	`REQ-*`. CONTEXT attributes pulse loops to the daemon (`R-DAEMON-1`, M3), but M2b
145	runs an interim pulse in the `api listen` runner. Two options, decided before T5:
146	**(a)** treat the interim pulse as mechanism under `REQ-SEAM-PSYCHE` (no new req;
147	M3's `REQ-DAEMON-*` owns the durable loop), or **(b)** register a thin
148	`REQ-LIVE-PULSE` if the plan-checker wants the heartbeat independently traced.
149	**Default: (a)** — the pulse is interim scaffolding M3 subsumes; activating a req
150	for throwaway glue violates "activate, don't pre-fail." Revisit if T5's pulse
151	grows load-bearing behavior beyond ingest-polling + pending-echo fires.
152
153	## Tasks — `spt-live` (the lifecycle executor)
154
155	| # | Task | Source | Reqs / hazards | Acceptance |
156	|---|------|--------|----------------|------------|
157	| T0 | Scaffold `spt-live` crate (members + deps: spt-proto/store/msg/runtime; serde); activation-prep | new | — | crate compiles; `check` green; layering `…→spt-runtime→spt-live` acyclic |
158	| T1 | **History subsystem**: `fetch_history(manifest, session)` over the three `[history]` strategies — `fetcher` (bounded `run_bounded`), `locate_normalize` (read raw transcript + bounded normalize), `native` (Path-B store, reuse T7 `history-log`) → normalized records | clean-room; `docs/STORAGE.md` + MANIFEST `[history]` | REQ-SEAM-HISTORY | each strategy yields normalized records from a fixture; a missing/over-time fetcher errors (timeout 5.3), never hangs |
159	| T2 | **spawn-psyche seam**: spawn the Psyche from `[session.psyche_init]` as a nested `<id>-psyche` perch via `ManifestRuntime`; compose the spt-core-owned `$psyche_prompt` (timestamp + incoming event envelope); set `recursion_guard_env`; bind the Psyche perch (nested, M0 layout) | clean-room (sister `live/wrapper/psyche`) | REQ-SEAM-PSYCHE; REQ-HAZARD-SUBPROCESS-TIMEOUT | a manifest + event spawns a Psyche; `<id>-psyche` perch exists nested; the guard env is set on the child |
160	| T3 | **echo-commune seam**: spawn `[session.echo_commune]` (cheap-model template) consuming T1 history; recursion-guard so its hooks bail; write the result as a **commune drop-file**, tagged project-primary / live-conservative (provenance `Source:`) | clean-room; `docs/CONTEXT-MEMORY.md` | REQ-SEAM-HISTORY (echo source); REQ-HAZARD-DROP-FILE-SINGLE-WRITER | an echo run consumes history + emits a single-writer commune drop; a recursion-guarded child does not re-echo |
161	| T4 | **drop-file ingest**: watch the manifest commune/signoff dirs; ingest `<id>-commune.md` / `<id>-signoff.md` into the perch's context store; **spt-core single-writer** (ingest→delete; the mind never deletes); **direct-write precedence** marker (source+timestamp; suppress stale LLM overwrites within the protection window) | clean-room | REQ-API-3 (`int`); REQ-HAZARD-DROP-FILE-SINGLE-WRITER (6.4); REQ-HAZARD-DIRECT-WRITE-PRECEDENCE (6.5) | a dropped commune is ingested + deleted by spt-core; a stale LLM overwrite within the window is suppressed + logged; a direct write always proceeds |
162	| T5 | **pulse heartbeat**: an interim loop in the `api listen` runner (period = spt-core global config knob, per-endpoint override) driving drop-file polling + pending-echo fires (the M2a `.more-done` gate) + capsule/idle checks | clean-room (sister pulse) | (see "New requirements" — default no new req) | the pulse polls the drop dirs at its period; an armed echo-gate triggers exactly one echo, then clears |
163	| T6 | **signoff + boundary lifecycle**: graceful signoff (`spt shutdown` / `spt suspend`) runs the echo-commune **before** composing INIT_SIGNOFF (3.3); grace recheck binds `still_gone` **before** any signoff write (1.1); **stale-signoff sweep** on listener start (3.2); boundary authors the **Self-resume commune** (M2a `boundary` rebinds; M2b writes the resume commune) | copy invariants (sister `orphan.rs`) | REQ-HAZARD-ECHO-BEFORE-SIGNOFF (3.3); REQ-HAZARD-GRACE-BEFORE-SIGNOFF (1.1); REQ-HAZARD-STALE-SIGNOFF-SENTINEL (3.2) | echo precedes signoff (asserted by order); a stale signoff sentinel is swept and never tears down a fresh start; a recovered Self after grace is **not** signed off |
164	| T7 | **resume-session seam**: `fresh-with-preload` (spawn a cleared session + `$psyche-context` download) and `continue-existing` (resume `$session_id`); wire into spawn + boundary re-entry | clean-room; CONTEXT §resume seam | REQ-SEAM-RESUME | a resume template re-enters an existing session; a fresh-with-preload launches cleared + preloaded; the wrong/missing key errors before spawn |
165
166	## Tasks — `spt` binary + integration + infra
167
168	| # | Task | Reqs | Acceptance |
169	|---|------|------|------------|
170	| T8 | **`api listen` lifecycle wiring**: extend the M2a relay runner to host the LiveAgent lifecycle — spawn the Psyche (T2), run the pulse (T5), ingest drops (T4), fire echoes (T3), and execute graceful signoff (T6). Keep the surface thin (M3 re-hosts into the daemon) | REQ-SEAM-PSYCHE, REQ-API-2 | `api listen` on a live-capable manifest spawns + hosts a Psyche; teardown is graceful |
171	| T9 | **LiveAgent E2E**: extend `adapters/mock/manifest.toml` with `[session.psyche_init/psyche_resume/echo_commune/signoff]` + `[history]` (native) + commune/signoff dirs; prove end-to-end: spawn LiveAgent → Psyche nested perch appears → drop a commune → ingested+deleted → graceful signoff fires echo **before** teardown | REQ-SEAM-PSYCHE (`int`), REQ-SEAM-HISTORY (`int`), REQ-API-3 (`int`) | a `tests/` integration test proves the full lifecycle via the mock adapter, harness-agnostic |
172	| T10 | **Activation sweep**: activate M2b reqs + hazards; activate `REQ-EP-1/2` live-evidence (no stage change); green `check`, CI green; amend ROADMAP (M2b delivered) + CONTEXT/M2b notes; author the **M3 plan** stub | — | `check` green with all M2b reqs activated; CI matrix + gate pass |
173
174	## M2b requirement-activation map
175
176	Activate as each task lands (default `["impl","unit"]`; the lifecycle seams add
177	`int` at T9):
178
179	- **Seams:** REQ-SEAM-HISTORY (`impl`+`unit`, T1; +`int` T9), REQ-SEAM-PSYCHE
180	  (`impl`+`unit`, T2; +`int` T9), REQ-SEAM-RESUME (`impl`+`unit`, T7).
181	- **api surface:** REQ-API-3 gains `int` (T4 ingest / T9), REQ-API-2 reused (no
182	  change — `api listen` already covered M2a).
183	- **Hazards:** REQ-HAZARD-DROP-FILE-SINGLE-WRITER (T4), REQ-HAZARD-DIRECT-WRITE-
184	  PRECEDENCE (T4), REQ-HAZARD-ECHO-BEFORE-SIGNOFF (T6), REQ-HAZARD-GRACE-BEFORE-
185	  SIGNOFF (T6, graceful path), REQ-HAZARD-STALE-SIGNOFF-SENTINEL (T6). REQ-HAZARD-
186	  SUBPROCESS-TIMEOUT reused (M2a) for T1/T2 spawns — no change.
187	- **Endpoint types:** REQ-EP-1 / REQ-EP-2 already active (M0) — M2b makes
188	  LiveAgent + Psyche *live*; build-evidenced, no stage change.
189
190	**Stay `[]` (M3):** REQ-START-3 (spt-hosted), REQ-SEAM-UPDATE, REQ-DAEMON-*,
191	REQ-HAZARD-DAEMON-HOSTED-LIVENESS, REQ-HAZARD-CONPTY-DSR, REQ-HAZARD-RESTART-
192	IDEMPOTENT, REQ-TERM-*. **Stay `[]` (M4/M5):** all R-NET/R-PAIR, REQ-EP-4
193	(PresenceChannel impl), the distributed precedence/freshness generalization.
194
195	## Workspace change
196
197	Add `crates/spt-live` to `members`. Layering stays acyclic (R-ARCH-1):
198	`spt-proto → spt-store → spt-msg → spt-runtime → spt-live`; the `spt` binary
199	(top consumer) gains the `api listen` lifecycle wiring dispatching into
200	`spt-live`. `spt-live` is **not** part of the public SDK surface (R-ARCH-2 is
201	proto/runtime/msg) — it is the daemon-bound executor M3 consolidates.
202
203	## Risks carried into M2b
204
205	- **Interim pulse vs daemon loop.** The T5 pulse is throwaway glue M3's daemon
206	  subsumes — keep it behind one small module so the M3 re-host is localized
207	  (mirror M2a's seed-file discipline). Don't over-build it (the "New
208	  requirements" gap above).
209	- **Ordering invariants are the load-bearing carryover.** 1.1 (grace before
210	  signoff) and 3.3 (echo before signoff) are the sister's most expensive bugs.
211	  Copy the *ordering*, clean-room the wiring; each gets an explicit ordering
212	  assertion test, not just a happy-path test.
213	- **Drop-file single-writer across the harness boundary (6.4).** The mind (an
214	  LLM session) must be read-only on drop files; only spt-core deletes. Bake the
215	  ownership into the runtime contract + assert the mind-never-deletes path.
216	- **Real-process Psyche is interim (CONTEXT §Psyche / 2.5).** Per-pid liveness
217	  holds only until M3. Don't let liveness checks leak `is_process_alive(info.pid)`
218	  assumptions into durable state — gate them behind the interim seam so M3's
219	  daemon-authoritative `status` field is a swap.
220	- **Echo-commune leak (CONTEXT-MEMORY anti-leak).** Echo communes are
221	  project-primary / live-conservative; tag provenance (`Source:`) at ingest so
222	  the later memformat pass (deferred) inherits correct tiering. Getting
223	  provenance right now is cheap; retrofitting it is not.
224	- **No architecture risk.** M2b is the lifecycle executor on the proven
225	  M0/M1/M2a substrate, in the same no-daemon interim model. The FATALs were the
226	  daemon (ADR-0004, M3) and pairing (ADR-0005, M4).
227

# M2b Plan — Live-agent lifecycle (`spt-live`)

> **Just-in-time, lightweight** — same pattern as `M0-PLAN.md` / `M1-PLAN.md` /
> `M2a-PLAN.md`. The ordered task layer between ROADMAP.md (milestone sequence)
> and `traceable-reqs.toml` (requirement checklist), scoped to **M2b only**.
> Honors ROADMAP §"lightweight but structured, GSD too heavy". Branch:
> `dev-freeform`.

> **M2 is split** (decision 2026-06-01): **M2a = the harness contract** (landed
> 2026-06-01 — `spt-runtime` + the `api` surface + harness-hosted startup + mock
> adapter + contract E2E). **M2b = the live-agent / Psyche lifecycle** (this
> plan): the `spt-live` crate that *executes* the lifecycle seams M2a only
> declared and parsed.

## Goal

Make a **LiveAgent** real: a Self with a Psyche companion that the harness drives
through its full lifecycle — Psyche spawn/resume, the pulse heartbeat,
commune/signoff drop-file ingest, the echo-commune, and the resume seam — all
behind the M2a manifest contract, still **harness-agnostic** (zero Claude Code
conventions in-repo; the mock adapter gains the lifecycle templates).

M2a built the *inbound/outbound contract surface* and **parsed** the lifecycle
manifest sections (`[session.psyche_*]`, `[session.echo_commune]`,
`[session.signoff]`, `[history]`, commune/signoff watched dirs) without executing
them. M2b builds the executor:

- **spawn-psyche seam** (`REQ-SEAM-PSYCHE`) — fresh + resume Psyche templates,
  spawned as a **nested Psyche perch** (`<id>-psyche`) via `ManifestRuntime`.
- **history subsystem** (`REQ-SEAM-HISTORY`) — the three strategies (fetcher /
  locate-normalize / native) feeding the echo-commune + resume briefs.
- **resume-session seam** (`REQ-SEAM-RESUME`) — fresh-with-preload + continue-
  existing.
- **drop-file ingest** — watch the manifest dirs, ingest `<id>-commune.md` /
  `<id>-signoff.md`, **single-writer** (spt-core owns + deletes; the mind is
  read-only — KNOWN-HAZARDS 6.4), with the direct-write precedence guard (6.5).
- **the orphan/signoff ordering invariants** — echo-commune *before* INIT_SIGNOFF
  (3.3), grace recheck before composing signoff (1.1), stale-signoff sweep on
  start (3.2).

**M2b done =** `spt-live` compiles + the `api listen` runner hosts the lifecycle
· `cargo test --workspace` green · a **LiveAgent E2E** proves: spawn a LiveAgent
→ its Psyche spawns as a nested perch → a commune drop-file is ingested (and
deleted by spt-core) → a graceful signoff fires the echo-commune *before*
teardown — all harness-agnostic via the mock adapter · `traceable-reqs check`
green with M2b reqs *activated* · CI stays green.

## Scope

**In:** the `spt-live` crate — `SpawnPsyche` (fresh/resume templates +
spt-core-owned `$psyche_prompt`: timestamp + incoming event envelope;
recursion-guard env set on summarizer children); the **history subsystem** (all
three `[history]` strategies, the native Path-B store reusing T7's
`history-log`); the **echo-commune** seam (cheap-model template consuming the
configured history; project-primary / live-conservative provenance per
`docs/CONTEXT-MEMORY.md`); the **pulse** heartbeat (interim: a loop in the
`api listen` runner — period from the spt-core global config knob); **drop-file
ingest** (watch the manifest commune/signoff dirs; single-writer ownership;
ingest→delete; precedence marker on context writes); the **graceful signoff +
boundary Self-resume-commune** path (echo-before-signoff ordering; grace recheck;
stale-signoff sweep); the **resume-session seam** (fresh-with-preload +
continue-existing); the `api listen` wiring that hosts all of it; mock-adapter
lifecycle templates + a LiveAgent E2E.

**Out:**
- **The consolidated `spt-daemon` (M3):** M2b keeps M1/M2a's interim no-daemon
  model — the Psyche is a **real process** and the `api listen` process runs the
  pulse/ingest loops. M3 moves both into the daemon (Psyche-as-loop,
  daemon-authoritative liveness — KNOWN-HAZARDS 2.5 / `REQ-HAZARD-DAEMON-HOSTED-
  LIVENESS`, `REQ-DAEMON-*`).
- **Orphan *crash* detection / supervision (M3):** M2b implements the **graceful**
  teardown paths (`spt shutdown` / `spt suspend` / boundary) and their ordering
  invariants. Detecting an orphaned Self after an unexpected harness death needs
  the always-on supervisor — that orphan-watch lands with the daemon (M3),
  carrying the same grace/echo ordering (1.1/3.3) into the supervised path.
- **spt-hosted topology + PTY inject (M3):** the Psyche/echo templates here are
  spawned as detached subprocesses; PTY-hosted injection is `spt-term`/M3.
- **Cross-node Psyche sync + the distributed precedence/freshness rule (M4):**
  M2b lands the **local** direct-write precedence guard (6.5); the node-identity
  + newest-and-newer-than-mine generalization is ADR-0003 / M4.
- **The memformat / Memory-Health / block-OCC merge (deferred):** `docs/DEFERRED.md`
  + `docs/CONTEXT-MEMORY.md` §Deferred. M2b ingests communes as opaque context
  blobs; the structured-block schema + Retrieval Map are a later pass.

**Interim-model note (no daemon — decision 2026-06-01).** CONTEXT describes the
daemon owning all Psyche/pulse loops (`R-DAEMON-1`). The consolidated
`spt-daemon` is **M3**. So M2b mirrors M1/M2a: the long-running **`api listen`**
process (heir to `$LIVE start`) hosts the pulse loop + drop-file watch +
orphan/signoff logic, and the **Psyche is a real subprocess** (per-pid liveness
holds *interim* — CONTEXT §Psyche). M3 swaps the daemon in: Psyche-as-loop,
daemon-authoritative liveness, in-memory seed. **Keep `spt-live` behind clean
seams so the M3 move is a re-host, not a rewrite** (same discipline as M1's
listener and M2a's seed-file).

## Clean-room posture (validated against the sister)

The sister's `src/live/wrapper/` is **deeply Claude-Code-coupled** (`claude -p`,
the orphan/grace state machine wired to CC hooks, `.claude/` drop dirs, the
wrapper owning a `claude` subprocess). For a harness-agnostic core, copy-verbatim
only the harness-orthogonal **mechanism + the hard-won ordering invariants**;
clean-room the rest behind the M2a seams:

- **Copy (mechanism + invariants, ADR-0001 + KNOWN-HAZARDS):** the orphan/grace
  **ordering** (`orphan.rs`: grace recheck *before* compose — 1.1; echo-commune
  *before* INIT_SIGNOFF — 3.3), the stale-signoff sweep (3.2), the drop-file
  single-writer ownership (6.4), the generation/`gen_start = now()` rule (2.4),
  the echo-commune-before-signoff sequence (3.3). These are real bugs already
  paid for once — re-expressed against the spt-store/spt-runtime APIs.
- **Clean-room (becomes `spt-live` over the M2a seams):** everything referencing
  `claude -p`, CC hooks, `.claude` paths, or model selection. The Psyche/echo/
  resume **command lines become the mock adapter's opaque templates**, never
  spt-core code (the model lives in the template — SPT never selects one).

## Sequencing rationale

Crate scaffold first; then the **history subsystem** (the echo-commune consumes
it, so it precedes echo); then **spawn-psyche** (the lifecycle's root — nothing
lives without a Psyche); then **echo-commune** (needs history + a spawn seam);
then **drop-file ingest** (the commune/signoff channel the echo writes into +
the agent writes communes into); then **pulse** (the heartbeat that drives
ingest polling + pending-echo fires); then **signoff/boundary** (composes the
ordering invariants over ingest + echo); then **resume** (re-entry, depends on
history + spawn). Then the `api listen` wiring, the mock lifecycle templates +
LiveAgent E2E, then the activation sweep. Each task tags evidence + activates its
reqs in the same commit; `check` green before the next.

## New requirements to register first (TRACEABILITY rule 3)

**Assessment — mostly none.** The M2b deliverables map onto already-registered
requirements:

- Psyche/echo/resume → `REQ-SEAM-PSYCHE`, `REQ-SEAM-RESUME`, `REQ-SEAM-HISTORY`
  (land inactive; activate per task).
- LiveAgent + Psyche endpoint types → `REQ-EP-1` / `REQ-EP-2` (already active,
  M0 — the type model). M2b makes them *live*; no stage change, build-evidenced.
- Commune/signoff ingest execution → extends `REQ-API-3` to `int`, governed by
  `REQ-HAZARD-DROP-FILE-SINGLE-WRITER` (6.4) + `REQ-HAZARD-DIRECT-WRITE-
  PRECEDENCE` (6.5).
- Signoff/orphan ordering → `REQ-HAZARD-GRACE-BEFORE-SIGNOFF` (1.1, graceful
  path), `REQ-HAZARD-STALE-SIGNOFF-SENTINEL` (3.2), `REQ-HAZARD-ECHO-BEFORE-
  SIGNOFF` (3.3).

**The one gap to resolve at plan time:** the **pulse heartbeat** has no dedicated
`REQ-*`. CONTEXT attributes pulse loops to the daemon (`R-DAEMON-1`, M3), but M2b
runs an interim pulse in the `api listen` runner. Two options, decided before T5:
**(a)** treat the interim pulse as mechanism under `REQ-SEAM-PSYCHE` (no new req;
M3's `REQ-DAEMON-*` owns the durable loop), or **(b)** register a thin
`REQ-LIVE-PULSE` if the plan-checker wants the heartbeat independently traced.
**Default: (a)** — the pulse is interim scaffolding M3 subsumes; activating a req
for throwaway glue violates "activate, don't pre-fail." Revisit if T5's pulse
grows load-bearing behavior beyond ingest-polling + pending-echo fires.

## Tasks — `spt-live` (the lifecycle executor)

| # | Task | Source | Reqs / hazards | Acceptance |
|---|------|--------|----------------|------------|
| T0 | Scaffold `spt-live` crate (members + deps: spt-proto/store/msg/runtime; serde); activation-prep | new | — | crate compiles; `check` green; layering `…→spt-runtime→spt-live` acyclic |
| T1 | **History subsystem**: `fetch_history(manifest, session)` over the three `[history]` strategies — `fetcher` (bounded `run_bounded`), `locate_normalize` (read raw transcript + bounded normalize), `native` (Path-B store, reuse T7 `history-log`) → normalized records | clean-room; `docs/STORAGE.md` + MANIFEST `[history]` | REQ-SEAM-HISTORY | each strategy yields normalized records from a fixture; a missing/over-time fetcher errors (timeout 5.3), never hangs |
| T2 | **spawn-psyche seam**: spawn the Psyche from `[session.psyche_init]` as a nested `<id>-psyche` perch via `ManifestRuntime`; compose the spt-core-owned `$psyche_prompt` (timestamp + incoming event envelope); set `recursion_guard_env`; bind the Psyche perch (nested, M0 layout) | clean-room (sister `live/wrapper/psyche`) | REQ-SEAM-PSYCHE; REQ-HAZARD-SUBPROCESS-TIMEOUT | a manifest + event spawns a Psyche; `<id>-psyche` perch exists nested; the guard env is set on the child |
| T3 | **echo-commune seam**: spawn `[session.echo_commune]` (cheap-model template) consuming T1 history; recursion-guard so its hooks bail; write the result as a **commune drop-file**, tagged project-primary / live-conservative (provenance `Source:`) | clean-room; `docs/CONTEXT-MEMORY.md` | REQ-SEAM-HISTORY (echo source); REQ-HAZARD-DROP-FILE-SINGLE-WRITER | an echo run consumes history + emits a single-writer commune drop; a recursion-guarded child does not re-echo |
| T4 | **drop-file ingest**: watch the manifest commune/signoff dirs; ingest `<id>-commune.md` / `<id>-signoff.md` into the perch's context store; **spt-core single-writer** (ingest→delete; the mind never deletes); **direct-write precedence** marker (source+timestamp; suppress stale LLM overwrites within the protection window) | clean-room | REQ-API-3 (`int`); REQ-HAZARD-DROP-FILE-SINGLE-WRITER (6.4); REQ-HAZARD-DIRECT-WRITE-PRECEDENCE (6.5) | a dropped commune is ingested + deleted by spt-core; a stale LLM overwrite within the window is suppressed + logged; a direct write always proceeds |
| T5 | **pulse heartbeat**: an interim loop in the `api listen` runner (period = spt-core global config knob, per-endpoint override) driving drop-file polling + pending-echo fires (the M2a `.more-done` gate) + capsule/idle checks | clean-room (sister pulse) | (see "New requirements" — default no new req) | the pulse polls the drop dirs at its period; an armed echo-gate triggers exactly one echo, then clears |
| T6 | **signoff + boundary lifecycle**: graceful signoff (`spt shutdown` / `spt suspend`) runs the echo-commune **before** composing INIT_SIGNOFF (3.3); grace recheck binds `still_gone` **before** any signoff write (1.1); **stale-signoff sweep** on listener start (3.2); boundary authors the **Self-resume commune** (M2a `boundary` rebinds; M2b writes the resume commune) | copy invariants (sister `orphan.rs`) | REQ-HAZARD-ECHO-BEFORE-SIGNOFF (3.3); REQ-HAZARD-GRACE-BEFORE-SIGNOFF (1.1); REQ-HAZARD-STALE-SIGNOFF-SENTINEL (3.2) | echo precedes signoff (asserted by order); a stale signoff sentinel is swept and never tears down a fresh start; a recovered Self after grace is **not** signed off |
| T7 | **resume-session seam**: `fresh-with-preload` (spawn a cleared session + `$psyche-context` download) and `continue-existing` (resume `$session_id`); wire into spawn + boundary re-entry | clean-room; CONTEXT §resume seam | REQ-SEAM-RESUME | a resume template re-enters an existing session; a fresh-with-preload launches cleared + preloaded; the wrong/missing key errors before spawn |

## Tasks — `spt` binary + integration + infra

| # | Task | Reqs | Acceptance |
|---|------|------|------------|
| T8 | **`api listen` lifecycle wiring**: extend the M2a relay runner to host the LiveAgent lifecycle — spawn the Psyche (T2), run the pulse (T5), ingest drops (T4), fire echoes (T3), and execute graceful signoff (T6). Keep the surface thin (M3 re-hosts into the daemon) | REQ-SEAM-PSYCHE, REQ-API-2 | `api listen` on a live-capable manifest spawns + hosts a Psyche; teardown is graceful |
| T9 | **LiveAgent E2E**: extend `adapters/mock/manifest.toml` with `[session.psyche_init/psyche_resume/echo_commune/signoff]` + `[history]` (native) + commune/signoff dirs; prove end-to-end: spawn LiveAgent → Psyche nested perch appears → drop a commune → ingested+deleted → graceful signoff fires echo **before** teardown | REQ-SEAM-PSYCHE (`int`), REQ-SEAM-HISTORY (`int`), REQ-API-3 (`int`) | a `tests/` integration test proves the full lifecycle via the mock adapter, harness-agnostic |
| T10 | **Activation sweep**: activate M2b reqs + hazards; activate `REQ-EP-1/2` live-evidence (no stage change); green `check`, CI green; amend ROADMAP (M2b delivered) + CONTEXT/M2b notes; author the **M3 plan** stub | — | `check` green with all M2b reqs activated; CI matrix + gate pass |

## M2b requirement-activation map

Activate as each task lands (default `["impl","unit"]`; the lifecycle seams add
`int` at T9):

- **Seams:** REQ-SEAM-HISTORY (`impl`+`unit`, T1; +`int` T9), REQ-SEAM-PSYCHE
  (`impl`+`unit`, T2; +`int` T9), REQ-SEAM-RESUME (`impl`+`unit`, T7).
- **api surface:** REQ-API-3 gains `int` (T4 ingest / T9), REQ-API-2 reused (no
  change — `api listen` already covered M2a).
- **Hazards:** REQ-HAZARD-DROP-FILE-SINGLE-WRITER (T4), REQ-HAZARD-DIRECT-WRITE-
  PRECEDENCE (T4), REQ-HAZARD-ECHO-BEFORE-SIGNOFF (T6), REQ-HAZARD-GRACE-BEFORE-
  SIGNOFF (T6, graceful path), REQ-HAZARD-STALE-SIGNOFF-SENTINEL (T6). REQ-HAZARD-
  SUBPROCESS-TIMEOUT reused (M2a) for T1/T2 spawns — no change.
- **Endpoint types:** REQ-EP-1 / REQ-EP-2 already active (M0) — M2b makes
  LiveAgent + Psyche *live*; build-evidenced, no stage change.

**Stay `[]` (M3):** REQ-START-3 (spt-hosted), REQ-SEAM-UPDATE, REQ-DAEMON-*,
REQ-HAZARD-DAEMON-HOSTED-LIVENESS, REQ-HAZARD-CONPTY-DSR, REQ-HAZARD-RESTART-
IDEMPOTENT, REQ-TERM-*. **Stay `[]` (M4/M5):** all R-NET/R-PAIR, REQ-EP-4
(PresenceChannel impl), the distributed precedence/freshness generalization.

## Workspace change

Add `crates/spt-live` to `members`. Layering stays acyclic (R-ARCH-1):
`spt-proto → spt-store → spt-msg → spt-runtime → spt-live`; the `spt` binary
(top consumer) gains the `api listen` lifecycle wiring dispatching into
`spt-live`. `spt-live` is **not** part of the public SDK surface (R-ARCH-2 is
proto/runtime/msg) — it is the daemon-bound executor M3 consolidates.

## Risks carried into M2b

- **Interim pulse vs daemon loop.** The T5 pulse is throwaway glue M3's daemon
  subsumes — keep it behind one small module so the M3 re-host is localized
  (mirror M2a's seed-file discipline). Don't over-build it (the "New
  requirements" gap above).
- **Ordering invariants are the load-bearing carryover.** 1.1 (grace before
  signoff) and 3.3 (echo before signoff) are the sister's most expensive bugs.
  Copy the *ordering*, clean-room the wiring; each gets an explicit ordering
  assertion test, not just a happy-path test.
- **Drop-file single-writer across the harness boundary (6.4).** The mind (an
  LLM session) must be read-only on drop files; only spt-core deletes. Bake the
  ownership into the runtime contract + assert the mind-never-deletes path.
- **Real-process Psyche is interim (CONTEXT §Psyche / 2.5).** Per-pid liveness
  holds only until M3. Don't let liveness checks leak `is_process_alive(info.pid)`
  assumptions into durable state — gate them behind the interim seam so M3's
  daemon-authoritative `status` field is a swap.
- **Echo-commune leak (CONTEXT-MEMORY anti-leak).** Echo communes are
  project-primary / live-conservative; tag provenance (`Source:`) at ingest so
  the later memformat pass (deferred) inherits correct tiering. Getting
  provenance right now is cheap; retrofitting it is not.
- **No architecture risk.** M2b is the lifecycle executor on the proven
  M0/M1/M2a substrate, in the same no-daemon interim model. The FATALs were the
  daemon (ADR-0004, M3) and pairing (ADR-0005, M4).


Plan clear. T0 = scaffold spt-live. Check workspace + sister crate structure.


1	# spt-core cargo workspace (M0). Acyclically-layered crates per R-ARCH-1:
2	#   spt-proto -> spt-store -> spt-msg -> {spt-net, spt-term, spt-runtime} -> spt-live -> spt-daemon -> spt
3	# M0 builds the bottom two: spt-proto (wire) + spt-store (persistence).
4	# M1 adds spt-msg (local messaging) — third layer, one-way above spt-store.
5	# M2a adds spt-runtime (harness contract: manifest schema + AgentRuntime) — fourth layer.
6	[workspace]
7	resolver = "2"
8	members = ["crates/spt-proto", "crates/spt-store", "crates/spt-msg", "crates/spt-runtime", "crates/spt", "adapters/mock"]
9

# spt-core cargo workspace (M0). Acyclically-layered crates per R-ARCH-1:
#   spt-proto -> spt-store -> spt-msg -> {spt-net, spt-term, spt-runtime} -> spt-live -> spt-daemon -> spt
# M0 builds the bottom two: spt-proto (wire) + spt-store (persistence).
# M1 adds spt-msg (local messaging) — third layer, one-way above spt-store.
# M2a adds spt-runtime (harness contract: manifest schema + AgentRuntime) — fourth layer.
[workspace]
resolver = "2"
members = ["crates/spt-proto", "crates/spt-store", "crates/spt-msg", "crates/spt-runtime", "crates/spt", "adapters/mock"]


1	[package]
2	name = "spt-runtime"
3	version = "0.0.0"
4	edition = "2021"
5	publish = false
6	description = "spt-core harness contract: runtime-manifest schema + AgentRuntime/ManifestRuntime (opaque-template substitution + spawn-session seam). The outbound half of the harness-agnostic contract (M2a). Public SDK (R-ARCH-2)."
7
8	[dependencies]
9	spt-proto = { path = "../spt-proto" }
10	spt-store = { path = "../spt-store" }
11	spt-msg = { path = "../spt-msg" }
12	serde = { version = "1", features = ["derive"] }
13	toml = "0.8"
14
15	[dev-dependencies]
16	tempfile = "3"
17

[package]
name = "spt-runtime"
version = "0.0.0"
edition = "2021"
publish = false
description = "spt-core harness contract: runtime-manifest schema + AgentRuntime/ManifestRuntime (opaque-template substitution + spawn-session seam). The outbound half of the harness-agnostic contract (M2a). Public SDK (R-ARCH-2)."

[dependencies]
spt-proto = { path = "../spt-proto" }
spt-store = { path = "../spt-store" }
spt-msg = { path = "../spt-msg" }
serde = { version = "1", features = ["derive"] }
toml = "0.8"

[dev-dependencies]
tempfile = "3"


ls crates/spt-runtime/src/ && echo "---" && cat crates/spt-runtime/src/lib.rs | head -40

List spt-runtime src and head of lib.rs


lib.rs
manifest.rs
runtime.rs
---
//! spt-core harness contract — outbound half (M2a).
//!
//! `spt-runtime` makes spt-core **drivable by a manifest-described harness** with
//! zero Claude Code (or any harness) conventions in-repo. It is the fourth layer
//! in the acyclic stack (`spt-proto -> spt-store -> spt-msg -> spt-runtime`).
//!
//! Two surfaces land here across M2a:
//! - the **runtime-manifest schema** + parse/validate ([`manifest`], T1), and
//! - the [`AgentRuntime`] trait + default `ManifestRuntime` (opaque-template
//!   substitution + spawn-session seam, T2).
//!
//! The inbound half (the `spt api` subcommand surface) lives in the `spt` binary
//! over this crate. See `M2a-PLAN.md`.
//
// spt-runtime joins spt-proto + spt-msg as the third member of the public,
// semver-committed SDK surface (R-ARCH-2): a harness author programs against
// this crate's Manifest/AgentRuntime types.
// [impl->REQ-ARCH-2]

pub mod manifest;
pub mod runtime;

pub use manifest::{Manifest, ManifestError};
pub use runtime::{AgentRuntime, ManifestRuntime, RuntimeError, Spawned};


Scaffold T0. Create crate + add to workspace.


Write

[package]
name = "spt-live"
version = "0.0.0"
edition = "2021"
publish = false
description = "spt-core live-agent lifecycle executor (M2b): the Psyche spawn/resume + history + echo-commune + drop-file ingest + signoff/boundary ordering seams that M2a's manifest only declared. Fifth layer; daemon-bound (NOT public SDK) — M3 consolidates it into spt-daemon."

[dependencies]
spt-proto = { path = "../spt-proto" }
spt-store = { path = "../spt-store" }
spt-msg = { path = "../spt-msg" }
spt-runtime = { path = "../spt-runtime" }
serde = { version = "1", features = ["derive"] }

[dev-dependencies]
tempfile = "3"


File created successfully at: C:\Users\decid\Documents\projects\spt-core\crates\spt-live\Cargo.toml (file state is current in your context — no need to Read it back)

[package]
name = "spt-live"
version = "0.0.0"
edition = "2021"
publish = false
description = "spt-core live-agent lifecycle executor (M2b): the Psyche spawn/resume + history + echo-commune + drop-file ingest + signoff/boundary ordering seams that M2a's manifest only declared. Fifth layer; daemon-bound (NOT public SDK) — M3 consolidates it into spt-daemon."

[dependencies]
spt-proto = { path = "../spt-proto" }
spt-store = { path = "../spt-store" }
spt-msg = { path = "../spt-msg" }
spt-runtime = { path = "../spt-runtime" }
serde = { version = "1", features = ["derive"] }

[dev-dependencies]
tempfile = "3"


//! spt-core live-agent lifecycle executor (M2b).
//!
//! `spt-live` *executes* the lifecycle seams that `spt-runtime` (M2a) only
//! declared and parsed. It is the fifth layer in the acyclic stack
//! (`spt-proto -> spt-store -> spt-msg -> spt-runtime -> spt-live`); the `spt`
//! binary's `api listen` runner hosts it.
//!
//! Unlike `spt-runtime`, `spt-live` is **not** part of the public SDK surface
//! (R-ARCH-2 is proto/runtime/msg) — it is the daemon-bound executor M3
//! consolidates into `spt-daemon`. Keep every seam thin so that move is a
//! re-host, not a rewrite (mirror M2a's seed-file discipline).
//!
//! Subsystems land across M2b (see `M2b-PLAN.md`):
//! - **history** (T1, [`REQ-SEAM-HISTORY`]) — the three `[history]` strategies
//!   feeding the echo-commune + resume briefs.
//! - **spawn-psyche** (T2, `REQ-SEAM-PSYCHE`) — the nested `<id>-psyche` perch.
//! - **echo-commune** (T3) — the cheap-model brief consuming history.
//! - **drop-file ingest** (T4) — single-writer commune/signoff ingest (6.4/6.5).
//! - **pulse** (T5) — the interim heartbeat in the `api listen` runner.
//! - **signoff/boundary** (T6) — the orphan/grace ordering invariants (1.1/3.2/3.3).
//! - **resume** (T7, `REQ-SEAM-RESUME`) — fresh-with-preload + continue-existing.
//
// The interim no-daemon model holds (decision 2026-06-01): the Psyche is a real
// subprocess and the `api listen` process hosts the pulse/ingest loops. M3 moves
// both into the daemon. See `M2b-PLAN.md` §Interim-model note.


File created successfully at: C:\Users\decid\Documents\projects\spt-core\crates\spt-live\src\lib.rs (file state is current in your context — no need to Read it back)

//! spt-core live-agent lifecycle executor (M2b).
//!
//! `spt-live` *executes* the lifecycle seams that `spt-runtime` (M2a) only
//! declared and parsed. It is the fifth layer in the acyclic stack
//! (`spt-proto -> spt-store -> spt-msg -> spt-runtime -> spt-live`); the `spt`
//! binary's `api listen` runner hosts it.
//!
//! Unlike `spt-runtime`, `spt-live` is **not** part of the public SDK surface
//! (R-ARCH-2 is proto/runtime/msg) — it is the daemon-bound executor M3
//! consolidates into `spt-daemon`. Keep every seam thin so that move is a
//! re-host, not a rewrite (mirror M2a's seed-file discipline).
//!
//! Subsystems land across M2b (see `M2b-PLAN.md`):
//! - **history** (T1, [`REQ-SEAM-HISTORY`]) — the three `[history]` strategies
//!   feeding the echo-commune + resume briefs.
//! - **spawn-psyche** (T2, `REQ-SEAM-PSYCHE`) — the nested `<id>-psyche` perch.
//! - **echo-commune** (T3) — the cheap-model brief consuming history.
//! - **drop-file ingest** (T4) — single-writer commune/signoff ingest (6.4/6.5).
//! - **pulse** (T5) — the interim heartbeat in the `api listen` runner.
//! - **signoff/boundary** (T6) — the orphan/grace ordering invariants (1.1/3.2/3.3).
//! - **resume** (T7, `REQ-SEAM-RESUME`) — fresh-with-preload + continue-existing.
//
// The interim no-daemon model holds (decision 2026-06-01): the Psyche is a real
// subprocess and the `api listen` process hosts the pulse/ingest loops. M3 moves
// both into the daemon. See `M2b-PLAN.md` §Interim-model note.


Edit

# M2a adds spt-runtime (harness contract: manifest schema + AgentRuntime) — fourth layer.
[workspace]
resolver = "2"
members = ["crates/spt-proto", "crates/spt-store", "crates/spt-msg", "crates/spt-runtime", "crates/spt", "adapters/mock"]

# M2a adds spt-runtime (harness contract: manifest schema + AgentRuntime) — fourth layer.
# M2b adds spt-live (live-agent lifecycle executor) — fifth layer, daemon-bound (not public SDK).
[workspace]
resolver = "2"
members = ["crates/spt-proto", "crates/spt-store", "crates/spt-msg", "crates/spt-runtime", "crates/spt-live", "crates/spt", "adapters/mock"]


The file C:\Users\decid\Documents\projects\spt-core\Cargo.toml has been updated successfully. (file state is current in your context — no need to Read it back)

# M2a adds spt-runtime (harness contract: manifest schema + AgentRuntime) — fourth layer.
# M2b adds spt-live (live-agent lifecycle executor) — fifth layer, daemon-bound (not public SDK).
[workspace]
resolver = "2"
members = ["crates/spt-proto", "crates/spt-store", "crates/spt-msg", "crates/spt-runtime", "crates/spt-live", "crates/spt", "adapters/mock"]

# spt-core cargo workspace (M0). Acyclically-layered crates per R-ARCH-1:
#   spt-proto -> spt-store -> spt-msg -> {spt-net, spt-term, spt-runtime} -> spt-live -> spt-daemon -> spt
# M0 builds the bottom two: spt-proto (wire) + spt-store (persistence).
# M1 adds spt-msg (local messaging) — third layer, one-way above spt-store.
# M2a adds spt-runtime (harness contract: manifest schema + AgentRuntime) — fourth layer.
[workspace]
resolver = "2"
members = ["crates/spt-proto", "crates/spt-store", "crates/spt-msg", "crates/spt-runtime", "crates/spt", "adapters/mock"]

+# M2b adds spt-live (live-agent lifecycle executor) — fifth layer, daemon-bound (not public SDK).

-members = ["crates/spt-proto", "crates/spt-store", "crates/spt-msg", "crates/spt-runtime", "crates/spt", "adapters/mock"]

+members = ["crates/spt-proto", "crates/spt-store", "crates/spt-msg", "crates/spt-runtime", "crates/spt-live", "crates/spt", "adapters/mock"]


Build + verify scaffold compiles, then set up T0–T10 spine.


Bash

Build spt-live crate


ToolSearch

Question: select:TaskCreate,TaskUpdate


   Compiling spt-runtime v0.0.0 (C:\Users\decid\Documents\projects\spt-core\crates\spt-runtime)
   Compiling spt-live v0.0.0 (C:\Users\decid\Documents\projects\spt-core\crates\spt-live)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.58s


Question: select:TaskCreate,TaskUpdate


Compiles. Create T0–T10 spine + run `traceable-reqs check`.


Bash

Run traceable-reqs check


  [OK] REQ-START-3  required: []  stages: -doc -impl -unit -int
       spt-hosted startup: spawn-session then api bind (no file)
  [OK] REQ-START-4  required: [impl, unit]  stages: -doc +impl +unit -int
       Adapter-injected env aliases (SPT/OWL/LIVE)
  [OK] REQ-TERM-1  required: []  stages: -doc -impl -unit -int
       Process-supervisor terminal wrapper hosting broker PTYs
  [OK] REQ-TERM-2  required: []  stages: -doc -impl -unit -int
       session-surface abstraction; send-keys + send-line injection
  [OK] REQ-TERM-3  required: []  stages: -doc -impl -unit -int
       Byte-stream remote terminal streaming for v1
  [OK] REQ-UPD-1  required: []  stages: -doc -impl -unit -int
       Peer-propagated update over P2P
  [OK] REQ-UPD-2  required: []  stages: -doc -impl -unit -int
       All binaries signature-verified before handoff
  [OK] REQ-UPD-3  required: []  stages: -doc -impl -unit -int
       No endpoint process terminates/suspends during self-update
  [OK] REQ-UPD-4  required: []  stages: -doc -impl -unit -int
       Update gated on user confirmation by default; opt-in full-auto
  [OK] REQ-UPD-5  required: []  stages: -doc -impl -unit -int
       spt-core ripple-updates registered adapters


TaskCreate

T0 — Scaffold spt-live crate

Add crates/spt-live (deps spt-proto/store/msg/runtime + serde); add to workspace members; acyclic layering …→spt-runtime→spt-live; check green.