# Milestones

## v1.7.1 Seamlessification II (Shipped: 2026-05-18)

**Theme:** Polish round on live-agent friction — listing/picker correctness, skill hint surface, fresh-start commune prompt, auto-resume affordance, plugin-update changelog notification. Single end-of-milestone deploy cadence.

**Phases completed:** 4 phases (31, 32, 33, 34), 11 plans
**Git range:** 94+ commits between 2026-05-16 and 2026-05-18
**Diff stats:** ~567 files changed (large due to retroactive CHANGELOG.md + planning artifacts), +116K / −2.4K lines
**Deployed:** v1.10.13 (cplugs marketplace 91b3e7a)
**Timeline:** 3 days execution + 1 day verification/audit

**Key accomplishments:**

- **Phase 31 — Picker correctness for all-live repos:** `$LIVE pick-spec` now emits a new `kind:"all-live"` JSON variant (additive — D5 schema freeze preserved) when every known agent in the current repo is online. `/spt:live` dispatch table surfaces these agents as "fork or pick a new name" — never auto-attaches. PICK-03 (`online: bool` on `kind:"pick"`) deferred to v1.8+ per D-10/D-11.
- **Phase 32 — List default-online + uniform flag surface + skill hint coverage:** `$OWL list` / `$LIVE list` default to online-only with `--all` / `--offline` / `--here` flags. Extracted shared `src/common/list_filter.rs` (`live/list.rs` shrank 138 → 73 LOC). Repo-name derivation via `info.json.project_history`. Empty-online lists emit discovery hint pointing at `--all`. Every `/spt:*` skill (17/17) ships `argument-hint:` frontmatter; `tests/skill_hints.rs` regression guard pins the contract.
- **Phase 33 — Fresh-start commune + auto-resume:** First-commune AskUserQuestion wired into both `kind:"prompt-new"` and `NO-CONTEXT:` paths. `/spt:live --auto` + 8 casual-language triggers route through pick-spec; SessionStart hook emits `<spt-live-auto-pick>` JSON via a 6-gate allow-list predicate that silently rejects in subagent/wrapper contexts (no stderr leakage). 3 explicit non-triggers for bare ambiguous phrases ("keep going", "resume work", `"continue" (bare)`).
- **Phase 34 — Version-change changelog notification:** Stop hook detects `CARGO_PKG_VERSION` ↔ `$SPT_HOME/last-seen-version.json` mismatch and emits a silent owl-message carrying parsed CHANGELOG H2 sections (Keep-a-Changelog 1.1.0). 3-option AUQ (`Yes, full changelog` / `Yes, highlights only` / `Skip`). Calm info banner via `is_informational` extension. DEPLOY.ps1 curation gate enforces TODO-stub-then-curate-then-deploy cycle.
- **Single-deploy cadence honored:** One `DEPLOY.ps1 -Bump patch` at end-of-milestone (v1.10.13) rather than per-phase, avoiding version-churn during in-flight binary handoffs (Phase 18.4/18.5 constraint).

**Hotfixes folded in during the v1.7.1 window:**
- `260517-6om` — silent owl-message Stop-hook transport replaces `decision:"block"`; "Remind me later" AUQ option dropped (infinite-loop pathology UAT-confirmed); deployed v1.10.12.
- `260517-n4b` — step_count floor at 1; info-priority for `<spt-version-changelog>`; DEPLOY.ps1 curation gate; deployed v1.10.13.
- `260517-q3h` — Phase 34 wrap-up doc bundle (STATE ledger + UAT amendments).
- `260517-wpf` — CHANGELOG.md reorder newest-first + DEPLOY.ps1 curation-gate insert-at-top (closes audit warning-1).

**Out-of-scope follow-on landed in same window:** `260517-rhw` — SPT first-install primer flow (PreToolUse direct-stdout, perch-less; Yes/Skip AUQ + 5-step blurb). Separate feature, not a v1.7.1 deliverable.

