---
name: translation-binary-console-window-bug
description: "BUG (operator-reported 2026-06-23): spt-hosted translation binary spawns a VISIBLE console window on Windows — translation.rs TranslationChild::spawn missed REQ-HAZARD-CHILD-CONSOLE-FLASH's CREATE_NO_WINDOW. Queued to todlando."
metadata: 
  node_type: memory
  type: project
  originSessionId: 77a745a3-d838-40e7-9522-5dca2858907d
---

OPERATOR-OBSERVED BUG (2026-06-23, real Windows machine): spt-hosted endpoints spawn their `[message-idle-translation-binary]` in a DEDICATED VISIBLE WINDOW. Must spawn fully backgrounded, never visible.

ROOT (grounded, doyle) — a COVERAGE GAP in an EXISTING hazard, not a new class. Same shape as F-019 ([[f019-translation-install-dir-resolve]]): the translation binary spawn diverged from the contract its siblings already follow.
- The project HAS **REQ-HAZARD-CHILD-CONSOLE-FLASH** (spt-runtime/src/runtime.rs:355/585/750): "without CREATE_NO_WINDOW each adapter-child spawn flashes a visible blank console on Windows." Every ManifestRuntime adapter spawn (psyche / echo_commune / turn / digest / notif via spawn_session) sets `cmd.creation_flags(0x0800_0000)` (CREATE_NO_WINDOW). brainproc.rs:945 + daemon.rs:1037/1087 do too.
- BUT `spt-daemon/src/translation.rs:242` `TranslationChild::spawn` spawns the translation binary via a RAW `Command::new(path).stdin(piped).stdout(piped).stderr(inherit).spawn()` — NO `creation_flags`. It does NOT route through ManifestRuntime::spawn_session (it's a bespoke stdin→stdout filter driver), so it MISSED the CREATE_NO_WINDOW the hazard requires. The daemon is windowless → a console child allocates its own NEW visible console window.

FIX (small, targeted — queued to todlando, NOT done): at translation.rs:242, on `cfg(windows)` add `cmd.creation_flags(0x0800_0000)` (CREATE_NO_WINDOW) before `.spawn()`, mirroring runtime.rs:363/585. Tag `[impl->REQ-HAZARD-CHILD-CONSOLE-FLASH]` (extends the EXISTING hazard's coverage to the translation site — NO new REQ). Add a unit asserting the translation spawn carries the no-window flag (mirror runtime.rs:750 `command_for sets CREATE_NO_WINDOW`). stderr is currently `inherit` — keep behavior, just hide the window (CREATE_NO_WINDOW suppresses the console window, not the piped/inherited streams).

TIMING: **DECIDED (operator 2026-06-23) — roll the fix into v0.15.0.** Rides the v0.15.0 milestone (activity-gated delivery + send axes), as a sibling Windows-spawn-hygiene fix under REQ-HAZARD-CHILD-CONSOLE-FLASH (NOT part of REQ-MSG-DELIVERY-AXES). Goes into the v0.15.0 build assignment to todlando. NOT during the v0.14.3 cut (translation.rs is outside v0.14.3 scope; don't destabilize the in-flight release).

LESSON (reinforces F-019): an adapter-child spawn that bypasses the shared ManifestRuntime path also bypasses its Windows hygiene (install_dir resolve AND CREATE_NO_WINDOW). Audit ALL bespoke `Command::new` adapter-child spawns against the ManifestRuntime contract. [[spt-core-findings-backlog]] class.
