---
phase: 25.1-revise-commune-signoff-skill-docs-echo-commune-instruction-t
plan: 04
subsystem: skill-doc
tags: [skill-doc, signoff, two-slice, phase-25-d-10-d-11, doc-only]

# Dependency graph
requires:
  - phase: 25.1
    plan: 01
    provides: "framework-emitted <project-context-resolved name=\"...\"/> sentinel in psyche-download output (deterministic grep target)"
  - phase: 25.1
    plan: 02
    provides: "Self-authoring teaching pattern in commune/SKILL.md with canonical anchor `## Two-slice body shape (Phase 25 D-10/D-11)` (cross-link target)"
  - phase: 25
    provides: "D-10/D-11 two-slice envelope taxonomy in psyche.md §<output_envelope> (lines 282-323)"
  - phase: 23
    provides: "outer <EVENT type=\"init_signoff\"> envelope shape with 5-field stamp; Self never authors EVENT tags"
provides:
  - "Self-side two-slice envelope authoring contract for /spt:signoff FINAL-COMMUNE body"
  - "Empty-body plain-signoff path preserved as distinct from two-slice contract"
  - "Phase 23 ⊃ Phase 25 nesting clarity for INIT_SIGNOFF EVENT envelope wrapping the two-slice body"
  - "Cross-link to /spt:commune for the full teaching with worked examples (no duplication)"
affects:
  - 25.1-05
  - 25.1-06

# Tech tracking
tech-stack:
  added: []
  patterns:
    - "Cross-link to canonical authoring surface (/spt:commune) rather than duplicating taxonomy"
    - "Decision-cite-in-header convention preserved (`## Two-slice body shape (Phase 25 D-10/D-11)`)"
    - "Explicit empty-body carve-out for plain-signoff path (negative case for two-slice contract)"

key-files:
  created:
    - .planning/phases/25.1-revise-commune-signoff-skill-docs-echo-commune-instruction-t/25.1-04-SUMMARY.md
  modified:
    - plugin/spt/skills/signoff/SKILL.md

key-decisions:
  - "Cross-link to /spt:commune for full teaching rather than duplicating the three worked examples — keeps signoff/SKILL.md concise per RESEARCH §Touchpoint 3 (\"the full teaching lives in /commune\") and prevents drift between two surfaces."
  - "Plain-signoff (empty-body) carve-out rendered as the third bullet of the new section rather than a separate sub-header — keeps the contract surface visually unified while flagging the empty-string exception loudly."
  - "Phase 23 nesting note appended as a new paragraph after the existing closing line (\"For drift detection on resume...\") rather than spliced into it — preserves the existing sentence-flow + drift-detection reference verbatim."
  - "Detection rule prose says `grep the output for the marker <project-context-resolved` (no closing > or quote) — substring-presence is the contract, not exact-tag-match. Consistent with Plan 02 and Plan 03 phrasing for the same gate."

patterns-established:
  - "When a sibling authoring-surface skill doc already carries the full teaching (commune/SKILL.md), a related surface (signoff/SKILL.md) cross-links rather than duplicates — preserves single-source-of-truth across two surfaces that share a contract."

requirements-completed: []

# Metrics
duration: ~1min
completed: 2026-05-22
---

# Phase 25.1 Plan 04: signoff/SKILL.md Two-Slice Teaching Summary

**`plugin/spt/skills/signoff/SKILL.md` now teaches the Phase 25 D-10/D-11 two-slice envelope contract on the FINAL-COMMUNE body, preserving the empty-body plain-signoff path as a distinct (non-two-slice) case, cross-linking `/spt:commune` for the full teaching with three worked examples, and adding a one-sentence Phase 23 ⊃ Phase 25 nesting note to the INIT_SIGNOFF envelope section.**

## Performance

- **Duration:** ~1 min
- **Started:** 2026-05-22T07:32:38Z
- **Completed:** 2026-05-22T07:35:00Z (approx)
- **Tasks:** 1 (single coordinated three-edit task)
- **Files modified:** 1 (`plugin/spt/skills/signoff/SKILL.md`)

## Accomplishments

### Three coordinated edits to `plugin/spt/skills/signoff/SKILL.md`

| Edit | Section | Type | Lines (before → after) |
|------|---------|------|------------------------|
| 1 | `## Flow` Step 3 "Signoff with a FINAL COMMUNE body" sub-bullet | reword (3 lines → 5 lines; cross-link to new section + /spt:commune) | old lines 31–33 → new lines 32–36 |
| 2 | NEW `## Two-slice body shape (Phase 25 D-10/D-11)` section | INSERT between Step 3 offline-path block and `**Signoff vs Stop:**` block | new lines 53–63 (11 new lines including blank lines) |
| 3 | `## Envelope shape (Phase 23 v1.8)` closing | append one-paragraph nesting note after existing closing line | new lines 84–85 (2 new lines after existing line 83) |

### Diff summary

