---
name: v0383-echo-commune-authorship
description: "2026-09-06 v0.38.3 — my drop/frame detector deleted an authorship check the old tool-keyed rule had been making by accident, so core's echo-communes cleared live agents"
metadata: 
  node_type: memory
  type: project
  originSessionId: 8944fd8a-87a4-457c-a809-87ced33715af
  modified: 2026-09-06T08:20:26.685Z
---

**2026-09-06 SHIPPED v0.38.3 + FIELD-VERIFIED both directions on the shipped binary.**
Operator-reported: echo communes kept `/clear`ing doyle mid-work. doyle took 4 unrequested arms
between 07:58 and 08:09. Cause was mine, shipped the same day.

⭐ **A REPLACEMENT CAN DELETE A PROPERTY THE OLD RULE WAS SUPPLYING BY ACCIDENT.** The detector
keyed on the agent's own `Write` tool call. That was a real bug (Bash-written communes got no
boundary), so [[v0370-commune-drop-detect]] moved it to the drop FILE and v0.38.0 added the ingested
COMMUNE frame. Both ask *does a commune exist*; neither asks *who wrote it*. The tool-keyed rule had
been answering authorship for free, and I never named that property, so I never noticed I was
relying on it. **When you replace a predicate, enumerate what the OLD one incidentally guaranteed —
the fix's own justification will not mention it.**

⭐⭐ **A SHIELD YOU DID NOT DESIGN IS NOT A FIX, AND IT HIDES THE DEFECT.** v0.38.2's quotation mask
(REQ-WAKE-MARKER-QUOTED) was masking this bug's symptom for hours. It held only while an echo's
marker mentions happened to be backticked — a property of the SUMMARIZED TEXT, not of the rule. Four
echo frames on my own funnel sat at raw 2 / masked 0: one unquoted mention from clearing me. It also
made me misdiagnose: I blamed the mask for a boundary that never armed and nearly shipped 0.38.3 as
a mask "fix", because I A/B'd the symptom instead of reading the payload the predicate ran on.

⭐ **DIRECTION OF FAILURE IS PER-PREDICATE, NOT PER-CODEBASE.** For a wake MARKER a dead boundary
fails silently, so `mask_quoted` fails toward ARMING. For AUTHORSHIP the destructive outcome IS the
arm (an unrequested `/clear` on a live agent), so the guard is BROAD: any `Source: ` provenance
header refuses and names the source refused. Two guards, one file, opposite directions — both right.

FIX: `commune_foreign_source()` on both legs, ahead of the marker check. First line only, so a
commune *discussing* the echo source keeps its boundary. REQ-COMMUNE-ECHO-NOT-AUTHORED, 4 tests,
mutation-checked BOTH ways (drop the guard → 3 fail; widen to substring → the 4th fails).
alchemy #29 done. Released, asset verified 1497038 B, mirrored a7d8235, node 0.38.2 → 0.38.3.

**FIELD VERIFY RECIPE (reusable, no risk to your own perch):** drive the installed binary directly
with a fake endpoint — `SPT_ENDPOINT_ID=probe-x <install>/claude-spt.exe hook PostToolUse` on stdin
JSON `{session_id, tool_name, cwd}`, with `<cwd>/.claude/probe-x-commune.md` as the fixture. Build
the JSON in python, never `sed` (escaping Windows paths in sh mangles them). Run BOTH arms: the
refusal AND the positive control, or a guard that refuses everything passes your test. Clean up
`state/wake/probe-x.park` + `state/commune-seen/probe-x.stamp` after.

Distinct, still OPEN: core's echo host writes the agent's own drop path and DESTROYS an authored
commune awaiting ingest — content and boundary both. See [[echo-commune-drop-collision]].
