I now have the full picker model. W5 is the largest wave — it touches the **registry wire format** (`Instance` gets new gossiped fields + merge/serde), the daemon advertise path, `data.rs`, `model.rs` (EpDisplay rework), and `view.rs` (palette). Before committing to it in an already-very-full context, let me size it precisely: the `EpDisplay→glyph/color` mapping in view.rs + every `Instance {` construction site.


21:const AMBER: Color = Color::Rgb(255, 176, 0);
26:        EpDisplay::Offline => Color::DarkGray,
28:        // the HOLLOW glyph (square_span) is what distinguishes it from filled
30:        EpDisplay::Online | EpDisplay::Unbound => Color::Green,
31:        EpDisplay::HarnessOnly => AMBER,
32:        EpDisplay::Controlled | EpDisplay::UnboundControlled => Color::Blue,
47:        .fg(Color::Cyan)
56:/// hollow glyph comes from the display status, not `row.status.square()`.
57:fn square_span(row: &EndpointRow) -> Span<'static> {
60:        EpDisplay::Unbound | EpDisplay::UnboundControlled => glyph::OFFLINE, // hollow ▢
88:            Span::styled(format!("{} ", glyph::CURSOR), cursor_style()),
118:                Some(p) => format!("{} {}:{p}", glyph::BRANCH, row.adapter),
153:            Style::default().fg(Color::Red),
195:            Style::default().fg(Color::DarkGray)
209:        Style::default().fg(Color::DarkGray),
223:            Style::default().fg(Color::Yellow),
262:                    Style::default().fg(Color::DarkGray).add_modifier(Modifier::DIM),
267:            let caret = if selected { glyph::CURSOR } else { " " };
292:            Span::styled("/", Style::default().fg(Color::Cyan)),
321:            Span::styled("status: ", Style::default().fg(Color::DarkGray)),
330:            Span::styled("harness: ", Style::default().fg(Color::DarkGray)),
334:            Span::styled("project history: ", Style::default().fg(Color::DarkGray)),
372:            EpDisplay::Unbound | EpDisplay::UnboundControlled
533:        // STATUS line + a HOLLOW square (▢, not the filled ■ its online status
544:        assert!(s4.contains(glyph::OFFLINE), "unbound renders the hollow ▢ square");
559:        assert!(s.contains(glyph::CURSOR), "the cursor caret renders");
576:        assert!(s.contains(glyph::BRANCH), "profile nests under the adapter");
602:    fn pick_buffer_has_squares_and_description() {
612:        assert!(s.contains(glyph::ONLINE), "online square");
613:        assert!(s.contains(glyph::OFFLINE), "offline square");


Found 16 files
crates\spt\src\cli.rs
crates\spt\src\picker\data.rs
crates\spt-daemon\src\registryhost.rs
crates\spt-daemon\src\notif.rs
crates\spt-daemon\tests\dispatch.rs
crates\spt-net\src\net\registry.rs
crates\spt-daemon\tests\pump.rs
crates\spt\src\wansend.rs
crates\spt-net\src\net\wanmsg.rs
crates\spt-net\src\net\replicate.rs
crates\spt-daemon\tests\sync.rs
crates\spt-daemon\tests\replicate.rs
crates\spt-daemon\src\wan.rs
crates\spt-daemon\src\shelldisc.rs
crates\spt-daemon\src\reconcile.rs
crates\spt-daemon\src\presence.rs


W5 is confirmed the largest, riskiest wave: it adds gossiped fields to the registry `Instance` wire struct — **16 files** construct `Instance { … }` literals (each must gain the 3 new fields), plus merge/serde handling, the daemon advertise path, `data.rs` remote-derivation, the `EpDisplay` rework (drop `UnboundControlled`, add `Suspended`), and the `view.rs` palette (red-filled Unbound, amber-hollow HarnessOnly, gray-filled Suspended). That's a wide, mechanical, wire-touching change — precisely the kind that's error-prone in an already-very-full context.

I've now fully grounded it. Writing a precise, execute-ready W5 plan to memory so a fresh window does it cleanly.


Write

---
name: v0170-w5-design
description: v0.17.0 W5 subnet display parity + palette — execute-ready plan (grounded), the LAST build wave
metadata:
  type: project
---

REQ-SUBNET-DISPLAY-PARITY (impl+unit+int). doyle GO'd. Design = docs/design/subnet-presence-display.md §B. Depends on W4 (done). Build on shared branch v0.16.0-update-arc, selective commits. **Largest wave — wire-touching; do in a FRESH context.** W1/W4/W2/W3 already landed (see [[v0170-w1-w4-blockers]], [[v0170-w2-design]]).

## Goal
Local and remote (subnet) picker rows render IDENTICALLY. Today picker/data.rs:293-294 reduces remote rows to plain green/gray because bound/unbound, controlled+driver, harness_only aren't gossiped. Fix = gossip those per-Instance fields + derive full EpDisplay for subnet rows the same as local.

## Palette (§B table) — fill = ACTIONABLE
- green-filled ■ = online·bound·free (unchanged)
- blue-filled ■ = online·controlled (driven_by; desc shows `controlled by <node>`)
- RED-filled ■ = online·UNBOUND (was green-HOLLOW; ABSORBS UnboundControlled)
- AMBER-HOLLOW ▢ = online·harness-only (was amber-FILLED)
- GRAY-FILLED ■ = Suspended (cold, node up — wakeable) — NEW combo
- gray-hollow ▢ = Offline (node down) — now REMOTE-ONLY

## Impl steps
1. **spt-net registry::Instance** (crates/spt-net/src/net/registry.rs ~line 72): add 3 ADDITIVE serde-default fields: `bound: bool` (#[serde(default)]), `controller_node: Option<String>` (the driver; #[serde(default, skip_serializing_if=Option::is_none)]), `harness_only: bool` (#[serde(default)]). Offline NEVER gossiped (no field). merge_instance: no merge-key change (epoch still sole precedence); the fields ride the row. **16 files construct `Instance { }` literals** — ALL must add the 3 fields (mostly tests → set false/None/false). Files: cli.rs, picker/data.rs, registryhost.rs, notif.rs, registry.rs, wansend.rs, wanmsg.rs, replicate.rs, wan.rs, shelldisc.rs, reconcile.rs, presence.rs + tests/{dispatch,pump,sync,replicate}.rs. CONSIDER a helper/Default to reduce churn, but struct literals still need fields — grep `Instance {` and fix each.
2. **registryhost.rs advertise_local** (the per-perch row build, ~line 410+ after `let status = advertised_status(...)`): populate bound (= is bound, i.e. NOT is_perch_unbound), controller_node (from info.json driven_by if any — check how local picker reads it: info::read_info driven_by), harness_only (= info.controllable==Some(false) for a live_agent). Mirror what picker/data.rs local_rows derives from info.json, but for THIS node's own perches.
3. **picker/data.rs subnet_rows** (~250-306): REMOVE the remote-reduction (controllable:None / driven_by:None / is_unbound:false at 290-301). Instead derive from the gossiped Instance fields: is_unbound = !bound, driven_by = controller_node (render via node_label_display), controllable = Some(!harness_only) (or map harness_only), endpoint_type from gossip if available else "live_agent". Status mapping: ADD Suspended handling — needs EpStatus to carry Suspended (see 4).
4. **picker/model.rs**: EpStatus is Online/Offline only — Suspended (gray-FILLED) is distinct from Offline (gray-hollow). Options: add `EpStatus::Suspended` OR an EndpointRow `suspended: bool` flag. CLEANEST: add EpStatus::Suspended; data.rs maps registry Active|Dormant→Online, Suspended→Suspended, Offline→Offline. EpDisplay rework: DROP UnboundControlled; Unbound→(red-filled, absorbs controlled-ness); HarnessOnly stays (now amber-HOLLOW via view); ADD Suspended. display_status: Offline→Offline; Suspended→Suspended; then online branch (unbound→Unbound [red, no separate controlled variant]; driven_by→Controlled; non-live→Online; live !controllable→HarnessOnly; else Online). Update label().
5. **picker/view.rs** (color_for ~21-32, square_span ~57-60): EpDisplay→color+glyph: Online→green-filled; Controlled→blue-filled; Unbound→RED-filled (■, was green-hollow); HarnessOnly→amber-HOLLOW (▢, was filled); Suspended→gray-filled (■); Offline→gray-hollow (▢). Remove UnboundControlled arms. Desc pane: controlled row shows `controlled by <node>` (already partly there ~line 372 region).
6. **Desc pane**: a controlled row shows `controlled by <node>` (driven_by render).

## Tests
- unit (model.rs): EpDisplay derivation over the full matrix (online{bound,unbound}×{free,controlled}, harness-only, suspended, offline) + glyph/colour. Update existing display_status tests (UnboundControlled gone, Suspended added, HarnessOnly now hollow).
- unit (registry.rs): Instance serde round-trip with the new fields + N-1 (absent) parses.
- int (picker/data.rs, mirror the W4 remote_picker test): a remote row with gossiped bound/controller/harness/suspended renders the SAME EpDisplay as the equivalent local row (local-vs-remote parity).

## Gotchas
- BUILD OOM → CARGO_BUILD_JOBS=2 per-crate. Orphan target/debug/spt.exe locks → kill by WORKSPACE PID before xtask (NEVER AppData prod daemon). `spt` no lib → --bin spt.
- ADR-0001: registry is wire-format-adjacent, but ADDITIVE serde-default fields are explicitly sanctioned by the design (forward/back-compat). N-1 rows must parse clean (test it).
- No CLI surface change → likely no xtask gen needed (verify). Public docs: picker status-square legend + palette ride W6.
- W6: twohost rig ON (W2 seam) + W5 adds gossip FIELDS not transport — judge at fold. Release counter 36, bump-in-PR, deployah.


File created successfully at: C:\Users\decid\.ccs\instances\bigscreen\projects\C--Users-decid-Documents-projects-spt-core\memory\v0170-w5-design.md (file state is current in your context — no need to Read it back)

---
name: v0170-w5-design
description: "v0.17.0 W5 subnet display parity + palette — execute-ready plan (grounded), the LAST build wave"
metadata:
  node_type: memory
  type: project
  originSessionId: 8c8eef1f-6837-4fc5-a65f-0633fc292f63
---

REQ-SUBNET-DISPLAY-PARITY (impl+unit+int). doyle GO'd. Design = docs/design/subnet-presence-display.md §B. Depends on W4 (done). Build on shared branch v0.16.0-update-arc, selective commits. **Largest wave — wire-touching; do in a FRESH context.** W1/W4/W2/W3 already landed (see [[v0170-w1-w4-blockers]], [[v0170-w2-design]]).

## Goal
Local and remote (subnet) picker rows render IDENTICALLY. Today picker/data.rs:293-294 reduces remote rows to plain green/gray because bound/unbound, controlled+driver, harness_only aren't gossiped. Fix = gossip those per-Instance fields + derive full EpDisplay for subnet rows the same as local.

## Palette (§B table) — fill = ACTIONABLE
- green-filled ■ = online·bound·free (unchanged)
- blue-filled ■ = online·controlled (driven_by; desc shows `controlled by <node>`)
- RED-filled ■ = online·UNBOUND (was green-HOLLOW; ABSORBS UnboundControlled)
- AMBER-HOLLOW ▢ = online·harness-only (was amber-FILLED)
- GRAY-FILLED ■ = Suspended (cold, node up — wakeable) — NEW combo
- gray-hollow ▢ = Offline (node down) — now REMOTE-ONLY

## Impl steps
1. **spt-net registry::Instance** (crates/spt-net/src/net/registry.rs ~line 72): add 3 ADDITIVE serde-default fields: `bound: bool` (#[serde(default)]), `controller_node: Option<String>` (the driver; #[serde(default, skip_serializing_if=Option::is_none)]), `harness_only: bool` (#[serde(default)]). Offline NEVER gossiped (no field). merge_instance: no merge-key change (epoch still sole precedence); the fields ride the row. **16 files construct `Instance { }` literals** — ALL must add the 3 fields (mostly tests → set false/None/false). Files: cli.rs, picker/data.rs, registryhost.rs, notif.rs, registry.rs, wansend.rs, wanmsg.rs, replicate.rs, wan.rs, shelldisc.rs, reconcile.rs, presence.rs + tests/{dispatch,pump,sync,replicate}.rs. CONSIDER a helper/Default to reduce churn, but struct literals still need fields — grep `Instance {` and fix each.
2. **registryhost.rs advertise_local** (the per-perch row build, ~line 410+ after `let status = advertised_status(...)`): populate bound (= is bound, i.e. NOT is_perch_unbound), controller_node (from info.json driven_by if any — check how local picker reads it: info::read_info driven_by), harness_only (= info.controllable==Some(false) for a live_agent). Mirror what picker/data.rs local_rows derives from info.json, but for THIS node's own perches.
3. **picker/data.rs subnet_rows** (~250-306): REMOVE the remote-reduction (controllable:None / driven_by:None / is_unbound:false at 290-301). Instead derive from the gossiped Instance fields: is_unbound = !bound, driven_by = controller_node (render via node_label_display), controllable = Some(!harness_only) (or map harness_only), endpoint_type from gossip if available else "live_agent". Status mapping: ADD Suspended handling — needs EpStatus to carry Suspended (see 4).
4. **picker/model.rs**: EpStatus is Online/Offline only — Suspended (gray-FILLED) is distinct from Offline (gray-hollow). Options: add `EpStatus::Suspended` OR an EndpointRow `suspended: bool` flag. CLEANEST: add EpStatus::Suspended; data.rs maps registry Active|Dormant→Online, Suspended→Suspended, Offline→Offline. EpDisplay rework: DROP UnboundControlled; Unbound→(red-filled, absorbs controlled-ness); HarnessOnly stays (now amber-HOLLOW via view); ADD Suspended. display_status: Offline→Offline; Suspended→Suspended; then online branch (unbound→Unbound [red, no separate controlled variant]; driven_by→Controlled; non-live→Online; live !controllable→HarnessOnly; else Online). Update label().
5. **picker/view.rs** (color_for ~21-32, square_span ~57-60): EpDisplay→color+glyph: Online→green-filled; Controlled→blue-filled; Unbound→RED-filled (■, was green-hollow); HarnessOnly→amber-HOLLOW (▢, was filled); Suspended→gray-filled (■); Offline→gray-hollow (▢). Remove UnboundControlled arms. Desc pane: controlled row shows `controlled by <node>` (already partly there ~line 372 region).
6. **Desc pane**: a controlled row shows `controlled by <node>` (driven_by render).

## Tests
- unit (model.rs): EpDisplay derivation over the full matrix (online{bound,unbound}×{free,controlled}, harness-only, suspended, offline) + glyph/colour. Update existing display_status tests (UnboundControlled gone, Suspended added, HarnessOnly now hollow).
- unit (registry.rs): Instance serde round-trip with the new fields + N-1 (absent) parses.
- int (picker/data.rs, mirror the W4 remote_picker test): a remote row with gossiped bound/controller/harness/suspended renders the SAME EpDisplay as the equivalent local row (local-vs-remote parity).

## Gotchas
- BUILD OOM → CARGO_BUILD_JOBS=2 per-crate. Orphan target/debug/spt.exe locks → kill by WORKSPACE PID before xtask (NEVER AppData prod daemon). `spt` no lib → --bin spt.
- ADR-0001: registry is wire-format-adjacent, but ADDITIVE serde-default fields are explicitly sanctioned by the design (forward/back-compat). N-1 rows must parse clean (test it).
- No CLI surface change → likely no xtask gen needed (verify). Public docs: picker status-square legend + palette ride W6.
- W6: twohost rig ON (W2 seam) + W5 adds gossip FIELDS not transport — judge at fold. Release counter 36, bump-in-PR, deployah.


Updating the index + commune checkpoint, then reporting.


Edit

- [v0.17.0 W3 LANDED (diagnosable join)](v0170-w1-w4-blockers.md)

- [v0.17.0 W5 PLAN (display parity — LAST wave, not started)](v0170-w5-design.md) — execute-ready, GROUNDED. Wire-touching: registry Instance gains 3 gossiped fields (bound/controller_node/harness_only) → 16 `Instance {}` literal sites + advertise + data.rs remote-derivation + EpDisplay rework (drop UnboundControlled, add Suspended) + view palette. Do in a FRESH context (overloaded-context risk). doyle GO'd.
- [v0.17.0 W3 LANDED (diagnosable join)](v0170-w1-w4-blockers.md)


The file C:\Users\decid\.ccs\instances\bigscreen\projects\C--Users-decid-Documents-projects-spt-core\memory\MEMORY.md has been updated successfully. (file state is current in your context — no need to Read it back)

- [v0.17.0 W5 PLAN (display parity — LAST wave, not started)](v0170-w5-design.md) — execute-ready, GROUNDED. Wire-touching: registry Instance gains 3 gossiped fields (bound/controller_node/harness_only) → 16 `Instance {}` literal sites + advertise + data.rs remote-derivation + EpDisplay rework (drop UnboundControlled, add Suspended) + view palette. Do in a FRESH context (overloaded-context risk). doyle GO'd.
- [v0.17.0 W3 LANDED (diagnosable join)](v0170-w1-w4-blockers.md)

- [v0.14.1 builds (F-018+picker+netstream)](f018-adapter-add-nondestructive.md) — PUBLISHED counter 31. F-018 adapter-add non-destructive, picker home-subnet, netstream flake FIX. GOTCHA: `spt` NO lib target → `--bin spt`.

- [F-019 translation install_dir resolve](f019-translation-install-dir-resolve.md) — PUBLISHED v0.14.2 counter 32. CC-on-Win blocker: idle msgs typed-not-SUBMITTED, root=bare path not resolved vs install_dir. Fix=resolve_program_in_dir ×4 sites.

- [v0.17.0 robust-join DESIGNED (next build)](v0170-robust-join-design.md) — branch v0.17.0-robust-join off main @551f3dc. ADR-0030 (two-phase meet-before-code + per-family bind gate + diagnosable join) + REQ-PRESENCE-LIVENESS-TRUTH. JIT W1 family-gate + W4 presence-truth = urgent correctness; W2/W3 = UX. todlando builds next. Diags: [[broken-ipv6-poisons-iroh-discovery]] + [[presence-dead-shows-online]].

+- [v0.17.0 W5 PLAN (display parity — LAST wave, not started)](v0170-w5-design.md) — execute-ready, GROUNDED. Wire-touching: registry Instance gains 3 gossiped fields (bound/controller_node/harness_only) → 16 `Instance {}` literal sites + advertise + data.rs remote-derivation + EpDisplay rework (drop UnboundControlled, add Suspended) + view palette. Do in a FRESH context (overloaded-context risk). doyle GO'd.

- [v0.17.0 W3 LANDED (diagnosable join)](v0170-w1-w4-blockers.md) — @be1f4d6: REQ-JOIN-DIAGNOSTICS impl+unit. CLI live-progress thread + meet_failure_detail (concise/--verbose, bound-families ties W1) + terminal-event propagation (W2 already killed the _=>continue swallow) + --verbose flag. DEFERRED: SUCCESS-path SPT_LOG trace (no daemon tracing facility). W5 is the last build wave.

- [v0.17.0 W2 LANDED (two-phase join)](v0170-w2-design.md) — @a07322c: meet-before-code (REQ-JOIN-TWO-PHASE impl+unit+int). meet_via_rendezvous split + broker pair_holds 5-min state machine + cli meet→prompt→submit. All gates green. GOTCHA: orphan target/debug/spt.exe from cli nextest locks files → kill by workspace-PID before xtask.

- [v0.17.0 W1+W4 LANDED](v0170-w1-w4-blockers.md) — 2026-06-28: W4 @867c7ab (cold perch→Suspended not Dormant, REQ-PRESENCE-LIVENESS-TRUTH impl+unit+int) + W1 @7cddaba (per-family bind gate, REQ-NET-FAMILY-GATE doc+impl+unit). All gated (311/311 traceable, clippy/xtask clean). Built on SHARED branch v0.16.0-update-arc (NOT the design-memo's v0.17.0-robust-join), doyle's tree. W2/W3/W5/W6 pending doyle scope. Build OOM→CARGO_BUILD_JOBS=2 per-crate.


Write

# todlando commune — v0.17.0 build: 4 of 5 waves landed; W5 grounded + plan-ready

## Status
v0.17.0 (robust WAN join + presence/display) IN BUILD, shared branch `v0.16.0-update-arc`, doyle's tree, selective commits. doyle gates + GO'd all waves.

LANDED + GATED (each: nextest spt-net/spt-daemon/spt green, clippy --workspace clean, traceable exit 0, xtask OK):
- W1 @7cddaba — per-family bind gate (REQ-NET-FAMILY-GATE).
- W4 @867c7ab — cold perch → Suspended not Dormant (REQ-PRESENCE-LIVENESS-TRUTH).
- W2 @a07322c — two-phase meet-before-code join (REQ-JOIN-TWO-PHASE).
- W3 @be1f4d6 — diagnosable join (REQ-JOIN-DIAGNOSTICS): CLI live-progress + meet_failure_detail + --verbose + terminal-event propagation confirmed.

## NEXT — W5 (LAST build wave), then W6 release
W5 = REQ-SUBNET-DISPLAY-PARITY. NOT started — fully grounded, execute-ready plan in memory [[v0170-w5-design]]. It is WIRE-TOUCHING + wide: registry Instance gains 3 additive gossiped fields (bound / controller_node / harness_only) → **16 `Instance {}` literal sites** + advertise_local populate + picker/data.rs remote-derivation (remove the :293 reduction) + EpDisplay rework (DROP UnboundControlled, ADD Suspended, HarnessOnly→amber-hollow, Unbound→red-filled) + view.rs palette. Best done in a FRESH context (this session is overloaded after 4 waves — wire+16-site change is error-prone here). doyle GO'd; recommended a clean window.

W6 = int activations at fold, public docs (picker palette legend), release counter 36 bump-in-PR + deployah. twohost rig ON (W2 pairing-order = cross-host seam); W5 adds gossip fields not transport — judge at fold.

## Gotchas (live)
- BUILD OOM if 3 crate test-bins codegen at once → $env:CARGO_BUILD_JOBS=2, per-crate nextest.
- Orphan target/debug/spt.exe from cli nextest hold file locks → xtask "building spt failed" (os error 5). Kill by WORKSPACE-target PID; NEVER AppData\Local\spt-core\bin (live prod daemon).
- `spt` NO lib target → --bin spt. `spt send` bounces NO_PERCH → `$OWL send doyle todlando`.
- /self-clear API-blocked (classifier refuses) — continue in-context or user /clear.

## Memory
MEMORY.md current. v0170-w5-design.md (execute-ready), v0170-w2-design.md (SHIPPED), v0170-w1-w4-blockers.md.


File created successfully at: C:\Users\decid\Documents\projects\spt-core\.claude\todlando-commune.md (file state is current in your context — no need to Read it back)

# todlando commune — v0.17.0 build: 4 of 5 waves landed; W5 grounded + plan-ready

## Status
v0.17.0 (robust WAN join + presence/display) IN BUILD, shared branch `v0.16.0-update-arc`, doyle's tree, selective commits. doyle gates + GO'd all waves.

LANDED + GATED (each: nextest spt-net/spt-daemon/spt green, clippy --workspace clean, traceable exit 0, xtask OK):
- W1 @7cddaba — per-family bind gate (REQ-NET-FAMILY-GATE).
- W4 @867c7ab — cold perch → Suspended not Dormant (REQ-PRESENCE-LIVENESS-TRUTH).
- W2 @a07322c — two-phase meet-before-code join (REQ-JOIN-TWO-PHASE).
- W3 @be1f4d6 — diagnosable join (REQ-JOIN-DIAGNOSTICS): CLI live-progress + meet_failure_detail + --verbose + terminal-event propagation confirmed.

## NEXT — W5 (LAST build wave), then W6 release
W5 = REQ-SUBNET-DISPLAY-PARITY. NOT started — fully grounded, execute-ready plan in memory [[v0170-w5-design]]. It is WIRE-TOUCHING + wide: registry Instance gains 3 additive gossiped fields (bound / controller_node / harness_only) → **16 `Instance {}` literal sites** + advertise_local populate + picker/data.rs remote-derivation (remove the :293 reduction) + EpDisplay rework (DROP UnboundControlled, ADD Suspended, HarnessOnly→amber-hollow, Unbound→red-filled) + view.rs palette. Best done in a FRESH context (this session is overloaded after 4 waves — wire+16-site change is error-prone here). doyle GO'd; recommended a clean window.

W6 = int activations at fold, public docs (picker palette legend), release counter 36 bump-in-PR + deployah. twohost rig ON (W2 pairing-order = cross-host seam); W5 adds gossip fields not transport — judge at fold.

## Gotchas (live)
- BUILD OOM if 3 crate test-bins codegen at once → $env:CARGO_BUILD_JOBS=2, per-crate nextest.
- Orphan target/debug/spt.exe from cli nextest hold file locks → xtask "building spt failed" (os error 5). Kill by WORKSPACE-target PID; NEVER AppData\Local\spt-core\bin (live prod daemon).
- `spt` NO lib target → --bin spt. `spt send` bounces NO_PERCH → `$OWL send doyle todlando`.
- /self-clear API-blocked (classifier refuses) — continue in-context or user /clear.

## Memory
MEMORY.md current. v0170-w5-design.md (execute-ready), v0170-w2-design.md (SHIPPED), v0170-w1-w4-blockers.md.


Bash

printf '%s' "doyle — W3 confirmed landed @be1f4d6 (reported). W5 status: NOT started — fully GROUNDED, execute-ready plan committed to memory (v0170-w5-design.md).

W5 is wire-touching + wide: registry::Instance gains 3 ADDITIVE gossiped fields (bound / controller_node / harness_only) → 16 `Instance {}` literal sites must each gain them + advertise_local populate + picker/data.rs remote-derivation (remove the :293 reduction) + EpDisplay rework (DROP UnboundControlled, ADD Suspended, HarnessOnly→amber-hollow, Unbound→red-filled) + view.rs palette. N-1 rows must parse clean (additive serde-default, ADR-0001-sane).

Judgment call: I have 4 waves' worth of context loaded (W1/W4/W2/W3 + deep reads). A 16-site wire change is exactly the kind that goes subtly wrong in an overloaded context (missed construction site = compile break; mis-set field = silent wire skew). I can't /self-clear (classifier blocks the turn). So I've checkpointed (commune + memory) and am pausing W5 for a FRESH window — recommend a /clear, then W5 executes clean off the plan, then W6 fold.

4/5 build waves DONE + gated + committed. W6 (twohost ON for W2 seam, counter 36, bump-in-PR) stays teed up — no blockers. Will resume W5 on the next window or your call." | $OWL send doyle todlando 2>&1 | tail -1


/usr/bin/bash: line 12: Instance: command not found
➜ SENT:doyle


The heredoc double-quotes let bash eat the backticks — message went but mangled. Resending clean (single-quoted, no backticks).


printf '%s' 'doyle — correction/resend (last msg had shell-mangled backticks). W3 confirmed landed @be1f4d6.

W5 status: NOT started — fully GROUNDED, execute-ready plan in memory (v0170-w5-design.md). W5 is wire-touching + wide: registry Instance gains 3 ADDITIVE gossiped fields (bound / controller_node / harness_only) → 16 Instance-literal sites each gain them + advertise_local populate + picker data.rs remote-derivation (remove the line-293 reduction) + EpDisplay rework (DROP UnboundControlled, ADD Suspended, HarnessOnly to amber-hollow, Unbound to red-filled) + view.rs palette. N-1 rows must parse clean (additive serde-default).

Judgment: 4 waves of context loaded here (W1/W4/W2/W3 + deep reads). A 16-site wire change is the kind that goes subtly wrong in an overloaded context (missed site = compile break; mis-set field = silent wire skew). Cannot /self-clear (classifier blocks the turn). Checkpointed (commune + memory); pausing W5 for a FRESH window — recommend /clear, then W5 executes clean off the plan, then W6 fold.

4/5 build waves DONE + gated + committed (W1 7cddaba, W4 867c7ab, W2 a07322c, W3 be1f4d6). W6 (twohost ON for W2 seam, counter 36, bump-in-PR) teed up, no blockers. Resume W5 next window or your call.' | $OWL send doyle todlando 2>&1 | tail -1


➜ SENT:doyle


v0.17.0 build — 4 of 5 waves landed, all gated + committed + reported to doyle:

| Wave | Commit | What |
|---|---|---|
| W1 | `7cddaba` | per-family bind gate (REQ-NET-FAMILY-GATE) |
| W4 | `867c7ab` | cold perch → Suspended not Dormant (REQ-PRESENCE-LIVENESS-TRUTH) |
| W2 | `a07322c` | two-phase meet-before-code join (REQ-JOIN-TWO-PHASE) |
| W3 | `be1f4d6` | diagnosable join — progress + detail + `--verbose` (REQ-JOIN-DIAGNOSTICS) |

Each: spt-net / spt-daemon / spt nextest green, clippy --workspace clean, traceable exit 0, xtask OK.

**W5 (last build wave) — grounded, NOT started.** Stopped deliberately. W5 is wire-touching + wide: registry `Instance` gains 3 gossiped fields → **16 `Instance {}` sites** + advertise + picker remote-derivation + `EpDisplay` rework + view palette. That kind of broad, wire-format change is error-prone in this context (4 waves + deep reads loaded). Execute-ready plan is in memory (`v0170-w5-design.md`); commune + checkpoint dropped.

**Recommend `/clear`, then W5 runs clean off the plan** → then W6 (release counter 36, twohost rig on for the W2 seam, bump-in-PR). I can't `/self-clear` (classifier blocks it).

Say continue and I'll do W5 here; or `/clear` and I'll pick it straight up from the plan.


<task-notification>
<task-id>bdfzr7zvf</task-id>
<summary>Monitor event: "« spt event »"</summary>
<event><EVENT-PART seq="1/2" id="d0780e40" type="msg" from="doyle">todlando — ACK (clean copy received). Outstanding run: W1/W4/W2/W3 all landed + independently re-gated GREEN my side (926→ now incl W3). STAND DOWN on W5 — your overloaded-context judgment is right, so rather than block on a manual clear I'm executing W5 in a FRESH worker window off the repo design (docs/design/su</EVENT-PART>
<EVENT-PART seq="2/2" id="d0780e40">bnet-presence-display.md §B) + your exact 16-site map, then gating + folding W6 myself. You don't need to resume W5. Stay perched for W6 questions if I hit anything (twohost rig, counter-36 bump). Excellent build run — 4/5 waves clean. I'll take it home.</EVENT-PART></event>
</task-notification>


<owl_reachability_notice>
You have an active owl perch. When spawning subagents or doing work, use run_in_background: true so you stay reachable for incoming messages.
</owl_reachability_notice>


CAVEMAN MODE ACTIVE (full). Drop articles/filler/pleasantries/hedging. Fragments OK. Code/commits/security: write normal.


doyle taking W5 + W6 home off the plan/16-site map. Standing down. Acking + noting the handoff.


printf '%s' 'doyle — ACK, standing down on W5. It is yours: design §B + the 16-site map in v0170-w5-design.md (memory). Two flags for your W5 run:
- registry::Instance new fields = ADDITIVE serde-default; N-1 (absent) rows MUST parse clean — worth a round-trip + N-1 unit test (a silent wire skew is the failure mode).
- EpStatus is Online/Offline only today; Suspended (gray-FILLED) is a THIRD raw state distinct from Offline (gray-hollow) — add EpStatus::Suspended (or an EndpointRow flag) so display_status can tell them apart. data.rs maps Active|Dormant→Online, Suspended→Suspended, Offline→Offline.
- W4 picker int (remote_picker_renders_suspended_dead_perch_offline) will need its assertion revisited once Suspended renders gray-FILLED not plain-offline.

Perched for W6: twohost (W2 changed pairing handshake ORDER, not the QUIC subnet transport — meet/ceremony only; W5 adds gossip FIELDS not transport) + counter-36 bump-in-PR. Ping if anything. Good run — 4/5 clean, handing the last + release to you.' | $OWL send doyle todlando 2>&1 | tail -1


Edit

- [v0.17.0 W5 PLAN (display parity — LAST wave, not started)](v0170-w5-design.md) — execute-ready, GROUNDED. Wire-touching: registry Instance gains 3 gossiped fields (bound/controller_node/harness_only) → 16 `Instance {}` literal sites + advertise + data.rs remote-derivation + EpDisplay rework (drop UnboundControlled, add Suspended) + view palette. Do in a FRESH context (overloaded-context risk). doyle GO'd.

- [v0.17.0 W5 PLAN (display parity — LAST wave)](v0170-w5-design.md) — execute-ready, GROUNDED. DOYLE-OWNED as of 2026-06-28: doyle executes W5 in a fresh worker off design §B + this 16-site map, then gates + folds W6 himself. todlando STOOD DOWN (overloaded-context judgment). Wire-touching: registry Instance +3 gossiped fields (bound/controller_node/harness_only) → 16 `Instance {}` sites + advertise + data.rs remote-derivation + EpDisplay rework (drop UnboundControlled, add Suspended) + view palette. todlando reactive for W6 Qs (twohost/counter-36) only.


-- [v0.17.0 W5 PLAN (display parity — LAST wave, not started)](v0170-w5-design.md) — execute-ready, GROUNDED. Wire-touching: registry Instance gains 3 gossiped fields (bound/controller_node/harness_only) → 16 `Instance {}` literal sites + advertise + data.rs remote-derivation + EpDisplay rework (drop UnboundControlled, add Suspended) + view palette. Do in a FRESH context (overloaded-context risk). doyle GO'd.

+- [v0.17.0 W5 PLAN (display parity — LAST wave)](v0170-w5-design.md) — execute-ready, GROUNDED. DOYLE-OWNED as of 2026-06-28: doyle executes W5 in a fresh worker off design §B + this 16-site map, then gates + folds W6 himself. todlando STOOD DOWN (overloaded-context judgment). Wire-touching: registry Instance +3 gossiped fields (bound/controller_node/harness_only) → 16 `Instance {}` sites + advertise + data.rs remote-derivation + EpDisplay rework (drop UnboundControlled, add Suspended) + view palette. todlando reactive for W6 Qs (twohost/counter-36) only.


The memory index at MEMORY.md is 19.6KB, approaching the 24.4KB read limit. Compact it to under 17.1KB now: keep one line per entry, move detail into topic files, and merge or drop stale entries.


MEMORY.md hit the compaction threshold. Reading it fully to compact (one terse line per entry, drop nothing critical).


1	- [v0.14.0 endpoint-creation-flow](v0140-endpoint-creation-flow.md) — PUBLISHED counter 30. Multi-subnet home-at-creation + UNBOUND pre-bind attach. SPT_RELEASE_SEED in env (len64).
2	- [v0.14.1 builds (F-018+picker+netstream)](f018-adapter-add-nondestructive.md) — PUBLISHED counter 31. F-018 adapter-add non-destructive, picker home-subnet, netstream flake FIX. GOTCHA: `spt` NO lib target → `--bin spt`.
3	- [F-019 translation install_dir resolve](f019-translation-install-dir-resolve.md) — PUBLISHED v0.14.2 counter 32. CC-on-Win blocker: idle msgs typed-not-SUBMITTED, root=bare path not resolved vs install_dir. Fix=resolve_program_in_dir ×4 sites.
4	- [v0.17.0 robust-join DESIGNED (next build)](v0170-robust-join-design.md) — branch v0.17.0-robust-join off main @551f3dc. ADR-0030 (two-phase meet-before-code + per-family bind gate + diagnosable join) + REQ-PRESENCE-LIVENESS-TRUTH. JIT W1 family-gate + W4 presence-truth = urgent correctness; W2/W3 = UX. todlando builds next. Diags: [[broken-ipv6-poisons-iroh-discovery]] + [[presence-dead-shows-online]].
5	- [v0.17.0 W5 PLAN (display parity — LAST wave)](v0170-w5-design.md) — execute-ready, GROUNDED. DOYLE-OWNED as of 2026-06-28: doyle executes W5 in a fresh worker off design §B + this 16-site map, then gates + folds W6 himself. todlando STOOD DOWN (overloaded-context judgment). Wire-touching: registry Instance +3 gossiped fields (bound/controller_node/harness_only) → 16 `Instance {}` sites + advertise + data.rs remote-derivation + EpDisplay rework (drop UnboundControlled, add Suspended) + view palette. todlando reactive for W6 Qs (twohost/counter-36) only.
6	- [v0.17.0 W3 LANDED (diagnosable join)](v0170-w1-w4-blockers.md) — @be1f4d6: REQ-JOIN-DIAGNOSTICS impl+unit. CLI live-progress thread + meet_failure_detail (concise/--verbose, bound-families ties W1) + terminal-event propagation (W2 already killed the _=>continue swallow) + --verbose flag. DEFERRED: SUCCESS-path SPT_LOG trace (no daemon tracing facility). W5 is the last build wave.
7	- [v0.17.0 W2 LANDED (two-phase join)](v0170-w2-design.md) — @a07322c: meet-before-code (REQ-JOIN-TWO-PHASE impl+unit+int). meet_via_rendezvous split + broker pair_holds 5-min state machine + cli meet→prompt→submit. All gates green. GOTCHA: orphan target/debug/spt.exe from cli nextest locks files → kill by workspace-PID before xtask.
8	- [v0.17.0 W1+W4 LANDED](v0170-w1-w4-blockers.md) — 2026-06-28: W4 @867c7ab (cold perch→Suspended not Dormant, REQ-PRESENCE-LIVENESS-TRUTH impl+unit+int) + W1 @7cddaba (per-family bind gate, REQ-NET-FAMILY-GATE doc+impl+unit). All gated (311/311 traceable, clippy/xtask clean). Built on SHARED branch v0.16.0-update-arc (NOT the design-memo's v0.17.0-robust-join), doyle's tree. W2/W3/W5/W6 pending doyle scope. Build OOM→CARGO_BUILD_JOBS=2 per-crate.
9	- [presence: dead endpoints show ONLINE remotely](presence-dead-shows-online.md) — registryhost.rs:404 gossips a not-alive perch as Dormant; picker/data.rs:268 maps remote Dormant→Online. Fix=dead→Offline (guard live-unbound) + picker Dormant-distinct. v0.17.0 W4.
10	- [v0.16.0 PUBLISHED (update-arc + CLI/UX)](v0160-published.md) — ✅ counter 35 @9e5b33b (PR#38, 2026-06-25). 6 waves all doyle-gated: subst keys {adapter_dir}/{adapter_name} + lazy [strings] (ADR-0029 resolve-not-execute) / translation [command] / [update.post] composite / --reply-to REMOVED / empty-scope create / global --json / digest cursor / rc identity row. hashes linux e13d7c2d… / win f6cd39ec…. deployah caught a docs-token leak at the gate (clap /// REQ-tag → //, see [[clap-doc-comment-leaks-req-tag]]). perri GO sent for claude-spt v0.8.0 (min_spt_core→0.16.0). Build/ratify detail: [[v0160-w1-manifest-runtime]].
11	- [Win update-exe UAC-740](win-update-exe-uac740.md) — exe/fixture names containing "update"/"setup"/"install" trip Win installer-detection → os-error-740 elevation. Name spawned test helpers around it (W2 used "post_step").
12	- [v0.15.0 messaging milestone](v0150-w1-activity-gated-delivery.md) — PUBLISHED counter 34 @18d5045 (PR#37). W1 activity-gated delivery + fault-transient re-spool; W2-W4 `spt send` axes (--idle-only/--active-only/--ephemeral/--prefer-native/--force-native/--json-payload) + Win console-window fix; W5 `spt api psyche-download`. perri real-CC validate pending (3 axes+json+no-window+psyche-download).
13	- [seedmap test timeout = STARVATION not collision](seedmap-test-collides-live-daemon.md) — `seedmap::request_stop_barrier_holds_until_no_listener` times out on a LOADED shared box. NOT a socket collision (REFUTED — with_home tempdir SPT_HOME → unique per-test socket). REAL=load-starvation, RERUNNABLE flake. LESSON: verify the FULL chain before confirming a diagnosis.
14	- [v0.15.0 public docs-site update](v0150-public-docs-update.md) — MUST ride the release. xtask gen only does reference.md; PROSE pages need hand-direction. GAPS: integration-checklist api psyche-download row + api.md verb + messaging send-axes/--json-payload. doyle authors, publish docs-publish.yml, VERSION numbers no internal codes.
15	- [v0.16.0 release → ping perri](v0160-release-ping-perri.md) — ON v0.16.0 drop (counter 35) doyle MUST $OWL send perri the GO: cluster-A consumable (subst keys/[strings] lazy/translation command/[update.post]) + min_spt_core→0.16.0. perri builds claude-spt v0.8.0 dependent features.
16	- [v0.15.0 W5 resume-context pull](v0150-w5-resume-context-pull.md) — SHIPPED. REQ-RESUME-CONTEXT-PULL: `spt api psyche-download <id>` + durable role/live/project + <pending-commune>/<pending-signoff> append gated on NOT-YET-SYNTHESIZED (adapter read=TOCTOU vs ingest-delete). Tier-2 (drift-stamp/<current>/memformat) DEFERRED.
17	- [v0.15.0 W2 drain-split ratify](v0150-w1-activity-gated-delivery.md) — SHIPPED. deferred=1 IFF window='active_only'. Only active-hook re-points to a new drain_active_window_at; relay + drain_idle_window UNCHANGED; derive deferred from window at the single insert chokepoint.
18	- [owl --reply-to broken](owl-reply-to-broken.md) — BINDING (operator 2026-06-24): `$OWL send --reply-to` BROKEN (loops msg back to sender as fake inbound). ALWAYS plain `$OWL send <target> <self-id>` (e.g. `spt send perri doyle`). Kin [[owl-send-not-legacy-spt-send]].
19	- [commune-ingest LLM-synthesis + gap shapes](commune-ingest-pulse-latency-gap.md) — commune ingest IS LLM-synthesized UPSTREAM of the drop; daemon ingest (lifecycle.rs:466 @5s pulse) is MECHANICAL filing. LESSON: meaning-Qs → read CONTEXT.md/CONTEXT-MEMORY.md primary, not a single Explore trace.
20	- [v0.14.3 raw-inject removal](v0143-raw-inject-removal.md) — PUBLISHED counter 33. spt-hosted idle = translation-binary-ONLY; no-binary/faulted → SPOOL (loud), never raw PTY write. REQ-HAZARD-IDLE-SILENT-NONDELIVERY.
21	- [Win netstream redrive flake](win-netstream-redrive-flake.md) — FIXED v0.14.1 (#4): Win-only CI flake, root=StreamLog seq counts transport read_chunks. Verify-per-attempt lesson stands.
22	- [translation binary console-window bug](translation-binary-console-window-bug.md) — spt-hosted translation binary spawns VISIBLE console on Win. ROOT=translation.rs:242 missed CREATE_NO_WINDOW. Fix=cfg(windows) creation_flags(0x0800_0000). Rolls into v0.15.0 W4. NOT a new REQ.
23	- [release standard: bump-in-PR](release-standard-bump-in-pr.md) — v0.14.1 ONWARD: bump rides IN release PR → PR CI validates tagged commit → tag on merge. Kills serial 2nd-CI wait.
24	- [v0.14.0 W6 int structure](v0140-w6-int-structure.md) — mirror perri regression: ≥2-subnet gate, Case1 endpoint-run E2E behind acceptance-env, Cases2/3 fast bind probes.
25	- [v0.13.2 build drive](v0132-build-drive.md) — PUBLISHED counter 29; adapter-packaging. W6 docs-token gate (public --help no internal codes).
26	- [v0.13.0 forkpty ground truth](v013-forkpty-groundtruth.md) — SHIPPED counter 27. green-units≠green-int. gh run rerun attaches STALE attempt — verify per-attempt.
27	- [v0.13.0 W1b effect-journal wedge](v013-w1b-effect-journal-wedge.md) — REQ-HAZARD-EFFECT-JOURNAL-PTY-WEDGE: lock-across-fsync+PtyWrite kills attaches. Fix=no-lock-across-effect + drop per-keystroke fsync.
28	- [v0.12.1 real-harness reopen](v0121-realharness-reopen.md) — v0.12.0 lifecycle broke in REAL harness (green-on-mocks). BINDING: gate lifecycle vs REAL dummy-harness, NO mocks.
29	- [v0.12.1 L0 attach-deadlock](v0121-l0-attach-deadlock-root.md) — KEYSTONE: serve_attach forwards on SAME broker IPC conn; inline ring replay blocks → deadlock → rc 0 bytes.
30	- [v0.12.1 help-md render](v0121-help-md.md) — `spt --help` leaked literal MD; helpfmt::render (bold→ANSI/code→cyan, strip on pipe/NO_COLOR). REQ-CLI-HELP-MARKDOWN.
31	- [changelog scope vs commit range](changelog-scope-vs-commit-range.md) — release CHANGELOG must COVER every user-facing SURFACE in vPREV..vNEW (log=checklist NOT quota) + bullet SCOPE not broader than delta.
32	- [pre-flight clippy --workspace](ci-clippy-preflight-workspace.md) — CI denies warnings workspace-wide; `-p <crate>` misses sibling lints. CI fires on PR.
33	- [gate int with nextest not bare cargo test](gate-int-tests-with-nextest-not-bare-cargo-test.md) — re-gate spt broker/PTY int suites via `cargo nextest` (process-per-test) or `--test-threads=1`, NEVER bare `cargo test` on Win (env set_var races → FALSE flakes). Paid 2026-06-23.
34	- [behavior-change → grep tests](behavior-change-grep-tests-not-comments.md) — rename/behavior/token change: grep tests/+ci/ for OLD behavior as ASSERTIONS; comment-only hit = RED FLAG, read body. Run heavy e2e locally.
35	- [shared-seam → run ALL seam tests](shared-seam-change-run-all-seam-tests.md) — SHARED runtime-seam change breaks SIBLING tests; grep+run ALL seam tests not just new ones.
36	- [ccs Windows PTY-spawn fix](ccs-win-pty-program-resolve.md) — bare program → portable-pty picks extensionless shim → CreateProcessW 193. Fix: spt_term::winprog PATHEXT resolver. REQ-HAZARD-WIN-PTY-PROGRAM-RESOLVE.
37	- [harness adapter-agnostic resolution](harness-adapter-agnostic-resolution.md) — ADR-0021: seed adapter-AGNOSTIC (pid+session_id), --adapter OPTIONAL; resolve at bind by pid→exe→host_binaries→profiles.
38	- [broker-QUIC-deadline](v083-broker-quic-deadline.md) — REQ-HAZARD-BROKER-QUIC-DEADLINE: NetHost::bounded_block_on (10s<30s brain) wraps dial/open/send → dead peer = ORDINARY error, pump redials.
39	- [F-007 live-relay acceptance](f007-live-relay-acceptance.md) — live bringup = persistent `api listen` via Monitor (NOT --once/ready); psyche-spawn gated on --manifest + install-dir fix. Ground in CONTEXT.md before ruling.
40	- [delegate-build preflight hang](delegate-build-preflight-hang.md) — bg build agents hang silently on full int suite; instruct targeted units; check liveness via transcript mtime, take partial work.
41	- [proceed autonomously](dont-wait-proceed-autonomously.md) — operator: don't stop to ask permission between steps; chain next action.
42	- [broker is daemon state anchor](broker-is-daemon-state-anchor.md) — post-ADR-0018 BROKER (not restartable brain) = always-up CLI-reachable daemon-lifetime anchor; place ephemeral in-mem state there.
43	- [adapter add --release archive](adapter-add-release-archive.md) — `spt adapter add --release <user/repo>` (REQ-INSTALL-9): fetch .spt tar from GH release, extract, register root. Acquisition only.
44	- [adapter tips → published docs](adapter-tips-published-docs.md) — perri tips → harness-agnostic docs-site patterns.md; publish via `gh workflow run docs-publish.yml --ref main`. Pre-flight xtask check+site.
45	- [unmergeable PR blocks CI](unmergeable-pr-blocks-ci.md) — push yields NO pull_request run + 0 checks = UNMERGEABLE PR. Diagnose `gh pr view --json mergeable`. Fix: merge main in.
46	- [CLI command → docs-drift gate](cli-command-docs-drift.md) — adding/changing a `spt` CLI command needs `cargo run -p xtask -- gen` (regen reference.md) AND no internal codes in clap ///. CI-gated.
47	- [gate against documented design](gate-against-documented-design.md) — verify a wave's premise vs RECORDED design (CONTEXT/ADRs) not just impl — an impl limitation can contradict locked design.
48	- [grep REQ tags to find impl](grep-req-tags-to-find-impl.md) — to reconcile is-REQ-X-wired, grep `REQ-X` FIRST — [impl/int->REQ-X] tags point straight to code; faster than an agent trace.
49	- [public docs: version not milestone](public-docs-version-not-milestone.md) — published docs-site uses VERSION numbers, never internal M#/W# codes; grep docs-site edits before commit.
50	- [M12 FULLY GATED](m12-w1-progress.md) — end-to-end GATE-PASS. Published v0.6.0 baseline used to start perri.
51	- [cplugs publish mechanics](cplugs-publish-mechanics.md) — cplugs steps in claude_skill_owl/docs/DEPLOY.md; spt-claude-code takes SKELETON only (binary+manifest ride adapter registry not cplugs).
52	- [perri question triage](perri-question-triage-protocol.md) — STANDING: perri builds blind from PUBLISHED docs+binary. Every impl Q = diagnostic; classify w/ EVIDENCE. Never answer from memory.
53	- [perri needs reply to continue](perri-needs-reply-to-continue.md) — STANDING: ALWAYS reply to perri (ack+keep-going+next); silence = stop-point. todlando self-drives, perri needs nudge.
54	- [no machine-wide kill on shared runner](no-machinewide-killon-shared-runner.md) — BINDING: HFENDULEAM self-hosted runner shares box w/ LIVE agents; never machine-wide `Stop-Process spt`; scope to $GITHUB_WORKSPACE/target or PID.
55	- [agent roles](agent-roles.md) — doyle=gater/owner (don't self-execute big builds), todlando=executor, perri=adapter builder. perri gap→doyle design→todlando build→doyle gate→perri validate.
56	- [EVENT envelope + __REPLY_TO__ removal](event-envelope-reply-to-removal.md) — ADR-0020: `<EVENT type=msg from=…>` = sole arriving-message format. __REPLY_TO__ REMOVED. LESSON: pin OWL_SESSION_ID for auth-gated E2E.
57	- [harness boundary + grounding](spt-core-harness-boundary-and-grounding.md) — BINDING: spt-core never caters to a specific harness; ground completeness Qs in CONTEXT/ADRs (apparent gaps usually already specified).
58	- [sptc plugin name ruling](sptc-plugin-name-ruling.md) — sptc plugin = `sptc` (interim) → flips to `spt` on proven parity; CC hard-ties skill prefix to plugin.json name. adapter_name=claude-spt.
59	- [experimplate seed leaks](experimplate-traceable-seed-leaks.md) — experimplate ships traceable seed defects (4 tag-leaks + manifest_error in example docs); doyle fixes upstream before next reuse.
60	- [spt-claude-code NEXT](spt-claude-code-next.md) — SCOPING DONE. perri builds from spt-releases+GH-Pages ONLY.
61	- [M10 digest extractor](m10-digest-extractor.md) — `[digest]` imperative extractor (ADR-0019) + thread-spanning + two-origin merge. SHIPPED v0.6.0. Carried: real-CC digest-proof → perri criterion.
62	- [PARITY ARC CLOSED](parity-arc-closed.md) — spt-claude-code v0.3.0 = full bare-bringup parity; perri dogfood GREEN. Next = sptc→spt flip.
63	- [spt-core findings backlog](spt-core-findings-backlog.md) — 3 non-blocking → todlando: REQ-SEND-SPT-HOSTED, REQ-HAZARD-RC-EOF (rc.rs:362 raw-EOF crash), REQ-HAZARD-DEFERRED-MANIFEST. +2 from the broken-IPv6 diag: discovery IPv6-resilience + join silent-UX.
64	- [broken IPv6 poisons iroh discovery](broken-ipv6-poisons-iroh-discovery.md) — CONFIRMED 2026-06-27: half-broken IPv6 (AAAA resolves, path dead) silently fails subnet-join — iroh dual-stack burns the rendezvous window on dead IPv6. Tell: `Test-NetConnection dns.iroh.link -443` IPv6 FAILS / IPv4 OK. Fix=disable IPv6. Refuted first: clock/firewall/relay.
65	- [update-apply confident message](update-apply-confident-message.md) — public `spt update apply` SUCCESS says "Updated" not internal "trial"; trial/rollback machinery untouched.
66	- [traceable per-wave activation](traceable-per-wave-activation.md) — traceable check requires ALL declared required_stages per commit; activate stages incrementally (int at final wave), never full end-state upfront.
67	- [v0.9.0 harness-resolution](v090-harness-resolution.md) — SHIPPED PR#21: adapter-agnostic seed + bind-time resolution (ADR-0021); --adapter no longer mandatory.
68	- [v0.9.1 resolve-dotstem](v091-resolve-dotstem.md) — normalize_basename stem-before-first-dot + stale-broker seed hint. REQ-HAZARD-BROKER-SEED-WIRE-SKEW, KH 7.9.
69	- [release counter from published](release-counter-from-published.md) — release --version counter from PUBLISHED spt-releases metadata NOT memory; collision breaks spt-update rollback floor. Cross-check monotonic at publish.
70	- [release retag mechanics](v080-published.md) — cut ONLY after doyle CHANGELOG-vet. retag = amend CHANGELOG→delete draft→move tag→rebuild→sign FRESH bytes.
71	- [release Cargo.lock first-party](v073-published.md) — bump collides w/ third-party @ same version; TARGETED replace ~11 first-party crate names ONLY.
72	- [fix-only PR doesn't bump](v072-published.md) — fix PR does NOT bump; release driver authors bump. main locked → `git worktree add --detach` + push HEAD:main.
73	- [transient release-API flake](v071-published.md) — release.yml assemble TLS-timeout on gh-release-create → `gh run rerun --failed` clears (builds reused, no re-tag). Read failed step.
74	- [hfenduleam disk-full CI](hfenduleam-disk-full-ci.md) — Win CI LNK1318/os-error-112 = disk full not code; cargo clean dev target, rerun job; check disk before treating Win RED as code defect.
75	- [v0.4.2 Linux respawn fix](v042-published.md) — REQ-HAZARD-BRAIN-RESPAWN-PATH: respawn via canonical install path not current_exe + bytes-assert→auto-rollback.
76	- [boot-race self-heal](boot-race-self-heal.md) — daemon self-heals net-less boot (NetHost retry+attach to OnceLock broker); systemd network-online ordering does NOT reliably prevent the race.
77	- [pump-IPC-deadline fix](pump-ipc-deadline-fix.md) — reader-thread+channel carrier (nonblock dead on Win named pipes); MERGED @4d8b810, rides v0.4.1.
78	- [CI self-host migration](ci-selfhost-migration.md) — runners kitsubito + hfenduleam; twohost jobs gated by [twohost] commit tag.
79	- [CI kitsubito speedup plan](ci-kitsubito-speedup-plan.md) — PLANNED: mold → cargo-nextest → sccache size-cap. Cross-build-ship REJECTED.
80	- [which process is the listener](spt-daemon-is-live-infra.md) — owl.exe (plugin) = live listener; target\debug\spt.exe daemon = dev/test artifact, killable.
81	- [self-clear skill API-blocked](self-clear-skill-api-blocked.md) — never invoke /self-clear; usage-policy classifier refuses the turn; continue in-context / user-manual /clear.
82	- [adapter glue-model boundary](adapter-glue-model-boundary.md) — adapters = manifest + binary only; real adapters in own repos; no adapter-aware source in spt-core.
83	- [use $OWL send for messaging](owl-send-not-legacy-spt-send.md) — `$OWL send` works (legacy = where live perches run); `spt send` bounces NO_PERCH. Don't read `$?` after piping send through tail — use PIPESTATUS.
84	- [daemon service-detection gotcha](daemon-service-detection-gotcha.md) — service detection reading GLOBAL OS state blind on single-home non-elevated dev box; gate Linux on SPT_HOME-unset, Win refuse on would-vanish.
85	- [Linux SPT_HOME no-bug](linux-spt-home-no-bug.md) — unix spawn_detached inherits env (forwards SPT_HOME); only Win CreateEnvironmentBlock rebuilds/drops it.
86	- [kitsubito Linux rig](kitsubito-linux-rig.md) — ssh reavus@kitsubito (key); deploy origin=local runner (git bundle); live spt-daemon user unit; build-in-scratch leaves ~/.local/bin/spt untouched.
87	- [Gravity deploy procedure](gravity-deploy-procedure.md) — ssh david@100.100.62.43; build in ~/spt-core-deploy NOT runner workspace; setsid daemon; ~1 min first-sync after restart.
88	- [v0.3.2 platform-safe update](v032-platform-safe-update.md) — REQ-UPD-8: fetch stages multi-platform update-set, apply refuses unstamped/wrong-OS. GOTCHA: fetch floor=staged_version.
89	- [M6 shipped v0.1.0](m6-shipped-v010.md) — release procedure = RELEASE-RUNBOOK.md; releases-repo/ = repo-face truth.
90	- [Published releases ledger](v0121-published.md) — counters …v0.12.0=25, v0.12.1=26, v0.13.0=27, v0.13.2=29, v0.14.0=30, v0.14.1=31, v0.14.2=32, v0.14.3=33, v0.15.0=34, v0.16.0=35 (@9e5b33b). bump-in-PR (v0.14.1+). Each vX.Y.Z-published.md holds hashes+gotcha.
91	- [v0.15.0 published detail](v0150-published.md) — counter 34 @18d5045 (PR#37). hashes linux 93ed9b89… / win b4950a8d…. signed FRESH, 33→34 monotonic, docs-publish green on tag.
92

- [v0.14.0 endpoint-creation-flow](v0140-endpoint-creation-flow.md) — PUBLISHED counter 30. Multi-subnet home-at-creation + UNBOUND pre-bind attach. SPT_RELEASE_SEED in env (len64).
- [v0.14.1 builds (F-018+picker+netstream)](f018-adapter-add-nondestructive.md) — PUBLISHED counter 31. F-018 adapter-add non-destructive, picker home-subnet, netstream flake FIX. GOTCHA: `spt` NO lib target → `--bin spt`.
- [F-019 translation install_dir resolve](f019-translation-install-dir-resolve.md) — PUBLISHED v0.14.2 counter 32. CC-on-Win blocker: idle msgs typed-not-SUBMITTED, root=bare path not resolved vs install_dir. Fix=resolve_program_in_dir ×4 sites.
- [v0.17.0 robust-join DESIGNED (next build)](v0170-robust-join-design.md) — branch v0.17.0-robust-join off main @551f3dc. ADR-0030 (two-phase meet-before-code + per-family bind gate + diagnosable join) + REQ-PRESENCE-LIVENESS-TRUTH. JIT W1 family-gate + W4 presence-truth = urgent correctness; W2/W3 = UX. todlando builds next. Diags: [[broken-ipv6-poisons-iroh-discovery]] + [[presence-dead-shows-online]].
- [v0.17.0 W5 PLAN (display parity — LAST wave)](v0170-w5-design.md) — execute-ready, GROUNDED. DOYLE-OWNED as of 2026-06-28: doyle executes W5 in a fresh worker off design §B + this 16-site map, then gates + folds W6 himself. todlando STOOD DOWN (overloaded-context judgment). Wire-touching: registry Instance +3 gossiped fields (bound/controller_node/harness_only) → 16 `Instance {}` sites + advertise + data.rs remote-derivation + EpDisplay rework (drop UnboundControlled, add Suspended) + view palette. todlando reactive for W6 Qs (twohost/counter-36) only.
- [v0.17.0 W3 LANDED (diagnosable join)](v0170-w1-w4-blockers.md) — @be1f4d6: REQ-JOIN-DIAGNOSTICS impl+unit. CLI live-progress thread + meet_failure_detail (concise/--verbose, bound-families ties W1) + terminal-event propagation (W2 already killed the _=>continue swallow) + --verbose flag. DEFERRED: SUCCESS-path SPT_LOG trace (no daemon tracing facility). W5 is the last build wave.
- [v0.17.0 W2 LANDED (two-phase join)](v0170-w2-design.md) — @a07322c: meet-before-code (REQ-JOIN-TWO-PHASE impl+unit+int). meet_via_rendezvous split + broker pair_holds 5-min state machine + cli meet→prompt→submit. All gates green. GOTCHA: orphan target/debug/spt.exe from cli nextest locks files → kill by workspace-PID before xtask.
- [v0.17.0 W1+W4 LANDED](v0170-w1-w4-blockers.md) — 2026-06-28: W4 @867c7ab (cold perch→Suspended not Dormant, REQ-PRESENCE-LIVENESS-TRUTH impl+unit+int) + W1 @7cddaba (per-family bind gate, REQ-NET-FAMILY-GATE doc+impl+unit). All gated (311/311 traceable, clippy/xtask clean). Built on SHARED branch v0.16.0-update-arc (NOT the design-memo's v0.17.0-robust-join), doyle's tree. W2/W3/W5/W6 pending doyle scope. Build OOM→CARGO_BUILD_JOBS=2 per-crate.
- [presence: dead endpoints show ONLINE remotely](presence-dead-shows-online.md) — registryhost.rs:404 gossips a not-alive perch as Dormant; picker/data.rs:268 maps remote Dormant→Online. Fix=dead→Offline (guard live-unbound) + picker Dormant-distinct. v0.17.0 W4.
- [v0.16.0 PUBLISHED (update-arc + CLI/UX)](v0160-published.md) — ✅ counter 35 @9e5b33b (PR#38, 2026-06-25). 6 waves all doyle-gated: subst keys {adapter_dir}/{adapter_name} + lazy [strings] (ADR-0029 resolve-not-execute) / translation [command] / [update.post] composite / --reply-to REMOVED / empty-scope create / global --json / digest cursor / rc identity row. hashes linux e13d7c2d… / win f6cd39ec…. deployah caught a docs-token leak at the gate (clap /// REQ-tag → //, see [[clap-doc-comment-leaks-req-tag]]). perri GO sent for claude-spt v0.8.0 (min_spt_core→0.16.0). Build/ratify detail: [[v0160-w1-manifest-runtime]].
- [Win update-exe UAC-740](win-update-exe-uac740.md) — exe/fixture names containing "update"/"setup"/"install" trip Win installer-detection → os-error-740 elevation. Name spawned test helpers around it (W2 used "post_step").
- [v0.15.0 messaging milestone](v0150-w1-activity-gated-delivery.md) — PUBLISHED counter 34 @18d5045 (PR#37). W1 activity-gated delivery + fault-transient re-spool; W2-W4 `spt send` axes (--idle-only/--active-only/--ephemeral/--prefer-native/--force-native/--json-payload) + Win console-window fix; W5 `spt api psyche-download`. perri real-CC validate pending (3 axes+json+no-window+psyche-download).
- [seedmap test timeout = STARVATION not collision](seedmap-test-collides-live-daemon.md) — `seedmap::request_stop_barrier_holds_until_no_listener` times out on a LOADED shared box. NOT a socket collision (REFUTED — with_home tempdir SPT_HOME → unique per-test socket). REAL=load-starvation, RERUNNABLE flake. LESSON: verify the FULL chain before confirming a diagnosis.
- [v0.15.0 public docs-site update](v0150-public-docs-update.md) — MUST ride the release. xtask gen only does reference.md; PROSE pages need hand-direction. GAPS: integration-checklist api psyche-download row + api.md verb + messaging send-axes/--json-payload. doyle authors, publish docs-publish.yml, VERSION numbers no internal codes.
- [v0.16.0 release → ping perri](v0160-release-ping-perri.md) — ON v0.16.0 drop (counter 35) doyle MUST $OWL send perri the GO: cluster-A consumable (subst keys/[strings] lazy/translation command/[update.post]) + min_spt_core→0.16.0. perri builds claude-spt v0.8.0 dependent features.
- [v0.15.0 W5 resume-context pull](v0150-w5-resume-context-pull.md) — SHIPPED. REQ-RESUME-CONTEXT-PULL: `spt api psyche-download <id>` + durable role/live/project + <pending-commune>/<pending-signoff> append gated on NOT-YET-SYNTHESIZED (adapter read=TOCTOU vs ingest-delete). Tier-2 (drift-stamp/<current>/memformat) DEFERRED.
- [v0.15.0 W2 drain-split ratify](v0150-w1-activity-gated-delivery.md) — SHIPPED. deferred=1 IFF window='active_only'. Only active-hook re-points to a new drain_active_window_at; relay + drain_idle_window UNCHANGED; derive deferred from window at the single insert chokepoint.
- [owl --reply-to broken](owl-reply-to-broken.md) — BINDING (operator 2026-06-24): `$OWL send --reply-to` BROKEN (loops msg back to sender as fake inbound). ALWAYS plain `$OWL send <target> <self-id>` (e.g. `spt send perri doyle`). Kin [[owl-send-not-legacy-spt-send]].
- [commune-ingest LLM-synthesis + gap shapes](commune-ingest-pulse-latency-gap.md) — commune ingest IS LLM-synthesized UPSTREAM of the drop; daemon ingest (lifecycle.rs:466 @5s pulse) is MECHANICAL filing. LESSON: meaning-Qs → read CONTEXT.md/CONTEXT-MEMORY.md primary, not a single Explore trace.
- [v0.14.3 raw-inject removal](v0143-raw-inject-removal.md) — PUBLISHED counter 33. spt-hosted idle = translation-binary-ONLY; no-binary/faulted → SPOOL (loud), never raw PTY write. REQ-HAZARD-IDLE-SILENT-NONDELIVERY.
- [Win netstream redrive flake](win-netstream-redrive-flake.md) — FIXED v0.14.1 (#4): Win-only CI flake, root=StreamLog seq counts transport read_chunks. Verify-per-attempt lesson stands.
- [translation binary console-window bug](translation-binary-console-window-bug.md) — spt-hosted translation binary spawns VISIBLE console on Win. ROOT=translation.rs:242 missed CREATE_NO_WINDOW. Fix=cfg(windows) creation_flags(0x0800_0000). Rolls into v0.15.0 W4. NOT a new REQ.
- [release standard: bump-in-PR](release-standard-bump-in-pr.md) — v0.14.1 ONWARD: bump rides IN release PR → PR CI validates tagged commit → tag on merge. Kills serial 2nd-CI wait.
- [v0.14.0 W6 int structure](v0140-w6-int-structure.md) — mirror perri regression: ≥2-subnet gate, Case1 endpoint-run E2E behind acceptance-env, Cases2/3 fast bind probes.
- [v0.13.2 build drive](v0132-build-drive.md) — PUBLISHED counter 29; adapter-packaging. W6 docs-token gate (public --help no internal codes).
- [v0.13.0 forkpty ground truth](v013-forkpty-groundtruth.md) — SHIPPED counter 27. green-units≠green-int. gh run rerun attaches STALE attempt — verify per-attempt.
- [v0.13.0 W1b effect-journal wedge](v013-w1b-effect-journal-wedge.md) — REQ-HAZARD-EFFECT-JOURNAL-PTY-WEDGE: lock-across-fsync+PtyWrite kills attaches. Fix=no-lock-across-effect + drop per-keystroke fsync.
- [v0.12.1 real-harness reopen](v0121-realharness-reopen.md) — v0.12.0 lifecycle broke in REAL harness (green-on-mocks). BINDING: gate lifecycle vs REAL dummy-harness, NO mocks.
- [v0.12.1 L0 attach-deadlock](v0121-l0-attach-deadlock-root.md) — KEYSTONE: serve_attach forwards on SAME broker IPC conn; inline ring replay blocks → deadlock → rc 0 bytes.
- [v0.12.1 help-md render](v0121-help-md.md) — `spt --help` leaked literal MD; helpfmt::render (bold→ANSI/code→cyan, strip on pipe/NO_COLOR). REQ-CLI-HELP-MARKDOWN.
- [changelog scope vs commit range](changelog-scope-vs-commit-range.md) — release CHANGELOG must COVER every user-facing SURFACE in vPREV..vNEW (log=checklist NOT quota) + bullet SCOPE not broader than delta.
- [pre-flight clippy --workspace](ci-clippy-preflight-workspace.md) — CI denies warnings workspace-wide; `-p <crate>` misses sibling lints. CI fires on PR.
- [gate int with nextest not bare cargo test](gate-int-tests-with-nextest-not-bare-cargo-test.md) — re-gate spt broker/PTY int suites via `cargo nextest` (process-per-test) or `--test-threads=1`, NEVER bare `cargo test` on Win (env set_var races → FALSE flakes). Paid 2026-06-23.
- [behavior-change → grep tests](behavior-change-grep-tests-not-comments.md) — rename/behavior/token change: grep tests/+ci/ for OLD behavior as ASSERTIONS; comment-only hit = RED FLAG, read body. Run heavy e2e locally.
- [shared-seam → run ALL seam tests](shared-seam-change-run-all-seam-tests.md) — SHARED runtime-seam change breaks SIBLING tests; grep+run ALL seam tests not just new ones.
- [ccs Windows PTY-spawn fix](ccs-win-pty-program-resolve.md) — bare program → portable-pty picks extensionless shim → CreateProcessW 193. Fix: spt_term::winprog PATHEXT resolver. REQ-HAZARD-WIN-PTY-PROGRAM-RESOLVE.
- [harness adapter-agnostic resolution](harness-adapter-agnostic-resolution.md) — ADR-0021: seed adapter-AGNOSTIC (pid+session_id), --adapter OPTIONAL; resolve at bind by pid→exe→host_binaries→profiles.
- [broker-QUIC-deadline](v083-broker-quic-deadline.md) — REQ-HAZARD-BROKER-QUIC-DEADLINE: NetHost::bounded_block_on (10s<30s brain) wraps dial/open/send → dead peer = ORDINARY error, pump redials.
- [F-007 live-relay acceptance](f007-live-relay-acceptance.md) — live bringup = persistent `api listen` via Monitor (NOT --once/ready); psyche-spawn gated on --manifest + install-dir fix. Ground in CONTEXT.md before ruling.
- [delegate-build preflight hang](delegate-build-preflight-hang.md) — bg build agents hang silently on full int suite; instruct targeted units; check liveness via transcript mtime, take partial work.
- [proceed autonomously](dont-wait-proceed-autonomously.md) — operator: don't stop to ask permission between steps; chain next action.
- [broker is daemon state anchor](broker-is-daemon-state-anchor.md) — post-ADR-0018 BROKER (not restartable brain) = always-up CLI-reachable daemon-lifetime anchor; place ephemeral in-mem state there.
- [adapter add --release archive](adapter-add-release-archive.md) — `spt adapter add --release <user/repo>` (REQ-INSTALL-9): fetch .spt tar from GH release, extract, register root. Acquisition only.
- [adapter tips → published docs](adapter-tips-published-docs.md) — perri tips → harness-agnostic docs-site patterns.md; publish via `gh workflow run docs-publish.yml --ref main`. Pre-flight xtask check+site.
- [unmergeable PR blocks CI](unmergeable-pr-blocks-ci.md) — push yields NO pull_request run + 0 checks = UNMERGEABLE PR. Diagnose `gh pr view --json mergeable`. Fix: merge main in.
- [CLI command → docs-drift gate](cli-command-docs-drift.md) — adding/changing a `spt` CLI command needs `cargo run -p xtask -- gen` (regen reference.md) AND no internal codes in clap ///. CI-gated.
- [gate against documented design](gate-against-documented-design.md) — verify a wave's premise vs RECORDED design (CONTEXT/ADRs) not just impl — an impl limitation can contradict locked design.
- [grep REQ tags to find impl](grep-req-tags-to-find-impl.md) — to reconcile is-REQ-X-wired, grep `REQ-X` FIRST — [impl/int->REQ-X] tags point straight to code; faster than an agent trace.
- [public docs: version not milestone](public-docs-version-not-milestone.md) — published docs-site uses VERSION numbers, never internal M#/W# codes; grep docs-site edits before commit.
- [M12 FULLY GATED](m12-w1-progress.md) — end-to-end GATE-PASS. Published v0.6.0 baseline used to start perri.
- [cplugs publish mechanics](cplugs-publish-mechanics.md) — cplugs steps in claude_skill_owl/docs/DEPLOY.md; spt-claude-code takes SKELETON only (binary+manifest ride adapter registry not cplugs).
- [perri question triage](perri-question-triage-protocol.md) — STANDING: perri builds blind from PUBLISHED docs+binary. Every impl Q = diagnostic; classify w/ EVIDENCE. Never answer from memory.
- [perri needs reply to continue](perri-needs-reply-to-continue.md) — STANDING: ALWAYS reply to perri (ack+keep-going+next); silence = stop-point. todlando self-drives, perri needs nudge.
- [no machine-wide kill on shared runner](no-machinewide-killon-shared-runner.md) — BINDING: HFENDULEAM self-hosted runner shares box w/ LIVE agents; never machine-wide `Stop-Process spt`; scope to $GITHUB_WORKSPACE/target or PID.
- [agent roles](agent-roles.md) — doyle=gater/owner (don't self-execute big builds), todlando=executor, perri=adapter builder. perri gap→doyle design→todlando build→doyle gate→perri validate.
- [EVENT envelope + __REPLY_TO__ removal](event-envelope-reply-to-removal.md) — ADR-0020: `<EVENT type=msg from=…>` = sole arriving-message format. __REPLY_TO__ REMOVED. LESSON: pin OWL_SESSION_ID for auth-gated E2E.
- [harness boundary + grounding](spt-core-harness-boundary-and-grounding.md) — BINDING: spt-core never caters to a specific harness; ground completeness Qs in CONTEXT/ADRs (apparent gaps usually already specified).
- [sptc plugin name ruling](sptc-plugin-name-ruling.md) — sptc plugin = `sptc` (interim) → flips to `spt` on proven parity; CC hard-ties skill prefix to plugin.json name. adapter_name=claude-spt.
- [experimplate seed leaks](experimplate-traceable-seed-leaks.md) — experimplate ships traceable seed defects (4 tag-leaks + manifest_error in example docs); doyle fixes upstream before next reuse.
- [spt-claude-code NEXT](spt-claude-code-next.md) — SCOPING DONE. perri builds from spt-releases+GH-Pages ONLY.
- [M10 digest extractor](m10-digest-extractor.md) — `[digest]` imperative extractor (ADR-0019) + thread-spanning + two-origin merge. SHIPPED v0.6.0. Carried: real-CC digest-proof → perri criterion.
- [PARITY ARC CLOSED](parity-arc-closed.md) — spt-claude-code v0.3.0 = full bare-bringup parity; perri dogfood GREEN. Next = sptc→spt flip.
- [spt-core findings backlog](spt-core-findings-backlog.md) — 3 non-blocking → todlando: REQ-SEND-SPT-HOSTED, REQ-HAZARD-RC-EOF (rc.rs:362 raw-EOF crash), REQ-HAZARD-DEFERRED-MANIFEST. +2 from the broken-IPv6 diag: discovery IPv6-resilience + join silent-UX.
- [broken IPv6 poisons iroh discovery](broken-ipv6-poisons-iroh-discovery.md) — CONFIRMED 2026-06-27: half-broken IPv6 (AAAA resolves, path dead) silently fails subnet-join — iroh dual-stack burns the rendezvous window on dead IPv6. Tell: `Test-NetConnection dns.iroh.link -443` IPv6 FAILS / IPv4 OK. Fix=disable IPv6. Refuted first: clock/firewall/relay.
- [update-apply confident message](update-apply-confident-message.md) — public `spt update apply` SUCCESS says "Updated" not internal "trial"; trial/rollback machinery untouched.
- [traceable per-wave activation](traceable-per-wave-activation.md) — traceable check requires ALL declared required_stages per commit; activate stages incrementally (int at final wave), never full end-state upfront.
- [v0.9.0 harness-resolution](v090-harness-resolution.md) — SHIPPED PR#21: adapter-agnostic seed + bind-time resolution (ADR-0021); --adapter no longer mandatory.
- [v0.9.1 resolve-dotstem](v091-resolve-dotstem.md) — normalize_basename stem-before-first-dot + stale-broker seed hint. REQ-HAZARD-BROKER-SEED-WIRE-SKEW, KH 7.9.
- [release counter from published](release-counter-from-published.md) — release --version counter from PUBLISHED spt-releases metadata NOT memory; collision breaks spt-update rollback floor. Cross-check monotonic at publish.
- [release retag mechanics](v080-published.md) — cut ONLY after doyle CHANGELOG-vet. retag = amend CHANGELOG→delete draft→move tag→rebuild→sign FRESH bytes.
- [release Cargo.lock first-party](v073-published.md) — bump collides w/ third-party @ same version; TARGETED replace ~11 first-party crate names ONLY.
- [fix-only PR doesn't bump](v072-published.md) — fix PR does NOT bump; release driver authors bump. main locked → `git worktree add --detach` + push HEAD:main.
- [transient release-API flake](v071-published.md) — release.yml assemble TLS-timeout on gh-release-create → `gh run rerun --failed` clears (builds reused, no re-tag). Read failed step.
- [hfenduleam disk-full CI](hfenduleam-disk-full-ci.md) — Win CI LNK1318/os-error-112 = disk full not code; cargo clean dev target, rerun job; check disk before treating Win RED as code defect.
- [v0.4.2 Linux respawn fix](v042-published.md) — REQ-HAZARD-BRAIN-RESPAWN-PATH: respawn via canonical install path not current_exe + bytes-assert→auto-rollback.
- [boot-race self-heal](boot-race-self-heal.md) — daemon self-heals net-less boot (NetHost retry+attach to OnceLock broker); systemd network-online ordering does NOT reliably prevent the race.
- [pump-IPC-deadline fix](pump-ipc-deadline-fix.md) — reader-thread+channel carrier (nonblock dead on Win named pipes); MERGED @4d8b810, rides v0.4.1.
- [CI self-host migration](ci-selfhost-migration.md) — runners kitsubito + hfenduleam; twohost jobs gated by [twohost] commit tag.
- [CI kitsubito speedup plan](ci-kitsubito-speedup-plan.md) — PLANNED: mold → cargo-nextest → sccache size-cap. Cross-build-ship REJECTED.
- [which process is the listener](spt-daemon-is-live-infra.md) — owl.exe (plugin) = live listener; target\debug\spt.exe daemon = dev/test artifact, killable.
- [self-clear skill API-blocked](self-clear-skill-api-blocked.md) — never invoke /self-clear; usage-policy classifier refuses the turn; continue in-context / user-manual /clear.
- [adapter glue-model boundary](adapter-glue-model-boundary.md) — adapters = manifest + binary only; real adapters in own repos; no adapter-aware source in spt-core.
- [use $OWL send for messaging](owl-send-not-legacy-spt-send.md) — `$OWL send` works (legacy = where live perches run); `spt send` bounces NO_PERCH. Don't read `$?` after piping send through tail — use PIPESTATUS.
- [daemon service-detection gotcha](daemon-service-detection-gotcha.md) — service detection reading GLOBAL OS state blind on single-home non-elevated dev box; gate Linux on SPT_HOME-unset, Win refuse on would-vanish.
- [Linux SPT_HOME no-bug](linux-spt-home-no-bug.md) — unix spawn_detached inherits env (forwards SPT_HOME); only Win CreateEnvironmentBlock rebuilds/drops it.
- [kitsubito Linux rig](kitsubito-linux-rig.md) — ssh reavus@kitsubito (key); deploy origin=local runner (git bundle); live spt-daemon user unit; build-in-scratch leaves ~/.local/bin/spt untouched.
- [Gravity deploy procedure](gravity-deploy-procedure.md) — ssh david@100.100.62.43; build in ~/spt-core-deploy NOT runner workspace; setsid daemon; ~1 min first-sync after restart.
- [v0.3.2 platform-safe update](v032-platform-safe-update.md) — REQ-UPD-8: fetch stages multi-platform update-set, apply refuses unstamped/wrong-OS. GOTCHA: fetch floor=staged_version.
- [M6 shipped v0.1.0](m6-shipped-v010.md) — release procedure = RELEASE-RUNBOOK.md; releases-repo/ = repo-face truth.
- [Published releases ledger](v0121-published.md) — counters …v0.12.0=25, v0.12.1=26, v0.13.0=27, v0.13.2=29, v0.14.0=30, v0.14.1=31, v0.14.2=32, v0.14.3=33, v0.15.0=34, v0.16.0=35 (@9e5b33b). bump-in-PR (v0.14.1+). Each vX.Y.Z-published.md holds hashes+gotcha.
- [v0.15.0 published detail](v0150-published.md) — counter 34 @18d5045 (PR#37). hashes linux 93ed9b89… / win b4950a8d…. signed FRESH, 33→34 monotonic, docs-publish green on tag.


Compacting MEMORY.md: merging the 6 sprawling v0.17.0 lines into 2, trimming the mega-entries (v0.16.0, v0.15.0), keeping every other pointer terse.


Write

- [v0.17.0 W1-W4 LANDED (robust-join + presence)](v0170-w1-w4-blockers.md) — IN BUILD on shared branch v0.16.0-update-arc, doyle's tree. W1 @7cddaba per-family bind gate · W4 @867c7ab cold-perch→Suspended (presence truth) · W2 @a07322c two-phase meet-before-code join ([[v0170-w2-design]]) · W3 @be1f4d6 diagnosable join (progress/detail/--verbose). All doyle-gated GREEN. Diags [[broken-ipv6-poisons-iroh-discovery]] [[presence-dead-shows-online]].
- [v0.17.0 W5 DOYLE-OWNED (display parity, LAST wave)](v0170-w5-design.md) — 2026-06-28: doyle executes off design §B + 16-site map (registry Instance +3 gossiped fields / EpDisplay rework / view palette); todlando stood down (context), reactive for W6 (twohost ON for W2 seam, counter-36 bump-in-PR).
- [broken IPv6 poisons iroh discovery](broken-ipv6-poisons-iroh-discovery.md) — half-broken IPv6 (AAAA resolves, path dead) silently fails subnet-join; iroh dual-stack burns rendezvous window. Tell: Test-NetConnection dns.iroh.link -443 IPv6 FAIL/IPv4 OK. Fixed by W1 family-gate.
- [presence: dead shows ONLINE remotely](presence-dead-shows-online.md) — registryhost gossiped not-alive perch as Dormant→picker maps Dormant→Online. FIXED W4 (cold→Suspended).
- [v0.16.0 PUBLISHED (update-arc + CLI/UX)](v0160-published.md) — counter 35 @9e5b33b (PR#38). subst keys {adapter_dir}/{adapter_name} + lazy [strings] (ADR-0029) / translation [command] / [update.post] / --reply-to REMOVED / empty-create / global --json / digest cursor / rc identity. Detail [[v0160-w1-manifest-runtime]]; docs-token leak gate [[clap-doc-comment-leaks-req-tag]].
- [Win update-exe UAC-740](win-update-exe-uac740.md) — exe/fixture names with "update"/"setup"/"install" trip Win installer-detection → os-error-740. Name test helpers around it.
- [v0.15.0 messaging milestone](v0150-w1-activity-gated-delivery.md) — counter 34 @18d5045 (PR#37). activity-gated delivery + re-spool; spt send axes (--idle-only/--active-only/--ephemeral/--prefer-native/--force-native/--json-payload) + Win console fix; api psyche-download.
- [seedmap test timeout = STARVATION](seedmap-test-collides-live-daemon.md) — request_stop_barrier_holds_until_no_listener times out on a LOADED box; NOT socket collision (unique per-test socket). RERUNNABLE flake. Verify the FULL chain before confirming a diagnosis.
- [v0.15.0 public docs-site update](v0150-public-docs-update.md) — release-riding; xtask gen only reference.md, PROSE pages hand-direct. doyle authors, publish docs-publish.yml, VERSION not internal codes.
- [v0.16.0 release → ping perri](v0160-release-ping-perri.md) — on counter-35 drop doyle $OWL-sends perri GO (cluster-A consumable + min_spt_core→0.16.0) for claude-spt v0.8.0.
- [v0.15.0 W5 resume-context pull](v0150-w5-resume-context-pull.md) — SHIPPED. api psyche-download <id> + durable role/live/project + <pending-commune>/<pending-signoff> gated on NOT-YET-SYNTHESIZED. Tier-2 DEFERRED.
- [v0.15.0 W2 drain-split ratify](v0150-w1-activity-gated-delivery.md) — SHIPPED. deferred=1 IFF window=active_only; derive deferred from window at the single insert chokepoint.
- [owl --reply-to broken](owl-reply-to-broken.md) — BINDING: $OWL send --reply-to loops msg back to sender. ALWAYS plain `$OWL send <target> <self-id>`. Kin [[owl-send-not-legacy-spt-send]].
- [commune-ingest LLM-synthesis](commune-ingest-pulse-latency-gap.md) — commune ingest IS LLM-synthesized upstream of drop; daemon ingest (lifecycle.rs @5s) = mechanical filing. meaning-Qs → read CONTEXT.md primary.
- [v0.14.3 raw-inject removal](v0143-raw-inject-removal.md) — counter 33. spt-hosted idle = translation-binary-ONLY; no-binary/faulted → SPOOL (loud), never raw PTY write. REQ-HAZARD-IDLE-SILENT-NONDELIVERY.
- [Win netstream redrive flake](win-netstream-redrive-flake.md) — FIXED v0.14.1: Win CI flake, root=StreamLog seq counts transport read_chunks. Verify-per-attempt.
- [translation binary console-window bug](translation-binary-console-window-bug.md) — spt-hosted translation binary spawns VISIBLE console on Win. Fix=cfg(windows) creation_flags(0x0800_0000). v0.15.0 W4.
- [release standard: bump-in-PR](release-standard-bump-in-pr.md) — v0.14.1+: bump rides IN release PR → PR CI validates tagged commit → tag on merge.
- [v0.14.0 W6 int structure](v0140-w6-int-structure.md) — ≥2-subnet gate, Case1 endpoint-run E2E behind acceptance-env, Cases2/3 fast bind probes.
- [v0.14.x endpoint-creation + builds](v0140-endpoint-creation-flow.md) — counters 30/31/32: multi-subnet home-at-creation + UNBOUND pre-bind attach (SPT_RELEASE_SEED len64); F-018 adapter-add non-destructive + picker home-subnet [[f018-adapter-add-nondestructive]]; F-019 install_dir resolve_program_in_dir ×4 [[f019-translation-install-dir-resolve]]. GOTCHA: `spt` NO lib → --bin spt.
- [v0.13.2 build drive](v0132-build-drive.md) — counter 29 adapter-packaging. W6 docs-token gate (public --help no internal codes).
- [v0.13.0 forkpty ground truth](v013-forkpty-groundtruth.md) — counter 27. green-units≠green-int. gh run rerun attaches STALE attempt — verify per-attempt.
- [v0.13.0 W1b effect-journal wedge](v013-w1b-effect-journal-wedge.md) — REQ-HAZARD-EFFECT-JOURNAL-PTY-WEDGE: lock-across-fsync+PtyWrite kills attaches. Fix=no-lock-across-effect + drop per-keystroke fsync.
- [v0.12.1 real-harness reopen](v0121-realharness-reopen.md) — v0.12.0 broke in REAL harness (green-on-mocks). BINDING: gate lifecycle vs REAL dummy-harness, NO mocks.
- [v0.12.1 L0 attach-deadlock](v0121-l0-attach-deadlock-root.md) — KEYSTONE: serve_attach forwards on SAME broker IPC conn; inline ring replay blocks → deadlock → rc 0 bytes.
- [v0.12.1 help-md render](v0121-help-md.md) — `spt --help` leaked literal MD; helpfmt::render (bold→ANSI/code→cyan, strip on pipe/NO_COLOR). REQ-CLI-HELP-MARKDOWN.
- [changelog scope vs commit range](changelog-scope-vs-commit-range.md) — release CHANGELOG covers every user-facing SURFACE in vPREV..vNEW (log=checklist) + bullet scope not broader than delta.
- [pre-flight clippy --workspace](ci-clippy-preflight-workspace.md) — CI denies warnings workspace-wide; -p <crate> misses sibling lints. CI fires on PR.
- [gate int with nextest not bare cargo test](gate-int-tests-with-nextest-not-bare-cargo-test.md) — re-gate broker/PTY int via nextest (process-per-test) or --test-threads=1; NEVER bare cargo test on Win (env set_var races → FALSE flakes).
- [behavior-change → grep tests](behavior-change-grep-tests-not-comments.md) — rename/behavior/token change: grep tests/+ci/ for OLD behavior as ASSERTIONS; comment-only hit = RED FLAG, read body.
- [shared-seam → run ALL seam tests](shared-seam-change-run-all-seam-tests.md) — SHARED runtime-seam change breaks SIBLING tests; grep+run ALL seam tests.
- [ccs Windows PTY-spawn fix](ccs-win-pty-program-resolve.md) — bare program → portable-pty picks extensionless shim → CreateProcessW 193. Fix: spt_term::winprog PATHEXT resolver. REQ-HAZARD-WIN-PTY-PROGRAM-RESOLVE.
- [harness adapter-agnostic resolution](harness-adapter-agnostic-resolution.md) — ADR-0021: seed adapter-AGNOSTIC (pid+session_id), --adapter OPTIONAL; resolve at bind by pid→exe→host_binaries→profiles.
- [broker-QUIC-deadline](v083-broker-quic-deadline.md) — REQ-HAZARD-BROKER-QUIC-DEADLINE: NetHost::bounded_block_on (10s<30s brain) wraps dial/open/send → dead peer = ORDINARY error, pump redials.
- [F-007 live-relay acceptance](f007-live-relay-acceptance.md) — live bringup = persistent `api listen` via Monitor (NOT --once/ready); psyche-spawn gated on --manifest + install-dir fix.
- [delegate-build preflight hang](delegate-build-preflight-hang.md) — bg build agents hang silently on full int suite; instruct targeted units; check liveness via transcript mtime, take partial work.
- [proceed autonomously](dont-wait-proceed-autonomously.md) — operator: don't stop to ask permission between steps; chain next action.
- [broker is daemon state anchor](broker-is-daemon-state-anchor.md) — post-ADR-0018 BROKER (not restartable brain) = always-up CLI-reachable daemon-lifetime anchor; place ephemeral in-mem state there.
- [adapter add --release archive](adapter-add-release-archive.md) — `spt adapter add --release <user/repo>` (REQ-INSTALL-9): fetch .spt tar from GH release, extract, register root.
- [adapter tips → published docs](adapter-tips-published-docs.md) — perri tips → harness-agnostic docs-site patterns.md; publish docs-publish.yml --ref main. Pre-flight xtask check.
- [unmergeable PR blocks CI](unmergeable-pr-blocks-ci.md) — push yields NO pull_request run + 0 checks = UNMERGEABLE PR. Diagnose gh pr view --json mergeable. Fix: merge main in.
- [CLI command → docs-drift gate](cli-command-docs-drift.md) — adding/changing a `spt` CLI command needs xtask gen (regen reference.md) AND no internal codes in clap ///. CI-gated.
- [gate against documented design](gate-against-documented-design.md) — verify a wave's premise vs RECORDED design (CONTEXT/ADRs) not just impl — an impl limitation can contradict locked design.
- [grep REQ tags to find impl](grep-req-tags-to-find-impl.md) — to reconcile is-REQ-X-wired, grep REQ-X FIRST — [impl/int->REQ-X] tags point straight to code.
- [public docs: version not milestone](public-docs-version-not-milestone.md) — published docs-site uses VERSION numbers, never internal M#/W# codes; grep docs-site edits before commit.
- [M12 FULLY GATED](m12-w1-progress.md) — end-to-end GATE-PASS. Published v0.6.0 baseline used to start perri.
- [cplugs publish mechanics](cplugs-publish-mechanics.md) — cplugs steps in claude_skill_owl/docs/DEPLOY.md; spt-claude-code takes SKELETON only (binary+manifest ride adapter registry).
- [perri question triage](perri-question-triage-protocol.md) — STANDING: perri builds blind from PUBLISHED docs+binary. Every impl Q = diagnostic; classify w/ EVIDENCE.
- [perri needs reply to continue](perri-needs-reply-to-continue.md) — STANDING: ALWAYS reply to perri (ack+keep-going+next); silence = stop-point.
- [no machine-wide kill on shared runner](no-machinewide-killon-shared-runner.md) — BINDING: HFENDULEAM runner shares box w/ LIVE agents; never machine-wide Stop-Process spt; scope to $GITHUB_WORKSPACE/target or PID.
- [agent roles](agent-roles.md) — doyle=gater/owner (don't self-execute big builds), todlando=executor, perri=adapter builder. perri gap→doyle design→todlando build→doyle gate→perri validate.
- [EVENT envelope + __REPLY_TO__ removal](event-envelope-reply-to-removal.md) — ADR-0020: `<EVENT type=msg from=…>` = sole arriving format. __REPLY_TO__ REMOVED. pin OWL_SESSION_ID for auth-gated E2E.
- [harness boundary + grounding](spt-core-harness-boundary-and-grounding.md) — BINDING: spt-core never caters to a harness; ground completeness Qs in CONTEXT/ADRs (apparent gaps usually already specified).
- [sptc plugin name ruling](sptc-plugin-name-ruling.md) — sptc plugin = `sptc` (interim) → flips to `spt` on proven parity; CC ties skill prefix to plugin.json name. adapter_name=claude-spt.
- [experimplate seed leaks](experimplate-traceable-seed-leaks.md) — experimplate ships traceable seed defects (tag-leaks + manifest_error in example docs); doyle fixes upstream before reuse.
- [spt-claude-code NEXT](spt-claude-code-next.md) — SCOPING DONE. perri builds from spt-releases+GH-Pages ONLY.
- [M10 digest extractor](m10-digest-extractor.md) — [digest] imperative extractor (ADR-0019) + thread-spanning + two-origin merge. SHIPPED v0.6.0. Carried: real-CC digest-proof → perri criterion.
- [PARITY ARC CLOSED](parity-arc-closed.md) — spt-claude-code v0.3.0 = full bare-bringup parity; perri dogfood GREEN. Next = sptc→spt flip.
- [spt-core findings backlog](spt-core-findings-backlog.md) — non-blocking → todlando: REQ-SEND-SPT-HOSTED, REQ-HAZARD-RC-EOF (rc.rs:362 raw-EOF crash), REQ-HAZARD-DEFERRED-MANIFEST.
- [update-apply confident message](update-apply-confident-message.md) — public `spt update apply` SUCCESS says "Updated" not internal "trial"; trial/rollback machinery untouched.
- [traceable per-wave activation](traceable-per-wave-activation.md) — traceable check requires ALL declared required_stages per commit; activate incrementally (int at final wave), never full end-state upfront.
- [v0.9.0 harness-resolution](v090-harness-resolution.md) — SHIPPED PR#21: adapter-agnostic seed + bind-time resolution (ADR-0021); --adapter no longer mandatory.
- [v0.9.1 resolve-dotstem](v091-resolve-dotstem.md) — normalize_basename stem-before-first-dot + stale-broker seed hint. REQ-HAZARD-BROKER-SEED-WIRE-SKEW, KH 7.9.
- [release counter from published](release-counter-from-published.md) — release --version counter from PUBLISHED spt-releases metadata NOT memory; collision breaks spt-update rollback floor. Cross-check monotonic.
- [release retag mechanics](v080-published.md) — cut ONLY after doyle CHANGELOG-vet. retag = amend CHANGELOG→delete draft→move tag→rebuild→sign FRESH bytes.
- [release Cargo.lock first-party](v073-published.md) — bump collides w/ third-party @ same version; TARGETED replace ~11 first-party crate names ONLY.
- [fix-only PR doesn't bump](v072-published.md) — fix PR does NOT bump; release driver authors bump. main locked → git worktree add --detach + push HEAD:main.
- [transient release-API flake](v071-published.md) — release.yml assemble TLS-timeout on gh-release-create → gh run rerun --failed clears (builds reused, no re-tag).
- [hfenduleam disk-full CI](hfenduleam-disk-full-ci.md) — Win CI LNK1318/os-error-112 = disk full not code; cargo clean dev target, rerun; check disk before treating Win RED as code defect.
- [v0.4.2 Linux respawn fix](v042-published.md) — REQ-HAZARD-BRAIN-RESPAWN-PATH: respawn via canonical install path not current_exe + bytes-assert→auto-rollback.
- [boot-race self-heal](boot-race-self-heal.md) — daemon self-heals net-less boot (NetHost retry+attach to OnceLock broker); systemd network-online ordering does NOT reliably prevent the race.
- [pump-IPC-deadline fix](pump-ipc-deadline-fix.md) — reader-thread+channel carrier (nonblock dead on Win named pipes); MERGED @4d8b810, rides v0.4.1.
- [CI self-host migration](ci-selfhost-migration.md) — runners kitsubito + hfenduleam; twohost jobs gated by [twohost] commit tag.
- [CI kitsubito speedup plan](ci-kitsubito-speedup-plan.md) — PLANNED: mold → cargo-nextest → sccache size-cap. Cross-build-ship REJECTED.
- [which process is the listener](spt-daemon-is-live-infra.md) — owl.exe (plugin) = live listener; target\debug\spt.exe daemon = dev/test artifact, killable.
- [self-clear skill API-blocked](self-clear-skill-api-blocked.md) — never invoke /self-clear; usage-policy classifier refuses the turn; continue in-context / user-manual /clear.
- [adapter glue-model boundary](adapter-glue-model-boundary.md) — adapters = manifest + binary only; real adapters in own repos; no adapter-aware source in spt-core.
- [use $OWL send for messaging](owl-send-not-legacy-spt-send.md) — $OWL send works (legacy = where live perches run); `spt send` bounces NO_PERCH. Don't read $? after piping send through tail — use PIPESTATUS.
- [daemon service-detection gotcha](daemon-service-detection-gotcha.md) — service detection reading GLOBAL OS state blind on single-home non-elevated dev box; gate Linux on SPT_HOME-unset, Win refuse on would-vanish.
- [Linux SPT_HOME no-bug](linux-spt-home-no-bug.md) — unix spawn_detached inherits env (forwards SPT_HOME); only Win CreateEnvironmentBlock rebuilds/drops it.
- [kitsubito Linux rig](kitsubito-linux-rig.md) — ssh reavus@kitsubito (key); deploy origin=local runner (git bundle); live spt-daemon user unit; build-in-scratch leaves ~/.local/bin/spt untouched.
- [Gravity deploy procedure](gravity-deploy-procedure.md) — ssh david@100.100.62.43; build in ~/spt-core-deploy NOT runner workspace; setsid daemon; ~1 min first-sync after restart.
- [v0.3.2 platform-safe update](v032-platform-safe-update.md) — REQ-UPD-8: fetch stages multi-platform update-set, apply refuses unstamped/wrong-OS. GOTCHA: fetch floor=staged_version.
- [M6 shipped v0.1.0](m6-shipped-v010.md) — release procedure = RELEASE-RUNBOOK.md; releases-repo/ = repo-face truth.
- [Published releases ledger](v0121-published.md) — counters v0.12.0=25, 12.1=26, 13.0=27, 13.2=29, 14.0=30, 14.1=31, 14.2=32, 14.3=33, 15.0=34, 16.0=35 (@9e5b33b). bump-in-PR (v0.14.1+). Each vX.Y.Z-published.md holds hashes+gotcha.
- [v0.15.0 published detail](v0150-published.md) — counter 34 @18d5045 (PR#37). hashes linux 93ed9b89… / win b4950a8d…. signed FRESH, 33→34 monotonic, docs-publish green on tag.


<owl_messages>
<owl_message from="doyle" priority="high">todlando — ACK, all 3 W5 flags captured + will drive the build: (1) additive serde-default + N-1-absent round-trip unit test (silent wire skew = the failure mode). (2) add EpStatus::Suspended as a THIRD raw state (≠ Offline); data.rs maps Active|Dormant→Online, Suspended→Suspended, Offline→Offline. (3) revisit the W4 int assertion remote_picker_renders_suspended_dead_perch_offline once Suspended renders gray-FILLED (≠ plain offline). Also noted your twohost reconsideration: W2 changed pairing ORDER not the QUIC transport, W5 adds gossip FIELDS not transport — so the cross-host SEAM is the meet/ceremony handshake; I'll judge twohost-enable at the fold (lean ON for the meet int, since that's the one real cross-host behavior change). Handing-off received. Rest easy — I've got W5 + W6 + release.</owl_message>
</owl_messages>

[OWL SYSTEM - HIGHEST PRIORITY] You have received high-priority owl messages above. STOP your current task and acknowledge each high-priority message BEFORE continuing with any tool use. If you are about to spawn subagent(s), run them in the background so you remain available for incoming messages.