Lane 4 — at the table (#659) #691

Closed
claude-bot wants to merge 0 commits from redesign/lane4-table into main
Collaborator

Refs #659, #689. At /feedback/prototype/lane4 once deployed.

TABLE-1 to TABLE-5 — 153 features: the GM's shelf, the players' view, a shared screen for the whole table, recording, and the end-of-session sweep. Built on look.html's Table mode classes (.tm, .spot, .tc, .pc), so the lane sits inside the settled look.

Decisions applied

# Decision
D33 Scenes are real, reusable things (#689), able to be empty and to pair with a Foundry map both ways
D34 Desktop-first, with a real reduced phone surface: spotlight, reveal, recording, the sweep — not the board
D35 Recording in both places: start/stop in the bar, the full panel on the session page
D36 A reveal target appears only when it can work — no Discord configured, no Discord option

Kettlebridge is drawn empty, built in prep for later that night — the state that could not exist while a scene was only the cards that carried a word. And filtered to one scene, the other cards fade in place rather than moving, which is IS-320's guardrail made visible.

One thing to confirm

The settled look drew the shelf as a grid; the product is a freeform board. look.html uses grid-template-columns: repeat(auto-fill, …), which reflows cards. The product is an absolutely-positioned board the GM drags and resizes, with persisted positions (TB-019–TB-022), and #235 made that placement sacred — unanimously.

This draws the freeform board, because every written requirement says so and look.html was deciding colour, type and shape rather than how cards behave. But a rebuild that follows the look page literally would quietly break the one guardrail the shelf was built around, so it's worth an explicit word.

Rendering caught six faults

  1. The phone bar said "recording" with a red icon and no word. Desktop says Recording; I dropped the word on the phone to save room. That's the exact fault the render check first caught in lane 2 — recording told from not-recording by colour alone, in the place it matters most — reintroduced two lanes later.
  2. The shared screen sized its type in vw, so a TV drawn at a third of the page was sized for all of it: the title wrapped, the screen outgrew 16:9, and the lost-contact bar covered the last word. Now container units — also what a real TV of any size needs.
  3. A lone shared-screen still stood 850px tall, a single item filling a whole grid row. The three states now sit side by side.
  4. A card footer broke mid-phrase — "Handout · On / the table".
  5. "Keep in the wiki" wrapped in the phone sweep.
  6. One speaker's time read "41m of speech", the other three just "28m".

And one caught before it rendered: the phone surface said "the board, scenes and card layout are on the desktop" — precisely what D20 forbids on a surface people open constantly, and D20 names Table mode outright.

Verification

  • Catalogue: D34–D36 and IS-322–IS-324 landed earlier on this branch — 1,593 rows on 102 surfaces.
  • Route in app.py, line in tests/test_app.py. 92 passed.
  • Every section rendered in headless Edge and read, in both themes. Table mode stays midnight-blue in light theme by design.

🤖 Generated with Claude Code

Refs #659, #689. At `/feedback/prototype/lane4` once deployed. `TABLE-1` to `TABLE-5` — **153 features**: the GM's shelf, the players' view, a shared screen for the whole table, recording, and the end-of-session sweep. Built on `look.html`'s Table mode classes (`.tm`, `.spot`, `.tc`, `.pc`), so the lane sits inside the settled look. ## Decisions applied | # | Decision | |---|---| | **D33** | Scenes are **real, reusable things** (#689), able to be empty and to pair with a Foundry map both ways | | **D34** | Desktop-first, with a **real reduced phone surface**: spotlight, reveal, recording, the sweep — not the board | | **D35** | Recording in **both places**: start/stop in the bar, the full panel on the session page | | **D36** | A reveal target appears **only when it can work** — no Discord configured, no Discord option | **Kettlebridge is drawn empty**, built in prep for later that night — the state that could not exist while a scene was only the cards that carried a word. And filtered to one scene, **the other cards fade in place rather than moving**, which is `IS-320`'s guardrail made visible. ## One thing to confirm **The settled look drew the shelf as a grid; the product is a freeform board.** `look.html` uses `grid-template-columns: repeat(auto-fill, …)`, which reflows cards. The product is an absolutely-positioned board the GM drags and resizes, with persisted positions (`TB-019`–`TB-022`), and #235 made that placement sacred — unanimously. This draws the **freeform board**, because every written requirement says so and `look.html` was deciding colour, type and shape rather than how cards behave. But **a rebuild that follows the look page literally would quietly break the one guardrail the shelf was built around**, so it's worth an explicit word. ## Rendering caught six faults 1. **The phone bar said "recording" with a red icon and no word.** Desktop says *Recording*; I dropped the word on the phone to save room. That's the exact fault the render check first caught in lane 2 — recording told from not-recording by colour alone, in the place it matters most — reintroduced two lanes later. 2. **The shared screen sized its type in `vw`**, so a TV drawn at a third of the page was sized for all of it: the title wrapped, the screen outgrew 16:9, and the lost-contact bar covered the last word. Now container units — also what a real TV of any size needs. 3. **A lone shared-screen still stood 850px tall**, a single item filling a whole grid row. The three states now sit side by side. 4. **A card footer broke mid-phrase** — "Handout · On / the table". 5. **"Keep in the wiki" wrapped** in the phone sweep. 6. **One speaker's time read "41m of speech"**, the other three just "28m". **And one caught before it rendered:** the phone surface said *"the board, scenes and card layout are on the desktop"* — precisely what **D20** forbids on a surface people open constantly, and D20 names Table mode outright. ## Verification - Catalogue: D34–D36 and `IS-322`–`IS-324` landed earlier on this branch — **1,593 rows on 102 surfaces**. - Route in `app.py`, line in `tests/test_app.py`. **92 passed.** - Every section rendered in headless Edge and read, in both themes. Table mode stays midnight-blue in light theme by design. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Catalogue prep for lane 4, Table mode and recording. The owner's six answers
become three decisions and three rows; the scene question became D33 (#689)
and the shared screen's scope needed no decision of its own.

  D34  desktop-first, with a real reduced surface on a phone: spotlight,
       reveal, recording and the sweep -- not the freeform board. TB-070
       hides six header controls below `sm` with no replacement today, so a
       GM at a table holding a phone gets a back link and a title. The sweep
       is in because it was desktop-only purely by accident: its button was
       one of the six.
  D35  recording in both places -- start/stop in Table mode where the GM is,
       the full panel on the session page where there is room for it.
  D36  a reveal target appears only when it can work. TB-048 is a hardcoded
       Players/Discord pair, so a campaign with no Discord shows a checkbox
       that does nothing. Same rule covers the shared screen once paired.

  IS-322  the reduced phone surface                  TABLE-1 + TABLE-5
  IS-323  start/stop recording from inside Table mode TABLE-1 + TABLE-4
  IS-324  reveal targets derived from configuration   TABLE-1 + TABLE-3

Catalogue rebuilt: 1,593 rows on 102 surfaces.

Refs #659.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
feat(feedback-site): lane 4 — at the table (#659)
All checks were successful
CI / Docker image build (pull_request) Successful in 38s
CI / Bot/backend version sync (pull_request) Successful in 48s
CI / Backend lint (ruff) (pull_request) Successful in 54s
CI / Summarisation accuracy eval harness (stub provider) (pull_request) Successful in 59s
CI / Feedback site tests (pull_request) Successful in 1m7s
CI / Bot tests and audit (pull_request) Successful in 2m23s
CI / Frontend tests, audit, and build (pull_request) Successful in 2m27s
CI / Backend migration, tests, and audit (pull_request) Successful in 8m21s
CI / Synthetic session harness (no GPU, no LLM) (pull_request) Successful in 13m55s
55d7ee9efb
TABLE-1 to TABLE-5, 153 features: the GM's shelf, the players' view, the
shared screen, recording, and the end-of-session sweep. Built on look.html's
Table mode classes so the lane sits inside the settled look.

Applies D33-D36. Scenes are drawn as real, reusable things for the first time
-- Kettlebridge is drawn empty, built in prep, which is the state that could
not exist while a scene was only the cards that carried a word. Filtered to
one scene, the other cards fade in place rather than moving, which is IS-320's
guardrail made visible.

## One thing for the owner to confirm

look.html drew the shelf as a reflowing CSS grid; the product is a freeform
board (TB-019 to TB-022) and #235 made that placement sacred, unanimously.
This draws the freeform board, because every written requirement says so and
look.html was deciding colour, type and shape rather than card behaviour. A
rebuild that followed the look page literally would break it.

## Rendering caught six faults

1. The phone bar said "recording" with a red icon and no word -- the exact
   fault the render check first caught in lane 2, reintroduced two lanes on.
2. The shared screen sized its type in vw, so a TV drawn at a third of the
   page was sized for all of it: the title wrapped, the screen outgrew 16:9,
   and the lost-contact bar covered the last word. Now container units.
3. A lone shared-screen still stood 850px tall, a single item filling a
   grid row. The three states now sit side by side.
4. A card footer broke mid-phrase ("Handout · On / the table").
5. "Keep in the wiki" wrapped in the phone sweep.
6. One speaker's time read "41m of speech", the other three just "28m".

And one caught before rendering: the phone surface pointed at the desktop
("the board, scenes and card layout are on the desktop"), which D20 forbids
on a surface people open constantly and names Table mode outright.

Route in app.py and a line in tests/test_app.py. 92 passed. Rendered and read
in both themes.

Refs #659, #689.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Author
Collaborator

Merged to main in 3407c4a and deployed. Closing by hand; the API merge returns 422 on this repo.

CATALOGUE.md rebuilt from the merged sources and checked against what git produced: identical, 1,593 rows on 102 surfaces. Live at /feedback/prototype/lane4; container healthy, the six responses intact, all five lane routes 200.

Still open for the owner: whether the shelf is a freeform board (as drawn, per #235 and TB-019–TB-022) or look.html's reflowing grid.

Merged to `main` in 3407c4a and deployed. Closing by hand; the API merge returns 422 on this repo. `CATALOGUE.md` rebuilt from the merged sources and checked against what git produced: identical, 1,593 rows on 102 surfaces. Live at `/feedback/prototype/lane4`; container healthy, the six responses intact, all five lane routes 200. **Still open for the owner:** whether the shelf is a freeform board (as drawn, per #235 and `TB-019`–`TB-022`) or `look.html`'s reflowing grid.
claude-bot closed this pull request 2026-09-18 02:51:41 +00:00
All checks were successful
CI / Docker image build (pull_request) Successful in 38s
Required
Details
CI / Bot/backend version sync (pull_request) Successful in 48s
Required
Details
CI / Backend lint (ruff) (pull_request) Successful in 54s
Required
Details
CI / Summarisation accuracy eval harness (stub provider) (pull_request) Successful in 59s
Required
Details
CI / Feedback site tests (pull_request) Successful in 1m7s
Required
Details
CI / Bot tests and audit (pull_request) Successful in 2m23s
Required
Details
CI / Frontend tests, audit, and build (pull_request) Successful in 2m27s
Required
Details
CI / Backend migration, tests, and audit (pull_request) Successful in 8m21s
Required
Details
CI / Synthetic session harness (no GPU, no LLM) (pull_request) Successful in 13m55s
Required
Details

Pull request closed

Sign in to join this conversation.
No description provided.