Write

<live-context>
Session wrapping; resume next session. Two judgment calls beyond the brick-1 work you already hold:

1. **Planning-formality question resolved.** User asked whether a formal plan was ever made or coming. Answer: ROADMAP §13 deliberately chose roadmap + design docs AS the plan ("GSD too heavy"), so no formal plan was an oversight — by design. But the roadmap is milestone-granular; executing a multi-subsystem milestone like M0 needs a task layer. So I added a **just-in-time per-milestone plan** pattern: `M0-PLAN.md` now bridges roadmap (sequence) ↔ traceable-reqs (checklist). M1–M5 get their own JIT plans when reached. This is the missing granularity, kept lightweight per the project's stated stance.

2. **Spike #4 (manifest lifecycle) → DEFER to M2, don't do now.** Reasoning: #1/#2 tested novel unknowns that could force redesign of locked ADRs (ConPTY no-terminate handoff, iroh cross-NAT) — both passed. #4's mechanism is already production-proven in the sister project; the real risk is harness *independence*, which one Claude Code session can't prove (it's the incumbent). Proving independence needs a 2nd non-Claude adapter = real M2 work. Folding it into M2 (parity rebuild + early Codex-adapter check), not a throwaway now.

Reflection: de-risk phase is complete — every load-bearing unknown empirically tested, nothing falsified. We're now in the build, lowest-risk milestone first. The improvised brick-by-brick decomposition worked for a tiny brick but I flagged the risk as M0 grows; the JIT plan is the mitigation.
</live-context>
<project-context>
**spt-core — end goal:** a harness-independent Rust core for an agent ecosystem (messaging, live-agent lifecycle, terminal hosting, first-class P2P networking, runtime-manifest harness contract), shipped as 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 self-update. Clean-room rebuild of `claude_skill_owl`; first thing built atop it = the rebuilt `spt` plugin at parity.

**Status (broad):** Design + reqs settled (PRD, CONTEXT, 5 ADRs, 6 design docs, 95-req traceable-reqs registry). Stage A red-team + Stage B de-risk spikes DONE — architecture validated, none falsified. **M0 building, brick 1 landed.**

