---
phase: 25.1-revise-commune-signoff-skill-docs-echo-commune-instruction-t
verified: 2026-05-22T00:55:00Z
status: passed
score: 13/13 must-haves verified
overrides_applied: 0
---

# Phase 25.1: Revise /commune + /signoff Skill Docs + Echo-Commune Instruction — Verification Report

**Phase Goal:** Self-side skill docs teach the Phase 25 D-10/D-11 two-slice envelope contract such that a live agent composing a commune or signoff body produces correctly-routed two-slice output, and an echo-commune-receiving agent absorbs the two slices coherently as one resume brief. A small Rust sentinel `<project-context-resolved name="..."/>` in `download_payload()` provides the deterministic in-project detection signal Self keys on.

**Verified:** 2026-05-22T00:55:00Z
**Status:** passed
**Re-verification:** No — initial verification

## Goal Achievement

### Observable Truths (D-25.1-01..08)

| #   | Truth                                                                                                                                                                                                               | Status     | Evidence                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| --- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 1   | **D-25.1-01:** Required two-slice envelope taught as the only path for Self-authored commune and signoff bodies.                                                                                                    | VERIFIED   | `commune/SKILL.md:45` new `## Two-slice body shape (Phase 25 D-10/D-11)` section opens with "MUST itself be wrapped in two-slice envelopes". `commune.md:11` same header. `signoff/SKILL.md:55` same header. `signoff/SKILL.md:34` Step 3 reword forces wrapping on FINAL-COMMUNE body.                                                                                                                                                                                            |
| 2   | **D-25.1-02:** In-project + no project-specific update → empty `<project-context></project-context>` taught as the deliberate "in-project but quiet" signal.                                                        | VERIFIED   | `commune/SKILL.md:54` "emit `<live-context>...</live-context>` AND `<project-context></project-context>` (empty body — the deliberate 'in-project but quiet' signal per D-25.1-02)". `commune.md:18` rule 2 + Example 2 at `commune.md:92-99` shows the empty-tag pattern verbatim. `signoff/SKILL.md:59` mirrors the empty-tag rule.                                                                                                                                              |
| 3   | **D-25.1-03:** Outside any tracked project → omit `<project-context>` entirely (missing tag = "no project resolved").                                                                                               | VERIFIED   | `commune/SKILL.md:55` "Do NOT emit an empty `<project-context>` envelope (missing tag means 'no project resolved' per D-25.1-03)". `commune.md:19` rule 3 + Example 3 at `commune.md:102-107` shows live-only emission. `signoff/SKILL.md:60` mirrors the rule.                                                                                                                                                                                                                    |
| 4   | **D-25.1-04:** Self determines in-project status via the `<project-context-resolved` marker in `$LIVE psyche-download` output.                                                                                      | VERIFIED   | Sentinel emitted at `src/live/context.rs:465` inside `download_payload()`. Doc-comment rationale at `src/live/context.rs:450-459`. Detection rule taught at `commune/SKILL.md:49`, `commune.md:21`, `signoff/SKILL.md:59` — all instruct "grep the output for the literal substring `<project-context-resolved`". Sentinel name carried inside the in-project guard block (`derive_current_repo_names().first()` + file-exists + read-ok). Inherits into SessionStart via D-15. |
| 5   | **D-25.1-05:** Two-slice echo-commune body absorbed as one continuous resume brief (no differentiated handling).                                                                                                    | VERIFIED   | `live/SKILL.md:268` echo_commune catalog entry: "the two slices form a single SessionStart resume brief — absorb both as one continuous context (D-25.1-05)". `revive/SKILL.md:87` mirrors: "absorb both slices as one continuous resume brief (D-25.1-05)".                                                                                                                                                                                                                       |
| 6   | **D-25.1-06:** Echo-commune teaching surfaces live-only (`/spt:live`, `/spt:revive`, SessionStart `<psyche-context>` prose — NOT `/spt:listen`).                                                                    | VERIFIED   | `live/SKILL.md:268` extended (in-scope). `revive/SKILL.md:85-87` new section added. `listen/SKILL.md` NOT modified — confirmed via `git diff --name-only a2bd1c2..HEAD -- plugin/spt/skills/listen/SKILL.md` returns empty. SessionStart `<psyche-context>` injection: `src/owl/resume.rs` NOT modified — D-25.1-06 Touchpoint 6 deferred per SD-2 (acceptable per CONTEXT Open Question 2 "Option (b) is lower-risk for a 'doc-only' framing"). |
| 7   | **D-25.1-07:** Skill docs stay SILENT on the untagged-commune fallback (no mention of `untagged`, `auto-classify`, `safety net`, `will figure it out`).                                                             | VERIFIED   | Grep `untagged\|auto-classify\|safety net\|will figure it out` across all of `plugin/spt/skills/` returns ZERO matches. Plan 03 surgically reworded a pre-existing "safety net" phrase in `## Commune Diligence` to "backstop" — single Rule 1 deviation properly handled and documented.                                                                                                                                                                                          |
| 8   | **D-25.1-08:** Memformat Guide reframed to decouple topic-content from envelope-routing (topics inform CONTENT; envelope routing is INDEPENDENT).                                                                   | VERIFIED   | `commune.md:31` Memformat Guide reframe paragraph: "Memformat topics inform CONTENT (what to think about and report on). Envelope routing (`<live-context>` vs `<project-context>`) is INDEPENDENT...". `commune.md:71` `## What to Include` adds routing sub-paragraph clarifying same decoupling.                                                                                                                                                                                |
| 9   | **Phase 23 ⊃ Phase 25 nesting unambiguous** across all touched authoring-side surfaces.                                                                                                                              | VERIFIED   | `commune/SKILL.md:75` "The `body` placeholder in the example above is the two-slice body...the two envelope layers nest". `commune.md:23` nesting callout: "You write ONLY the inner two-slice body". `signoff/SKILL.md:85` "the Phase 23 EVENT envelope and the Phase 25 two-slice body nest, with EVENT wrapping the two-slice body". All three preserve the "Self does NOT manually construct EVENT XML" anchor.                                                                |
| 10  | Sentinel build artifact: `cargo build --release` succeeds with no new warnings introduced in `src/live/context.rs`.                                                                                                  | VERIFIED   | Built locally during verification: `cargo build --release` → exit 0. Only pre-existing warnings present (unrelated `field source is never read` in `src/owl/resume.rs:13`, `should_fire` in `src/live/wrapper/echo_fire.rs:95`).                                                                                                                                                                                                                                                   |
| 11  | Sentinel test coverage: both branches pinned by unit tests.                                                                                                                                                          | VERIFIED   | `cargo test --lib live::context::tests::download_payload` → 10 passed / 0 failed / 1 ignored. Includes `download_payload_emits_project_context_resolved_sentinel_when_in_project` (positive branch — asserts substring, attribute, AND D-14 ordering invariants `live < sentinel < project_body`) and `download_payload_omits_sentinel_when_no_project_file` (negative branch — asserts substring absent + live body still emitted).                                                |
| 12  | Negative gates honored: `psyche.md`, `plugin/spt/skills/listen/SKILL.md`, `src/owl/resume.rs` untouched in phase commits.                                                                                            | VERIFIED   | `git diff --name-only a2bd1c2..HEAD -- psyche.md plugin/spt/skills/listen/SKILL.md src/owl/resume.rs` returns EMPTY. All three explicitly out-of-scope files preserved.                                                                                                                                                                                                                                                                                                            |
| 13  | All 6 plans (01–06) shipped with passing self-checks; phase scope covers D-25.1-01..08 end-to-end (5 doc surfaces + sentinel).                                                                                       | VERIFIED   | Commits a2bd1c2..HEAD show 13 commits, alternating `test/feat/docs` (plan 01) and `docs` (plans 02-06) per TDD convention, each followed by a `complete... plan` summary commit. Files modified set: `src/live/context.rs`, 4× SKILL.md (commune, signoff, live, revive), `commune/commune.md`. Matches phase scope exactly.                                                                                                                                                       |