- **File line count:** 72 → 85 (+13 lines net; +16 insertions / -2 deletions per `git show --stat`).
- **Preserved verbatim:** Frontmatter lines 1–8, `# /spt:signoff` H1 + intro (lines 10–14), Step 1 + Step 2 of `## Flow` (lines 18–23), Step 3 outer prose + **Plain signoff** sub-bullet (lines 25–30), Step 3 closing prose blocks (lines 37–41), **Offline path** block (lines 43–51), **Signoff vs Stop** block (lines 65–67), `## Envelope shape (Phase 23 v1.8)` section content lines 69–83 (existing prose + both INIT_SIGNOFF XML examples).

### Acceptance-criteria grep gates — all PASS

| Gate | Expected | Actual | Status |
|------|----------|--------|--------|
| `grep -c '<live-context>' plugin/spt/skills/signoff/SKILL.md` | ≥ 1 | **2** | PASS (two-slice section routing rules) |
| `grep -ic 'two-slice' plugin/spt/skills/signoff/SKILL.md` | ≥ 2 | **6** | PASS (Step 3 reword + new section header + 4 cross-refs across section + Phase 23 nesting note) |
| `grep -c '/spt:commune' plugin/spt/skills/signoff/SKILL.md` | ≥ 1 | **2** | PASS (Step 3 reword cross-link + new section closing cross-link) |
| `grep -c '<EVENT type="init_signoff"' plugin/spt/skills/signoff/SKILL.md` | ≥ 2 | **2** | PASS (both existing Phase 23 INIT_SIGNOFF examples preserved on lines 73 and 79) |
| `grep -E 'untagged\|auto-classify\|safety net\|will figure it out\|if you forget' plugin/spt/skills/signoff/SKILL.md` | 0 hits | **0** | PASS (D-25.1-07 silence rule honored) |
| `grep -c 'Phase 25 D-10' plugin/spt/skills/signoff/SKILL.md` | ≥ 1 | **5** | PASS (new section header + Step 3 forward-ref + closing cross-link + Phase 23 nesting note + one other cross-ref) |

### Preserved-section grep gates — all PASS

| Section | grep count | Status |
|---------|-----------|--------|
| `## Envelope shape (Phase 23 v1.8)` | 1 | preserved |
| `**Plain signoff**` (empty-body sub-bullet) | 2 | preserved (1 in Step 3 + 1 in new section explicit carve-out) |
| `**Signoff vs Stop:**` | 1 | preserved |
| `Offline path` | 1 | preserved |

## Task Commits

1. **Task 1 — Three coordinated edits to signoff/SKILL.md** — `38fd18e` (docs)

## Files Created/Modified

- `plugin/spt/skills/signoff/SKILL.md` — grew from 72 to 85 lines (+16 insertions, -2 deletions).
- `.planning/phases/25.1-revise-commune-signoff-skill-docs-echo-commune-instruction-t/25.1-04-SUMMARY.md` — this file.

## The new `## Two-slice body shape (Phase 25 D-10/D-11)` section — verbatim

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

When the FINAL-COMMUNE body is non-empty (the second sub-bullet of Step 3 above), it follows the same Phase 25 D-10/D-11 two-slice envelope contract as a regular commune body:

- **In a tracked project** (detected via `<project-context-resolved` marker in `$LIVE psyche-download` output): emit `<live-context>...</live-context>` plus either `<project-context>...</project-context>` (with content) or `<project-context></project-context>` (empty body — "in-project but quiet" signal per D-25.1-02).
- **Outside any tracked project** (no marker in psyche-download output): emit ONLY `<live-context>...</live-context>`. Do NOT emit an empty `<project-context>` envelope.
- **Plain signoff** (empty file body, first sub-bullet of Step 3): the two-slice contract does NOT apply — the file is literally empty.

See `/spt:commune` → `## Two-slice body shape (Phase 25 D-10/D-11)` for the full teaching with three worked examples. See `psyche.md` §`<output_envelope>` for the canonical per-slice content taxonomy.
```

## Phase 23 nesting note — verbatim

Appended after the existing closing line ("For drift detection on resume, see the `live` skill."):

```markdown
The `body` placeholder in the INIT_SIGNOFF examples above (when a FINAL COMMUNE is present) is the two-slice body — see `## Two-slice body shape (Phase 25 D-10/D-11)` above; the Phase 23 EVENT envelope and the Phase 25 two-slice body nest, with EVENT wrapping the two-slice body. `$LIVE signoff` composes the EVENT envelope automatically — you NEVER write `<EVENT>` tags.
```

## Decisions Made

- **Cross-link to /spt:commune for full teaching rather than duplicating the three worked examples** — the section is intentionally short (RESEARCH §"Touchpoint 3 — landing spots: 2–4 sentences + one cross-link"). Three worked examples live canonically in `commune.md` (Plan 03's surface). Drift hazard eliminated by linking, not duplicating.
- **Plain-signoff (empty-body) carve-out rendered as the third bullet of the new section** — keeps the contract surface visually unified while flagging the empty-string exception loudly. Acceptance gate `grep '**Plain signoff**' = 2` verifies BOTH the Step 3 sub-bullet AND the new-section explicit carve-out survive.
- **Phase 23 nesting note appended as a new paragraph** (NOT spliced into the existing closing sentence) — preserves the existing `For drift detection on resume, see the live skill.` reference verbatim and keeps the new clause cleanly separated as a Phase 23 ⊃ Phase 25 nesting bridge.
- **Detection rule prose uses substring-presence not exact-tag-match** — Self greps for `<project-context-resolved` (no closing `>` / `/>` / `"`); robust to future attribute additions. Consistent with Plan 02 and Plan 03 phrasing.

