Base directory for this skill: C:\Users\decid\.claude\plugins\cache\cplugs\spt\1.11.25\skills\commune

# /spt:commune

All commands use `$LIVE` env var, auto-injected by the plugin's SessionStart hook. If commands fail with "command not found", restart the Claude Code session so the SessionStart hook re-runs.

> **Identity auto-detection:** Your identity is auto-detected from your session. Pass your ID explicitly only if auto-detection fails.

## Flow

1. **Download Psyche's *current* context** — it shifts during the session as background echo communes fire. Re-download right before composing; the gen-N snapshot you read at session start is already stale:
   ```bash
   $LIVE psyche-download <your-id>
   ```

   > **Output truncation.** If the Bash tool reports `Output too large (N KB)` and saves the full result to a `tool-results/<id>.txt` file, use the `Read` tool on that saved path to access the full content. Do NOT re-run `psyche-download` to grep/awk out sections — repeated invocations re-download the same context, waste tokens, and may duplicate `## Pending Commune` sections in `live_context.md`.

2. **Diff your knowledge against this fresh download** — only what's missing from *it* is the real delta (new work, decisions, intentions). Anything already absorbed is not. If the download includes a `<memformat>` section, use it as a guide for what topics to cover. A `## Pending Commune (uncommitted)` section means a previous commune is still queued — do NOT re-send it.

3. **Commune only the delta** -- use the **Write tool** to create
   `.claude/{your-id}-commune.md` with the two-slice body as its contents
   (see `## Two-slice body shape (Phase 25 D-10/D-11)` below for the required
   envelope wrapping). Do not use Bash/heredoc -- Write is the canonical path:
   no shell escaping, no `EOF` collision risk, and Write auto-creates the
   `.claude/` parent directory.

   Your Self listener detects the file on its next poll iteration, notifies
   your Psyche wrapper, and the wrapper ingests the content via the existing
   Psyche session. On success (subprocess exit code 0) the wrapper deletes the
   file. On error (token rate limit, etc) the file is retained and retried on
   the next consume cycle. If you write again before the wrapper consumes, the
   latest write wins (last-write-wins overwrite semantics).

If Psyche's context is already current, no commune is needed. Say so and move on.

Read `commune.md` (in this skill directory) for the full commune protocol -- when to send, what to include, and diligence triggers.

**Agent-type guard:** Only works on live agents. If target is not live, refuses with: "Communes require a live agent with Psyche."

## Two-slice body shape (Phase 25 D-10/D-11)

The body you write in `.claude/{your-id}-commune.md` MUST itself be wrapped in two-slice envelopes per Phase 25 D-10/D-11. The taxonomy — what belongs in `<live-context>` vs `<project-context>` — is defined canonically in `psyche.md` §`<output_envelope>` (lines 282–323). Read that section as the source of truth; this skill doc teaches only when and how to apply it.

**In-project detection rule (D-25.1-04).** Before composing your commune body, run `$LIVE psyche-download <your-id>` (Step 1 of `## Flow` above) and inspect the `<current ... />` tag at the top of the output. The `<current/>` tag carries a `project="..."` attribute whenever any payload is produced — its presence means you are inside a tracked project (inside a git repo, `project` is the repo name; outside a git repo per D-11, `project` is the cwd-basename fallback, which still counts as a project context for routing purposes). A `psyche-download` invocation that returns no payload at all (NO-CONTEXT exit) means no project resolved. So: `project="..."` populated on `<current/>` → emit BOTH envelopes (apply rule 1 or 2 below); no payload at all → emit ONLY `<live-context>` (rule 3). Secondary signal: the `<project-context-resolved name="..."/>` sentinel further down the output indicates the project file already has prior content — useful for spotting first-time-in-project pairings, but NOT the routing rule.

**Three rules (D-25.1-01..03):**

- **In-project, both slices populated** (marker present, you have project-specific content this cycle): emit `<live-context>...</live-context>` AND `<project-context>...</project-context>`, both with non-empty bodies.
- **In-project, no project-specific update this cycle** (marker present, but nothing project-bound to report): emit `<live-context>...</live-context>` AND `<project-context></project-context>` (empty body — the deliberate "in-project but quiet" signal per D-25.1-02). Distinguishable from "no project resolved".
- **Outside any tracked project** (marker absent): emit ONLY `<live-context>...</live-context>`. Do NOT emit an empty `<project-context>` envelope (missing tag means "no project resolved" per D-25.1-03).

