Maestro task 4657cba1-c709-420e-8b1e-18761e9e0e27 — "Tablet and desktop plan manager (2c, 2d)" (Feature 14, Weekly Plan Builder).
Done-condition
At ≥ 768 px /plan renders mocks 2c/2d: kicker "Week 41 · Plan", title "Oct 5 – 11", prev/next round buttons and (desktop) a "This week" pill; actions "Shopping list · N", "Rebuild week" (outline, confirms when synced) and "Push to Calendar" (primary); sync status line; a 7-column grid (repeat(7, minmax(0,1fr)), gap 12) of day columns with day label and card (96–110 px washed photo, Bagel 16–17 px name, minutes, crock-pot "Start by 12:30 pm", Regular/Side quest tag, swap icon opening the swap sheet), Side-quest cards on teal-200. Desktop adds the 290 px right panel with "Quest log · N | Regulars · N" segmented control, helper "Drag a dinner onto a day to swap it in." and rows (48 px photo, name, difficulty, 6-dot grip) plus "Swipe more side quests" link; tablet shows the Quest log as a chip strip under the grid. Vitest tests at 1180 and 1440 widths cover rendering, week navigation and the swap icon. Typecheck, test and build pass.
Scope
Tablet and desktop /plan (≥ 768 px) only. Drag-and-drop and its keyboard alternative are the next task (presentational grip and helper text only here). No backend, migration, skill or API-contract change. The mobile draft board and all drafting/swapping logic are unchanged and shared.
Deliberate deviations from the mock wording, for review
The shopping-list action is labelled "Shopping list" with no count: Feature 17 has not been built, so no shopping-list endpoint exists, and the task text forbids inventing a number. It is disabled with a tooltip, like "Push to Calendar" (Feature 16, also not built).
The tablet/desktop layouts do not show the AI note (neither mock has one); mobile still does.
The sync status line says "Synced to Google Calendar" / "Changes not pushed to Google Calendar" / "Not pushed to Google Calendar yet" — the mock's relative "2 min ago" is omitted.
Minutes render as "N min" rather than the mock's "Crock pot · 6 hr".
Evidence (orchestrator-run pre-review gate at a9038845a3)
gofmt -l . — empty (no Go file changed)
cd web && npm run typecheck — PASS
cd web && npm test — PASS, 45 files / 718 tests (+20 new), colour-literal lint clean
cd web && npm run build — PASS (includes lint:colors and check:dist-fonts)
The developer also reports a headless-Chrome pass of the Vite dev server against a mocked API at 1440, 1180 and 800 px, which caught and fixed three layout problems (status-line wrapping, swap-icon overflow on narrow cards, placeholder wrapping in small photos).
## Task
Maestro task `4657cba1-c709-420e-8b1e-18761e9e0e27` — "Tablet and desktop plan manager (2c, 2d)" (Feature 14, Weekly Plan Builder).
## Done-condition
At ≥ 768 px `/plan` renders mocks 2c/2d: kicker "Week 41 · Plan", title "Oct 5 – 11", prev/next round buttons and (desktop) a "This week" pill; actions "Shopping list · N", "Rebuild week" (outline, confirms when synced) and "Push to Calendar" (primary); sync status line; a 7-column grid (`repeat(7, minmax(0,1fr))`, gap 12) of day columns with day label and card (96–110 px washed photo, Bagel 16–17 px name, minutes, crock-pot "Start by 12:30 pm", Regular/Side quest tag, swap icon opening the swap sheet), Side-quest cards on teal-200. Desktop adds the 290 px right panel with "Quest log · N | Regulars · N" segmented control, helper "Drag a dinner onto a day to swap it in." and rows (48 px photo, name, difficulty, 6-dot grip) plus "Swipe more side quests" link; tablet shows the Quest log as a chip strip under the grid. Vitest tests at 1180 and 1440 widths cover rendering, week navigation and the swap icon. Typecheck, test and build pass.
## Scope
Tablet and desktop `/plan` (≥ 768 px) only. Drag-and-drop and its keyboard alternative are the next task (presentational grip and helper text only here). No backend, migration, skill or API-contract change. The mobile draft board and all drafting/swapping logic are unchanged and shared.
## Deliberate deviations from the mock wording, for review
- The shopping-list action is labelled **"Shopping list"** with **no count**: Feature 17 has not been built, so no shopping-list endpoint exists, and the task text forbids inventing a number. It is disabled with a tooltip, like "Push to Calendar" (Feature 16, also not built).
- The tablet/desktop layouts do not show the AI note (neither mock has one); mobile still does.
- The sync status line says "Synced to Google Calendar" / "Changes not pushed to Google Calendar" / "Not pushed to Google Calendar yet" — the mock's relative "2 min ago" is omitted.
- Minutes render as "N min" rather than the mock's "Crock pot · 6 hr".
## Evidence (orchestrator-run pre-review gate at a9038845a3f62949f49760ced0d13a1f6cb7a3a5)
- `gofmt -l .` — empty (no Go file changed)
- `cd web && npm run typecheck` — PASS
- `cd web && npm test` — PASS, 45 files / 718 tests (+20 new), colour-literal lint clean
- `cd web && npm run build` — PASS (includes `lint:colors` and `check:dist-fonts`)
The developer also reports a headless-Chrome pass of the Vite dev server against a mocked API at 1440, 1180 and 800 px, which caught and fixed three layout problems (status-line wrapping, swap-icon overflow on narrow cards, placeholder wrapping in small photos).
Implementation commit: `a9038845a3f62949f49760ced0d13a1f6cb7a3a5`
From 768 px up /plan renders the plan manager: "Week N · Plan" kicker,
the week's dates, previous/next buttons and, on desktop, a "This week"
pill; the sync status line; "Shopping list" and "Push to Calendar"
unavailable with tooltips saying why (Features 17 and 16), and a working
outlined "Rebuild week" that confirms over a plan pushed to Calendar; and
a 7-column grid of day cards with washed photo, name, minutes, crock-pot
start-by time, Regular / Side quest tag (Side quests on teal-200) and a
swap icon that opens the existing swap sheet.
Desktop adds the 290 px right panel: "Quest log · N | Regulars · N",
the drag helper, rows with photo, name, difficulty and a 6-dot grip, and
"Swipe more side quests". Tablet shows the Quest log as a chip strip under
the grid. Dragging is presentational here; it lands in task 5c2842a8.
The plan day now reads the photo and minutes the plan API already sends,
and an optimistic swap carries them from the chosen dinner. Tag gains a
neutral tone for "Regular".
Maestro task 4657cba1-c709-420e-8b1e-18761e9e0e27.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The week's columns are never narrower than 112 px, which holds a
dinner's words whole and the tag beside the swap icon. Where seven do not
fit (768-1100 px tablets, desktop up to about 1430 px beside the panel)
the week scrolls sideways inside the content area; at 1180 and 1440 px
the grid is unchanged. Names no longer hyphenate or break mid-word, and
the card footer no longer wraps the swap icon under the tag.
Each card now says how the dinner is cooked as well as how long:
"Crock pot · 6 hr", "Stovetop · 45 min", or the method alone when the
minutes are unknown. The plan API's method is parsed (and carried by a
swap from the Quest log or Regulars), and an unknown method is refused.
The synced status line says how long ago the plan was pushed, from
calendar_synced_at ("Synced to Google Calendar 2 min ago"), kept current
minute by minute.
Maestro task 4657cba1-c709-420e-8b1e-18761e9e0e27.
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
4657cba1-c709-420e-8b1e-18761e9e0e27— "Tablet and desktop plan manager (2c, 2d)" (Feature 14, Weekly Plan Builder).Done-condition
At ≥ 768 px
/planrenders mocks 2c/2d: kicker "Week 41 · Plan", title "Oct 5 – 11", prev/next round buttons and (desktop) a "This week" pill; actions "Shopping list · N", "Rebuild week" (outline, confirms when synced) and "Push to Calendar" (primary); sync status line; a 7-column grid (repeat(7, minmax(0,1fr)), gap 12) of day columns with day label and card (96–110 px washed photo, Bagel 16–17 px name, minutes, crock-pot "Start by 12:30 pm", Regular/Side quest tag, swap icon opening the swap sheet), Side-quest cards on teal-200. Desktop adds the 290 px right panel with "Quest log · N | Regulars · N" segmented control, helper "Drag a dinner onto a day to swap it in." and rows (48 px photo, name, difficulty, 6-dot grip) plus "Swipe more side quests" link; tablet shows the Quest log as a chip strip under the grid. Vitest tests at 1180 and 1440 widths cover rendering, week navigation and the swap icon. Typecheck, test and build pass.Scope
Tablet and desktop
/plan(≥ 768 px) only. Drag-and-drop and its keyboard alternative are the next task (presentational grip and helper text only here). No backend, migration, skill or API-contract change. The mobile draft board and all drafting/swapping logic are unchanged and shared.Deliberate deviations from the mock wording, for review
Evidence (orchestrator-run pre-review gate at
a9038845a3)gofmt -l .— empty (no Go file changed)cd web && npm run typecheck— PASScd web && npm test— PASS, 45 files / 718 tests (+20 new), colour-literal lint cleancd web && npm run build— PASS (includeslint:colorsandcheck:dist-fonts)The developer also reports a headless-Chrome pass of the Vite dev server against a mocked API at 1440, 1180 and 800 px, which caught and fixed three layout problems (status-line wrapping, swap-icon overflow on narrow cards, placeholder wrapping in small photos).
Implementation commit:
a9038845a3f62949f49760ced0d13a1f6cb7a3a5Independent Codex gpt-6-sol review: CHANGES_REQUIRED for this exact commit.
The week's columns are never narrower than 112 px, which holds a dinner's words whole and the tag beside the swap icon. Where seven do not fit (768-1100 px tablets, desktop up to about 1430 px beside the panel) the week scrolls sideways inside the content area; at 1180 and 1440 px the grid is unchanged. Names no longer hyphenate or break mid-word, and the card footer no longer wraps the swap icon under the tag. Each card now says how the dinner is cooked as well as how long: "Crock pot · 6 hr", "Stovetop · 45 min", or the method alone when the minutes are unknown. The plan API's method is parsed (and carried by a swap from the Quest log or Regulars), and an unknown method is refused. The synced status line says how long ago the plan was pushed, from calendar_synced_at ("Synced to Google Calendar 2 min ago"), kept current minute by minute. Maestro task 4657cba1-c709-420e-8b1e-18761e9e0e27. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>Independent Codex gpt-6-sol review: APPROVED for this exact commit.