Lane 5, PRs 4b + 5 + 6: scenes and the canvas, the quick note, Find, the players' face, the phone faces, the sweep, the recording controls (#731) #832

Merged
claude-bot merged 17 commits from build/lane5-pages into main 2026-09-26 11:28:03 +00:00
Collaborator

This is the rest of Table mode, in one PR. Three PRs were built in parallel on #829's board and integrated here, because they all touch GmTable. The overlaps were resolved so all three work together.

4b: scenes, the canvas and the quick note

  • The Scenes panel: rename, reorder with ↑ and ↓, and delete with Undo, which files the cards back. Its hint now says cards go to "Unfiled", as they do.
  • The D37 canvas:
    • the board scrolls itself, and the page doesn't at desktop widths;
    • edge counts ("2 cards further right") that scroll to the cards;
    • the board grows while you drag;
    • Whole board, then Back to 1:1.
  • The quick note (D112) in the aside, with the server's stamps in their own column. It reads "Kept in the GMs' notes for Session 14." Note versions have a word for quick_note.
  • Migration e5f7a9b1c3d4 drops the frozen shelf_cards.scene; its downgrade restores it from live scene names. It's re-chained here onto 7e5afe7a1b2c (#831), and the one-head pin is moved.

5: Find with preview (D53, IS-380)

  • Find: Ctrl K, the bar's button, or the shelf's "Find something…". It's a combobox over tonight's shelf, the wiki and the rules.
  • The preview: it shows the whole entry in the aside, with Spotlight, Show the table and Add to the shelf. Adding files the card into the scene being shown (D130).
  • Removed: ShelfPalette.

6: the players' face, the phone faces, the sweep and the recording controls

  • The players' face (TABLE-2, D121) replaces SessionTable. It polls every 8 s, and shows when it has gone stale.
  • The GM's phone face (D34): the stage, tonight's cards, Start and Stop, and End of session. There's no board, Find, notes or scenes.
  • The sweep: redrawn, with Undo on "Let go".
  • The recording panel: redrawn and shared by Table mode and the session page. RecordingPanel and ColdOpenPanel are deleted.
    • The bar's Start is held until the D123 window opens, saying when it does.
    • D116: a start re-reads the session.
    • "4 of 5 here" (D120) shows only when the server sends here.
    • The other session reads "The bot is recording Session 9 for Tomás's campaign".
  • IS-440: the start-window field in Settings → Recording, retention & AI.

Also in this PR

  • Rule cards show their level ("Creature 2") everywhere kindOf is used. That's the recommendation for the owner's pending question.
  • One helper for D130 (sceneToAddInto).
  • The preview takes focus when it opens, so on narrow screens it scrolls into view.

Tests

  • Frontend: 176 files and 2470 tests, all passing; eslint has 0 errors.
  • Backend: 266 targeted tests, plus 104 migration and notification tests after the re-chain.
  • Migrations: up, down and up on postgres 16, with one head, e5f7a9b1c3d4.
  • Journeys: the final run on the integrated branch gave 65 passed and 4 skipped, and axe was clean.
  • Render check: 2560, 1440, 1024 and 390, light and dark, with no sideways scroll at any width.

Departures are listed for the owner. Accepting them is recommended, and the owner answers in the morning.

Still to come in lane 5: PR 7 (J4 and a stateful fake bot) and PR 8 (the demo seed), both being built.

🤖 Generated with Claude Code

