The GM's Review, part one: still to do, the recording, the summary with versions and saved corrections, one approval (SESS-4, D95, lane 4) #817

Merged
claude-bot merged 4 commits from build/lane4-page-review-a into main 2026-09-24 20:34:18 +00:00
Collaborator

Lane 4 page PR 7a (#730). /sessions/:id/review now draws the new Review for its top half. The events, Who was there and Highlights still come from the legacy page, rendered below in an only mode. 7b replaces them and deletes SessionDetail.

Still to do (D28)

  • Five rows: transcript & summary, suggested wiki updates, campaign storyline, next-session titles, and the recap email. There is no journal row (D47/D98).
  • Pills: Done, Sent, No record, Queued, Running…, Skipped, Failed, and "Waiting for you". Failure and skip reasons show under their row.
  • The wiki row has all six drawn states, with its actions.
  • "Six cards from this session are still on the shelf. Sweep the shelf →".
  • One source: checklist.js holds both the rows and the Read tab's "N to do".

The recording

  • The state line.
  • The table's accuracy tally, in the app (D96): "From the table: ✓ 3 say it looks right · ⚠ 1 flagged a problem".
  • The two folds, Who the recording heard (a thin voice flagged) and The full transcript. The transcript is editable before approval, with 409 handling.
  • Naming a voice is deferred (D103).

The summary

  • Edit it yourself, with the leave guard (D22).
  • Rewrite from the events. It uses the saved corrections (#808, use_pending), and shows its running, stale, failed and done states.
  • Versions (D51). Every version, with who and when, and any can be put back with expected_updated_at.
  • The pending banner (D31, D104): "Three changes waiting to be applied · Made this afternoon", with Rewrite and Discard. Discard asks first.

One approval (D95)

  • Where the button sits. One Approve… button is placed in The recording while the audio is waiting, and in The summary otherwise.
  • The confirmation names every consequence:
    • the bin and its real grace period;
    • the Discord post, only if the campaign posts to Discord;
    • the highlights published;
    • the wiki run;
    • the accuracy question closing.
  • Once approved, the summary offers Withdraw approval.
  • If it fails, the failure says what didn't happen.

Server (additive, GM only, no migration)

  • GET /api/sessions/{id} gains:
    • audio_bin_days;
    • posts_to_discord;
    • wiki_suggestion_count.
  • The recap email's checklist entry records how many people it reached.
  • The bell's "A transcript to review" links to /review.

Departures (reasoned in the commits)

  • The leave sentence is the kit's one wording: "Your changes to the summary are not saved."
  • Discard asks first.
  • The Busy line has no "so far".
  • "Applied" shows only for a rewrite finished during the visit.
  • "Review them →" links today's wiki suggestions page until lane 8.

Checks

  • Frontend: 174 files, 2368 tests. Lint: 0 errors. I re-ran the full suite after the agent's final tweaks.
  • Backend: the targeted modules pass (review fields, post-session tasks, recap email, notifications, sessions and approval). Ruff is clean.
  • Render check: 24 stills in Chromium, light and dark, at 390px and desktop width. It fixed the phone checklist chip and the tally wrap. I reviewed the whole Review tab still myself; the finished checklist rows are struck through, as the drawing's ck__row--done does.

🤖 Generated with Claude Code

Lane 4 page PR 7a (#730). `/sessions/:id/review` now draws the new Review for its top half. **The events, Who was there and Highlights still come from the legacy page**, rendered below in an `only` mode. 7b replaces them and deletes `SessionDetail`. ## Still to do (D28) - **Five rows:** transcript & summary, suggested wiki updates, campaign storyline, next-session titles, and the recap email. There is no journal row (D47/D98). - **Pills:** Done, Sent, No record, Queued, Running…, Skipped, Failed, and "Waiting for you". Failure and skip reasons show under their row. - **The wiki row has all six drawn states**, with its actions. - "Six cards from this session are still on the shelf. Sweep the shelf →". - **One source:** `checklist.js` holds both the rows and the Read tab's "N to do". ## The recording - The state line. - **The table's accuracy tally, in the app (D96):** "From the table: ✓ 3 say it looks right · ⚠ 1 flagged a problem". - The two folds, **Who the recording heard** (a thin voice flagged) and **The full transcript**. The transcript is editable before approval, with 409 handling. - **Naming a voice is deferred (D103).** ## The summary - **Edit it yourself**, with the leave guard (D22). - **Rewrite from the events.** It uses the saved corrections (#808, `use_pending`), and shows its running, stale, failed and done states. - **Versions (D51).** Every version, with who and when, and any can be put back with `expected_updated_at`. - **The pending banner (D31, D104):** "Three changes waiting to be applied · Made this afternoon", with Rewrite and Discard. Discard asks first. ## One approval (D95) - **Where the button sits.** One **Approve…** button is placed in *The recording* while the audio is waiting, and in *The summary* otherwise. - **The confirmation** names every consequence: - the bin and its real grace period; - the Discord post, only if the campaign posts to Discord; - the highlights published; - the wiki run; - the accuracy question closing. - **Once approved,** the summary offers **Withdraw approval**. - **If it fails,** the failure says what didn't happen. ## Server (additive, GM only, no migration) - **`GET /api/sessions/{id}` gains:** - `audio_bin_days`; - `posts_to_discord`; - `wiki_suggestion_count`. - **The recap email's checklist entry** records how many people it reached. - **The bell's "A transcript to review"** links to `/review`. ## Departures (reasoned in the commits) - **The leave sentence is the kit's one wording:** "Your changes to the summary are not saved." - **Discard asks first.** - **The Busy line has no "so far".** - **"Applied" shows only for a rewrite finished during the visit.** - **"Review them →"** links today's wiki suggestions page until lane 8. ## Checks - **Frontend:** 174 files, **2368 tests**. Lint: 0 errors. I re-ran the full suite after the agent's final tweaks. - **Backend:** the targeted modules pass (review fields, post-session tasks, recap email, notifications, sessions and approval). Ruff is clean. - **Render check:** 24 stills in Chromium, light and dark, at 390px and desktop width. It fixed the phone checklist chip and the tally wrap. I reviewed the whole Review tab still myself; the finished checklist rows are struck through, as the drawing's `ck__row--done` does. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Approving a session is one act with several consequences (D95), and the
Review tab's question names each in its real numbers. GET /api/sessions/{id}
now carries three more facts, for the GM only (null for anyone else, D28):

- audio_bin_days: the trash grace ("it can be restored for seven days"),
  set only while the audio is ready, the one state approving bins it.
- posts_to_discord: whether the campaign has a server and a channel for
  the approved summary to be posted to.
- wiki_suggestion_count: the suggested wiki updates from this session
  still waiting, counted exactly as the bell counts them.

The recap email's checklist entry records how many people it reached
(`sent`), for "To four people"; every other task's entry is unchanged.

The bell's "A transcript to review" goes straight to /sessions/{id}/review,
as Home's approve-the-transcript item does since #816.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
checklist.js draws the five rows the Review tab's Still to do lists
(D28; no journal row, D47/D98) — each with a word, a note that says why a
failure or a skip happened, and what can be done about the wiki row —
and stillToDo/toDoCount now count exactly those rows, so the Read tab's
"Review · 3 to do" can never disagree with the list it counts. read.js
re-exports them for its callers.

The API client gains #808's saved corrections (read, discard, recompose
from them), summary versions and put-back, and the per-speaker transcript
stats; vocabulary.js the Review tab's headings and the checklist's words.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
SessionDetail takes `only` — a list of `events`, `who`, `highlights` —
and draws those and nothing else, each under the Review tab's heading and
id, so the GM loses nothing while the next page PR redraws them. In that
mode it declares nothing to the frame (the page around it has), reads
again on `refreshKey`, tells the tab through `onChanged` when attendance
or a regenerate changed, and hands its unsaved corrections up through
`onUnsaved` instead of registering a leave guard of its own: the router
consults only one blocker, and the tab owns it. The events are open,
with their count, and the regenerate's progress is left to the tab's
own summary section. A first read that fails says the rest of the page is
fine, with Try again; a read again that fails keeps what is on screen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
feat(webapp): the GM's Review — still to do, the recording and the summary (#730, lane 4, SESS-4)
All checks were successful
CI / Does this change touch the recording path? (pull_request) Successful in 27s
CI / Synthetic session harness (no GPU, no LLM) (pull_request) Has been skipped
CI / Summarisation accuracy eval harness (stub provider) (pull_request) Successful in 52s
CI / Bot/backend version sync (pull_request) Successful in 1m0s
CI / Docker image build (pull_request) Successful in 1m4s
CI / Backend lint (ruff) (pull_request) Successful in 1m8s
CI / Feedback site tests (pull_request) Successful in 1m30s
CI / Bot tests and audit (pull_request) Successful in 1m49s
CI / Frontend tests, audit, and build (pull_request) Successful in 5m23s
CI / End-to-end journeys (desktop, phone, keyboard-only) (pull_request) Successful in 8m42s
CI / Backend migration, tests, and audit (pull_request) Successful in 11m26s
7de19b5ff7
/sessions/:id/review draws its own top half under the head and tabs (the
drawing's reviewDoc), then the old page's events, who was there and
highlights below, filtered (`only`).

- Still to do: the checklist's five rows with their words and reasons,
  the wiki row's Review them / Suggest / Look again / Looks stuck, and
  the cards left on the shelf with Sweep the shelf.
- The recording: the state line, "From the table: ✓ 3 say it looks
  right · ⚠ 1 flagged a problem" before approval (D96), who the recording
  heard (a thin voice said in words, API-025), and the full transcript
  line by line with pronouns, editable before approval with the #403
  token and a 409 that keeps the edit. Speaker labels stay read-only
  (D103).
- The summary: edit it yourself, rewrite from the events (from the saved
  corrections when there are any), running / stuck / failed / done, and
  Versions with put-back (D51).
- One approval (D95): one button, one POST /approve — under The recording
  while approving would bin the audio, under The summary otherwise — and
  one question naming every consequence in the session's numbers. A
  failure is said where the button was. Withdraw approval has its modal.
- Saved corrections (D31, D104): a banner at the top — how many, made
  when and by whom — with Rewrite the summary and Discard; a set made
  against an older summary can only be discarded.
- One leave guard for the page (D22): the summary, the transcript, and
  what the old events section holds.
- The Contents' headings on Review link to Review, not back to Read.

Polls go through usePoll, so tests drive them by hand (#803).

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