Maestro task 40cc2de5-6628-4b32-a491-ab8e02911d88 — "Shopping list screen (1l, 2b, 2f)" (Feature 17, task 5 of 7).
Done-condition
/plan/shopping renders the current/next week's list per mocks 1l (mobile), 2b (tablet) and 2f (desktop): kicker "Supply run · Oct 5–11", title "Shopping list", needed/total count "19 / 23", helper "Uncheck anything you already have — it won't be counted."; one surface card (radius 24) per dinner with Bagel 16 px name and 11 px day; items with 20–22 px checkboxes (checked grape = to buy; unchecked = neutral-400 outline, struck-through name, "have it" label) toggled optimistically; status line "Sent to Google Chat · Sat 8:00 am" when sent; on tablet/desktop a 3-column masonry (column-count: 3) and Archive (outline) + Send to Google Chat (primary, disabled until Feature 19) actions; a link to the Supply archive. Archived lists render read-only. Vitest tests cover counts, toggling, read-only mode and layouts.
Scope
The Supply run screen and its tests, plus a documentation correction (see below). No Supply archive screen (3cf3a22a), no offline toggle queue (a9689163).
Points for review — including two deviations the developer flagged
Kicker deviation: the screen renders "SUPPLY RUN · " followed by the API label, giving "SUPPLY RUN · WEEK 41 · OCT 5 – 11" rather than the mock's "Supply run · Oct 5–11" — the label carries the week number. The developer followed the brief to produce capitals in CSS from the label rather than adding a second format, and notes that matching the mock means taking the dates part from weekLabel() in web/src/plan/week.ts. Judge which is right.
Reachability: the screen is registered at /plan/shopping, but the Plan screen's "Shopping list" action is still the unavailable button with a TODO(Feature 17), so nothing in the app links here yet. The developer judged wiring it outside this task. Say whether that is acceptable to leave, or whether this task should have wired it.
?week=YYYY-MM-DD (must be a Monday, else an error) was added to open a given week — the only way to reach an archived list, since the default week is the one Plan opens and is never archived. Judge whether that is a sensible addition or scope creep.
Optimistic toggling with rollback of both the item and the count, taking the server's returned counts; a failure shows the error with Retry. Toggles are sent one at a time in one serial mutation scope with networkMode: 'always', so while offline a toggle fails and rolls back rather than queuing — the offline queue is task a9689163; say if that is the right boundary.
Archived lists read-only (no checkboxes, an "Archived" tag, no PATCH path); "Send to Google Chat" is aria-disabled with the explanatory tooltip and calls no endpoint; the status line uses sent_to_chat_at in the household time zone.
The AI title is not shown on this screen (the developer says the mocks do not show it here) — confirm that matches 1l/2b/2f.
The documentation correction: docs/ARCHITECTURE.md's Supply archive paragraph now describes the RWMutex ordering of title jobs and Freeze instead of the obsolete "whichever stores the title first wins". Confirm it is accurate and confined to that paragraph.
Layout fidelity (mobile/tablet/desktop), test adequacy (20 new tests; 47 files / 824 total), a11y, no hex literals, glossary vocabulary.
## Task
Maestro task `40cc2de5-6628-4b32-a491-ab8e02911d88` — "Shopping list screen (1l, 2b, 2f)" (Feature 17, task 5 of 7).
## Done-condition
`/plan/shopping` renders the current/next week's list per mocks 1l (mobile), 2b (tablet) and 2f (desktop): kicker "Supply run · Oct 5–11", title "Shopping list", needed/total count "19 / 23", helper "Uncheck anything you already have — it won't be counted."; one surface card (radius 24) per dinner with Bagel 16 px name and 11 px day; items with 20–22 px checkboxes (checked grape = to buy; unchecked = neutral-400 outline, struck-through name, "have it" label) toggled optimistically; status line "Sent to Google Chat · Sat 8:00 am" when sent; on tablet/desktop a 3-column masonry (`column-count: 3`) and Archive (outline) + Send to Google Chat (primary, disabled until Feature 19) actions; a link to the Supply archive. Archived lists render read-only. Vitest tests cover counts, toggling, read-only mode and layouts.
## Scope
The Supply run screen and its tests, plus a documentation correction (see below). No Supply archive screen (`3cf3a22a`), no offline toggle queue (`a9689163`).
## Points for review — including two deviations the developer flagged
- **Kicker deviation:** the screen renders "SUPPLY RUN · " followed by the API `label`, giving "SUPPLY RUN · WEEK 41 · OCT 5 – 11" rather than the mock's "Supply run · Oct 5–11" — the label carries the week number. The developer followed the brief to produce capitals in CSS from the label rather than adding a second format, and notes that matching the mock means taking the dates part from `weekLabel()` in `web/src/plan/week.ts`. Judge which is right.
- **Reachability:** the screen is registered at `/plan/shopping`, but the **Plan screen's "Shopping list" action is still the unavailable button with a `TODO(Feature 17)`**, so nothing in the app links here yet. The developer judged wiring it outside this task. Say whether that is acceptable to leave, or whether this task should have wired it.
- `?week=YYYY-MM-DD` (must be a Monday, else an error) was added to open a given week — the only way to reach an archived list, since the default week is the one Plan opens and is never archived. Judge whether that is a sensible addition or scope creep.
- Optimistic toggling with rollback of both the item and the count, taking the server's returned counts; a failure shows the error with Retry. Toggles are sent one at a time in one serial mutation scope with `networkMode: 'always'`, so **while offline a toggle fails and rolls back rather than queuing** — the offline queue is task `a9689163`; say if that is the right boundary.
- Archived lists read-only (no checkboxes, an "Archived" tag, no PATCH path); "Send to Google Chat" is `aria-disabled` with the explanatory tooltip and calls no endpoint; the status line uses `sent_to_chat_at` in the household time zone.
- The AI `title` is not shown on this screen (the developer says the mocks do not show it here) — confirm that matches 1l/2b/2f.
- The documentation correction: `docs/ARCHITECTURE.md`'s Supply archive paragraph now describes the RWMutex ordering of title jobs and `Freeze` instead of the obsolete "whichever stores the title first wins". Confirm it is accurate and confined to that paragraph.
- Layout fidelity (mobile/tablet/desktop), test adequacy (20 new tests; 47 files / 824 total), a11y, no hex literals, glossary vocabulary.
## Evidence (orchestrator-run gate at 23a1bc0312d738ea8d7dc5c00a9fd47f8c4d868e)
- `cd web && npm run typecheck` — PASS; `npm test` — PASS 47 files / 824 tests; `npm run build` — PASS
- `npm run lint:colors` — no hex colour literals outside tokens.css
- Go tree untouched; only `docs/ARCHITECTURE.md` changed outside `web/`; working tree clean
- The developer also ran the built app in headless Chrome at 390 / 1180 / 1440 px against a mock API
Implementation commit: `23a1bc0312d738ea8d7dc5c00a9fd47f8c4d868e`
Render the week's shopping list per mocks 1l, 2b and 2f: the "Supply run"
kicker over the week label, the "Shopping list" title with the count still
to buy of all items, the helper line, and one surface card per dinner with
its Bagel name and day. Items toggle optimistically: a toggle is laid over
the server's Supply run while it is pending, toggles are sent one at a time
in one mutation scope, the counts follow the server's answers, and a
refused toggle puts the item and the count back and says why, with Retry.
From tablet up the cards sit in three masonry columns under the Archive
link and a Send to Google Chat action that stays unavailable until
Feature 19. Archived lists render read-only with an "Archived" tag. The
week shown is the Plan's default week, or the Monday given as ?week=.
Correct the Supply archive section of ARCHITECTURE.md: title jobs and
Freeze are ordered by the shopping service's RWMutex, so a freeze waits
for an in-flight title job to store its title or fail.
Maestro task 40cc2de5-6628-4b32-a491-ab8e02911d88.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Address review findings on the Supply run screen:
- The Plan's Shopping list action is now a link to
/plan/shopping?week=<the week shown>, an outline action from tablet up
and a grape link under the Draft board on mobile. It reads
"Shopping list · N" with the count still to buy once the week has a
Supply run, and plain "Shopping list" until then; the screen offers to
make the list. The "arrives once the Supply run is built" tooltip is
gone.
- The kicker is "Supply run · Oct 5 – 11", the week's dates from
weekLabel, as in mocks 1l, 2b and 2f.
- A refused toggle stays shown until a later toggle of its item
supersedes it, such as its Retry; a later toggle of another item
succeeding no longer hides it. Toggles are kept (gcTime Infinity) so a
failure is not collected unseen, and a settled toggle removes the
earlier toggles of its item.
- A toggle refused with 409 archived invalidates the Supply run, which is
read again and renders read-only with the Archived tag; its failure is
shown without Retry.
Maestro task 40cc2de5-6628-4b32-a491-ab8e02911d88.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Plan's Shopping list action read the week's Supply run but never
checked for a failed read, showing "Shopping list" with no count exactly
as for a week with no list. WeekBoard now reads the Supply run once and
shows a failed read in the screen's ErrorBanner with Retry, while the
Shopping list action still opens /plan/shopping?week=<Monday>. A 404 (no
list yet) stays a link with no count and no failure.
Task: 40cc2de5-6628-4b32-a491-ab8e02911d88 (SR-05)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Plan page read run.data?.needed_count, which TanStack Query keeps
after a later refetch fails, so the link showed a stale count beside the
error banner. Show the count only on a successful read, and test a
successful read followed by a failed refetch.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Task
Maestro task
40cc2de5-6628-4b32-a491-ab8e02911d88— "Shopping list screen (1l, 2b, 2f)" (Feature 17, task 5 of 7).Done-condition
/plan/shoppingrenders the current/next week's list per mocks 1l (mobile), 2b (tablet) and 2f (desktop): kicker "Supply run · Oct 5–11", title "Shopping list", needed/total count "19 / 23", helper "Uncheck anything you already have — it won't be counted."; one surface card (radius 24) per dinner with Bagel 16 px name and 11 px day; items with 20–22 px checkboxes (checked grape = to buy; unchecked = neutral-400 outline, struck-through name, "have it" label) toggled optimistically; status line "Sent to Google Chat · Sat 8:00 am" when sent; on tablet/desktop a 3-column masonry (column-count: 3) and Archive (outline) + Send to Google Chat (primary, disabled until Feature 19) actions; a link to the Supply archive. Archived lists render read-only. Vitest tests cover counts, toggling, read-only mode and layouts.Scope
The Supply run screen and its tests, plus a documentation correction (see below). No Supply archive screen (
3cf3a22a), no offline toggle queue (a9689163).Points for review — including two deviations the developer flagged
label, giving "SUPPLY RUN · WEEK 41 · OCT 5 – 11" rather than the mock's "Supply run · Oct 5–11" — the label carries the week number. The developer followed the brief to produce capitals in CSS from the label rather than adding a second format, and notes that matching the mock means taking the dates part fromweekLabel()inweb/src/plan/week.ts. Judge which is right./plan/shopping, but the Plan screen's "Shopping list" action is still the unavailable button with aTODO(Feature 17), so nothing in the app links here yet. The developer judged wiring it outside this task. Say whether that is acceptable to leave, or whether this task should have wired it.?week=YYYY-MM-DD(must be a Monday, else an error) was added to open a given week — the only way to reach an archived list, since the default week is the one Plan opens and is never archived. Judge whether that is a sensible addition or scope creep.networkMode: 'always', so while offline a toggle fails and rolls back rather than queuing — the offline queue is taska9689163; say if that is the right boundary.aria-disabledwith the explanatory tooltip and calls no endpoint; the status line usessent_to_chat_atin the household time zone.titleis not shown on this screen (the developer says the mocks do not show it here) — confirm that matches 1l/2b/2f.docs/ARCHITECTURE.md's Supply archive paragraph now describes the RWMutex ordering of title jobs andFreezeinstead of the obsolete "whichever stores the title first wins". Confirm it is accurate and confined to that paragraph.Evidence (orchestrator-run gate at
23a1bc0312)cd web && npm run typecheck— PASS;npm test— PASS 47 files / 824 tests;npm run build— PASSnpm run lint:colors— no hex colour literals outside tokens.cssdocs/ARCHITECTURE.mdchanged outsideweb/; working tree cleanImplementation commit:
23a1bc0312d738ea8d7dc5c00a9fd47f8c4d868eIndependent Codex gpt-6-sol review: CHANGES_REQUIRED for this exact commit.
Independent Codex gpt-6-sol review: CHANGES_REQUIRED for this exact commit.
Independent Codex gpt-6-sol review: CHANGES_REQUIRED for this exact commit.
Independent Codex gpt-6-sol review: APPROVED for this exact commit.