[Frontend] Fix the GM Workbench: buried entry point, wrong default tool, unreadable session picker, and dead-end outputs #374

Closed
opened 2026-08-25 20:42:14 +00:00 by claude-bot · 2 comments
Contributor

Impact: CRITICAL

Found in the August 2026 session lifecycle review (#319). This finding overlaps with #302, #303, #304, and #305 (already filed); the audit's own conclusion is that this journey stays structurally broken even once all four of those land, because the underlying problems are navigational, not just the specific bugs those issues fix.

What the user experiences

The GM Workbench is the whole prep half of the product, and a GM reaches it by scrolling past the entire member roster, session search, stat conversion, the session list, series manager, quest log, and loot ledger to find one small bordered link in the header of a panel three sections deep. Clicking it opens on Beat Planner, not prep — "Session Prep" is the 11th of 13 tools in the palette, under a third name ("Session Prep Sheet") for the same concept the entry link calls "GM Workbench". Sessions with no title (the default, since title is optional at creation) all render as the identical string "Untitled session" in the picker, making the dropdown a list of indistinguishable items. Once the GM generates something, there are three unlabelled save destinations and none of them link to where the content went — so "Appended to beat notes" is a dead-end string, and beat notes themselves render nowhere except inside the workbench, meaning the GM has to navigate back into this buried tool just to read what they wrote. Switching tools discards whatever was just generated, and the recovery panel ("Generation History") never refetches after a run completes, so the exact moment a GM needs it after a timeout, it's empty.

Evidence

  • webapp/frontend/src/pages/CampaignDetail.jsx:2613-2619 — the sole inbound link to the workbench, in the header strip of the Journal/Wiki panel, after seven other panels.
  • webapp/frontend/src/pages/CampaignPlanning.jsx:833useState("beats"), the workbench opens on Beat Planner, not prep.
  • webapp/frontend/src/components/workbenchTools.jsx:687,695-702 — panel titled "Session Prep Sheet"; sessionSelect uses optionLabel: (s) => s.title || "Untitled session" with no fallback to a date label, even though sessionDateLabel already exists in-file (CampaignPlanning.jsx:21-27) and is used by Beat Planner, Thread Tracker, and the arc board — just not here or in AddToShelf.jsx:67.
  • webapp/frontend/src/components/workbenchTools.jsx:648-668 and webapp/frontend/src/components/GeneratorPanel.jsx:386-401 — three save paths ("Append to beat notes", "Replace beat notes", "Add to shelf"), none linking to their destination.
  • webapp/frontend/src/pages/CampaignPlanning.jsx:883-890 and webapp/frontend/src/components/GeneratorPanel.jsx:186-196 — switching the active tool unmounts the panel and discards the result (independently filed as #304).
  • webapp/frontend/src/components/GenerationHistory.jsx:36-42 — fetches once on [campaignId] with no refresh signal from GeneratorPanel, so a run just made does not appear until a full page reload; rows are labelled with the raw tool_id (:107, filter at :87) rather than a human label.
  • Thirteen tools in the palette (CampaignPlanning.jsx:969-995) is itself why the one tool that matters is hard to find; series_titles, npc_voice, and random_table read as features of other tools rather than peers of "Session Prep".
  • #302 (session picker autoSelectFirst defaults to the furthest-out session, not the next one), #303 (beat_notes absent from the read schema, so "Append" and "Replace" both silently no-op against undefined), #304 (switching tools discards the result), #305 (root cause: the only forward-looking input is beat_notes, and it's almost always empty because nothing tells the GM that's where to steer the generator) are already filed and out of scope for this issue — but fixing all four does not fix the entry point, the tool count, the picker readability, or the missing return links described above.

Why it matters for a hosted product

This is the mechanical cause of the product being "pretty useless" for session prep, per the audit's framing — the single feature most GMs will judge the product on is buried behind seven other panels, opens on the wrong tool, and produces output that vanishes into a page the GM has to remember to come back to.

Proposed fix

Put a "Prep this session" primary button on SessionDetail for GMs (and on the upcoming-session row in CampaignDetail) that opens /campaigns/:id/planning?tool=session_prep&session=:sid, reading those query params into CampaignPlanning's existing activeToolId state. Make Session Prep the workbench default when arriving that way. Use sessionDateLabel in the Session Prep session-select and in AddToShelf.jsx:67. Replace the three text-link save destinations with one primary "Save to this session" and a secondary "Add to shelf", with a success message that links to the destination (e.g. "Saved — open the session ↗"). Lift a refreshKey into CampaignPlanning so GenerationHistory refetches after a run completes, and show the human tool label instead of the raw tool_id. Cut the palette from 13 tools to 5-6, folding series_titles, npc_voice, and random_table into the tools they support rather than listing them as peers. This is the audit's P4, P11, and C5.

Acceptance criteria

  • SessionDetail (GM view) has a "Prep this session" button that opens the workbench directly on Session Prep for that session.
  • CampaignPlanning reads tool and session query params and opens on the requested tool/session.
  • The session picker shows a date-based label for untitled sessions instead of repeated "Untitled session" strings.
  • Generated output has one primary save action whose success message links to where the content went.
  • GenerationHistory refetches automatically after a generation run completes, without a page reload.
  • GenerationHistory rows show a human-readable tool label, not the raw tool_id.
  • The workbench palette is reduced to 5-6 top-level tools.
  • The issue body links #302, #303, #304, #305 as related but does not duplicate their fixes.
**Impact: CRITICAL** Found in the August 2026 session lifecycle review (#319). This finding overlaps with #302, #303, #304, and #305 (already filed); the audit's own conclusion is that **this journey stays structurally broken even once all four of those land**, because the underlying problems are navigational, not just the specific bugs those issues fix. ## What the user experiences The GM Workbench is the whole prep half of the product, and a GM reaches it by scrolling past the entire member roster, session search, stat conversion, the session list, series manager, quest log, and loot ledger to find one small bordered link in the header of a panel three sections deep. Clicking it opens on Beat Planner, not prep — "Session Prep" is the 11th of 13 tools in the palette, under a third name ("Session Prep Sheet") for the same concept the entry link calls "GM Workbench". Sessions with no title (the default, since title is optional at creation) all render as the identical string "Untitled session" in the picker, making the dropdown a list of indistinguishable items. Once the GM generates something, there are three unlabelled save destinations and none of them link to where the content went — so "Appended to beat notes" is a dead-end string, and beat notes themselves render nowhere except inside the workbench, meaning the GM has to navigate back into this buried tool just to read what they wrote. Switching tools discards whatever was just generated, and the recovery panel ("Generation History") never refetches after a run completes, so the exact moment a GM needs it after a timeout, it's empty. ## Evidence - `webapp/frontend/src/pages/CampaignDetail.jsx:2613-2619` — the sole inbound link to the workbench, in the header strip of the Journal/Wiki panel, after seven other panels. - `webapp/frontend/src/pages/CampaignPlanning.jsx:833` — `useState("beats")`, the workbench opens on Beat Planner, not prep. - `webapp/frontend/src/components/workbenchTools.jsx:687,695-702` — panel titled "Session Prep Sheet"; `sessionSelect` uses `optionLabel: (s) => s.title || "Untitled session"` with no fallback to a date label, even though `sessionDateLabel` already exists in-file (`CampaignPlanning.jsx:21-27`) and is used by Beat Planner, Thread Tracker, and the arc board — just not here or in `AddToShelf.jsx:67`. - `webapp/frontend/src/components/workbenchTools.jsx:648-668` and `webapp/frontend/src/components/GeneratorPanel.jsx:386-401` — three save paths ("Append to beat notes", "Replace beat notes", "Add to shelf"), none linking to their destination. - `webapp/frontend/src/pages/CampaignPlanning.jsx:883-890` and `webapp/frontend/src/components/GeneratorPanel.jsx:186-196` — switching the active tool unmounts the panel and discards the result (independently filed as #304). - `webapp/frontend/src/components/GenerationHistory.jsx:36-42` — fetches once on `[campaignId]` with no refresh signal from `GeneratorPanel`, so a run just made does not appear until a full page reload; rows are labelled with the raw `tool_id` (`:107`, filter at `:87`) rather than a human label. - Thirteen tools in the palette (`CampaignPlanning.jsx:969-995`) is itself why the one tool that matters is hard to find; `series_titles`, `npc_voice`, and `random_table` read as features of other tools rather than peers of "Session Prep". - #302 (session picker `autoSelectFirst` defaults to the furthest-out session, not the next one), #303 (`beat_notes` absent from the read schema, so "Append" and "Replace" both silently no-op against `undefined`), #304 (switching tools discards the result), #305 (root cause: the only forward-looking input is `beat_notes`, and it's almost always empty because nothing tells the GM that's where to steer the generator) are already filed and out of scope for this issue — but fixing all four does not fix the entry point, the tool count, the picker readability, or the missing return links described above. ## Why it matters for a hosted product This is the mechanical cause of the product being "pretty useless" for session prep, per the audit's framing — the single feature most GMs will judge the product on is buried behind seven other panels, opens on the wrong tool, and produces output that vanishes into a page the GM has to remember to come back to. ## Proposed fix Put a "Prep this session" primary button on `SessionDetail` for GMs (and on the upcoming-session row in `CampaignDetail`) that opens `/campaigns/:id/planning?tool=session_prep&session=:sid`, reading those query params into `CampaignPlanning`'s existing `activeToolId` state. Make Session Prep the workbench default when arriving that way. Use `sessionDateLabel` in the Session Prep session-select and in `AddToShelf.jsx:67`. Replace the three text-link save destinations with one primary "Save to this session" and a secondary "Add to shelf", with a success message that links to the destination (e.g. "Saved — open the session ↗"). Lift a `refreshKey` into `CampaignPlanning` so `GenerationHistory` refetches after a run completes, and show the human tool label instead of the raw `tool_id`. Cut the palette from 13 tools to 5-6, folding `series_titles`, `npc_voice`, and `random_table` into the tools they support rather than listing them as peers. This is the audit's P4, P11, and C5. ## Acceptance criteria - [ ] `SessionDetail` (GM view) has a "Prep this session" button that opens the workbench directly on Session Prep for that session. - [ ] `CampaignPlanning` reads `tool` and `session` query params and opens on the requested tool/session. - [ ] The session picker shows a date-based label for untitled sessions instead of repeated "Untitled session" strings. - [ ] Generated output has one primary save action whose success message links to where the content went. - [ ] `GenerationHistory` refetches automatically after a generation run completes, without a page reload. - [ ] `GenerationHistory` rows show a human-readable tool label, not the raw `tool_id`. - [ ] The workbench palette is reduced to 5-6 top-level tools. - [ ] The issue body links #302, #303, #304, #305 as related but does not duplicate their fixes.
Author
Contributor

Picking this up as v4.3.0 phase 3 (#514), after #302–#305. "Prep this session" buttons on the session page and the campaign's upcoming-session row open Prep on Session Prep for that session via query params; Session Prep becomes the default tool; untitled sessions get date labels in the picker; one primary "Save to this session" plus "Add to shelf", each linking to where the content went; Generation History refetches after a run; the palette drops from 13 tools to at most 6, folding series titles, NPC voice and random tables into the tools they support as recorded on #514.

Picking this up as v4.3.0 phase 3 (#514), after #302–#305. "Prep this session" buttons on the session page and the campaign's upcoming-session row open Prep on Session Prep for that session via query params; Session Prep becomes the default tool; untitled sessions get date labels in the picker; one primary "Save to this session" plus "Add to shelf", each linking to where the content went; Generation History refetches after a run; the palette drops from 13 tools to at most 6, folding series titles, NPC voice and random tables into the tools they support as recorded on #514.
Author
Contributor

Done in the phase 3 PR (auto-merging on green); ships with v4.3.0.

Entry point. "Prep this session" on the GM's session page and on every upcoming row of the campaign page, linking to ?tool=session_prep&session=<id>. CampaignPlanning reads both params once into state: the link is an entry point, not a live binding, and the URL stays shareable. ?session= seeds any picker that would have offered that session anyway, so a link cannot point a picker at something it may not select. Default tool is Session Prep.

Palette: 13 → 6. Each top-level entry is a job; the tools serving it sit behind sub-tabs. Nothing was removed, and activeToolId stays a leaf id, so ?tool=, Re-open's tool_id matching and the history labels are untouched:

  • Session Prep: session prep, Beat Planner, Series Titles
  • Story Arcs: Arc Board, Arc Suggester
  • Quests: the tracker, Rumor Mill (whose only action is "add as a plot thread")
  • NPCs: Instant NPC, NPC Voice Cues
  • Names
  • At the Table: Read-Aloud Description, Random Table, Loot Parcel

Untitled sessions read as their date everywhere, via one sessionPickerLabel shared by the Prep pickers, AddToShelf and the tool configs.

Two named destinations. "Save to this session" (prep notes) and "Add to shelf" (this session's shelf, no picker, since the sheet already knows which session it is about), each reporting where its output went with a link. "Replace prep notes" is gone: it wrote the same field destructively, sat beside a button that did not, and named no destination. Generation History refetches on a refreshKey bumped when a run starts or finishes.

One consequence worth recording: with #305's notes editor inside the prep panel, the panel's session picker had inherited the bug #410 fixed, silently discarding unsaved notes on switch. It now confirms first.

Follow-up worth a decision rather than a silent deletion: Beat Planner is now redundant. #305 put the same editor in the Session Prep panel; the standalone tool survives only as the roomier version.

Done in the phase 3 PR (auto-merging on green); ships with v4.3.0. **Entry point.** "Prep this session" on the GM's session page and on every upcoming row of the campaign page, linking to `?tool=session_prep&session=<id>`. `CampaignPlanning` reads both params once into state: the link is an entry point, not a live binding, and the URL stays shareable. `?session=` seeds any picker that would have offered that session anyway, so a link cannot point a picker at something it may not select. **Default tool** is Session Prep. **Palette: 13 → 6.** Each top-level entry is a job; the tools serving it sit behind sub-tabs. Nothing was removed, and `activeToolId` stays a *leaf* id, so `?tool=`, Re-open's `tool_id` matching and the history labels are untouched: - **Session Prep**: session prep, Beat Planner, Series Titles - **Story Arcs**: Arc Board, Arc Suggester - **Quests**: the tracker, Rumor Mill (whose only action is "add as a plot thread") - **NPCs**: Instant NPC, NPC Voice Cues - **Names** - **At the Table**: Read-Aloud Description, Random Table, Loot Parcel **Untitled sessions read as their date** everywhere, via one `sessionPickerLabel` shared by the Prep pickers, `AddToShelf` and the tool configs. **Two named destinations.** "Save to this session" (prep notes) and "Add to shelf" (this session's shelf, no picker, since the sheet already knows which session it is about), each reporting where its output went with a link. "Replace prep notes" is gone: it wrote the same field destructively, sat beside a button that did not, and named no destination. **Generation History** refetches on a `refreshKey` bumped when a run starts or finishes. One consequence worth recording: with #305's notes editor inside the prep panel, the panel's session picker had inherited the bug #410 fixed, silently discarding unsaved notes on switch. It now confirms first. Follow-up worth a decision rather than a silent deletion: **Beat Planner is now redundant.** #305 put the same editor in the Session Prep panel; the standalone tool survives only as the roomier version.
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#374
No description provided.