v4.4.0 build order: UX Overhaul in six phases, with two review checkpoints #535
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?
Tracking issue for the v4.4.0 milestone (12 issues: the seven-step design process #361–#367, plus #182, #422, #424, #437, #464 folded in). The order, the reasoning, and where the milestone stops for a human decision. The v4.3.0 tracking issue (#514) is the model.
Principles
Closes …, auto-merge on green CI, completion notes on every issue, dev deploy after each phase for a look, prod once at the end.Phase 0 — Mechanism (parallel, starts now)
createBrowserRouter+RouterProvider;useBlockerin the unsaved-changes hook for the summary and transcript editorsset-state-in-effectsites, then adopt the plugin'srecommendedpresetDifferent files; both are prerequisites for everything that follows.
Phase 1 — The brief (#361) → checkpoint A
A fresh surface inventory (the audit's route table predates v4.3.0's nav bar and is in a gitignored folder that no longer exists on any machine), the six journeys as the acceptance bar, the vocabulary mapping (mostly settled by #379; the leftovers are named), the constraints, and the list of what must survive. Presented together with phase 2 so there is one review rather than two.
Phase 2 — Wireframes (#362) → checkpoint A
Seven low-fidelity concepts, each taking a distinct position on the five questions the audit posed (where attention lives, what the spine is, whether the session or the campaign is the primary object, how GM and player views relate, what the at-the-table surface is). Each concept shows the six structural surfaces at desktop and phone width and is walked through the six journeys; the secondary surfaces are placed in a table per concept. Delivered as a single comparison page. The owner picks two or three concepts, or elements of several, to carry forward.
Phase 3 — Mockups (#363) → checkpoint B
Three to five high-fidelity directions built from the choice at checkpoint A, populated with realistic sample data (a campaign mid-arc, sessions in every state, a real-length transcript and summary, a populated wiki, a queue of suggestions, a recording in progress), at desktop, tablet and phone widths, GM and player, including loading, error, empty and in-progress states. The owner picks one direction, or a recombination, and that decision is written into the brief.
Phase 4 ∥ — Backend groundwork (parallel with phases 1–3)
GETrouter, validation results and cited transcript timestamps included), tests, no change to what a GM sees yet. The decision on per-run versus last-write-wins is made here: per run, because #423 showed two runs over the same audio genuinely differ and the comparison is the point.Phase 5 — The build
window.confirm, page-level errors and ad-hoc styles with the library as it goes.Phase 6 — Release
v4.4.0 at the end, deployed dev then prod. Phase 0 rides with it rather than earning a patch release of its own; if the design phases run long, phase 0 plus phase 4 can ship as v4.3.1 to keep the deploy cadence.
Out of scope, noted
No backend re-architecture, no new features beyond the four folded issues, no change to the Discord embeds or notification content (v5.4.0), no localisation. Table and safety tools are v4.5.0; they will be built on this design system.
Phase 4 correction. #424's backend half does not need building: it shipped in v4.0.0 (
2791c24,aa4bff9) assummarisation_runs+session_beatswithGET /api/sessions/{id}/summarisation-runs[/latest], GM-only. The plan above was written from the issue body, which predates that. The per-run decision recorded here was already the shipped behaviour. #424 is now frontend-only and stays in the session lane of phase 5b, building against the latest-run endpoint. #437's backend half is unaffected and in progress.Phase 0 and the phase 4 backend half are on main (
b57fd09).cce8601GET /api/admin/campaigns, metadata only9373464b57fd09Two things the lanes could not have seen alone: #464's new hook seeded its blocker key from an effect, which #182's newly enabled rule forbids, so #540 carries a one-commit reconciliation (
useIdinstead); and the merge run for #538 hit the v4.3.0 "poll gives up" flake, which turned out to be an ordering race rather than a timing margin, fixed in a follow-up PR against the test only.Follow-ups filed from the lanes: #536 (Shelf tonight-notes debounce not flushed), #539 (body autosave "Saved" wiped). #424's backend was already on main from v4.0.0, so phase 4 had one lane, not two.
Checkpoint A (brief + concepts) is published and waiting on the owner. Deploying phase 0 to dev next for a look at the router change in a real browser.
Checkpoint A widened. The owner wants the players (the beta testers) to weigh in on the player side, and the redesign checked against in-person tables now even though those features are a later milestone.
Checkpoint A is now collectable from people without accounts: the players' and GMs' pages run as a self-hosted site at https://questboard-dev.rhoving.com/feedback/ (PRs #546, #550; iac-repo #405 for the route). Players see the phone drawings only; GMs also see each concept's shared screen for an in-person table and give that feedback. Checkpoint A closes when the owner has the responses and picks the concepts for #363.
Incident note, 2026-09-07: the feedback site's pages redirected to the dashboard for anyone whose browser had used the dev Quest Board. Cause: the app's service worker answers every navigation on the hostname with the app shell unless the path is denylisted, and
/feedbackwas not. Fixed in PR #551 (/feedbackon the navigation-fallback denylist and network-only), merged and deployed to dev at599829e; the served worker now carries the exclusion. Browsers holding the old worker are right after one reload. Also live at the edge: the/feedbackredirect keeps its query string (iac-repo #406), and the site's pages answer HEAD. Recorded as a rule in the config comment: any non-app path served on a Quest Board hostname needs the same treatment.