docs(contract): r2 — fold booth-dev's items.py notes and the empty-section negative

Ordinal is appended, not inserted. The quote() guard stays, and skipped
items take no ordinal. Empty Desk sections do not render; this carries
forward the negative half of the kept-lane pair. The 1:1 toggle is bound
only when the stage is an image.
This commit is contained in:
vh
2026-09-23 08:18:01 -07:00
parent 051599a30e
commit ea44c18d42
+21 -1
View File
@@ -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 `<img>`.
- 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;