**Nested envelopes.** The Phase 23 `<EVENT type="commune">` envelope (see `## Envelope shape (Phase 23 v1.8)` below) is composed by `$LIVE commune` automatically — you NEVER write `<EVENT>` tags. You write ONLY the inner two-slice body. The two envelope layers nest: outer EVENT wraps inner two-slice body.

(See `psyche.md` §`<output_envelope>` for the canonical taxonomy and per-slice content rules.)

## Envelope shape (Phase 23 v1.8)

As of v1.8 Phase 23, commune deliveries are wrapped in a typed EVENT envelope carrying a 5-field stamp (`machine`, `project`, `branch`, `head_sha`, `head_subject`); the prose `COMMUNE (timestamp): body` form is gone.

```xml
<EVENT type="commune" timestamp="2026-05-20T06:00:00-07:00" machine="hostname" project="claude_skill_owl" branch="main" head_sha="abc123..." head_subject="subject line capped at 72 chars">body</EVENT>
```

Outside a git repo (D-11), `branch`, `head_sha`, and `head_subject` are omitted entirely (not empty-string-set):

```xml
<EVENT type="commune" timestamp="2026-05-20T06:00:00-07:00" machine="hostname" project="cwd-basename">body</EVENT>
```

`$LIVE commune` composes this envelope automatically — Self does NOT manually construct EVENT XML. The `body` placeholder in the example above is the two-slice body (see `## Two-slice body shape (Phase 25 D-10/D-11)` above); the two envelope layers nest. The wrapper-side parser ignores unknown attrs, so the stamp fields are forward-compatible with older receivers. For drift detection on resume, see the `live` skill.

ARGUMENTS: with immediate next steps and broad summary of the project's status + end goal. we'll resume in the next session


