---
name: v0400-echo-race-workaround-retired
description: "v0.40.0 SHIPPED + FIELD-VERIFIED 2026-09-09 (#37): retired the recharge timing workaround after spt-core 0.68.0 removed the drop-path race. ⭐ Retiring a workaround is a CORRECTION, not a deletion — enumerate what the old text guaranteed. ⭐⭐ Guard the COUPLING (brief+floor), never the wording. ⭐ The retirement verifies ITSELF: a last-act commune that wakes IS the proof."
metadata: 
  node_type: memory
  type: project
  originSessionId: f3635e58-bddb-43d0-8b7a-586a2afd835b
  modified: 2026-09-09T12:12:41.748Z
---

**v0.40.0 shipped, mirrored and installed** (commit `a8089ff`, tag `v0.40.0`, public snapshot
`f741355`). Gate PASS 79 checks, `traceable-reqs` exit 0. `#37` DONE. NO skeleton step — `plugin/`
untouched.

**Operator trigger:** "spt-core v0.68.0 is released, so the 'extra tool call' instruction for
recharges should no longer be needed." The premise was TRUE, and verified before acting rather than
taken on faith.

## The mechanism, not the say-so

Until 0.68.0 core's echo host wrote the SAME path as the agent's commune drop, so a marker-bearing
recharge written as a turn's last act could be overwritten unread and its wake never fired. The
brief's answer was a timing rule (never write it last; spend one more tool call).

⭐ **What makes removal safe is not "core fixed it" but the consequence: with nothing overwriting the
drop, the FRAME LEG now reads the AUTHOR's bytes**, so a last-act commune still arms via
`REQ-COMMUNE-FRAME-BACKSTOP` with no timing discipline. Name the mechanism, not the fix.

## FIELD-VERIFIED 2026-09-09T12:08Z — and the verification is SELF-DEMONSTRATING

⭐ **The retirement is its own test rig.** The pre-clear turn wrote the recharge commune as its
LAST ACT with no follow-up tool call — the precise case the old rule forbade — and the next session
woke from it. Waking at all IS the proof; no separate instrument was needed or possible.

⭐ **The wake and the delta are TWO claims — do not conflate them.** Measured separately from one
io-funnel replay (`spt api io-events perri --after 0 --json`):

1. **Wake fired last-act:** `1606 AGENT_OUTPUT → 1607 COMMUNE → 1608 clear → 1610 wake fire`. No
   tool-call frame between the drop and the clear.
2. **Delta carried the AUTHOR's bytes:** seq 1607 opens with my own wake text and has **no
   `Source:` header** — the discriminator against seqs 1544/1570 in the same replay, which ARE
   `Source: echo-commune`. Both kinds coexist legitimately; check for YOUR frame, not the newest.

Not observed, stated as such: the `Source: echo-commune` authorship refusal was not exercised this
cycle. It stays.

## ⭐⭐ Retiring a workaround is a CORRECTION, not a deletion

Enumerating what the old text guaranteed found **two statements 0.68.0 made FALSE**, which a
one-line removal would have left teaching falsehoods:

1. *"the drop file being gone proves nothing either way — either writer's ingest deletes it"* — one
   writer left, and the docs now call the file disappearing the CONSUMED signal.
2. *"a payload starting `Source: echo-commune` means the echo won and your delta never landed"* —
   core deliberately KEPT that header (claude-spt keys its authorship refusal on it), so the echo
   still publishes those frames legitimately. Left in place this raises a FALSE ALARM on every one
   and drives agents to rewrite good communes forever.

Same family as [[v0383-echo-commune-authorship]]: a replacement deletes properties the old rule
supplied incidentally. Enumerate before rewriting.

## ⭐⭐ Guard the COUPLING, never the wording

`min_spt_core_version` 0.66.0 → 0.68.0, and **the floor is the load-bearing half**: a node on 0.67.x
reading the new brief takes the last-act path and loses its recharge wake SILENTLY.

