Maestro task: 5a43f813-c940-4f79-a2be-027644ae9e6c (Feature 12 - Regular Dinners and Onboarding).
Done-condition
While household_settings.onboarding_completed_at is null, every app route redirects to /onboarding. Step 1 welcomes the household (Bagel title, short explanation of Regulars, Side quests and the Quest log, "Let's start" button). Step 2 matches mock 1h: three 6px progress pills (filled grape up to the current step), "Step 2 of 3" kicker, title "What's on your usual rotation?", helper copy, 48px input pill with a 36px grape "+" button (Enter also adds), "Your regulars · N" teal-200/teal-900 chips with ×, "Common picks" dashed chips that add on tap, and a fixed 52px "Next: notifications" button enabled once at least 3 Regulars exist. Adding/removing calls the dinners API optimistically. Vitest tests cover redirect, add by Enter and by "+", common pick add, remove and the 3-Regular gate. Typecheck, test and build pass.
Evidence
New first-run redirect gated on onboarding_completed_at plus the step 1 welcome and step 2 (1h) Regulars entry; add/remove call POST/DELETE /api/v1/dinners optimistically with rollback; docs/ARCHITECTURE.md updated.
lint:colors, typecheck, test, build pass; gofmt -l . empty; the real Enter key checked in Chrome (jsdom can't simulate real Enter, so tests submit the form directly).
Notes: offline the onboarding status can't be read (settings are never cached), so saved pages open as-is; the 3-Regular gate counts adds still awaiting the server and turns off if one is refused.
Maestro task: 5a43f813-c940-4f79-a2be-027644ae9e6c (Feature 12 - Regular Dinners and Onboarding).
## Done-condition
While household_settings.onboarding_completed_at is null, every app route redirects to /onboarding. Step 1 welcomes the household (Bagel title, short explanation of Regulars, Side quests and the Quest log, "Let's start" button). Step 2 matches mock 1h: three 6px progress pills (filled grape up to the current step), "Step 2 of 3" kicker, title "What's on your usual rotation?", helper copy, 48px input pill with a 36px grape "+" button (Enter also adds), "Your regulars · N" teal-200/teal-900 chips with ×, "Common picks" dashed chips that add on tap, and a fixed 52px "Next: notifications" button enabled once at least 3 Regulars exist. Adding/removing calls the dinners API optimistically. Vitest tests cover redirect, add by Enter and by "+", common pick add, remove and the 3-Regular gate. Typecheck, test and build pass.
## Evidence
- New first-run redirect gated on onboarding_completed_at plus the step 1 welcome and step 2 (1h) Regulars entry; add/remove call POST/DELETE /api/v1/dinners optimistically with rollback; docs/ARCHITECTURE.md updated.
- lint:colors, typecheck, test, build pass; gofmt -l . empty; the real Enter key checked in Chrome (jsdom can't simulate real Enter, so tests submit the form directly).
Notes: offline the onboarding status can't be read (settings are never cached), so saved pages open as-is; the 3-Regular gate counts adds still awaiting the server and turns off if one is refused.
While household_settings.onboarding_completed_at is null, OnboardingGate
sends every app route to /onboarding, a full screen outside the shell.
The household settings parser now reads onboarding_completed_at from the
existing GET /api/v1/settings/household.
Step 1 welcomes the household and explains Regulars, Side quests and the
Quest log. Step 2 follows mock 1h: progress pills, the add pill with its
grape "+" (Enter also adds), Regulars chips with remove, dashed Common
picks, and "Next: notifications" enabled at 3 Regulars. Adds and removes
go through new dinners API hooks (POST /api/v1/dinners, DELETE
/api/v1/dinners/{id}) optimistically, rolled back if the server refuses.
Step 3 is a placeholder until its task lands.
Maestro task 5a43f813-c940-4f79-a2be-027644ae9e6c.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
While household_settings.onboarding_completed_at is null, OnboardingGate
sends every app route to /onboarding, a full screen outside the shell.
The household settings parser now reads onboarding_completed_at from the
existing GET /api/v1/settings/household.
Step 1 welcomes the household and explains Regulars, Side quests and the
Quest log. Step 2 follows mock 1h: progress pills, the add pill with its
grape "+" (Enter also adds), Regulars chips with remove, dashed Common
picks, and "Next: notifications" enabled at 3 Regulars. Adds and removes
go through new dinners API hooks (POST /api/v1/dinners, DELETE
/api/v1/dinners/{id}) optimistically, rolled back if the server refuses.
Step 3 is a placeholder until its task lands.
Maestro task 5a43f813-c940-4f79-a2be-027644ae9e6c.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Next: notifications counted optimistic chips, so a household with two
saved Regulars could tap a third and leave step 2 before the server
refused it. Next now waits until no add is pending and three Regulars
have server ids.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Step 2 read the refusal from the mutation hooks, which only report their
latest change: an add refused while another add was in flight was rolled
back with no message, and the same for removals. Each change now records
its own refusal, keyed by the change, so it stays shown whatever the
other changes in flight do; trying the same change again replaces it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Step 2 keyed each refusal by the dinner's name, so a second add of the
same name still in flight replaced the first add's refusal when it was
refused too. Each attempt now keys its refusal uniquely; trying a change
again once it has been refused still clears that earlier refusal.
A refused removal was put back at the index it had in the list as it
stood when it was removed, so refusing two overlapping removals of A and
B restored B, A, C until a reread corrected it. A removal now only marks
its Regular in the cache and the list hides it; a refusal clears the
mark, so the Regular returns to its own place whatever else changed.
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.
Maestro task: 5a43f813-c940-4f79-a2be-027644ae9e6c (Feature 12 - Regular Dinners and Onboarding).
Done-condition
While household_settings.onboarding_completed_at is null, every app route redirects to /onboarding. Step 1 welcomes the household (Bagel title, short explanation of Regulars, Side quests and the Quest log, "Let's start" button). Step 2 matches mock 1h: three 6px progress pills (filled grape up to the current step), "Step 2 of 3" kicker, title "What's on your usual rotation?", helper copy, 48px input pill with a 36px grape "+" button (Enter also adds), "Your regulars · N" teal-200/teal-900 chips with ×, "Common picks" dashed chips that add on tap, and a fixed 52px "Next: notifications" button enabled once at least 3 Regulars exist. Adding/removing calls the dinners API optimistically. Vitest tests cover redirect, add by Enter and by "+", common pick add, remove and the 3-Regular gate. Typecheck, test and build pass.
Evidence
Notes: offline the onboarding status can't be read (settings are never cached), so saved pages open as-is; the 3-Regular gate counts adds still awaiting the server and turns off if one is refused.
While household_settings.onboarding_completed_at is null, OnboardingGate sends every app route to /onboarding, a full screen outside the shell. The household settings parser now reads onboarding_completed_at from the existing GET /api/v1/settings/household. Step 1 welcomes the household and explains Regulars, Side quests and the Quest log. Step 2 follows mock 1h: progress pills, the add pill with its grape "+" (Enter also adds), Regulars chips with remove, dashed Common picks, and "Next: notifications" enabled at 3 Regulars. Adds and removes go through new dinners API hooks (POST /api/v1/dinners, DELETE /api/v1/dinners/{id}) optimistically, rolled back if the server refuses. Step 3 is a placeholder until its task lands. Maestro task 5a43f813-c940-4f79-a2be-027644ae9e6c. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>While household_settings.onboarding_completed_at is null, OnboardingGate sends every app route to /onboarding, a full screen outside the shell. The household settings parser now reads onboarding_completed_at from the existing GET /api/v1/settings/household. Step 1 welcomes the household and explains Regulars, Side quests and the Quest log. Step 2 follows mock 1h: progress pills, the add pill with its grape "+" (Enter also adds), Regulars chips with remove, dashed Common picks, and "Next: notifications" enabled at 3 Regulars. Adds and removes go through new dinners API hooks (POST /api/v1/dinners, DELETE /api/v1/dinners/{id}) optimistically, rolled back if the server refuses. Step 3 is a placeholder until its task lands. Maestro task 5a43f813-c940-4f79-a2be-027644ae9e6c. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>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: CHANGES_REQUIRED for this exact commit.
Independent Codex gpt-6-sol review: APPROVED for this exact commit.