---
name: 260520-r2f-RESEARCH
type: quick-research
status: complete
created: 2026-05-20
---

# Research: Fresh-init first-commune flow + stale commune refs

## Question

The live SKILL.md fresh-init instructions tell the orchestrator to deliver the augmented summary as the first commune via `$OWL deliver <id> <<'EOF'...EOF` (or `$LIVE commune <id>` from Self's session). Are either of these the modern canonical commune path?

## Findings

### Canonical commune path (per `plugin/spt/skills/commune/SKILL.md`)

The skill is explicit (lines 25–36):

> **Commune only the delta** — use the **Write tool** to create `.claude/{your-id}-commune.md` with the delta body as its contents. 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.

The Self listener polls for the file, notifies the Psyche wrapper, and the wrapper consumes it via `$LIVE commune` internally (which composes the v1.8 EVENT envelope). Last-write-wins on overwrite; file is retained on subprocess error and retried.

### Why `$OWL deliver` is wrong for commune

`$OWL deliver` is plain owl-to-owl messaging. It bypasses the commune EVENT envelope entirely — no `type="commune"` typed envelope, no 5-field stamp (`machine`, `project`, `branch`, `head_sha`, `head_subject`). Whatever lands at the Psyche perch via `$OWL deliver` is treated as a generic owl message, not a commune. The Psyche wrapper's commune consume path never fires.

### Why `$LIVE commune` CLI is non-canonical (but still works)

The CLI still exists (`src/live/commune.rs`, `src/live/mod.rs:47`) — it composes the EVENT envelope correctly. But the skill explicitly forbids Bash/heredoc for communes ("Do not use Bash/heredoc — Write is the canonical path"). The CLI is essentially internal: the Psyche wrapper itself invokes the same machinery when consuming a written file.

### Fresh-init wrinkle

At fresh-init time, the orchestrator (the Claude Code session running `/spt:live`) is the writer, not Self. The path `.claude/{id}-commune.md` is keyed by Self's id, not the writer's identity — Self's poll loop picks it up as soon as the listener is running. So the flow is:

1. Append user free-text to synthesized summary.
2. `$LIVE start <id>` (spawns Self + Psyche wrapper).
3. Use Write tool to create `.claude/{id}-commune.md` with augmented summary body.
4. Self's next poll detects file → notifies Psyche wrapper → wrapper composes EVENT and ingests.

No race: the Write can happen any time after start; if Self hasn't polled yet, it picks it up on first iteration.

## Other stale references found

Grep for `\$LIVE commune` and `\$OWL deliver` in instructional surfaces (skills + src/owl/resume.rs context strings, excluding implementation comments):

| File | Line | Problem |
|------|------|---------|
| `plugin/spt/skills/live/SKILL.md` | 220 | Tells orchestrator to use `$OWL deliver` or `$LIVE commune` for first commune. Primary bug. |
| `src/owl/resume.rs` | 59 | Live-agent resume hint: "`$LIVE commune {} <message>` — update your Psyche" |
| `src/owl/resume.rs` | 107 | Active live-Self perch context: "Send context updates: `$LIVE commune {} <message>`" |

Out of scope (leave alone):

- `src/live/commune.rs:2` — implementation comment for the CLI subcommand itself.
- `src/live/mod.rs:47` — usage hint emitted when the CLI is called wrong; the CLI still works.
- `psyche.md:42` — tells Psyche not to use `$OWL deliver` for outbound; orthogonal.
- All other `$OWL deliver` refs — those are correct general owl messaging guidance.

## Recommended fix

1. Rewrite `plugin/spt/skills/live/SKILL.md:220` to point at the Write-to-`.claude/{id}-commune.md` flow.
2. Rewrite both `src/owl/resume.rs` commune hints to direct Self to `/spt:commune` (the skill that owns the canonical flow) instead of repeating a stale CLI invocation.

Resume context should defer to the skill rather than enumerate a CLI command that contradicts it.
