Skip to content

Replaying a lesson skips the confirm sheet the design draws #573

Description

@maximsan

This was generated by AI during triage.

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.

Out of scope

  • Keep Sharp's lesson-replay recommendation, which launches a lesson directly today. #582 changes its Start to open the Lessons group, after which the row there carries this sheet. Until The practice list groups lessons by module and games by kind, collapsibly (10 Sep drop) #582 lands, that one route still skips it.
  • The lesson ending's practice-again link, which starts its run directly by design.
  • What a replay is worth. Pays nothing, lifts mastery, protects the day — unchanged.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    design-parityCloses a finding in the app-vs-prototype divergence registerfeature-buildA screen or mechanic the app does not have yetready-for-agentFully specified, ready for an AFK agent

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions