Build lane 1: the shell, Home and you (SH-1 to SH-9, HOME-1 to HOME-7) #727
Closed
opened 2026-09-22 00:12:19 +00:00 by claude-bot
·
18 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#727
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?
Build lane 1 of the v4.5.0 redesign. The brief is
docs/design/v4.5.0-brief.md(§9, the lanes in order); the build plan isdocs/design/v4.5.0-build-plan.md(the rollout rule, the design-system mapping, the journeys as tests). Umbrella: #366. Goes after lane 0 (#364, the design system).Scope
Surfaces: SH-1 to SH-9 (the shell, the Contents, the account menu, the bell, search, the footer, the patterns), HOME-1 to HOME-7 (Home, New campaign, Join, put away, Profile, Notifications, Plan & billing).
The drawing:
/feedback/prototype/lane1andlane1b— the page the build must match, still by still.Decisions: the brief §7, and each surface's header in
redesign-surfaces/sources/headers.md.Server changes it needs (in this lane or an earlier one)
IS-163toIS-169): the bell, the grid of kinds by channel, per-campaign muteIS-362,IS-376)IS-222,IS-223); the star-and-wish prompt (IS-213)SH-139,SH-142); calendar invites as a notification row (SH-133)Acceptance
coverage/lane1.pyandcoverage/lane1b.pyclassifies as drawn or replaced is built as the prototype draws it; the script is the checklist. Rows it marks behaviour are tested, not drawn.vocabulary.js; no page-level error destroys rendered content; every async operation shows progress and a next action on failure; disabled controls say why.redesign-surfaces/sources/headers.md(Decided lines and the owner's review notes) are honoured; a departure is a decision change on #659 first.Notes
🤖 Generated with Claude Code
Picking this up (2026-09-22), now that lane 0 (#364) has merged its three PRs. The PR series, in order, following the plan's working agreements (the server change first, then UI-only PRs):
AppLayoutbecomes the lane 0 shell (app bar, Contents rail and sheet, account menu, bell, search, footer, live bar);NavBar.jsxgoes; the vocabulary rename (§5) lands invocabulary.jsand on the old pages. Main deployable, every old page inside the new frame.journeysCI job; J1 and J2 as far as the shell carries them once (2) is in.Each PR names its coverage rows from
lane1.pyandlane1b.py.PR #742 is the shell around every page (series item 2), ahead of the server PR because the two are independent: everything the frame asks the server for is optional and degrades to nothing on a 404, so it can merge in either order. It carries the vocabulary rename too. The Contents lists only the pages that exist today; each missing entry is named in a comment against its lane.
Two decisions worth a look in the PR body: the library's components draw real links and stay free of react-router (so
/designcan render them), and the frame routes their clicks with one listener; and the frame is exactly the viewport, so an old page sayingmin-h-screencan scroll by a bar's height inside it until its lane replaces it.The server PR (series item 1) is built on
build/lane1-notifications, whole backend suite green in Docker (3,674 passed, 88 new), the migrationf5a6b7c8d9ebverified up, down and up against Postgres and matching the models name for name. Notifications (#655's core: store, recipients on the server, text rendered at read time with the reader's permissions, "No longer available", the email adapter with today's recap opt-in carried over and the recap email itself untouched), the settings grid and campaign mutes, campaign search, the campaign's live state,pronounson/api/me,GET /api/meta, anddocs/API.md. It rebases onto #742 and opens as a PR once that merges.Two things it found that are decisions rather than code:
GET /api/campaigns/{id}/searchis already taken by the old campaign page's session-memory search (a bare array over summaries and transcripts). Two shapes cannot share a path without breaking that page on main, so the new one is/search-allfor now; when lane 3 rebuilds the campaign page onto it, the old handler goes and this moves to/search. The shell's client changes one string.There is no session numbering in Quest Board. No column, field or concept anywhere, yet the prototype says "Session 14" on the Contents, the crumbs, the bell and the live bar. The server did not invent an ordinal (the nth session by date changes whenever one is cancelled), so for now every place the drawing says "Session 14" the app says the session's title, and the harness's fiction titles its sessions "Session 13: …" and "Session 14: …". If numbering is wanted for real, it is a column with a backfill and a rule for cancelled sessions: its own issue, and the owner's decision.
Smaller choices, all in the PR body:
rsvp_requestedfolds intosession_confirmed(one row for one moment, linking to the page the RSVP control is on);calendar_inviteis defined but not fired, since it would double the bell for the same confirm; a vote-mode session's creation firesvote_opened(it counts the options) and a tentative onesession_scheduled; muting also silences the recap email, and no existing user has a mute so nobody's mail changes today.#742 (the shell around every page, and the vocabulary rename) is merged on green CI. Main now shows every old page inside the new frame. The server PR and the harness are rebasing onto it; the harness's smoke journey is being rewritten against the new account menu and Contents, and the fiction is unified on the prototype's "Dana Whitlock".
PR #744 is the server side (series item 1), rebased onto the shell: notifications, the settings grid and mutes, campaign search at
/search-allwith the shell's client pointed at it, the live endpoint with a reachablestale(the backend keeps a ten-minute memo of the last active recording it saw, so a bot that died mid-recording no longer reads as "not being recorded"),pronouns, and/api/meta. 3,684 backend tests, 98 new.Next, chained on it so the migrations line up: Home's own server change (series item 4's first half): the three templates (a weekly series, a fortnightly vote, the setup of one of your own campaigns with nothing from its story), the one-shot preset (IS-223), and the star-and-wish prompt (IS-213, IS-216).
#744 (the server side) is merged on green CI. Main now has the notifications store and API, the settings grid and mutes, campaign search, the live endpoint,
pronounsand/api/meta, and the shell's bell, search box and live bar read them. Open: #746 (the harness) in CI, #745 (the account menu's ARIA and contrast) being fixed, and Home's server change being built on top of this merge.PR #748 is Home's server side: the three templates, the one-shot preset (one session pencilled in through the ordinary path), and one star, one wish (asked once, the day after; the GM's read carries a name only when the person signed, and no user id at all). It also fixes #743 by honouring the eight fields campaign creation already validated. 3,760 backend tests, 55 new. Once it and the harness (#746) are on main, the Home UI PR follows: Home replaces Dashboard, New campaign as a page opening on a choice, Join on Home, the fold for archived and binned campaigns, and J1 and J2 filled in as far as Home carries them.
#748 (Home's server side) is merged on green CI, and #743 is closed by it. The Home UI PR (series item 4) is now being built: Home replaces Dashboard with Needs you, the star-and-wish prompt, the campaign cards with This week / Last time and the recap line, Join in place, and the put-away fold; New campaign as its own page opening on the four choices; a
GET /api/me/homeaggregate so the cards are one request; and J1 and J2 filled in as far as Home carries them once the harness (#746, rebased and back in CI after a conflict with #747) is on main.The harness (#746) is merged, so the Home PR can carry J1 and J2. Merged today on this lane: #742 (the shell), #744 (the server side), #747 (the account menu fix), #748 (Home's server side); open: the Home UI PR in progress, then You.
PR #749 is Home (series item 4): Needs you, the star-and-wish card, the campaign cards from a new
GET /api/me/home, Join in place, the put-away fold, New campaign as a page opening on the four choices, and J1 and J2 as far as Home carries them, green in all three projects with/dashboardand/campaigns/newclean under the strict axe gate. The journeys found three more defects in the shell on the way (an underline-less link in a sentence, the bell drawing eight of twelve kinds, and the bar's link colour reaching into the bell's popover), all fixed in the PR.One thing for the owner in the PR body: Needs you says a time in the reader's zone while the card beside it says it in the campaign's, because
/api/me/attentioncarries no zone. The You PR (series item 5) is being built in parallel and follows.#749 (Home) is merged on green CI, with J1 and J2 green on the runner. Five of the lane's six PRs are on main; the last, You (Profile in sections, Notifications as the grid, Plan & billing on a hosted instance), is being built and will follow.
PR #750 is You, the lane's last (series item 5): Profile in sections with pronouns and three independent saves, Notifications as the grid (a
recapscategory and calendar invites on the server side; Discord DM listed as unavailable until lane 10 delivers it, so no switch is offered that does nothing), and Plan & billing behind #642's phase 1 entitlements read, which answers "not hosted" on every real instance today so the page and its menu entry stay absent. Its journey walks the You pages in all three projects, strict-clean. 1,236 frontend and 3,821 backend tests.After it merges, the lane's remaining gaps are the three rows deliberately left with a comment: IS-195 (the ownership-offer row on Home wants a row on
/api/me/attention), IS-152 (Discussions kinds, lanes 7 and 8) and IS-376 (the hosted slot line on New campaign, with #642's provider). And for the owner: Needs you's time zone versus the card's (#749), and whether sessions should carry a real number.#750 (You) is merged on green CI. Lane 1's build is complete: six PRs on main today, in order #742 (the shell around every page, and the vocabulary rename), #744 (notifications, campaign search and the live endpoint), #747 (the account menu's ARIA and contrast, found by the gate), #748 (templates, the one-shot and one star, one wish), #749 (Home, New campaign, Join, the fold, J1 and J2) and #750 (Profile in sections, the notifications grid, Plan & billing behind the entitlements read), with the harness (#746, closed as #726) in between.
Against the acceptance list: every placement
lane1.pyandlane1b.pyclassifies as drawn or replaced is built except the three left with a comment naming their owner (IS-195 wants an offer row on/api/me/attention; IS-152 is lanes 7 and 8; IS-376 waits for #642's hosted provider) and the Contents entries whose pages later lanes add; J1, J2 and J6's recap line pass on desktop, phone and keyboard-only with the axe scan strict on every rebuilt page; the vocabulary isvocabulary.js's; main stayed deployable after every PR; the surface headers were honoured, with the departures written into the PR bodies (the crumb bolds the campaign; Join's expired-code message stays deliberately unspecific; "Read the last recap" only when there is one; Discord DM not offered until lane 10).Left open for the owner's review on the dev server, per the rollout rule, and for two decisions raised on the way: whether sessions should carry a real number (today the prototype's "Session 14" is the session's title), and a time zone on
/api/me/attentionso Needs you and the card beside it agree.Both of this lane's open questions are answered (owner, 2026-09-22).
Sessions get a real number — D86, and #760 is the work
Given at creation, frozen, never reused. A cancelled session keeps its number, so the sequence has gaps: 12, 13, 15.
The gap is the cost and it was chosen over the alternative deliberately. The nth-session-by-date renumbers everything after a cancellation, and by then somebody has written "session 12" in the wiki, a recap or a Discord message — a number that skips is honest; a number that shifts is a lie about something already written down.
Filed as #760 with the column, the backfill rule, the concurrency point and the places it has to surface. Its natural home is lane 4 (#730), as that lane's server PR, since lane 4 rewrites every surface that names a session; doing it there means lane 4 builds against a number instead of retrofitting one. Until then the title stays, which looks right and is what this lane shipped.
/api/me/attentiongains the campaign's time zoneAnswered: do it. Needs you was stating a session's time in the reader's zone while the card beside it stated the same session in the campaign's — and
Home.jsx's own comment onwhenTexthad already settled which wins ("that is the night the table agreed on; a player travelling should still see the same one"). This was a defect rather than a design question; I only asked because the fix is a server change in a lane that had closed.In progress on
fix/owner-answers-code, withSH-088's missing link and D89's twelve-month count.That leaves this issue with nothing open but your review on the dev server. The three rows deliberately left with a comment are unchanged and still belong to later lanes:
IS-195(the ownership-offer row wants a row on/api/me/attention),IS-152(Discussions, lanes 7 and 8),IS-376(the hosted slot line, #642's provider).🤖 Generated with Claude Code
A correction to this lane, and to something I told you.
Lane 3 caught it: Home shows a session's time in the campaign's zone, and D17 says it should be the reader's.
D17, verbatim:
Home.jsx's helper carries a comment saying the opposite — "that is the night the table agreed on; a player travelling should still see the same one" — which reads like a rule and is not one. It is a rationale written during the build, and it contradicts a decision that had already been made, for a stated reason that is the direct answer to it: the point of showing the reader's own zone is that the abbreviation is what tells a traveller their device has moved.I then propagated it. When you answered "do it" to the time-zone question a few hours ago, I moved Needs you onto the campaign's zone in #762 so it would agree with the card beside it, and told you it followed "a rule the product already made". The disagreement between those two lines was real and worth fixing; I fixed it in the direction D17 rules out, on the strength of a code comment I should have checked against the decisions table.
What is being done
Lane 3's This-week PR was built the same wrong way, because my brief told it to be — but the delegate flagged that the CAMP-1 drawing says the reader's zone, which is what surfaced this. The owner has confirmed D17 stands, so the fix lands in that PR:
utils/when.js, consolidated by that PR), so they change together and cannot drift again;/api/me/attentionkeeps the campaign'stimezonethat #762 added — it is what the reconciliation line is drawn from. Only its use changes.Nothing else in this lane is affected, and the lane stays complete.
🤖 Generated with Claude Code
The owner's review of lane 1 on dev, 2026-09-25. Most items look right: the frame, search, the bell, campaign cards, joining, Notifications, and Profile.
Fixes in batch R1 (
fix/review-r1):X-WR-CALNAME/NAME.Layout: "on a 4k monitor, this feels very left-heavy. 40% of the page is completely blank." Three wide-screen options are being mocked in the real app at 2560×1440, for the owner to choose. That will revise D90.
Answered or pending:
Signed off by the owner on the Redesign Review page, 2026-10-01 ("Looks a lot better. Nice work!"), with one request: "The one thing I would like is for clicking on Quest Board at the top to take me back out to home if I'm in a campaign."
That change is being built under #1020. This issue closes when it is on main.
Closing: the owner's one request is on main. PR #1024 merged (main
bcf22996, CI green on8972bead): the "Quest Board" wordmark is a link to Home on every page of the app. The lane was signed off on the Redesign Review page on 1 October.The same PR moved the footer to the end of the page's scroll at every width (the owner's instruction of 2 October, which supersedes the fixed footer this lane was signed off with) and made a clicked notification mark itself read. Four unrelated layout faults seen while checking it are in #1023. Not on dev until the next deploy.