**Score:** 13/13 truths verified

### Required Artifacts

| Artifact                                            | Expected                                                                       | Status     | Details                                                                                                                                                                |
| --------------------------------------------------- | ------------------------------------------------------------------------------ | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `src/live/context.rs`                               | Sentinel emission in `download_payload()` + 2 unit tests                       | VERIFIED   | Line 465: `out.push_str(&format!("<project-context-resolved name=\"{}\"/>\n", project_name));` inside in-project guard. Tests at lines 2361 and 2424. Doc-comment at 450-459. |
| `plugin/spt/skills/commune/SKILL.md`                | `## Two-slice body shape (Phase 25 D-10/D-11)` section + Step 3 reword + nest note | VERIFIED   | 75 lines (was 59). New section at line 45. Step 3 forward-ref at line 27. Phase 23 nesting note inlined at line 75.                                                    |
| `plugin/spt/skills/commune/commune.md`              | 3 worked examples + Memformat reframe + routing sub-bullet                      | VERIFIED   | 109 lines (was 81). New section at line 11. Memformat reframe at line 31. Routing sub at line 71. Examples at lines 82, 95, 105 (in-project-both / empty / outside).   |
| `plugin/spt/skills/signoff/SKILL.md`                | Two-slice cross-link section + Step 3 reword + Phase 23 nesting note            | VERIFIED   | 85 lines (was 72). New section at line 55. Step 3 reword at line 34. Phase 23 note at line 85. Plain-signoff carve-out preserved.                                      |
| `plugin/spt/skills/live/SKILL.md`                   | echo_commune catalog entry extended with two-slice body shape teaching          | VERIFIED   | Line 268 extended; 4-envelope catalog (msg/alarm/echo_commune/init_signoff) preserved. Cross-links to `/spt:listen` (parsing) and `/spt:commune` (authoring).          |
| `plugin/spt/skills/revive/SKILL.md`                 | Short echo-commune section cross-linking `/spt:live` + `/spt:listen`            | VERIFIED   | 89 lines (was 85). New `## Echo-commune brief (post-revive)` at line 85. Single paragraph, +4 net lines.                                                                |