**Requirements coverage:**
- Phase 31: PICK-01/02/04/05/06 (5) — Complete (PICK-03 deferred)
- Phase 32: LIST-01..08 (8) + HINT-01..05 (5) — Complete
- Phase 33: FRESH-01..03, 06 (4) + AUTO-01..08 (8) — Complete (FRESH-04/05 struck per D-03)
- Phase 34: VERS-01..09 (9) — Complete (with VERS-04 amended by hotfix 6om)
- Total v1.7.1: 39 v1 requirements, 39 complete + verified

**Audit:** `.planning/v1.7.1-MILESTONE-AUDIT.md` — PASSED (39/39 requirements + 6/6 cross-phase wiring + 6/6 E2E flows). Three non-blocking tech-debt items recorded (CHANGELOG ordering — closed by wpf; shared-sentinel awareness; LIST-05 cosmetic wording drift).

**Known deferred items at close:** 7 (1 debug + 5 todos + 1 seed — all pre-v1.7 carry-forward; see STATE.md `## Deferred Items`).

---

## v1.7 Seamlessification (Shipped: 2026-05-16)

**Theme:** Friction removal across the live-agent lifecycle — pick, poll, reorient, echo, and persist context — with the Monitor-tool streaming poll as the foundational change.

**Phases completed:** 5 phases (26, 27, 28, 29, 30), 26 plans, ~60 tasks
**Git range:** 211 commits between 2026-05-10 and 2026-05-16
**Diff stats:** 422 files changed, +39,141 / -1,851 lines
**Deployed:** v1.10.10 (cplugs HEAD c7d502f)
**Timeline:** 7 days

**Key accomplishments:**

- **Phase 26 — Live agent picker:** `/spt:live` with no argument auto-launches when exactly 1 agent exists in repo history; fires `AskUserQuestion` with top-3 most-recently-active agents + free-text "Other" otherwise. New `$LIVE pick-spec` JSON emitter and `$LIVE fork <src> <new-id>` primitive support the four collision sub-cases (same-id-here, same-id-elsewhere, fork, brand-new). LIVE_AGENT_IDS.json schema v2 tracks per-id `last_active` bumps across five activity sites.
- **Phase 27 — Monitor-tool streaming poll:** Listener migrated from per-message Bash spawn to Monitor-tool stream mode emitting one `<EVENT type="msg|alarm">` envelope per delivery on stdout. READY/SENT/STOPPED/CLEANED status tags preserved on stderr. Bash + `$OWL poll --once` fallback path documented per-skill in listen/live/revive/reboot. Eliminates Bash-tool prompt prefix overhead on every message.
- **Phase 28 — SessionStart psyche-context injection:** SessionStart on a live perch (`info.state == Live`) emits a `<psyche-context id="...">` block carrying memformat + accumulated context records (Pulse Log stripped on the injection path). Single shared helper `download_payload(self_id)` feeds both CLI `$LIVE psyche-download` and the SessionStart wrapper; non-live perches skip emission cleanly.
- **Phase 29 — Auto-fire echo-commune at boundaries:** Auto-fire `_echo-commune` on SessionStart `/clear` and `/compact` (via `FIRE_ECHO_COMMUNE_NOW` control message dispatched to `{id}-psyche`) and on Psyche wrapper orphan-detect self-exit (synchronous blocking fire before INIT_SIGNOFF). Legacy `ECHO_COMMUNE ({ts}) from {agent}: ...` prose envelope fully cut over to typed `<EVENT type="echo_commune" from="..." timestamp="..." note="...">{body}</EVENT>` across src/, plugin/, docs/, CLAUDE.md, psyche.md.
- **Phase 30 — Commune/signoff file-drop flow:** `/spt:commune` and `/spt:signoff` skills now write `.claude/{id}-{commune,signoff}.md` instead of piping bodies via stdin. Self listener's per-iteration `scan_drop_files` watches `.claude/`, emits `file_drop` EVENT envelopes; wrapper consumes destructively (on-disk append succeeds before drop-file unlink) and `BreakLoop` exits cleanly on signoff. `$LIVE psyche-download` appends any pending drop-file content via `append_pending_sections` helper (destructive consume per quick-260515-uf1).