## Deviations from Plan

**None — plan executed exactly as written.** All six acceptance-criteria grep gates PASS; all four preserved-section gates PASS; all negative gates (other files NOT modified) empty.

### Negative-gate confirmations

- `plugin/spt/skills/listen/SKILL.md` — NOT modified (empty `git diff HEAD` confirmed).
- `plugin/spt/skills/commune/SKILL.md` — NOT modified in this plan (Plan 02's surface; empty `git diff HEAD` confirmed).
- `plugin/spt/skills/commune/commune.md` — NOT modified in this plan (Plan 03's surface; empty `git diff HEAD` confirmed).
- `psyche.md` — NOT modified (empty `git diff HEAD` confirmed).
- `src/owl/resume.rs` — NOT modified (empty `git diff HEAD` confirmed; per SD-2).
- Only file modified by this plan: `plugin/spt/skills/signoff/SKILL.md`. (Working-tree noise on `.gitignore`, `.planning/config.json`, `Cargo.lock` is pre-existing from earlier sessions — none of those files were staged or touched by this plan.)

### INIT_SIGNOFF EVENT examples preservation

Both XML examples in the `## Envelope shape (Phase 23 v1.8)` section are preserved verbatim:

1. **Plain INIT_SIGNOFF example** (line 73, original line 62): `<EVENT type="init_signoff" timestamp="..." machine="..." project="..." branch="..." head_sha="..." head_subject="...">Signoff initiated by Self...</EVENT>`
2. **INIT_SIGNOFF with FINAL COMMUNE example** (line 79, original line 68): `<EVENT type="init_signoff" timestamp="..." ...>FINAL COMMUNE: ...body... | Signoff initiated by Self...</EVENT>`

The two-slice body shape was intentionally NOT inlined into either example — per the plan's explicit "Do NOT add the two-slice body inside the INIT_SIGNOFF EVENT example on line 68 — that would compound Phase 23 / Phase 25 nesting confusion (RESEARCH risks)" and threat T-25.1-04-02 mitigation. The new appended paragraph after line 71 is the prose bridge between the two envelope layers.

## Issues Encountered

None.

## Next Phase Readiness

- **Wave 2 plans 05–06 unblocked.** This plan completes the Self-authoring-side two-slice teaching across both `/commune` AND `/signoff` surfaces:
  - `25.1-05` (live/SKILL.md echo-commune description) can now describe the two-slice body shape on the receive side, knowing both authoring surfaces are already taught.
  - `25.1-06` (revive/SKILL.md or resume.rs prose) can cross-link to `/spt:commune` for the canonical authoring teaching, and incidentally to `/spt:signoff` for the FINAL-COMMUNE authoring path.
- **No deploy needed for this plan.** Doc-only edit to `plugin/spt/skills/signoff/SKILL.md`; the milestone deploy cadence (per STATE.md and ROADMAP.md) is end-of-milestone via `DEPLOY.ps1`, batching all Wave 2 skill-doc edits in a single bump.
- **Backward compat:** Skill doc reads on next Claude Code session refresh; older live agents booted before the doc update continue to author whatever shape they were taught — Psyche LLM's untagged-fallback path (D-25.1-07, silent) catches them.

## Self-Check: PASSED

Verification ran:

- `[ -f plugin/spt/skills/signoff/SKILL.md ]` → FOUND
- `[ -f .planning/phases/25.1-revise-commune-signoff-skill-docs-echo-commune-instruction-t/25.1-04-SUMMARY.md ]` → will be FOUND after Write completes
- `git log --oneline --all | grep -q 38fd18e` → FOUND (Task 1 commit)
- All 6 acceptance-criteria grep gates → PASSED (counts: 2 / 6 / 2 / 2 / 0 / 5)
- All 4 preserved-section grep gates → PASSED (counts: 1 / 2 / 1 / 1)
- Negative-criteria diffs (`listen/SKILL.md`, `commune/SKILL.md`, `commune/commune.md`, `psyche.md`, `src/owl/resume.rs`) → all empty
- `git show 38fd18e --stat` → 1 file changed, 16 insertions(+), 2 deletions(-)
- Final line count: 85 (within plan's implicit envelope; ~13 lines net growth for three surgical edits)
- Zero unexpected file deletions: `git diff --diff-filter=D --name-only HEAD~1 HEAD` → empty

---

*Phase: 25.1-revise-commune-signoff-skill-docs-echo-commune-instruction-t*
*Completed: 2026-05-22*