### Key Link Verification

| From                                                  | To                                                                                          | Via                                                                | Status |
| ----------------------------------------------------- | ------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ | ------ |
| `src/live/context.rs::download_payload (line 460)`    | `owlery::derive_current_repo_names + owlery::project_worktree_path`                          | `out.push_str` of formatted sentinel BEFORE project body push       | WIRED  |
| `download_payload_for_injection`                      | `download_payload`                                                                          | Single-producer rule (D-15) — sentinel inherits for free            | WIRED  |
| `commune/SKILL.md ## Flow Step 3`                     | `## Two-slice body shape (Phase 25 D-10/D-11)`                                              | Forward reference in Step 3 reword                                  | WIRED  |
| `commune/SKILL.md ## Envelope shape (Phase 23 v1.8)`  | `## Two-slice body shape (Phase 25 D-10/D-11)`                                              | Inline nesting clarity note ("two envelope layers nest")            | WIRED  |
| `commune.md ## How to Send`                           | `## Two-slice body shape (Phase 25 D-10/D-11)`                                              | Inline forward reference                                            | WIRED  |
| `commune.md ## Memformat Guide`                       | Envelope routing rules                                                                       | D-25.1-08 reframe paragraph                                        | WIRED  |
| `commune.md ## Examples`                              | `## Two-slice body shape` rules                                                              | 3 worked examples covering D-25.1-01..03 branches                  | WIRED  |
| `signoff/SKILL.md` Step 3 reword                      | `/spt:commune → ## Two-slice body shape`                                                    | Cross-link in Step 3 + new section closing                          | WIRED  |
| `live/SKILL.md:268` echo_commune entry                | `/spt:listen` (parsing) + `/spt:commune` (authoring)                                         | Cross-links — no rule duplication                                    | WIRED  |
| `revive/SKILL.md:87` echo-commune brief section       | `/spt:live` + `/spt:listen`                                                                  | Two-hop discoverability via cross-links                              | WIRED  |

### Data-Flow Trace (Level 4)

