Build lane 5: the table (TABLE-1 to TABLE-5) #731

Closed
opened 2026-09-22 00:12:23 +00:00 by claude-bot · 5 comments
Collaborator

Build lane 5 of the v4.5.0 redesign. The brief is docs/design/v4.5.0-brief.md (§9, the lanes in order); the build plan is docs/design/v4.5.0-build-plan.md (the rollout rule, the design-system mapping, the journeys as tests). Umbrella: #366. Goes after lane 4.

Scope

Surfaces: TABLE-1 to TABLE-5: the GM face and the player face of Table mode, scenes, the shelf, Find, the shared-screen seam, the recording panel.
The drawing: /feedback/prototype/lane4 — the page the build must match, still by still.
Decisions: the brief §7, and each surface's header in redesign-surfaces/sources/headers.md.

Server changes it needs (in this lane or an earlier one)

  • scenes as a table with Foundry pairing (#689); Find with preview (IS-380); the quick note (IS-381)
  • the shared-screen seam (#542) drawn, not built; the recording source other than Discord voice stays a seam

Acceptance

  • Every placement coverage/lane4.py classifies as drawn or replaced is built as the prototype draws it; the script is the checklist. Rows it marks behaviour are tested, not drawn.
  • J4 (start recording, run the table, reveal, take notes, stop) pass on desktop, on a phone and keyboard-only in the journeys suite (#726), with the axe scan clean (WCAG 2.2 AA, #367).
  • The brief's vocabulary (§5) throughout, from vocabulary.js; no page-level error destroys rendered content; every async operation shows progress and a next action on failure; disabled controls say why.
  • Main stays deployable after every PR of the lane: the new shell carries the old pages until each is replaced (the rollout rule).
  • The surfaces' headers in redesign-surfaces/sources/headers.md (Decided lines and the owner's review notes) are honoured; a departure is a decision change on #659 first.

Notes

  • The card's face for a creature is lane 11's block; until then the card shows today's stat block.

🤖 Generated with Claude Code

**Build lane 5 of the v4.5.0 redesign.** The brief is `docs/design/v4.5.0-brief.md` (§9, the lanes in order); the build plan is `docs/design/v4.5.0-build-plan.md` (the rollout rule, the design-system mapping, the journeys as tests). Umbrella: #366. Goes after lane 4. ## Scope **Surfaces:** TABLE-1 to TABLE-5: the GM face and the player face of Table mode, scenes, the shelf, Find, the shared-screen seam, the recording panel. **The drawing:** `/feedback/prototype/lane4` — the page the build must match, still by still. **Decisions:** the brief §7, and each surface's header in `redesign-surfaces/sources/headers.md`. ## Server changes it needs (in this lane or an earlier one) - scenes as a table with Foundry pairing (#689); Find with preview (`IS-380`); the quick note (`IS-381`) - the shared-screen seam (#542) drawn, not built; the recording source other than Discord voice stays a seam ## Acceptance - [ ] Every placement `coverage/lane4.py` classifies as **drawn** or **replaced** is built as the prototype draws it; the script is the checklist. Rows it marks **behaviour** are tested, not drawn. - [ ] J4 (start recording, run the table, reveal, take notes, stop) pass on desktop, on a phone and keyboard-only in the journeys suite (#726), with the axe scan clean (WCAG 2.2 AA, #367). - [ ] The brief's vocabulary (§5) throughout, from `vocabulary.js`; no page-level error destroys rendered content; every async operation shows progress and a next action on failure; disabled controls say why. - [ ] Main stays deployable after every PR of the lane: the new shell carries the old pages until each is replaced (the rollout rule). - [ ] The surfaces' headers in `redesign-surfaces/sources/headers.md` (Decided lines and the owner's review notes) are honoured; a departure is a decision change on #659 first. ## Notes - The card's face for a creature is lane 11's block; until then the card shows today's stat block. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Author
Collaborator

Picking this up (2026-09-25). The owner gave the go-ahead for lane 5 after the lanes 1–4 review.

Order:

  1. A planning survey, running now. Its owner questions come back as L1… before any build.
  2. The build begins once R2's wide-screen layout (D110) merges, so the table's pages are built in the new frame.

Also in this lane: per the build plan's §7 rule (#821), lane 5 extends the dev demo seed with whatever it builds.

**Picking this up (2026-09-25).** The owner gave the go-ahead for lane 5 after the lanes 1–4 review. **Order:** 1. A planning survey, running now. Its owner questions come back as L1… before any build. 2. The build begins once R2's wide-screen layout (D110) merges, so the table's pages are built in the new frame. **Also in this lane:** per the build plan's §7 rule (#821), lane 5 extends the dev demo seed with whatever it builds.
Author
Collaborator

The survey is done, and the owner accepted every recommendation (2026-09-25). The answers become D111–D122:

  • L1 → D111. /table is Table mode for everyone: the GM face for GMs, the players' face otherwise. /shelf redirects there, and "Players' view" opens /table?view=players in a new tab. This also fixes today's bug, where every "Open the table" link lands a GM on the players' read-only view.
  • L2 → D112. The GM's quick note goes into the GMs-only note, worded "Kept in the GMs' notes for Session N". This amends D54 in the light of D97.
  • L3 → D113. Scenes are built now. Foundry map pairing stays a seam until v5.0.0, and IS-321 is deferred.
  • L4 → D114. Scene names that repeat across sessions are merged at migration, ignoring case and spacing.
  • L5 → D115. The six drawn rows with no server are deferred to their home issues. With only Discord available, there is no "Record from" choice.
  • L6 → D116. Starting the recording starts the session (in progress, with started_at), and the server enforces D10.
  • L7 → D117. Each card's menu gains Move and Resize (arrow keys, then Enter). Single-key shortcuts work only while the board or stage has focus; Ctrl K stays global. This covers WCAG 2.5.7 and 2.1.4.
  • L8 → D118. The board scales with D110's type, and stored pixel geometry is unchanged.
  • L9 → D119. "Add a card" opens a menu: "Find something…" or "Write a note".
  • L10 → D120. "N of M here" counts players in the Discord voice channel, matched through linked accounts, and shows only while recording.
  • L11 → D121. The players' face is built as drawn. This week's promises are reworded to what's true, and there is no auto-open.
  • L12 → D122. On a phone, J4 takes its note from the session page's Notes panel.

The PR series, from the survey:

# What it does
0 Decisions and the lane4.py reclassification (in progress)
1 Server: scenes
2 Server: rules cards, removal with undo, and the fix for pinned cards coming back after removal
3 Server: the quick note, D10 and D116, recording presence
4a Pages: Table mode's frame, the GM board and the routing fix
4b Pages: scenes, the canvas and the quick note
5 Pages: Find with preview
6 Pages: the players' face, phone faces, the sweep and the recording redraw
7 J4 with a stateful fake bot
8 The demo seed

No bot contract change is needed. The pages wait for R2 (D110) to merge.

**The survey is done, and the owner accepted every recommendation (2026-09-25).** The answers become D111–D122: - **L1 → D111.** `/table` is Table mode for everyone: the GM face for GMs, the players' face otherwise. `/shelf` redirects there, and "Players' view" opens `/table?view=players` in a new tab. This also fixes today's bug, where every "Open the table" link lands a GM on the players' read-only view. - **L2 → D112.** The GM's quick note goes into the GMs-only note, worded "Kept in the GMs' notes for Session N". This amends D54 in the light of D97. - **L3 → D113.** Scenes are built now. Foundry map pairing stays a seam until v5.0.0, and IS-321 is deferred. - **L4 → D114.** Scene names that repeat across sessions are merged at migration, ignoring case and spacing. - **L5 → D115.** The six drawn rows with no server are deferred to their home issues. With only Discord available, there is no "Record from" choice. - **L6 → D116.** Starting the recording starts the session (in progress, with `started_at`), and the server enforces D10. - **L7 → D117.** Each card's menu gains Move and Resize (arrow keys, then Enter). Single-key shortcuts work only while the board or stage has focus; Ctrl K stays global. This covers WCAG 2.5.7 and 2.1.4. - **L8 → D118.** The board scales with D110's type, and stored pixel geometry is unchanged. - **L9 → D119.** "Add a card" opens a menu: "Find something…" or "Write a note". - **L10 → D120.** "N of M here" counts players in the Discord voice channel, matched through linked accounts, and shows only while recording. - **L11 → D121.** The players' face is built as drawn. This week's promises are reworded to what's true, and there is no auto-open. - **L12 → D122.** On a phone, J4 takes its note from the session page's Notes panel. **The PR series, from the survey:** | # | What it does | |---|---| | 0 | Decisions and the `lane4.py` reclassification (in progress) | | 1 | Server: scenes | | 2 | Server: rules cards, removal with undo, and the fix for pinned cards coming back after removal | | 3 | Server: the quick note, D10 and D116, recording presence | | 4a | Pages: Table mode's frame, the GM board and the routing fix | | 4b | Pages: scenes, the canvas and the quick note | | 5 | Pages: Find with preview | | 6 | Pages: the players' face, phone faces, the sweep and the recording redraw | | 7 | J4 with a stateful fake bot | | 8 | The demo seed | No bot contract change is needed. The pages wait for R2 (D110) to merge.
Author
Collaborator

The server side is built. PRs open once #823 and R2 merge.

The three PRs:

  • PR 1, scenes (build/lane5-p1-scenes, migration b2c4d6e8f0a1)
    • A scenes table. Repeated names can't coexist, ignoring case and spacing (D114); there's no Foundry column (D113).
    • The migration backfills the old per-card scene text.
    • A pin follows the card's latest filing.
  • PR 2, the cards (build/lane5-p2-cards, migration c3d5e7f9a1b2, on top of PR 1)
    • Removal is now a soft delete with POST …/restore (D12's undo). This fixes a bug where carried cards came back within 20 seconds of being removed, in both the shelf and the sweep.
    • Rule cards (card_kind: rule), note cards with title and text (D119), pronouns and stat blocks on lore cards, and scene_id when a card is added.
  • PR 3, live (build/lane5-p3-live, migration d4e6f8a0b2c3, to be re-chained onto c3d5e7f9a1b2 at merge)
    • The quick note (POST …/notes/quick): server-stamped, and a GM's note goes to the GMs-only note (D112).
    • /record/start enforces D10 and flips the session to in progress with started_at (D116).
    • /record/live and the stream carry here (D120) and other.
    • Bot: each speaker carries in_channel. Discord's /record start now goes through the backend first, via a new additive POST /api/bot/sessions/{id}/recording-started. An older backend's bare 404 means "record as before", while "Session not found" refuses.
    • No BOT_CONTRACT_VERSION bump.

Checked:

  • the full backend suite on PRs 1 and 2 together: 4477 passed;
  • PR 3's targeted tests: 405 backend, plus the full bot suite: 461;
  • every migration up, down and up.

Known gaps, to follow up:

  • Re-importing a rules pack deletes and recreates its records, which unlinks rule cards (reference_entry_id → NULL). The snapshot keeps pack_id and slug for a re-link, but nothing re-links them yet.
  • From the survey's PR 2 row, still to do in the page PRs: the shelf's _session_label should say "Session N" (D86), and promote's 422 should carry the entry id.
  • A D116 consequence, shared with the owner: an early test recording puts the session in progress, and it then auto-completes 8 hours after that start.
  • Note versions gain the source quick_note; the notes history UI needs a word for it.
**The server side is built. PRs open once #823 and R2 merge.** **The three PRs:** - **PR 1, scenes** (`build/lane5-p1-scenes`, migration `b2c4d6e8f0a1`) - A `scenes` table. Repeated names can't coexist, ignoring case and spacing (D114); there's no Foundry column (D113). - The migration backfills the old per-card scene text. - A pin follows the card's latest filing. - **PR 2, the cards** (`build/lane5-p2-cards`, migration `c3d5e7f9a1b2`, on top of PR 1) - Removal is now a soft delete with `POST …/restore` (D12's undo). This fixes a bug where carried cards came back within 20 seconds of being removed, in both the shelf and the sweep. - Rule cards (`card_kind: rule`), note cards with title and text (D119), pronouns and stat blocks on lore cards, and `scene_id` when a card is added. - **PR 3, live** (`build/lane5-p3-live`, migration `d4e6f8a0b2c3`, to be re-chained onto `c3d5e7f9a1b2` at merge) - The quick note (`POST …/notes/quick`): server-stamped, and a GM's note goes to the GMs-only note (D112). - `/record/start` enforces D10 and flips the session to in progress with `started_at` (D116). - `/record/live` and the stream carry `here` (D120) and `other`. - **Bot:** each speaker carries `in_channel`. Discord's `/record start` now goes through the backend first, via a new additive `POST /api/bot/sessions/{id}/recording-started`. An older backend's bare 404 means "record as before", while "Session not found" refuses. - No `BOT_CONTRACT_VERSION` bump. **Checked:** - the full backend suite on PRs 1 and 2 together: 4477 passed; - PR 3's targeted tests: 405 backend, plus the full bot suite: 461; - every migration up, down and up. **Known gaps, to follow up:** - Re-importing a rules pack deletes and recreates its records, which unlinks rule cards (`reference_entry_id` → NULL). The snapshot keeps `pack_id` and `slug` for a re-link, but nothing re-links them yet. - From the survey's PR 2 row, still to do in the page PRs: the shelf's `_session_label` should say "Session N" (D86), and promote's 422 should carry the entry id. - **A D116 consequence, shared with the owner:** an early test recording puts the session in progress, and it then auto-completes 8 hours after that start. - Note versions gain the source `quick_note`; the notes history UI needs a word for it.
Author
Collaborator

Lane 5 is complete (2026-09-26). It's left open for the owner's review.

Merged:

  • #826: decisions D111–D124, the lane4.py reclassification, IS-439 and IS-440.
  • #827, the server: scenes as their own table (D113, D114), and the shelf's cards. That means soft removal with restore, which fixes carried cards coming back 20 s after removal, plus rule cards, note cards (D119), and pronouns and stat blocks on cards.
  • #828, the server and bot:
    • the quick note (D112);
    • recording starts the session (D116), with D10 enforced;
    • the per-campaign start window (D123, default 30 min);
    • "N of M here" from voice presence (D120);
    • the other session's name;
    • Discord's /record start now goes through the backend. This is an additive bot route with no contract bump.
  • #829, pages: Table mode's frame, the GM's board, the D111 routing fix, keyboard Move and Resize (D117), and the board scaling with D110 (D118). D125–D130 are the owner's yeses to its departures.
  • #832, pages: the Scenes panel and D37 canvas, Find with preview (D53), the players' face (D121), the GM's phone face, the sweep's redraw, the recording panel and bar controls, and the IS-440 field. It also adds rule levels on cards.
  • #833:
    • J4, with a stateful fake bot, green twice on desktop, phone and keyboard. It found and fixed two bugs: the preview read the lore wrapper, and a scrolling card region wasn't focusable.
    • Lane 5's rows in the dev demo seed.

For the owner's morning list: the departures of 4b, 5 and 6, recommended to accept.

Follow-ups:

  • #824, "Test the bot" (D124, to be drawn first, proposed for lane 10);
  • #830, the export lacks the shelf, prep and arcs;
  • a rules-pack re-import unlinks rule cards (the snapshot keeps pack_id and slug for a re-link);
  • reveals don't carry a card kind yet, so players see only the time.

Dev gets all of this at the next deploy plus a demo-seed re-run, when the owner asks.

**Lane 5 is complete (2026-09-26).** It's left open for the owner's review. **Merged:** - **#826:** decisions D111–D124, the `lane4.py` reclassification, IS-439 and IS-440. - **#827, the server:** scenes as their own table (D113, D114), and the shelf's cards. That means soft removal with restore, which fixes carried cards coming back 20 s after removal, plus rule cards, note cards (D119), and pronouns and stat blocks on cards. - **#828, the server and bot:** - the quick note (D112); - recording starts the session (D116), with D10 enforced; - the per-campaign start window (D123, default 30 min); - "N of M here" from voice presence (D120); - the other session's name; - Discord's `/record start` now goes through the backend. This is an additive bot route with no contract bump. - **#829, pages:** Table mode's frame, the GM's board, the D111 routing fix, keyboard Move and Resize (D117), and the board scaling with D110 (D118). D125–D130 are the owner's yeses to its departures. - **#832, pages:** the Scenes panel and D37 canvas, Find with preview (D53), the players' face (D121), the GM's phone face, the sweep's redraw, the recording panel and bar controls, and the IS-440 field. It also adds rule levels on cards. - **#833:** - **J4,** with a stateful fake bot, green twice on desktop, phone and keyboard. It found and fixed two bugs: the preview read the lore wrapper, and a scrolling card region wasn't focusable. - **Lane 5's rows in the dev demo seed.** **For the owner's morning list:** the departures of 4b, 5 and 6, recommended to accept. **Follow-ups:** - #824, "Test the bot" (D124, to be drawn first, proposed for lane 10); - #830, the export lacks the shelf, prep and arcs; - a rules-pack re-import unlinks rule cards (the snapshot keeps `pack_id` and `slug` for a re-link); - reveals don't carry a card kind yet, so players see only the time. **Dev** gets all of this at the next deploy plus a demo-seed re-run, when the owner asks.
Author
Collaborator

Closing with the v4.5.0 milestone (owner, 17 Oct 2026). The owner signed this lane off on 5 Oct, and it shipped in 4.5.0 on 12 Oct; fixes found on prod since went into 4.5.1 to 4.5.3.

Closing with the v4.5.0 milestone (owner, 17 Oct 2026). The owner signed this lane off on 5 Oct, and it shipped in 4.5.0 on 12 Oct; fixes found on prod since went into 4.5.1 to 4.5.3.
Sign in to join this conversation.
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
rbrooks/Quest-Board#731
No description provided.