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
Body rewritten at triage, 11 September 2026. Owner ruling, 11 Sep 2026: the sheet ships, with copy written for this app rather than ported. The design's own lines say a replay changes nothing for points and streak; here a replay protects the day, so porting them would talk a learner out of the one thing replays are for.
What the app does now
Tapping a finished lesson — on the Path, in the Learn tab's practice shelf, or in Saved — opens it straight away. Nothing asks whether the tap was meant, and nothing says what a second run is worth. The no-points half of review mode is already shipped: a replay pays nothing, lifts mastery, and records the day.
What ships
A bottom sheet before the replay starts, raised through the app's one door for modals rather than as a dialog, titled with the lesson's name and a question mark, confirming with Review lesson and dismissing with Not now. Its four lines:
Line
Reads
Points
No change
Streak
Counts for today, or Already earned today when the day is protected
Length
the lesson's time and card count
Last completed
the day the lesson was last finished
Points and streak are two lines, not the design's one, because in this app they no longer agree.
The streak line reads the day (owner ruling). A replay protects the day only when the day is not already earned, so a fixed Counts for today would overstate on a day the learner has already covered.
Last completed needs a new stored day (owner ruling). The progress record keeps only the day a lesson was first completed, and the activity record — the only place a replay is written — prunes to two days. So neither can answer the question. Store the last completion day per lesson, written by every finishing run, first or replay. Across devices it folds to the later day and never goes backwards, the same law mastery's best-ever result already follows. Name the schema change, never its number.
The confirm sheet is a shared primitive
The app has no confirm sheet — its only confirmation today is a Material alert dialog in Settings. The design catalogues one: a title, a column of itemised lines, and its own confirm and cancel labels. #570 needs the same thing for Reset Progress, in the destructive variant with what-you-lose lines.
#570 owns the component and builds it, because Reset needs the richer variant. This ticket reuses it and builds no second one, so it follows #570 rather than racing it.
Where it appears
From the three lists that can reach a finished lesson: the Path, the practice shelf, and Saved.
Not from the lesson ending's practice again link — the design starts that run directly, and a learner who has just chosen to practise should not be asked again. An unfinished lesson is unaffected anywhere.
Acceptance criteria
A finished lesson opened from the Path, the practice shelf or Saved raises the sheet first; the ending's practice-again link and every unfinished lesson still start immediately. A fourth route was found and ruled in: a term's where you learned it row, which this ticket never named. Ten tests in replay_confirm_sheet_test.dart
The four lines say what this app does, with the streak line switching on whether the day is already earned, and the last-completed day updating on a replay as well as a first run — replay_confirm_test.dart and scope_writers_test.dart
Confirming plays the run exactly as a replay does today — no points, mastery upward, the day recorded — and Not now starts nothing
dart format, flutter analyze, the metrics gate and the suite pass, with a changelog bullet; the sheet was driven on a simulator and reviewed
Also to correct
docs/design/05-mechanics.md §5.1 promises the sheet in the same breath as "review mode … skips the reward screens entirely". The app rejected that second half deliberately — a replay shows its ending with its own eyebrow and a collapsed points line — so the bullet is wrong either way and is corrected with this work.
Body rewritten at triage, 11 September 2026. Owner ruling, 11 Sep 2026: the sheet ships, with copy written for this app rather than ported. The design's own lines say a replay changes nothing for points and streak; here a replay protects the day, so porting them would talk a learner out of the one thing replays are for.
What the app does now
Tapping a finished lesson — on the Path, in the Learn tab's practice shelf, or in Saved — opens it straight away. Nothing asks whether the tap was meant, and nothing says what a second run is worth. The no-points half of review mode is already shipped: a replay pays nothing, lifts mastery, and records the day.
What ships
A bottom sheet before the replay starts, raised through the app's one door for modals rather than as a dialog, titled with the lesson's name and a question mark, confirming with Review lesson and dismissing with Not now. Its four lines:
Points and streak are two lines, not the design's one, because in this app they no longer agree.
The streak line reads the day (owner ruling). A replay protects the day only when the day is not already earned, so a fixed Counts for today would overstate on a day the learner has already covered.
Last completed needs a new stored day (owner ruling). The progress record keeps only the day a lesson was first completed, and the activity record — the only place a replay is written — prunes to two days. So neither can answer the question. Store the last completion day per lesson, written by every finishing run, first or replay. Across devices it folds to the later day and never goes backwards, the same law mastery's best-ever result already follows. Name the schema change, never its number.
The confirm sheet is a shared primitive
The app has no confirm sheet — its only confirmation today is a Material alert dialog in Settings. The design catalogues one: a title, a column of itemised lines, and its own confirm and cancel labels. #570 needs the same thing for Reset Progress, in the destructive variant with what-you-lose lines.
#570 owns the component and builds it, because Reset needs the richer variant. This ticket reuses it and builds no second one, so it follows #570 rather than racing it.
Where it appears
From the three lists that can reach a finished lesson: the Path, the practice shelf, and Saved.
Not from the lesson ending's practice again link — the design starts that run directly, and a learner who has just chosen to practise should not be asked again. An unfinished lesson is unaffected anywhere.
Acceptance criteria
replay_confirm_sheet_test.dartreplay_confirm_test.dartandscope_writers_test.dartdart format,flutter analyze, the metrics gate and the suite pass, with a changelog bullet; the sheet was driven on a simulator and reviewedAlso to correct
docs/design/05-mechanics.md§5.1 promises the sheet in the same breath as "review mode … skips the reward screens entirely". The app rejected that second half deliberately — a replay shows its ending with its own eyebrow and a collapsed points line — so the bullet is wrong either way and is corrected with this work.Out of scope