| Artifact                              | Data Variable                  | Source                                  | Produces Real Data | Status   |
| ------------------------------------- | ------------------------------ | --------------------------------------- | ------------------ | -------- |
| `src/live/context.rs::download_payload` | `project_name`                 | `derive_current_repo_names().first()`   | Yes (cwd-derived)  | FLOWING  |
| Sentinel emission                      | `out` (psyche-download stdout) | `format!` injection                     | Yes (verified by tests asserting substring + ordering) | FLOWING  |
| SessionStart `<psyche-context>` block  | inherited from `download_payload` | `download_payload_for_injection` wraps | Yes (D-15 inheritance) | FLOWING  |

### Behavioral Spot-Checks

| Behavior                                                                          | Command                                                                                          | Result                                                       | Status |
| --------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------ | ------ |
| Release build succeeds                                                            | `cargo build --release`                                                                          | exit 0; only pre-existing warnings                           | PASS   |
| Sentinel positive branch test passes                                              | `cargo test --lib live::context::tests::download_payload_emits_project_context_resolved_sentinel_when_in_project` | 1 passed                                                     | PASS   |
| Sentinel negative branch test passes                                              | `cargo test --lib live::context::tests::download_payload_omits_sentinel_when_no_project_file`    | 1 passed                                                     | PASS   |
| Full `download_payload` test sweep passes (regression guard for D-14 ordering)    | `cargo test --lib live::context::tests::download_payload`                                         | 10 passed / 0 failed / 1 ignored                             | PASS   |
| D-25.1-07 silence rule honored across all skill docs                              | `grep -E 'untagged\|auto-classify\|safety net\|will figure it out' plugin/spt/skills/**/*.md`     | 0 matches                                                    | PASS   |
| Sentinel grep-target taught in all 3 authoring-side surfaces                      | `grep -c 'project-context-resolved' commune/SKILL.md commune/commune.md signoff/SKILL.md`         | 1 / 2 / 1                                                    | PASS   |
| Negative gates: psyche.md, listen/SKILL.md, src/owl/resume.rs untouched           | `git diff --name-only a2bd1c2..HEAD -- psyche.md plugin/spt/skills/listen/SKILL.md src/owl/resume.rs` | empty                                                        | PASS   |

### Probe Execution

No probe scripts declared by PLAN or convention for this phase (doc-only + 1 small Rust sentinel). Cargo test suite serves as the probe — covered under Behavioral Spot-Checks.

### Requirements Coverage

Phase 25.1 is an INSERTED urgent phase with `requirements: none` per ROADMAP — no formal requirement IDs to satisfy. All decisions trace to CONTEXT D-25.1-01..08 directly and are verified in the Observable Truths table above.

### Anti-Patterns Found

| File                                            | Line | Pattern                          | Severity | Impact                                                                                                |
| ----------------------------------------------- | ---- | -------------------------------- | -------- | ----------------------------------------------------------------------------------------------------- |
| (none in phase-modified files)                  | —    | TBD/FIXME/XXX/PLACEHOLDER        | —        | No debt markers introduced. Sentinel implementation is minimal and complete (one `push_str` + `format!`). |

Pre-existing warnings in unmodified files (`src/owl/resume.rs:13` unused field, `src/live/wrapper/echo_fire.rs:95` unused fn) are NOT introduced by this phase and are out of scope.

### Human Verification Required

None. All goal-backward truths are observable via grep + cargo test. The phase is doc-only (5 skill markdown files) plus a small Rust sentinel with deterministic unit-test coverage. No UI, no real-time behavior, no external service integration that would require human spot-checking.

The phase outcome (live agents author correctly-tagged two-slice bodies) will be implicitly validated as agents are live-resumed against the updated skill docs — but this is observability, not gating verification. The doc-and-code substrate is verified complete and correct.

### Gaps Summary

**No gaps.** All 13 must-haves verified; all 6 plans shipped; cargo build + tests green; negative gates honored; silence rule enforced; sentinel sentinel-grep-target taught uniformly across all three authoring surfaces. Phase goal achieved.

---

_Verified: 2026-05-22T00:55:00Z_
_Verifier: Claude (gsd-verifier, doyle-w312)_
