---
name: next-milestone-bug-triage
description: 15 field bugs diagnosed for the post-v0.18.0 milestone — live doc docs/NEXT-MILESTONE-BUG-TRIAGE.md; 2 design-gate calls pending operator
metadata: 
  node_type: memory
  type: project
  originSessionId: 1e72d0bf-39e0-446e-b891-670b9e515cda
---

**15 field bugs (operator-surfaced 2026-06-30, post-v0.18.0) ALL DIAGNOSED** by 4 parallel read-only agents (clusters A-D). Live tracking doc = **`docs/NEXT-MILESTONE-BUG-TRIAGE.md`** (root-cause + file:line + fix + conf/effort per bug + fix-ordering synthesis). Next = doyle mints REQs → todlando builds → doyle gates → counter 38.

**Quick wins (S):** #12 rc never sets ENABLE_VIRTUAL_TERMINAL_PROCESSING on stdout (RawGuard rc.rs:729) → garbled on Win10/legacy-conhost, fine Win11/WT · #5 `LOCAL (this node)`→`This node:<id>` (cli.rs:4359; node-ident idiom @cli.rs:5531) · #14 flag the v0.16.0 top-right ID-marker (StatusRow, rc.rs:198-307, one-shot absolute paint) OFF — also defuses #7/#8 regression-half · #2 endpoint-count counts Offline ghost rows (cli.rs:5314 `e.2+=1` unconditional) → routable-only denominator (repro 0/2→1/3 exact).

