diff --git a/docs/contracts/r2_flow.contract.md b/docs/contracts/r2_flow.contract.md index add534d..662f806 100644 --- a/docs/contracts/r2_flow.contract.md +++ b/docs/contracts/r2_flow.contract.md @@ -66,6 +66,15 @@ open_questions: `sorted(rel)` order over **all** items. It is assigned in the resolver loop, so no route derives it. +- `ordinal` is **appended** as the dataclass's last field, never inserted. + Mid-dataclass insertion is a positional-construction break, and `group` has + already had that conversation. +- The resolver's `quote()` guard on non-UTF-8 names stays exactly as it is. It + looks like a stray `try` around a discarded result, but it is what keeps one + 0xff filename from taking down the index for every booth. +- An item skipped by that guard takes no ordinal, so ordinals stay contiguous + over the items that render. + - **A filter never renumbers.** Under `?filter=flagged` a tile still shows the number it has in the whole set. That is the point: "#07" is a property of the item, not of the view. @@ -178,6 +187,12 @@ The side column holds: - Capped at 8, with a link to the full board. - **Pickup**: the existing upload form, unchanged, moved from the page head. +**An empty section does not render** — no heading, no box. This is the +load-bearing negative half of the kept-lane pair it replaces +(`'class="grid kept-grid"' not in html`), carried forward into test_flow.py as +a pair: present when it has rows, absent when it has none. It applies to each +of the three sections and to the Benches and Bookmarks panels. + The kept/ephemeral lanes are **removed**: 23 of 24 live booths are kept, so the lanes sort nothing. Kept status and the lifetime line (`_lifetime.html`, unchanged) remain on every row. @@ -212,7 +227,12 @@ unchanged) remain on every row. This applies to image, video and audio items. Docs keep `doc.html`. -- **The stage**: the artifact at fit size, with a 1:1 toggle for images. +- **The stage**: the artifact at fit size, with a 1:1 toggle for images ONLY. + - The toggle and its script are rendered and bound only when the stage is + an ``. + - Video and audio get their native controls and no toggle. A toggle that + renders on audio and silently no-ops (today's script binds + `getElementById('vimg')`) is the failure this names. - **The rail** (`data-region="rail"`) holds: - `#NN of M`, and position within the group; - the caption;