---
name: v090-harness-resolution
description: "v0.9.0 dispatch — adapter-agnostic seed + bind-time adapter/profile resolution (ADR-0021); doyle design, todlando exec"
metadata: 
  node_type: memory
  type: project
  originSessionId: 5e7350bf-0514-40db-9112-edf4b5a5b740
---

doyle DISPATCH 2026-06-16 → todlando exec, doyle gates, deployah releases. MINOR (likely v0.9.0). Branch **v0.9.0-harness-resolution off main@v0.8.3** (b6470c1). Base commit @037c86f.

**Why:** perri /sptc:live v0.2.0 wrong vs legacy parity. Root = spt-core gaps: `--adapter` REQUIRED on every api call but DEAD on listen (bind_from_seed resolves adapter from seed by pid, ignores flag). Goal: `$LIVE start wall-a`→`$SPT listen wall-a` no mandatory --adapter; one generic SessionStart hook `spt api seed --pid <pid> --session-id <sid>` for every adapter profile.

**Design = AUTHORITATIVE (read first):** ADR-0021 + CONTEXT §170-191 (doyle authored, carried uncommitted onto branch in base commit; re-tag doc-evidence at W5, NO rewrite).

**4 REQs (minted registry-first @037c86f, required_stages=[] until per-wave):**
- REQ-START-5: agnostic seed (parent_pid+session_id only, no --adapter) + --adapter OPTIONAL override on api group + bind-time resolve (listen+poll, LiveAgent+ReadyAgent)
- REQ-MANIFEST-8: `[adapter] host_binaries` Vec<String> (#[serde(default, skip_serializing_if=Vec::is_empty)], N-1-safe like shortcut_basename); bind-time pid→exe-basename match (case-insens, .exe-stripped) → candidate adapters; zero→friendly err + --adapter escape
- REQ-INSTALL-12: active-profile pointer adapters/active-profiles.toml (host_binary→adapter[:profile]) at registry ROOT (sibling <name>/ dirs); `spt adapter use <adapter>[:profile]` writes / `--clear` drops; NEVER auto-written by install/update/add; stale self-heals+warn-once; pruned on adapter remove; atomic write
- REQ-CLI-4: direct-user CLI humanize (adapter update/list/use friendly prose not CODE:RESULT). CAUTION: do NOT break adapter-PARSED bringup tokens SEEDED/BOUND/READY/NO_SEED on seed/listen (adapters grep) — additive line or --porcelain/--quiet split; FLAG dual-contract markers to doyle. Bringup composition = perri's; I own only direct-user CLI

**Resolver (heart):** seed parent_pid → exe basename (ADD exe_basename(pid) to spt-store::proc beside is_process_alive) → candidates = registered kind=harness adapters whose host_binaries ∋ basename → profile = active-profiles.toml pointer PRIMARY else max registered_at_ms candidate BASE profile name-asc tie → zero→friendly Err. Wire into BOTH listen AND poll(ready).

**Code sites:** api/mod.rs ApiArgs.adapter:String→Option; crates/spt-store/src/seed.rs Seed drops adapter; api/startup.rs cmd_seed + bind_from_seed→resolver; spt-runtime/manifest.rs [adapter] host_binaries; pointer store + `spt adapter use` (CLI new cmd → docs-drift xtask gen); prune on adapter remove.

**My WAVE fold (doyle "fold as you see fit"):** W1+W2 FOLDED (agnostic seed alone = broken intermediate, bind loses adapter source) = --adapter optional + agnostic seed + host_binaries + resolver(reads pointer-if-present else registered_at_ms) wired listen+poll. W3 pointer-writer(adapter use+--clear+prune+stale-heal). W4 CLI-4 humanize. W5 mdBook+doc-retag+int E2E. int at final wave.

**GATE BAR (preflight EXACT CI):** clippy --workspace --all-targets -D warnings · traceable EXIT0 · SEAM SWEEP (startup/seed/listen/poll + livehost_bootrace + live_bind_firsthost + poll_envelope + contract_e2e + registry/manifest units) · docs-drift `cargo run -p xtask -- gen` (new CLI `adapter use`→reference.md, no M#/W#/REQ in clap ///help) · int (agnostic-seed bringup E2E, host_binaries match, pointer→fallback, friendly zero-match). PR base main, ping doyle PR-ready w/ resolver evidence + dual-contract-marker(porcelain) decision.

**STATUS 2026-06-17: PR #21 doyle GATE-PASS (full code-read, non-vacuous verified) + CI GREEN BOTH RUNNERS + re-synced onto published v0.8.4 = CLEAR FOR doyle GATE-MERGE → deployah cuts v0.9.0 (0.8.4→0.9.0 minor).** Final head @0d7fb6d (v0.8.4 merge). MERGE-ORDERING (doyle condition, honored): held #21 until v0.8.4 (ccs PR#20 patch) published, THEN merged main in (carries release:v0.8.4 bump), re-preflighted, pushed — so v0.9.0 features ride ON TOP of the v0.8.4 patch (correct semver). Commits: base @037c86f · W1-W3 @c3f9899 · W5+int @3eeeed2 · merge#20 @4dfb513 · merge-v0.8.4 @0d7fb6d. 3 REQs [doc,impl,unit,int]. doyle merges; I do NOT (don't self-merge to main). GATE BAR all green LOCAL: clippy --workspace --all-targets -D warnings clean; traceable EXIT0; SEAM SWEEP (units store164/runtime70/daemon314/spt-bin165 + E2Es live_firsthost/live_bind_firsthost/livehost_bootrace/live_resolve/contract/poll_envelope/daemon_lifecycle_real_brain/quickstart/gateway); docs-drift gen no-diff. AWAITING doyle gate + CI both runners.

**DUAL-CONTRACT DECISION:** touched ZERO existing parse markers; bringup tokens SEEDED/BOUND/READY/NO_SEED untouched; new `spt adapter use` born-friendly. REQ-CLI-4 broad humanize (ADAPTER_UPDATE_*/ADAPTER_LIST) = FLAGGED stacked follow-on pending marker-audit (grep perri+tests for each ADAPTER_* consumer→classify→propose additive-line-vs-porcelain for doyle sign-off); CLI-4 stays required_stages=[] this PR.

**STACKED FOLLOW-ONS (after #21):** (1) ReadyAgent/$SPT ready seed+resolve parity = doyle ruling C residual (Cmd::Ready bypasses seeds today; CONTEXT §175 end-state). (2) REQ-CLI-4 broad humanize. (3) Picker 4-state status (doyle dispatch): amber "ONLINE - HARNESS ONLY" (harness-hosted = no broker PTY seat = not controllable) + blue "ONLINE+CONTROLLED" (controlled_by exists, REQ-RCVIEW-1) + fix project_history-empty (loader in picker/mod.rs not populating) → mint REQ-PICKER-1; amber keys on this PR's harness-hosted model. doyle's ccs PTY fix (REQ-HAZARD-WIN-PTY-PROGRAM-RESOLVE, PR #20) is separate, won't touch picker.

See [[v083-published]] (prior). Linked seam-test caveats: [[shared-seam-change-run-all-seam-tests]], [[ci-clippy-preflight-workspace]], [[cli-command-docs-drift]]. LESSON: backticks in double-quoted owl-send/`-m` bodies get shell-substituted (ran `adapter use`, corrupted text) — use single-quoted heredoc for message/commit bodies.
