# 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. - **TWO UNITS LEFT TO v1, and they do not depend on each other.** U6 (benches, independent, closes the 69% link-board rot) and U7 (navigation at 270 items, which U3 just unblocked — its only dependency was {U3, U4, U5}). Which goes next is the operator's call. ⚠ Before starting U7, read `persistent-memory.d/2026-09-21-u7-section-premise-half-wrong.md`: every booth that actually needs navigation is FLAT, so half its premise is already known to be wrong. **No recommendation is recorded for this one on purpose** — U6 and U7 are genuinely independent, they close different defects, and the last two units before a 1.0 cut are a scope-direction call rather than a dependency one. - **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 (`