[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
No Branch/Tag specified
main
feat/1328-fill-it-in
feat/1328-fill-frontend
feat/1328-fill-backend
feat/9-foundry-push
fix/9-foundry-live
feat/9-foundry-push-frontend
renovate/celery-5.x
feat/5-foundry-connect
feat/9-foundry-push-backend
feat/9-foundry-push-module
feat/5-foundry-frontend
feat/5-foundry-backend
feat/5-foundry-module
release/v4.8.0-rc1
docs/d341-convert-draft
feat/958-update-to-version
feat/958-convert-sheet
feat/958-pathbuilder-import-frontend
fix/1360-heading-order
feat/958-pathbuilder-import-backend
feat/11-weekly-digest
feat/1341-auto-update
docs/d332-superseded
chore/1345-names-cleanup
feat/1342-mentioned-pages
feat/1328-recipes
fix/1346-pgdg-key
perf/1247-shared-recording-stream
chore/132-gitleaks-allowlist
release/v4.7.1
spike/foundry-module
release/v4.7.1-rc1
docs/decisions-d332-d337
fix/bot-certifi
chore/release-4.7.0
chore/release-4.7.0-rc4
chore/deps-4.7.0
chore/release-4.7.0-rc3
fix/1280-quote-must-say-it
fix/1257-names-row-squeeze
chore/release-4.7.0-rc2
fix/1245-pg-upgrade-count
chore/release-4.7.0-rc1
feat/1257-names-in-prep
feat/1257-be
feat/1257-fe
feat/1257-rating-fixes
design/1328-fill-it-in
feat/1257-name-splits
fix/1326-redis-503
feat/1280-fact-suggestions
feat/1280-be
feat/1280-fe
design/1280-fact-suggestions
feat/1279-infobox
feat/1279-be
feat/1279-fe
feat/1321-shelf-copies
design/1279-infobox
feat/1243-table-find
feat/1257-who-rated
feat/1243-prep-drawer
feat/1243-sheet-pickers
design/1243-browse-in-place
feat/1315-hotwords-default
feat/1242-system-filters
feat/1257-more-name-styles
feat/506-leg3-hotwords
design/1242-system-filters
fix/1302-packs-polish
feat/1241-rules-library
design/1241-rules-library
feat/1245-postgres-18
integ/4.6.2
fix/1263-map-ui-2
fix/1263-map-server
fix/1263-map-ui-1
fix/1261-editor-link-menu
fix/1229-axe-4.14-name-mismatch
renovate/axllent-mailpit-1.x
renovate/eslint-monorepo
renovate/authlib-1.x
chore/release-4.6.0
chore/release-4.6.0-rc2
fix/460-rc2-screens
fix/460-rc2-server
fix/release-prerelease-exit
chore/release-4.6.0-rc1
feat/125-campaign-templates
feat/126-calendar
feat/1181-pictures-and-files
feat/1190-event-people
integ/4.6.0
feat/1191-line-of-the-night
feat/1200-starter-packs
chore/bot-multidict-and-playwright-group
fix/1202-this-week-answered-count
fix/122-124-leftovers
fix/1178-get-routes-that-write
fix/1203-journeys-check-names
design/125-campaign-templates
feat/126-calendar-engine
design/126-in-world-calendar
fix/1189-cited-stamp-in-range
fix/1189-v4-looser-check
fix/1189-richer-beats
fix/1113-export-bind-lists
fix/1154-release-notes-by-file
chore/release-4.5.0
chore/release-4.5.0-rc12
fix/1135-wiki-markup-as-text
fix/demo-usage-cost-in-window
chore/release-4.5.0-rc11
fix/1121-sheet-consistency
fix/1121-sheet-5e-terms-and-card-hp
copy/1122-busiest-pages
fix/1121-relevant-choices
fix/1121-wiki-create-npc-save-sheet-links
fix/1029-menu-stays-on-screen
docs/prototype-transcript-bin-wording
fix/1023-editor-save-row-back-scroll
fix/1020-search-exact-first
fix/1020-table-prep
fix/1020-shell-wordmark-footer-bell
fix/1020-wiki-article-party
fix/872-admin-kept-until-phone-tables
feat/l13-milestone-level-waiting
fix/1000-1001-bell-older-setup-context
fix/999-pronouns-in-prompts
fix/l19-other-class-feats
fix/1010-transcript-window-ordinary-confirm
docs/d254-d269-decisions
fix/702-member-search
fix/680-transcript-bin
fix/993-unidentified-prompts
fix/841-redis-timeouts
fix/990-binned-not-exported
fix/830-export-prep-shelf
fix/deps-audit-2026-10-01
fix/877-title-reads
fix/798-audio-received-at
build/lane11-17-j7
build/lane11-16-levelup
build/lane11-14-seams
build/lane11-14-seed
build/lane11-15-start
build/lane11-13-old-block-out
fix/980-review-r3
build/lane11-12-block
build/lane11-8-packs
fix/demo-seed-canonical-names
build/lane11-11-hot-half
docs/l11-decisions
build/lane11-7-convert
build/lane11-10-editing
fix/npm-audit-brace-expansion
build/lane11-9-sheet-page
fix/bot-pyjwt
build/lane11-6-content
fix/lane11-rank-names
build/lane11-2b-language
build/lane11-4-js-evaluator
build/lane11-3-server
build/lane11-5a-pf2e
build/lane11-5b-5e
feat/design-admin
build/lane11-2-evaluator
build/lane11-1-sheet-pieces
build/lane11-0-drawing
fix/943-quest-objectives-fk
fix/prepsheet-shelf-flake
fix/945-leftovers
build/demo-gm-copy
fix/901-email-landings
build/lane10-8-journeys
build/demo-seed-lanes-8-10
fix/887-gm-own-confirmation
build/lane9-5-j1-admin
fix/918-audience-click
fix/useasync-overtaken
ci/939-critical-path
test/937-backend-suite-speed
chore/claude-orchestration
fix/924-xp-gm-only
fix/session-stale-poll
docs/decisions-d239-d242
fix/930-pypdf
build/lane8-journeys
build/925-quest-editor
fix/894-private-page-pictures
build/lane8-p4-drafts
build/lane8-p7-map
build/lane8-p6-handouts-rules
fix/wiki-fixture-names
build/lane10-d227-test-usage
fix/rsvp-horizon-test-tuesday
fix/media-volume-owner
build/lane8-p3-editor
fix/912-unidentified-rename
build/lane8-p5-party-quests
build/lane8-handout-takeback
build/lane10-pickers
build/lane8-p2-article
build/lane8-6-map
build/lane10-7b-email-pages
build/lane8-5-handouts
build/lane10-7a-test-the-bot-pages
build/lane8-p1-pages
build/lane8-4-quests
build/lane8-2b-feeds
build/lane8-3-parties
build/lane8-2a-links
build/lane10-5-commands
build/lane9-6-seed
build/lane10-4b-reactions
build/lane9-4d-pages
build/lane9-4c-pages
build/lane10-4a-posts
build/lane10-3-email
fix/891-web-fonts
build/lane9-4b-pages
build/lane10-6-test-the-bot
build/lane10-2-notify-out
build/lane8-1-wiki-text
build/lane9-4a-frame
design/lane10-drawings
fix/j6-budget
fix/j5-phone-flake
fix/869-test-leaks
fix/843-record-start-followups
build/lane7-all
build/lane6-all
build/lane9-b2-server
chore/changelog-fragments
docs/decisions-d218
build/lane9-a-owner-overview
fix/rule-card-level-label
fix/834-retention-semantics
fix/o3c-record-without-announcement
docs/decisions-d179
docs/decisions-d131-d170
fix/851-commit-before-response
build/lane6-j3-seed
build/lane9-b1-d67-identity
fix/841-blocking-loop
build/lane9-c-backups-audit
fix/vote-race-and-start-commit
fix/recording-announcement
fix/proposal-read-leak
fix/last-admin-guard
build/lane6-p4c-planning
build/lane6-p4b-margin
build/lane6-p4a-sheet
build/lane5-j4-seed
build/lane6-base
build/lane7-pages-talk
build/lane5-pages
build/lane7-pages-safety
build/lane7-p3-safety
build/lane7-p2-notify
build/lane6-p3-planning
build/lane6-p2-history
build/lane6-p1b-items
build/lane7-p1-threads
build/lane5-p6-faces
build/lane6-p1a-sheet
build/lane5-p5-find
build/lane5-p4a-board
build/lane5-p4b-scenes
build/lane5-p3-live
build/lane5-base
build/lane5-p2-cards
docs/lane5-decisions
build/review-r2-wide
fix/review-r1
build/lane5-p1-scenes
build/demo-seed
build/lane4-journeys-j5
build/lane4-page-review-b
build/lane4-page-review-a
build/lane4-page-read
build/lane4-journeys
build/lane4-page-sess2
build/lane4-page-sess1
build/lane4-notes
build/lane4-discord-on-approval
build/lane4-scheduling
build/lane4-versions
build/760-session-number
build/lane4-decisions
build/797-erase-no-regenerate
build/test-race-audit
build/lane3-completions
build/794-dark-only
build/796-titles-scroll
build/791-retention-anchor
build/a11y-sweep
build/shell-followups
build/retention-preview
build/753-backup-readback
docs/d91-d93
build/lane3-j1
build/ci-harness-paths-selftest
fix/useauth-test-race
build/ci-harness-paths
build/777-ai-settings-read
build/lane3-settings-c
build/lane3-settings-b
build/lane3-j6
build/lane3-sessionform
build/lane3-settings-a
build/lane3-members
build/lane3-thisweek
build/lane3-story
chore/87-align-python-3.12
v4.8.0-rc1
v4.7.1
v4.7.1-rc1
v4.7.0
v4.7.0-rc4
v4.7.0-rc3
v4.7.0-rc2
v4.7.0-rc1
v4.6.2
v4.6.2-rc4
v4.6.2-rc3
v4.6.2-rc2
v4.6.2-rc1
v4.6.1
v4.6.1-rc1
v4.6.0
v4.6.0-rc2
v4.6.0-rc1
v4.5.3
v4.5.3-rc1
v4.5.2
v4.5.2-rc1
v4.5.1
v4.5.1-rc2
v4.5.1-rc1
v4.5.0
v4.5.0-rc12
v4.5.0-rc11
v4.5.0-rc10
v4.5.0-rc9
v4.5.0-rc8
v4.5.0-rc7
v4.5.0-rc6
v4.5.0-rc5
v4.5.0-rc4
v4.5.0-rc3
v4.5.0-rc2
v4.5.0-rc1
v4.4.1
v4.4.0
v4.3.0
v4.2.3
v4.2.2
v4.2.1
v4.2.0
v4.1.2
v4.1.1
v4.1.0
v4.0.1
v4.0.0
v3.11.4
v3.11.3
v3.11.2
v3.11.1
v3.11.0
v3.10.0
v3.9.1
v3.9.0
v3.8.0
v3.7.0
v3.6.1
v3.6.0
v3.5.0
v3.4.1
v3.4.0
v3.3.0
v3.2.0
v3.1.0
v3.0.0
v2.1.0
v2.0.0
v1.1.0
v1.0.0
v0.12.0
v0.11.0
v0.10.0
v0.9.1
v0.3.3
v0.9.0
v0.8.0
v0.3.2
v0.3.1
v0.3.0
v0.7.0
v0.6.0
v0.5.0
v0.4.0
v0.2.1
v0.2.0
v0.1.1
v0.1.0
Labels
Clear labels
backend
Issue related to the backend
bot
Issue related to the bot
bug
Something is not working
duplicate
This issue or pull request already exists
enhancement
New feature
frontend
Issue related to the frontend
help wanted
Need some help
invalid
Something is wrong
question
More information is needed
recording
Issue related to the recording system
security
Security hardening / vulnerability work
wontfix
This won't be fixed
No labels
backend
bot
bug
duplicate
enhancement
frontend
help wanted
invalid
question
recording
security
wontfix
Milestone
Clear milestone
No items
Projects
Clear projects
No items
No project
Assignees
Clear assignees
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
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.