Order of work for the calendar redesign (#187-#198) #199
Labels
No labels
adr
android
area/calendar
area/design-system
area/i18n
area/jobs
area/offline
area/server
area/testing
bug
ci
duplicate
enhancement
help wanted
invalid
notifications
question
reliability
security
severity/low
severity/medium
tracking
web
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
eagraiclainne/app#199
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?
The calendar surfaces are being rebuilt from a design handoff
(
design_handoff_calendar, held outside the repo). It is a sibling of the jobsbundle (#184), not a part of it: the two share the row component, the token
contract and the laws, and meet at exactly one contract — a job opened from a
calendar surface is the jobs bundle's card, unmodified.
Blocking first
#187 decides who may see a household event, and nothing else here is safe to
build until it is settled.
ListOccurrencesreturns every event in the windowto any authenticated caller while
Readand every mutation require eventmembership. The design stands on both sides of that gap: the grid's "everyone"
default needs the unfiltered list, and the card-as-editor breaks on an event you
are not on. #188 is the server change if the decision goes the recommended way.
Order
Read, allow self-add onAddUser— only if #187 goes household-wideuntiloccurrence_dateproto comment says UTC and is wrongWhat the code review settled
The handoff was checked against the server, and these are now written into it:
occurrence_dateis a local date in the request's zone, not UTC (#198).Split and cancel must pass the zone that produced the row the reader tapped.
Leave this oneandI'm goingareSplitOccurrenceplusAddUser/RemoveUseron thechild, so both ask scope on a repeating event (#196).
pruneOrphanedChildrenremoves everychild whose slot no longer lands, so "cancelled days stay cancelled" is false
for exactly the days the dialog is about (#196).
day-ahead nudge, Birthday broadcasts to everyone with an email (#193).
shape; membership is the only subtraction, which is why #187 matters so much.
extras silently, so the strip collapses to single-select for that kind (#195).
Not in scope
The job/event link (
Event.item), aDoneaction on an event, a second repeateditor, a merged row for a
daily_timesspan, a type chip on the event card,and an Edit button anywhere.
Update — goldens ride with the PR that breaks them
Re-recording 196 golden images in one late PR would mean one author re-recording
work they did not do, and reviewing a diff nobody can read. The repo rule already
says a visible change re-records its goldens; this plan applies it per PR.
Every UI PR in this plan re-records the goldens it invalidates, in its own
commit inside that PR (
make web-screens-update,make android-screens-update,and
make web-pages-updatewhere a whole-page shot moves). Both surfaces movetogether or the other one's suite fails.
Update — the visibility decision, and the model per issue
#187 is closed. Everyone can read the calendar and the events on it, and
joining an event is open to everyone except a Guest. That settles option A:
Read'sRequireEventMemberdrops to the role gate, Guest included, so thegrid and the record agree about who may see an event.
AddUsergains self-add for the roles the matrix already admits — Admin,Member and Child — which is exactly not-Guest.
is not. An event you are not on shows every field with no chevrons, no
...,and one
I'm goingaction — which on a repeating event asks scope, becausejoining one occurrence splits it.
Order and the model each ticket runs on:
Wave 0's #188 comes first regardless, since every view depends on what the grid
is allowed to return.
Standing requirements for every remaining UI ticket
Added after #213 needed three deploys to come right. Both are now written into
each open ticket:
the same commit as the code; re-recorded existing ones go in their own.
picker components, number spinners, links where rows belong,
(optional)labels, any Save button on a commit-on-blur surface, disabled-and-grey
controls, and a record's title used as a field label.
The second one exists because all seven of #213's defects had the same cause:
the shipped app's form fragments reused inside the new grammar. Suites stay
green through every one of them, because they assert the pieces exist rather
than that the screen reads right.
Update — the demo joins the bundle; the server work is in flight (2026-08-25)
calendar-demo.dc.htmlis now part of the handoff and is the locked design, visual and behavioural, for everything in §2, §5 and §6 — the explorations file stays the reasoning, the demo is what the app must meet, mapped through the generated token roles (it asks for no new ones). Create (§4) is the one section it does not build; every picker create needs is wired and reachable from the event sheet.Where the pre-work stands:
JoinOccurrence/LeaveOccurrence, ATTENDEE refs§9's open questions are all closed: unowned jobs appear when dated (dashed
?mark, sorts last); the calendar creates events only (every + reads New event); the Remind picker names its audience only on Birthday.Supersessions the demo makes against the earlier text — recorded in the per-view issues: month week-rows are uniform height (sized to the busiest day in the month) rather than per-row; a wide row keeps the owner's glyph when done (its tick box says done); the completion stamp draws over the row that was ticked, at every site.
Update — #257 ruled; handoff being revised (2026-08-25)
#257's two questions are decided: ownerless events stay admin-only editable, with the state prevented instead — the last attendee cannot leave, leaving means deleting; and joining does not grant edit rights (the ADR-0036 split stands, §0.1's editor-after-joining sentence moves). The design project is updating the handoff and demo to match; the bundle gets revalidated before the client waves start. #257 keeps the remaining server work (the last-attendee guard, the ADR amendment, integration coverage).
Update — bundle revalidated and locked (2026-08-26)
The revised handoff passed revalidation over four passes: both #257 rulings applied (§0.1 struck in place, §0.2 rewritten, OWNER-ref gating and the last-attendee guard wired through the demo, refs travel on leave and on split children,
JoinOccurrence/LeaveOccurrencenamed throughout, month-height supersession recorded). The final fix made the leave guard per-list — the occurrence's own attendees, never the parent's as well — matching RemoveUser-guards-parent / LeaveOccurrence-guards-occurrence. No open findings. The client waves (#189-#197) and #257's server work can start against this bundle.The whole order of work is built and up as one stacked chain (nothing merged — merge bottom-first, each fast-forward):
feat/last-attendee-guardfeat/calendar-row-grammarfeat/calendar-monthfeat/calendar-day-sheetfeat/calendar-agenda-weekWEEKpref)feat/calendar-event-editorfeat/calendar-createfeat/calendar-toolbar#195 (the repeat sheet) rides inside #263/#264. The base of #258 is
docs/park-handoff-bundles(yesterday's demo-stylesheet stack, pushed without a PR deliberately).Known deferrals, each recorded on its issue: the demo's repeat-label rewording (conformance ripple — a #256-style sweep), the Android rule-change confirm counts generically, and a later golden pass may pose the day sheet's own screenshot cases.
The whole order of work is merged: chain #258–#268 (plus #269 for the parked handoff bundles) landed on main 2026-08-26, tip
68f5b3c1. Open remainders have their own issues: #266 (Android confirm counts), #267 (golden coverage), #255/#256 (shape roles, curly quotes).