---
name: v091-resolve-dotstem
description: v0.9.1 PATCH — host-binary matcher robustness (renamed-in-use exe) + friendly seed wire-skew error (perri PREP-4)
metadata: 
  node_type: memory
  type: project
  originSessionId: 5e7350bf-0514-40db-9112-edf4b5a5b740
---

doyle dispatch 2026-06-17 from perri PREP-4 dogfood of v0.9.0. PRIORITY (unblocks perri). Branch **v0.9.1-resolve-dotstem off main@v0.9.0**. PATCH 0.9.0→0.9.1 (deployah authors version bump). **PR #22 OPEN, MERGEABLE, doyle pinged PR-ready, CI firing both runners** (monitor baf15mn6s).

**4 items (all built + green local):**
1. **FINDING 2b [the priority fix]:** `resolve::normalize_basename` stemmed only TRAILING `.exe` → a self-update that RENAMES the in-use exe (Claude Code: `claude.exe`→`claude.exe.old.<ts>` while old proc runs) made a long-lived session's basename never match `host_binaries=["claude"]`. Fix = lowercase + **stem-before-first-dot** (`lower.split('.').next()`), applied to BOTH declared entries AND live basename. Caveat: declared host-binary name must not contain a dot. +units (normalize cases + `renamed_in_use_exe_still_resolves`). live_resolve_e2e green (both sides normalize). REQ-MANIFEST-8 robustness.
2. **FINDING 1 friendly error:** `cmd_seed`'s `put_seed` seed-ack EOF (UnexpectedEof = "failed to fill whole buffer") = stale OLD broker can't deser new Seed, drops conn. New `startup::seed_fail_message` maps UnexpectedEof → actionable "stale pre-0.9.0 broker... run `spt daemon stop`, retry" hint (scoped to that kind, no mis-fire). +unit `seed_fail_eof_gives_actionable_stale_broker_hint`. New **REQ-HAZARD-BROKER-SEED-WIRE-SKEW** [doc,impl,unit] registry-first.
3. **FINDING-2a doc:** match rule in docs/MANIFEST.md + docs-site harness-contract/manifest.md (case-fold + stem-before-first-dot).
4. **KNOWN-HAZARDS 7.9:** broker serves seed-control + resident across brain self-update → daemon-state wire change needs DELIBERATE broker restart (NOT auto, ADR-0004 no-terminate-during-update); forward discipline = additive + serde-default (wouldn't have saved 0.9.0 since old broker's adapter was required).

**REJECTED-as-code (doyle):** auto-broker-restart-on-update (ADR-0004 forbids auto-killing resident broker); Seed N-1 deser rescue (doesn't fix current case — failing receiver is already-deployed 0.8.x broker; forward-only note).

GATE BAR all green local: clippy --workspace --all-targets -D warnings; traceable EXIT=0; seam (resolve+startup units + live_resolve/live_firsthost/contract/quickstart E2Es); docs-drift gen no-diff. 6 files +111/-15.

SEQUENCING: doyle gates → deployah cuts v0.9.1 → perri re-verifies + ships spt-claude-code v0.3.0. THEN picker REQ-PICKER-1 (approved option A, see [[v091-picker-status]]) + REQ-PICKER-2 on branch v0.9.1-picker-status (rename branch — v0.9.1 patch took the number; picker likely v0.10.0 minor, doyle sorts at release). Related: [[v090-harness-resolution]] (shipped). LESSON: single-quote heredoc for owl/commit/-m bodies.