This is the rest of Table mode, in one PR. Three PRs were built in parallel on #829's board and integrated here, because they all touch `GmTable`. The overlaps were resolved so all three work together. **4b: scenes, the canvas and the quick note** - **The Scenes panel:** rename, reorder with ↑ and ↓, and delete with Undo, which files the cards back. Its hint now says cards go to "Unfiled", as they do. - **The D37 canvas:** - the board scrolls itself, and the page doesn't at desktop widths; - edge counts ("2 cards further right") that scroll to the cards; - the board grows while you drag; - Whole board, then Back to 1:1. - **The quick note (D112)** in the aside, with the server's stamps in their own column. It reads "Kept in the GMs' notes for Session 14." Note versions have a word for `quick_note`. - **Migration `e5f7a9b1c3d4`** drops the frozen `shelf_cards.scene`; its downgrade restores it from live scene names. **It's re-chained here onto `7e5afe7a1b2c` (#831),** and the one-head pin is moved. **5: Find with preview (D53, IS-380)** - **Find:** Ctrl K, the bar's button, or the shelf's "Find something…". It's a combobox over tonight's shelf, the wiki and the rules. - **The preview:** it shows the whole entry in the aside, with Spotlight, Show the table and Add to the shelf. Adding files the card into the scene being shown (D130). - **Removed:** `ShelfPalette`. **6: the players' face, the phone faces, the sweep and the recording controls** - **The players' face (TABLE-2, D121)** replaces `SessionTable`. It polls every 8 s, and shows when it has gone stale. - **The GM's phone face (D34):** the stage, tonight's cards, Start and Stop, and End of session. There's no board, Find, notes or scenes. - **The sweep:** redrawn, with Undo on "Let go". - **The recording panel:** redrawn and shared by Table mode and the session page. `RecordingPanel` and `ColdOpenPanel` are deleted. - **The bar's Start is held until the D123 window opens,** saying when it does. - **D116:** a start re-reads the session. - **"4 of 5 here" (D120)** shows only when the server sends `here`. - **The other session** reads "The bot is recording Session 9 for Tomás's campaign". - **IS-440:** the start-window field in Settings → Recording, retention & AI. **Also in this PR** - **Rule cards show their level** ("Creature 2") everywhere `kindOf` is used. That's the recommendation for the owner's pending question. - **One helper for D130** (`sceneToAddInto`). - **The preview takes focus when it opens,** so on narrow screens it scrolls into view. **Tests** - **Frontend:** 176 files and 2470 tests, all passing; `eslint` has 0 errors. - **Backend:** 266 targeted tests, plus 104 migration and notification tests after the re-chain. - **Migrations:** up, down and up on postgres 16, with one head, `e5f7a9b1c3d4`. - **Journeys:** the final run on the integrated branch gave 65 passed and 4 skipped, and axe was clean. - **Render check:** 2560, 1440, 1024 and 390, light and dark, with no sideways scroll at any width. **Departures** are listed for the owner. Accepting them is recommended, and the owner answers in the morning. **Still to come in lane 5:** PR 7 (J4 and a stateful fake bot) and PR 8 (the demo seed), both being built. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
# Conflicts:
#	CHANGELOG.md
Migration e5f7a9b1c3d4 on top of d4e6f8a0b2c3. Nothing reads the column:
the ORM has not mapped it since b2c4d6e8f0a1, the API answers `scene`
from the live scene's name, and the page that wrote it went in PR 4a.
The downgrade puts it back holding each card's live scene name, which
b2c4d6e8f0a1's own downgrade then relies on. The one-head pin moves to
test_drop_scene_text_migration.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The session page's recording panel is the drawing's recp: a dot and a word
for the state, the clock, who is speaking and for how long, a track falling
behind, the other session the bot is busy with (named by the server), and
End the session when I stop, on by default. Start waits for the campaign's
start window and says when it opens (D123); a refusal shows the server's
sentence. The stream, the words and Start/Stop live in recording.js, so
Table mode's bar can share them. The old RecordingPanel is gone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- The players' face (TABLE-2, D121) replaces SessionTable: what the GM has
  shown, newest first, in the drawn cards; Previously on folding away and
  back; the stale strip with the age of the last good poll; never-loaded;
  and whether the session is being recorded, from the member live read.
- The GM on a phone (D34, IS-322): the stage with its arrows, tonight's cards
  to tap, Start/Stop and End of session; no board, Find, notes or scenes.
- The sweep redrawn (TB-057 to TB-063): What to keep from tonight; Keep in the
  wiki / Next time / Let it go; Writing the draft, Draft made — review it,
  Carried to Session N, Let go with Undo; a refusal on its row with Open it
  and Next time; any other failure once at the top.
- The bar's Start and Stop (TB-008, IS-323, D35) from the recording's own
  stream, with the clock, 4 of 5 here (D120) and D123's held Start; retires
  4a's Recording link. Starting re-reads the session (D116).
