Lane 3 — the session, start to finish (#659) #686

Closed
claude-bot wants to merge 0 commits from redesign/lane3-sessions into main
Collaborator

Refs #659. At /feedback/prototype/lane3 once deployed.

SESS-1 to SESS-7 — 166 features, drawn as one page through five lives rather than six unrelated screens: proposed while people vote on a time, confirmed, cancelled, and afterwards the Read and Review tabs, plus the notes panel.

This lane was lane 2's. #659 scoped it as "This week, the session lifecycle, Members, Settings". Settings grew to 109 features, forced the 2/2b split, and the session pages were dropped — 2b closed out Settings rather than the lane, so nothing flagged it.

The six decisions, taken before drawing

# Decision
D27 GM review is a tab, not a layer over the reading view
D28 the post-session checklist is the GM's — SE-095–SE-102 are catalogued member, so today every player reads "Recap email: Sent"
D29 the voting grid transposes on a phone
D30 one notes panel with an audience switch (provisional — drawn for you to judge)
D31 pending event corrections are persisted server-side (IS-317)
D32 the session Talk tab defers to lane 6, which owns the thread model

Plus IS-316 for the notes audience switch.

And two decisions that were invisible. D17 and D20 are recorded in the decisions table as governing SESS-1/2/3 and TABLE-1, but no Decided line appeared on any of those surfaces, unlike every other decision. Anyone reading the surface block — which is what you read when you draw it — would have missed both.

Rendering it caught six faults, two of them in the shared kit

  1. Four of five rows of the voting grid were empty. .dot has a width and height and no display, so a bare inline span collapses to nothing. Every existing caller happens to put one inside a flex row; a table cell is not one. Fixed in kit.css — this was about to bite lanes 4–8 too.
  2. A Session 14 page said "Session 13" in its own Contents. shell.js hardcoded the sub-list heading whenever the active key was session13, which was true for look.html because it only ever drew one session.
  3. Four of five rows read as colour alone — the reader's own vote said "Yes", everyone else's was a bare dot. IS-295's exact failure, with the roster directly beneath already doing it correctly.
  4. Two slots tied on seven points and only one carried the best-slot star.
  5. Ade voted on every slot while the roster beneath said she had not answered — lane 2's fault again, a count disagreeing with its own list.
  6. "Who was there" showed RSVPs on a session already played — "Maybe" for Nix, "Out" for Sister Quill — directly beneath a banner saying four voices had been matched.

Three things in the code the drawing had to work around

  • A reload silently discards a GM's corrections. Strikes, rewordings and relabels live in local state until Regenerate; SE-154's leave-page guard is the only net. D31/IS-317.
  • The recording panel has no lifecycle gate at all (SE-157) — Start and Stop stay live on a completed and a cancelled session. Drawing SESS-5 from D9 rather than today's behaviour is what makes that visible.
  • An in-progress session has no badge colour (STATUS_CLASSES has no entry), so every state is drawn with a word.

Verification

  • Catalogue rebuilt: 1,586 rows on 102 surfaces.
  • Route in app.py, line in tests/test_app.py. 89 passed.
  • Every section rendered in headless Edge and read, in both themes.

What's left of the original lane 3

Table mode and recording — TABLE-1 to TABLE-5, 153 features, of which TABLE-1 alone is 101 and is the largest surface anywhere. Its biggest question is already visible: six header controls hidden below the phone breakpoint with no replacement (TB-070).

🤖 Generated with Claude Code

Refs #659. At `/feedback/prototype/lane3` once deployed. `SESS-1` to `SESS-7` — **166 features**, drawn as **one page through five lives** rather than six unrelated screens: proposed while people vote on a time, confirmed, cancelled, and afterwards the Read and Review tabs, plus the notes panel. **This lane was lane 2's.** #659 scoped it as *"This week, the session lifecycle, Members, Settings"*. Settings grew to 109 features, forced the 2/2b split, and the session pages were dropped — 2b closed out Settings rather than the lane, so nothing flagged it. ## The six decisions, taken before drawing | # | Decision | |---|---| | **D27** | GM review is a **tab**, not a layer over the reading view | | **D28** | the post-session checklist is the **GM's** — `SE-095`–`SE-102` are catalogued `member`, so today every player reads "Recap email: Sent" | | **D29** | the voting grid **transposes** on a phone | | **D30** | one notes panel with an **audience switch** (*provisional — drawn for you to judge*) | | **D31** | pending event corrections are **persisted server-side** (`IS-317`) | | **D32** | the session Talk tab **defers to lane 6**, which owns the thread model | Plus `IS-316` for the notes audience switch. **And two decisions that were invisible.** D17 and D20 are recorded in the decisions table as governing `SESS-1/2/3` and `TABLE-1`, but **no `Decided` line appeared on any of those surfaces**, unlike every other decision. Anyone reading the surface block — which is what you read when you draw it — would have missed both. ## Rendering it caught six faults, two of them in the shared kit 1. **Four of five rows of the voting grid were empty.** `.dot` has a width and height and *no `display`*, so a bare inline span collapses to nothing. Every existing caller happens to put one inside a flex row; a table cell is not one. Fixed in `kit.css` — this was about to bite lanes 4–8 too. 2. **A Session 14 page said "Session 13" in its own Contents.** `shell.js` hardcoded the sub-list heading whenever the active key was `session13`, which was true for `look.html` because it only ever drew one session. 3. **Four of five rows read as colour alone** — the reader's own vote said "Yes", everyone else's was a bare dot. `IS-295`'s exact failure, with the roster directly beneath already doing it correctly. 4. **Two slots tied on seven points** and only one carried the best-slot star. 5. **Ade voted on every slot while the roster beneath said she had not answered** — lane 2's fault again, a count disagreeing with its own list. 6. **"Who was there" showed RSVPs on a session already played** — "Maybe" for Nix, "Out" for Sister Quill — directly beneath a banner saying four voices had been matched. ## Three things in the code the drawing had to work around - **A reload silently discards a GM's corrections.** Strikes, rewordings and relabels live in local state until Regenerate; `SE-154`'s leave-page guard is the only net. D31/`IS-317`. - **The recording panel has no lifecycle gate at all** (`SE-157`) — Start and Stop stay live on a completed *and* a cancelled session. Drawing `SESS-5` from D9 rather than today's behaviour is what makes that visible. - **An in-progress session has no badge colour** (`STATUS_CLASSES` has no entry), so every state is drawn with a word. ## Verification - Catalogue rebuilt: **1,586 rows on 102 surfaces**. - Route in `app.py`, line in `tests/test_app.py`. **89 passed.** - Every section rendered in headless Edge and read, in both themes. ## What's left of the original lane 3 Table mode and recording — `TABLE-1` to `TABLE-5`, **153 features**, of which `TABLE-1` alone is 101 and is the largest surface anywhere. Its biggest question is already visible: six header controls hidden below the phone breakpoint with no replacement (`TB-070`). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Catalogue prep for lane 3, the session lifecycle -- which #659 scoped into
lane 2 ("This week, the session lifecycle, Members, Settings") and which lane
2 never drew: Settings turned out to be 109 rows, forced the 2/2b split, and
the session pages were quietly dropped. SESS-1 to SESS-7 is 165 rows and no
mockup touches any of it.

Six decisions from the owner, recorded in the intro and on the surfaces they
govern:

  D27  GM review is a tab, not a layer over the reading view
  D28  the post-session checklist is the GM's, not every member's
  D29  the voting grid transposes on a phone
  D30  one notes panel with an audience switch (provisional)
  D31  pending event corrections are persisted server-side
  D32  the session Talk tab defers to lane 6, which owns the thread model

D28 is the D14 shape again: SE-095 to SE-102 are all catalogued `member`, so
every player reads "Recap email: Sent" and "Journal entry: Queued". Nobody
chose that; it is what the page does.

Two of them create real scope, so they get rows rather than only a drawing:

  IS-316  one notes panel with an audience switch (SESS-7), using #593's
          single audience model instead of a fourth bespoke one
  IS-317  pending event corrections survive a reload (SESS-4) -- today they
          are local state only, and a GM correcting a long transcript can
          lose the lot to a stray refresh

## Two decisions were invisible to anyone drawing these surfaces

D17 (one time, the reader's own) and D20 (no explanatory callouts) are
recorded in the intro table as governing SESS-1/2/3 and TABLE-1, but no
"Decided" line appeared on any of those headers -- unlike every other
decision, which does carry one. Someone reading the surface block, which is
what you read when you draw it, would have missed both. Added.

Catalogue rebuilt: 1,586 rows on 102 surfaces.

Refs #659.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
feat(feedback-site): lane 3 — the session, start to finish (#659)
All checks were successful
CI / Bot/backend version sync (pull_request) Successful in 59s
CI / Backend lint (ruff) (pull_request) Successful in 1m2s
CI / Feedback site tests (pull_request) Successful in 1m14s
CI / Summarisation accuracy eval harness (stub provider) (pull_request) Successful in 1m33s
CI / Bot tests and audit (pull_request) Successful in 2m39s
CI / Frontend tests, audit, and build (pull_request) Successful in 3m7s
CI / Docker image build (pull_request) Successful in 5m4s
CI / Backend migration, tests, and audit (pull_request) Successful in 12m20s
CI / Synthetic session harness (no GPU, no LLM) (pull_request) Successful in 13m44s
24239e2de5
SESS-1 to SESS-7, drawn as one page through five lives rather than six
unrelated screens: proposed while people vote on a time, confirmed,
cancelled, and afterwards the Read and Review tabs, plus notes. 166 features.

Applies the six decisions taken before drawing (D27-D32) and the two that
were recorded in the catalogue but never written onto the surfaces they
govern (D17, D20).

## Rendering it caught six faults, two of them in the shared kit

1. Four of five rows of the voting grid were empty. `.dot` has a width and a
   height and no `display`, so a bare inline span collapses to nothing --
   every existing caller happens to put one inside a flex row, and a table
   cell is not one. Fixed in kit.css, so the next lane that reaches for a dot
   outside a flex parent does not lose an evening to it.
2. A Session 14 page said "Session 13" in its own Contents: shell.js
   hardcoded the sub-list heading whenever the active key was `session13`,
   which was true for look.html because it only ever drew one session. It now
   prefers what the caller passes.
3. Four of five rows read as colour alone -- the reader's own vote said
   "Yes", everyone else's was a bare coloured dot. IS-295's exact failure,
   with the roster directly beneath already doing it correctly.
4. Two slots tied on seven points and only one carried the best-slot star.
5. Ade voted on every slot while the roster beneath said she had not
   answered -- lane 2's fault again, a count disagreeing with its own list.
6. "Who was there" showed RSVPs on a session already played -- "Maybe" for
   Nix, "Out" for Sister Quill -- directly under a banner saying four voices
   had been matched. roster() answers who said they would come, which is the
   right question on Sunday and the wrong one on Tuesday; the after views now
   use an attendance list.

## Three things in the code the drawing had to work around

- A reload silently discards a GM's event corrections (D31/IS-317).
- The recording panel has no lifecycle gate at all (SE-157): Start and Stop
  stay live on a completed and on a cancelled session. D10 settles it, and
  drawing SESS-5 from D9 rather than from today's behaviour is what makes it
  visible.
- An in-progress session has no badge colour (STATUS_CLASSES has no entry),
  so every state is drawn with a word, which IS-295 wanted anyway.

SESS-6 is deliberately not drawn (D32): it reuses CAMP-19/20's thread model,
which lane 6 owns and has not designed.

Route in app.py, a line in tests/test_app.py, both run by CI. 89 passed.
Rendered and read in both themes.

Refs #659.

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

Merged to main in 6334b4f, deployed, and reviewed with no changes asked for.

Closing by hand; the API merge returns 422 on this repo even with CI complete and mergeable: true.

D30 is no longer provisional — the notes panel with the audience switch was drawn to be judged and was accepted on review. Settled in #687 so it doesn't reach the rebuild as an open question that had already been closed.

Merged to `main` in 6334b4f, deployed, and **reviewed with no changes asked for**. Closing by hand; the API merge returns 422 on this repo even with CI complete and `mergeable: true`. **D30 is no longer provisional** — the notes panel with the audience switch was drawn to be judged and was accepted on review. Settled in #687 so it doesn't reach the rebuild as an open question that had already been closed.
claude-bot closed this pull request 2026-09-17 23:49:28 +00:00
All checks were successful
CI / Bot/backend version sync (pull_request) Successful in 59s
Required
Details
CI / Backend lint (ruff) (pull_request) Successful in 1m2s
Required
Details
CI / Feedback site tests (pull_request) Successful in 1m14s
Required
Details
CI / Summarisation accuracy eval harness (stub provider) (pull_request) Successful in 1m33s
Required
Details
CI / Bot tests and audit (pull_request) Successful in 2m39s
Required
Details
CI / Frontend tests, audit, and build (pull_request) Successful in 3m7s
Required
Details
CI / Docker image build (pull_request) Successful in 5m4s
Required
Details
CI / Backend migration, tests, and audit (pull_request) Successful in 12m20s
Required
Details
CI / Synthetic session harness (no GPU, no LLM) (pull_request) Successful in 13m44s
Required
Details

Pull request closed

Sign in to join this conversation.
No description provided.