# ECHO-COMMUNE / AUTHORED-COMMUNE DROP COLLISION

**Status:** root-caused 2026-09-06 by direct observation. The defect is CORE-side. claude-spt
v0.38.2 is NOT implicated and needs no patch release.

## The record this corrects

The 07:48Z across-commune carried a wake directive asserting that v0.38.2's quotation mask
(`mask_quoted`, REQ-WAKE-MARKER-QUOTED) had regressed and told the next session to ship 0.38.3 and
reopen alchemy #28. **That directive was wrong**, and it was wrong the way a verdict is wrong when
it asserts more than it measured: an A/B was run (a commune with backticks did not arm, one without
did), the difference was attributed to the only code that had changed that day, and the payload the
mask actually ran on was never read.

`mask_quoted` is correct. Replayed against the exact failing commune body, byte for byte:

```
has_wake_marker(masked) = TRUE   (pair = the authored directive, sliced correctly)
```

The mask never had a chance to be the cause, because **the adapter never saw that body at all**.

## What actually happened

`spt api io-events perri --after <seq>` replays the funnel *without* writing the session cursor —
a non-destructive instrument for exactly this question. The COMMUNE frames around the failure:

| seq | time (UTC) | payload | `!!wake!!` raw → masked |
|-----|-----------|---------|------------------------|
| 305 | 07:42:38 | `Source: echo-commune` + psyche summary | 2 → **0** (both quoted) |
| 318 | 07:49:02 | my verbatim authored drop | 2 → **2** |

The authored commune written at 07:42:27 produced **no COMMUNE frame at any seq**. The frame that
arrived 11s later was an unrelated *echo-commune* — the psyche's own summarization — whose two
marker mentions are both inside backticks. The mask masked them, `has_wake_marker` returned false,
and the adapter correctly declined to arm a boundary on a body that never asked for one.

So the boundary did not fail to fire on my commune. **My commune ceased to exist**, and the adapter
armed nothing because there was nothing to arm from.

### Who destroyed it — observed, not inferred

A watcher polling `.claude/perri-commune.md` every 500 ms, while this session wrote nothing:

```
[07:58:05] PRESENT  head1=Source: echo-commune|<project-context>|## spt-claude-code — 0.38.1 …
[07:58:09] absent
```

and the matching frame:

```
343  07:58:09  COMMUNE  ECHO  len 4149
```

**Core's echo-commune host writes the agent's own authored drop path**, then core's watcher ingests
and deletes it 4s later. The drop file has two writers and no arbitration. An authored across-commune
still waiting for ingest is overwritten by an echo-commune that happens to fire in the same window —
last writer wins, silently, at both ends.

### The correlation, across the whole funnel history (342 events)

Five authored drops, five outcomes, no exceptions:

| authored drop | nearest echo-commune | authored frame emitted? |
|---|---|---|
| 07:06:02 | none nearby | yes (seq 236) |
| 07:09–07:10 | none nearby | yes (seq 244–248) |
| 07:28:45 | 07:28:48 (**+3s**) | **no** — only the echo (seq 288) |
| 07:42:27 | 07:42:38 (**+11s**) | **no** — only the echo (seq 305) |
| 07:48:56 | 07:50:18 (+82s) | yes (seq 318) |

Every authored commune lost had an echo land inside the ingest window. Every one that survived did
not. The 07:28 loss went unnoticed at the time because the file leg happened to read the drop before
the echo overwrote it, so the boundary fired — off a body that was then destroyed anyway.

## Why no adapter leg can cover this

The two legs are complementary by construction and both are defeated by the same event:

- **File leg** — reads the drop while it is on disk. Loses the race when the echo overwrites first.
- **Frame leg** — reads what core ingested. Reads the *echo's* body, because that is what core
  ingested. REQ-COMMUNE-FRAME-BACKSTOP's premise, "the COMMUNE frame carries the drop's bytes
  VERBATIM", holds only for the bytes of whichever writer won. It is a true statement about the
  file and a false one about the *author*.

There is no third surface. Once the echo has overwritten the drop, the authored body exists nowhere:
not on disk, not in the funnel, not in the digest (an ingested commune writes no digest entry), and
not in the mind — the mind received the echo's summary instead.

**This is the half the adapter cannot fix.** Even a leg fast enough to always arm the boundary would
carry the agent across a reset into a psyche that never received the context delta it authored. The
agent wakes re-briefed on a summary of what it did *before* the work it just communed about.

## Timing: why the turn's-final-act commune is the exposed one

Core's ingest floor is 2.8–5.8s (measured, v0.38.0). Against that:

- **PostToolUse** fires ~1s after the writing tool returns — comfortably inside the floor. But its
  matcher is `Write` only, so a Bash/`cat`-written drop gets no PostToolUse at all.
- **PreToolUse** fires on the next tool call — covers a commune written mid-work.
- **Stop** fires only after CC finishes generating the turn's closing assistant text. Measured on the
  07:42 turn: commune written 07:42:27, Stop's payload published 07:42:37 — **~10s**, of which the
  900 ms settle is a small part. The rest is model generation time, which the adapter does not
  control.

So a commune written as a turn's **final** tool call is unread for ~10s — twice the ingest floor and
wide open to the echo. That is the shape both losses took.

## Actions

1. **CORE (doyle):** the echo-commune host and agent-authored across-communes share one drop path
   with no arbitration. Needs a core-side answer — a separate path for echo output, or a refusal to
   overwrite an unread drop, or a merge. Filed with the evidence above.
2. **ADAPTER (mine), gated on 1:** widening the PostToolUse matcher from `Write` to `*` would put a
   read ~1s after any tool-written drop, inside the ingest floor. REQ-COMMUNE-DROP-DETECT explicitly
   **rejected** this (a plugin republish, plus a second hook spawn on every tool call), and that cost
   is real and fleet-wide. It also only recovers the boundary half, never the content half. Hold it
   until core answers: if the collision is arbitrated core-side, the existing legs are sufficient and
   the fleet pays nothing.
3. **alchemy #28:** stays `done`. Correct the record on it — the mask shipped correct.

## Method note, kept because the outcome hides it

Three sessions in a row treated "the thing that changed today" as the thing that broke. The
falsifier cost one command: replay the funnel with `--after` (non-destructive) and read the payload
the predicate actually ran on. It answered in one poll what two A/B experiments and a code re-read
could not, because both of those were interrogating a body that was never the input.
