Lane 8 page P6: Handouts and Rules & bestiary; a reveal opens a handout to read (WIKI-14, WIKI-15, #916) #920

Merged
claude-bot merged 8 commits from build/lane8-p6-handouts-rules into main 2026-09-29 06:08:27 +00:00
Collaborator

Lane 8 page P6 (#734), plus the server gap it found (#916).

Pages

  • Handouts (/wiki/handouts): the GM's handouts by session with who each went to, unshown ones first as prep, and reveals outside play under "Between sessions". Show it picks the audience (characters first), posts to Discord unless switched off (D61), says when, and names the piece of a letter shown in parts. Take it back uses the server's revoke route. A player sees what was shown to her, by session, from GET /handouts.
  • A handout's page shows its file (image, PDF with Download, or text), always through the authorised files route, never /media/.
  • Rules & bestiary (/wiki/rules): search the loaded packs; rules open with their source, creatures as a stat block; a GM can Make it ours. Licence lines at the foot; an empty state when no pack is loaded.

Server (#916). A live reveal covering a player opens that handout's page to read and its file list, and nothing else: no lists, search, feeds or writes. It's rendered for her, so GM blocks never reach her, and can_edit is forced off. Taking the reveal back closes it on the next request. GET /api/campaigns/{cid}/handouts lists what was shown to the reader, grouped by session. A player's own handout may use audience mine (hers and the GMs'); no other page may. LoreEntryResponse gains source_reference_entry_id (IS-123). No migration.

Checked

  • Frontend lint, 2712 tests and the build pass. Ruff is clean. Backend full suite: 5826 passed, 1 failed, which is test_needs_you_asks_again_after_a_move. That test fails on every Tuesday on main too and is fixed in #919.
  • Render check, real 390×844 and 1440×900 in the e2e stack, light and dark, as Dana and Priya: 48 of 48 shots have no sideways scroll. The phone Show it dialog keeps Cancel and Show it in view while scrolled, and a real submit from a phone works. I looked at the shots myself.
  • File gates: GM prep gives Priya a 404; revealed to her character, 200 with private, no-store; taken back, 404; /media/private/* and /internal-files/* are 404.
  • Found in passing, not P6's: #918 (the audience menu swallows the next click).

Closes #916. Part of #734.

🤖 Generated with Claude Code

Lane 8 page P6 (#734), plus the server gap it found (#916). **Pages** - **Handouts** (`/wiki/handouts`): the GM's handouts by session with who each went to, unshown ones first as prep, and reveals outside play under "Between sessions". **Show it** picks the audience (characters first), posts to Discord unless switched off (D61), says when, and names the piece of a letter shown in parts. **Take it back** uses the server's revoke route. A player sees what was shown to her, by session, from `GET /handouts`. - **A handout's page** shows its file (image, PDF with Download, or text), always through the authorised files route, never `/media/`. - **Rules & bestiary** (`/wiki/rules`): search the loaded packs; rules open with their source, creatures as a stat block; a GM can **Make it ours**. Licence lines at the foot; an empty state when no pack is loaded. **Server (#916).** A live reveal covering a player opens that handout's page to read and its file list, and nothing else: no lists, search, feeds or writes. It's rendered for her, so GM blocks never reach her, and `can_edit` is forced off. Taking the reveal back closes it on the next request. `GET /api/campaigns/{cid}/handouts` lists what was shown to the reader, grouped by session. A player's own handout may use audience `mine` (hers and the GMs'); no other page may. `LoreEntryResponse` gains `source_reference_entry_id` (IS-123). No migration. **Checked** - Frontend lint, 2712 tests and the build pass. Ruff is clean. Backend full suite: 5826 passed, 1 failed, which is `test_needs_you_asks_again_after_a_move`. That test fails on every Tuesday on main too and is fixed in #919. - Render check, real 390×844 and 1440×900 in the e2e stack, light and dark, as Dana and Priya: 48 of 48 shots have no sideways scroll. The phone Show it dialog keeps Cancel and Show it in view while scrolled, and a real submit from a phone works. I looked at the shots myself. - File gates: GM prep gives Priya a 404; revealed to her character, 200 with `private, no-store`; taken back, 404; `/media/private/*` and `/internal-files/*` are 404. - Found in passing, not P6's: #918 (the audience menu swallows the next click). Closes #916. Part of #734. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Handouts by session with who each went to, GM prep first and W8's between
sessions; Show it (To picker, Discord on by default) and Take it back through
the existing revoke route; a handout's file on its own page through the
authorised files route only. Rules & bestiary: search, rule with source,
creature stat block, Make it ours, house rules, the licence line.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The reveal picker opens in the dialog's flow (a dialog clips a floating
menu), dialog titles quote the handout's name, the PDF frame is capped to a
page's height, a creature's stats read the stat envelope's values, and the
no-rules line links Settings → Content packs for a GM. Upload and file
addresses use uploadLoreAttachment/loreFileUrl in api/campaigns.js, the
names lane 8 P3 adds. Changelog fragment.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Keeps both sides: P5's Quests and The party, then Handouts and Rules &
bestiary in the drawing's order, on P5's id scheme (w-handouts, w-rules
take their icons from CONTENTS_ICONS).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A live reveal whose audience covers a player opens that handout's page to
read (rendered for her, so GM blocks never reach her; read-only) and its
file list. Nothing else widens: the wiki list, search, feeds and every write
keep the page's own audience. Taking the reveal back closes it again.

GET /api/campaigns/{cid}/handouts lists the handouts shown to the reader,
grouped by session (null = between sessions, W8), with piece labels and
files. A player's new document page may be audience "mine" (hers and the
GMs'); no other page. LoreEntryResponse carries source_reference_entry_id
(IS-123). No migration.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A player's Handouts page lists what was shown to her by session from the
server's own list (pieces on their own lines, Just you), then the ones she
added (just her and the GMs). The reveal dialog keeps Cancel / Show it at
its foot while it scrolls on a phone. A page made with Make it ours says
which rules entry it came from (IS-123).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
P3's editor and name routes beside P6's Handouts and Rules routes;
campaigns.js keeps P3's section, by-name and name-target reads.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
test(wiki): drop the Handouts test's unused NOTE fixture (#734)
Some checks failed
CI / Summarisation accuracy eval harness (stub provider) (pull_request) Successful in 53s
CI / Bot tests and audit (pull_request) Successful in 2m7s
CI / Backend lint (ruff) (pull_request) Successful in 32s
CI / Bot/backend version sync (pull_request) Successful in 27s
CI / Docker image build (pull_request) Successful in 55s
CI / Does this change touch the recording path? (pull_request) Successful in 24s
CI / Feedback site tests (pull_request) Successful in 2m6s
CI / Synthetic session harness (no GPU, no LLM) (pull_request) Has been skipped
CI / Backend migration, tests, and audit (pull_request) Failing after 11m47s
CI / Frontend tests, audit, and build (pull_request) Successful in 22m0s
CI / End-to-end journeys (desktop, phone, keyboard-only) (pull_request) Successful in 23m28s
ff280a8e51
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Merge remote-tracking branch 'origin/main' into build/lane8-p6-handouts-rules
All checks were successful
CI / Summarisation accuracy eval harness (stub provider) (pull_request) Successful in 52s
CI / Feedback site tests (pull_request) Successful in 46s
CI / Backend lint (ruff) (pull_request) Successful in 1m19s
CI / Bot/backend version sync (pull_request) Successful in 28s
CI / Bot tests and audit (pull_request) Successful in 1m55s
CI / Does this change touch the recording path? (pull_request) Successful in 22s
CI / Synthetic session harness (no GPU, no LLM) (pull_request) Has been skipped
CI / Docker image build (pull_request) Successful in 1m28s
CI / End-to-end journeys (desktop, phone, keyboard-only) (pull_request) Successful in 35m41s
CI / Backend migration, tests, and audit (pull_request) Successful in 43m50s
CI / Frontend tests, audit, and build (pull_request) Successful in 44m13s
58243cac6a
Sign in to join this conversation.
No description provided.