**Branch model:** now on `dev-freeform` (HEAD 905c6b4). `main` left at `4fa2949` as a baseline in case the freeform/improvised approach proves too loose. Future freeform build lives on `dev-freeform`. (If user later wants main rewound to pre-build 0dfff6a, that's an explicit force-push — not done.)

**Immediate next steps (resume here):** execute **M0-PLAN.md T2 — EVENT envelope grammar/framing** (compose/parse `<EVENT attrs>body</EVENT>`, copy-verbatim from sister `poll.rs` compose sites + the `parse_event_from_attr` already ported). Then T3 EVENT-PART chunker (register new hazard REQ-HAZARD-EVENTPART-REASSEMBLY first), T4 endpoint types, T5 Ed25519 identity (**clean-room — sister has no crypto**), T6 wire-version, T7 payloads; then `spt-store` (T8 atomic-write → T9 spool → T10 perch layout → T11 registry → T12 info.json); T13 CI gate, T14 activation sweep. Tag evidence + activate reqs + green `check` per task.

**Infra available:** cross-machine test rig — `enlyzeam` (2nd Tailscale host, ssh key access `decid@enlyzeam`, Windows), binary `iroh-smoke.exe` left there. Gotcha for native NAT tests: take Tailscale DOWN on the client so iroh hole-punches the public IP instead of riding the overlay (confirmed working, ~13ms direct). Saved as a memory.

**Spike #2 headline (for the record):** native iroh NAT traversal between two separate home networks PASSED — relay connect then hole-punch to public IP, graceful relay fallback. ADR-0002's load-bearing networking question answered YES.

**Open decisions still owned by user (M3/M4, not gating M0):** context-merge model (vector-clock vs CRDT), seed epoch/rotation protocol, whether to reword locked PRD R-UPD-3 to scope no-terminate to brain-only.
</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>
Session wrapping; resume next session. Two judgment calls beyond the brick-1 work you already hold:

1. **Planning-formality question resolved.** User asked whether a formal plan was ever made or coming. Answer: ROADMAP §13 deliberately chose roadmap + design docs AS the plan ("GSD too heavy"), so no formal plan was an oversight — by design. But the roadmap is milestone-granular; executing a multi-subsystem milestone like M0 needs a task layer. So I added a **just-in-time per-milestone plan** pattern: `M0-PLAN.md` now bridges roadmap (sequence) ↔ traceable-reqs (checklist). M1–M5 get their own JIT plans when reached. This is the missing granularity, kept lightweight per the project's stated stance.

2. **Spike #4 (manifest lifecycle) → DEFER to M2, don't do now.** Reasoning: #1/#2 tested novel unknowns that could force redesign of locked ADRs (ConPTY no-terminate handoff, iroh cross-NAT) — both passed. #4's mechanism is already production-proven in the sister project; the real risk is harness *independence*, which one Claude Code session can't prove (it's the incumbent). Proving independence needs a 2nd non-Claude adapter = real M2 work. Folding it into M2 (parity rebuild + early Codex-adapter check), not a throwaway now.

Reflection: de-risk phase is complete — every load-bearing unknown empirically tested, nothing falsified. We're now in the build, lowest-risk milestone first. The improvised brick-by-brick decomposition worked for a tiny brick but I flagged the risk as M0 grows; the JIT plan is the mitigation.
</live-context>
<project-context>
**spt-core — end goal:** a harness-independent Rust core for an agent ecosystem (messaging, live-agent lifecycle, terminal hosting, first-class P2P networking, runtime-manifest harness contract), shipped as 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 self-update. Clean-room rebuild of `claude_skill_owl`; first thing built atop it = the rebuilt `spt` plugin at parity.

**Status (broad):** Design + reqs settled (PRD, CONTEXT, 5 ADRs, 6 design docs, 95-req traceable-reqs registry). Stage A red-team + Stage B de-risk spikes DONE — architecture validated, none falsified. **M0 building, brick 1 landed.**

**Branch model:** now on `dev-freeform` (HEAD 905c6b4). `main` left at `4fa2949` as a baseline in case the freeform/improvised approach proves too loose. Future freeform build lives on `dev-freeform`. (If user later wants main rewound to pre-build 0dfff6a, that's an explicit force-push — not done.)

**Immediate next steps (resume here):** execute **M0-PLAN.md T2 — EVENT envelope grammar/framing** (compose/parse `<EVENT attrs>body</EVENT>`, copy-verbatim from sister `poll.rs` compose sites + the `parse_event_from_attr` already ported). Then T3 EVENT-PART chunker (register new hazard REQ-HAZARD-EVENTPART-REASSEMBLY first), T4 endpoint types, T5 Ed25519 identity (**clean-room — sister has no crypto**), T6 wire-version, T7 payloads; then `spt-store` (T8 atomic-write → T9 spool → T10 perch layout → T11 registry → T12 info.json); T13 CI gate, T14 activation sweep. Tag evidence + activate reqs + green `check` per task.

**Infra available:** cross-machine test rig — `enlyzeam` (2nd Tailscale host, ssh key access `decid@enlyzeam`, Windows), binary `iroh-smoke.exe` left there. Gotcha for native NAT tests: take Tailscale DOWN on the client so iroh hole-punches the public IP instead of riding the overlay (confirmed working, ~13ms direct). Saved as a memory.

**Spike #2 headline (for the record):** native iroh NAT traversal between two separate home networks PASSED — relay connect then hole-punch to public IP, graceful relay fallback. ADR-0002's load-bearing networking question answered YES.

**Open decisions still owned by user (M3/M4, not gating M0):** context-merge model (vector-clock vs CRDT), seed epoch/rotation protocol, whether to reword locked PRD R-UPD-3 to scope no-terminate to brain-only.
</project-context>


Commune written → `.claude/doyle-commune.md`. Self listener will pick it up, Psyche ingests, file auto-deletes on success.

Captured delta (beyond what Psyche already held):
- **End goal + broad status** — harness-independent agent-ecosystem core; design/reqs settled, Stage A + spikes done, M0 building (brick 1 in).
- **Immediate next steps** — execute M0-PLAN T2 (EVENT framing) → T3 chunker → … → `spt-store`; tag+activate+green-check per task.
- **Branch model** — on `dev-freeform`; `main` = baseline at `4fa2949`.
- **Spike #4 → deferred to M2** (independence needs a 2nd adapter).
- **Planning resolution** — roadmap+design = the plan by design; M0-PLAN adds the JIT task layer.
- **Test rig** — enlyzeam ssh + Tailscale-down hole-punch gotcha.
- **Open user-owned decisions** carried forward (M3/M4).

Clean checkpoint. Resume next session at **T2 — EVENT envelope framing**. 🦉


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