---
name: f019-translation-install-dir-resolve
description: "F-019 (v0.14.2) — adapter-shipped program paths resolve against install_dir; the #1 CC-on-Windows idle-submit blocker. PUBLISHED counter 32 @365fb0c"
metadata: 
  node_type: memory
  type: project
  originSessionId: 8fdec519-d622-4c8c-a382-d86ef72d5662
---

**F-019 = v0.14.2 (REQ-INSTALL-11 extension). doyle design @1941eb8 → todlando build → doyle gate → perri verifies real CC.** Branch `fix/f019-translation-install-dir-resolve` off **main @46289ab** (v0.14.1 merged, PR#34). Built @4fd028d, NOT pushed.

**ROOT (perri + doyle, real claude-spt — THE #1 CC-on-Windows blocker):** spt-hosted idle delivery typed the envelope into CC but NEVER submitted ("stacked" unsent). After a multi-hour black-box hunt (byte encoding, win32-input-mode ?9001h, bracketed-paste, focus, pacing — ALL moot), root = the `[message-idle-translation-binary]` ships a BARE relative path `"cc-spt-idle-translate"`; spt-core passed it VERBATIM to the broker → `Command::new` against daemon cwd/PATH → spawn FAILED → session FAILED CLOSED to raw inject → the binary's `{text}{delay}{key:enter}{commit}` choreography never ran. The binary never spawned; the adapter choreography was correct all along. REQ-INSTALL-11 already shipped `resolve_program_in_dir` + session/psyche/digest route through it — the translation binary + notif command were the MISSED surfaces.

**FIX (4 spawn sites, all via resolve_program_in_dir / ManifestRuntime::with_install_dir):**
- `harnesshost::launch_harness_brokered_in`: new `resolve_translation_binary(path, install_dir)` helper for the translation binary, + the harness SESSION program also routed (uniformity — no-op for the PATH harness binary `claude`, future-proofs a shipped launcher). The INITIAL spawn.
- `broker::read_translation_path` (broker.rs): the W3d live-update RESPAWN — was returning the manifest path VERBATIM (doyle's 2nd-site catch; would re-break after the initial fix). Now `.map(|b| resolve_program_in_dir(&b.path, install_dir))`.
- notif command, TWO sites — `notif.rs` shell-render (`record.source_dir`) + `api/reporting.rs` resurface (match manifest→registered record→source_dir): both were `ManifestRuntime::new` (no install_dir) → `with_install_dir`. Third miss-class.
- AUDIT: digest (threads install_dir) + lifecycle/psyche (with_install_dir) confirmed ALREADY-resolved.

**KEPT** the existing `TRANSLATION_SPAWN_FAILED:<path>:<err>` log (broker.rs:1077) — doyle: it's NOT new, the gap is it lands on the DETACHED daemon stderr nobody reads ("silent in practice"). KH diagnosis note added (tied to REQ-INSTALL-11, NOT a new REQ-HAZARD): "confirm an adapter binary actually SPAWNED before behavioral diagnosis." MANIFEST.md contract note: path resolves vs install_dir + extended the resolved-surfaces list.

**FALLBACK FLOW UNTOUCHED** (binding hold): build_translation None → raw inject is unchanged here. **Operator RULED drop raw-inject ENTIRELY** → spt-hosted idle = translation-binary-only; declared-but-failed OR absent binary → message stays SPOOLED (poll-fed) + loud, NEVER raw PTY inject. doyle authored the **ADR-0022 amendment** (docs/adr/0022...). The raw-inject REMOVAL is a SEPARATE build assignment doyle dispatches AFTER F-019 lands (F-019 ships first as the immediate CC unblock).

**GATES GREEN (local Win):** clippy `--workspace --all-targets` EXIT0 no-warn; `cargo test -p spt-daemon --lib` (new unit + notif 19 + harnesshost) green; `cargo test -p spt-runtime --lib resolve_program` 3 green; traceable EXIT0 (REQ-INSTALL-11 [OK] +doc+impl+unit, no stage change — extends coverage). unit = `translation_binary_resolves_against_install_dir`. HITL = perri real claude-spt: shipped RELATIVE-path manifest, fresh endpoint, `spt send` → CC SUBMITS (she reverts her interim absolute-path workaround on this shipping).

**DOYLE GATE-PASS @4fd028d 2026-06-23** (re-ran: clippy --workspace EXIT0; spt-daemon --lib translation unit + notif 18 green; spt-runtime --lib resolve_program 3 green; traceable EXIT0; diff design-faithful, all 4 sites + uniformity + fallback-untouched, notif 3rd-class catch credited).

**v0.14.2 CUT carries TWO commits** (deployah): F-019 fix @4fd028d (branch fix/f019-translation-install-dir-resolve off main @46289ab) **+ ADR-0022 amendment @1eaeef1** (raw-inject removal DESIGN + F-019 record, on design/endpoint-creation-flow — a tracked ADR that must ride v0.14.2). deployah cherry-picks 1eaeef1 (+ design doc 1941eb8 if carrying design docs) alongside 4fd028d.

**PUBLISHED ✅ counter 32, Latest (deployah 2026-06-23).** Bump-in-PR clean: PR#35 green BOTH runners (Win held — netstream #4 fix in base), merged @365fb0c. hashes linux 98714384… / win 08e8a267…. Cut carried F-019 @4fd028d + ADR-0022 amendment @1eaeef1 + design doc. doyle releasing perri for real-CC validation (idle-submit choreography on real Windows CC = THE #1 blocker close-out criterion).

**NEXT:** perri real-CC validation pending → THEN raw-inject REMOVAL build = todlando's next SEPARATE assignment, OPERATOR-TIMED (doyle sends scope when operator rules timing). Removal = declared-but-failed OR absent translation binary → message stays SPOOLED (poll-fed) + loud, NEVER raw PTY inject (per ADR-0022 amendment). GOTCHA reaffirmed: `spt` has NO lib target (`--bin spt`); spt-daemon + spt-runtime DO (`--lib`).
