# Roadmap: Owl Skill

## Milestones

- [x] **v1.0 Live Agent System** - Phases 1-4 (shipped 2026-03-29)
- [x] **v1.1 Native Runtime** - Phases 5-9 (shipped 2026-03-30)
- [x] **v1.5 Spacetime** - Phases 10-14 (shipped 2026-04-08)
- [x] **v1.6 MCP Fabric** - Phases 15-18 (shipped 2026-04-13; rolling 18.x sub-iterations off-roadmap)
- [ ] **v1.7 Seamlessification** - Phases 26-29 (planned; sequenced before v1.8/v1.9 despite higher phase numbers — promoted from backlog/todos 2026-05-10)
- [ ] **v1.8 Psyche Restructure** - Phases 23-25 (planned; sequenced before v1.9 despite higher phase numbers — promoted from backlog/todos 2026-05-10)
- [ ] **v1.9 Capsule** - Phases 19-22 (planned)

## Off-Roadmap Sub-Iterations Policy

**Phases 18.1–18.8.x are intentional off-roadmap sub-iterations.** They are tactical follow-ons to Phase 18 (bug fixes, refactors, observability deltas, transport pivots) and are NOT tracked against milestone completion. Each sub-iteration is a self-contained phase directory under `.planning/phases/18.N(.M)-*/` with its own PLAN/SUMMARY/UAT/SECURITY artifacts. They ship independently via `DEPLOY.ps1` version bumps.

ROADMAP.md tracks only **milestone-defining phases** (integer phase numbers and INSERTED `.M` decimals at planning time). Reconciliation rules:

- v1.6 milestone is sealed at Phase 18.
- 18.x sub-iterations live in their phase directories; `roadmap.analyze` reports v1.6 at 100% even when sub-iterations are in flight.
- 999.x phases are backlog placeholders (see Backlog section); promote via `/gsd-review-backlog` when scheduling into a future milestone.

## Phases

<details>
<summary>v1.0 Live Agent System (Phases 1-4) - SHIPPED 2026-03-29</summary>

**Phase Numbering:**
- Integer phases (1, 2, 3): Planned milestone work
- Decimal phases (2.1, 2.2): Urgent insertions (marked with INSERTED)

Decimal phases appear between their surrounding integers in numeric order.

- [x] **Phase 1: Foundation & Hardening** - Harden owl.sh messaging, add output formatting and auto-setup, scaffold live.sh with Self registration
- [x] **Phase 2: Psyche Core** - Psyche spawn, COMMUNE/PULSE cycle, graceful stop, and SKILL.md documentation (completed 2026-03-28)
- [x] **Phase 2.1: Live Skill Extraction** (INSERTED) - Extract /live into standalone LIVE-SKILL.md
- [x] **Phase 2.2: Owl & Live Hardening** (INSERTED) - Signal-based lifecycle, BUSY state, Psyche persistence, restart shortcuts
- [x] **Phase 3: Timed Pulses** - Deferred to v1.1 as Phase 8
- [x] **Phase 4: Spine Supervisor** - Deferred to v1.1 as Phase 9

### Phase 1: Foundation & Hardening
**Goal**: Agents have a robust, race-free messaging layer with consistent output, automatic environment setup, and a working live.sh scaffold that registers Self agents
**Depends on**: Nothing (first phase)
**Requirements**: HARD-01, HARD-02, HARD-03, FMT-01, FMT-02, FMT-03, SETUP-01, SETUP-02, SETUP-03, LIVE-02, LIVE-08, LIVE-10
**Success Criteria** (what must be TRUE):
  1. Messages are delivered atomically -- a concurrent reader never sees a partial message file
  2. Two agents sending messages in rapid succession never produce filename collisions
  3. All /owl and /live output uses ANSI colors and compact symbols (no emoji), and /owl output is visually distinct from /live output
  4. Running /owl or /live for the first time on a clean machine auto-adds required env vars and session cleanup hook to settings.json (with user notification)
  5. `/live list` shows Self agents marked as live; all existing `/owl` commands work unchanged
**Plans:** 3/3 plans complete

Plans:
- [x] 01-01-PLAN.md -- Harden owl.sh (atomic writes, collision-resistant IDs, TOCTOU-safe poll) and add ANSI color output
- [x] 01-02-PLAN.md -- Auto-setup settings.json (env vars, SessionEnd hook) and session-scoped cleanup
- [x] 01-03-PLAN.md -- Scaffold live.sh (Self registration, /live list) and update SKILL.md

### Phase 2: Psyche Core
**Goal**: A user can start a live agent session and receive contextual, periodic nudges from a background Psyche that tracks what they are doing
**Depends on**: Phase 1
**Requirements**: LIVE-01, LIVE-03, LIVE-04, LIVE-05, LIVE-06, LIVE-07, LIVE-09, LIVE-11, SKILL-01, SKILL-02, SKILL-03
**Success Criteria** (what must be TRUE):
  1. `/live [id]` starts an owl listener with Self role and spawns a Psyche subagent that begins its pulse loop
  2. Self sends COMMUNE updates that Psyche absorbs into context; when a pulse timer fires, Psyche judges whether Self should be doing something and notifies Self if so
  3. When Self stops, its Psyche is also torn down with no orphaned processes or perch files
  4. Pulse period is configurable via `--period` flag (minimum 1 minute)
  5. SKILL.md documents all /live subcommands, auto-setup behavior, and edge cases with the same depth as /owl
**Plans:** 3/3 plans complete

Plans:
- [x] 02-01-PLAN.md -- owl.sh extensions (--psyche flag, auto-setup poll, list filtering) and live.sh subcommands (commune, pulse-wait, enhanced start/stop, --period)
- [x] 02-02-PLAN.md -- psyche.md agent prompt template and DEPLOY.md update
- [x] 02-03-PLAN.md -- SKILL.md full /live documentation rewrite with ID recollection and edge cases

### Phase 2.1: Live Skill Extraction (INSERTED)
**Goal**: /live is a standalone Claude Code skill with its own SKILL.md, separate from /owl, matching the design in SKILL_SPEC-LIVE.md
**Requirements**: EXTRACT-01, EXTRACT-02, EXTRACT-03, EXTRACT-04
**Depends on:** Phase 2
**Success Criteria** (what must be TRUE):
  1. LIVE-SKILL.md exists as a standalone skill file with `name: live` frontmatter
  2. SKILL.md contains only /owl commands with no /live content
  3. Both skill files cross-reference each other
  4. DEPLOY.md includes LIVE-SKILL.md in all file operations
**Plans:** 1/1 plans complete

Plans:
- [x] 02.1-01-PLAN.md -- Extract /live documentation into standalone LIVE-SKILL.md, trim owl SKILL.md, update DEPLOY.md

