/plan on mobile renders mock 1f for the selected week (defaults to next week after the plan_draft day, else this week; prev/next week controls): 26 px week title with a Draft (grape-100/800), Synced or "Changes not pushed" tag; assistant bubble with 32 px grape "Q" avatar and the plan's ai_note; 2-column grid of 86 px day tiles (radius 22) with day kicker and Bagel 15 px dinner — Regular on surface, Quest-log pick on teal-300 with "WED · NEW" kicker, crock-pot tiles showing "Start by h:mm"; an 8th dashed "+ Rebuild week" tile (confirms first when synced); "Looks good — push to Calendar" primary button (disabled with an explanatory tooltip until Feature 16 is connected). With no plan, an empty state offers "Draft this week" which starts the draft job and shows skeleton tiles. Vitest tests cover draft/synced/changed states, NEW highlighting, start-by, rebuild confirm and the empty state. Typecheck, test and build pass.
Scope
Mobile draft board at /plan only. Explicitly out of scope and left to later tasks: the swap sheet (f231813c), the tablet/desktop plan manager (4657cba1) and drag-and-drop/keyboard swapping (5c2842a8). No backend, migration or skill change — the plan API this consumes is already on the feature branch.
Evidence (orchestrator-run pre-review gate at 3483faafa9)
gofmt -l . — empty (no Go files changed by this commit)
cd web && npm run typecheck — PASS
cd web && npm test — PASS, 44 files / 680 tests (includes the colour-literal lint gate)
cd web && npm run build — PASS (includes lint:colors and check:dist-fonts)
## Task
Maestro task `4bb14d54-76bc-4e7d-8c35-fa738abd49ff` — "Mobile draft board (1f)" (Feature 14, Weekly Plan Builder).
## Done-condition
`/plan` on mobile renders mock 1f for the selected week (defaults to next week after the plan_draft day, else this week; prev/next week controls): 26 px week title with a Draft (grape-100/800), Synced or "Changes not pushed" tag; assistant bubble with 32 px grape "Q" avatar and the plan's ai_note; 2-column grid of 86 px day tiles (radius 22) with day kicker and Bagel 15 px dinner — Regular on surface, Quest-log pick on teal-300 with "WED · NEW" kicker, crock-pot tiles showing "Start by h:mm"; an 8th dashed "+ Rebuild week" tile (confirms first when synced); "Looks good — push to Calendar" primary button (disabled with an explanatory tooltip until Feature 16 is connected). With no plan, an empty state offers "Draft this week" which starts the draft job and shows skeleton tiles. Vitest tests cover draft/synced/changed states, NEW highlighting, start-by, rebuild confirm and the empty state. Typecheck, test and build pass.
## Scope
Mobile draft board at `/plan` only. Explicitly out of scope and left to later tasks: the swap sheet (`f231813c`), the tablet/desktop plan manager (`4657cba1`) and drag-and-drop/keyboard swapping (`5c2842a8`). No backend, migration or skill change — the plan API this consumes is already on the feature branch.
## Evidence (orchestrator-run pre-review gate at 3483faafa93f8e51252ed00388d7dbc94e6ff6eb)
- `gofmt -l .` — empty (no Go files changed by this commit)
- `cd web && npm run typecheck` — PASS
- `cd web && npm test` — PASS, 44 files / 680 tests (includes the colour-literal lint gate)
- `cd web && npm run build` — PASS (includes `lint:colors` and `check:dist-fonts`)
Implementation commit: `3483faafa93f8e51252ed00388d7dbc94e6ff6eb`
The Plan screen shows the selected week's plan: the week title with its
Draft, Synced or "Changes not pushed" tag, the assistant's note beside the
grape "Q" avatar, and a two-column grid of day tiles. Quest-log picks are
teal with a "· NEW" kicker, crock-pot dinners show their start-by time in
the household's zone, and the dashed "+ Rebuild week" tile redrafts the
week, asking first when the plan was pushed to Calendar. "Looks good —
push to Calendar" stays unavailable with a tooltip until Feature 16.
The page opens on next week once this week's plan_draft time has come,
otherwise on this week, with previous / next week buttons. A week with no
plan offers "Draft this week", which starts the draft_week job and shows
skeleton tiles until the plan is read again; a failed draft is shown with
Retry and no plan is made up. web/src/plan/week.ts is the one household
week helper, mirroring internal/household/week.go.
The App route tests that used /plan as a placeholder now use /quick.
Maestro: 4bb14d54-76bc-4e7d-8c35-fa738abd49ff
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Draft board let go of a succeeded draft_week job as soon as the plan
was read again, whatever that read returned: a missing plan showed as
"Nothing planned yet" and another plan as the new draft. Keep the job's
plan_id and clear the job only once the plan read has that id; a missing
or different plan is shown as "Couldn't read the draft" with Retry.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A redraft keeps the plan's id, so a plan the service worker answered from
its cache could pass for the finished rebuild. The API client's apiRead now
says whether a GET was the cached copy; the plan carries it, and the Draft
board shows the retryable draft-unread error instead of a cached plan with
the drafted id. A later read from the server still lands the draft.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A succeeded draft whose plan read is missing, another plan, or a cache
fallback now retries the plan GET and keeps the job, instead of starting
a new draft. Rebuilding stays on "+ Rebuild week". The tests assert Retry
sends no draft POST, re-reads the plan, keeps the error while the read is
still a cache fallback, and lands the draft on a live matching read.
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
4bb14d54-76bc-4e7d-8c35-fa738abd49ff— "Mobile draft board (1f)" (Feature 14, Weekly Plan Builder).Done-condition
/planon mobile renders mock 1f for the selected week (defaults to next week after the plan_draft day, else this week; prev/next week controls): 26 px week title with a Draft (grape-100/800), Synced or "Changes not pushed" tag; assistant bubble with 32 px grape "Q" avatar and the plan's ai_note; 2-column grid of 86 px day tiles (radius 22) with day kicker and Bagel 15 px dinner — Regular on surface, Quest-log pick on teal-300 with "WED · NEW" kicker, crock-pot tiles showing "Start by h:mm"; an 8th dashed "+ Rebuild week" tile (confirms first when synced); "Looks good — push to Calendar" primary button (disabled with an explanatory tooltip until Feature 16 is connected). With no plan, an empty state offers "Draft this week" which starts the draft job and shows skeleton tiles. Vitest tests cover draft/synced/changed states, NEW highlighting, start-by, rebuild confirm and the empty state. Typecheck, test and build pass.Scope
Mobile draft board at
/planonly. Explicitly out of scope and left to later tasks: the swap sheet (f231813c), the tablet/desktop plan manager (4657cba1) and drag-and-drop/keyboard swapping (5c2842a8). No backend, migration or skill change — the plan API this consumes is already on the feature branch.Evidence (orchestrator-run pre-review gate at
3483faafa9)gofmt -l .— empty (no Go files changed by this commit)cd web && npm run typecheck— PASScd web && npm test— PASS, 44 files / 680 tests (includes the colour-literal lint gate)cd web && npm run build— PASS (includeslint:colorsandcheck:dist-fonts)Implementation commit:
3483faafa93f8e51252ed00388d7dbc94e6ff6ebIndependent Codex gpt-6-sol review: APPROVED 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.
Independent Codex gpt-6-sol review: APPROVED for this exact commit.