# Retire the echo-drop-race workaround from the live brief

**Trigger:** operator, 2026-09-09 — "spt-core v0.68.0 is released, so the 'extra tool call'
instruction for recharges should no longer be needed."

**Verified before acting** (the premise, not taken on faith): `spt-bs-releases#276` is
`state: done`, closed 2026-09-09T09:39Z. The authority for the behaviour change is the node-local
published docs (`/harness-contract/echo-commune.md`, served from this node's 0.68.0 bundle), which
now state three invariants:

1. **"The echo routes; it does not file."** — the brief goes from summarizer stdout into the tier
   store in one step, so *"there is no window in which the brief sits as a file — for anything else
   to overwrite, or to be overwritten by."*
2. **"`commune_dir` is the _agent's_ channel, not the echo's… The echo does not write there."**
   with an explicit note that core filed there **until v0.67.x**.
3. **"Ingest deletes the agent's drop… The file disappearing is the success signal."**

No spt-core source was read. Public surface only.

## Why the workaround is safe to remove — the mechanism, not the say-so

The rule bought ONE thing: that the boundary armed off the **agent's own body** rather than the
echo's. Under two writers, a marker-bearing drop written as the turn's last act sat unread ~10s
while the closing message generated, and an echo landing in that window overwrote it — the file leg
lost the race and the frame leg then faithfully read the echo's body and correctly armed nothing.

With core ≥0.68.0 nothing overwrites the drop, so **the frame leg now reads the agent's own bytes**.
A last-act drop still arms, via the frame backstop, with no timing discipline required. That is the
load-bearing reason, and it is why the floor moves.

## What the old text guaranteed — enumerated before rewriting

A replacement can silently delete a property the old rule supplied incidentally, so:

| # | Property the current brief supplies | Verdict |
|---|---|---|
| a | Recharge arms off the agent's own body | Now core-guaranteed → **drop the rule** |
| b | Don't waste turns polling for the drop to vanish | **KEEP** — still correct, fire-and-forget |
| c | The vanish signal is unreliable ("proves nothing either way") | **NOW FALSE** — one writer; docs call the vanish *the success signal*. Must be corrected, not just deleted |
| d | How to verify the delta by replaying `io-events` | **KEEP**, but the reading rule changes |
| e | `Source: echo-commune` payload ⇒ "the echo won, your delta never landed" | **NOW FALSE and actively harmful** — the echo still publishes a legitimately-stamped COMMUNE frame, so this now yields FALSE ALARMS and needless commune rewrites |
| f | Marker bare, in the first ~16KB, pair-brackets a directive | **KEEP** — unrelated mechanism |

⭐ (c) and (e) are the reason this is a **correction, not a deletion**. Removing only the timing rule
would leave the brief teaching two statements that 0.68.0 made false.

## What must NOT be touched

- **The `Source: echo-commune` authorship refusal stays.** Core deliberately KEPT the provenance
  header (#276: *"header `Source: echo-commune` kept — claude-spt 0.38.3 keys its refusal on it"*).
  `REQ-COMMUNE-ECHO-NOT-AUTHORED` is untouched; the echo still publishes COMMUNE frames, so a frame
  leg that armed off one would still be arming off a body the agent did not write.
- **History stays.** Manifest version-history comments, shipped CHANGELOG sections and
  `docs/plans/ECHO-COMMUNE-DROP-COLLISION.md` describe what shipped under the conditions of the
  time. Per `REQ-RECHARGE-VOCABULARY`'s precedent, rewriting history makes release notes lie.
  The collision plan gets a RESOLVED header, not an edit.
- **`REQ-COMMUNE-DROP-DETECT` / `REQ-COMMUNE-FRAME-BACKSTOP` impl.** Both legs stay; they are
  complementary for reasons unrelated to the echo.

## The floor is load-bearing

`min_spt_core_version` moves **0.66.0 → 0.68.0**. This is not bookkeeping: a user on 0.67.x running
a brief with the workaround removed gets silently-lost recharge wakes — the dead-boundary-fails-
silently shape. The floor is what makes the brief's new claims true.

⭐ **The guard is a COUPLING test, not a text test:** assert that if `live-ops.md` does not teach the
timing rule, `min_spt_core_version` is >= 0.68.0. A test that merely pins wording would stay green
if someone lowered the floor later. Predicate, not list (the recurring lesson).

## Tasks

1. Mint `REQ-ECHO-DROP-RACE-RETIRED` in `traceable-reqs.toml` FIRST (doc/impl/unit), naming the
   floor coupling as the invariant.
2. Rewrite the two `adapter/strings/briefs/live-ops.md` passages — the Commune delta-check
   (properties c, d, e) and the Recharge timing rule (a, g).
3. Bump `min_spt_core_version` to 0.68.0 + add the version-history comment block.
4. Unit test: the floor-coupling predicate, plus a check that the authorship-refusal guidance
   survives. Mutation-check both (revert each, watch only its own test fail).
5. Amend `REQ-COMMUNE-DROP-DETECT`'s title with a dated note that core 0.68.0 resolved the
   two-writer premise — the requirement narrates it as falsified-and-open today.
6. `docs/plans/ECHO-COMMUNE-DROP-COLLISION.md`: RESOLVED header pointing at core 0.68.0 + #276.
7. Version bump + CHANGELOG section (UX-only wording: what the agent should now do differently).
8. Gate: `sh ci/run-gates.sh` PASS + `traceable-reqs check` exit 0. Then release per the runbook
   (three triples, tag, private release, public mirror). **No skeleton step** unless `plugin/`
   changes — brief text ships in `adapter.spt`.

## Open question for the operator

Peers' durable context still carries the old timing rule in their briefs and communes. It is
harmless (an extra tool call costs nothing), so no peer notification is planned — but if you want
the fleet told, that is a message, not a release.
