After the session, what everyone reads: the Read tab (SESS-3, lane 4) #816

Merged
claude-bot merged 3 commits from build/lane4-page-read into main 2026-09-24 19:24:10 +00:00
Collaborator

Lane 4's third page PR (#730). A played session now renders the new Read view. The GM's Review tab still shows the legacy page under the new head, until PR 7 replaces it.

Read

  • The lead: "Mon, Sep 14, 8:00 PM CDT · ran 3h 42m · four of five there." The length comes from recorded_seconds, and "there" comes from attendance, not RSVPs.
  • What happened, with the drawing's nine-state line:
    • ready or approved;
    • ready to look over (the GM's line is L2's: "Players can read it now; approving posts it to Discord and publishes the highlights.");
    • still working;
    • waiting its turn;
    • could not be transcribed;
    • in the bin, approved or failed;
    • recording deleted;
    • recorded before the timeline fix.
  • The summary, and "Summarised with a limited setup" (summary_limits) for everyone.
  • "Does this look right?" (D96). Players answer before approval, and pressing the chosen answer again takes it back. This restores the check #810 took out of Discord.
  • "Everything that happened": the event log, with All / Reveals / Decisions filters and "Unclear" shown faint. The GM also sees their struck rows. It ends with "… and N more".
  • Shown at the table, Highlights (absent for a player when nothing is approved), Loot & XP (three read-only tables) and Who was there (attendance).
  • Notes.
  • No calendar.

Tabs, and /sessions/:id/review

  • A GM gets Read | Review ("3 to do"). A player gets no tabs (D27).
  • The tabs are links with aria-current, not ARIA tabs, because each is its own route. The strip takes a list, so lane 7 can add Talk.
  • /sessions/:id/review is GM-only, with its own crumb and title. A player, or a session that isn't played, is redirected. In this PR it draws the new head and tabs over the legacy SessionDetail.
  • Home's approve_transcript item links there.

