---
name: echo-commune-overwrites-fresh-commune
description: "A fresh hand-authored doyle-commune.md was OVERWRITTEN minutes later by 'Source: echo-commune' carrying a STALE earlier-session summary — latest-write-wins on the commune drop-box means an echo writer can replace live testimony with dead state."
metadata: 
  node_type: memory
  type: project
  originSessionId: d699f8c2-d295-4a58-a94f-4a80031a23c1
  modified: 2026-09-06T08:07:21.908Z
---

Observed 2026-08-18 (~06:4xZ, NAMEPLATE fix-first session): doyle authored
`.claude/doyle-commune.md` (fix-first ruling executed, todlando dispatched), and minutes later
the file held `Source: echo-commune` content instead — a summary of an EARLIER doyle session
(auth-expiry idle stretch, threads: hertz ENLYZEAM corroboration, ball-b evidence for lia).
The echo content was internally coherent and identity-correct, so nothing about it LOOKS wrong
on resume — only content-vs-measurement comparison catches it ([[resumed-session-reground-before-acting]]).

**Why:** the commune file is a latest-write-wins drop-box. Any second writer (here an
echo-commune generator, presumably summarizing a previous session's transcript on a delay)
silently replaces live testimony with stale state. Which write the psyche daemon ingested is
NOT observable from the file ([[commune-ingest-dies-silently]]).

**How to apply:** after writing a commune in a session where echo-commune may fire, treat the
file as clobberable — if it matters, re-check and re-write (correct by replacement, carrying
any live-looking threads from the echo as UNVERIFIED rather than dropping them). On ANY resume,
rank the brief by content-vs-measurement, never by which write is newest; an echo brief can be
newer AND staler.

**Mechanism — TRACED (perri by direct observation 2026-09-06; doyle read the source same day):**
the writer is core's echo-commune host, `crates/spt-live/src/echo.rs:156-166` (`run_echo_commune`):
it composes `commune_dir/<id>-commune.md` — the SAME path the live brief tells the agent to write —
and `atomic_write_string`s it UNCONDITIONALLY. No existence check, no unread-drop refusal, no merge;
the module comment still calls core the "single writer" (stale vs the across-commune protocol).
Ingest then deletes the file ~4s later, so an authored drop still waiting for ingest is replaced and
the authored bytes exist NOWHERE (disk, funnel, digest, mind). perri's funnel replay (`spt api
io-events <id> --after <seq>`, non-destructive) over 342 events: 5 authored drops, the 2 with an
echo landing inside the ingest window (+3s, +11s) emitted NO COMMUNE frame, the 3 without survived —
5/5. Widest exposure: a commune written as a turn's FINAL act (~10s unread vs 2.8-5.8s ingest floor).
Adapter cannot fix it (file leg loses the race, frame leg reads the echo). Filed on the board via
alchemy 2026-09-06 as a bugfix (ref in [[v0670-arc-in-flight]]); candidate fix = distinct echo path
or refuse-to-overwrite-unread. Full write-up: spt-claude-code/docs/plans/ECHO-COMMUNE-DROP-COLLISION.md.
**Until fixed:** write the across-commune mid-turn and take one more tool call after it (so the
adapter's PreToolUse leg reads it inside the ingest floor), never as the turn's last act. ⚠ perri's
caveat (2026-09-06): that recovers the BOUNDARY only — if the echo still wins the race the authored
CONTENT is gone and the psyche gets the echo summary. The rule buys the wake, not the delta. The only
content check is the funnel: after a commune, `spt api io-events <id> --after <seq>` (non-destructive)
must show a COMMUNE frame whose head is YOUR bytes, not `Source: echo-commune`; if it shows the echo,
re-write the commune. Absence of the drop file proves nothing (either writer's ingest deletes it).
