feat(u6): benches — a registry with identity, and the rule enforced
The standing link board carried three jobs because only one of them had a surface. Re-measured before contracting, its 221 rows split into 178 booth announcements (156 already dead) and 43 non-booth rows, of which 8 are the same bench re-posted. U5 gave the booth announcement a home; this gives the running service one, and refuses the one shape that now has somewhere better to go. - booth/benches.py (new, stdlib-only and sibling-free): the Bench record, URL normalization as the identity, a lenient read on the render path and a strict read on the write path, atomic replace under an flock, and a stated total order (state rank, name casefolded, id). - links.booth_target: ONE predicate for "is this a booth URL", consumed by the CLI refusal, the board's dead marker and bench import. Host-agnostic, path-shaped, percent-decoded, never raises. - booth link refuses a booth URL, names `booth new --why`, and writes nothing — not the row, not the board directory, not the announcement. - The board marks rows whose booth has been swept. Nothing here deletes a row: removal stays the operator's two clicks through the existing bulk control. - booth bench add|ls|state|rm|import. import writes nothing without --apply and never edits links.md. - docs/archive/links-2026-09-22.md: the board archived verbatim into git. Identity is the FULL normalized URL, not the origin, and that was measured: origin identity collapses the 43 non-booth rows to 19 groups by merging 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. Full-URL identity still collapses both cases that doc names: talk 5 to 1, Peedlar 3 to 1. booth link is NOT deprecated. Roughly 14 of the 35 distinct non-booth targets are reference bookmarks for which the board is the right and only home; the design doc's plan to deprecate it would have evicted a third of its live content. Corrected there, along with what "normalized URL" means. The seam review found three real defects in the contract before any code: the claim that test_stdlib_only already forbids sibling imports (it exempts `booth` on purpose), naming resolve_booth as the dead marker's existence check (it raises HTTPException(404), so one swept booth would have 404'd the whole board page), and silence on percent-encoding (booth links are emitted through quote(name, safe=""), so a raw comparison marks every encoded booth dead forever). That both list_booths and sweep_once skip the registry was verified against the real functions rather than assumed. 444 -> 555 tests. Deployed and verified live: 23/23 booths 200, and the board renders 156 dead of 221 rows, matching an independent pre-implementation count. NOT TAGGED: both cold gates are in flight (contract review 01M35BWCJ806MT75NA630Y4WFH, code review 01M35CK8YKEKMV7T15JXEF6A8N) and the bug-hunt has not run. Per the v0.2.0 lesson, the tag waits for the gates.
This commit is contained in:
+25
-10
@@ -44,16 +44,29 @@ _As of 2026-09-22:_
|
||||
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.
|
||||
- **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
|
||||
@@ -108,6 +121,8 @@ _As of 2026-09-22:_
|
||||
|
||||
## Recent decisions
|
||||
|
||||
- `[2026-09-22]` **U6 landed — three surfaces, three jobs, one predicate** — the seam review caught three real contract defects incl. a per-row `resolve_booth` that would have 404'd the board; NOT TAGGED, gates in flight → `persistent-memory.d/2026-09-22-u6-benches-landed.md`
|
||||
- `[2026-09-22]` **The 69% link-board rot was two defects wearing one number** — READ BEFORE SCOPING ANY LINK-BOARD WORK; U5 closed the larger half and full-URL-vs-origin identity is a measured call → `persistent-memory.d/2026-09-22-one-number-was-two-defects.md`
|
||||
- `[2026-09-22]` **U3 landed — the page declares the seam, the Booth mounts into it** — ten regexes against author HTML replaced by a substring test and a `+` → `persistent-memory.d/2026-09-22-u3-declared-embed-seam-landed.md`
|
||||
- `[2026-09-22]` **A wrong-shaped answer 500s the gallery and the marks page** — PRE-EXISTING (measured at `42ea67f`), NOT U3; the v0.2.2 lesson is only half-implemented → `persistent-memory.d/2026-09-22-a-wrong-shaped-answer-500s-the-gallery.md`
|
||||
- `[2026-09-22]` **The browser became a test surface** — READ BEFORE TOUCHING `playwright` IN pyproject; the pinned upper bound is the foot-gun, and these tests SKIP rather than fail → `persistent-memory.d/2026-09-22-the-browser-became-a-test-surface.md`
|
||||
|
||||
Reference in New Issue
Block a user