From f43a41fb4929a72e4dc9fea33ea016b9e5ba539f Mon Sep 17 00:00:00 2001 From: Vuong Hoang Date: Wed, 23 Sep 2026 10:29:09 -0700 Subject: [PATCH] docs(roadmap): R2's nine ordering rows, and the zoom-ring row REPLACED not amended MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Lifted from r2_flow's INV-2 table rather than rewritten, so the contract and the roadmap cannot drift into two statements of one rule. The zoom-ring row is replaced because review_chain filters to media, not images — 'filtered to images' is now false, and a stale row is invariant 6 failing quietly, which is the only way it ever fails. The ordinal row is the one worth reading: an ordinal counted across ALL items makes '#07' the same tile under every filter. The operator refers to artifacts positionally, and the filters we shipped in U7 had quietly broken that — 'the third one' meant something different depending on which filter was on. Nothing on our side noticed; design-dev proposed it unprompted. --- ROADMAP.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/ROADMAP.md b/ROADMAP.md index 4df2600..d2dc179 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -95,7 +95,15 @@ Where it already binds, and what the rule is in each case: | collection | rule | |---|---| | items in a booth | `sorted(rel)` — byte order over the booth-relative path (U1 INV-3) | -| the zoom prev/next ring | the item order, filtered to images — same sequence, one source | +| the review prev/next ring | the item order, **filtered to media** — image, video and audio (`review_chain`, R2). Supersedes `image_chain`, which stays importable and unchanged for its other callers | +| an item's ordinal (`#NN`) | its position in `sorted(rel)` — **counted across ALL items, so `#07` is the same tile under every filter.** This is what makes the operator's "the third one" mean one thing, which the filters had quietly broken (R2) | +| the filmstrip and the tape | the review ring | +| the flag tray | **by ordinal** — the tray reads in the same direction as the grid (R2). The notes list keeps `(created, id)` | +| the Desk's sections | fixed: needs you → new since you looked → everything else (R2) | +| within *needs you* | `(open_since, name)` | +| within *new since you looked* | `(-landed_at, name)` | +| within *everything else* | `list_booths` order: `(mtime, name)` descending | +| the Desk's bookmarks column | `order_for_display` — pinned first, then newest | | caption sidecar resolution | sorted scan, so two media files sharing a stem resolve the same way every time (a real non-determinism U1 removed) | | marks in a booth | `(created, id)` — time, with the id as tie-break so two marks written in the same second cannot swap | | legacy ask import | `(mtime, name)`, which is the order `list_asks` gave them |