14	FIX: `NetHost::bounded_block_on` wraps the 3 QUIC await sites in `tokio::time::timeout` under `quic_op_timeout` (default `BROKER_QUIC_OP_TIMEOUT_MS`=10s; test-override `set_quic_op_timeout`, off NetConfig like set_roster_exchange). On elapse → future DROPPED (cancels op, nothing half-registered) → non-TimedOut io::Error → broker REPLIES ordinary error frame.
15
16	4 invariants: (1) ordinary err not TimedOut — brain maps BrokerEvent::Error→io::Error::other=ErrorKind::Other → peer_outcome per-peer arm, NOT brain's own recv-deadline TimedOut (A-half poison path). (2) 10s < brain's 30s PUMP_PEER_IO_TIMEOUT so broker fires first (20s margin). (3) exactly-once: QUIC call is INSIDE apply_once closure → timeout→closure Err→effect()? before applied.insert → no phantom conn/stream id. (4) happy path zero added latency.
17
18	Tests: unit nethost (never-completing→prompt non-TimedOut err; ready untouched); int netbroker (membership-mismatch black hole: A=membership Some, B=None → A's prove_membership hangs → broker ordinary err in bound + exactly-once-on-timeout: !is_applied, applied_count 0, conn_count 0, redial clean); int pump (production pump vs dead peer → heartbeat monotonic-advances + run_peer_pump exits Ok, no PEER_PUMP_RESTART; pre-fix freezes ≥30s, 20s window catches). Membership-mismatch = the documented native black hole (nethost docs: "both peers must agree or the side expecting the control stream would hang").
19
20	**doyle GATE PASS @ PR#19 (full source code-read, not rubber-stamp) → deployah RELEASE GO (counter 19).** Verified all 4 invariants at source: (1) ordinary-error chain end-to-end (bounded_block_on→Error::other→send_error→KIND_ERROR→brain Error::other=Other→peer_outcome ordinary arm; broker fires 10s so brain's own recv-deadline TimedOut @brain.rs:1141 never trips); (2) 10s<30s margin; (3) exactly-once timeout-inside-apply_once (int proves !is_applied/applied_count0/conn_count0/clean-redial); (4) happy-path transparent. INT NON-VACUOUS confirmed (v0.8.2 lesson): pump test captures `first` heartbeat written loop-top BEFORE dial → requires ADVANCE → pre-fix dial wedges forever→loop never re-tops→frozen→assert fails (genuinely catches today's freeze). Linchpin verified: every net handler Err→send_error frame (broker.rs:735-756). CI green both runners, mergeable, seam-sweep green, clippy-workspace clean. Docs version-framed (no codes). Relayed VETTED CHANGELOG body + [0.8.3] intro to deployah. doyle on-call for hash check.
21
22	**PUBLISHED 2026-06-16 (counter 19, publisher leg 13× clean, no retag).** deployah full self-drive: merge PR#19 (0548c48) → bump b6470c1 (vetted [0.8.3] intro verbatim + Cargo.lock 11 first-party only, spared acto/compact_str/dlopen2/litemap/yoke-derive) → CI green both → tag v0.8.3 → sign+publish. Hashes: linux 65325788… win 7229cf07… signed rel-primary-2026, update-set v19. doyle hash-check ✓. B-half now on fleet update path → dead-peer pump wedge cured on next daemon restart/update.
23
24	3 commits: mint 69af744 → impl+unit+int cece4a6 → docs f4dc053. Docs: KNOWN-HAZARDS 7.8 NEW + 7.6 B-half-fixed reword + conformance row, DEFERRED:42 RESOLVED, CHANGELOG [Unreleased]. Gate bar preflighted: clippy --workspace -D warnings clean · traceable EXIT 0 [doc,impl,unit,int] · seam-sweep green (netbroker/pump/mesh/replicate/wanmsg/attach/daemon_lifecycle_real_brain + 314 lib) · docs-drift OK (CRLF-only). CARGO.LOCK bump = deployah's at release.


1	- [pre-flight clippy --workspace](ci-clippy-preflight-workspace.md) — CI denies warnings workspace-wide (`clippy --workspace --all-targets -D warnings`); a `-p <crate>` local check misses sibling-crate lints → CI red round-trip (M11-W1: `-p spt` missed a `useless_vec` in spt-daemon's act-gate test). Pre-flight the exact CI invocation. CI only fires on PR (push branches=main/dev-freeform)
2	- [shared-seam change → run ALL seam tests](shared-seam-change-run-all-seam-tests.md) — a behavior change to a SHARED runtime seam can break SIBLING tests exercising it; targeted preflight on only the new tests misses them (CI's full suite catches it). v0.8.2 F-010 residency broke daemon_lifecycle_real_brain (NOOP fast-exit psyche) — ran the livehost E2Es but not that spt-daemon sibling. Grep+run ALL seam tests (run_brain/spawn_live_host/psyche_init/daemon run). Test-analog of [[ci-clippy-preflight-workspace]]
3	- [v0.8.3 broker-QUIC-deadline](v083-broker-quic-deadline.md) — pump-IPC B-half (PATCH): REQ-HAZARD-BROKER-QUIC-DEADLINE. NetHost::bounded_block_on (tokio timeout 10s<30s brain) wraps dial/open_stream/send_stream → dead peer errors ORDINARY (non-TimedOut) INSIDE apply_once (no phantom) → pump redials not wedges. **PR #19 base main = doyle GATE-PASS (full source read, 4 invariants + non-vacuous int verified, CI green both runners). Handed deployah → release counter 19. todlando CLEAR.** deployah CARGO.LOCK+bump at release
4	- [peer-pump stall = deferred B-half](peer-pump-stall-bhalf-confirmed.md) — HFENDULEAM v0.8.2 pump STALLED (~93min frozen heartbeat, brain gen0 never restarted) CONFIRMED = DEFERRED.md:42 broker-side unbounded QUIC op to a DEAD roster peer (ENLYZEAM ~26h stale), A-half bounds only brain reads not broker await; KH 7.6 Win reader-park. NOT new bug. Interim=restart spt-core daemon (safe vs legacy-owl perches); real fix=mint REQ broker-side QUIC bound (broker-update batch)
5	- [v0.8.2 templating+residency](v082-templating-residency.md) — doyle delegation (I own waves+exec, gates→counter 18, NON-blocking perri-dogfood quality). F-009 TEMPLATE-ARGV-FILL: tokenize template FIRST then fill each token (1 value=1 argv elem, no split/injection); preserve errors+{{/}}+install-dir resolve. F-010 LIVEHOST-NONRESIDENT: host_one residency-confirm (child dead within N s → stamp parent psyche_host_error, no phantom online perch). Linked: F-009 split→F-010 early-exit. Branch v0.8.2-templating-residency @3cd5e6f. FLAKE-LEDGER rider folds here
6	- [v0.8.1 livehost boot-race](v081-livehost-bootrace.md) — doyle delegation (I own waves+exec, doyle gates→counter 17): net-less node, live agent goes online but daemon never hosts Psyche (no LIVEHOST_PSYCHE). VERIFIED: spawn_live_host @brainproc:230 IS reached net-less (broker-connect is local) → H1 refuted. Explore report's "registry race" theory SHAKY (same-slice inconsistency). True failure runtime-only → W1 = real-detached-daemon E2E (non-negotiable gate) reproduces it. Likely REQ-INSTALL-11 psyche-binary-not-found. Branch v0.8.1-livehost-bootrace @2aab895
7	- [v0.8.0 merge reconciliation](v080-merge-reconciliation.md) — unified v0.8.0 merge NON-clean: live psyche model diverged (M11 daemon-host WINS vs main Feature B in-process install-dir spawn); naive merge silently DROPS Feature B. Reapply recipe (livehost.rs:191 → `with_config_in` w/ registry `source_dir`) + traceable re-tag caveat. BLOCKED: main Feature B on doyle's local unpushed main; wait for push + merge-ordering ping. how-to-live shipped @672b928
8	- [F-007 live-relay acceptance ruling](f007-live-relay-acceptance.md) — live bringup = persistent `api listen <id>` via Monitor (heir to legacy $LIVE start), NOT `--once` (no-Monitor degenerate) nor $OWL listen (ready); psyche-spawn gated on `--manifest` (declares psyche_init, fires regardless of --once) + the v0.7.4 install-dir binary fix (REQ-INSTALL-11) for bare psyche binaries; both F-007 items Bucket 2 docs gap. Lesson: ground in CONTEXT.md before ruling (I erred recommending --once)
9	- [delegate-build preflight hang](delegate-build-preflight-hang.md) — background build agents hang silently on the full spt-daemon/spt integration suite in preflight (no completion notification on hang); instruct targeted units only (`--lib` + named tests); check liveness via transcript mtime, TaskStop the stalled one, take ownership of the (usually good) partial work + verify
10	- [don't wait — proceed autonomously](dont-wait-proceed-autonomously.md) — operator 2026-06-14: don't stop to ask permission between steps; chain next action (ping/commit gated batch/next wave). After doyle W4 gate-PASS, commit myself
11	- [alarm port deferred — arrangement system](alarm-port-deferred-arrangement.md) — /spt:new-alarm durable scheduler = ACCEPTED parity gap, stays DEFERRED (DEFERRED.md:43, ADR-0018 Q4/V3). spt-core has alarm shape+relay only; real timer in legacy owl in-mem. Operator 2026-06-15: keep deferred, a superseding "arrangement" system is coming (not ready to discuss). Don't dispatch the port, don't build an adapter stopgap. perri logs it as known gap
12	- [broker is daemon state anchor](broker-is-daemon-state-anchor.md) — post-ADR-0018 the BROKER (not restartable brain child) is the always-up CLI-reachable daemon-lifetime anchor (serves all sockets, "brain restart loses nothing", holds DigestHub); place ephemeral in-mem daemon state there. My M11-W2 drive-slot gate said "brain" — wrong word, functional spec = broker; todlando caught it. Drive no-replay needs link-gen stamping (clear-on-link-break not crash-robust alone)
13	- [adapter add --release archive](adapter-add-release-archive.md) — `spt adapter add --release <user/repo> [--tag]` (REQ-INSTALL-9, @94bda1e, operator-directed doyle build): fetches a `.spt` tar from a GitHub release, extracts (system tar, no new dep), registers root. Closes perri's monorepo --github gap (--github is root-only). Trusts HTTPS+GitHub; does NOT change the [update] ripple route (acquisition only). Docs live; perri directed
14	- [adapter tips → published docs](adapter-tips-published-docs.md) — synthesized perri's SPT_HARNESS_ADAPTER_TIPS.md into a NEW harness-agnostic docs-site page harness-contract/patterns.md ("Adapter patterns & pitfalls"); generalized all [CC] specifics, zero leakage; published live to GH-Pages via `gh workflow run docs-publish.yml --ref main` (fires on tags/dispatch only, NOT main push). Pre-flight: xtask check + xtask site
15	- [how-to subnet → W5 scope](howto-subnet-w5-scope.md) — perri found `spt how-to subnet` dead-ends (NO_SUCH_TOPIC); HOW_TO_TOPICS locked to ready/send (v1, M7 decision 12). Genuine REQ-DOCS-6 content gap. doyle ACCEPTED → scheduled M11-W5 docs wave (HOW_TO_SUBNET text + registry + bump v1-lock test). Confirm landed at W5 gate
16	- [M11 COMPLETE](m11-complete.md) — shell-substrate milestone done end-to-end (W1 consent · W2 drive · W3 tunnel-same-node · W4 gateway capstone · W5 rig+docs), all doyle GATE PASS. PR #16 @c5887db UNMERGED until the operator-gated M11 release (merge+bump+tag, doyle lines up GO). Cross-node tunnel DEFERRED. HOLDING for release ping
17	- [M11-W4 progress](m11-w4-progress.md) — Gateway-owner shell capstone (REQ-SHELL-5, proof-not-change, ZERO prod diff): built (int gateway_owner_shell_e2e + linkhost unit, same-type-diff-id negative), doyle code-read PASS + tree-identity = PRE-CLEARED, only CI green left. CI saga: branch unmergeable vs advanced main → 0 pull_request runs → merged main in (HEAD 63a5d3e, v0.7.3). Supersedes W3
18	- [twohost rig runs notify REAL mode](twohost-rig-real-notify-mode.md) — the [twohost] rig sets SPT_TWO_HOST_NOTIFY_BIN → notify-shell resident → notify-0 ONLINE (fallback/local = noop offline). M11-W5 first-fire: the W2 drive-DROP rung asserted offline against notify-0 → it was ONLINE → drive DELIVERED (live slot) not dropped → RED. Use a deterministically-offline noop shell for drop proofs. A [twohost]-gated rung never fired = UNPROVEN regardless of green normal CI

... [56 lines truncated] ...


<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.


/spt:commune with immediate next steps and broad summary of the project's status + end goal. we'll resume in the next session


Commune requested for session handoff. First download Psyche's *current* context (it shifted — v0.8.3 looks PUBLISHED now per the latest state).


Bash

$LIVE psyche-download todlando 2>&1 | tail -40

Download fresh psyche context


<memformat>
<?xml version="1.0"?>
<memformat version="1">
<!-- Changelog: v1 - initial seed -->
<topics>
  <topic name="events">Notable or unusual events and requests</topic>
  <topic name="interactions">Agent interactions -- who, roles, contributions</topic>
  <topic name="reflections">Thoughts on recent work -- what went well, what was tricky</topic>
  <topic name="ideas">Ideas to raise with the user</topic>
  <topic name="improvements">Further improvement ideas for recent problem spaces</topic>
  <topic name="timeline">What happened when, timing, sequencing</topic>
  <topic name="blockers">Current blockers or concerns</topic>
  <topic name="focus">Current focus and immediate next steps</topic>
</topics>
</memformat>
</memformat>

<current machine="HFENDULEAM" project="spt-core" branch="v0.8.3-broker-quic-deadline" head_sha="f4dc053faf568ab32dfdd2dcf6141b885d763734" head_subject="v0.8.3 docs: KNOWN-HAZARDS 7.8 + 7.6 B-half-fixed reword + DEFERRED reso…" commits_since="0" commits_unpulled="0"/>
## Status
Generation 56+ (post-revive 2026-06-17). v0.8.3 dispatcher complete.

## Current Focus
v0.8.3 (counter 19, PATCH) **BUILT & PR #19 SUBMITTED** — broker-side QUIC-op bound (pump-IPC-deadline B-half). Awaiting doyle gate.

## Key Decisions and State
- **v0.8.3 CI: FULLY GREEN** — n1-gate ✓, test (5m10s Linux / 6m4s Win) ✓, traceability ✓; twohost skipped (no tag)
- **PR #19**: mergeable (0 behind main), base main, 3 commits (mint 69af744 → impl+unit+int cece4a6 → docs f4dc053)
- **Root cause**: dead roster peer → broker QUIC await unbounded → pump wedge (2.2h recurrence 2026-06-16 pattern; exact wedge recurred 2026-06-16)
- **Fix**: `NetHost::bounded_block_on` (tokio timeout, 10s default < brain's 30s) wraps dial/open_stream/send_stream; timeout fires *inside* apply_once → no phantom conn/stream id → ordinary error the broker replies
- **Tests shipped**: unit wrapper + int netbroker (black-hole → ordinary err in bound + exactly-once-on-timeout) + int pump (heartbeat advances, no `PEER_PUMP_RESTART`) + 314 lib seam-sweep green
- **Docs**: KNOWN-HAZARDS 7.8 new + 7.6 reworded fixed + DEFERRED:42 RESOLVED + CHANGELOG
- **doyle pinged** twice (PR-ready + CI-green); rationale + exactly-once proof relayed
- Roles steady: todlando=executor, doyle=gater+release driver, deployah=publisher (CARGO.LOCK+bump = deployah's at release)

## Tracked Intentions
Perch live, listening for doyle gate → deployah counter 19 release. Standing by.<project-context-resolved name="spt-core"/>
**v0.8.3 submitted, CI green, gating in progress.** Next = doyle verdict → deployah release (counter 19).


Psyche's current context stops at "submitted, CI green, gating in progress" — it does NOT know doyle gate-PASS or the release. Before composing, verify the publish state firsthand (memory shows PUBLISHED counter 19, but I should ground it):


git fetch --tags --quiet origin 2>&1 | tail -2; echo "=== v0.8.3 tag ==="; git tag -l 'v0.8.3'; echo "=== origin/main head ==="; git log origin/main --oneline -3; echo "=== PR #19 ==="; gh pr view 19 --json state,mergedAt -q '"state=\(.state) merged=\(.mergedAt)"' 2>&1

Verify v0.8.3 published firsthand


=== v0.8.3 tag ===
v0.8.3
=== origin/main head ===
b6470c1 release: v0.8.3
0548c48 Merge pull request #19 from SaberMage/v0.8.3-broker-quic-deadline
f4dc053 v0.8.3 docs: KNOWN-HAZARDS 7.8 + 7.6 B-half-fixed reword + DEFERRED resolved + CHANGELOG
=== PR #19 ===
state=MERGED merged=2026-06-17T04:21:50Z


Verified firsthand: **v0.8.3 PUBLISHED** — PR #19 MERGED (`0548c48`), release bump `b6470c1`, tag `v0.8.3` on main. deployah completed the release (counter 19) during the idle window. The Psyche snapshot predates both the gate-pass and the publish — that's the delta. Compose the commune (in-project → both slices).


Write

<live-context>
Session-end handoff (todlando, gen 56). Delta since your last snapshot ("v0.8.3 submitted, CI green, gating in progress"):

- **doyle GATE-PASS** on v0.8.3 PR #19 — full source code-read (not rubber-stamp). Verified all 4 invariants AT SOURCE: the full ordinary-error chain (bounded_block_on→Error::other→send_error→KIND_ERROR frame→brain maps BrokerEvent::Error→ErrorKind::Other→peer_outcome ordinary arm; broker fires 10s so the brain's own recv-deadline TimedOut @brain.rs:1141 never trips); 10s<30s margin; exactly-once timeout-inside-apply_once; happy-path transparent. Confirmed both int tests NON-VACUOUS (the v0.8.2 lesson applied) — pump test captures `first` heartbeat written loop-top BEFORE the dial, so pre-fix the wedge freezes it and the assert fails. Called the execution "excellent, every invariant landed exactly."
- **deployah PUBLISHED** v0.8.3 (counter 19) — full self-drive, verified firsthand: PR #19 MERGED (0548c48), release bump b6470c1, tag v0.8.3 on main, hashes linux 65325788… / win 7229cf07…, doyle hash-check ✓. Publisher leg 13× clean, no retag.
- **todlando is CLEAR** — nothing pending. Stood down cleanly. Roles steady: I execute, doyle gates+drives release, deployah publishes, perri dogfoods the adapter and files F-NNN gaps.

Operating note that held up well this session: ground the design in the actual code seam BEFORE writing (traced nethost/broker/pump/effect/brain to confirm each invariant's mechanism — the ordinary-vs-TimedOut classification and the apply_once-Err-before-insert exactly-once were both verified at source, not assumed).
</live-context>
<project-context>
**v0.8.3 SHIPPED & on the fleet update path — the dead-peer pump wedge is cured on next daemon restart/update.**

What landed (REQ-HAZARD-BROKER-QUIC-DEADLINE, the pump-IPC-deadline B-half, DEFERRED.md:42 now RESOLVED):
- Root cause: a DEAD/black-holed roster peer → the broker's brain-facing QUIC op (dial/open_stream/send_stream) awaited unbounded; the A-half (v0.4.1) bounds only the brain's READ, so the brain escaped only via its 30s deadline → 30s stall + a supervised pump restart that re-dials the same dead peer and re-wedges. The 2.2h hfenduleam wedge; recurred 2026-06-16.
- Fix: `NetHost::bounded_block_on` wraps the three QUIC await sites in `tokio::time::timeout` under `quic_op_timeout` (default BROKER_QUIC_OP_TIMEOUT_MS=10s; test-override via `set_quic_op_timeout`, off NetConfig like set_roster_exchange). On elapse → future DROPPED (cancels op, nothing half-registered) → non-TimedOut io::Error → broker REPLIES an ordinary error frame → brain reconstructs ErrorKind::Other → peer_outcome per-peer arm (drop conn + redial), round continues, heartbeat advances. Never the brain's own TimedOut (the A-half poison/restart path). 10s < the brain's 30s PUMP_PEER_IO_TIMEOUT so the broker fires first (20s margin). Exactly-once: the QUIC call is inside the apply_once closure → timeout fails the closure before applied.insert → no phantom conn/stream id.
- Tests: unit (wrapper) + int netbroker (membership-mismatch black hole → ordinary err in bound + exactly-once-on-timeout) + int pump (heartbeat monotonic-advances, run_peer_pump exits Ok, no PEER_PUMP_RESTART). Docs: KNOWN-HAZARDS 7.8 new + 7.6 B-half-fixed reword + conformance row, DEFERRED:42 RESOLVED, CHANGELOG.
- Commits: mint 69af744 → impl+unit+int cece4a6 → docs f4dc053. Merged via PR #19 (0548c48), bump b6470c1, tag v0.8.3.

**IMMEDIATE NEXT STEPS (resume):**
1. Switch off the merged branch — `git checkout main && git pull` (v0.8.3-broker-quic-deadline is merged; the branch can be deleted). Currently still sitting on v0.8.3-broker-quic-deadline @f4dc053.
2. No queued work. The loop is idle until either perri files a new F-NNN dogfood gap (perri gap → doyle designs → I build → doyle gates → deployah ships) or doyle dispatches the next item.
3. Carry-forward rider (still open, NOT addressed in v0.8.3 — it's a spt-daemon-test nit): `daemon_lifecycle_real_brain` kill_pid lacks `.no_window()` (doyle nit, harmless Windows console flash). Fold into the NEXT spt-daemon-test change, not a standalone PR.
4. The prior "peer-pump ~7-8min stall" deferred investigation IS this v0.8.3 fix — consider it closed, not a separate TODO.

**END GOAL (unchanged):** spt-core = the harness-independent core for an agent ecosystem (messaging, live-agent lifecycle, terminal hosting, P2P, runtime-manifest harness contract); a clean-room rebuild of legacy `claude_skill_owl`. Current phase = perri-dogfood hardening: perri builds the spt-claude-code adapter from PUBLISHED docs + binary only and files parity gaps, fixed in the v0.8.x patch stream. Target: spt-claude-code reaches legacy-owl parity → the cplugs plugin name flips `sptc`→`spt` → legacy owl retires.
</project-context>


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)

<live-context>
Session-end handoff (todlando, gen 56). Delta since your last snapshot ("v0.8.3 submitted, CI green, gating in progress"):

- **doyle GATE-PASS** on v0.8.3 PR #19 — full source code-read (not rubber-stamp). Verified all 4 invariants AT SOURCE: the full ordinary-error chain (bounded_block_on→Error::other→send_error→KIND_ERROR frame→brain maps BrokerEvent::Error→ErrorKind::Other→peer_outcome ordinary arm; broker fires 10s so the brain's own recv-deadline TimedOut @brain.rs:1141 never trips); 10s<30s margin; exactly-once timeout-inside-apply_once; happy-path transparent. Confirmed both int tests NON-VACUOUS (the v0.8.2 lesson applied) — pump test captures `first` heartbeat written loop-top BEFORE the dial, so pre-fix the wedge freezes it and the assert fails. Called the execution "excellent, every invariant landed exactly."
- **deployah PUBLISHED** v0.8.3 (counter 19) — full self-drive, verified firsthand: PR #19 MERGED (0548c48), release bump b6470c1, tag v0.8.3 on main, hashes linux 65325788… / win 7229cf07…, doyle hash-check ✓. Publisher leg 13× clean, no retag.
- **todlando is CLEAR** — nothing pending. Stood down cleanly. Roles steady: I execute, doyle gates+drives release, deployah publishes, perri dogfoods the adapter and files F-NNN gaps.

Operating note that held up well this session: ground the design in the actual code seam BEFORE writing (traced nethost/broker/pump/effect/brain to confirm each invariant's mechanism — the ordinary-vs-TimedOut classification and the apply_once-Err-before-insert exactly-once were both verified at source, not assumed).
</live-context>
<project-context>
**v0.8.3 SHIPPED & on the fleet update path — the dead-peer pump wedge is cured on next daemon restart/update.**

What landed (REQ-HAZARD-BROKER-QUIC-DEADLINE, the pump-IPC-deadline B-half, DEFERRED.md:42 now RESOLVED):
- Root cause: a DEAD/black-holed roster peer → the broker's brain-facing QUIC op (dial/open_stream/send_stream) awaited unbounded; the A-half (v0.4.1) bounds only the brain's READ, so the brain escaped only via its 30s deadline → 30s stall + a supervised pump restart that re-dials the same dead peer and re-wedges. The 2.2h hfenduleam wedge; recurred 2026-06-16.
- Fix: `NetHost::bounded_block_on` wraps the three QUIC await sites in `tokio::time::timeout` under `quic_op_timeout` (default BROKER_QUIC_OP_TIMEOUT_MS=10s; test-override via `set_quic_op_timeout`, off NetConfig like set_roster_exchange). On elapse → future DROPPED (cancels op, nothing half-registered) → non-TimedOut io::Error → broker REPLIES an ordinary error frame → brain reconstructs ErrorKind::Other → peer_outcome per-peer arm (drop conn + redial), round continues, heartbeat advances. Never the brain's own TimedOut (the A-half poison/restart path). 10s < the brain's 30s PUMP_PEER_IO_TIMEOUT so the broker fires first (20s margin). Exactly-once: the QUIC call is inside the apply_once closure → timeout fails the closure before applied.insert → no phantom conn/stream id.
- Tests: unit (wrapper) + int netbroker (membership-mismatch black hole → ordinary err in bound + exactly-once-on-timeout) + int pump (heartbeat monotonic-advances, run_peer_pump exits Ok, no PEER_PUMP_RESTART). Docs: KNOWN-HAZARDS 7.8 new + 7.6 B-half-fixed reword + conformance row, DEFERRED:42 RESOLVED, CHANGELOG.
- Commits: mint 69af744 → impl+unit+int cece4a6 → docs f4dc053. Merged via PR #19 (0548c48), bump b6470c1, tag v0.8.3.

**IMMEDIATE NEXT STEPS (resume):**
1. Switch off the merged branch — `git checkout main && git pull` (v0.8.3-broker-quic-deadline is merged; the branch can be deleted). Currently still sitting on v0.8.3-broker-quic-deadline @f4dc053.
2. No queued work. The loop is idle until either perri files a new F-NNN dogfood gap (perri gap → doyle designs → I build → doyle gates → deployah ships) or doyle dispatches the next item.
3. Carry-forward rider (still open, NOT addressed in v0.8.3 — it's a spt-daemon-test nit): `daemon_lifecycle_real_brain` kill_pid lacks `.no_window()` (doyle nit, harmless Windows console flash). Fold into the NEXT spt-daemon-test change, not a standalone PR.
4. The prior "peer-pump ~7-8min stall" deferred investigation IS this v0.8.3 fix — consider it closed, not a separate TODO.

**END GOAL (unchanged):** spt-core = the harness-independent core for an agent ecosystem (messaging, live-agent lifecycle, terminal hosting, P2P, runtime-manifest harness contract); a clean-room rebuild of legacy `claude_skill_owl`. Current phase = perri-dogfood hardening: perri builds the spt-claude-code adapter from PUBLISHED docs + binary only and files parity gaps, fixed in the v0.8.x patch stream. Target: spt-claude-code reaches legacy-owl parity → the cplugs plugin name flips `sptc`→`spt` → legacy owl retires.
</project-context>


Commune written to `.claude/todlando-commune.md` (two-slice: live + project). Self listener will ingest into Psyche and delete on success.

**Session-end state — v0.8.3 COMPLETE & PUBLISHED.**

Communed delta (Psyche snapshot predated both):
- **doyle GATE-PASS** — full source code-read, 4 invariants verified at source, int tests confirmed non-vacuous
- **deployah PUBLISHED** v0.8.3 counter 19 (verified firsthand: PR #19 merged `0548c48`, bump `b6470c1`, tag `v0.8.3`, hashes linux 65325788…/win 7229cf07…, doyle hash-check ✓)
- dead-peer pump wedge now cured on next daemon restart/update

Next-session resume (in the commune):
1. `git checkout main && git pull` (v0.8.3 branch merged, deletable) — currently still on the merged branch
2. No queued work — idle until perri files next F-NNN or doyle dispatches
3. Carry-forward rider: `daemon_lifecycle_real_brain` kill_pid `.no_window()` nit → fold into next spt-daemon-test change
4. Prior "peer-pump stall" deferred = THIS fix, closed

End goal: spt-core → spt-claude-code legacy-owl parity → `sptc`→`spt` plugin flip → legacy owl retires.

Perch live. Clear for next session.