From the divergence register (fix order step 10), tracked on the master checklist §5.
The design does not show the full locked set. The grid renders earned cards, then exactly one locked teaser, then a footer reading "{n} more to collect" (prototype/screens.jsx:1647-1664). Confirmed as still wanted (product owner, Aug 2026).
Acceptance
Built in PR #439. The screen's own "Collection" title went with it: the shared header already carries the tab's name, so it was being said twice. The design has both — an invisible bar at rest and a large title on the screen — and the app's bar draws at rest instead; that is #441, and the title comes back when it lands.
The tile is untouched and still diverges — a locked one draws ??? where the design draws its place in the set. That is #434.
The teaser is inert — and a fourth criterion asking otherwise was wrong
This read "Tapping the teaser opens the same sheet an unearned card opens". The design has no such behaviour, and the citation above does not cover the code that settles it: CollectionCard (prototype/screens.jsx:2398) returns early for an unearned card with no onClick, so a locked tile — teaser or not — opens nothing. The app already agrees: card_grid_item_widget.dart passes onTap: null when uncollected.
So there is nothing to build for it, and building it would add a tap target the design withholds. Dropped rather than carried, so it is not re-added.
This therefore does not wait on #385. The sheet that ticket builds is for earned cards; nothing here opens anything. The two are independent and can land in either order.
From the divergence register (fix order step 10), tracked on the master checklist §5.
The design does not show the full locked set. The grid renders earned cards, then exactly one locked teaser, then a footer reading "{n} more to collect" (
prototype/screens.jsx:1647-1664). Confirmed as still wanted (product owner, Aug 2026).Acceptance
cardsGridItems, unit-tested over a fresh, a partial and a complete collection; the teaser keeps its authored position, so it can sit between two earned cards.total − earned, which counts the visible teaser, so it is not one less — asserted both ways incards_grid_test: three counted, one of them on screen.{earned} of {total}in mono at the label step (checklist §5 items 23–25) —cards_collection_testpins all three, including that two module tags produce no headings.Built in PR #439. The screen's own "Collection" title went with it: the shared header already carries the tab's name, so it was being said twice. The design has both — an invisible bar at rest and a large title on the screen — and the app's bar draws at rest instead; that is #441, and the title comes back when it lands.
The tile is untouched and still diverges — a locked one draws
???where the design draws its place in the set. That is #434.The teaser is inert — and a fourth criterion asking otherwise was wrong
This read "Tapping the teaser opens the same sheet an unearned card opens". The design has no such behaviour, and the citation above does not cover the code that settles it:
CollectionCard(prototype/screens.jsx:2398) returns early for an unearned card with noonClick, so a locked tile — teaser or not — opens nothing. The app already agrees:card_grid_item_widget.dartpassesonTap: nullwhen uncollected.So there is nothing to build for it, and building it would add a tap target the design withholds. Dropped rather than carried, so it is not re-added.
This therefore does not wait on #385. The sheet that ticket builds is for earned cards; nothing here opens anything. The two are independent and can land in either order.