---
name: v0390-recharge-trust-trace
description: "v0.39.0 SHIPPED 2026-09-09 (milestone #33 rest): recharge rename, trust auto-seed, hook-trace retention. ⭐ An instrument that dies before the investigation is not an instrument."
metadata: 
  node_type: memory
  type: project
  originSessionId: 45d4cae9-0ba3-42ec-a68a-54197b32289e
  modified: 2026-09-09T01:17:32.251Z
---

**v0.39.0 shipped** (commit `1dd3470`, tag pushed, private release + public mirror + cplugs 0.1.19
all done). Gate PASS, 561 unit tests, `traceable-reqs check` exit 0. Milestone #33's remaining three
Requests. FIELD-VERIFY still OWED on all three.

**#34 hook-trace retention** (`REQ-HOOK-TRACE-RETENTION`). Two defects, both measured not estimated:
87 B/s, 512KB cap in 101 min, 247/263 lines (95% of bytes) were `arm_from_commune_frame` logging one
line PER STALE FRAME PER POLL. Collapsed to one summary line per poll (silent when nothing refused —
an unconditional summary is the same defect with a smaller constant) → ~32 h. And the roll was
`fs::write(path, b"")`, an in-place TRUNCATION performed by whichever endpoint crossed the cap, so
one agent's poll destroyed a peer's evidence; now rotates to `hook-trace.log.1`.
⭐ **An instrument that cannot outlive the gap between a defect and its investigation is not an
instrument.** I filed this DURING the milestone because #32's measurement was destroyed ~2 min after
it was written. Same family as [[node-local-book-gate]]'s validate-the-instrument rule.

**#24 recharge rename** (`REQ-RECHARGE-VOCABULARY`, ADR-**0011** — the plan said 0010, taken by
account-roots; check `ls docs/adr/` before minting a number). STAGED: `--across` / "commune across"
still accepted. ⭐ **A staged rename needs BOTH halves guarded, because each fails in the opposite
direction** — drop the new name and the rename never happened; teach the old one as current usage and
the staging is silently a no-op. `tests/recharge-vocabulary.sh` (modelled on `knock-vocabulary.sh`)
asserts both; it caught a real miss in `CONTEXT.md` on its first run. Ids NOT renamed — an id is
identity. History (CHANGELOG/ADR/plans) deliberately untouched.

**#31 trust auto-seed** (`REQ-TRUST-AUTOSEED`, `launch.rs`). Seeds `hasTrustDialogAccepted` +
`hasClaudeMdExternalIncludesApproved` + `hasClaudeMdExternalIncludesWarningShown` pre-spawn, tmp+
rename, on the root THE SPAWN resolves (account root > `$CLAUDE_CONFIG_DIR` > `~/.claude.json`),
write-only-when-wrong. ⭐ **Re-verified the key shape on the live store rather than trusting my own
60-day-old memory: 75/75 forward-slash, 0 backslash.** Never canonicalize (Windows `\\?\` prefix
would mint a second key nothing reads).

**#32 busy race ships NOTHING, deliberately.** Stated root cause REFUTED (UPS *does* mark busy).
⭐ I demonstrated candidate (b) is REACHABLE by hand — that is NOT the claim that it FIRES in the
field, and only the second justifies a fix. Its measurement needs #34's retention IN THE FIELD, so it
opens the next milestone: `BUSY-RACE-PLAN.md` (step 0 = install v0.39.0 and confirm the instrument).

**Release mechanics re-confirmed this run:** `mirror-public.sh --apply` in position 1; the snapshot
tree excludes `traceable-reqs.toml` and root `*-PLAN.md` — I verified that at the CONSUMER
(`git ls-tree` on the snapshot sha) rather than trusting the guard's exit, per
[[exit-zero-from-a-flag-order-noop]]. `package-skeleton.sh --apply` surfaced a `send/SKILL.md` change
from an EARLIER release whose skeleton step was skipped — ⭐ a skipped skeleton step leaves drift that
only shows up at the next one, so read the cplugs diff before committing it.

Related: [[commune-loop-and-stale-brief-task]], [[v0384-commune-frame-replay]],
[[claudejson-write-hazard]], [[f027-trust-seam-groundtruth]],
[[headless-spawn-external-imports-gate]], [[release-notes-ux-only]].
