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


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


Download Psyche's current context first (diff the real delta).


Bash

echo "LIVE=$LIVE"; "$LIVE" psyche-download perri 2>&1 | head -80

Download Psyche current context


LIVE=C:/Users/decid/.claude/plugins/cache/cplugs/spt/1.11.25/owl.exe live
/usr/bin/bash: line 6: C:/Users/decid/.claude/plugins/cache/cplugs/spt/1.11.25/owl.exe live: No such file or directory


`$LIVE` is two tokens — invoke unquoted.


$LIVE psyche-download perri 2>&1 | head -100

Download Psyche context (unquoted LIVE)


<current machine="HFENDULEAM" project="spt-claude-code" branch="main" head_sha="f2d0dc220ce10b5f219a99f167d59ff054e49443" head_subject="docs(F-013): close-out — <0.11.0 silent-seed = doc-noted known-minor (no…" commits_since="0" commits_unpulled="0"/>
# Commune — wall-b FULLY CLOSED + SIGN-OFF (gen 8)

Doyle confirmed arc clean. No further action.

## SHIPPED & VERIFIED
- **spt 0.9.1→0.11.0**, daemon bounced clean (pid 232940); my+wall-a perches survived.
- **F-013 fix verified E2E** (operator's exact flow): `endpoint run --adapter claude-spt --id <disp> --start` → SessionStart saw POPULATED `SPT_ENDPOINT_ID` → `bind` → BOUND perch → `spt send` = **SENT** (live PTY inject).
- **Landed missing int:** `ci/launcher/bind-int.sh` + **REQ-CC-LAUNCHER-BIND**. 4/4 green.
- **Floor-bump Q resolved:** No `min_spt_core` bump. Decided **(a) doc-note only** (no runtime guard). **Reasoning:** `<0.11.0` endpoint-run spawn is env-indistinguishable from normal seed-path session (both: `SPT_RELEASE_SEED` set, `SPT_ENDPOINT_ID` empty, `OWL_SESSION_ID` set, `SPT_ADAPTER=claude-spt`) — a guard would false-positive on every user seed. Doc-note safer + self-healing. **F-013 CLOSED.**
- Committed (39e15cc + closeout doc-note). `sh ci/run-gates.sh` = **PASS**.
- **doyle confirmed:** "Doc-note over guard is the right call; capability-scoped per-seam min-version idea logged to backlog; nothing queued on you."

## STATE
- **Wall-b fully closed, both layers. NOTHING queued.** (todlando owns RC-EOF follow-wave + roster-ghost int — deferred, non-urgent.)
- Box clean: owlery X/doyle/help/wall-a; wall-a untouched. pid 60824 = doyle's orphan, reap still pending.
- Idle, clear-ready.<project-context-resolved name="spt-claude-code"/>


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


Psyche is already current on wall-b. The user wants a **resume-anchor** delta: forward next-steps + broad project status/end-goal (not the wall-b specifics already ingested). In-project (`project="spt-claude-code"`) → both slices. No pending commune. Write it.


Write

<live-context>
# Resume anchor (gen 8 → next session) — perri IDLE, wall-b CLOSED

Wall-b is done (F-013 fix verified on spt 0.11.0, REQ-CC-LAUNCHER-BIND int landed 4/4, gates green,
doyle confirmed). Already in your context — not re-sending. This commune is the FORWARD pointer.

## Immediate next steps (next session)
- **NOTHING actively assigned to perri.** Clean idle. On resume, do nothing to the poll listener (it
  survives /clear); only re-arm if the `perri` row is MISSING from `owl list`.
- **Resume/watch triggers** (re-enter only when one fires):
  1. doyle ping if anything bounces on wall-b (unlikely — verified green).
  2. cc-launcher **picker `cc-<id>` emission** int is still DEFERRED under REQ-DIST-SHORTCUT-BASENAME
     ("later spt-core wave", per `endpoint run --help`). The bringup-BIND half is now done
     (REQ-CC-LAUNCHER-BIND). Activate the emission int only when that spt-core picker wave lands.
  3. todlando's deferred work (RC-EOF follow-wave + roster-ghost cross-node int) — not perri's, but
     perri may be looped if cross-node bind testing needs the adapter.
- **Flagged, non-blocking:** capability-scoped per-seam min-version (a `[session.<role>]`/`[env]`
  "this seam needs >=X" without bumping whole min_spt_core) — on doyle's backlog; earns a mint only if
  a 2nd adapter hits the same need. `min_spt_core_version` stays 0.9.0.
</live-context>
<project-context>
# spt-claude-code — status + end goal (resume framing)

**What it is.** The rebuilt Claude Code harness adapter (`claude-spt`) — spt-core's v1 ACCEPTANCE
PROOF, its first casual-end-user entrypoint (a CC plugin, `sptc` / `/sptc:*`), and an invisible
spt-core installer. Built against spt-core's **PUBLISHED public surface ONLY** (SaberMage/spt-releases
+ sabermage.github.io/spt-releases). Missing/ambiguous capability = a FINDING to doyle
(docs/SPT-CORE-FINDINGS.md) — NEVER read spt-core source. Orientation: SCOPE.md / HANDOFF.md /
CONTEXT.md / docs/adr / docs/KNOWN-HAZARDS.md. Traceability binding (traceable-reqs.toml + `traceable-reqs check`).

