The session page: confirmed, being played, and cancelled (SESS-2, SESS-5, lane 4) #813

Merged
claude-bot merged 4 commits from build/lane4-page-sess2 into main 2026-09-24 17:59:11 +00:00
Collaborator

Lane 4's second page PR (#730), on #812's frame. The new page now renders confirmed, in_progress and cancelled as well as SESS-1. Only completed still goes to the legacy SessionDetail; PRs 6 and 7 replace that.

Confirmed (SESS-2)

  • The lead: "Monday, in four days. Three in, one maybe."
  • The series line: "Made by the series · every other Monday · Manage the series", plus Prep this session.
  • At risk: "below the four you set" for the GM, and "…this campaign needs" for a player.
  • When:
    • The reader's time, and the table's day only where it differs (D17).
    • Add to your calendar ▾ (Google, or .ics). The event length is end_time or the series' duration.
    • Move it, with the series ripple preview (#804).
    • The fold "How the time was picked".
  • Are you in?: saved and failed states, then "At the table · 4 of 5 have answered", and the roster with pronouns.
  • Previously on: the last two paragraphs of the previous recap, the still-open threads with "New last time" chips, and the cards carried forward. Hide is remembered. If it won't load, that is contained.
  • Recording (GMs only, D10/D35): the existing RecordingPanel under id="recording", so SH-007 still lands. Lane 5 redraws the panel.
  • Notes.
  • Manage: Edit, Mark as played, Take it out of the series | Back to voting, Cancel.
  • The "Just confirmed" banner (D50).

Being played now

  • "Started at 8:00 PM CDT".
  • Open the table → for the GM, or At the table → for a player.
  • Nobody is asked whether they're in.
  • Notes, and the GM's Recording section.

Cancelled (SESS-5)

  • "Would have been…".
  • Why: the reason, then "Cancelled by Dana, July 13." (D101).
  • The notes from it:
    • Move these notes into another session…: anyone may use it (D97). It writes the target's table note, recorded as a moved version. The table note has history (#811), so it can be undone.
    • For the GM, Put it back on the calendar, with its modal.

Shared, extracted, deleted

  • Extracted from This week into components/session/: AreYouIn, PreviouslyOn, the calendar, and moveTableNote. This week uses them.
  • Deleted: VotingGrid, SessionRsvp and viewerSecondaryTime (IS-003, #730's first inheritance). The legacy completed view drops the vote, RSVP and "your time" parts it no longer needs.

Server (additive; no migrations; no /api/bot/*)

  • /rsvps rows gain pronouns, role, character_name and character_pronouns. There is one roster builder, which This week also uses.
  • GET /sessions/{id} gains at_risk_detail {likely_attendance, quorum_min_players}.
  • The cold open gains closing_paragraphs and open_loops[].new_last_time.

Departures (each reasoned in the commit and on #730)

  • "Just confirmed" is derived (still tentative, confirmed in the last three days, with carried answers) and shown to the GM, since no confirmation stamp exists.
  • "Four at the table" is lane 5's.
  • The recording panel's own heading sits under the page's until lane 5 redraws it.
  • Back to voting on a confirmed session has no "add one instead".
  • Counting: "4 of 5" counts players only, as #812 does.

Checks

  • Frontend: 161 files, 2202 tests. Lint: 0 errors.
  • Backend: the targeted modules pass. Ruff is clean.
  • Render check in Chromium (America/Chicago), at 390px and desktop width, light and dark, across 17 stills. It fixed the live page's spacing, and I reviewed the confirmed GM and the cancelled phone stills myself.

🤖 Generated with Claude Code

Lane 4's second page PR (#730), on #812's frame. The new page now renders `confirmed`, `in_progress` and `cancelled` as well as SESS-1. **Only `completed` still goes to the legacy `SessionDetail`**; PRs 6 and 7 replace that. ## Confirmed (SESS-2) - **The lead:** "Monday, in four days. Three in, one maybe." - **The series line:** "Made by the series · every other Monday · Manage the series", plus **Prep this session**. - **At risk:** "below the four you set" for the GM, and "…this campaign needs" for a player. - **When:** - The reader's time, and the table's day only where it differs (D17). - **Add to your calendar ▾** (Google, or .ics). The event length is `end_time` or the series' duration. - **Move it**, with the series ripple preview (#804). - The fold "How the time was picked". - **Are you in?:** saved and failed states, then "At the table · 4 of 5 have answered", and the roster with pronouns. - **Previously on:** the last two paragraphs of the previous recap, the still-open threads with "New last time" chips, and the cards carried forward. Hide is remembered. If it won't load, that is contained. - **Recording** (GMs only, D10/D35): the existing `RecordingPanel` under `id="recording"`, so SH-007 still lands. Lane 5 redraws the panel. - **Notes.** - **Manage:** Edit, Mark as played, Take it out of the series | Back to voting, Cancel. - **The "Just confirmed" banner (D50).** ## Being played now - "Started at 8:00 PM CDT". - **Open the table →** for the GM, or **At the table →** for a player. - Nobody is asked whether they're in. - Notes, and the GM's Recording section. ## Cancelled (SESS-5) - "Would have been…". - **Why:** the reason, then "Cancelled by Dana, July 13." (D101). - **The notes from it:** - **Move these notes into another session…**: anyone may use it (D97). It writes the target's table note, recorded as a `moved` version. The table note has history (#811), so it can be undone. - For the GM, **Put it back on the calendar**, with its modal. ## Shared, extracted, deleted - **Extracted from This week** into `components/session/`: `AreYouIn`, `PreviouslyOn`, the calendar, and `moveTableNote`. This week uses them. - **Deleted:** `VotingGrid`, `SessionRsvp` and `viewerSecondaryTime` (IS-003, #730's first inheritance). The legacy completed view drops the vote, RSVP and "your time" parts it no longer needs. ## Server (additive; no migrations; no `/api/bot/*`) - **`/rsvps` rows** gain `pronouns`, `role`, `character_name` and `character_pronouns`. There is one roster builder, which This week also uses. - **`GET /sessions/{id}`** gains `at_risk_detail {likely_attendance, quorum_min_players}`. - **The cold open** gains `closing_paragraphs` and `open_loops[].new_last_time`. ## Departures (each reasoned in the commit and on #730) - **"Just confirmed" is derived** (still tentative, confirmed in the last three days, with carried answers) and shown to the GM, since no confirmation stamp exists. - **"Four at the table" is lane 5's.** - **The recording panel's own heading** sits under the page's until lane 5 redraws it. - **Back to voting** on a confirmed session has no "add one instead". - **Counting:** "4 of 5" counts players only, as #812 does. ## Checks - Frontend: **161 files, 2202 tests**. Lint: 0 errors. - Backend: the targeted modules pass. Ruff is clean. - **Render check** in Chromium (America/Chicago), at 390px and desktop width, light and dark, across 17 stills. It fixed the live page's spacing, and I reviewed the confirmed GM and the cancelled phone stills myself. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Additive only, for lane 4's second page PR (SESS-2):

- GET /sessions/{id}/rsvps: each row now carries pronouns, role,
  character_name and character_pronouns — This week's roster shape. The
  two rosters are one builder now: attendance_service.get_session_rsvps,
  which This week's _roster calls, in joining order.
- GET /sessions/{id}: at_risk_detail {likely_attendance,
  quorum_min_players} while at_risk is true, from the same evaluation as
  the flag, so "below the four you set" cannot disagree with it.
- GET /sessions/{id}/shelf/cold-open: previously_on.closing_paragraphs
  (the recap's last two paragraphs, whole — the part the 1,200-character
  cut loses) and open_loops[].new_last_time (opened since the last played
  session began).

No migrations; nothing under /api/bot/*.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This week (CAMP-1) already drew all three D17-correct; the session page's
confirmed state (SESS-2) needs the same three, so there is one of each:

- AreYouIn: the three answers, what was saved in words, the failure that
  keeps the server's answer, and the roster. `layout="inline"` is This
  week's count; `layout="table"` is the session page's "At the table ·
  4 of 5 have answered", counting the players.
- PreviouslyOn (+ useColdOpen): This week's cut, unchanged, and the
  session page's — the recap's closing paragraphs, "Read all of Session
  13", the quests still open with Open / New last time, the cards carried,
  and a Hide/Show remembered per session and per reader.
- calendar: googleCalendarUrl now lasts as the session (end_time) or its
  series plans, four hours only as the last resort the .ics also uses;
  This week's CalendarPanel, and the page's CalendarMenu.
- moveTableNote: the Sessions list's "Merge notes" move (#811), shared
  with the cancelled session's page.

This week and the Sessions list switch to them; their tests are unchanged.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The dispatcher now draws confirmed, in_progress and cancelled on the new
page; only a played session (and anything unknown) still goes to the old
SessionDetail, until Read and Review replace it.

- Confirmed: "Just confirmed" for the GM when pencilled-in answers carried
  over (D50, derived: tentative mode, confirmed within three days, answers
  given before updated_at); the lead "Monday, in five days. Three in, one
  maybe."; the GM's meta line (Made by the series · every other Monday ·
  Manage the series, and Prep this session); at risk in each reader's
  words from at_risk_detail; When with the reader's time (D17), the
  calendar menu while still to come, Move it with the ripple (D99), and
  How the time was picked; Are you in?; Previously on; the GM's Recording
  (RecordingPanel unchanged, in a section with id="recording"); Notes.
  Manage: Edit, Mark as played, Take it out of the series | Back to
  voting, Cancel (D52).
- Being played: Being played now, "Started at 8:00 PM CDT.", Open the
  table → / At the table → first, nobody asked; Recording for the GM;
  Notes. Manage: Edit, Mark as played | Cancel.
- Cancelled: Would have been…, Why (the reason, then "Cancelled by Dana,
  July 13."), The notes from it with Move these notes (anyone, D97; the
  drawing's modal over moveTableNote) and Put it back (GM, uncancel).
  Nothing else (D9, D10).
- Each state declares its headings to the Contents; Previously on and
  The notes from it only when they exist.

RecordingPanel takes an anchorId so the page's section, not the panel,
answers to #recording; SeriesManager exports TakeOut with a name.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
chore(webapp): the old vote grid, RSVP panel and "your time" line go (#730)
All checks were successful
CI / Backend lint (ruff) (pull_request) Successful in 1m8s
CI / Does this change touch the recording path? (pull_request) Successful in 16s
CI / Synthetic session harness (no GPU, no LLM) (pull_request) Has been skipped
CI / Feedback site tests (pull_request) Successful in 1m40s
CI / Bot/backend version sync (pull_request) Successful in 39s
CI / Summarisation accuracy eval harness (stub provider) (pull_request) Successful in 1m56s
CI / Bot tests and audit (pull_request) Successful in 3m6s
CI / Frontend tests, audit, and build (pull_request) Successful in 4m10s
CI / Docker image build (pull_request) Successful in 3m32s
CI / End-to-end journeys (desktop, phone, keyboard-only) (pull_request) Successful in 9m2s
CI / Backend migration, tests, and audit (pull_request) Successful in 18m12s
0272564fe6
Nothing imports them now that the session page draws a vote, pencilled in
and confirmed itself:

- components/VotingGrid.jsx and components/SessionRsvp.jsx, with their
  tests;
- viewerSecondaryTime (utils/datetime.js) and its tests.

SessionDetail stays, drawing only a played session, which has no vote and
no RSVP: it drops both mounts, and its one time is now the reader's own
with its abbreviation (whenText, D17) instead of the campaign's plus a
"your time" line.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sign in to join this conversation.
No description provided.