Done-condition: /discover renders mock 1a (kicker "Discover", title "Side quests", teal-200/teal-800 "Quest log · N" pill, a 440 px perspective-1000 deck area with three stacked cards at the specified depth transforms and radius 32, the top card with a 220 px inset washed photo, Bagel 24 px name, three 8 px difficulty dots and the Easy/Medium/Hard label, a teal-100 "Why this?" box, the hidden "Try it!" and "Pass" stamps, 62 px Pass and Try it buttons with 11 px labels, and ←/→ keys triggering Pass/Try it), the "All caught up" / "New side quests arrive Sunday." empty state with "Get more now" starting a batch and showing skeleton cards while the job runs, and Vitest coverage of rendering from a stubbed deck, the keyboard triggers, the empty state and Get more now. Typecheck, test and build pass.
Consumes the already-merged batch/deck/accept/decline API from task b4f2558c. The swipe gesture (54c12e9e), the exit animations (cb7da499), the optimistic mutations/prefetch (ea935fbc) and the Quest log sheet (5ad0b188) remain later tasks; the screen shares one decide handler and an input-lock state so they plug in without a rewrite.
Checks: web typecheck, 12 new Vitest tests, build (including lint:colors and dist-fonts), plus the Go quality floor.
Maestro task `1ecc121c-86eb-4784-a9fb-1314709b4a59` - "Discover deck screen (1a)" (Feature 13).
Done-condition: /discover renders mock 1a (kicker "Discover", title "Side quests", teal-200/teal-800 "Quest log · N" pill, a 440 px perspective-1000 deck area with three stacked cards at the specified depth transforms and radius 32, the top card with a 220 px inset washed photo, Bagel 24 px name, three 8 px difficulty dots and the Easy/Medium/Hard label, a teal-100 "Why this?" box, the hidden "Try it!" and "Pass" stamps, 62 px Pass and Try it buttons with 11 px labels, and ←/→ keys triggering Pass/Try it), the "All caught up" / "New side quests arrive Sunday." empty state with "Get more now" starting a batch and showing skeleton cards while the job runs, and Vitest coverage of rendering from a stubbed deck, the keyboard triggers, the empty state and Get more now. Typecheck, test and build pass.
Consumes the already-merged batch/deck/accept/decline API from task b4f2558c. The swipe gesture (54c12e9e), the exit animations (cb7da499), the optimistic mutations/prefetch (ea935fbc) and the Quest log sheet (5ad0b188) remain later tasks; the screen shares one `decide` handler and an input-lock state so they plug in without a rewrite.
Checks: web typecheck, 12 new Vitest tests, build (including lint:colors and dist-fonts), plus the Go quality floor.
/discover now shows the Side quests deck: the "Discover" kicker and
"Side quests" title, the teal "Quest log · N" pill, and the three
stacked cards in a 440 px deck with perspective 1000px. The top card
shows the washed photo, the name, the difficulty dots and the
"Why this?" box, with hidden "Try it!" and "Pass" stamps. The 62 px
Pass and Try it buttons and the ←/→ keys all go through one decide
handler that ignores input while a decision is in flight.
An empty deck shows "All caught up" with "Get more now", which starts a
suggestion batch and shows skeleton cards while its job runs, reading
the deck again as the batch stores Side quests.
Maestro task 1ecc121c-86eb-4784-a9fb-1314709b4a59.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Quest log pill is now a button that shows and hides the names of
the dinners in the Quest log, read from GET
/api/v1/dinners?status=quest_log; the designed Quest log sheet replaces
this list in its own task.
A batch whose job cannot be polled, or whose result cannot be read,
now shows an error with a Retry that asks for the batch again, instead
of leaving skeleton cards on screen with no way out.
Decisions go through one submit guarded by a ref set before the request
is sent, so presses before the next render cannot send a second,
conflicting decision. A decision counts as saved only when the answer
is that suggestion, accepted or declined as chosen; anything else shows
in the "Couldn't save that choice" banner.
Pass and Try it are IconButtons: IconButton gains a neutral tone and
showLabel, which shows the label as an 11 px caption under the circle.
Maestro task 1ecc121c-86eb-4784-a9fb-1314709b4a59.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
useJob now takes the job kind and checks each GET /api/v1/jobs/{id}
answer: the requested id, the expected kind, a known status, a result
and a text or null error. An answer that is not the job is exposed as the
error and stops polling, so an unknown status no longer leaves the
Discover skeleton cards running with no error or Retry. useJob also
returns poll, which asks for the job at once and restarts the backoff;
the Discover page's "Couldn't check on new side quests" Retry uses it
instead of posting another batch.
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
1ecc121c-86eb-4784-a9fb-1314709b4a59- "Discover deck screen (1a)" (Feature 13).Done-condition: /discover renders mock 1a (kicker "Discover", title "Side quests", teal-200/teal-800 "Quest log · N" pill, a 440 px perspective-1000 deck area with three stacked cards at the specified depth transforms and radius 32, the top card with a 220 px inset washed photo, Bagel 24 px name, three 8 px difficulty dots and the Easy/Medium/Hard label, a teal-100 "Why this?" box, the hidden "Try it!" and "Pass" stamps, 62 px Pass and Try it buttons with 11 px labels, and ←/→ keys triggering Pass/Try it), the "All caught up" / "New side quests arrive Sunday." empty state with "Get more now" starting a batch and showing skeleton cards while the job runs, and Vitest coverage of rendering from a stubbed deck, the keyboard triggers, the empty state and Get more now. Typecheck, test and build pass.
Consumes the already-merged batch/deck/accept/decline API from task b4f2558c. The swipe gesture (54c12e9e), the exit animations (cb7da499), the optimistic mutations/prefetch (ea935fbc) and the Quest log sheet (5ad0b188) remain later tasks; the screen shares one
decidehandler and an input-lock state so they plug in without a rewrite.Checks: web typecheck, 12 new Vitest tests, build (including lint:colors and dist-fonts), plus the Go quality floor.
Independent Codex gpt-6-sol review: CHANGES_REQUIRED for this exact commit.
Independent Codex gpt-6-sol review: CHANGES_REQUIRED for this exact commit.
useJob now takes the job kind and checks each GET /api/v1/jobs/{id} answer: the requested id, the expected kind, a known status, a result and a text or null error. An answer that is not the job is exposed as the error and stops polling, so an unknown status no longer leaves the Discover skeleton cards running with no error or Retry. useJob also returns poll, which asks for the job at once and restarts the backoff; the Discover page's "Couldn't check on new side quests" Retry uses it instead of posting another batch. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>Independent Codex gpt-6-sol review: APPROVED for this exact commit.