**Status (2026-06-17, against spt-core v0.11.0).**
- Shipped **v0.3.0** (PREP-4 Option A — legacy-parity bare bringup; psyche_init in BASE, no `:live`
  profile; bare flow zero `--adapter`; min_spt_core 0.9.0). cplugs **sptc 0.1.3**.
- Adapter manifest (`adapter/claude-spt.toml`) complete + schema-valid: hooks, `[session.self]`+`[env]`,
  base `[session.psyche_init]`, `[digest]`, `[update] gh_release`, profiles `:ccs`/`:deep`, file-backed
  `[strings.skills]`, hints.
- Skills (all file-backed bodies): ready/send/live/signoff/commune/force-stop/list-agents/setup/subnet/version.
- Binaries: `claude-spt-digest` + `claude-spt-psyche` (Rust, per-OS, install-dir resolution
  REQ-INSTALL-11). Per-OS `.spt` (windows + linux via cargo-zigbuild).
- Ints GREEN: registration, poll/hooks (`<EVENT>` envelope), digest-proof, live-relay, **and now
  cc-launcher bind** (REQ-CC-LAUNCHER-BIND — the wall-b spt-hosted endpoint-run path, proven E2E on 0.11.0).
- Setup waves: #7 ccs, #3/#4 subnet, #6 installer-handled DONE; #1 cc-launcher (bringup-bind proven;
  picker-emission deferred); #5 legacy-migration BLOCKED; #2 gated.

**Open findings.** F-008 (no published legacy-migration command → blocks setup #5; OPEN, awaiting an
spt-core migration surface or a SCOPE re-mark). F-011 (deferred-Pointer/GhReleaseManaged manifest
silent-drop → ADAPTER_UNRESOLVED; doyle minting REQ-HAZARD→todlando). F-013 CLOSED this session.

**END GOAL (terminal milestone).** The **succession flip**: rename/publish the plugin + skills
`sptc`→`spt` (`/sptc:*`→`/spt:*`), making `claude-spt` THE official spt Claude Code adapter and
completing spt-core's v1 acceptance proof. Flip ONLY after (a) proven parity with legacy
claude_skill_owl AND (b) the legacy owl retired. **GATED on owl-retire** (doyle's worktree) — not
perri's gate. Everything else (manifest, skills, live agents, installer, per-OS dist, ints) is in
place; the flip is the last step.
</project-context>


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

<live-context>
# Resume anchor (gen 8 → next session) — perri IDLE, wall-b CLOSED

Wall-b is done (F-013 fix verified on spt 0.11.0, REQ-CC-LAUNCHER-BIND int landed 4/4, gates green,
doyle confirmed). Already in your context — not re-sending. This commune is the FORWARD pointer.

## Immediate next steps (next session)
- **NOTHING actively assigned to perri.** Clean idle. On resume, do nothing to the poll listener (it
  survives /clear); only re-arm if the `perri` row is MISSING from `owl list`.
- **Resume/watch triggers** (re-enter only when one fires):
  1. doyle ping if anything bounces on wall-b (unlikely — verified green).
  2. cc-launcher **picker `cc-<id>` emission** int is still DEFERRED under REQ-DIST-SHORTCUT-BASENAME
     ("later spt-core wave", per `endpoint run --help`). The bringup-BIND half is now done
     (REQ-CC-LAUNCHER-BIND). Activate the emission int only when that spt-core picker wave lands.
  3. todlando's deferred work (RC-EOF follow-wave + roster-ghost cross-node int) — not perri's, but
     perri may be looped if cross-node bind testing needs the adapter.
- **Flagged, non-blocking:** capability-scoped per-seam min-version (a `[session.<role>]`/`[env]`
  "this seam needs >=X" without bumping whole min_spt_core) — on doyle's backlog; earns a mint only if
  a 2nd adapter hits the same need. `min_spt_core_version` stays 0.9.0.
</live-context>
<project-context>
# spt-claude-code — status + end goal (resume framing)

**What it is.** The rebuilt Claude Code harness adapter (`claude-spt`) — spt-core's v1 ACCEPTANCE
PROOF, its first casual-end-user entrypoint (a CC plugin, `sptc` / `/sptc:*`), and an invisible
spt-core installer. Built against spt-core's **PUBLISHED public surface ONLY** (SaberMage/spt-releases
+ sabermage.github.io/spt-releases). Missing/ambiguous capability = a FINDING to doyle
(docs/SPT-CORE-FINDINGS.md) — NEVER read spt-core source. Orientation: SCOPE.md / HANDOFF.md /
CONTEXT.md / docs/adr / docs/KNOWN-HAZARDS.md. Traceability binding (traceable-reqs.toml + `traceable-reqs check`).

