Source: echo-commune
<live-context>
2026-07-30 ~02:47 — perri wrote its own commune file (`.claude\perri-commune.md`) and sent a final message to deployah closing out the session, then session ended (auto-clear queued).

Two claude-spt releases shipped tonight (in sibling repo spt-claude-code), both live, mirrored, node-applied:

**0.25.29** — fixed echo-commune summarizer inventing a "peer agents" roster (chert's field defect: summarizer promoted host machine `hfenduleam` into a peer list). Root cause: `compose_prompt` had no agents-vs-nodes model. Added `REQ-ECHO-COMMUNE-NO-INVENTED-ROSTER` directive + test. Verified by replaying chert's exact recorded tail twice.

**0.25.30** — reinstated `spt ring`, PERCHLESS-ONLY per operator ruling (perched endpoints always use `spt send`; ring is only for sessions with no listener). doyle ruled #117 CLI-side (no daemon restart needed for verification). Verified from a throwaway endpoint, not perri's live perch. Guarded by new `tests/ring-perchless-only.sh`. Also shipped plugin skeleton 0.1.17, retiring a standing stale-skeleton warning.

Three method lessons banked: (1) a published version is a claim, the version actually running is a measurement — caught a mixed CLI-0.46.0/broker-0.45.0 node (`spt --version` lies; `spt daemon status` shows the truth; full sync needs a fleet-wide daemon restart, not solo); (2) never verify a hazard using the exact resource the hazard destroys; (3) hold-and-ask beats guessing — deployah gave measurements but explicitly deferred the ruling to doyle rather than deciding.

Peer standing: doyle = gater/rulings authority; deployah = release driver, gives measurements not rulings, exchanged messages tonight about releases#30 figures and the ring CLI-side ruling.

Outstanding, all waiting on others (nothing owed by perri):
- echo-commune 30s timeout — doyle accepted fix (raise to 90s + per-role knob + softer timeout strikes), lands next maintenance window; perri field-verifies when core release lands.
- spt-bs-releases#30 peer wedge — perri filed measured figures as a comment (35.1s cliff onset, 6h10m of registry updates admitted after last successful dial). doyle + deployah own it; repro deliberately preserved, do not restart daemon/peer pump.
- Daemon restart to complete broker's move to 0.46.0 — not fired, is a fleet call, nobody has requested it.
- deployah logged a spt-core docs-gap: contract doesn't state which component owns ring's perch safety or what a mixed image pair means for a fix.

Next wake: check inbound first (replies from doyle/deployah expected), verify node health (`spt adapter version`, `spt daemon status`), do not restart daemon/peer pump, field-verify echo-commune timeout fix if a core release with it lands, otherwise idle.
</live-context>
<project-context>
Repo: spt-heartbeat-tool (aka spt-pacer-tool) — unchanged this session, still at 0.5.1, all issues closed, canary ×4. Two items parked awaiting others: local directory rename to `spt-pacer-tool` (operator's call) and an ADR-0002 amendment (waits on a core alias-over-link feature).

All engineering this session actually happened in sibling repo `spt-claude-code` (tools/claude-spt, adapter/claude-spt.toml, adapter/strings/, plugin/sptc/, tests/): versions 0.25.28→0.25.29→0.25.30, each shipped via full runbook (gates pass, traceable-reqs check, three-triple fresh build, fat pack, release + public mirror, on-node apply).

Operator reaches perri via **lia** (Reavo's liaison); `discord:reavo` has no perch and `spt send` to it fails — post rulings on the issue and ask lia to relay.
</project-context>