### Phase 2.2: Owl & Live Hardening (INSERTED)
**Goal**: Harden owl.sh and live.sh with race condition fixes, signal-based lifecycle management, skill setup tooling, listener intelligence, Psyche persistence, session auto-resume, and restart shortcuts
**Requirements**: HARDEN-01, HARDEN-02, HARDEN-03, HARDEN-04, HARDEN-05, HARDEN-06, HARDEN-07, HARDEN-08, HARDEN-09, HARDEN-10
**Depends on:** Phase 2.1
**Success Criteria** (what must be TRUE):
  1. GC never cleans up a perch that is between polls (BUSY PID state protects the re-poll gap)
  2. Poll processes exit gracefully on signal with status output, and stop commands use graceful-then-force shutdown
  3. SKILL.md instructs listeners to name subagents and check background tasks before processing messages
  4. Psyche context persists across agent death and can be downloaded by a revived Psyche
  5. SessionStart hook auto-detects dead listeners and outputs resume instructions
  6. One-command restart shortcuts exist for both owl listeners and live agents
**Plans:** 4/4 plans complete

Plans:
- [x] 02.2-01-PLAN.md -- BUSY PID state in _poll_once + signal traps in poll + signal-based stop
- [x] 02.2-02-PLAN.md -- /owl gsd-setup command + SKILL.md listener intelligence instructions
- [x] 02.2-03-PLAN.md -- Psyche context persistence (context-save, psyche-download, clear-psyche)
- [x] 02.2-04-PLAN.md -- Restart shortcuts (reboot, revive) + stash + SessionStart auto-resume

</details>

<details>
<summary>v1.1 Native Runtime (Phases 5-9) - SHIPPED 2026-03-30</summary>

- [x] **Phase 5: Golden Tests & CLI Skeleton** - Capture bash output as golden tests, build CLI skeleton with clap, set up cross-platform CI
- [x] **Phase 6: P2P Messaging & Owl Parity** - P2P local-server architecture with SQLite spool, all owl subcommands passing golden tests
- [x] **Phase 7: Live Parity & Distribution** - Live subcommands with native Psyche wrapper loop, drop-in binary distribution
- [x] **Phase 8: Timed Pulses** - One-shot timed pulse requests and /live timed-pulse command (native)
- [x] **Phase 9: Spine Supervisor** - Spine/Touch process supervision with health checks and recovery (native)
- [x] **Phase 9.1: Psyche Lifecycle Hardening** (INSERTED) - Git-backed context, orphan detection, signoff, bash deprecation
- [x] **Phase 9.2: Psyche Messaging Discipline** (INSERTED) - Psyche and commune prompt rewrites for strict messaging discipline

### Phase 5: Golden Tests & CLI Skeleton
**Goal**: Every bash subcommand's exact output is captured as a golden test, and a compiled Rust binary parses all subcommands (stubbed) and builds on all target platforms
**Depends on**: Phase 4 (v1.0 complete)
**Requirements**: COMPAT-01, COMPAT-02, COMPAT-03, COMPAT-04, COMPAT-05, COMPAT-06, RUST-02, RUST-03
**Plans:** 3/3 plans complete

Plans:
- [x] 05-01-PLAN.md -- Golden test capture script and fixture generation from bash scripts
- [x] 05-02-PLAN.md -- Rust CLI skeleton with clap derive structs and parse verification tests
- [x] 05-03-PLAN.md -- Golden test Rust integration tests and cross-platform CI workflow

### Phase 6: P2P Messaging & Owl Parity
**Goal**: Agents communicate via direct local-server connections with SQLite offline spool, and every owl subcommand passes its golden test
**Depends on**: Phase 5
**Requirements**: RUST-01, RUST-04, P2P-01, P2P-02, P2P-03, P2P-04, P2P-05, P2P-06, P2P-07, P2P-08, OWL-01, OWL-02, OWL-03, OWL-04, OWL-05, OWL-06, OWL-07, OWL-08, OWL-09, OWL-10, OWL-11, OWL-12, PROC-01, PROC-02, PROC-03, PROC-04, PROC-05
**Plans:** 6/6 plans complete

Plans:
- [x] 06-01-PLAN.md -- Project restructure, dependencies, and common utility modules
- [x] 06-02-PLAN.md -- P2P infrastructure: SQLite registry, per-perch spool, TCP protocol, process management
- [x] 06-03-PLAN.md -- Filesystem owl subcommands: setup, list, stop, cleanup-session
- [x] 06-04-PLAN.md -- Core P2P messaging subcommands: poll, deliver, reply, send
- [x] 06-05-PLAN.md -- Lifecycle subcommands: reboot, stash, session-resume, gsd-setup
- [x] 06-06-PLAN.md -- Integration wiring, native tests, golden test pass, and verification

### Phase 7: Live Parity & Distribution
**Goal**: All live subcommands work natively with the Psyche wrapper loop ported to Rust, and the binary is a copy-one-file drop-in replacement
**Depends on**: Phase 6
**Requirements**: LIVE-12, LIVE-13, LIVE-14, LIVE-15, LIVE-16, LIVE-17, LIVE-18, LIVE-19, LIVE-20, DIST-01, DIST-02, DIST-03, DIST-04
**Plans:** 4/4 plans complete

Plans:
- [x] 07-01-PLAN.md -- Simple filesystem live subcommands
- [x] 07-02-PLAN.md -- Process management subcommands (stop, revive)
- [x] 07-03-PLAN.md -- Start subcommand with Psyche wrapper loop and generation tracking
- [x] 07-04-PLAN.md -- Golden test verification and distribution

### Phase 8: Timed Pulses
**Goal**: A user or agent can schedule a one-shot reminder at a specific future time, delivered as a pulse through the native binary
**Depends on**: Phase 7
**Requirements**: TPULSE-01, TPULSE-02, TPULSE-03
**Plans:** 2/2 plans complete

Plans:
- [x] 08-01-PLAN.md -- Rust implementation: timed_pulse.rs, timed_pulse_wait.rs, cli.rs wiring
- [x] 08-02-PLAN.md -- psyche.md PULSE REQUEST handling section

### Phase 9: Spine Supervisor
**Goal**: Users running multiple live agents have a supervision layer that detects dead Psyches and notifies the affected Self for recovery
**Depends on**: Phase 7
**Requirements**: SPINE-01, SPINE-02, SPINE-03, SPINE-04, SPINE-05, SPINE-06, SPINE-07, SPINE-08, SPINE-09
**Plans:** 3/3 plans complete

Plans:
- [x] 09-01-PLAN.md -- InfoJson spine/touch fields, list filters, CLI scaffolding
- [x] 09-02-PLAN.md -- Spine wrapper loop and Touch health-check scanner
- [x] 09-03-PLAN.md -- Dispatch wiring and stop --all teardown

### Phase 9.1: Psyche Lifecycle Hardening (INSERTED)
**Goal**: Harden Psyche lifecycle with git-backed context history, orphan detection, timed pulse persistence, and intelligent SessionStart skill injection. Replace stash with signoff. Remove all bash script dependencies.
**Depends on**: Phase 9
**Requirements**: D-01..D-17 (Phase 9.1 discipline requirements)
**Plans:** 4/4 plans complete