`tests/echo-drop-race-retired.sh` asserts the IMPLICATION — *brief lacks the timing rule ⇒ floor >=
0.68.0* — compared as ordered version components so a legitimate future floor rise stays green. **A
wording pin would have stayed green if someone later lowered the floor**, which is exactly the
combination that hurts. Mutation-checked four ways; restoring the workaround alongside a LOW floor
stays LEGAL — only the unsafe pairing is refused.

`REQ-ECHO-DROP-RACE-RETIRED` (doc/unit). ⭐ **No `impl` stage on purpose**: the only implementation
is a manifest DECLARATION and the scanner does not read `.toml` (established convention —
`REQ-DIST-SESSION-RESUME`), so the unit test asserts the floor's VALUE instead.

## ⭐ Two mistakes, both caught by gates rather than by me

1. **My own test's predicate was wrong on its FIRST run.** A bare `last act` grep matched the
   CORRECTED brief's wording ("your turn's very last act") and reported the workaround as still
   present — the instrument answering the exact OPPOSITE of the truth, on the very check written to
   prevent that class. Match prescriptive forms, not incidental phrases. Run a new test and read
   which branch it took, never just its exit code.
2. **The mirror leak guard caught me putting private-home repo literals into two public-bound
   files.** Removed the references rather than growing EXCLUDES (reserve that for surfaces that
   genuinely must name the private home). ⭐ **`docs/plans/` IS mirrored publicly** — only ROOT
   `*-PLAN.md` is excluded, as a `:(glob)` class — so a private ref in `docs/plans/` is a real leak.

## Node condition found and reported (NOT claude-spt) — spt-bs-releases#292

`spt docs url` prints `http://localhost:5474/<node>/docs/` which **404s**, while the same server
answers 200 at `/` and serves the whole mdBook. Reported to doyle, who RULED it and filed **#292**
(bugfix, backlog), credited. Nothing owed from claude-spt.

**doyle's cause, narrower than my hypothesis and not visible from the public surface:** the 0.68.0
flip on this node was BRAIN-ONLY — coordinator image 0.68.0 over a resident **0.67.0** network layer
(the 5474 listener). The 0.68.0 CLI computes the node-scoped `/<node>/docs/` grammar and speaks the
new serve-control kind; the 0.67.0 layer routes neither, so the bound times out by design.
`ADAPTER_WEB_PENDING` on `adapter update` is the same wall. Remedy is a full daemon restart
(operator's call — it kills every hosted session). ⭐ **The node-scoped URL is NOT mine to work
around in the adapter** (doyle, explicit): keep calling `spt docs url` as the documented seam.

⭐ The real gap, which is what got filed: a 404 there is **indistinguishable from a missing bundle**
because nothing names the skew. An agent following the documented URL concludes the docs are
unavailable — I nearly did, mid-release.

## ⭐⭐ I REPORTED A SECOND DEFECT THAT WAS MY OWN INSTRUMENT — RETRACTED

I told doyle `spt serve list` "exits 0 while printing its error", flagging a possible second defect.
**FALSE, and it was my measurement.** I ran `spt serve list 2>&1 | head -10; echo $?` — a pipeline
returns the LAST command's status, so I read `head`'s rc. Measured both ways to be sure:

    unpiped                 -> rc=1, stdout EMPTY, stderr SERVE_CONTROL_ERROR   (correct)
    piped through head      -> rc=0                                             (my wrong number)

⭐⭐ **I have this exact trap in my own notes since v0.29.5 ([[v0294-0295-turnend-confirm-and-canonical-root]]:
`cmd | tail` returns tail's exit code) and walked into it anyway — while reading an exit code AS
EVIDENCE.** Never read `$?` through a pipe. When an exit code is the finding, capture it unpiped
(redirect to files) before reporting it. Retracted to doyle immediately and in his favour; one
defect, not two.

Related: [[v0391-profile-string-resolution]], [[v0390-recharge-trust-trace]],
[[brief-rule-scoped-to-mechanism]], [[list-vs-predicate-assertions]],
[[exit-zero-from-a-flag-order-noop]], [[node-local-book-gate]].