**Off-roadmap sub-iterations shipped during v1.7 window (not v1.7-scoped, tracked separately):**
- v1.10.4..v1.10.10 deploys carried defense-in-depth fixes: stale-signoff drain (commits d6e8bc1/7da2cfe), init_signoff envelope-shape predicate (commit 30c0144), FileDropOutcome::BreakLoop for cleanup-on-signoff (commits 57f4ef6/5c1749e).

**Requirements coverage:**
- Phase 26: LIVE-PICK-01..04 — Complete
- Phase 27: POLL-MON-01..03 — Complete
- Phase 28: SS-PSYDL-01..03 — Complete (2 raw-stdout /clear deploy-cycle Human-UAT tests deferred; non-blocking)
- Phase 29: AUTO-EC-01..03 — Complete
- Phase 30: SC-01..06 — Complete
- Total v1.7: 19 requirements, 19 complete

**Audit:** `.planning/milestones/v1.7-MILESTONE-AUDIT.md` — PASSED (7/7 cross-phase integration points wired; no BLOCKERs; minor tech debt around Bash `--once` fallback retention and Phase 27 backfilled VERIFICATION.md).

**Known deferred items at close:** 16 (see STATE.md `## Deferred Items` — primarily pre-v1.7 carry-over and v1.9 capsule scope).

---

## v1.1 Native Runtime (Shipped: 2026-03-30)

**Phases completed:** 5 phases, 18 plans, 30 tasks

**Key accomplishments:**

- Capture script runs 21 deterministic owl.sh/live.sh subcommands in isolated temp HOME, producing byte-exact .stdout/.stderr/.exitcode fixture triples protected from CRLF corruption by .gitattributes binary attributes.
- 17 golden integration tests (9 owl + 8 live) verifying bash script output in isolated environments, plus cross-platform CI building on 4 targets with test matrix
- output.rs
- 1. [Rule 2 - Security] Added 16 MB message size guard in protocol.rs
- Four filesystem-only owl subcommands (setup, list, stop, cleanup-session) matching owl.sh output format with platform-conditional process kill
- P2P poll/deliver/reply/send with TCP-first delivery, spool fallback, and filesystem inbox backward compat
- Reboot with flag preservation, stash with payload persistence and infinite sleep, session-resume with stash/dead-perch detection and auto-resume XML, gsd-setup with node gsd-tools config-set
- Native binary verified as drop-in owl.sh replacement with 10 integration tests, auto-setup wiring, and P2P TCP delivery under 1 second
- 7 live subcommands (list, list-psyches, context-save/download/clear, pulse-wait, commune) implemented as Rust submodules with stale GC and golden test coverage
- Cross-platform live stop (single + all) and revive with process group kill, wrapper PID cleanup, and exec-based restart delegation
- 1. [Rule 3 - Blocking] Wired dispatch in Task 1 instead of Task 2
- 1. [Rule 1 - Bug] Clap exit code differs from bash for unknown subcommands
- Two native subcommands for scheduling and delivering timed pulses: timed-pulse (Self-facing, validates time specs) and timed-pulse-wait (Psyche-spawned sleep-then-deliver)
- Psyche prompt updated with PULSE REQUEST handler that computes sleep duration, spawns timed-pulse-wait background task, and ends turn silently
- InfoJson spine/touch fields, list-command filter guards, and BootSpine/SpineWrapper/TouchWrapper CLI scaffolding
- Spine wrapper message loop with PSYCHE_DEAD handling and Touch 5-minute health-check scanner with SPINE-09 inline fallback
- Replaced all todo!() dispatch arms with real Spine/Touch function calls and extended stop --all to clean Spine/Touch wrapper PIDs

---