Plans:
- [x] 09.1-01-PLAN.md -- parent_pid in InfoJson + git-backed context-save
- [x] 09.1-02-PLAN.md -- Stash-to-signoff rename with STASH_FINAL delivery
- [x] 09.1-03-PLAN.md -- Wrapper loop hardening + SessionStart Part C
- [x] 09.1-04-PLAN.md -- Bash deprecation: skill file cleanup, delete bash scripts

### Phase 9.2: Psyche Messaging Discipline (INSERTED)
**Goal**: Full rewrite of Psyche instructions (psyche.md) and extraction/rewrite of Self commune instructions for strict messaging discipline.
**Depends on**: Phase 9
**Requirements**: D-01..D-14 (Phase 9.2 discipline requirements)
**Plans:** 2/2 plans complete

Plans:
- [x] 09.2-01-PLAN.md -- psyche.md XML rewrite with strict messaging discipline
- [x] 09.2-02-PLAN.md -- commune.md extraction from LIVE-SKILL.md

</details>

<details>
<summary>v1.5 Spacetime (Phases 10-14) - SHIPPED 2026-04-08</summary>

- [x] **Phase 10: Plugin Migration** - Migrate owl+live to /spt plugin architecture (completed 2026-04-01)
- [x] **Phase 11: Foundation** - PDT timestamps and Psyche wrapper logging overhaul (completed 2026-04-02)
- [x] **Phase 12: Psyche Intelligence** - Memformat, brainstorming, INSIGHT messages (completed 2026-04-03)
- [x] **Phase 13: Messaging Integration** - Hook-based delivery, SubagentStart/Stop working perches (completed 2026-04-03)
- [x] **Phase 13.1: Unified Psyche Wrapper Event Loop** (INSERTED) - Shared PollListener, inline pulse scheduling (completed 2026-04-04)
- [x] **Phase 14: Poll Efficiency** - Blocking TCP accept with timeout (completed 2026-04-04)
- [x] **Phase 14.1: Persistent Offline Perches** (INSERTED) - Persistent perches, indefinite queueing, reconnection (completed 2026-04-08)
- [x] **Phase 14.2: Spacetime Reliability & DX** (INSERTED) - PerchState enum, spacetime filesystem, wrapper decomposition, owl doctor (completed 2026-04-06)
- [x] **Phase 14.3: Optional Agent ID** (INSERTED) - Session detection, optional caller ID, skill doc rewrite (completed 2026-04-07)

</details>

### v1.6 MCP Fabric (SHIPPED 2026-04-13)

**Milestone Goal:** Add an MCP server transport layer to spacetime messaging -- structured resources and tools that delegate to existing Rust core, with unified spool persistence and minimal-token wake signals.

> **Note:** MCP transport was deprioritized post-ship in favor of CLI-first model (see `feedback_mcp_performance.md`). Phase 18.1+ sub-iterations refactor away from MCP-centric flows. The milestone is sealed; sub-iterations are tracked off-roadmap (see "Off-Roadmap Sub-Iterations Policy" above).

- [x] **Phase 15: MCP Spike & Spool Foundations** - Validate hand-rolled JSON-RPC with Claude Code, extend spool with delivered marking, build core result variants (completed 2026-04-11)
- [x] **Phase 16: MCP Tools** - All spacetime tools wired to result variants with proper schemas and annotations (completed 2026-04-12)
- [x] **Phase 17: MCP Resources** - Inbox, perches, psyches, context, memformat resources with check-on-request notifications (completed 2026-04-13)
- [x] **Phase 18: Hooks & Plugin Integration** - Spool-based hook delivery, wake-sentinel detection, plugin manifest, skill doc rewrite (completed 2026-04-13)

## Phase Details

### Phase 15: MCP Spike & Spool Foundations
**Goal**: The hand-rolled MCP server connects to Claude Code and responds to tool/resource requests, the spool supports non-destructive reads with delivery marking, and core owl operations return structured results instead of printing and exiting
**Depends on**: Phase 14.3 (v1.5 complete)
**Requirements**: MCP-01, MCP-02, MCP-03, MCP-04, MCP-05, SPOOL-01, SPOOL-02, SPOOL-03, SPOOL-04, SPOOL-05, RVAR-01, RVAR-02, RVAR-03, RVAR-04, RVAR-05, RVAR-10, RVAR-11
**Success Criteria** (what must be TRUE):
  1. Running `owl mcp-serve` starts a stdio server that completes the MCP initialize handshake with Claude Code and responds to ping -- proving the hand-rolled JSON-RPC approach works with the real client
  2. The spool supports peek_all() (non-destructive read of undelivered messages) and mark_delivered() (atomic delivery marking) without breaking existing drain_all() behavior
  3. TCP-received messages are written to spool before the wake signal is printed, making spool the single source of truth for message arrival
  4. deliver_result(), send_result(), list_result(), stop_result(), doctor_result(), and whoami_result() return structured Result types -- none of them print to stdout or call process::exit()
  5. The MCP server exits cleanly when its parent process dies (parent_pid watchdog) and handles EOF on stdin gracefully
**Plans:** 5/5 plans complete

Plans:
- [x] 15-01-PLAN.md -- Spool unification: delivered column, peek_all, mark_delivered, drain migration, spool-before-signal
- [x] 15-02-PLAN.md -- MCP server foundation: JSON-RPC types, dispatch, stdio loop, watchdog, CLI wiring
- [x] 15-03-PLAN.md -- Result variants: outcomes module, deliver_result, send_result, whoami_result
- [x] 15-04-PLAN.md -- Result variants: list_result, stop_result, doctor_result, integration tests
- [x] 15-05-PLAN.md -- Gap closure: spool unit tests (9 tests for peek_all, mark_delivered, drain migration, pending_count, schema migration)

### Phase 16: MCP Tools
**Goal**: Agents in Claude Code sessions can perform all spacetime operations through MCP tools with structured JSON results, proper permission annotations, and consistent error handling
**Depends on**: Phase 15
**Requirements**: TOOL-01, TOOL-02, TOOL-03, TOOL-04, TOOL-05, TOOL-06, TOOL-07, TOOL-08, TOOL-09, TOOL-10, TOOL-11, TOOL-12, TOOL-13, TOOL-14, TOOL-15, RVAR-06, RVAR-07, RVAR-08, RVAR-09
**Success Criteria** (what must be TRUE):
  1. An agent can send a message to another perch via `spacetime_send` and receive a structured JSON result indicating delivery success, spool queuing, or failure -- without any stderr output leaking into the MCP channel
  2. `spacetime_listen` and `spacetime_live_start` bind the MCP server to an agent_id as a side-effect, and all subsequent tool calls operate in that identity context
  3. All 13 tools appear in `tools/list` with complete inputSchema definitions and correct annotations (readOnlyHint on list/whoami/doctor, destructiveHint on stop/signoff)
  4. Tool errors return isError: true with a structured {success: false, error: "..."} body instead of crashing the MCP server
