Shelf: warm cold-open (carry-forward) #248

Closed
opened 2026-07-22 02:59:06 +00:00 by claude-bot · 1 comment
Contributor

Next session's shelf boots pre-loaded with carried-forward cards + unresolved loops + a previously-on recap, so session N+1 starts warm instead of cold. Depends on the end-of-session sweep. (#235)

Next session's shelf boots pre-loaded with carried-forward cards + unresolved loops + a previously-on recap, so session N+1 starts warm instead of cold. Depends on the end-of-session sweep. (#235)
Author
Contributor

Done — merged in PR #266 (fe3fb92), CI green.

GET /api/sessions/{id}/shelf/cold-open returns the three things that make session N+1 start warm, and the shelf shows them as a strip above the board. The carried-cards leg already worked via the #254 pins; this adds the recap and the open loops and surfaces all three together.

Everything is derived on read — no new table, no migration. The recap, the loop list, and the carried count are all computed per request, so the panel can't drift out of date if you resolve a thread or edit a summary between sessions, and the endpoint mutates nothing.

Two judgement calls worth recording:

  • The recap walks back in play order rather than taking "the previous row." A cancelled session, or one that was never summarised, has nothing to say — so it's stepped over and the recap reaches for the last session that actually does. A campaign with a called-off session last week still opens with the recap from the one before it.
  • A card pinned from this session doesn't count as carried — it originated tonight. Only cards whose pin started at an earlier session are counted, so the "N cards carried forward" line means what it says.

ColdOpenPanel is its own component rather than more weight in SessionShelf.jsx, which already carries the board, the stage, the palette, the sweep, and the reveal composer. Dismissal is per session in localStorage — once play starts you want the board, not the preamble, and reloading mid-session shouldn't bring it back, while the next session gets its own key. The fetch is best-effort and silent on failure (an error banner above a working shelf would be worse than no preamble), and the panel renders nothing at all when there's nothing to say, so a first session looks exactly as it did.

Tested: backend 798 passed (8 new — empty first session, most-recent-summarised selection, the skip-cancelled-and-unsummarised walk-back, ignoring later sessions, truncation + flag, loop filtering, the carried count excluding tonight's own pins, GM-only boundary); frontend 427 passed (6 new). ruff + eslint clean.

🤖 Generated with Claude Code

Done — merged in **PR #266** (`fe3fb92`), CI green. `GET /api/sessions/{id}/shelf/cold-open` returns the three things that make session N+1 start warm, and the shelf shows them as a strip above the board. The carried-cards leg already worked via the #254 pins; this adds the recap and the open loops and surfaces all three together. **Everything is derived on read — no new table, no migration.** The recap, the loop list, and the carried count are all computed per request, so the panel can't drift out of date if you resolve a thread or edit a summary between sessions, and the endpoint mutates nothing. Two judgement calls worth recording: - **The recap walks back in play order rather than taking "the previous row."** A cancelled session, or one that was never summarised, has nothing to say — so it's stepped over and the recap reaches for the last session that actually does. A campaign with a called-off session last week still opens with the recap from the one before it. - **A card pinned *from* this session doesn't count as carried** — it originated tonight. Only cards whose pin started at an earlier session are counted, so the "N cards carried forward" line means what it says. `ColdOpenPanel` is its own component rather than more weight in `SessionShelf.jsx`, which already carries the board, the stage, the palette, the sweep, and the reveal composer. Dismissal is per session in localStorage — once play starts you want the board, not the preamble, and reloading mid-session shouldn't bring it back, while the next session gets its own key. The fetch is best-effort and silent on failure (an error banner above a working shelf would be worse than no preamble), and the panel renders nothing at all when there's nothing to say, so a first session looks exactly as it did. Tested: backend 798 passed (8 new — empty first session, most-recent-summarised selection, the skip-cancelled-and-unsummarised walk-back, ignoring later sessions, truncation + flag, loop filtering, the carried count excluding tonight's own pins, GM-only boundary); frontend 427 passed (6 new). ruff + eslint clean. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Sign in to join this conversation.
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
rbrooks/Quest-Board#248
No description provided.