---
name: f028-runtruth-wave-progress
description: "BUILD-F028-RUNTRUTH executor progress (todlando) — post-v0.22.0 bugfix milestone on f028-runtruth, doyle-gated per sha"
metadata: 
  node_type: memory
  type: project
  originSessionId: 31b56efe-f347-434c-bc78-129afac5559d
---

BUILD-F028-RUNTRUTH — todlando executing on branch **f028-runtruth** off origin/main @9bae13e (v0.22.0 merged), doyle gates per sha. Triage (authoritative, RCA'd file:line): docs/NEXT-MILESTONE-RUNTRUTH-TRIAGE.md. 12 items / 3 tracks / 11 REQ ids.

## SCOPE (11 REQ, seeded W0 stages=[])
- **Track A picker display/action** (operator #1-#6): A1 REQ-PICKER-PROJECT-DISPLAY-NAME (github-com-* slug → friendly display name, KEEP slug as key; 4 surfaces) · A2 REQ-PICKER-CONTROL-LINE-STATUS-GATE (control_line empty when !Online; render half — stamp half=B3) · A3 REQ-PICKER-OFFLINE-NO-VIEW (offline set=[Start], drop View) · A4 REQ-PICKER-CHOOSE-DEDUP-ALL (Here dedup vs ALL history dirs not just head) · A5 REQ-RESUME-ROW-PER-PROJECT (per-row project_id_for_dir(e.cwd), not history-head).
- **Track B lifecycle** (hall-b diag, verified 0.22.0): B1 REQ-RUN-NO-DUP-SESSION (run-on-live refuse/reattach + crossed-attach RCA) · B2 REQ-RESUME-HARNESS-SESSION-ID (HARNESS UUID into claude -r, not spt sid — PERRI manifest touchpoint) · B3 REQ-PRESENCE-CONTROL-REAP-ON-EXIT (dead-pid ONLINE decay + sticky CONTROLLED; #11 folded) · B4 REQ-RESUME-REAP-PRIOR-HARNESS (resume reaps/refuses prior live harness).
- **Track C infra**: C1 REQ-CRC-SWAP-OLD-DISPLACE (.old-litter brick: displace-to-unique + op/path error ctx; Linux leg) · C2 REQ-SESSIONS-LOG-ENDPOINT-ATTRIBUTION (foreign session_id in perch ledger; RCA hook attribution + owlery filter).

## WAVE ORDER (doyle)
W1 A3/A4/A5/A2-render (small picker) → W2 A1 (display naming, shared seam) → W3 B1/B3/B4 (lifecycle) → W4 B2/C2 → W5 C1. **A1+C1 shas need Linux gate leg** (gate-cross-platform-leg; no drive-letter fixtures, cfg-gate paths like ffca259).

## LANDED
- **W0** @f21e110 — triage doc + 11 REQ mints stages=[]. V028-SEED-ACK sent doyle.
- **W0-addendum** @1613f26 — C2 UPGRADE (doyle RCA: foreign psyche SessionStart REBINDS victim identity, UPSTREAM of B3) + perri v0.22.0 8-findings fold. Split C2 root into NEW REQ-BIND-HONEST-SELF-STAMP (roster.rs:107 owlery-1-level scan + pinned-identity-at-spawn + no-fallback-stamp; PERRI touchpoint). Broadened B3 reap → 4 paths (clean-exit/conn-drop/crash-death/BOOT-SWEEP). NEW mints: B5 REQ-PEER-PUMP-CHURN-STALL (W5-maybe), B6 REQ-TRANSLATE-BINARY-LIVENESS-DECAY (W4), C3 REQ-PSYCHE-CRASHLOOP-BACKOFF-SHUTDOWN (W4), D1 REQ-DOC-ENDPOINT-DROP-RESOLUTION (W5 docs), D2 REQ-DAEMON-STATUS-JSON-TRUTH (W5). **REVISED wave order: W3 C2/BIND-HONEST→B3→B1→B4 · W4 B2/B6/C3 · W5 B5/D1/D2/C1.**
- **W1 COMPLETE** (4 picker fixes, all impl+unit, pushed):
  - A3 @4ce2638 REQ-PICKER-OFFLINE-NO-VIEW — offline confirm_options = [Start] (drop dead View).
  - A4 @4fa53e6 REQ-PICKER-CHOOSE-DEDUP-ALL — build_project_choices Here-gate dedups vs ALL history dirs not just head.
  - A5 @e051878 REQ-RESUME-ROW-PER-PROJECT — resume_rows_from per-row project_id_for_dir(e.cwd) memoized per-cwd, owlery→empty (was history-head on every row). (swept C2-upgrade doc in — accepted once; BINDING NOW: no git add -A on shared tree, explicit paths only.)
  - A2-render @1de11cb REQ-PICKER-CONTROL-LINE-STATUS-GATE — render_selection_summary control_line empty when !Online (stale stamp on offline no longer shows "controlled locally"). Stamp-CLEAR upstream = B3.
- Pre-flight per-item: picker tests green + clippy -p spt clean + traceable OK each. **W1 GATE PASS @1de11cb (doyle, workspace 1506/1506) — W1 CLOSED.**
- **W2 A1 @9c2c714** REQ-PICKER-PROJECT-DISPLAY-NAME (impl+unit, pushed) — doyle design steer: derive display AT SOURCE. spt-store project_id_and_display_for_dir one-pass (id=slug KEY / display=URL-tail via display_from_url→folder→dirname, case preserved, NEVER slug-parsed); project_id_for_dir=.0 wrapper. ProjectRef.display field; project_refs_from derive→(id,display); store-only/remote→display=id verbatim. disambiguate_project_ids renders DISPLAY (collision→parent-suffix). 4 surfaces (choose-project labels, endpoint-list col, confirm history, resume titles) render display key on id. units: project.rs display_derivation + data.rs disambiguate rewritten. Pre-flight: picker 55/55 · project 3/3 · workspace clippy rc=0 · traceable OK. diff doyle-faithful; gate running + DRAFT PR#48 (f028→main) auto-runs BOTH CI legs (Linux kitsubito automatic for A1/C1).
- **A6/A7/B7 seed @af98e17** (operator 2nd report) — A6 REQ-ENDPOINT-LIST-RENDER-POLISH (W2: SGR90 dim @cli.rs:3019 + Total dim + glyph-beside-name + status-word color), A7 REQ-CLI-WIN-VT-ENABLE (W2: lift rc.rs:746 VT-enable to shared startup helper + strip fallback), B7 REQ-GOSSIP-CONTROLLED-CROSS-NODE (W3: remote CONTROLLED render RCA send/recv/decay). stages=[].
- **W2 A6 @487a517** REQ-ENDPOINT-LIST-RENDER-POLISH (impl+unit) — cli.rs: DIM_GRAY="90" module const (was LIGHT_GRAY="37"=WHITE) on Shared-subnets + Total (render_total gains color arg); format_instance_rows moves status GLYPH beside name (`{square} {id}`) + colors status WORD via EpDisplay::ansi_color_code (width=word-only, glyph constant-prefix). units: format-rows glyph-precedes-name + \x1b[32mONLINE + Total-dim-under-color. cli 133/133.
- **W2 A7 @459cf19** REQ-CLI-WIN-VT-ENABLE (impl+unit) — helpfmt.rs color chokepoint (stdout_color/stderr_color): pure resolve_console_color(want, console_vt) + win_vt::enable(std_handle) enables VT on real Win console; None=not-console(piped/forced passes) / Some(false)=console-but-SetConsoleMode-fails→STRIP (raw-conhost ←[36m fix). One-shot no-restore (rc keeps its own). unit resolve_console_color_strips_when_vt_unavailable; FFI enable = HITL raw-conhost. NO --help text change.
- **W2 COMPLETE + GATE PASS @459cf19 (doyle)** — Win worktree clippy --workspace clean + nextest --workspace 1508/1508; CI BOTH legs green attempt-3 (A1 Linux-leg SATISFIED via kitsubito; twohost tag-skipped on draft). 2 CI reds attempts 1-2 = doyle local-gate-starves-CI-same-box (probe_all_cap + seedmap timeout, both known starvation, passed quiet — NEW doyle stagger rule; NOT my code). Scoreboard: W0+addendum+W1+W2 ALL gated PASS. DRAFT PR#48 auto-runs both CI legs per push.
- **W2 wave-end TODO (operator-owned):** A7 HITL verify on raw Win10 conhost (operator has repro terminal). [A6 glyph-position veto CLOSED 2026-07-03 — operator confirmed picker-mirror/glyph-before-name, A6 fully settled.]
- **REVISED wave order: W1✓ · W2✓ (A1/A6/A7) · W3 C2/BIND-HONEST→B3→B1→B4→B7 · W4 B2/B6/C3 · W5 B5/D1/D2/C1.** NEXT: W3 — START with C2/BIND-HONEST (identity root, UPSTREAM of B3). PERRI touchpoints incoming (BIND-HONEST psyche_init env-scrub). RCA-first for B7 (two live nodes).
**C2 RCA POINTERS (doyle fresh-verified 2x, USE THESE — my earlier grep hit wrong crate spt-store):** detect_self_id = crates/**spt**/src/roster.rs:103 (leg a = read_dir(owlery) one-level ~107); detect_self_by_ancestry = roster.rs:133 (the #9 ancestry work). Psyche spawn identity path = crates/**spt-live**/src/psyche.rs via ManifestRuntime psyche_init role (no env_remove / no pinned child identity). Adapter half = claude-spt manifest [session.psyche_init] ~L347 (PERRI touchpoint, flag doyle first). Contaminated live fixture on disk = hall-a info.json session_id 359d7bd7 (= f015b-probe-psyche's). Report RCA verdict to doyle BEFORE coding.

## BINDING RULES (this shared tree)
- NO `git add -A` / `git commit -a` — explicit paths ONLY (concurrent agents edit here; a sweep catches mid-write sibling files). Same family as never-gate-a-moving-tree.
- doyle edits the triage doc LIVE — sanity-check tail coherence before staging; fold his doc edits into addendum or a follow-up doc-sync commit.
- B2 + REQ-BIND-HONEST psyche_init + B6 = PERRI touchpoints: FLAG doyle BEFORE any claude-spt manifest move (adapter glue-model rule).

## PROTOCOL
- B2: FLAG perri BEFORE any claude-spt manifest move (adapter glue-model rule: no adapter-aware source in spt-core).
- Every item: verify premise vs code (gate-against-documented-design) → activate REQ → red-first → traceable+clippy → commit → push → ping doyle sha.
- Gate rig: doyle isolated worktree-of-sha + fresh target; A1/C1 add Linux CI leg.