**Plans:** 4/4 plans complete

Plans:
- [x] 16-01-PLAN.md -- Command rename: deliver->send, send->ring, reply folded into send --reply-to
- [x] 16-02-PLAN.md -- Live result variants: commune, stop, timed_pulse, context_save, signoff, amend_signoff + list filter extension
- [x] 16-03-PLAN.md -- MCP tool registry (13 tools), tools/list dispatch, tools/call for read-only tools
- [x] 16-04-PLAN.md -- MCP tools/call for action+live tools, identity binding, lazy-bind, error handling

### Phase 17: MCP Resources
**Goal**: Agents can read inbox contents, discover perches, and access Psyche state through MCP resources without draining messages or triggering side effects
**Depends on**: Phase 16
**Requirements**: RES-01, RES-02, RES-03, RES-04, RES-05, RES-06, RES-07, RES-08
**Success Criteria** (what must be TRUE):
  1. An agent can read `spt://inbox` to see undelivered messages as plain text with ANSI formatting -- reading auto-marks all returned messages as delivered (resource read = intentional read = delivered, no separate tool call needed)
  2. `spt://perches` returns all registered perches with online/offline status, and `spt://psyches` returns Psyche processes with their current status
  3. `spt://context` and `spt://memformat` return the bound agent's persisted Psyche state files as text content (optional undocumented `/{id}` suffix for cross-agent reads)
  4. The server emits `notifications/resources/updated` inline before each request dispatch when subscribed resources have changed since the last check (future-proofing for subscription support)
**Plans:** 2/2 plans complete

