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: SESSION HANDOFF — M4 (spt-net) in progress, pushed to dev-freeform @ bfacfb8 (CI running).

END GOAL (unchanged): harness-independent agent-ecosystem core (messaging, live-agent lifecycle, terminal hosting, first-class P2P networking, runtime-manifest harness contract) as Rust crates + one `spt` binary. Proof = the same agent runs natively across all a user's machines with a synced mind, reachable/operable from anywhere, seamless signed self-update (already built in M3). First thing built atop it: rebuilt `spt` Claude-Code plugin at parity. Clean-room rebuild of claude_skill_owl.

STATUS: M0-M3 COMPLETE + CI-green. M4 STARTED this session (user gave explicit go).
- D0 (c47d2c6): crates/spt-net scaffolded, sibling above spt-msg, whole transport behind default-on `net` feature.
- D1 (3f726ed + 51981c4): NetEndpoint over iroh =0.98.2 (pinned EXACT — Spike #2 version). Keyed by node's OWN spt-proto Ed25519 seed → iroh EndpointId == node pubkey (address == name). ALPN spt-core/net/0. RelayPolicy {N0Default|SelfHosted(RelayMap)|Disabled} + RELAY_DISCLOSURE (REQ-NET-2). LocalDiscovery {Mdns|Off} + connect_by_id. NetEndpoint::iroh() = the D4 broker-ownership seam. REQ-NET-1 [impl,unit] + REQ-NET-2 [impl]. 2 hermetic tests in CI (identity-binding, loopback echo); mDNS-by-id test #[ignore] but passes locally (3.1s).
- D6 merge-model decision (c49e522): #7 resolved — per-node monotonic epoch + version vector; concurrent = explicit conflict; unifies with #8 epoch-lease.
- DOCS PASS (d4c04d6 + bfacfb8) via grill-with-docs: corrected the Psyche I/O model (I had it wrong twice; user drove correction). Psyche is SANDBOXED (Read/Write/Edit only), CANNOT send. Sole outbound = STDOUT <EVENT type="reply">/<EVENT type="notify"> markers, daemon-proxied (strips/re-stamps from=, constrains reply→__REPLY_TO__ sender / notify→own user). Summarizer (cheap ephemeral model) ≠ Psyche; summarizer emits [COMMUNE] delta fed INTO psyche. Captured as ADR-0012, CONTEXT.md (Psyche entry + new Summarizer term), KNOWN-HAZARDS 7.3 (live-psyche driver MUST capture stdout — interim spawn_session Stdio::null discards replies) + 7.4 (per-agent pulse/psyche/echo must not serialize across agents — bounded LLM calls block their thread; future run_pulse_loop fan-out must be per-agent-threaded). New M4 task D7.5 (psyche outbound relay, feeds D8). REQ-HAZARD-PSYCHE-OUTBOUND-PROXY + REQ-HAZARD-DAEMON-SCHED-NONBLOCKING registered, inactive (rule 5).

KEY FACT: spt-net is the workspace's FIRST async crate (iroh+tokio, net-gated); rest is thread-based/sync. D4 broker must host the tokio runtime.

IMMEDIATE NEXT STEPS (resume here):
1. Confirm CI green on bfacfb8 (iroh adds build time; ubuntu+windows+traceability).
2. D2 pairing (security-critical) — FIRST register 3 hazard reqs in traceable-reqs.toml (rule 3): REQ-HAZARD-PAIR-TRANSCRIPT-BIND (#12), REQ-HAZARD-PAIR-SEED-ROTATION (#10), REQ-HAZARD-PAIR-RATE-LIMIT (#11). Then TOTP-seeded SPAKE2 (ADR-0005) + full transcript binding + seed epoch/rotation + subnet-global rate limit + trust store/TOFU + multi-subnet ceremony. See M4-PLAN.md D2 sub-tasks.
3. Task order after D2: D3 registry → D4 broker QUIC ownership → D5 cross-node msg/remote-drive → D6 psyche sync → D7 update propagation → D7.5 psyche outbound relay → D8 notif → D9 closeout/E2E.

RESUME PROTOCOL: read M4-PLAN.md (full D-task layer + red-team obligations table) + ADR-0005/0006/0012. iroh API churns — grep the registry source at ~/.cargo/registry/src/index.crates.io-*/iroh-0.98.2/ rather than guess; Spike #2/#3 working source at ../spt-spikes. Each D-task is milestone-sized — expect /self-clear + commune between most.

GOTCHAS: spt_home() writes must create_dir_all the parent; never name a bin/test/staged-update artifact *update*/*setup*/*install*/*patch* on Windows (UAC os error 740). Cross-machine D9 E2E rig: gravity-linux (Ubuntu/forkpty) + a Windows host.


Commune protocol: download current Psyche context first, diff, then write the delta. My id = `doyle`. Downloading current context.


Bash

$LIVE psyche-download doyle 2>&1 | head -60; echo "EXIT=$?"

Download current Psyche context for doyle


Command running in background with ID: bpakczmmn. Output is being written to: C:\Users\decid\AppData\Local\Temp\claude\C--Users-decid-Documents-projects-spt-core\b494f5e6-5b4d-4145-aaaa-5585e1168377\tasks\bpakczmmn.output. You will be notified when it completes. To check interim output, use Read on that file path.


push the outstanding commits, then /commune with immediate next steps and broad summary of the project's status + end goal. we'll resume in the next session --> proceed with /self-clear


<task-notification>
<task-id>bpakczmmn</task-id>
<tool-use-id>toolu_019LFZVovfoaZqgxT4s4woid</tool-use-id>
<output-file>C:\Users\decid\AppData\Local\Temp\claude\C--Users-decid-Documents-projects-spt-core\b494f5e6-5b4d-4145-aaaa-5585e1168377\tasks\bpakczmmn.output</output-file>
<status>completed</status>
<summary>Background command "Download current Psyche context for doyle" completed (exit code 0)</summary>
</task-notification>


1	<memformat>
2	<?xml version="1.0"?>
3	<memformat version="1">
4	<!-- Changelog: v1 - initial seed -->
5	<topics>
6	  <topic name="events">Notable or unusual events and requests</topic>
7	  <topic name="interactions">Agent interactions -- who, roles, contributions</topic>
8	  <topic name="reflections">Thoughts on recent work -- what went well, what was tricky</topic>
9	  <topic name="ideas">Ideas to raise with the user</topic>
10	  <topic name="improvements">Further improvement ideas for recent problem spaces</topic>
11	  <topic name="timeline">What happened when, timing, sequencing</topic>
12	  <topic name="blockers">Current blockers or concerns</topic>
13	  <topic name="focus">Current focus and immediate next steps</topic>
14	</topics>
15	</memformat>
16	</memformat>
17
18	<current machine="HFENDULEAM" project="spt-core" branch="dev-freeform" head_sha="bfacfb855780e9e696ced4a638a6543a7e219593" head_subject="docs(m4): capture daemon non-blocking-scheduling invariant (hazard 7.4)" commits_since="0" commits_unpulled="0"/>
19	<live-context>
20	**M4 (spt-net) D1 COMPLETE.** D1a/b/c all shipped + tested. 5 commits ahead, unpushed. **D2 ready (TOTP-SPAKE2).**
21
22	**NEW — Psyche I/O model (verified vs sister source):**
23	- **Sandboxed**: Read/Write/Edit tools only. No send/network. Psyche **cannot send messages itself.**
24	- **Inbound = stdin**: Wrapper feeds message payload to psyche stdin.
25	- **Outbound = stdout markers**: Psyche writes `[REPLY]…[/REPLY]`, `[NOTIFY]…[/NOTIFY]`, `[COMMUNE]…<project-context-resolved name="spt-core"/>
26	D1 complete + committed (5 commits, unpushed). Decision B (per-node epoch + version-vector conflict detection) locked in via `c49e522`. Ready for D2 (hazard reqs registration + SPAKE2 crate selection).EXIT=0
27

<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="dev-freeform" head_sha="bfacfb855780e9e696ced4a638a6543a7e219593" head_subject="docs(m4): capture daemon non-blocking-scheduling invariant (hazard 7.4)" commits_since="0" commits_unpulled="0"/>
<live-context>
**M4 (spt-net) D1 COMPLETE.** D1a/b/c all shipped + tested. 5 commits ahead, unpushed. **D2 ready (TOTP-SPAKE2).**

**NEW — Psyche I/O model (verified vs sister source):**
- **Sandboxed**: Read/Write/Edit tools only. No send/network. Psyche **cannot send messages itself.**
- **Inbound = stdin**: Wrapper feeds message payload to psyche stdin.
- **Outbound = stdout markers**: Psyche writes `[REPLY]…[/REPLY]`, `[NOTIFY]…[/NOTIFY]`, `[COMMUNE]…<project-context-resolved name="spt-core"/>
D1 complete + committed (5 commits, unpushed). Decision B (per-node epoch + version-vector conflict detection) locked in via `c49e522`. Ready for D2 (hazard reqs registration + SPAKE2 crate selection).EXIT=0


Prompt:
<task-notification>
<task-id>bpakczmmn</task-id>
<tool-use-id>toolu_019LFZVovfoaZqgxT4s4woid</tool-use-id>
<output-file>C:\Users\decid\AppData\Local\Temp\claude\C--Users-decid-Documents-projects-spt-core\b494f5e6-5b4d-4145-aaaa-5585e1168377\tasks\bpakczmmn.output</output-file>
<status>completed</status>
<summary>Background command "Download current Psyche context for doyle" completed (exit code 0)</summary>
</task-notification>


In-project (`project="spt-core"`), prior project content exists → both slices. Current context has D1 + an **outdated** psyche-outbound note ("[REPLY]/[NOTIFY]/[COMMUNE]" brackets, COMMUNE wrongly attributed to psyche). Delta = the docs-pass corrections + push. Writing the two-slice commune.


Write

<live-context>
**M4 D1 COMPLETE + docs pass done; 7 commits PUSHED to dev-freeform @ bfacfb8** (were 5 unpushed last commune; now pushed, CI running). Next session resumes at **D2 pairing**.

**CORRECTION — supersedes my prior psyche-outbound note** ("stdout markers [REPLY]/[NOTIFY]/[COMMUNE]"): that was wrong on two counts, now fixed in the docs.
- Psyche emits **ONLY reply + notify**, as **`<EVENT type="reply">`/`<EVENT type="notify">`** (the shared SPT XML envelope grammar — NOT bracket markers).
- **`[COMMUNE]` is the SUMMARIZER's output**, not the psyche's. The Summarizer is a *separate cheap ephemeral model* that builds a commune delta fed **INTO** the psyche as inbound context. Summarizer ≠ Psyche.
- Psyche is **sandboxed** (Read/Write/Edit only, no send/network); the **daemon is its sanitizing outbound proxy** (strips/re-stamps `from=`; reply→`__REPLY_TO__` sender only, notify→own user only).
</live-context>
<project-context>
**spt-core / M4 (spt-net) — session delta.**

**Docs pass via grill-with-docs (commits d4c04d6 + bfacfb8):**
- **ADR-0012** (new) — Psyche trust boundary: sandboxed R/W/E, sole outbound = stdout `<EVENT type="reply|notify">`, daemon strips/re-stamps `from=` + constrains routing. Rejected: file-drop reply, terse intent tags, targeted reply, pass-through.
- **CONTEXT.md** — Psyche entry extended with the I/O+trust model; **new Summarizer term** (distinct cheap actor, no perch, commune-delta only, never reply/notify).
- **KNOWN-HAZARDS 7.3** — live-Psyche driver MUST capture stdout (interim `runtime::spawn_session` `Stdio::null()` silently discards every reply/notify) + daemon MUST strip/re-stamp `from=` (anti-spoof). **7.4** — per-agent pulse/psyche/echo must NOT serialize across agents (echo-commune + the psyche turn are bounded LLM calls that block their thread; the future `run_pulse_loop` multi-agent fan-out must be per-agent-threaded, not one serial driver). Both have inactive REQ-HAZARDs (rule 5): `REQ-HAZARD-PSYCHE-OUTBOUND-PROXY`, `REQ-HAZARD-DAEMON-SCHED-NONBLOCKING`.
- **M4-PLAN.md D7.5** (new task) — psyche outbound relay channel (bounded stdin-fed/stdout-captured driver + `<EVENT type=reply|notify>` parse + sanitizing relay); prerequisite feeding D8's notify-from-psyche path.

**D1 (done earlier, committed 3f726ed + 51981c4):** `NetEndpoint` over **iroh =0.98.2 (pinned EXACT)**, keyed by node's own spt-proto Ed25519 seed → iroh EndpointId == node pubkey. ALPN `spt-core/net/0`. `RelayPolicy` + `RELAY_DISCLOSURE` (REQ-NET-2). `LocalDiscovery{Mdns|Off}` + `connect_by_id`. `NetEndpoint::iroh()` = D4 broker-ownership seam. REQ-NET-1 [impl,unit] + REQ-NET-2 [impl]. mDNS test `#[ignore]` (CI multicast) but passes locally.

**IMMEDIATE NEXT (resume):**
1. Confirm CI green on bfacfb8 (iroh adds build time; ubuntu+windows+traceability).
2. **D2 pairing** (security-critical) — FIRST register 3 hazard reqs (rule 3): `REQ-HAZARD-PAIR-TRANSCRIPT-BIND` (#12), `REQ-HAZARD-PAIR-SEED-ROTATION` (#10), `REQ-HAZARD-PAIR-RATE-LIMIT` (#11). Then TOTP-SPAKE2 (ADR-0005) + transcript binding + seed epoch/rotation + subnet-global rate-limit + trust store/TOFU + multi-subnet ceremony. SPAKE2 crate selection still pending.
3. D-task order: D2 → D3 registry → D4 broker QUIC ownership → D5 cross-node msg/remote-drive → D6 psyche sync → D7 update prop → **D7.5 psyche outbound** → D8 notif → D9 E2E.

**KEY FACTS:** spt-net = workspace's FIRST async crate (iroh+tokio, net-gated); rest thread-based/sync → **D4 broker must host the tokio runtime**. iroh API churns — grep registry source `~/.cargo/registry/src/index.crates.io-*/iroh-0.98.2/` rather than guess; Spike #2/#3 working source at `../spt-spikes`. Read M4-PLAN.md (full D-layer + red-team table) + ADR-0005/0006/0012 on resume. Gotchas: `create_dir_all` under `spt_home()`; never name a Windows bin/test/artifact *update*/*setup*/*install*/*patch* (UAC 740). D9 E2E rig: gravity-linux + a Windows host.
</project-context>


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

<live-context>
**M4 D1 COMPLETE + docs pass done; 7 commits PUSHED to dev-freeform @ bfacfb8** (were 5 unpushed last commune; now pushed, CI running). Next session resumes at **D2 pairing**.

**CORRECTION — supersedes my prior psyche-outbound note** ("stdout markers [REPLY]/[NOTIFY]/[COMMUNE]"): that was wrong on two counts, now fixed in the docs.
- Psyche emits **ONLY reply + notify**, as **`<EVENT type="reply">`/`<EVENT type="notify">`** (the shared SPT XML envelope grammar — NOT bracket markers).
- **`[COMMUNE]` is the SUMMARIZER's output**, not the psyche's. The Summarizer is a *separate cheap ephemeral model* that builds a commune delta fed **INTO** the psyche as inbound context. Summarizer ≠ Psyche.
- Psyche is **sandboxed** (Read/Write/Edit only, no send/network); the **daemon is its sanitizing outbound proxy** (strips/re-stamps `from=`; reply→`__REPLY_TO__` sender only, notify→own user only).
</live-context>
<project-context>
**spt-core / M4 (spt-net) — session delta.**

**Docs pass via grill-with-docs (commits d4c04d6 + bfacfb8):**
- **ADR-0012** (new) — Psyche trust boundary: sandboxed R/W/E, sole outbound = stdout `<EVENT type="reply|notify">`, daemon strips/re-stamps `from=` + constrains routing. Rejected: file-drop reply, terse intent tags, targeted reply, pass-through.
- **CONTEXT.md** — Psyche entry extended with the I/O+trust model; **new Summarizer term** (distinct cheap actor, no perch, commune-delta only, never reply/notify).
- **KNOWN-HAZARDS 7.3** — live-Psyche driver MUST capture stdout (interim `runtime::spawn_session` `Stdio::null()` silently discards every reply/notify) + daemon MUST strip/re-stamp `from=` (anti-spoof). **7.4** — per-agent pulse/psyche/echo must NOT serialize across agents (echo-commune + the psyche turn are bounded LLM calls that block their thread; the future `run_pulse_loop` multi-agent fan-out must be per-agent-threaded, not one serial driver). Both have inactive REQ-HAZARDs (rule 5): `REQ-HAZARD-PSYCHE-OUTBOUND-PROXY`, `REQ-HAZARD-DAEMON-SCHED-NONBLOCKING`.
- **M4-PLAN.md D7.5** (new task) — psyche outbound relay channel (bounded stdin-fed/stdout-captured driver + `<EVENT type=reply|notify>` parse + sanitizing relay); prerequisite feeding D8's notify-from-psyche path.

**D1 (done earlier, committed 3f726ed + 51981c4):** `NetEndpoint` over **iroh =0.98.2 (pinned EXACT)**, keyed by node's own spt-proto Ed25519 seed → iroh EndpointId == node pubkey. ALPN `spt-core/net/0`. `RelayPolicy` + `RELAY_DISCLOSURE` (REQ-NET-2). `LocalDiscovery{Mdns|Off}` + `connect_by_id`. `NetEndpoint::iroh()` = D4 broker-ownership seam. REQ-NET-1 [impl,unit] + REQ-NET-2 [impl]. mDNS test `#[ignore]` (CI multicast) but passes locally.

**IMMEDIATE NEXT (resume):**
1. Confirm CI green on bfacfb8 (iroh adds build time; ubuntu+windows+traceability).
2. **D2 pairing** (security-critical) — FIRST register 3 hazard reqs (rule 3): `REQ-HAZARD-PAIR-TRANSCRIPT-BIND` (#12), `REQ-HAZARD-PAIR-SEED-ROTATION` (#10), `REQ-HAZARD-PAIR-RATE-LIMIT` (#11). Then TOTP-SPAKE2 (ADR-0005) + transcript binding + seed epoch/rotation + subnet-global rate-limit + trust store/TOFU + multi-subnet ceremony. SPAKE2 crate selection still pending.
3. D-task order: D2 → D3 registry → D4 broker QUIC ownership → D5 cross-node msg/remote-drive → D6 psyche sync → D7 update prop → **D7.5 psyche outbound** → D8 notif → D9 E2E.

**KEY FACTS:** spt-net = workspace's FIRST async crate (iroh+tokio, net-gated); rest thread-based/sync → **D4 broker must host the tokio runtime**. iroh API churns — grep registry source `~/.cargo/registry/src/index.crates.io-*/iroh-0.98.2/` rather than guess; Spike #2/#3 working source at `../spt-spikes`. Read M4-PLAN.md (full D-layer + red-team table) + ADR-0005/0006/0012 on resume. Gotchas: `create_dir_all` under `spt_home()`; never name a Windows bin/test/artifact *update*/*setup*/*install*/*patch* (UAC 740). D9 E2E rig: gravity-linux + a Windows host.
</project-context>


Commune queued (`.claude/doyle-commune.md` — Self listener will ingest, wrapper deletes on success). Now /self-clear with a wake note.


Skill

Wake note for after the wipe: M4 (spt-net) in progress on spt-core, pushed to dev-freeform @ bfacfb8 (CI running — confirm green first). D0+D1 done (iroh =0.98.2 endpoint, identity-bound, relay policy, mDNS). Docs pass done (ADR-0012 psyche trust boundary + KNOWN-HAZARDS 7.3/7.4 + M4-PLAN D7.5). RESUME AT D2 pairing: FIRST register 3 hazard reqs in traceable-reqs.toml (REQ-HAZARD-PAIR-TRANSCRIPT-BIND #12, REQ-HAZARD-PAIR-SEED-ROTATION #10, REQ-HAZARD-PAIR-RATE-LIMIT #11), then TOTP-SPAKE2 (ADR-0005, SPAKE2 crate selection pending). Read M4-PLAN.md (full D-task layer + red-team table) + ADR-0005/0006/0012 before starting. iroh API churns — grep registry source rather than guess. spt-net is the first async crate; D4 broker hosts tokio. Confirm with user before starting D2 if they're present.


Launching skill: self-clear


Base directory for this skill: C:\Users\decid\.claude\skills\self-clear

# /self-clear

Wipes THIS agent's conversation (`/clear`), then ~10s later TYPES a self-note
as a fresh user prompt so the agent wakes on a clean context and proceeds.

## Run it

One script does everything. Just run:

```powershell
& "C:\Users\decid\.claude\skills\self-clear\scripts\self-clear.ps1"
```

Expect: `SELF-CLEAR armed: id=<agent_id> winpid=<n> hwnd=<n> — /clear queued; self-note typed in ~10s`

Then stop — end your turn promptly so the queued `/clear` fires.

## What the script does

1. `owl whoami` → resolves this session's `agent_id` (context-independent, survives the wipe). No perch → it aborts WITHOUT clearing and tells you to `/spt:ready` or `/spt:live` first.
2. Walks the parent chain (`pwsh → claude.exe → … → WindowsTerminal`) to the ancestor that owns the window, foregrounds it.
3. Types `/clear` + Enter — **queued**; only fires when this turn ends.
4. Spawns a **detached** waker: waits 10s (past turn-end + wipe), re-foregrounds the terminal via the arm-time `hwnd`/`winpid`, then **types** `NOTE FROM THE USER: proceed with next steps.` + Enter as a fresh user prompt.

The 10s delay + detachment are deliberate: the prompt must be typed **after**
`/clear` takes effect, so it lands on the clean context and starts a new turn.

Why typed, not `owl send`: after `/clear` the session sits idle awaiting user
input. A spooled owl message can't self-start a turn — it surfaces only during an
already-active turn (PreToolUse hook) or in a live Monitor stream (whose buffer
`/clear` wipes). So a self-addressed owl note never woke the agent. A typed prompt
deterministically starts a turn AND is the re-seed.

## Caveats

- Window focus brings the whole terminal forward; it can't target a specific tab. Clean when the agent's tab is active.
- The note is typed via SendKeys, so the terminal must stay the foreground-able window of `winpid`. Don't close/replace the terminal in the ~10s gap.
- SendKeys reserves `+ ^ % ~ ( ) { } [ ]`; the default note text uses none. If you customize the note, escape those chars.
- If your turn runs longer than ~10s after the script returns, the prompt could be typed before the wipe completes. Stop promptly after running.

ARGUMENTS: Wake note for after the wipe: M4 (spt-net) in progress on spt-core, pushed to dev-freeform @ bfacfb8 (CI running — confirm green first). D0+D1 done (iroh =0.98.2 endpoint, identity-bound, relay policy, mDNS). Docs pass done (ADR-0012 psyche trust boundary + KNOWN-HAZARDS 7.3/7.4 + M4-PLAN D7.5). RESUME AT D2 pairing: FIRST register 3 hazard reqs in traceable-reqs.toml (REQ-HAZARD-PAIR-TRANSCRIPT-BIND #12, REQ-HAZARD-PAIR-SEED-ROTATION #10, REQ-HAZARD-PAIR-RATE-LIMIT #11), then TOTP-SPAKE2 (ADR-0005, SPAKE2 crate selection pending). Read M4-PLAN.md (full D-task layer + red-team table) + ADR-0005/0006/0012 before starting. iroh API churns — grep registry source rather than guess. spt-net is the first async crate; D4 broker hosts tokio. Confirm with user before starting D2 if they're present.


The script re-seeds with a fixed "proceed with next steps" note; my detailed state lives in the just-sent commune + memory (both load at SessionStart). Updating memory to match the commune (docs pass + push) BEFORE clearing, then running the script.


Edit

description: "spt-core milestone state — M4 (spt-net) in progress 2026-06-03; D0+D1 done (endpoint+identity+relay+mDNS), next = D2 pairing."

description: "spt-core milestone state — M4 (spt-net) in progress 2026-06-03; D0+D1 + psyche-outbound docs pass done, PUSHED @ bfacfb8, next = D2 pairing."


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

---
name: m4-resume-state
description: "spt-core milestone state — M4 (spt-net) in progress 2026-06-03; D0+D1 done (endpoint+identity+relay+mDNS), next = D2 pairing."
metadata:
  node_type: memory
  type: project
  originSessionId: 3a001700-4a6a-4279-b688-454943c596f6
---

**M3 COMPLETE + CI-green (2026-06-03).** M3a + M3b + M3c shipped on `dev-freeform`
(M3c = fe0acce→a14639a, CI run 26901923120). Full ADR-0004 architecture live.

**M4 (`spt-net`) STARTED 2026-06-03** (user gave explicit go). Done so far on
`dev-freeform`:
- **Plan expanded** (commit ca6522b): `M4-PLAN.md` Tasks now a full D0–D9
  breakdown with sub-tasks, requirement→task map, and a binding red-team
  obligations table (pairing #10 seed-rotation / #11 rate-limit / #12 transcript;
  instances #7 merge-clock / #8 epoch-lease / #9 dormant-budget; #6 failure-domain).
- **D0 scaffold** (c47d2c6): `crates/spt-net` created, wired into workspace, whole
  transport behind default-on `net` feature (ADR-0002).
- **D6 merge-model decision** (c49e522, docs): #7 resolved — per-node monotonic epoch
  counters + version vector; concurrent = explicit conflict (not newest-wins); unifies
  with D3b epoch-lease (#8). Final conflict-UX confirm with user at D6.
- **D1 endpoint** (3f726ed + 51981c4): `NetEndpoint` over **iroh =0.98.2 (pinned EXACT**,
  Spike #2 version). Keyed by the node's OWN spt-proto Ed25519 seed → iroh EndpointId ==
  node pubkey (address == name). `SPT_NET_ALPN = b"spt-core/net/0"`. `RelayPolicy`
  {N0Default|SelfHosted(RelayMap)|Disabled} + `RELAY_DISCLOSURE` (REQ-NET-2). `LocalDiscovery`
  {Mdns|Off} + `connect_by_id` (mDNS resolve-by-id). `NetEndpoint::iroh()` = the D4 broker
  ownership seam. REQ-NET-1 [impl,unit] + REQ-NET-2 [impl] active. 2 hermetic tests in CI
  (identity-binding, loopback echo); mDNS-by-id test `#[ignore]` (CI multicast unreliable)
  but **passes locally** (3.1s). **Key fact: spt-net is the workspace's FIRST async crate**
  (iroh+tokio, `net`-gated); rest is thread-based/sync — D4 broker must host the tokio runtime.

**NEXT = D2 pairing** (security-critical). FIRST register 3 hazard reqs in
traceable-reqs.toml (rule 3): `REQ-HAZARD-PAIR-TRANSCRIPT-BIND` (#12),
`REQ-HAZARD-PAIR-SEED-ROTATION` (#10), `REQ-HAZARD-PAIR-RATE-LIMIT` (#11). Then
TOTP-seeded SPAKE2 (ADR-0005) + full transcript binding + seed epoch/rotation +
subnet-global rate limit + trust store/TOFU + multi-subnet ceremony. See M4-PLAN.md D2
sub-tasks. Each D-task milestone-sized — expect /self-clear + commune between most.

iroh API discovery method: read the registry source at
`C:/Users/decid/.cargo/registry/src/index.crates.io-*/iroh-0.98.2/src/` (endpoint.rs,
address_lookup/) — the API churns, grep it rather than guess. Spike #2/#3 source at
`../spt-spikes/spike-02-iroh-smoke` + `spike-03-quic-survival` (proven working API).

NOT pushed (5 local commits ahead of a14639a). CI gotchas: spt_home() writes must
create_dir_all the parent; never name a bin/test/staged-update artifact
*update*/*setup*/*install*/*patch* on Windows (UAC os error 740) — see
[[windows-uac-binary-name-740]]. Cross-machine D9 E2E rig: [[cross-machine-test-rig]].

-description: "spt-core milestone state — M4 (spt-net) in progress 2026-06-03; D0+D1 done (endpoint+identity+relay+mDNS), next = D2 pairing."

+description: "spt-core milestone state — M4 (spt-net) in progress 2026-06-03; D0+D1 + psyche-outbound docs pass done, PUSHED @ bfacfb8, next = D2 pairing."


**NEXT = D2 pairing** (security-critical). FIRST register 3 hazard reqs in
traceable-reqs.toml (rule 3): `REQ-HAZARD-PAIR-TRANSCRIPT-BIND` (#12),

- **Psyche-outbound docs pass** (d4c04d6 + bfacfb8, grill-with-docs): corrected the
  psyche I/O model (I had it wrong twice; user drove it). Psyche = SANDBOXED (R/W/E only),
  CANNOT send; sole outbound = stdout **`<EVENT type="reply">`/`<EVENT type="notify">`**
  (XML envelope, NOT bracket markers), daemon-proxied (strips/re-stamps `from=`,
  reply→`__REPLY_TO__` sender / notify→own user). **Summarizer ≠ Psyche**: a separate cheap
  ephemeral model emits the `[COMMUNE]` delta fed INTO the psyche. Artifacts: **ADR-0012**
  (psyche trust boundary), CONTEXT.md (Psyche entry + new **Summarizer** term),
  **KNOWN-HAZARDS 7.3** (live-psyche driver MUST capture stdout — interim `spawn_session`
  `Stdio::null()` discards replies) + **7.4** (per-agent pulse/psyche/echo must not serialize
  across agents — future `run_pulse_loop` fan-out per-agent-threaded), new task **M4-PLAN
  D7.5** (psyche outbound relay, feeds D8). `REQ-HAZARD-PSYCHE-OUTBOUND-PROXY` +
  `REQ-HAZARD-DAEMON-SCHED-NONBLOCKING` registered, inactive (rule 5).
- **PUSHED**: 7 commits a14639a→bfacfb8 on dev-freeform; CI running (confirm green first —
  iroh adds build time; ubuntu+windows+traceability).

**NEXT = D2 pairing** (security-critical). FIRST register 3 hazard reqs in
traceable-reqs.toml (rule 3): `REQ-HAZARD-PAIR-TRANSCRIPT-BIND` (#12),


- **Psyche-outbound docs pass** (d4c04d6 + bfacfb8, grill-with-docs): corrected the
  psyche I/O model (I had it wrong twice; user drove it). Psyche = SANDBOXED (R/W/E only),
  CANNOT send; sole outbound = stdout **`<EVENT type="reply">`/`<EVENT type="notify">`**
  (XML envelope, NOT bracket markers), daemon-proxied (strips/re-stamps `from=`,
  reply→`__REPLY_TO__` sender / notify→own user). **Summarizer ≠ Psyche**: a separate cheap
  ephemeral model emits the `[COMMUNE]` delta fed INTO the psyche. Artifacts: **ADR-0012**
  (psyche trust boundary), CONTEXT.md (Psyche entry + new **Summarizer** term),
  **KNOWN-HAZARDS 7.3** (live-psyche driver MUST capture stdout — interim `spawn_session`
  `Stdio::null()` discards replies) + **7.4** (per-agent pulse/psyche/echo must not serialize
  across agents — future `run_pulse_loop` fan-out per-agent-threaded), new task **M4-PLAN
  D7.5** (psyche outbound relay, feeds D8). `REQ-HAZARD-PSYCHE-OUTBOUND-PROXY` +
  `REQ-HAZARD-DAEMON-SCHED-NONBLOCKING` registered, inactive (rule 5).
- **PUSHED**: 7 commits a14639a→bfacfb8 on dev-freeform; CI running (confirm green first —
  iroh adds build time; ubuntu+windows+traceability).

**NEXT = D2 pairing** (security-critical). FIRST register 3 hazard reqs in
traceable-reqs.toml (rule 3): `REQ-HAZARD-PAIR-TRANSCRIPT-BIND` (#12),

---
name: m4-resume-state
description: "spt-core milestone state — M4 (spt-net) in progress 2026-06-03; D0+D1 + psyche-outbound docs pass done, PUSHED @ bfacfb8, next = D2 pairing."
metadata:
  node_type: memory
  type: project
  originSessionId: 3a001700-4a6a-4279-b688-454943c596f6
---

**M3 COMPLETE + CI-green (2026-06-03).** M3a + M3b + M3c shipped on `dev-freeform`
(M3c = fe0acce→a14639a, CI run 26901923120). Full ADR-0004 architecture live.

**M4 (`spt-net`) STARTED 2026-06-03** (user gave explicit go). Done so far on
`dev-freeform`:
- **Plan expanded** (commit ca6522b): `M4-PLAN.md` Tasks now a full D0–D9
  breakdown with sub-tasks, requirement→task map, and a binding red-team
  obligations table (pairing #10 seed-rotation / #11 rate-limit / #12 transcript;
  instances #7 merge-clock / #8 epoch-lease / #9 dormant-budget; #6 failure-domain).
- **D0 scaffold** (c47d2c6): `crates/spt-net` created, wired into workspace, whole
  transport behind default-on `net` feature (ADR-0002).
- **D6 merge-model decision** (c49e522, docs): #7 resolved — per-node monotonic epoch
  counters + version vector; concurrent = explicit conflict (not newest-wins); unifies
  with D3b epoch-lease (#8). Final conflict-UX confirm with user at D6.
- **D1 endpoint** (3f726ed + 51981c4): `NetEndpoint` over **iroh =0.98.2 (pinned EXACT**,
  Spike #2 version). Keyed by the node's OWN spt-proto Ed25519 seed → iroh EndpointId ==
  node pubkey (address == name). `SPT_NET_ALPN = b"spt-core/net/0"`. `RelayPolicy`
  {N0Default|SelfHosted(RelayMap)|Disabled} + `RELAY_DISCLOSURE` (REQ-NET-2). `LocalDiscovery`
  {Mdns|Off} + `connect_by_id` (mDNS resolve-by-id). `NetEndpoint::iroh()` = the D4 broker
  ownership seam. REQ-NET-1 [impl,unit] + REQ-NET-2 [impl] active. 2 hermetic tests in CI
  (identity-binding, loopback echo); mDNS-by-id test `#[ignore]` (CI multicast unreliable)
  but **passes locally** (3.1s). **Key fact: spt-net is the workspace's FIRST async crate**
  (iroh+tokio, `net`-gated); rest is thread-based/sync — D4 broker must host the tokio runtime.

**NEXT = D2 pairing** (security-critical). FIRST register 3 hazard reqs in
traceable-reqs.toml (rule 3): `REQ-HAZARD-PAIR-TRANSCRIPT-BIND` (#12),
`REQ-HAZARD-PAIR-SEED-ROTATION` (#10), `REQ-HAZARD-PAIR-RATE-LIMIT` (#11). Then
TOTP-seeded SPAKE2 (ADR-0005) + full transcript binding + seed epoch/rotation +
subnet-global rate limit + trust store/TOFU + multi-subnet ceremony. See M4-PLAN.md D2
sub-tasks. Each D-task milestone-sized — expect /self-clear + commune between most.

iroh API discovery method: read the registry source at
`C:/Users/decid/.cargo/registry/src/index.crates.io-*/iroh-0.98.2/src/` (endpoint.rs,
address_lookup/) — the API churns, grep it rather than guess. Spike #2/#3 source at
`../spt-spikes/spike-02-iroh-smoke` + `spike-03-quic-survival` (proven working API).

NOT pushed (5 local commits ahead of a14639a). CI gotchas: spt_home() writes must
create_dir_all the parent; never name a bin/test/staged-update artifact
*update*/*setup*/*install*/*patch* on Windows (UAC os error 740) — see
[[windows-uac-binary-name-740]]. Cross-machine D9 E2E rig: [[cross-machine-test-rig]].

+- **Psyche-outbound docs pass** (d4c04d6 + bfacfb8, grill-with-docs): corrected the

+  psyche I/O model (I had it wrong twice; user drove it). Psyche = SANDBOXED (R/W/E only),

+  CANNOT send; sole outbound = stdout **`<EVENT type="reply">`/`<EVENT type="notify">`**

+  (XML envelope, NOT bracket markers), daemon-proxied (strips/re-stamps `from=`,

+  reply→`__REPLY_TO__` sender / notify→own user). **Summarizer ≠ Psyche**: a separate cheap

+  ephemeral model emits the `[COMMUNE]` delta fed INTO the psyche. Artifacts: **ADR-0012**

+  (psyche trust boundary), CONTEXT.md (Psyche entry + new **Summarizer** term),

+  **KNOWN-HAZARDS 7.3** (live-psyche driver MUST capture stdout — interim `spawn_session`

+  `Stdio::null()` discards replies) + **7.4** (per-agent pulse/psyche/echo must not serialize

+  across agents — future `run_pulse_loop` fan-out per-agent-threaded), new task **M4-PLAN

+  D7.5** (psyche outbound relay, feeds D8). `REQ-HAZARD-PSYCHE-OUTBOUND-PROXY` +

+- **PUSHED**: 7 commits a14639a→bfacfb8 on dev-freeform; CI running (confirm green first —

+  iroh adds build time; ubuntu+windows+traceability).


NOT pushed (5 local commits ahead of a14639a). CI gotchas: spt_home() writes must
create_dir_all the parent; never name a bin/test/staged-update artifact

PUSHED @ bfacfb8 (7 commits, CI running). After D2 the D-order is D3 registry → D4 broker
QUIC ownership (hosts the tokio runtime) → D5 cross-node msg/remote-drive → D6 psyche sync →
D7 update prop → **D7.5 psyche outbound relay** → D8 notif → D9 E2E. CI gotchas: spt_home()
writes must create_dir_all the parent; never name a bin/test/staged-update artifact


PUSHED @ bfacfb8 (7 commits, CI running). After D2 the D-order is D3 registry → D4 broker
QUIC ownership (hosts the tokio runtime) → D5 cross-node msg/remote-drive → D6 psyche sync →
D7 update prop → **D7.5 psyche outbound relay** → D8 notif → D9 E2E. CI gotchas: spt_home()
writes must create_dir_all the parent; never name a bin/test/staged-update artifact

---
name: m4-resume-state
description: "spt-core milestone state — M4 (spt-net) in progress 2026-06-03; D0+D1 + psyche-outbound docs pass done, PUSHED @ bfacfb8, next = D2 pairing."
metadata:
  node_type: memory
  type: project
  originSessionId: 3a001700-4a6a-4279-b688-454943c596f6
---

**M3 COMPLETE + CI-green (2026-06-03).** M3a + M3b + M3c shipped on `dev-freeform`
(M3c = fe0acce→a14639a, CI run 26901923120). Full ADR-0004 architecture live.

**M4 (`spt-net`) STARTED 2026-06-03** (user gave explicit go). Done so far on
`dev-freeform`:
- **Plan expanded** (commit ca6522b): `M4-PLAN.md` Tasks now a full D0–D9
  breakdown with sub-tasks, requirement→task map, and a binding red-team
  obligations table (pairing #10 seed-rotation / #11 rate-limit / #12 transcript;
  instances #7 merge-clock / #8 epoch-lease / #9 dormant-budget; #6 failure-domain).
- **D0 scaffold** (c47d2c6): `crates/spt-net` created, wired into workspace, whole
  transport behind default-on `net` feature (ADR-0002).
- **D6 merge-model decision** (c49e522, docs): #7 resolved — per-node monotonic epoch
  counters + version vector; concurrent = explicit conflict (not newest-wins); unifies
  with D3b epoch-lease (#8). Final conflict-UX confirm with user at D6.
- **D1 endpoint** (3f726ed + 51981c4): `NetEndpoint` over **iroh =0.98.2 (pinned EXACT**,
  Spike #2 version). Keyed by the node's OWN spt-proto Ed25519 seed → iroh EndpointId ==
  node pubkey (address == name). `SPT_NET_ALPN = b"spt-core/net/0"`. `RelayPolicy`
  {N0Default|SelfHosted(RelayMap)|Disabled} + `RELAY_DISCLOSURE` (REQ-NET-2). `LocalDiscovery`
  {Mdns|Off} + `connect_by_id` (mDNS resolve-by-id). `NetEndpoint::iroh()` = the D4 broker
  ownership seam. REQ-NET-1 [impl,unit] + REQ-NET-2 [impl] active. 2 hermetic tests in CI
  (identity-binding, loopback echo); mDNS-by-id test `#[ignore]` (CI multicast unreliable)
  but **passes locally** (3.1s). **Key fact: spt-net is the workspace's FIRST async crate**
  (iroh+tokio, `net`-gated); rest is thread-based/sync — D4 broker must host the tokio runtime.

- **Psyche-outbound docs pass** (d4c04d6 + bfacfb8, grill-with-docs): corrected the
  psyche I/O model (I had it wrong twice; user drove it). Psyche = SANDBOXED (R/W/E only),
  CANNOT send; sole outbound = stdout **`<EVENT type="reply">`/`<EVENT type="notify">`**
  (XML envelope, NOT bracket markers), daemon-proxied (strips/re-stamps `from=`,
  reply→`__REPLY_TO__` sender / notify→own user). **Summarizer ≠ Psyche**: a separate cheap
  ephemeral model emits the `[COMMUNE]` delta fed INTO the psyche. Artifacts: **ADR-0012**
  (psyche trust boundary), CONTEXT.md (Psyche entry + new **Summarizer** term),
  **KNOWN-HAZARDS 7.3** (live-psyche driver MUST capture stdout — interim `spawn_session`
  `Stdio::null()` discards replies) + **7.4** (per-agent pulse/psyche/echo must not serialize
  across agents — future `run_pulse_loop` fan-out per-agent-threaded), new task **M4-PLAN
  D7.5** (psyche outbound relay, feeds D8). `REQ-HAZARD-PSYCHE-OUTBOUND-PROXY` +
  `REQ-HAZARD-DAEMON-SCHED-NONBLOCKING` registered, inactive (rule 5).
- **PUSHED**: 7 commits a14639a→bfacfb8 on dev-freeform; CI running (confirm green first —
  iroh adds build time; ubuntu+windows+traceability).

**NEXT = D2 pairing** (security-critical). FIRST register 3 hazard reqs in
traceable-reqs.toml (rule 3): `REQ-HAZARD-PAIR-TRANSCRIPT-BIND` (#12),
`REQ-HAZARD-PAIR-SEED-ROTATION` (#10), `REQ-HAZARD-PAIR-RATE-LIMIT` (#11). Then
TOTP-seeded SPAKE2 (ADR-0005) + full transcript binding + seed epoch/rotation +
subnet-global rate limit + trust store/TOFU + multi-subnet ceremony. See M4-PLAN.md D2
sub-tasks. Each D-task milestone-sized — expect /self-clear + commune between most.

iroh API discovery method: read the registry source at
`C:/Users/decid/.cargo/registry/src/index.crates.io-*/iroh-0.98.2/src/` (endpoint.rs,
address_lookup/) — the API churns, grep it rather than guess. Spike #2/#3 source at
`../spt-spikes/spike-02-iroh-smoke` + `spike-03-quic-survival` (proven working API).

NOT pushed (5 local commits ahead of a14639a). CI gotchas: spt_home() writes must
create_dir_all the parent; never name a bin/test/staged-update artifact
*update*/*setup*/*install*/*patch* on Windows (UAC os error 740) — see
[[windows-uac-binary-name-740]]. Cross-machine D9 E2E rig: [[cross-machine-test-rig]].

-NOT pushed (5 local commits ahead of a14639a). CI gotchas: spt_home() writes must

-create_dir_all the parent; never name a bin/test/staged-update artifact

+PUSHED @ bfacfb8 (7 commits, CI running). After D2 the D-order is D3 registry → D4 broker

+QUIC ownership (hosts the tokio runtime) → D5 cross-node msg/remote-drive → D6 psyche sync →

+D7 update prop → **D7.5 psyche outbound relay** → D8 notif → D9 E2E. CI gotchas: spt_home()

+writes must create_dir_all the parent; never name a bin/test/staged-update artifact


/clear


Memory + commune aligned. Running the self-clear script now — ending turn promptly so the queued `/clear` fires.


PowerShell

Run self-clear: queue /clear + arm self-note waker


SELF-CLEAR armed: id=doyle winpid=29328 hwnd=133338 — /clear queued; self-note typed in ~10s


Done. All three steps complete:

1. **Pushed** — `a14639a..bfacfb8` → dev-freeform (7 commits, CI running).
2. **Communed** — `.claude/doyle-commune.md` written with the delta (psyche-outbound correction + docs pass + push); Self listener will ingest.
3. **Self-clear armed** — `/clear` queued, self-note types in ~10s on the clean context.

Memory + commune aligned for resume at **D2 pairing**. Ending turn now so the wipe fires.