- SessionTable and ColdOpenPanel are gone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Settings → Recording, retention & AI gains "Starting a recording": the
campaign's recording_start_window_minutes, 0–1440, 30 by default, checked
before anything is sent. This week's table card no longer says the table
opens by itself or that players check their notes there. A session being
played says when it began from started_at (D116). CHANGELOG.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Scenes panel (IS-318, IS-319): make, rename in place, reorder, and
delete at once with Undo, from Scenes... at the end of the scene bar.
The D37 canvas (IS-325 to IS-327): the board scrolls within itself and
the page no longer does on a desktop; cards past either side are counted
at that edge; a drag to the edge scrolls on and grows the board; Whole
board is the overview, with Back to 1:1. D117's Move and D118's scale
keep working. The quick note (IS-381, D112) beside the table, stamped by
the server, kept in the GMs' notes; not on a phone (D122). The notes
history's word for quick_note is in vocabulary.js.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Ctrl K and the bar's/shelf head's Find open a combobox over three sections:
tonight's shelf (matched locally), then the wiki and the rules from
GET /campaigns/{id}/search-all?kinds=wiki,rule once two letters are typed.
Arrows move, Enter opens the highlighted row, Escape closes. A shelf hit goes
straight to the stage; a wiki or rules hit opens a preview beside the table
instead of navigating away (TB-078) - the entry's whole face, built from the
same CardFace a shelf card uses. Spotlight, Show the table and Add to the
shelf all add-then-act: the source becomes a card, filed into the scene being
shown (D130), the first time any of the three is used.

Replaces the ShelfPalette stub; deleted along with its test. No server change
needed - PR2/PR3 already added the rule card kind and reference_entry_id
support that Find's "add a rules entry" needed.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- The players' stale strip reads as one sentence beside its icon, not three
  lines; the players' bar keeps the word Leave on a phone, as drawn.
- A sweep row's refusal keeps its icon beside its words on a phone, with
  Next time after it.
- The recording panel keeps one row per person at a phone's width.
- The phone face's Start/Stop is full size beside End of session….
- How early recording can start is a field as wide as a number.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Conflicts: GmTable's imports (4b dropped cx, 5 dropped ShelfPalette), the aside (4b made it permanent for the quick note, 5 made it conditional on the preview), the test mocks (4b's scenes API, 5's search and content packs), and CHANGELOG (4b's dropped column, 5's Find bullet).

The aside is always drawn now and holds, in the drawing's order (TABLE-1), the preview, what is shown and the quick note. A note written and a card added from the preview file by one rule, sceneToAddInto (D130), exported from SceneBar.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Conflicts: GmTable (4b's permanent aside and main column against 6's recProblem and grid, 4b's ScenesPanel against 6's dialogs block, which now holds the reveal and the sweep), the table tests' sessions mocks (4b's notes, 6's recording, kept both), TableMode.css (4b's scenes, quick note and desktop shape against 6's players' face, phone and sweep, kept all; 6's phone block wins and 4b's .qnote hide at 640px goes, the phone branch supersedes it), and CHANGELOG (both bullets).

The quick note reads whether it is stamped from 6's useRecording (rec.isLive), since GmTable no longer takes live; its test drives fetchRecordingLive. The phone's notice skips a scene-delete Undo as it does a card's.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
kindOf() said "Creature" on every rules card; the drawing says "Creature 2". It now adds snapshot.level wherever there is one, 0 and -1 included, so the board, the stage, Find, the preview, the sweep and the phone all say it.

sceneToAddInto (SceneBar) is the one rule D130 needs: the scene being shown, else none. A note written and a Find result added from the preview both use it. Tests: kindOf's levels, a rules card's foot and stage, the helper, and Find → preview → Add to the shelf filing into the scene on show with the preview above the quick note.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The render check found that at 1100px and narrower, where the aside goes under the board, a wiki or rules entry opened from Find appeared out of sight: Find closed and nothing seemed to happen. The preview now takes focus when it opens (tabIndex -1, no ring), which scrolls it into view and tells a screen reader what opened.

On the GM's phone there is no Find (D34), but Ctrl K still set it open unseen, to appear if the window widened. The listener is off on the phone face. Tests for both.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Merge main (#831) into lane 5's pages; re-chain e5f7a9b1c3d4 onto 7e5afe7a1b2c (#731)
All checks were successful
CI / Summarisation accuracy eval harness (stub provider) (pull_request) Successful in 55s
CI / Backend lint (ruff) (pull_request) Successful in 32s
CI / Feedback site tests (pull_request) Successful in 40s
CI / Bot/backend version sync (pull_request) Successful in 27s
CI / Bot tests and audit (pull_request) Successful in 2m2s
CI / Does this change touch the recording path? (pull_request) Successful in 26s
CI / Docker image build (pull_request) Successful in 29s
CI / Synthetic session harness (no GPU, no LLM) (pull_request) Has been skipped
CI / Backend migration, tests, and audit (pull_request) Successful in 26m53s
CI / End-to-end journeys (desktop, phone, keyboard-only) (pull_request) Successful in 14m46s
CI / Frontend tests, audit, and build (pull_request) Successful in 32m56s
8f00d7a24f
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign in to join this conversation.
No description provided.