**Picker cluster (ONE ordered build — #11+#13+#15-display):** extract shared `ResourceRow→EpDisplay` builder + pub picker enums (picker/mod.rs:18-21 private) FIRST → #13 regroup-by-machine (subnet_rows data.rs:253 dups per-subnet) → #11 endpoint-list reuse (format_subnet_rows cli.rs:2529 raw {:?}) which also fixes #15's stray "Dormant" label.

**Gossip-truth (M):** #3 `driven_by` is REMOTE-only BY DESIGN (by=Some only for WAN attach attach.rs:337; local=None per KH 7.15 / REQ-HAZARD-DRIVEN-BY-SELFHEAL) → need a SEPARATE broker-stamped "any-controller" datum gossiped via Instance::controller_node; node-refresh primitive does NOT exist + wouldn't help (None at source). #2-secondary: per-row Offline-TTL eviction (snapshot leak, registry ghost rows immortal — evict only by whole node registry.rs:280).

**WAN cluster (ordered):** #9/#10(b) SENT(WAN) is a FAKE ack — wansend.rs:138-149 fire-and-forget quinn finish() (non-blocking, no peer ack); receiver receive_wan (wan.rs:133-185) computes NoPerch/Refused then writes NOTHING back → silent drop. FIX reply-leg FIRST (mirror wan_rest round-trip). → #4 cross-node rc = MISSING client leg (rc.rs:1063 resolves only local sessions; transport exists, reuse resolve_across_visible→net_dial→remote session-resolve). → #9/#10(a) address-refresh-on-IP-change (L): registry Instance carries NO address, no proactive re-publish on IP change, send uses id-only addr_for_node_hex not the warm PeerAddrStore. (sceltouin IP changed post-join = field root.)

**PTY foundational (L):** #6 scrollback corrupt — broker is a raw-byte pump, NO grid (OutputLog ring broker.rs:213 replays raw from seq 0 into fresh terminal → alt-screen toggles corrupt scrollback). Real fix = server-side VT grid/screen model (tmux/mosh-style); "win32 vterm" = that, NOT conpty (already ConPTY). Unlocks proper sticky marker (#8/#14) + kills residual artifacts (#7).

**DESIGN-GATE RULINGS (operator 2026-06-30):** #15 → DISPLAY-ONLY (no CONTEXT change, couples #11). #1 → ALSO RUN [update.post] at install-time + surface the swallowed error (conduct cli.rs:6963 discards out.stderr).

**ROUND 2 (#16/#17/#18) + VERIFIED CORRECTIONS — doyle live-checked artifacts on hfenduleam; operator flagged subagent inferences, BOTH adapter diagnoses were WRONG:**
- **#16** eel-a "brain IPC read deadline" = BROKER-resident state wedge from the v0.18.0 self-update brain-RESPAWN (broker survives respawn → keeps bad in-mem state). Leading: POISONED effect-journal mutex (journaled ops die silently, non-journaled work — matches exactly); secondary: unbounded loopback block_on (nethost.rs:1060) on dead/saturated runtime. SELF-UPDATE-SPECIFIC. eel-a IS spt-hosted (broker-managed) — reinforces. Fix: panic-proof apply_once (into_inner not .expect) + bound the block_on; confirm via daemon stderr. Couples REQ-HAZARD-EFFECT-JOURNAL-PTY-WEDGE.
- **#17** NO_DIGEST — 3 wrong verdicts before landing it (subagent "no [digest]" WRONG; doyle "no transcript" ALSO WRONG — only searched .claude). VERIFIED: eel-a runs profile `claude-spt:ccs`; transcript EXISTS under .ccs = ~/.ccs/instances/bigscreen/projects/C--Users-decid-Documents-projects/d84df205-….jsonl. Manifest: [profiles.ccs] has NO digest override BY DESIGN — ccs relocates CC transcript via runtime CLAUDE_CONFIG_DIR (~/.ccs/…), meant to be resolved INSIDE the extractor (owlery::claude_projects_root env-aware). REAL ROOT (leading, conf M): on-demand `spt endpoint digest` runs the extractor in the DAEMON context WITHOUT eel-a's per-session CLAUDE_CONFIG_DIR → env-aware resolver can't find the .ccs transcript → NO_DIGEST. = DIGEST-ENV-PROPAGATION seam (spt-core must carry the profile's transcript-location env to the on-demand extractor). Ownership spt-core ± claude-spt resolver, NOT config-gap, NOT missing-transcript. Confirm via `spt adapter digest-proof`.
- **#18** re-register os-error-2: subagent D1/D2 (harness-hosted/empty-affected) WRONG — eel-a spt-hosted, broker HAS the session. VERIFIED D3: record source_dir=_github/SaberMage-spt-claude-code, but update derived dest _github/SaberMage-claude-spt (from [update].repo=SaberMage/claude-spt) + create_dir_all'd it EMPTY → register reads empty dir → ENOENT. The repo rename spt-claude-code→claude-spt is INTENTIONAL (perri+operator, supported) — NOT a perri bug. ROOT: `adapter update` derives install dir from [update].repo NAME instead of updating IN PLACE at the registered source_dir. Fix (spt-core): target the record's source_dir + tolerate a changed [update].repo/URL across a rename.
- **#12** = surface of #6 (rc & endpoint-run--attach are the SAME client fn → VT-not-enabled theory REFUTED). Replay-content/no-grid; "rolled past setup" NOT guaranteed (operator). Fix = #6 grid, not a client-VT patch.
- **#9/#10** REOPENED root: `spt send` uses id-only addr_for_node_hex → forces fragile iroh discovery EVERY send while the gossip pump uses cached direct addr (dial_seeded/PeerAddrStore) → gossip green but send dies on a marginal path; handshake completes → false SENT(WAN), payload lost. Access-gate/perch/spool verified correct (ruled out). Fix: seeded-addr dial + receiver→sender ack reply-leg. (Address-staleness now secondary.)

**LESSON (binding):** subagent code-diagnoses on adapter/manifest/hosting questions MUST be validated against the ACTUAL installed artifacts (manifest.toml, record.toml, perch info.json, on-disk _github dirs, CC transcripts) before asserting ownership/root — doyle has them locally. Don't relay a subagent inference as fact on adapter questions.