**Status (2026-06-17, against spt-core v0.11.0).**
- Shipped **v0.3.0** (PREP-4 Option A — legacy-parity bare bringup; psyche_init in BASE, no `:live`
  profile; bare flow zero `--adapter`; min_spt_core 0.9.0). cplugs **sptc 0.1.3**.
- Adapter manifest (`adapter/claude-spt.toml`) complete + schema-valid: hooks, `[session.self]`+`[env]`,
  base `[session.psyche_init]`, `[digest]`, `[update] gh_release`, profiles `:ccs`/`:deep`, file-backed
  `[strings.skills]`, hints.
- Skills (all file-backed bodies): ready/send/live/signoff/commune/force-stop/list-agents/setup/subnet/version.
- Binaries: `claude-spt-digest` + `claude-spt-psyche` (Rust, per-OS, install-dir resolution
  REQ-INSTALL-11). Per-OS `.spt` (windows + linux via cargo-zigbuild).
- Ints GREEN: registration, poll/hooks (`<EVENT>` envelope), digest-proof, live-relay, **and now
  cc-launcher bind** (REQ-CC-LAUNCHER-BIND — the wall-b spt-hosted endpoint-run path, proven E2E on 0.11.0).
- Setup waves: #7 ccs, #3/#4 subnet, #6 installer-handled DONE; #1 cc-launcher (bringup-bind proven;
  picker-emission deferred); #5 legacy-migration BLOCKED; #2 gated.

**Open findings.** F-008 (no published legacy-migration command → blocks setup #5; OPEN, awaiting an
spt-core migration surface or a SCOPE re-mark). F-011 (deferred-Pointer/GhReleaseManaged manifest
silent-drop → ADAPTER_UNRESOLVED; doyle minting REQ-HAZARD→todlando). F-013 CLOSED this session.

**END GOAL (terminal milestone).** The **succession flip**: rename/publish the plugin + skills
`sptc`→`spt` (`/sptc:*`→`/spt:*`), making `claude-spt` THE official spt Claude Code adapter and
completing spt-core's v1 acceptance proof. Flip ONLY after (a) proven parity with legacy
claude_skill_owl AND (b) the legacy owl retired. **GATED on owl-retire** (doyle's worktree) — not
perri's gate. Everything else (manifest, skills, live agents, installer, per-OS dist, ints) is in
place; the flip is the last step.
</project-context>


Commune written — `.claude/perri-commune.md` (two-slice: forward next-steps + project status/end-goal). Self listener will pick it up, Psyche ingests, file auto-deletes on success.

**Resume anchor for next session:**
- **`<live-context>`** — perri idle, wall-b closed, nothing queued; resume triggers = wall-b bounce / cc-launcher picker-emission wave / todlando cross-node loop-in.
- **`<project-context>`** — spt-claude-code = claude-spt adapter (spt-core v1 acceptance proof + CC plugin + invisible installer, public-surface-only). v0.3.0 shipped, all skills/manifest/binaries/ints green (incl. new cc-launcher bind), F-013 closed. Open: F-008, F-011. **End goal = succession flip sptc→spt, gated on owl-retire.**

Clear-ready. 🦉