You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The design has no card-detail screen. A card opens as a bottom sheet over the Cards tab, so the learner never leaves the grid (CardSheet, screens.jsx:2458). The app pushes a route under a bare, title-less AppBar().
And the keepsake line never renders.CoffeeCardModel.fact is assembled (content_assembly.dart:106) and documented in the model as "the keepsake line the reward carries under its summary" — a grep finds it drawn only in the visual-guide sheet. The one line that makes a collectible worth keeping is parsed and dropped.
What ships
Row
26
The sheet, through showAppSheet — the app's one sheet primitive, which a guard test already requires every sheet to use
27
The FACT block: the smallcaps label over the fact, in the display face at the heading step
30
TriedSeal on the header when the card's challenge is done — the state is already modelled (card_stamp_section.dart)
31
The category line goes. The design's header prints no tag under the title
32
The hardcoded path goes. The tile navigates nowhere at all now — it raises a sheet, which is the row's complaint answered rather than its letter
33
The title leaves headlineSmall at w700 for the display face — see the divergence below
The route survives.#171 scopes its universal links to "the card route only", so the deep link keeps its target — it lands on the Cards tab with the sheet already raised, rather than on a screen of its own.
One deliberate divergence — the title's step
The design sets this sheet's title at --t-display. Its sibling sheets do not: the gate, the challenge and the duel all use --t-title, and the app's one sheet primitive draws every title at that shared step. The card keeps the shared step. Forking showAppSheet for a single caller would trade a rule the app enforces for one step of type on one screen. The face is right either way — the fault row 33 names, headlineSmall at w700, is gone.
What defers, and why
The artwork (row 28).CARD_ART is 37 per-kind drawings (screens.jsx:2312) with no counterpart in lib/. The tile needs that same family, and #434 already holds the question open beside the one #87 asks of the grove. One ticket draws them or none does; building half here would only fork the answer.
The meta rows (row 29).CoffeeCardModel carries no meta and the extractor emits none, so this is a content-pipeline gap before it is a layout one — as Audit E says of it.
Acceptance criteria
A card opens as a sheet over the grid and closes back onto it unmoved; the pushed screen and its bare AppBar are gone, and the deep-link route still resolves — over the tab's own grid, and only for a card the learner has earned. Seven widget tests, including the two review found: a link to an unearned card opens nothing, and the link's page paints nothing so the grid under the sheet is the tab's own
The keepsake line renders under the summary, FACT above it, and the title sets in the display face with no category line beneath — the last asserted inside the sheet, not by counting
A card whose challenge is done wears the tried seal, and cardChallengeTried answers that for both it and the stamp block below
From Audit E — rows 26–33, the whole of its §4.
The design has no card-detail screen. A card opens as a bottom sheet over the Cards tab, so the learner never leaves the grid (
CardSheet,screens.jsx:2458). The app pushes a route under a bare, title-lessAppBar().And the keepsake line never renders.
CoffeeCardModel.factis assembled (content_assembly.dart:106) and documented in the model as "the keepsake line the reward carries under its summary" — a grep finds it drawn only in the visual-guide sheet. The one line that makes a collectible worth keeping is parsed and dropped.What ships
showAppSheet— the app's one sheet primitive, which a guard test already requires every sheet to useFACTblock: the smallcaps label over the fact, in the display face at the heading stepTriedSealon the header when the card's challenge is done — the state is already modelled (card_stamp_section.dart)headlineSmallatw700for the display face — see the divergence belowThe route survives. #171 scopes its universal links to "the card route only", so the deep link keeps its target — it lands on the Cards tab with the sheet already raised, rather than on a screen of its own.
One deliberate divergence — the title's step
The design sets this sheet's title at
--t-display. Its sibling sheets do not: the gate, the challenge and the duel all use--t-title, and the app's one sheet primitive draws every title at that shared step. The card keeps the shared step. ForkingshowAppSheetfor a single caller would trade a rule the app enforces for one step of type on one screen. The face is right either way — the fault row 33 names,headlineSmallatw700, is gone.What defers, and why
The artwork (row 28).
CARD_ARTis 37 per-kind drawings (screens.jsx:2312) with no counterpart inlib/. The tile needs that same family, and #434 already holds the question open beside the one #87 asks of the grove. One ticket draws them or none does; building half here would only fork the answer.The meta rows (row 29).
CoffeeCardModelcarries nometaand the extractor emits none, so this is a content-pipeline gap before it is a layout one — as Audit E says of it.Acceptance criteria
AppBarare gone, and the deep-link route still resolves — over the tab's own grid, and only for a card the learner has earned. Seven widget tests, including the two review found: a link to an unearned card opens nothing, and the link's page paints nothing so the grid under the sheet is the tab's ownFACTabove it, and the title sets in the display face with no category line beneath — the last asserted inside the sheet, not by countingcardChallengeTriedanswers that for both it and the stamp block belowflutter analyze, metrics gate, tests clean; changelog bullet — 2026 tests