[Frontend] Fix the GM Workbench: buried entry point, wrong default tool, unreadable session picker, and dead-end outputs #374
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
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?
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";sessionSelectusesoptionLabel: (s) => s.title || "Untitled session"with no fallback to a date label, even thoughsessionDateLabelalready exists in-file (CampaignPlanning.jsx:21-27) and is used by Beat Planner, Thread Tracker, and the arc board — just not here or inAddToShelf.jsx:67.webapp/frontend/src/components/workbenchTools.jsx:648-668andwebapp/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-890andwebapp/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 fromGeneratorPanel, so a run just made does not appear until a full page reload; rows are labelled with the rawtool_id(:107, filter at:87) rather than a human label.CampaignPlanning.jsx:969-995) is itself why the one tool that matters is hard to find;series_titles,npc_voice, andrandom_tableread as features of other tools rather than peers of "Session Prep".autoSelectFirstdefaults to the furthest-out session, not the next one), #303 (beat_notesabsent from the read schema, so "Append" and "Replace" both silently no-op againstundefined), #304 (switching tools discards the result), #305 (root cause: the only forward-looking input isbeat_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
SessionDetailfor GMs (and on the upcoming-session row inCampaignDetail) that opens/campaigns/:id/planning?tool=session_prep&session=:sid, reading those query params intoCampaignPlanning's existingactiveToolIdstate. Make Session Prep the workbench default when arriving that way. UsesessionDateLabelin the Session Prep session-select and inAddToShelf.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 arefreshKeyintoCampaignPlanningsoGenerationHistoryrefetches after a run completes, and show the human tool label instead of the rawtool_id. Cut the palette from 13 tools to 5-6, foldingseries_titles,npc_voice, andrandom_tableinto 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.CampaignPlanningreadstoolandsessionquery params and opens on the requested tool/session.GenerationHistoryrefetches automatically after a generation run completes, without a page reload.GenerationHistoryrows show a human-readable tool label, not the rawtool_id.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.
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>.CampaignPlanningreads 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
activeToolIdstays a leaf id, so?tool=, Re-open'stool_idmatching and the history labels are untouched:Untitled sessions read as their date everywhere, via one
sessionPickerLabelshared by the Prep pickers,AddToShelfand 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
refreshKeybumped 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.