Plans:
- [x] 17-01-PLAN.md -- Resource definitions (5 spt:// URIs), read handlers, dispatch wiring
- [x] 17-02-PLAN.md -- Change detection tracker and notifications/resources/updated emission

### Phase 18: Hooks & Plugin Integration
**Goal**: Hooks use spool as their message source with MCP-aware behavior, the plugin manifest declares the MCP server, skill docs teach agents when to use MCP vs CLI, and sessions recover context after /clear and /compact
**Depends on**: Phase 17
**Requirements**: HOOK-01, HOOK-02, HOOK-03, HOOK-04, HOOK-05, HOOK-06, PLUG-01, PLUG-02, PLUG-03, PLUG-04, PLUG-05, PLUG-06, PLUG-07
**Success Criteria** (what must be TRUE):
  1. PreToolUse hook reads messages from spool via peek_all() and marks them delivered after injecting into additionalContext -- no more filesystem inbox scanning
  2. UserPromptSubmit hook injects "N new messages -- read spacetime://inbox/{id}" when unread messages exist, and detects wake-sentinel prompts (`.`, `spt-wake`) to inject read-inbox-first instructions
  3. The plugin manifest declares `owl mcp-serve` as a stdio MCP server entry, and `.mcp-connected` sentinel on the perch signals hooks to adjust behavior (e.g., reference MCP resources in additionalContext instead of full content)
  4. SessionStart hook injects MCP re-orientation context on `source: "clear"` and `source: "compact"` -- agent_id, available resources, inbox check instruction
  5. Skill docs (SKILL.md, LIVE-SKILL.md, commune.md) clearly distinguish when agents should use MCP tools (interactive Claude Code sessions) vs CLI ($OWL/$LIVE for scripts, cron, Psyche)
**Plans:** 2/2 plans complete

Plans:
- [x] 18-01-PLAN.md -- Hook spool migration (PreToolUse peek_all, wake sentinels, SessionStart reorientation)
- [x] 18-02-PLAN.md -- Plugin manifest (.mcp.json), skill doc retirement and MCP-first rewrite, DEPLOY.md update

### Planned: v1.9 Capsule

**Milestone Goal:** Replace poll-task-restart with seamless psmux-based message injection for capsule sessions, establishing a modular sendkeys pipeline for future capabilities.

- [ ] **Phase 19: Sendkeys Foundation & Capsule Launch** - PsmuxSendkeys module, capsule.exe binary, capsule.bat launcher, build-capsule skill
- [ ] **Phase 20: Session Detection & Capsule Listener** - SessionStart hook capsule detection, per-session listener with sendkeys delivery and hook fallback
- [ ] **Phase 21: Abrupt Messages** - ESC interrupt injection with timing-safe delivery for busy agents
- [ ] **Phase 22: Smart Capabilities** - Rename, GSD proceed, and spacetime debugging via sendkeys

### Off-Roadmap Sub-Iterations of Phase 18

> Detailed PLAN/SUMMARY/UAT/SECURITY artifacts live under `.planning/phases/18.*-*/`. Listed here for index only — not tracked in v1.6 milestone totals.

| Sub-Phase | Goal (one-liner) | Status | Completed |
|-----------|------------------|--------|-----------|
| 18.1 | Deferred delivery, TCP spool timeout, parent_pid orphan detection, PULSE_TRIGGER 3-tier recovery, daily Psyche refresh, marker protocol, echo-commune | Complete | 2026-04-14 |
| 18.2 | Relocate spt runtime out of `~/.claude` to `%LOCALAPPDATA%\spt` / `~/.spt` (`SPT_HOME` override) | Complete | 2026-04-15 |
| 18.3 | Echo-commune time gating via `.more-done` sentinel + 15-min wrapper window | Complete | 2026-04-18 |
| 18.4 | Seamless binary handoff for long-running spt processes (listener, wrapper, touch) on plugin update | Complete | 2026-04-18 |
| 18.5 | Handoff bug fixes: listener argv, DUPLICATE bypass, wrapper inner-poll preempt | Complete | 2026-04-19 |
| 18.6 | Refactor scheduled pulses — wrapper drives, Self receives, Psyche passive-aware | Complete | 2026-04-19 |
| 18.7 | Relocate timed-pulse firing to Self listener; rename skill `timed-pulse` → `new-alarm` | Complete | 2026-04-20 |
| 18.7.1 | Hotfix: mid-iteration alarm fire regression in Self listener | Complete | 2026-04-20 |
| 18.8 | echo-commune stderr capture (no retry-on-empty) + refactor to fresh-session jsonl excerpt | Complete | 2026-04-21 |
| 18.8.1 | ccs-aware projects path + excerpt ENOENT observability + info.json session rotation refresh | Complete | 2026-05-09 |

### Phase 19: Sendkeys Foundation & Capsule Launch
**Goal**: The sendkeys pipeline is proven reliable and the capsule launcher creates working psmux sessions with skeleton perches
**Depends on**: Phase 18 (v1.6 complete)
**Requirements**: SKEY-01, SKEY-02, SKEY-03, CLNCH-01, CLNCH-02, CLNCH-03, CLNCH-04, CLNCH-05, CLNCH-06, CLNCH-07, CLNCH-08, CLNCH-09, CLNCH-10, CLSTN-05
**Success Criteria** (what must be TRUE):
  1. User can run `/spt:build-capsule` which downloads psmux.exe and generates a project-local capsule.bat
  2. Running capsule.bat with a REQUIRED agent_id launches a psmux session containing claude, creates a skeleton perch with agent_id and PID, spawns a capsule listener process, then attaches the user to the psmux session. Terminal title is set to agent_id before attach, and a historical stdout message ("Now launching..." or "Reactivating...") with cc_session_id (and psyche_session_id if live) is printed before psmux attach.
  3. PsmuxSendkeys module can deliver arbitrary text (including special characters, newlines, quotes) to a named psmux session via send-keys literal mode
  4. Message framing format is visually distinguishable from user-typed input in the terminal
  5. Agent can stop and restart capsule listeners (and optionally psyches) from within a session without tearing down claude/psmux -- enabling build->deploy->restart iteration loops
  6. `--resume <agent_id>` resolves to the latest cc_session_id stored against that agent_id and passes it to claude; raw cc session IDs are not accepted
  7. psmux sessions launched via capsule use augmented styling (PowerShell-like highlight, cleaner status bar) from a config file stored in `.claude/`
**Plans:** 4 plans

Plans:
- [ ] 19-01-PLAN.md -- Foundation primitives: PsmuxSendkeys module, PerchState::Capsule, WAKE_SENTINEL_PREFIX const, bin_dir() helper, id_validate
- [ ] 19-02-PLAN.md -- `owl capsule` and `owl capsule-listen` subcommands (poll.rs fork + sendkeys delivery + claude PID watch)
- [ ] 19-03-PLAN.md -- `owl build-capsule` + `/spt:build-capsule` skill + capsule.bat/psmux.conf templates + psmux download with SHA256 verification
- [ ] 19-04-PLAN.md -- E2E integration tests + ROADMAP amendments + requirement back-fill + plugin version bump 1.9.0 + deploy

### Phase 20: Session Detection & Capsule Listener
**Goal**: Capsule sessions are automatically recognized and messages are delivered via sendkeys when idle or respooled to inbox when busy
**Depends on**: Phase 19
**Requirements**: SDET-01, SDET-02, CLSTN-01, CLSTN-02, CLSTN-03, CLSTN-04, SKEY-04
**Success Criteria** (what must be TRUE):
  1. When a capsule session starts, the SessionStart hook detects the skeleton perch and informs the agent of its agent_id, capsule role, and perch location
  2. The capsule listener delivers incoming messages via psmux sendkeys when the agent is idle (`.idle-ready` present)
  3. When the agent is busy (no `.idle-ready`), messages are respooled to the file inbox for delivery via the existing hook path
  4. When the claude process dies, the capsule listener tears down cleanly (including Psyche signoff for live sessions) with no orphaned processes
  5. When a message is injected while the user has partially typed input, the partial text is preserved and restored after injection
**Plans:** 2 plans

Plans:
- [ ] 17-01-PLAN.md -- Resource definitions (5 spt:// URIs), read handlers, dispatch wiring
- [ ] 17-02-PLAN.md -- Change detection tracker and notifications/resources/updated emission

### Phase 21: Abrupt Messages
**Goal**: Users can force-interrupt a busy capsule agent and inject a message immediately
**Depends on**: Phase 20
**Requirements**: ABRT-01, ABRT-02, ABRT-03
**Success Criteria** (what must be TRUE):
  1. Sending a message with `--abrupt` to a capsule agent interrupts the agent via ESC sendkeys, then injects the message
  2. Any queued messages waiting at the time of interruption are delivered via sendkeys after the abrupt message (not via hooks)
  3. Abrupt delivery includes readiness polling to avoid corrupted input from premature injection
**Plans:** 2 plans

Plans:
- [ ] 17-01-PLAN.md -- Resource definitions (5 spt:// URIs), read handlers, dispatch wiring
- [ ] 17-02-PLAN.md -- Change detection tracker and notifications/resources/updated emission

### Phase 22: Smart Capabilities
**Goal**: Capsule sessions support automated rename, GSD workflow advancement, and spacetime debugging
**Depends on**: Phase 20
**Requirements**: CCAP-01, CCAP-02, CCAP-03
**Success Criteria** (what must be TRUE):
  1. When a capsule session starts, the listener automatically renames the session to the agent_id via `/rename` sendkeys
  2. When a GSD-running agent completes a plan, the Stop hook fires `/clear` followed by the next GSD command via sendkeys -- avoiding a full context reload
  3. An agent can invoke `$OWL capsule-reload-plugins` which triggers `/reload-plugins` via sendkeys in its own session
**Plans:** 2 plans

Plans:
- [ ] 17-01-PLAN.md -- Resource definitions (5 spt:// URIs), read handlers, dispatch wiring
- [ ] 17-02-PLAN.md -- Change detection tracker and notifications/resources/updated emission

### Phase 23: Commune & Signoff Project-Root + HEAD SHA Stamping
**Goal**: Every commune and signoff payload records `project_root` and `HEAD` SHA so resumed agents can compute staleness and detect repo/working-tree changes since last activity
**Milestone**: v1.8 Psyche Restructure
**Depends on**: Nothing (pure metadata addition)
**Promoted from**: `.planning/todos/done/2026-04-18-track-project-root-and-latest-commit-in-commune-and-amend-si.md`
**Requirements**: TBD (PROJ-META-01, COMMIT-META-01, RESUME-DELTA-01)
**Success Criteria** (what must be TRUE):
  1. Every commune payload includes `project_root` (cwd / project identifier) and `head_sha` (+ subject line)
  2. Every amend-signoff context save includes the same fields
  3. On `psyche-download` / resume, fields are surfaced so Self can compare stored `head_sha` vs current `HEAD` and detect drift
  4. Commune/signoff still works when not in a git repo (fields gracefully omit or note "not a repo")
**Plans:** TBD plans

Plans:
- [ ] TBD — discuss-phase to break down

### Phase 24: Tracked-Dir Per-Agent Layout + Sessions Audit Log
**Goal**: `psyches/tracked/` is grouped by `<self_id>/` and each generation maintains an append-only sessions audit log of every fresh `claude -p` spawn (UUID, timestamp, generation, trigger reason)
**Milestone**: v1.8 Psyche Restructure
**Depends on**: Phase 23 (helpful but not strict — independent in code)
**Promoted from**: `.planning/todos/done/2026-04-18-organize-psyches-tracked-by-agent-and-add-psyche-sessions-fi.md`
**Requirements**: TBD (TRK-LAYOUT-01, SESSIONS-LOG-01, SESSIONS-LOG-02, GEN-ROLLOVER-01)
**Success Criteria** (what must be TRUE):
  1. `spt/psyches/tracked/<self_id>/<file>` is the canonical layout (helpers in `src/common/owlery.rs`, `src/live/start.rs`, `src/owl/doctor.rs` updated)
  2. Wrapper appends to `tracked/<self_id>/sessions-<gen>.log` on every fresh `claude -p` (no `--resume`) with: timestamp, session UUID, generation, trigger reason
  3. `/spt:revive` (and any new-generation event) seals prior log and starts a new one
  4. Existing flat-layout files migrate or coexist as legacy without breaking listings
  5. `$LIVE doctor` recognizes the new layout
**Plans:** TBD plans

Plans:
- [ ] TBD — discuss-phase to break down

### Phase 25: Psyche Org Rework — Perch Nesting + General/Project Context Split
**Goal**: Psyche perch dir nests inside Self perch dir; `psyches/tracked/<self_id>/` holds `memformat.xml`, `psyche-wrapper.log`, `general.md` (cross-project Self summary), and `proj-{project}.md` (per-project records). `$LIVE psyche-download` auto-detects cwd project and concats `memformat.xml + general.md + proj-{project}.md`.
**Milestone**: v1.8 Psyche Restructure
**Depends on**: Phase 24 (per-agent dir grouping is the foundation)
**Promoted from**: ROADMAP backlog Phase 999.1
**Requirements**: TBD (NEST-PERCH-01, CTX-SPLIT-01, DOWNLOAD-CWD-01, MIGRATE-01)
**Success Criteria** (what must be TRUE):
  1. Psyche perch directory is created inside Self perch directory (nested layout)
  2. Within `psyches/tracked/<self_id>/`: `memformat.xml`, `psyche-wrapper.log`, `general.md`, and one or more `proj-{project_name}.md` files
  3. Commune/signoff context writes route to the project-scoped file based on cwd
  4. `$LIVE psyche-download` auto-detects cwd project and outputs `memformat + general + proj-{project}` concat
  5. Migration path covers existing flat context records (move or note as legacy)
  6. Doctor + listing tooling understands the new layout
**Plans:** TBD plans

Plans:
- [ ] TBD — discuss-phase to break down

### Phase 26: `/spt:live` Skill — Auto-Pick + Interactive Agent Picker
**Goal**: `/spt:live` invocation without an explicit agent_id picks intelligently — auto-launches the only agent in repo history if exactly one exists; otherwise asks the user via `AskUserQuestion` with the top 3 most-recently-active agents as discrete options, full agent list shown in the question body, and a free-text "Type something else" field for any other agent name (existing or brand-new).
**Milestone**: v1.7 Seamlessification
**Depends on**: Nothing (skill-layer + thin owl-side helper)
**Requirements**: TBD (LIVE-PICK-01, LIVE-PICK-02, LIVE-PICK-03, LIVE-PICK-04)
**Success Criteria** (what must be TRUE):
  1. `/spt:live` (no arg) with exactly 1 agent in this repo's history auto-launches that agent and reports the pick
  2. `/spt:live` (no arg) with 0 or 2+ agents in repo history fires `AskUserQuestion`:
     - Question body lists ALL agent names known for this repo
     - Top 3 most-recently-active agent names appear as distinct options
     - User can pick a listed option, type any other known agent name into the free-text field, or type a brand-new agent name to init it
  3. "Repo history" is well-defined (e.g. agents whose perch info.json shows cwd / git-root matching current); helper exposed via `$LIVE` for the skill to consume
  4. "Most-recently-active" sort key documented (perch info.json mtime / last commune timestamp / last poll)
  5. Skill behavior remains backward-compatible when arg is supplied (current path unchanged)
**Plans:** 6/6 plans complete (26-06 added post-UAT for gap closure)

Plans:
- [x] 26-01 — Foundations (cwd field, schema v2, helpers, relative_time)
- [x] 26-02 — Activity bumps wired (5 D2 sites)
- [x] 26-03 — `$LIVE pick-spec` subcommand + JSON contract
- [x] 26-04 — `$LIVE fork` primitive
- [x] 26-05 — SKILL.md rewrite + REQUIREMENTS + UAT plan
- [x] 26-06 — UAT gap closure (5 SKILL fixes + LIVE-PICK-03 wording)

### Phase 27: Listener Poll Bash → Monitor Tool Transition
**Goal**: Listener poll (live agents + non-live perches) invokes Claude Code's new `Monitor` tool instead of the `Bash` tool, eliminating Bash-tool overhead and gaining native streaming semantics.
**Milestone**: v1.7 Seamlessification
**Depends on**: Nothing (tool swap; verify Monitor tool API stable first)
**Promoted from**: ROADMAP backlog Phase 999.2
**Requirements**: POLL-MON-01, POLL-MON-02, POLL-MON-03
**Success Criteria** (what must be TRUE):
  1. Listener poll invocation uses `Monitor` tool, not `Bash`
  2. Live agents + non-live perch listeners both migrate
  3. Status tags (READY/SENT/STOPPED/CLEANED) and message delivery semantics preserved
  4. Performance: equal or better latency vs Bash path; lower context cost (no Bash-tool prefix overhead)
  5. Fallback path documented if Monitor tool unavailable in a Claude Code version
**Plans:** 7/7 plans complete (2026-05-11)

Plans:
- [x] 27-01-PLAN.md — Wave 0 BLOCKING: draft REQUIREMENTS.md entries for POLL-MON-01..03
- [x] 27-02-PLAN.md — Core Rust refactor: --once flag, EVENT envelope emit, alarm body format (D9)
- [x] 27-03-PLAN.md — Skill rewrites: listen, live, revive (primary Monitor + fallback Bash --once)
- [x] 27-04-PLAN.md — New reboot skill + reboot.rs Monitor wording + plugin.json 1.9.10→1.9.11 bump
- [x] 27-05-PLAN.md — resume.rs <spacetime-reorientation> block rewrite (drop fires-once-then-exits)
- [x] 27-06-PLAN.md — Test updates: handoff/native owl tests add --once; new golden fixtures
- [x] 27-07-PLAN.md — Verification: doc/hook sweep CLEAN + DEPLOY.ps1 published v1.9.11 (cplugs HEAD 14f29c4); Human UAT stubbed for user sign-off in 27-07-DEPLOY-NOTES.md

### Phase 28: SessionStart Inject Psyche-Download Content Into Live Listener
**Goal**: When SessionStart fires against a perch with an active live listener, the injected reorientation context also includes the same payload `$LIVE psyche-download` would emit (memformat + accumulated context records). Self boots aware of its historical state without manual `psyche-download` invocation.
**Milestone**: v1.7 Seamlessification
**Depends on**: Nothing strict — pairs naturally with Phase 25 (project-scoped context split changes the payload shape)
**Promoted from**: `.planning/todos/done/2026-05-09-sessionstart-inject-psyche-download-content-into-live-listener.md`
**Requirements**: SS-PSYDL-01, SS-PSYDL-02, SS-PSYDL-03
**Success Criteria** (what must be TRUE):
  1. SessionStart on a live perch (info.json `live: true` / `psyche` field present) injects a separate `<psyche-context>` block containing memformat.xml + accumulated context records
  2. Non-live perches skip injection entirely (no psyche → no payload)
  3. Existing `<spacetime-reorientation>` block remains untouched (separate concern)
  4. Size bounded — truncate or summarize to a documented cap so giant context records don't blow the prompt
  5. If Phase 25 lands first: cwd-aware concat (`general.md + proj-{project}.md`) mirrors `psyche-download` output
**Plans:** 4/4 plans complete

Plans:
- [x] 28-01-PLAN.md -- REQUIREMENTS.md SS-PSYDL-01..03 entries + extract download_payload helper + Pulse Log strip helper + unit tests
- [x] 28-02-PLAN.md -- Fresh-session SessionStart emit (inject_active_perch_context -- psyche-context block between owl-active-perch and orphan_warning)
- [x] 28-03-PLAN.md -- Clear/compact SessionStart emit (inject_reorientation_if_needed is_live resolution + inject_reorientation signature change + psyche-context prepend)
- [x] 28-04-PLAN.md -- Integration tests (new tests/plugin_session_start_psyche_context.rs -- helper coverage + subprocess ordering assertion)

### Phase 29: Auto-Fire Echo-Commune on SessionStart + Wrapper Self-Exit
**Goal**: Auto-fire `_echo-commune` at two boundaries that currently lose Self-side delta — (a) SessionStart on existing perch (post-`/clear`) and (b) Psyche wrapper orphan-detected self-exit. Pairs with Phase 28 (push direction vs pull direction at the same hook).
**Milestone**: v1.7 Seamlessification
**Depends on**: Phase 18.8 (echo-commune stderr capture + fresh-session refactor — already shipped); Phase 28 same-hook coexistence
**Promoted from**: `.planning/todos/done/2026-04-20-auto-fire-echo-commune-on-sessionstart-and-wrapper-self-exit.md`
**Requirements**: TBD (AUTO-EC-01, AUTO-EC-02, AUTO-EC-03)
**Success Criteria** (what must be TRUE) — refined by `.planning/phases/29-auto-fire-echo-commune-on-sessionstart-wrapper-self-exit/29-CONTEXT.md`:
  1. SessionStart auto-fires `_echo-commune` against the prior session UUID on `/clear` or `/compact` boundaries — gate is `stdin.source ∈ {clear, compact}` AND resolved perch `info.state == Live`. Prior session UUID = snapshot of `info.json.session_id` taken in `plugin_session_start.rs::run()` BEFORE `refresh_info_json_session_id` overwrites it. Fresh-session SessionStart path does NOT fire.
  2. Psyche wrapper orphan path (in `src/live/wrapper/orphan.rs`) fires `_echo-commune --force` against Self's last session UUID (read from `info.json.session_id` at orphan-detect time) synchronously before `INIT_SIGNOFF`, blocking until subprocess completion (NO timeout cap — fidelity > teardown latency). Missing/empty UUID: skip echo-commune, proceed straight to INIT_SIGNOFF.
  3. SessionStart-triggered fire reuses the Psyche wrapper's existing spawn path via a typed control message (`FIRE_ECHO_COMMUNE_NOW prior_session={uuid} forward_to_self=true source={clear|compact}`) delivered to `{self_id}-psyche`. No new spawn site outside the wrapper. Wrapper inner-poll handler bypasses cadence gate when servicing this message. Coexists with Phase 28 injection at the same SessionStart hook (hook is fire-and-return; ordering vs `<spacetime-reorientation>` / `<psyche-context>` is irrelevant).
  4. No regression on Phase 18.8/18.8.1 fresh-session refactor invariants (no Self-jsonl write contention).
  5. Failure modes: silent skip on missing prior session UUID; structured `[ECHO-FIRE] ...` line to stderr on subprocess failure; SessionStart hook continues normally (Phase 28 psyche-context still emits).
  6. Phase 29-triggered SessionStart fire dual-dispatches the echo-commune body: (a) existing Psyche-bundling path (memformat + context-file update), AND (b) standard owl REST delivery of `<EVENT type="echo_commune" from="{self_id}-psyche" timestamp="{iso8601}" note="...">{body}</EVENT>` to Self's perch — fully decoupled from the SessionStart hook turn; arrives asynchronously like any other inbox message. Cadence-driven 15-min fires remain Psyche-only (unchanged behavior). Orphan-path fire is Psyche-only (Self is gone).
  7. `_echo-commune --force` flag bypasses the 15-min cadence window check AND the `.more-done` Stop-sentinel check; PRESERVES the `OWL_ECHO_COMMUNE` recursion guard.
  8. Echo-commune event envelope cleaned up via clean cutover (single release, no legacy fallback parser) — emit `<EVENT type="echo_commune" from="{agent}" timestamp="{iso8601}" note="...">{msg}</EVENT>` (typed + provenance + descriptor attrs) replacing legacy `<EVENT type="msg" from="{agent}">ECHO_COMMUNE ({ts}) from {agent}: {msg}</EVENT>`. Audit covers ALL emit + parse sites in `src/`, AND instructional prose in `plugin/spt/skills/`, `plugin/spt/hooks/`, `CLAUDE.md`, `psyche.md`, `docs/`. Parser predicates case-insensitive on `type="echo_commune"` (mirrors quick-260513-v8f init_signoff precedent).
**Plans:** 5/5 plans complete

Plans:
**Wave 1**
- [x] 29-01-PLAN.md -- Foundation: --force flag + extract fire_echo_commune_inner + compose_echo_commune_payload helper + envelope cutover at echo_commune.rs:365 (Wave 1)

**Wave 2** *(blocked on Wave 1 completion)*
- [x] 29-02-PLAN.md -- SessionStart prior-UUID snapshot + FIRE_ECHO_COMMUNE_NOW control-message dispatch (Wave 2)
- [x] 29-03-PLAN.md -- Wrapper inner-poll handler arm + parse_fire_echo_commune_now + cadence/sentinel bypass via fire_echo_commune_force (Wave 2)
- [x] 29-04-PLAN.md -- Orphan-path synchronous _echo-commune --force fire before INIT_SIGNOFF (Wave 2)

**Wave 3** *(blocked on Wave 2 completion)*
- [x] 29-05-PLAN.md -- D15 instructional-prose audit: update plugin/spt/skills/{live,listen}/SKILL.md + psyche.md + CLAUDE.md to reference the new `<EVENT type="echo_commune">` envelope; rebuild release binary so embedded psyche.md takes effect (Wave 3)

### Phase 30: Commune/Signoff File-Drop Flow Change
**Goal**: Replace stdin-piped commune/signoff with a file-drop protocol. Agents write `.claude/{agent_id}-commune.md` / `.claude/{agent_id}-signoff.md`; the Self listener poll watches for these files and notifies the Psyche wrapper of each file's absolute path via REST. Wrapper forwards content into a fresh Psyche session prompt and deletes the file after that session completes. Signoff variant terminates the listener after notification (with confirmation message in termination output). If `-commune.md` or `-signoff.md` exists for the current agent at `$LIVE psyche-download` time, file content is appended to the end of psyche-download output.
**Milestone**: v1.7 Seamlessification
**Depends on**: Phase 27 (listener poll stream mode — file-watch hooks into the new poll loop); Phase 28 (psyche-download payload composition — the append-on-pending logic rides through the helper Phase 28 extracts)
**Requirements**: TBD
**Success Criteria** (what must be TRUE):
  1. `/spt:commune` skill writes `.claude/{agent_id}-commune.md` instead of piping body via stdin
  2. `/spt:signoff` skill writes `.claude/{agent_id}-signoff.md` instead of piping body via stdin
  3. Self listener poll watches for these files; on detection, notifies Psyche wrapper via REST with the file's absolute path
  4. Psyche wrapper forwards file content into a new Psyche session prompt; deletes the file after that session completes (atomic — no double-process on restart)
  5. Signoff file detection terminates the listener after notification, with confirmation message in the termination output
  6. `$LIVE psyche-download` appends content of any pending `-commune.md` / `-signoff.md` file for the current agent to the end of its output
**Plans:** 4/4 plans complete

Plans:
**Wave 1**
- [x] 30-01-PLAN.md — Self listener: per-iteration .claude scan + file_drop EVENT compose + signoff teardown + D12 exit-code audit (Wave 1)
- [x] 30-02-PLAN.md — Wrapper: parse_file_drop_event + FileDropDispatcher trait + handle_file_drop_arm + compose_commune_payload + resume_session_with_exit + arm wiring (Wave 1)
- [x] 30-03-PLAN.md — psyche-download: append Pending Commune / Pending Signoff sections in download_payload (Wave 1)

**Wave 2** *(blocked on Wave 1 completion)*
- [x] 30-04-PLAN.md — Skill rewrites (commune + signoff SKILL.md) + integration tests + DEPLOY.ps1 bump + UAT (Wave 2; depends on 01+02+03)

## Progress

**Execution Order:**
Phases execute in numeric order: 15 -> 16 -> 17 -> 18; v1.7 (Phases 26 -> 27 -> 28 -> 29 -> 30) and v1.8 (Phases 23 -> 24 -> 25) sequenced before v1.9 (19 -> 20 -> 21 -> 22) despite higher numbering. v1.7 ships before v1.8.

| Phase | Milestone | Plans Complete | Status | Completed |
|-------|-----------|----------------|--------|-----------|
| 1. Foundation & Hardening | v1.0 | 3/3 | Complete | 2026-03-28 |
| 2. Psyche Core | v1.0 | 3/3 | Complete | 2026-03-28 |
| 2.1 Live Skill Extraction | v1.0 | 1/1 | Complete | 2026-03-28 |
| 2.2 Owl & Live Hardening | v1.0 | 4/4 | Complete | 2026-03-29 |
| 5. Golden Tests & CLI Skeleton | v1.1 | 3/3 | Complete | 2026-03-30 |
| 6. P2P Messaging & Owl Parity | v1.1 | 6/6 | Complete | 2026-03-30 |
| 7. Live Parity & Distribution | v1.1 | 4/4 | Complete | 2026-03-30 |
| 8. Timed Pulses | v1.1 | 2/2 | Complete | 2026-03-30 |
| 9. Spine Supervisor | v1.1 | 3/3 | Complete | 2026-03-30 |
| 9.1 Psyche Lifecycle Hardening | v1.1 | 4/4 | Complete | 2026-03-30 |
| 9.2 Psyche Messaging Discipline | v1.1 | 2/2 | Complete | 2026-03-31 |
| 10. Plugin Migration | v1.5 | 3/3 | Complete | 2026-04-01 |
| 11. Foundation | v1.5 | 2/2 | Complete | 2026-04-02 |
| 12. Psyche Intelligence | v1.5 | 3/3 | Complete | 2026-04-03 |
| 13. Messaging Integration | v1.5 | 3/3 | Complete | 2026-04-03 |
| 13.1 Unified Psyche Wrapper Event Loop | v1.5 | 2/2 | Complete | 2026-04-04 |
| 14. Poll Efficiency | v1.5 | 1/1 | Complete | 2026-04-04 |
| 14.1 Persistent Offline Perches | v1.5 | 3/3 | Complete | 2026-04-08 |
| 14.2 Spacetime Reliability & DX | v1.5 | 9/9 | Complete | 2026-04-06 |
| 14.3 Optional Agent ID | v1.5 | 3/3 | Complete | 2026-04-07 |
| 15. MCP Spike & Spool Foundations | v1.6 | 5/5 | Complete | 2026-04-11 |
| 16. MCP Tools | v1.6 | 4/4 | Complete | 2026-04-12 |
| 17. MCP Resources | v1.6 | 2/2 | Complete | 2026-04-13 |
| 18. Hooks & Plugin Integration | v1.6 | 2/2 | Complete | 2026-04-13 |
| 19. Sendkeys Foundation & Capsule Launch | v1.9 | 0/4 | Not started | - |
| 20. Session Detection & Capsule Listener | v1.9 | 0/2 | Not started | - |
| 21. Abrupt Messages | v1.9 | 0/2 | Not started | - |
| 22. Smart Capabilities | v1.9 | 0/2 | Not started | - |
| 23. Commune & Signoff Project-Root + HEAD SHA Stamping | v1.8 | 0/TBD | Not started | - |
| 24. Tracked-Dir Per-Agent Layout + Sessions Audit Log | v1.8 | 0/TBD | Not started | - |
| 25. Psyche Org Rework — Perch Nesting + Context Split | v1.8 | 0/TBD | Not started | - |
| 26. /spt:live Skill — Auto-Pick + Interactive Agent Picker | v1.7 | 6/6 | Complete   | 2026-05-11 |
| 27. Listener Poll Bash → Monitor Tool Transition | v1.7 | 7/7 | Complete   | 2026-05-11 |
| 28. SessionStart Inject Psyche-Download Into Live Listener | v1.7 | 4/4 | Complete    | 2026-05-13 |
| 29. Auto-Fire Echo-Commune on SessionStart + Wrapper Self-Exit | v1.7 | 5/5 | Complete   | 2026-05-14 |
| 30. Commune/Signoff File-Drop Flow Change | v1.7 | 4/4 | Complete   | 2026-05-15 |

**Off-roadmap sub-iterations** (tracked in phase directories, not in milestone totals):
Phases 18.1, 18.2, 18.3, 18.4, 18.5, 18.6, 18.7, 18.7.1, 18.8, 18.8.1 — see `.planning/phases/18.*` for SUMMARY/SECURITY/UAT artifacts.

## Backlog

_(empty — all backlog items promoted to milestone phases as of 2026-05-10)_


