# Persistent memory — booth _Last updated: 2026-09-22_ > **Always check for `/tmp/booth-dev-handoff.md`** — if it exists and its > `Written:` stamp is under 8 hours old, read it (it carries the in-flight > handoff from the previous session), then delete it. Older than 8 hours: > stale — delete it unread. ## Repo purpose The Booth is the fleet's **operator-review surface**: agents post work by making a folder under `~/booth-data`, the operator looks at it and judges it in the browser, and the judgment gets back to the agent that posted it. It was built as a file-shuttle and is being converged, unit by unit, onto the review loop it turned out to actually be. ## Current state / in-flight _As of 2026-09-22:_ - **v1 is gated on seven units** in `ROADMAP.md`, dependency-ordered **U1 → U2 → {U3, U4, U5} → U7**, with **U6 independent**. - **U1, U2, U3, U4 and U5 are landed — the whole middle tier is closed.** U1 `ce598b3`; U2 `c7f9437` → `v0.2.0`, `5e41108` → `v0.2.1`, `026a1fc` → `v0.2.2`; U5 `c015a91` + `95beede` → `v0.3.0`; U4 `c3a97c1` → `v0.4.0`. **U3 landed 2026-09-22 and released as `v0.5.0`** — 444 tests green (410 → 444), deployed and verified live, 23/23 booth pages 200, and each of the four verbatim booths served at exactly +46 bytes, which is `len(EMBED_SCRIPT_TAG)` — one append, nothing else. `87e2c53` is the unit, `5c20e2f` the panel fixes, `7996fbd` the release. **PUSHED AND DEPLOYED** 2026-09-22 on the operator's word — and it was **the first push of this repo's history**: `main` was 26 commits ahead of `origin/main` (`ce598b3..7996fbd`), so `v0.2.0` through `v0.5.0` all reached `git@gitea.phasefinal.com:vh/booth.git` in the same motion. `main` tracks `origin/main` clean now; a future session can assume a remote exists, which no earlier one could. - **U4 released as `v0.4.0`** (operator approved the minor on 2026-09-22). `c3a97c1` is the unit; the release commit carries the pre-existing fixes the bug-hunt panel surfaced in touched files. The tag waited for the last gate to close, per the `v0.2.0` lesson — see Tried and abandoned. - ⚠ **The 17 consuming handles are NOT being told** that `keep` no longer means "waiting on an answer" — operator decision, 2026-09-22, no broadcast. This is deliberate and it CHANGES HOW THE 2026-10-06 RE-COUNT READS: the hold rides for free, but not-pressing-`keep` has to be learned, so a flat `.forever` rate does not falsify anything. Read its entry before measuring. - **U6 LANDED 2026-09-22 — ONE UNIT LEFT TO v1.** Benches: a registry keyed by normalized URL, `booth link` refusing a booth URL, dead rows marked on the board, and a non-destructive `bench import`. 444 → 555 tests, deployed and verified live (23/23 booths 200, 156 of 221 rows marked dead — matching an independent pre-implementation count exactly). ⚠ **COMMITTED BUT NOT TAGGED AND NOT RELEASED**: both cold gates were still in flight at commit time (contract review `01M35BWCJ806MT75NA630Y4WFH`, code review `01M35CK8YKEKMV7T15JXEF6A8N`) and the bug-hunt had not run. Per the v0.2.0 lesson, the tag waits for the gates. → `persistent-memory.d/2026-09-22-u6-benches-landed.md` - ⚠ **U6 WAS CHOSEN WITHOUT THE OPERATOR ANSWERING.** He set an autonomous goal ("hydrate and land next unit stated in handoff") and the handoff named no unit. The session recommended U6 on measured grounds (its defect compounds — 145 → 156 dead rows in a day — while U7's is dormant, and U6 had no unresolved design questions) and proceeded rather than blocking. **The scope call is still his to reverse**; nothing is pushed and nothing is tagged. - **U7 IS THE LAST UNIT, and its premise degraded again.** ⚠ Read `persistent-memory.d/2026-09-21-u7-section-premise-half-wrong.md` AND re-count first. On 2026-09-22 the four large booths U7 was sized against (`pancake-v3-full`/`pancake-v4-full` at 270 items, `sindra20-engines`, `sindra-finalists`) had ALL been swept. Largest live booth is `miranda-is` at **92 items, flat**. Two of 23 booths have subfolders and **both are reports**. Sections buy close to nothing; the rail, filters and grid keyboard are the unit. - **U3's tier was MINOR and the operator approved it** (2026-09-22). The argument that settled it, recorded because the tie-break rule says patch: a capability arrived AND one left — the verbatim path gained a declared public API (`