From 54c1e7c60f30f6d637e781ee9b505e1587c1015a Mon Sep 17 00:00:00 2001 From: Vuong Hoang Date: Mon, 21 Sep 2026 23:48:30 -0700 Subject: [PATCH] =?UTF-8?q?feat(marks)!:=20v0.2.0=20=E2=80=94=20marks=20re?= =?UTF-8?q?places=20asks,=20and=20the=20CLI=20surface=20moves=20with=20it?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The release that closes U2. Consumers have to adapt, which is what makes this a minor rather than a patch: three things a scripted session can notice. * `booth asks ` now emits JSON, not the old aligned human table. Anything parsing those columns breaks. `booth marks ` is the name to use; `asks` survives as a deprecated alias for the muscle memory. * Polling `http://…/b//.answer.json` will 404 forever. There is no per-question answer sidecar any more. `GET /b//marks.json` replaces it and answers for the whole booth in one request — including an `open` list. * `#ask-` page anchors are now `#mark-`, and `/b//asks` 308s to `/b//marks`. What a session GAINS: the operator can now attach a note to any item or to the booth, and flag individual items — both readable with `booth marks`. Selecting winners out of a set used to be a chat message. Nothing a session already wrote is lost. Legacy `*.ask.json` / `*.answer.json` sidecars are imported by `booth marks-import `, idempotently, and are never deleted. No lockfile step: this repo tracks none (uv.lock is gitignored, 790d5ba). --- ROADMAP.md | 9 ++++++--- pyproject.toml | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/ROADMAP.md b/ROADMAP.md index 3fd62cc..c4d3365 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -1,7 +1,7 @@ # The Booth — roadmap Design: [`docs/design/information-architecture.md`](docs/design/information-architecture.md). -Current version: `0.1.15` (the accreted service, extracted from eshpfi 2026-09-21). +Current version: `0.2.0` (U1 + U2 landed; extracted from eshpfi 2026-09-21). ## v1 target @@ -10,8 +10,8 @@ defect — not a wish. The measurements are in the IA doc. | # | capability | closes | unit | |---|---|---|---| -| 1 | **One item record** — resolved once, carried to gallery, zoom, doc, zip | captions never reach the zoom view (never sent, not lost) | U1 | -| 2 | **Marks** — `pick` / `note` / `flag`, one primitive, one read path | 5 mechanisms for 1 job; operator→session loop runs through chat | U2 | +| 1 | ~~**One item record**~~ — **landed `ce598b3`** | captions never reach the zoom view (never sent, not lost) | U1 | +| 2 | ~~**Marks**~~ — **landed `c7f9437`, released `v0.2.0`** | 5 mechanisms for 1 job; operator→session loop runs through chat | U2 | | 3 | **Declared embed seam** — `/_booth/embed.js`, chrome mounts via DOM | 6 regexes injected into arbitrary author HTML, load-bearing for asks | U3 | | 4 | **Derived lifetime** — open marks pin; viewing is activity | 54% of booths on the `.forever` escape hatch | U4 | | 5 | **Self-announcing booths** — `.booth.json`, provenance on the index | job 5 had no home, so it lived on the link board as 145 dead rows | U5 | @@ -22,6 +22,9 @@ Ordering is dependency-driven, not priority-driven: **U1 → U2 → {U3, U4, U5} U7**, with **U6 independent** of all of them (different storage, different surface) and therefore the safest thing to land first or in parallel. +**U1 and U2 are landed**, which unblocks U3, U4 and U5 — all three read marks. +**U5 is next** (operator, 2026-09-21). U6 remains independent and unstarted. + ### Cross-cutting invariant — deterministic order, everywhere **Every ordered collection the Booth renders must have a stated, deterministic diff --git a/pyproject.toml b/pyproject.toml index 4ec8ecd..edaac27 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "booth" -version = "0.1.15" +version = "0.2.0" description = "The Booth — a dead-simple standing web server that scans a data dir of drop-folders and renders each as an ephemeral media 'booth' (image/webm/audio auto-gallery, or a folder's own index.html verbatim). Also accepts browser/curl uploads for pickup under a human-readable id. 24h TTL, then the folder is wiped. Fleet tool for CC sessions to surface A/B and smoke results to the operator." requires-python = ">=3.11" dependencies = [