Shelf: warm cold-open — recap, open loops, carried cards (#248) #266
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/v3.11-warm-cold-open"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #248. Last slice of the v3.11.0 milestone.
Session N+1 shouldn't start from a blank board.
GET /api/sessions/{id}/shelf/cold-openreturns the three things that make it start warm, and the shelf shows them as a strip above the board.The third leg — carried cards — already worked via the carry-forward pins from #254; this adds the recap and the open loops, and surfaces all three together.
Everything is derived, nothing is materialized
No new table, no migration. The recap, the loop list, and the carried count are all computed on read, so the panel can't drift out of date if the GM resolves a thread or edits a summary between sessions. It also means the endpoint mutates nothing — opening the shelf a second time can't double-apply anything.
Two judgement calls worth flagging
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 the recap steps over it and 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, rather than with a blank.
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.
Frontend
ColdOpenPanelsits above the scene bar. Its own component rather than more weight inSessionShelf.jsx, which is already carrying the board, the stage, the palette, the sweep, and the reveal composer.Testing
All run locally in containers matching the CI jobs:
ruff check/ruff format --checkclean;eslintclean (the one warning is pre-existing inCampaignDetail.jsx).🤖 Generated with Claude Code