---
name: v0400-echo-race-workaround-retired
description: "v0.40.0 SHIPPED 2026-09-09 (#37); its FIELD-VERIFIED claim CORRECTED 2026-09-11 (n=1 on core 0.67.1 proves no race absent; node never ran 0.68.0; floor may be too high — it blocked v0.41.0 until the operator took core to 0.69.0): 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. ⭐⭐ A last-act commune that wakes is ONE TRIAL, not proof a race is gone."
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.

## ⭐⭐ CORRECTED 2026-09-11 — the "FIELD-VERIFIED" claim below was OVER-STATED

Measured on the same node two days later: `spt --version` **0.67.1**, `spt node status` coordinator
AND broker images both **0.67.1 "matches installed"**, and the spt binary mtime is **Sep 8 18:59,
unchanged**. **This node has NEVER run 0.68.0.** The "core 0.68.0 brain-only flip" recorded below
is WRONG, and the mechanism sentence ("0.68.0 single-writer drop path ⇒ the frame leg reads the
author's bytes BY CONSTRUCTION") credits a fix that was never installed here.

⭐⭐ **The two OBSERVATIONS stand; the INFERENCE does not.** A last-act wake fired and its delta
carried the author's bytes — true, recorded, still correct. But **n=1 cannot establish the absence
of a RACE**: a race that loses only sometimes looks exactly like no race in a single trial. Entitled
claim: *one last-act recharge wake fired on spt-core 0.67.1*. NOT "the retirement is verified."
This is `A VERDICT MAY NOT ASSERT MORE THAN IT MEASURED` missed on the exact shape it was written
for — and the SECOND time in this issue's life a single favourable trial got read as proof.

⭐⭐ **THE FLOOR IS CORRECT — doyle RULED IT 2026-09-11, and my doubt was a bad instrument.**
"v0.68.0 is the first released version with routes-not-files. Keep min_spt_core_version = 0.68.0."
He checked BOTH TAGGED RELEASES, not doc text: **v0.67.1 STILL FILES the echo into the agent's
commune channel**; 0.68.0 has the cutover. Contract carries the caveat "spt-core filed its echo
brief to that same path until v0.67.x." **No adapter change** — floor unchanged, coupling guard
green on all three assertions. Declining to lower it on an inference was RIGHT.

⭐⭐ **A SERVED DOC PAGE IS NOT EVIDENCE ABOUT WHAT A VERSION SHIPPED.** My doubt came from this
node's `localhost:5474` bundle carrying the routes-not-files statement while running 0.67.1 — but
the TAGGED 0.67.1 doc does not contain it (how the node got newer doc content than its binary is
unestablished, doyle's to chase). I already had [[node-local-book-gate]] recorded — the book comes
from THIS NODE's bundle, not from "published" — and still treated a served page as version-truth.
A served doc describes whatever bundle is on disk; **only the release tag answers a version
question.** doyle checked two tags; I reasoned from a web page about behaviour I never observed.

⭐⭐ **THE n=1 CORRECTION IS STRONGER THAN I PUT IT.** I said one wake firing could not prove the
race gone. True, but: on 0.67.1 **the race was PRESENT.** So the Sep 9 wake did not fire because of
a fix — it fired because it **WON a race that was actually running.** The "verified by construction"
claim was not merely unproven; its mechanism was ABSENT. (doyle: this is release-history
verification, NOT a new field-acceptance claim — 0.68.0+ behaviour stays unexercised here.)

⭐ **I did NOT lower it.** A floor is a safety invariant and the failure it guards (silent
recharge-wake loss) is invisible when it fires — not a thing to relax on an inference from a doc
page. The precise question ("which core version FIRST routes-not-files?") went to doyle, who owns
it. Either answer is actionable. Where "0.68.0" came from: the OPERATOR said 0.68.0 was released
with the fix — true about a RELEASE, never verified about THIS NODE, and I turned it into a floor.

⭐ **RESOLVED on this node 2026-09-11** (operator took core to 0.69.0, adapter 0.41.0 installed) —
but the finding stands and is worth keeping: for two days adapter **0.40.0 ran here while declaring
floor 0.68.0** on a 0.67.1 core — the unsafe pairing this very requirement forbids, live in the
field. ⭐⭐ **The floor gates `adapter update`, NOT runtime**: it refused 0.41.0, yet did not stop
0.40.0 from continuing to run once core sat below it. A floor protects the INSTALL, so a core that
moves backwards (or was never as new as believed) silently invalidates an installed adapter's
guarantees with nothing reporting it. How 0.40.0's pointer content got placed under that floor was
NOT established — do not guess it.

## 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]].
