# U6 released as v0.6.0 — benches, and the number that was two defects _2026-09-22 · booth_ **The sixth of seven v1 units. Only U7 remains.** 444 → 607 tests. Tagged `v0.6.0` (minor, operator-approved). **NOT PUSHED** — push is his call. ## What shipped - **`booth/benches.py`** — stdlib-only AND sibling-free. `Bench`, `normalize_bench_url` (the identity), a lenient `read_benches` on the render path and a strict `_load_strict` on the write path, `mkstemp` + `fsync` + `os.replace` under an flock, and `order_benches` with a stated total order `(state rank, name casefolded, id)`. - **`links.booth_target`** — ONE predicate for "is this a booth URL", host-agnostic, path-shaped, percent-decoding, control-character-rejecting, never raising. Three callers: the CLI refusal, the board's dead marker, `bench import`. - **`booth link` refuses** a booth URL (naming `booth new --why`) and a credentialed one, writing nothing in either case. - **The board marks dead rows** — 161 of 221 live. Removal stays the operator's two clicks through the bulk control that already existed. Nothing deletes. - **`booth bench add|ls|state|rm|import`**. `--apply` REQUIRES the ids. ## The decision that shaped the unit, and it was measured **The design doc's headline "69% rot" was two defects wearing one number**, and splitting them is what made the unit the right size — see [[2026-09-22-one-number-was-two-defects]]. 178 of 221 rows are booth announcements (156 already dead) whose *cause* U5 had already closed; only 8 are the bench re-post the registry fixes. A unit scoped off the unsplit number would have built the registry, declared victory, and left 178 rows rotting. **Identity is the FULL normalized URL, not the origin**, and that was measured rather than chosen: origin identity merges eight distinct gitea repositories into one row, three unrelated HuggingFace model cards into one, and the two LRPG surfaces on `10.100.10.50:8321` — *the design doc's own example of two real benches* — into one. It destroys more than it deduplicates. **`booth link` is NOT deprecated**, against the design doc's plan. Roughly 14 of the 35 distinct non-booth targets are reference bookmarks (repos, model cards, docs) for which the board is the right and only home. Deprecating it would have evicted a third of its live content. The IA doc is corrected. ## The gates All four closed, and every one paid — see [[2026-09-22-three-cold-panels-on-one-unit]]. Contract review `01M35BWCJ806MT75NA630Y4WFH`, code review `01M35CK8YKEKMV7T15JXEF6A8N`, bug hunt `01M35CRRK2RTVWWF1BN09AFQG3`, one consolidated reply sent to heid at `01M35FY8QZTB9E5VR4WXDSBGEV`. ## Live evidence, unplanned The sweeper ran mid-session: **23 booths → 19**, and dead board rows went **156 → 161 in about fifteen minutes**. The defect compounding in real time while the fix was being built — which is the argument for U6-before-U7 playing out on its own.