Server

  • audio_deleted_at: migration a9b0c1d2e3f5 on e9a0b1c2d3f4, stamped by both permanent-deletion paths. It has no backfill, because the date was never recorded.
  • audio_retention_days, for "after the 90 days this campaign keeps recordings". It is only set when the window really was the reason the recording went.
  • summary_limits: [title] for every member.
  • D28: for non-GMs, the checklist's error text and lore_generation_error are cleared.
  • Nothing under /api/bot/* changes.

Departures (each reasoned in the commits)

  • Reveals show their wall time in the reader's zone ("shown at 10:41 PM CDT"), as Q-14 recommended.
  • A deletion from before the new column reads without a date.
  • There's no "player · class" line, because no character-class field exists.
  • A player reading an unapproved summary gets "Summarised … Dana has not approved it yet."
  • When attendance was never taken, the page says so rather than marking everyone "Not there".
  • Table-admin events are left out of the Read log; Review handles them in PR 7.

Checks

  • Frontend: 171 files, 2300 tests. Lint: 0 errors.
  • Backend: 31 targeted modules pass (4384 tests), including every migration and chain test. Ruff is clean.
  • The migration was run for real: up, down and up again.
  • Render check in Chromium, light and dark, at 390px and desktop width, across ten stills. I reviewed the unapproved player desktop still and the GM phone still myself.

Follow-up for PR 7

The GM's bell item "A transcript to review" still links to /sessions/{id}. PR 7 points it at /review.

🤖 Generated with Claude Code

Lane 4's third page PR (#730). A **played** session now renders the new **Read** view. **The GM's Review tab still shows the legacy page** under the new head, until PR 7 replaces it. ## Read - **The lead:** "Mon, Sep 14, 8:00 PM CDT · ran 3h 42m · four of five there." The length comes from `recorded_seconds`, and "there" comes from attendance, not RSVPs. - **What happened**, with the drawing's **nine-state line**: - ready or approved; - ready to look over (the GM's line is L2's: "Players can read it now; approving posts it to Discord and publishes the highlights."); - still working; - waiting its turn; - could not be transcribed; - in the bin, approved or failed; - recording deleted; - recorded before the timeline fix. - **The summary**, and "Summarised with a limited setup" (`summary_limits`) for everyone. - **"Does this look right?" (D96).** Players answer before approval, and pressing the chosen answer again takes it back. This restores the check #810 took out of Discord. - **"Everything that happened":** the event log, with All / Reveals / Decisions filters and "Unclear" shown faint. The GM also sees their struck rows. It ends with "… and N more". - **Shown at the table**, **Highlights** (absent for a player when nothing is approved), **Loot & XP** (three read-only tables) and **Who was there** (attendance). - **Notes.** - **No calendar.** ## Tabs, and `/sessions/:id/review` - A GM gets **Read | Review** ("3 to do"). A player gets no tabs (D27). - The tabs are links with `aria-current`, not ARIA tabs, because each is its own route. The strip takes a list, so lane 7 can add Talk. - `/sessions/:id/review` is GM-only, with its own crumb and title. A player, or a session that isn't played, is redirected. In this PR it draws the new head and tabs over the legacy `SessionDetail`. - Home's `approve_transcript` item links there. ## Server - **`audio_deleted_at`:** migration `a9b0c1d2e3f5` on `e9a0b1c2d3f4`, stamped by both permanent-deletion paths. It has no backfill, because the date was never recorded. - **`audio_retention_days`**, for "after the 90 days this campaign keeps recordings". It is only set when the window really was the reason the recording went. - **`summary_limits: [title]`** for every member. - **D28:** for non-GMs, the checklist's error text and `lore_generation_error` are cleared. - Nothing under `/api/bot/*` changes. ## Departures (each reasoned in the commits) - **Reveals show their wall time** in the reader's zone ("shown at 10:41 PM CDT"), as Q-14 recommended. - **A deletion from before the new column** reads without a date. - **There's no "player · class" line,** because no character-class field exists. - **A player reading an unapproved summary** gets "Summarised … Dana has not approved it yet." - **When attendance was never taken,** the page says so rather than marking everyone "Not there". - **Table-admin events are left out of the Read log**; Review handles them in PR 7. ## Checks - Frontend: **171 files, 2300 tests**. Lint: 0 errors. - Backend: 31 targeted modules pass (4384 tests), including every migration and chain test. Ruff is clean. - The migration was run for real: up, down and up again. - **Render check** in Chromium, light and dark, at 390px and desktop width, across ten stills. I reviewed the unapproved player desktop still and the GM phone still myself. ## Follow-up for PR 7 The GM's bell item "A transcript to review" still links to `/sessions/{id}`. PR 7 points it at `/review`. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
The Read tab needs three facts the session response did not carry, and was
being handed two it should not have been:

- `audio_deleted_at`: when the recording was deleted for good. A new
  nullable column (migration a9b0c1d2e3f5, raw DDL, on top of e9a0b1c2d3f4),
  stamped beside the move to the terminal `approved` state by both sweeps
  that delete audio: `cleanup_trashed_audio` and the retention sweep's
  `_delete_session_audio_dir`. No backfill: the date was never recorded.
- `audio_retention_days`: the "90" in "after the 90 days this campaign
  keeps recordings". The effective (capped) window, only once the
  recording is gone, only under retain_days, and not when the recording is
  known to have gone before the window was up.
- `summary_limits`: the titles of the latest run's capability gaps, for
  every member ("Summarised with a limited setup"); the detail stays on
  the GM-only run endpoint.
- D28: for a non-GM, each post_session_tasks entry's `error` and
  `lore_generation_error` are nulled; statuses stay, and
  `audio_processing_error` stays because the page tells a player why
  their session could not be transcribed.

Home's approve_transcript item links to /sessions/{id}/review, the GM's
Review tab. The one-head pin moves to test_audio_deleted_at_migration.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
feat(webapp): after the session, what everyone reads — the Read tab (#730, lane 4, SESS-3)
Some checks failed
CI / Does this change touch the recording path? (pull_request) Successful in 24s
CI / Synthetic session harness (no GPU, no LLM) (pull_request) Has been skipped
CI / Bot/backend version sync (pull_request) Successful in 50s
CI / Summarisation accuracy eval harness (stub provider) (pull_request) Successful in 53s
CI / Docker image build (pull_request) Successful in 52s
CI / Backend lint (ruff) (pull_request) Successful in 1m0s
CI / Feedback site tests (pull_request) Successful in 1m18s
CI / Bot tests and audit (pull_request) Successful in 1m45s
CI / Frontend tests, audit, and build (pull_request) Has been cancelled
CI / Backend migration, tests, and audit (pull_request) Has been cancelled
CI / End-to-end journeys (desktop, phone, keyboard-only) (pull_request) Has been cancelled
9c0a0d6231
A played session now opens on the redesigned page's Read tab (the
drawing's readDoc): the lead ("Mon, Sep 7, 8:00 PM CDT · ran 3h 42m ·
four of five there.", attendance not RSVPs), how the time was picked, and
for the GM only the Read | Review tabs (D27), Review counting what is
still to do.

- What happened: the nine-state "is it ready?" line (read.js,
  TranscriptState; L2's wording for the GM's "ready to look over"; Still
  working on lane 0's Busy), the summary or "No summary yet.", the quiet
  "Summarised with a limited setup" from summary_limits, "Does this look
  right?" for players until approval (D96, #810's endpoints), and the
  folded event log with All / Reveals / Decisions, Unclear, the GM's
  struck moments and "… and N more". #recording lands on the state line.
- Shown at the table (wall time in the reader's zone, Q-14), Highlights
  (absent for a player with none approved, SE-113; a GM's drafts marked),
  Loot & XP (read-only tables, signs as words), Who was there, Notes.
- No checklist (D28) and no calendar (SE-147).
- /sessions/:id/review: the GM gets the new head and tabs over the old
  SessionDetail until the next page PR; anyone else is sent to Read. It
  gets a crumb step and a tab title.
- The tab strip is SessionTabs, a list of links, so lane 7's Talk is one
  more entry.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Merge remote-tracking branch 'origin/main' into build/lane4-page-read
All checks were successful
CI / Summarisation accuracy eval harness (stub provider) (pull_request) Successful in 52s
CI / Feedback site tests (pull_request) Successful in 39s
CI / Backend lint (ruff) (pull_request) Successful in 1m4s
CI / Bot/backend version sync (pull_request) Successful in 57s
CI / Does this change touch the recording path? (pull_request) Successful in 18s
CI / Synthetic session harness (no GPU, no LLM) (pull_request) Has been skipped
CI / Bot tests and audit (pull_request) Successful in 3m25s
CI / Frontend tests, audit, and build (pull_request) Successful in 5m6s
CI / Docker image build (pull_request) Successful in 3m58s
CI / Backend migration, tests, and audit (pull_request) Successful in 11m43s
CI / End-to-end journeys (desktop, phone, keyboard-only) (pull_request) Successful in 8m46s
16c858d816
# Conflicts:
#	CHANGELOG.md
Sign in to join this conversation.
No description provided.