Practice
Drilling a study's own book moves, with a per-position knowledge score that fades over time.
Purpose and access
The Stats tab reports how good a study is if perfectly memorized; Practice is where that memorization actually happens. Each session drills exactly one study's own-side moves and updates a per-position knowledge score that decays with time, so the numbers reflect real, current recall rather than "was once learned." Requires Lichess sign-in, same as Studies and Stats.
Practice list
- One card per study, showing aggregate knowledge (the mean knowledge score across the study's own-side positions), a due count, and a new (never-drilled) count.
- A Practice button opens a session for that study. Disabled only when the study has no moves of its own to drill; having nothing currently due or new never disables it, since a session then falls back to a voluntary review of whatever isn't already at 100% instead.
Knowledge score
Tracked per position — one own-side decision node in the tree, since the tree already guarantees exactly one prepared reply there. Not tracked for opponent nodes; there is nothing to know about a move you don't choose.
Each position carries a streak (0–3 consecutive correct answers), a stability value in days, and the timestamp of its last attempt. A correct answer increments the streak and doubles the stability; a wrong answer resets both the streak and the stability to their starting values. Retention at any moment is $$r = e^{-t/s},$$ where \(t\) is days since the last attempt — 100% right after a correct answer, decaying continuously afterward, faster for low-stability (fresh) positions than high-stability (well-rehearsed) ones.
The streak cap and the stability growth are independent: once the streak is already at 3, a further correct answer leaves it at 3 but still doubles the stability. So answering correctly always resets retention to 100% at that instant — regardless of how low it had decayed to beforehand, since that decayed value only ever mattered for whether the position was due for review in the first place — and correctly answering a fully-known position repeatedly keeps extending how long it takes to become due again, not just until it first reaches streak 3.
The displayed knowledge score is $$K = \frac{\text{streak}}{3} \times r,$$ or "Not started" if never attempted. A position answered correctly once today shows 33%, not 100% — one repetition is progress, not mastery. A position mastered weeks ago and gone stale can show less than a position learned yesterday; a faded mastery is genuinely worse than fresh partial progress, and the number should say so. A position becomes due for review once its retention drops below a fixed threshold (80%), independent of the number currently shown for it.
Session mechanics
A session starts from the study's effective starting point (its custom starting point if one is set, otherwise the tree's real root — same resolution rule the Stats tab uses) and builds a bounded queue (default 20 positions): due positions first, oldest first, then new positions in tree order. Not leverage-ranked; queue order is due-ness only. If that leaves nothing queued but the study has drill items, the queue falls back to a voluntary review of whatever isn't already at a full, rounded 100% knowledge, oldest-practiced first — only if literally everything is at 100% does it fall back further, to reviewing all of them. Practice is never blocked just because the schedule is currently satisfied, but a mostly-mastered line also shouldn't have to be re-answered from its first move just to reach the one position that's actually worth reviewing: since only selected nodes get prompted (everything else is silently auto-played), excluding maxed-out nodes from that fallback is what makes the session start right at the first move that isn't already perfect.
- At an own-side position, wait for a move on the board. Only the first attempt is graded: a correct first try applies the knowledge update for a correct answer and continues into that child. A wrong first try applies the update for a wrong answer once, then lets you try again at the same position instead of revealing the answer immediately — a correct retry continues on exactly like a first-try success; a "Show answer" option plays the correct move and moves on for when you're genuinely stuck. Further wrong retries don't grade again.
- At an opponent position, the app plays a reply itself. Every branch that leads to a due or new position gets walked (in order, not chosen at random); branches with nothing left to review in them are skipped entirely rather than visited pointlessly. There is nothing to grade here.
- Reaching a leaf, or the end of the prepared line, ends that queue item and advances to the next.
- A session has no natural end: once a round's queue is drained, the next one loads automatically (a brief "Nice work — loading more…" transition, then straight into the next prompt) rather than stopping — there's no reason the app should force you to leave and come back. The study's live aggregate knowledge is shown in the session header throughout, updating after every graded attempt. The only way to stop is the "End session" link, which just navigates back to the Practice list — nothing needs to be finalized, since every attempt is already saved as it happens.
Session view reuses the Study editor's board, theme, and piece set, with the Opening Explorer panel hidden. Its Stockfish toggle is kept, though, as a read-only "explore this position" option — arrows and a ranked eval list, no click-to-play — available at any point in the session for understanding why a missed move was right.
Reaching a rounded 100% knowledge score pauses the otherwise open-ended session with a one-time celebration — a short animation, then an explicit choice between "End session" and "Continue practicing" — rather than silently rolling into another round. It only fires once per tab visit, not on every subsequent correct answer that happens to still be at 100%.
Data model
Practice state is stored separately from a study's tree — it changes on every attempt, not on every Save — keyed by owner, study, and node ID: streak, stability, and last-attempt timestamp per position. The knowledge score itself is never stored; it is always computed from those three fields plus the current time, so tuning the decay formula later needs no migration.
Deleting a subtree orphans its practice rows harmlessly, since a deleted node ID is never reused. Rebuilding "the same" line afterward gets a new node ID and starts with no practice history — intentional: a rebuilt line is honestly a new thing to learn, not a continuation of a branch that no longer structurally exists.
Scope and limits
- One study per session; no cross-study "everything due today" dashboard yet.
- No leverage-based queue ordering (the biggest-objective-swing-if-wrong ranking from the Stats tab's own machinery) — due-ness only, for now.
- No sparring/play mode — opponent replies are sampled uniformly from the tree, not weighted by real Explorer frequency, since this mode is about rehearsing branches already chosen to prepare for, not discovering realistic ones.
- No knowledge heatmap on the Study editor's move tree yet, though the same move-coloring mechanism the starting-point marker uses would suit one well as a follow-up.