v4.3.0 build order: Product Surface in eight phases #514

Closed
opened 2026-09-06 00:33:37 +00:00 by claude-bot · 9 comments
Contributor

Tracking issue for the v4.3.0 milestone (34 issues from the #319 audit plus #302–#305 and #479). Proposed order, with the reasoning, so the milestone is built as a sequence rather than a pile. Each phase is one or more PRs; phases marked ∥ can run in parallel with the previous one because they touch different files.

Principles

  1. Fix the lies first. Anything that tells a user something false (a failed summary announced as ready, a lost vote that looks recorded, a network blip shown as "not recording") goes before anything that is merely hard to find. These are small, independent, and the highest impact per line.
  2. Build the spine before hanging things on it. The nav bar and the single vocabulary come before the clusters that need links and names, or every later PR renames something twice.
  3. Respect the stated dependencies. #305 depends on #302 and #303; #374 explicitly stays broken until #302–#305 land; #368's RSVP row needs #370; #375 and #379 share the "Bot Proposals" rename.
  4. One delegate per file cluster. The workbench, the bot cogs, and the wiki pages each get a sequential lane so parallel work does not collide in the same files.

Phase 1 — Stop lying (all small, all independent, run in parallel) → ship early as v4.2.3

issue what size
#372 failed transcription announced as "Session Summary Ready" S
#394 drop the unused privileged intent; no more crash-loop S
#391 deep link in every Discord embed (session_url exists, thread it through) S
#384 delete the orphaned CampaignNotes page S
#383 players can set their own character name (one guard) S
#376 WikiArticle usable at phone width (one class) S
#479 archived campaigns stop materialising sessions and sending reminders (backend, with the "must stay live" tests) M

Worth a patch release on its own: three of these are CRITICAL/HIGH bot lies on prod today, and none touches the frontend structure.

Phase 2 — The spine

  • #378 persistent nav bar (dashboard link, campaign switcher, Sessions / Prep / Wiki / Quotes inside a campaign; wiki no longer opens a new tab)
  • #379 one vocabulary (Prep, Wiki, Quests, Highlights, Recording; "Bot Proposals" → "Suggested wiki updates"; human labels in GenerationHistory; duplicate timeline removed)

Sequential in one lane: the nav links need the final names.

Phase 3 — The workbench lane (sequential, one lane)

#302 session picker default → #303 beat-notes round trip (read path, real append, no clobber) → #304 re-open restores output → #305 prep prompt gets GM intent (notes box in the prep panel, one-shot steer, rebalanced prompt) → #374 the navigational fixes (Prep-this-session button, query params, date labels, one save action, history refetch, palette 13 → 5–6) → #381 elapsed timers (GeneratorPanel is already open).

Decision recorded here, override if wrong: the palette cut folds series_titles, npc_voice and random_table into the tools they support, as the audit proposes.

Phase 4 ∥ — The attention surface (parallel with phase 3; different files)

#370 web RSVP (writes to the same attendance data as Discord reactions; party roster) → #380 status fields for the four invisible post-session tasks (migration) and the "Post-session processing" checklist → #368 the "Needs you" aggregate endpoint and dashboard block (open votes, missing RSVPs, transcripts awaiting approval, pending suggestions, in-progress sessions; countdown becomes a link).

Phase 5 ∥ — Bot self-diagnosis (parallel with phases 3–4; two lanes inside bot/)

  • Lane A (notifications/voting): #369 misconfigured channel fails loudly (no silent XACK, status back to the web app, per-field test message) → #371 acknowledge Discord votes and RSVPs, fix the web/Discord asymmetry, reject reactions on closed polls, log the Redis fallback, add-a-timeslot control
  • Lane B (sessions/recording/linking): #373 /help, guild-join welcome, real error strings, "no campaign bound" vs "nothing scheduled" → #393 /record start session identity, validated UUID, fulfilled stop, restart-safe active state (#399's recovery already covers the audio; this is the state and the messages) → #392 linking dead ends (real pages instead of raw JSON, correct DM on conflict, /link named in Profile)

Phase 6 — The wiki lane (sequential, one lane; after phase 2 so names are settled)

#375 proposal discovery (one-line link fix, entry link out of the hidden aside, inline queue replaced by an always-visible summary row) → #385 one review vocabulary and flow (Approve vs Review merge, busy states, no alert(), consistent append/replace copy) → #395 robustness (poll timeout, inline errors instead of page-level, confirm on Full regenerate) → #396 search box and paginated sidebar → #377 the silent-error sweep last, because it touches twelve files across every cluster and is cheapest once the others have settled.

Phase 7 — Onboarding and self-service

#387 /join/<code> link and first-run checklist → #388 players get the "Previously on" recap → #389 un-reveal, delete XP, .ics export → #382 explain gated states instead of hiding → #390 end-user docs and the Login page copy (last, so it documents what shipped).

Phase 8 — One live-session screen

#386 fold the Recording Dashboard into SessionDetail. Last because it is the largest restructuring and v4.4.0 redesigns this surface anyway. Decision recorded here, override if wrong: SessionDetail becomes the canonical screen (it is the hub every other link lands on); the standalone dashboard's live panel moves into it, the "Dashboard →" link goes, and recording controls become reachable from a proposed session.

Release shape

Phase 1 as v4.2.3 within a day; phases 2–8 as v4.3.0, deployed to dev after each phase for a look, prod once at the end. If the milestone runs long, phases 2–5 are a coherent v4.3.0 on their own and 6–8 can be v4.3.1.

Out of scope, noted

Nothing here is visual redesign; that is v4.4.0. #386 is the one place the two milestones touch, which is why it is last.

Tracking issue for the v4.3.0 milestone (34 issues from the #319 audit plus #302–#305 and #479). Proposed order, with the reasoning, so the milestone is built as a sequence rather than a pile. Each phase is one or more PRs; phases marked ∥ can run in parallel with the previous one because they touch different files. ## Principles 1. **Fix the lies first.** Anything that tells a user something false (a failed summary announced as ready, a lost vote that looks recorded, a network blip shown as "not recording") goes before anything that is merely hard to find. These are small, independent, and the highest impact per line. 2. **Build the spine before hanging things on it.** The nav bar and the single vocabulary come before the clusters that need links and names, or every later PR renames something twice. 3. **Respect the stated dependencies.** #305 depends on #302 and #303; #374 explicitly stays broken until #302–#305 land; #368's RSVP row needs #370; #375 and #379 share the "Bot Proposals" rename. 4. **One delegate per file cluster.** The workbench, the bot cogs, and the wiki pages each get a sequential lane so parallel work does not collide in the same files. ## Phase 1 — Stop lying (all small, all independent, run in parallel) → ship early as **v4.2.3** | issue | what | size | |---|---|---| | #372 | failed transcription announced as "Session Summary Ready" | S | | #394 | drop the unused privileged intent; no more crash-loop | S | | #391 | deep link in every Discord embed (`session_url` exists, thread it through) | S | | #384 | delete the orphaned CampaignNotes page | S | | #383 | players can set their own character name (one guard) | S | | #376 | WikiArticle usable at phone width (one class) | S | | #479 | archived campaigns stop materialising sessions and sending reminders (backend, with the "must stay live" tests) | M | Worth a patch release on its own: three of these are CRITICAL/HIGH bot lies on prod today, and none touches the frontend structure. ## Phase 2 — The spine - #378 persistent nav bar (dashboard link, campaign switcher, Sessions / Prep / Wiki / Quotes inside a campaign; wiki no longer opens a new tab) - #379 one vocabulary (Prep, Wiki, Quests, Highlights, Recording; "Bot Proposals" → "Suggested wiki updates"; human labels in GenerationHistory; duplicate timeline removed) Sequential in one lane: the nav links need the final names. ## Phase 3 — The workbench lane (sequential, one lane) #302 session picker default → #303 beat-notes round trip (read path, real append, no clobber) → #304 re-open restores output → #305 prep prompt gets GM intent (notes box in the prep panel, one-shot steer, rebalanced prompt) → #374 the navigational fixes (Prep-this-session button, query params, date labels, one save action, history refetch, palette 13 → 5–6) → #381 elapsed timers (GeneratorPanel is already open). **Decision recorded here, override if wrong:** the palette cut folds `series_titles`, `npc_voice` and `random_table` into the tools they support, as the audit proposes. ## Phase 4 ∥ — The attention surface (parallel with phase 3; different files) #370 web RSVP (writes to the same attendance data as Discord reactions; party roster) → #380 status fields for the four invisible post-session tasks (migration) and the "Post-session processing" checklist → #368 the "Needs you" aggregate endpoint and dashboard block (open votes, missing RSVPs, transcripts awaiting approval, pending suggestions, in-progress sessions; countdown becomes a link). ## Phase 5 ∥ — Bot self-diagnosis (parallel with phases 3–4; two lanes inside `bot/`) - Lane A (notifications/voting): #369 misconfigured channel fails loudly (no silent XACK, status back to the web app, per-field test message) → #371 acknowledge Discord votes and RSVPs, fix the web/Discord asymmetry, reject reactions on closed polls, log the Redis fallback, add-a-timeslot control - Lane B (sessions/recording/linking): #373 `/help`, guild-join welcome, real error strings, "no campaign bound" vs "nothing scheduled" → #393 `/record start` session identity, validated UUID, fulfilled stop, restart-safe active state (#399's recovery already covers the audio; this is the state and the messages) → #392 linking dead ends (real pages instead of raw JSON, correct DM on conflict, `/link` named in Profile) ## Phase 6 — The wiki lane (sequential, one lane; after phase 2 so names are settled) #375 proposal discovery (one-line link fix, entry link out of the hidden aside, inline queue replaced by an always-visible summary row) → #385 one review vocabulary and flow (Approve vs Review merge, busy states, no `alert()`, consistent append/replace copy) → #395 robustness (poll timeout, inline errors instead of page-level, confirm on Full regenerate) → #396 search box and paginated sidebar → **#377 the silent-error sweep last**, because it touches twelve files across every cluster and is cheapest once the others have settled. ## Phase 7 — Onboarding and self-service #387 `/join/<code>` link and first-run checklist → #388 players get the "Previously on" recap → #389 un-reveal, delete XP, `.ics` export → #382 explain gated states instead of hiding → #390 end-user docs and the Login page copy (last, so it documents what shipped). ## Phase 8 — One live-session screen #386 fold the Recording Dashboard into SessionDetail. Last because it is the largest restructuring and v4.4.0 redesigns this surface anyway. **Decision recorded here, override if wrong:** SessionDetail becomes the canonical screen (it is the hub every other link lands on); the standalone dashboard's live panel moves into it, the "Dashboard →" link goes, and recording controls become reachable from a `proposed` session. ## Release shape Phase 1 as v4.2.3 within a day; phases 2–8 as v4.3.0, deployed to dev after each phase for a look, prod once at the end. If the milestone runs long, phases 2–5 are a coherent v4.3.0 on their own and 6–8 can be v4.3.1. ## Out of scope, noted Nothing here is visual redesign; that is v4.4.0. #386 is the one place the two milestones touch, which is why it is last.
claude-bot changed title from v4.3.0 build order: Product Surface in eight phases</title> <parameter name="body">Tracking issue for the v4.3.0 milestone (34 issues from the #319 audit plus #302–#305 and #479). Proposed order, with the reasoning, so the milestone is built as a seq… to v4.3.0 build order: Product Surface in eight phases 2026-09-06 00:34:01 +00:00
Author
Contributor

Approved 2026-09-06; phase 1 started. Three lanes in parallel: bot (#372, #391, #394 on one branch, since they share cogs/notifications.py), frontend (#384, #383, #376 on one branch), and #479 on its own. One PR per lane, then chore(release): v4.2.3, dev, prod. The two decisions recorded above (palette cut, SessionDetail as the canonical recording screen) stand unless overridden.

Approved 2026-09-06; phase 1 started. Three lanes in parallel: bot (#372, #391, #394 on one branch, since they share `cogs/notifications.py`), frontend (#384, #383, #376 on one branch), and #479 on its own. One PR per lane, then `chore(release): v4.2.3`, dev, prod. The two decisions recorded above (palette cut, SessionDetail as the canonical recording screen) stand unless overridden.
Author
Contributor

Phase 1 shipped as v4.2.3 (PRs #515, #516, #517; release PR #518), live on dev and prod 2026-09-06 02:23 UTC. All seven issues closed with completion notes; #383 turned out to be already fixed by #330 and got regression tests instead.

In flight now, in parallel: phase 2 (#378 nav bar → #379 vocabulary), phase 5 lane A (#369#371) and phase 5 lane B (#373#393#392). Phase 4 starts when phase 2 lands, so its dashboard and session-page work uses the new nav and names. Two migrations are expected before v4.3.0 (#369's delivery status, #380's task statuses); they will be chained to one head at the release.

**Phase 1 shipped as v4.2.3** (PRs #515, #516, #517; release PR #518), live on dev and prod 2026-09-06 02:23 UTC. All seven issues closed with completion notes; #383 turned out to be already fixed by #330 and got regression tests instead. In flight now, in parallel: **phase 2** (#378 nav bar → #379 vocabulary), **phase 5 lane A** (#369 → #371) and **phase 5 lane B** (#373 → #393 → #392). Phase 4 starts when phase 2 lands, so its dashboard and session-page work uses the new nav and names. Two migrations are expected before v4.3.0 (#369's delivery status, #380's task statuses); they will be chained to one head at the release.
Author
Contributor

Phase 2 landed (PR #519, #378 + #379) and is on dev now for a look: the nav bar, the campaign switcher, and the new names. Phase 4 (#370#380#368) started from that base. Phase 5 lane B is PR #521 (#373, #393, #392), auto-merging; lane A (#369, #371) is still building. One adjacent finding from lane B filed as #520 (raw tracks deleted on a mid-conversion failure), not in this milestone unless you want it.

**Phase 2 landed** (PR #519, #378 + #379) and is on dev now for a look: the nav bar, the campaign switcher, and the new names. **Phase 4** (#370 → #380 → #368) started from that base. **Phase 5 lane B** is PR #521 (#373, #393, #392), auto-merging; **lane A** (#369, #371) is still building. One adjacent finding from lane B filed as #520 (raw tracks deleted on a mid-conversion failure), not in this milestone unless you want it.
Author
Contributor

Phase 5 complete on main: lane B (PR #521: #373, #393, #392) and lane A (PR #523: #369, #371). Phase 4 (#370, #380, #368) is finished and going up as a PR now; its RSVP migration was re-chained after lane A's delivery-status migration so alembic has one head (f0ab1c2d3e4f → fa0b1c2d3e4f → 0b1c2d3e4f5a), proven by applying all four on a fresh database. Phases 3 (Prep lane) and 6 (wiki lane) are building in parallel; #377 runs after they land, then phases 7 and 8.

Follow-ups filed from the reviews, none in this milestone: #520 (raw tracks deleted on a mid-conversion failure), #522 (QuestBoardApiError constructor guard), #524 (count_bot_proposals ignores deleted_at), #525 (RSVP "no" into the at-risk evaluation).

**Phase 5 complete** on main: lane B (PR #521: #373, #393, #392) and lane A (PR #523: #369, #371). **Phase 4** (#370, #380, #368) is finished and going up as a PR now; its RSVP migration was re-chained after lane A's delivery-status migration so alembic has one head (`f0ab1c2d3e4f → fa0b1c2d3e4f → 0b1c2d3e4f5a`), proven by applying all four on a fresh database. **Phases 3** (Prep lane) and **6** (wiki lane) are building in parallel; #377 runs after they land, then phases 7 and 8. Follow-ups filed from the reviews, none in this milestone: #520 (raw tracks deleted on a mid-conversion failure), #522 (`QuestBoardApiError` constructor guard), #524 (`count_bot_proposals` ignores `deleted_at`), #525 (RSVP "no" into the at-risk evaluation).
Author
Contributor

Phase 4 merged (PR #526) and dev is now on main 50fa488 with phases 1, 2, 4 and 5 all in: the migrate container applied f0ab1c2d3e4f → fa0b1c2d3e4f → 0b1c2d3e4f5a in order, head 0b1c2d3e4f5a, 7/7 healthy. Worth a look on dev: the nav bar and campaign switcher, the "Needs you" block on the dashboard (it is absent until something is pending), the RSVP control and post-session checklist on a session page, and the delivery-status banner and per-field Discord test buttons on a campaign page. The bot side (acks, /help, autocomplete, the failure embed) is not observable on dev, which has no Discord token; it will be on prod at v4.3.0.

Remaining: phase 3 (Prep lane) and phase 6 (wiki lane) are building; then #377, phase 7, phase 8, release.

**Phase 4 merged** (PR #526) and **dev is now on main `50fa488`** with phases 1, 2, 4 and 5 all in: the migrate container applied `f0ab1c2d3e4f → fa0b1c2d3e4f → 0b1c2d3e4f5a` in order, head `0b1c2d3e4f5a`, 7/7 healthy. Worth a look on dev: the nav bar and campaign switcher, the "Needs you" block on the dashboard (it is absent until something is pending), the RSVP control and post-session checklist on a session page, and the delivery-status banner and per-field Discord test buttons on a campaign page. The bot side (acks, `/help`, autocomplete, the failure embed) is not observable on dev, which has no Discord token; it will be on prod at v4.3.0. Remaining: phase 3 (Prep lane) and phase 6 (wiki lane) are building; then #377, phase 7, phase 8, release.
Author
Contributor

Phase 6 merged (PR #527: #375, #385, #395, #396). Main now carries phases 1, 2, 4, 5 and 6; 26 of the milestone's 34 issues are closed. Phase 3 (the Prep lane, six issues) is the last lane still building; after it, #377, phase 7 and phase 8 run in sequence since they share files, then the v4.3.0 release with its three migrations.

**Phase 6 merged** (PR #527: #375, #385, #395, #396). Main now carries phases 1, 2, 4, 5 and 6; 26 of the milestone's 34 issues are closed. Phase 3 (the Prep lane, six issues) is the last lane still building; after it, #377, phase 7 and phase 8 run in sequence since they share files, then the v4.3.0 release with its three migrations.
Author
Contributor

#377 (PR #529) and phase 7a (PR #530: #387, #390) are merged; 30 of 34 issues closed, main at a3ee8a8. Both PRs needed one CI fix each before landing: #530's own founding-GM test relied on an ambiguous joined_at tie (now dated explicitly, with a deterministic tie-break in the query), and #529 tripped a flaky phase-6 poll test whose wait was too short for a loaded runner (widened). Phase 7b (#388, #389, #382) is building now; then phase 8 (#386), then the v4.3.0 release.

**#377 (PR #529) and phase 7a (PR #530: #387, #390) are merged**; 30 of 34 issues closed, main at `a3ee8a8`. Both PRs needed one CI fix each before landing: #530's own founding-GM test relied on an ambiguous `joined_at` tie (now dated explicitly, with a deterministic tie-break in the query), and #529 tripped a flaky phase-6 poll test whose wait was too short for a loaded runner (widened). **Phase 7b** (#388, #389, #382) is building now; then phase 8 (#386), then the v4.3.0 release.
Author
Contributor

Phase 7b merged (PR #531: #388, #389, #382). 33 of 34 issues closed; only #386 (phase 8, the single live-session screen) is still building. One correction from 7b worth knowing about the plan: widening the cold-open recap to players would have exposed GM-only plot threads, so the endpoint filters them for non-GMs rather than opening the whole payload. Dev is being redeployed with everything merged so far; the v4.3.0 release follows #386.

**Phase 7b merged** (PR #531: #388, #389, #382). 33 of 34 issues closed; only #386 (phase 8, the single live-session screen) is still building. One correction from 7b worth knowing about the plan: widening the cold-open recap to players would have exposed GM-only plot threads, so the endpoint filters them for non-GMs rather than opening the whole payload. Dev is being redeployed with everything merged so far; the v4.3.0 release follows #386.
rbrooks referenced this issue from a commit 2026-09-06 09:30:15 +00:00
Author
Contributor

v4.3.0 is live on prod and dev (release PR #533, tag v4.3.0, deployed 2026-09-06 09:53 UTC). All 34 issues of the milestone are closed with completion notes on each; the build followed the eight phases above, with phase 1 shipped early as v4.2.3.

What the plan got wrong, for the record:

  • #383 was already fixed by #330; it got regression tests instead of a change.
  • #303's premise had moved (#454 had put beat_notes on the GM-gated session response); the read endpoint was added anyway and the field kept, with a test that the two agree.
  • #375's one-line link and #396's search parameter both already existed on main; the remaining scope of each was done.
  • #388 would have leaked GM-only plot threads if the recap had simply been opened to members; it filters them instead.
  • #389's .ics endpoint already existed with no caller.
  • #386 needed no backend rule for proposed sessions: there never was one.

Two decisions recorded here were applied as written: the Prep palette folds to six jobs with every tool kept as a leaf, and SessionDetail is the canonical live-session screen with the old recording address redirecting.

Follow-ups filed during the build, all outside this milestone: #520, #522, #524, #525, and one end-of-milestone bundle for the smaller findings. Closing.

**v4.3.0 is live on prod and dev** (release PR #533, tag `v4.3.0`, deployed 2026-09-06 09:53 UTC). All 34 issues of the milestone are closed with completion notes on each; the build followed the eight phases above, with phase 1 shipped early as v4.2.3. What the plan got wrong, for the record: - **#383** was already fixed by #330; it got regression tests instead of a change. - **#303**'s premise had moved (#454 had put `beat_notes` on the GM-gated session response); the read endpoint was added anyway and the field kept, with a test that the two agree. - **#375**'s one-line link and **#396**'s search parameter both already existed on main; the remaining scope of each was done. - **#388** would have leaked GM-only plot threads if the recap had simply been opened to members; it filters them instead. - **#389**'s `.ics` endpoint already existed with no caller. - **#386** needed no backend rule for `proposed` sessions: there never was one. Two decisions recorded here were applied as written: the Prep palette folds to six jobs with every tool kept as a leaf, and `SessionDetail` is the canonical live-session screen with the old recording address redirecting. Follow-ups filed during the build, all outside this milestone: #520, #522, #524, #525, and one end-of-milestone bundle for the smaller findings. Closing.
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#514
No description provided.