[UX] Mock up every catalogued surface, for players and GMs, before building #659
Closed
opened 2026-09-15 19:48:59 +00:00 by claude-bot
·
25 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
No milestone
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#659
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?
Why
Owner decision, 2026-09-15: nothing in the redesign gets built until every screen and surface in Quest Board has been mocked up, for players and for GMs, and reviewed and changed with the owner (#535, #656).
The list of what to draw now exists:
docs/design/redesign-surfaces/CATALOGUE.md(#657, PR #658). It has 101 surfaces, with all 1,566 current and planned features placed on them.Scope
Every surface in the catalogue. For each one, the mockups show:
The base is Design A (Book & Table) with the shell decisions accepted on #656, drawn in its existing mockup kit (
tools/feedback-site/static/mockups/) so everything shares one look.Outside the web app (EXT-1 to EXT-8): mock the Discord messages and emails too, where their look is Quest Board's to choose.
Before or alongside
The catalogue opens with thirteen decisions for the owner (D1–D13). Each has a proposal. The mockups for the affected surfaces wait for them:
How
sources/overrides.json, new surfaces intosources/surfaces.json, decisions into the intro. Rebuild withsources/build.ps1, so the catalogue stays the single reference.Acceptance criteria
D1–D13 decided (owner, 2026-09-15): every proposal accepted. They are recorded in the catalogue in PR #660: the intro's table, and a "Decided" line on each of the 25 affected surfaces. No mockup is blocked on a decision any more.
Issues whose design these change have been noted: #121 (D2), #124 (D3), #367 (D4), #364 (D12, D13) and #593 (D1, D5, D6).
How the mockup is being built (owner, 2026-09-15):
The look comes first (#661). Three directions for colour, custom icons, type and shape, drawn on Design A's existing screens. The owner picks one before any surface is drawn, because every surface inherits it.
Then one clickable prototype, not static frames.
Built in lanes, group by group:
Each lane has a checklist generated from the catalogue and a player-view leak crawl.
Review:
Hosting: on the feedback site under a new path,
/feedback/prototype: the look directions at/prototype/look, the prototype itself later. Round two's/mockupspages, form and responses are untouched, so people can still answer them.The kit is settled: Lapis Table (#661, closed). Every surface in this mockup is drawn in it.
tools/feedback-site/static/prototype/shared/looks.css(data-look="lapistable"), with the 67-icon set inshared/icons.jsand the kit inshared/kit.css. The prototype opens in it by default.docs/design/redesign-surfaces/look/DIRECTIONS.md./feedback/prototype/icons. Four are flagged for redrawing (table,lore,maybe,map); names are stable, so a redraw doesn't disturb any screen that uses them.Next: lane 1 of the prototype — the shell, Home and the public pages — built on this kit at
/feedback/prototype.Lane 1 scope, settled 2026-09-15
Before drawing anything I pulled every lane-1 surface out of the catalogue and put the boundary questions to the owner. Three decisions:
1. Search is campaign-wide, not global. A search box in the app bar that reaches the campaign you are in — its sessions, people and characters, wiki articles and rules packs — and never crosses between campaigns. This was new scope the catalogue didn't name anywhere; filed as #667, given surface
SH-9and six ledger rows in PR #668.2. The live-session bar (
SH-6) and the campaign-wide banners (SH-8) move to lane 2. Both are filed under the shell, but neither ever appears outside a campaign page. They are better judged sitting on the page they belong to than floating above one that isn't drawn yet.3. Profile (
HOME-5) and notification settings (HOME-6) join lane 1. The account menu and the bell both open them, and drawing the menu without them would leave two entries pointing at nothing. It also puts pronouns (#653) and the per-channel alert settings in front of the owner alongside the bell that feeds them. Plan & billing (HOME-7) stays out — it is speculative (#642) and belongs with the admin lane.Lane 1 as it now stands — 20 surfaces
PUB-1Sign in ·PUB-2Sign-in failed ·PUB-3Invite landing ·PUB-4Public analytics share ·PUB-5Help index and guides ·PUB-6Rules licences and notices ·PUB-7Not found / crash / loading / offline ·PUB-8First-run instance setup ·PUB-9Discord link result pages ·PUB-10Accessibility statementSH-1App bar ·SH-2Contents: Home ·SH-3Contents: campaign ·SH-4Account menu ·SH-5Notifications panel ·SH-7Shared patterns ·SH-9SearchHOME-1Home: Needs you and your campaigns ·HOME-5Profile ·HOME-6Notification settingsThe extraction counted 156 feature rows across the original 19 surfaces;
SH-9adds six, andHOME-5/HOME-6add their own on top, whileSH-6(which has no rows at all) andSH-8(7 rows) leave for lane 2.Two things the extraction found that the mockup has to answer
SH-072on Home,SH-097in the guides,SH-091on the join page). Worth deciding whether the redesign wants a real one or keeps the current pattern.SH-4has no settled phone home. Design A's phone "You" entry names only Profile and Help, so where Admin, Theme and Sign out live on a phone is still open.SH-5's bell has the same problem —IS-198says the phone bar "makes room for it", placement undrawn.Both are on the list to resolve when those surfaces are drawn, not assumed.
Lane 1 is drawn — the shell
At
/prototype/lane1(PR #669). Six surfaces:SH-1the app bar,SH-9search,SH-5the bell,SH-4the account menu, andSH-2/SH-3the Contents. The bell and the account menu had never been drawn; search did not exist until #667 was decided the same evening.What the drawing commits to
IS-295).IS-162). Deleting the row would make the earlier count wrong and read like a bug.IS-048).Still open, drawn both ways rather than decided
A correction worth recording (#653)
My first draft of the account menu showed Priya the pronouns he/him — her character's, not hers. The shared sample only ever carried character pronouns, which made that error structurally easy to make rather than a slip.
shared/data.jsnow carriesplayerPronseparately frompron, and they deliberately differ: Priya (she/her) plays a he/him rogue, Marcus (he/him) plays a she/her druid. Search renders both, each beside whom it belongs to — "Wren Halloway · Druid 6 · she/her · played by Marcus (he/him)".Anyone drawing a later lane must keep the two apart. A surface that names a person has to say which set it is using. This is the concrete shape #653 takes in the mockups.
Method note for lanes 2–8
Rendering each lane in a real browser before showing it caught three faults in my own first draft: a caption promising a search box the drawing did not have, a caption pointing at the wrong row, and desktop bars drawn in 340px columns where the breadcrumb wrapped at a width no desktop has. Worth doing every lane, not just this one.
The shell now lives in
shared/shell.cssandshared/shell.jsso lanes 2–8 share one copy.look.htmlkeeps its own inline copy deliberately — it is the frozen record of the look decision and must not be breakable from here.Next: lane 2, the campaign core, which now also carries
SH-6(the live-session bar) andSH-8(the campaign banners) after the scope decision above. Waiting on the owner's answers to the four questions first, since two of them change the shell every later lane sits in.Lane 2 — the campaign core — drawn (PR #673)
This week, the sessions list, making a session, members & characters, plus SH-6 (live-session bar) and SH-8 (banners). Settings gets its frame and two of nine sections; the rest is lane 2b.
The lane as scoped was 15 surfaces / 202 rows, of which Settings alone was 109 across nine sections. Split on the owner's decision: core now, the remaining seven settings sections next.
Catalogue corrections made before drawing
Per this issue's rule that a surface's rows must be right first:
SE-025–027,SE-147–150,IS-011andIS-231were all on SESS-2 alone. Added to CAMP-1 inoverrides.json— 5 borrowed rows → 14.IS-304–309.Catalogue rebuilt: 1,578 rows on 102 surfaces.
Decisions recorded in the intro
Decisions taken while drawing, marked on the page
IS-199).Rendering it caught four faults that reading the code did not
IS-295's exact failure, in the place it matters most.Same lesson as lane 1: the page has to be looked at, not just read.
Still open for the review
IS-308— whether the live bar follows you off the campaign's own pages, leaving a live session invisible from Home. Drawn as the alternative.Next: lane 2b, the seven remaining settings sections (Invites, Ownership, Recording & AI, Wiki, Content packs, Foundry, Archive & delete).
Separately, #671 — found while scoping this lane — is fixed in #672 rather than waiting for the rebuild.
Lane 2b — the rest of Settings — drawn and live (PR #682)
At https://questboard-dev.rhoving.com/feedback/prototype/lane2b.
?only=<id>shows one screen alone (nav,camp10,camp11,camp13,camp14,camp15,camp16,camp17,gen,open), and&theme=lightchecks the light theme.The seven sections lane 2 did not draw —
CAMP-10invites and joining,CAMP-11ownership,CAMP-13recording/retention/AI,CAMP-14the wiki's edit permissions,CAMP-15content packs,CAMP-16Foundry,CAMP-17archive/export/clone/delete. 84 feature rows, of which 56 are in two sections. Three sections hold 8 rows between them, 7 of those unbuilt.Decisions recorded in the intro
SH-036's unsaved-changes prompt only fires on a change of pathname, so nine sections as tabs of one page would lose an edit with the guard sitting right there.CA-225's compact form; managing them lives in Settings. Otherwise CAMP-8's primary Invite players button pointed at a page a player cannot open.get_effective_retentionlets any non-null campaign value win, so the "default" is a default in name only.CAMP-11is renamed Ownership. It was named for two things and held one: Make GM, Remove GM, the owner badge and even the transfer entry point all live onCAMP-8, on the row of the person they affect, and stay there.Five new
ISrows for the scope D24/D25 created (IS-310–IS-314). Catalogue rebuilt: 1,583 rows on 102 surfaces.Also settled while drawing
D12the difference is not which is scarier but whether anyone is holding the link: revoking a live one states its consequence, removing a dead one just goes with an undo..btn--danger, borrowing the amber.modal__dangeralready uses). Lane 2's erase-recordings modal should arguably get it too; left alone rather than editing a reviewed drawing.Rendering it caught six faults reading the code did not
hiddenand is opened by a tap a screenshot does not make, under a caption promising it. Unhiding it exposed a second fault behind the first: the sheet is positioned against.app, so on a page drawn at its natural height the panel landed at the foot of a two-thousand-pixel document instead of over the screen.Pathfinder 2e · 214 creatures— an entity written into a string that is then escaped.aria-labelread“previously on”literally, which a screen reader says as "ampersand ldquo semicolon". Invisible on screen and the whole of the label for anyone listening.Two things in the code, found while scoping
IS-188— export withholds unlicensed records and only the downloaded file says so. The manifest lists each one and the response carries a header with the count, but the button is a plain download link so the page reads neither. Drawn as a line under Export.A correction to lane 2
CAMP-9General was drawn at about thirteen of its eighteen rows and captioned as whole. The registry-match nudge (CA-018), the blank-timezone warning and the entire stat-conversion panel that D5 put in Settings → General were missing. All three are drawn at the end of this page.Separately
#675 is closed (PR #681): the feedback site's tests now run in CI, its dependencies are pinned so CI, the image and a local run are one environment, and two new tests derive what must answer from the folder rather than a hand-kept list — because "page added, route forgotten" is the same forgetting that leaves the list stale.
Next: lane 3, the table and recording.
Lane 3 — the session lifecycle — drawn, reviewed and settled (PR #686)
At https://questboard-dev.rhoving.com/feedback/prototype/lane3.
?only=<id>shows one screen alone (sess1,sess2,sess5,read,review,notes,open),&theme=lightfor the light theme. Reviewed 17 September with no changes asked for.A scoping correction first
This lane was lane 2's. This issue scoped lane 2 as "campaign core: This week, the session lifecycle, Members, Settings". Settings turned out to be 109 features, forced the 2/2b split, and the session pages were quietly dropped — 2b closed out Settings rather than the lane, so nothing flagged it.
SESS-1–SESS-7is 166 features and no mockup had touched any of it.Drawn as one page through five lives rather than six unrelated screens: proposed while people vote, confirmed, cancelled, and afterwards the Read and Review tabs, plus notes.
Decisions recorded in the intro
SE-095–SE-102are all cataloguedmember, so today every player reads "Recap email: Sent" and "Journal entry: Queued" — the D14 shape again: nobody chose it, it is what the page does.IS-317).Plus
IS-316for the notes switch. Catalogue rebuilt: 1,586 rows on 102 surfaces.Two decisions were invisible to anyone drawing these surfaces
D17 (one time, the reader's own) and D20 (no explanatory callouts) are recorded in the decisions table as governing
SESS-1/2/3andTABLE-1, but noDecidedline appeared on any of those surface headers — unlike every other decision, which carries one. Someone reading the surface block, which is what you read when you draw it, would have missed both. Added before drawing.Worth a general check: that was a silent failure of the catalogue's own convention.
Rendering it caught six faults — two in the shared kit
The shared-kit two were about to affect every remaining lane:
.dothas a width and height and nodisplay, so a bare inline span collapses to nothing — four of the five rows of the voting grid were simply empty. Every existing caller happens to put a dot inside a flex row, which hides it. Fixed inkit.css.shell.jshardcoded "Session 13" in the Contents sub-list whenever the active key wassession13— true forlook.html, which only ever drew one session, so a Session 14 page mislabelled itself.And four in the drawing: four of five rows reading as colour alone (
IS-295's exact failure, with the roster directly beneath already correct); two slots tied on seven points with one starred; a player voting on every slot while the roster said she had not answered; and "Who was there" showing RSVPs on a session already played, under a banner saying four voices had been matched.Three things in the code the drawing had to work around
SE-154's leave-page guard the only net. D31/IS-317.SE-157): Start and Stop stay live on a completed and a cancelled session. DrawingSESS-5from D9 rather than today's behaviour is what makes that visible.STATUS_CLASSEShas no entry), so every state is drawn with a word.Lane progress
TABLE-1–TABLE-5Next: lane 4, the table and recording — 153 features, of which
TABLE-1alone is 101 and is the largest surface in the catalogue. Its biggest question is already visible: six header controls are hidden below the phone breakpoint with no replacement (TB-070), so a GM at a table holding a phone gets a back link and a title.D37 decided (lane 4 review), merged in #692 (
631e911), deployed.The GM's shelf stays freeform, not
look.html's reflowing grid, and sideways scrolling is an officially supported way to get more room on the board.This came from the question of what happens if a GM preps on a 4K monitor and plays on a 1080p one. The variable is CSS width, not resolution: a 4K monitor at 200% scaling is as wide as a 1080p one. Card positions were already screen-independent. What was missing is deliberate scrolling: today the whole page scrolls rather than the board, and nothing marks a card that is off-screen.
Decided (D37)line on TABLE-1, and three new features:Lane 4 has no open questions left and awaits any further review. Next up: lane 5 (Prep), where scenes get built (PREP-1).
Lane 5 — Prep (PREP-1/2/3): scoped and decided with the owner, now drawing. It will be recorded as D38–D44.
ShelfPin, an interval over the session timeline, #254), extended to the sheet, so an item and its shelf card share one pin. Generation history's retention-only "pin" goes away; history keeps its 30-day rule for runs that never reached a sheet.Calls accepted without change:
Filed along the way: #693, a live bug where Re-open on a Names history row opens a blank tool.
Lane 5 — Prep is drawn, merged in #694 (
62c0a24) and deployed at/prototype/lane5.The page draws the full sheet and each of D38–D44 in turn.
Next: lane 6 (wiki, discussions and safety), which also picks up SESS-6's Talk tab (D32).
Lanes 1b and 2c: the surfaces no lane owned (#696). Scoped and decided with the owner; now drawing.
Lane 1b covers Home and you (HOME-1–7). Lane 2c covers the rest of a campaign: CAMP-4–7 and the shared patterns in SH-7.
D45: a member reads the campaign's name, system and description on This week, not in Settings. Drawn in the lane 2 backfill.
D46, starting a campaign: a New campaign page that opens on a choice: blank, from a template, a one-shot, or import a file. Join stays a small form on Home.
D47, Storyline: two parts. The story is in chapters, generated, and the GM edits it. The timeline holds sessions, milestones and wiki events, one line each, and is filterable. Milestones become timeline entries. The journal goes, since notes live on each session (D30), and the wiki pieces go to the wiki.
D48, notification settings: a grid of the four categories against the three channels.
D49, Plan & billing: drawn now, provisional (the owner may change it after seeing it), using the owner's placeholder prices:
This sits inside #642's model: slots are on the owner's plan, there is no free tier, and self-hosted instances show no billing at all.
Calls accepted:
Lane 7 — Admin — drawn, merged and deployed (PR #710,
bc883f8)At https://questboard-dev.rhoving.com/feedback/prototype/lane7.
?only=<id>shows one screen alone (nav,users,camps,rec,backup,packs,notices,ai,usage,discord,email,health,audit,import,plans,open),&theme=lightfor the light theme.Fourteen surfaces, 179 placements, and Design A drew none of them. Four have a server behind them and no screen at all: Campaigns, Content notices, Instance health, and the summary-mode switch.
What it commits to
PUT /api/admin/campaigns/{id}/ownerby hand.Two things the drawing had to be honest about
IS-081), so the page says so rather than implying they are covered.Coverage
coverage/lane7.py: 179 placements, none missing — 154 drawn, 17 replaced by a decision or a proposal, 8 belonging to another surface. All ten coverage scripts pass against the rebuilt catalogue.Rendering caught eight faults
Three were drawing faults (Admin's sub-list vanishing on its own section pages, backup runs listed oldest-first, a still whose markup collapsed the grid beneath it); five were made-up facts that contradicted the rest of the prototype — a session shown transcribing before it has been played, audio shown binned in a campaign that keeps it 90 days, a campaign's retention disagreeing with its own cap dialog, an entity escaped twice, and import outcomes naming lane 2b's campaign packs.
Next: lane 8, outside the app (EXT-1 to EXT-8) — Discord's commands, posts, reactions and DMs, email, calendars and the installed app. It is drawn and render-checked; 71 placements, none missing.
Still not drawn anywhere: the ten public pages, PUB-1 to PUB-10. This issue's plan put them in lane 1 ("shell, Home, public pages") but lane 1 drew only the shell, and #696's orphan sweep did not list them. They are sign in, sign-in failed, the invite landing, the public analytics share, Help, Licences & notices, not-found/crash/offline, first-run setup, the Discord link result pages, and the accessibility statement. I'll draw them as their own lane after lane 8 unless you'd rather they came first.
Lane 8 — outside the app — drawn, merged and deployed (PR #711,
68de545)At https://questboard-dev.rhoving.com/feedback/prototype/lane8.
?only=<id>shows one screen alone (ext1,ext2,ext3,ext4,ext5,ext6,ext7,ext8,open),&theme=lightfor the light theme.That is all eight lanes drawn. Seventy-one placements here, across Discord's commands, posts, reactions and direct messages, email, calendars, the installed app, and Foundry (which has nothing to draw yet).
What it commits to
The failure messages are the bulk of it
Six recording outcomes, the three ways a bot restart can leave a session (#393), four command failures that read differently because they are different, two reaction fallbacks, and the webhook's plain-text version for campaigns with no bot. Each says what happened and what to do next.
Coverage
coverage/lane8.py: 71 placements, none missing — 55 drawn, 3 replaced by a proposal, 7 belonging to another surface, 1 behaviour, and 5 deferred (the speculative Matrix and Element Call ideas, which the page names rather than draws).Where the eight lanes stand
Next, and last: lane 1c, the public pages (PUB-1 to PUB-10) — the gap I flagged on #696. It is drawn and render-checked: 98 placements, none missing. It draws sign in, sign-in failed, an invitation, the shared analytics page, Help, licences and notices, not-found and the crash screens, setting up a new server, the Discord link pages, and the accessibility statement (D4).
Lane 1c — the public pages — merged and deployed (PR #712,
df11b84)At https://questboard-dev.rhoving.com/feedback/prototype/lane1c. 98 placements, none missing.
With this, every catalogued surface is drawn. 103 surfaces, across fifteen pages, each with a coverage script that fails if a feature goes missing.
What is waiting on you
Everything below is drawn both ways, or drawn with a recommendation and marked on its page under "Proposed, and settled". Nothing here is settled, and each is a small edit to reverse.
Decisions drawn provisionally
Proposed while drawing (23 items, all in
headers.md)Admin (lane 7) — Admin opens into sections in Home's Contents and the ten tabs go; Bot Settings splits into AI models, AI usage & speed and Discord; every Test works on what is typed; an account that owns a campaign is sent to hand it on; making someone an administrator asks, taking it away is undone; the audit log filters by name; Back up now does not ask; the default for audio is "bin it once the summary is approved".
Outside the app (lane 8) — one shape for every channel post; a post meant for the GM goes to the GM by direct message; a ❔ reaction for "maybe"; every post's footer says what its reactions mean; one-click unsubscribe on every email.
The public pages (lane 1c) — a real "not found" page instead of the double redirect; a session that ran out says so; the shared analytics header links somewhere a stranger can use; an invitation says whether the table records its sessions; first-run setup remembers every skipped step in Admin rather than nagging.
The wiki (lanes 6b–6d) — one Save for a whole page; facts and a timeline on every kind of page;
:::for Ossian Valeblocks that follow the character; a player's suggestion arriving as a draft; revealing a GM-only map marker through lane 6a's picker; a quest page carrying its own threads.Two open server questions the drawings depend on
IS-258— whether an unfinished first-run setup blocks or reminds. Drawn as a reminder that does not nag.IS-081— whether map images are in backups. Nobody has checked, so lane 7 says so rather than implying they are covered.What I would do next, unless you want something else first: the acceptance criteria on this issue end with writing the decisions into the brief (#361), ready for the design system (#364) and the build lanes (#366). That is now a real job: D1 to D61 plus the proposals above. I can start it whenever you say, but the review of what is drawn should come first, since it may change what gets written down.
Owner's review received 2026-09-20 (lanes 1c, 7, 8, and two general rules). Applying it now.
What it settles, to be recorded as D62–D67:
Also from the review: lane 8 stands as drawn (its five proposals taken as accepted); lane 7's Users table gets its padding fixed; and the question of a server owner who cannot step down or be removed gets a recommendation and a drawing, for you to answer.
Two open items closed by looking rather than asking: IS-081 — the scheduled backup is the database and the audio volume; uploaded images are not in it (OPERATIONS.md documents a manual tar), so lane 7's Backup page will say so and propose including them.
Next: the prototype index gets a review tracker (what is reviewed, what waits on you, and one clear question per open point), and the same questions are posted here when the PR lands.
The owner's review of 20 September is applied — PR #713, merged as
c1aed7fand deployedThe prototype index is now the review tracker: https://questboard-dev.rhoving.com/feedback/prototype — where each lane stands, what waits on you, and the questions below.
What changed, by lane
Recorded: D62–D67 in the decisions table; IS-384 to IS-397; three new surfaces (PUB-11, PUB-12, ADMIN-15). Catalogue: 1,666 rows on 106 surfaces. Coverage: lane 1c 109, lane 7 189, lane 2b 149, lane 6d 113, none missing; all twelve scripts pass. Render-checked in dark and light.
One caution on D64 (licences): the ORC and CC BY licences want a pack's attribution shown where its material is used. Showing it to members at the foot of the rules chapter and in Content packs meets that without a public inventory — Q4 asks you to confirm that home.
Questions for you — a word or two each is enough
When you answer, each becomes the next D-number, the question leaves the tracker, and the lane page's "Reviewed, settled, and still open" section is updated.
Your ten answers and the lane 5/6 reviews are recorded and drawn — PR #721, merged and deployed
Decided, D68–D73
Confirmed or amended: D41 keep; D62 all three numbers; D64's home confirmed, and Licences & notices reworded to say the simple thing — Quest Board does not come with game rules; the people running each game add content they are licensed to use; a rightsholder who finds content used without a proper licence can ask for it to be removed; D65 stops only (the themed banner stays on the patterns sheet as the road not taken); D66 gains concise — "Message" replaces "More, if it helps" on the new-thread form; a GM seeing every thread confirmed. Every proposal made while drawing is accepted: the fifteen "Proposed … for the owner's review" lines are Decided in the catalogue, and each lane page's section says so. Lanes 5 and 6d: no changes.
The tracker at https://questboard-dev.rhoving.com/feedback/prototype now shows every lane reviewed, no question open, lane 9 not started, and what is new since your last look (the licences wording, the prices form, the naming stills, the Message label).
Catalogue: 1,672 rows on 107 surfaces; all twelve coverage scripts pass (lane 6b 185, 6c 187, 7 190).
What comes next is your call: lane 9's research and design (#720), or writing D1–D73 into the brief (#361) first, ready for the design system (#364) and the build lanes (#366).
Lane 9 drawn and deployed (PR #723, merged 2026-09-21). Stat blocks and character sheets, the last lane: every one of the 107 surfaces now has a drawing.
/feedback/prototype/lane9; the tracker on/feedback/prototypemarks it "Drawn 21 Sep, awaiting you" with Q11 to Q15 for the owner.docs/design/character-sheets-spec.md; the twelve proposed decisions D74 to D85 and the questions are summarised on #720, which stays open for the owner's review.IS-404toIS-436on WIKI-19 with seams on WIKI-3, WIKI-7, TABLE-1, PREP-2, WIKI-15, ADMIN-11 and CAMP-8; all thirteen coverage scripts pass.qb-feedback-data-20260921T200500Z.tgz, 6 responses); container healthy; the two lanes checked return 200.Open on this issue: the owner's review of lane 9 (D74 to D85, Q11 to Q15) and the "agreed" on the brief (#361).
Lane 9 reviewed and closed (PR #724, merged 2026-09-21; #720 closed). Every lane is now drawn and reviewed, and no question is open.
The owner's review: "Looks great", with two asks and five answers, all applied and live on the review site:
IS-437, D78 amended): the definition's levels table walked in order, What changes before it applies, a version kept first; drawn for PF2e (Ossian's level 7) and 5e (Tam's level 4).Catalogue at 1,706 rows on 107 surfaces; all thirteen coverage scripts pass. Review site redeployed after a volume backup (6 responses intact); the tracker shows lane 9 reviewed and nothing waiting.
Still open on this issue: only the owner's "agreed" on the brief (#361), which is the handoff to the build.
Every surface, checked row by row now (PR #725, merged 2026-09-21). The owner asked whether every surface is covered and whether anything is missing.
coverage/lane1b.py,lane2c.pyandlane5.py, written by a strict audit and committed, so all sixteen scripts exist and pass.IS-213), calendar invites as a row of the notification grid (SH-133), a plan with no slots, the milestone edit in full, sessions in the last 30 days, the article picker inside a tool (PR-138), and Planning for a campaign just started. All drawn, and live on the review site (each page's coverage paragraph says what the second pass found).So the answer is: every surface is drawn, every lane is verified row by row against the live catalogue, and the brief is complete through D85. Nothing on this issue waits on drawing. What remains is the owner's "agreed" on the brief.
Drawn after the fact (PR #1047, merged 2026-10-03): five surfaces that were built from review notes without a drawing are now in the prototype, as built, and their ledger entries are flipped to drawn.
#review#camps#toolsand#phone#scenes#readand#reviewEvery coverage script passes with nothing unclassified.
Still on the old wording (noticed, not changed):
lane4.py's IS-476 entry still say "End of session…" where the app says "Sweep the shelf…".Owner's answer to Q148 (T18), 2026-10-04: (a), as recommended. The app is right in both places, and the drawings change to match:
lane4.py's IS-476 entry follows.To be recorded as D276. It will be done once the phone-table drawing (Q143 and Q144, also in lane 4's page) has merged, so the two changes to that page don't collide.
D276 carried into the prototype: merged as PR #1067.
coverage/lane4.py, the IS ledger and the rebuilt catalogue match.CI was green on the PR's head before the merge.
One thing left for the owner: "Sweep the shelf…" wraps at 390 px. Whether to tighten it is listed on the Build Status page.
Closing with the v4.5.0 milestone (owner, 17 Oct 2026). Every catalogued surface was drawn, reviewed and built for 4.5.0. The catalogue (docs/design/redesign-surfaces/CATALOGUE.md) stays the record.