[Frontend] Apply one vocabulary across prep, wiki, quests, highlights, and proposals #379

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

Impact: MEDIUM

Found in the August 2026 session lifecycle review (#319).

What the user experiences

The same concept carries a different name on almost every screen it appears on. The GM prep workspace alone is called planning (route), CampaignPlanning (component), "GM Workbench" (page heading and entry button), "Session Prep" (palette item), "Session Prep Sheet" (panel title), and its output is scattered between "Beat Planner"/"beat notes" and the "Session Shelf". The wiki landing page is "Wiki" in every breadcrumb but "Campaign Story" in its own page heading. A lore proposal is called "AI Proposals", "Entry Proposals", "Bot Proposals", and "lore proposals" depending on which screen shows it — and "Bot Proposals" is not just inconsistent, it is factually wrong, since the backend Celery worker generates these, not the Discord bot. Approving a proposal creates a draft, and the draft-review page then titles itself "Merging proposal into…" — so the word "proposal" appears on a screen showing a draft, one screen after a button labelled "Approve" that did not actually approve anything. GenerationHistory rows and its filter show raw internal tool_id values (session_prep, npc_voice, loot_parcel) instead of a human label. The same duplication exists for "Quests"/"Thread Tracker"/"loose ends"/"open loops", and WikiArticle renders the character timeline twice from the same data.

Evidence

  • Prep: App.jsx:119; CampaignPlanning.jsx:947,913; CampaignDetail.jsx:2618; workbenchTools.jsx:687; CampaignPlanning.jsx:895.
  • Wiki landing page: CampaignStoryline.jsx:264 vs :277,333; WikiArticle.jsx:1711 vs :1830.
  • Proposals: WikiProposals.jsx:316,341; CampaignStoryline.jsx:294; CampaignDetail.jsx:2668; SessionDetail.jsx:104,236.
  • "Bot Proposals" is generated by webapp/backend/app/services/summary_events.py:79 (backend Celery), not the Discord bot — per this repo's own CLAUDE.md.
  • GenerationHistory.jsx:87,107 — raw tool_id shown in rows and the filter dropdown.
  • Quests: QuestLog.jsx:96,108; CampaignPlanning.jsx:897; QuestLog.jsx:7; workbenchTools.jsx:528; ColdOpenPanel.jsx:110,78.
  • Duplicate render: WikiArticle.jsx:636-669 (infobox InfoRow label="Timeline") and :2108-2146 (full section) render the same character-timeline array twice.

Why it matters for a hosted product

Naming is the single cheapest fixable discoverability tax in the product — every renamed inconsistency below is a support question ("where did my prep notes go?", "is this the same as the Wiki?") that a consistent label would have prevented outright.

Proposed fix

Pick one term per concept and apply it everywhere, per the audit's recommendation: Prep (not planning/workbench/beats), Wiki (not lore/storyline/Campaign Story), Quests (not threads/loose ends), Highlights (not Quote Board), Recording (never "Dashboard" — see the recording-panel-fold issue in this milestone). Rename "Bot Proposals" to "Suggested wiki updates" (also called for in the lore-proposal discovery issue in this milestone — apply once, not twice). Replace raw tool_id in GenerationHistory with a lookup table of human labels. Remove the duplicate character-timeline render, keeping the fuller section and dropping the infobox row (or vice versa). This is the audit's P8 and C7/C8.

Acceptance criteria

  • The prep workspace uses one name ("Prep") consistently across route, page heading, entry button, and palette item.
  • The wiki landing page's <h1> matches the "Wiki" label used in breadcrumbs and nav.
  • "Bot Proposals" is renamed everywhere it appears (this may be a shared fix with the lore-proposal discovery issue — implement once).
  • GenerationHistory rows and its filter show a human-readable tool label instead of the raw tool_id.
  • WikiArticle renders the character timeline in exactly one place.
**Impact: MEDIUM** Found in the August 2026 session lifecycle review (#319). ## What the user experiences The same concept carries a different name on almost every screen it appears on. The GM prep workspace alone is called `planning` (route), `CampaignPlanning` (component), "GM Workbench" (page heading and entry button), "Session Prep" (palette item), "Session Prep Sheet" (panel title), and its output is scattered between "Beat Planner"/"beat notes" and the "Session Shelf". The wiki landing page is "Wiki" in every breadcrumb but "Campaign Story" in its own page heading. A lore proposal is called "AI Proposals", "Entry Proposals", "Bot Proposals", and "lore proposals" depending on which screen shows it — and "Bot Proposals" is not just inconsistent, it is factually wrong, since the backend Celery worker generates these, not the Discord bot. Approving a *proposal* creates a *draft*, and the draft-review page then titles itself "Merging proposal into…" — so the word "proposal" appears on a screen showing a draft, one screen after a button labelled "Approve" that did not actually approve anything. `GenerationHistory` rows and its filter show raw internal `tool_id` values (`session_prep`, `npc_voice`, `loot_parcel`) instead of a human label. The same duplication exists for "Quests"/"Thread Tracker"/"loose ends"/"open loops", and `WikiArticle` renders the character timeline twice from the same data. ## Evidence - Prep: `App.jsx:119`; `CampaignPlanning.jsx:947,913`; `CampaignDetail.jsx:2618`; `workbenchTools.jsx:687`; `CampaignPlanning.jsx:895`. - Wiki landing page: `CampaignStoryline.jsx:264` vs `:277,333`; `WikiArticle.jsx:1711` vs `:1830`. - Proposals: `WikiProposals.jsx:316,341`; `CampaignStoryline.jsx:294`; `CampaignDetail.jsx:2668`; `SessionDetail.jsx:104,236`. - "Bot Proposals" is generated by `webapp/backend/app/services/summary_events.py:79` (backend Celery), not the Discord bot — per this repo's own `CLAUDE.md`. - `GenerationHistory.jsx:87,107` — raw `tool_id` shown in rows and the filter dropdown. - Quests: `QuestLog.jsx:96,108`; `CampaignPlanning.jsx:897`; `QuestLog.jsx:7`; `workbenchTools.jsx:528`; `ColdOpenPanel.jsx:110,78`. - Duplicate render: `WikiArticle.jsx:636-669` (infobox `InfoRow label="Timeline"`) and `:2108-2146` (full section) render the same character-timeline array twice. ## Why it matters for a hosted product Naming is the single cheapest fixable discoverability tax in the product — every renamed inconsistency below is a support question ("where did my prep notes go?", "is this the same as the Wiki?") that a consistent label would have prevented outright. ## Proposed fix Pick one term per concept and apply it everywhere, per the audit's recommendation: **Prep** (not planning/workbench/beats), **Wiki** (not lore/storyline/Campaign Story), **Quests** (not threads/loose ends), **Highlights** (not Quote Board), **Recording** (never "Dashboard" — see the recording-panel-fold issue in this milestone). Rename "Bot Proposals" to "Suggested wiki updates" (also called for in the lore-proposal discovery issue in this milestone — apply once, not twice). Replace raw `tool_id` in `GenerationHistory` with a lookup table of human labels. Remove the duplicate character-timeline render, keeping the fuller section and dropping the infobox row (or vice versa). This is the audit's P8 and C7/C8. ## Acceptance criteria - [ ] The prep workspace uses one name ("Prep") consistently across route, page heading, entry button, and palette item. - [ ] The wiki landing page's `<h1>` matches the "Wiki" label used in breadcrumbs and nav. - [ ] "Bot Proposals" is renamed everywhere it appears (this may be a shared fix with the lore-proposal discovery issue — implement once). - [ ] `GenerationHistory` rows and its filter show a human-readable tool label instead of the raw `tool_id`. - [ ] `WikiArticle` renders the character timeline in exactly one place.
Author
Contributor

Picking this up as v4.3.0 phase 2 (#514), right after #378 on the same lane. One term per concept as the audit recommends: Prep, Wiki, Quests, Highlights, Recording; "Bot Proposals" → "Suggested wiki updates" (done once here; #375 will not redo it); human labels for GenerationHistory via one lookup table; the duplicate character timeline in WikiArticle drops the infobox row and keeps the fuller section. Route paths and API field names do not change, so Discord deep links and bookmarks keep working; only what people read changes. The canonical labels move into one small module so the next rename is one file.

Picking this up as v4.3.0 phase 2 (#514), right after #378 on the same lane. One term per concept as the audit recommends: Prep, Wiki, Quests, Highlights, Recording; "Bot Proposals" → "Suggested wiki updates" (done once here; #375 will not redo it); human labels for `GenerationHistory` via one lookup table; the duplicate character timeline in `WikiArticle` drops the infobox row and keeps the fuller section. Route paths and API field names do not change, so Discord deep links and bookmarks keep working; only what people read changes. The canonical labels move into one small module so the next rename is one file.
Author
Contributor

Done in PR #519 (merged), on top of #378; on dev now, prod with v4.3.0.

One term per concept, with the canonical labels in a new webapp/frontend/src/vocabulary.js so the next rename is one file:

  • Prep: was "GM Workbench" (heading and campaign-page button) and "Session Prep Sheet" (panel). "Beat Planner" survives as a tool name inside Prep, but what it writes is "prep notes" in copy (beat_notes stays the field name). "Session Beat Planner" → "Beat Planner".
  • Wiki: the landing page's <h1> now matches the breadcrumb that always said Wiki; the sidebar entry for it is "Wiki home". "Ground in existing lore" → "…wiki articles", "Save as lore entry" → "Save as wiki article", and Admin's "Lore Pipeline" tab → "Wiki pipeline".
  • Quests: "Thread Tracker" / "Plot Threads" → Quests; the shelf cold open lists "Open quests" (API field open_loops unchanged); the session-prep tool description says "open quests" instead of "loose ends".
  • Highlights: was "Quote Board".
  • Suggested wiki updates: was "AI Proposals" / "Entry Proposals" / "Bot Proposals" / "lore proposals". "Bot" was also factually wrong: the Celery worker writes these, not the Discord bot, so the name sent GMs to the wrong component when they broke. Sub-headings are "Suggested articles" and "Suggested relationships"; the session page's status labels and buttons follow ("Suggest wiki updates", "Suggested wiki updates ready"). Shared with #375, implemented once here.
  • Recording: the session → recording link says "Recording →", not "Dashboard →".

Two things beyond renaming: GenerationHistory printed raw tool_id in both its rows and its filter, so a GM read "session_prep" and "loot_parcel"; both go through a TOOL_LABELS map that the Prep palette also builds its labels from, so a tool cannot be called two things in two places, unknown ids fall back to the id, and the filter sorts by label. WikiArticle rendered a character's timeline twice; the full section stays and the cramped infobox row and its now-unused milestones prop are gone.

Nothing moved. Route paths (/planning, /wiki/proposals), API fields (beat_notes, open_loops, lore_*), tool_id values and the workbench / Lore* code identifiers that mirror backend endpoints are unchanged, so bookmarks and Discord links still work. Component filenames stay too; each affected file's docstring records its user-facing name. Deliberate survivors: "campaign story" as content on the wiki landing body (the offence was using it as a name for the wiki), and "Session Shelf", which is a different concept. "Session Prep" is title-cased to match its palette siblings.

Tests were updated to the new strings rather than loosened, including two negative assertions whose regexes would otherwise have passed vacuously. Suite 523 passed (48 files), eslint clean apart from the pre-existing warning, vite build green.

Done in PR #519 (merged), on top of #378; on dev now, prod with v4.3.0. One term per concept, with the canonical labels in a new `webapp/frontend/src/vocabulary.js` so the next rename is one file: - **Prep**: was "GM Workbench" (heading and campaign-page button) and "Session Prep Sheet" (panel). "Beat Planner" survives as a tool name *inside* Prep, but what it writes is "prep notes" in copy (`beat_notes` stays the field name). "Session Beat Planner" → "Beat Planner". - **Wiki**: the landing page's `<h1>` now matches the breadcrumb that always said Wiki; the sidebar entry for it is "Wiki home". "Ground in existing lore" → "…wiki articles", "Save as lore entry" → "Save as wiki article", and Admin's "Lore Pipeline" tab → "Wiki pipeline". - **Quests**: "Thread Tracker" / "Plot Threads" → Quests; the shelf cold open lists "Open quests" (API field `open_loops` unchanged); the session-prep tool description says "open quests" instead of "loose ends". - **Highlights**: was "Quote Board". - **Suggested wiki updates**: was "AI Proposals" / "Entry Proposals" / "Bot Proposals" / "lore proposals". "Bot" was also factually wrong: the Celery worker writes these, not the Discord bot, so the name sent GMs to the wrong component when they broke. Sub-headings are "Suggested articles" and "Suggested relationships"; the session page's status labels and buttons follow ("Suggest wiki updates", "Suggested wiki updates ready"). Shared with #375, implemented once here. - **Recording**: the session → recording link says "Recording →", not "Dashboard →". Two things beyond renaming: `GenerationHistory` printed raw `tool_id` in both its rows and its filter, so a GM read "session_prep" and "loot_parcel"; both go through a `TOOL_LABELS` map that the Prep palette also builds its labels from, so a tool cannot be called two things in two places, unknown ids fall back to the id, and the filter sorts by label. `WikiArticle` rendered a character's timeline twice; the full section stays and the cramped infobox row and its now-unused `milestones` prop are gone. **Nothing moved.** Route paths (`/planning`, `/wiki/proposals`), API fields (`beat_notes`, `open_loops`, `lore_*`), `tool_id` values and the `workbench` / `Lore*` code identifiers that mirror backend endpoints are unchanged, so bookmarks and Discord links still work. Component filenames stay too; each affected file's docstring records its user-facing name. Deliberate survivors: "campaign story" as *content* on the wiki landing body (the offence was using it as a name for the wiki), and "Session Shelf", which is a different concept. "Session Prep" is title-cased to match its palette siblings. Tests were updated to the new strings rather than loosened, including two negative assertions whose regexes would otherwise have passed vacuously. Suite 523 passed (48 files), eslint clean apart from the pre-existing warning, `vite build` green.
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#379
No description provided.