Spaced repetition is card sorting where the zones are how well did that go and the pile writes itself: every answer schedules the card back into the future. Tap the card to turn it over, then grade it โ the zone labels show what each grade costs you in days, which is the number Anki puts on its buttons and the only one anybody reads.
Every other demo hands the deck an advisor, and this one does not. A recommender learns
where things go from what the card looks like โ and a flashcard's grade does not live in the card, it
lives in your head. A model that guessed Good because the last three Japanese cards were good would be
confidently wrong about the only thing that matters. Knowing when not to predict is part of the design.
onSort grades the card with SM-2, and then puts it back: Again returns it a few cards
later in the same session, anything else schedules it out in days and removes it from today's queue. That is
the whole loop โ the deck never needs to know it is doing spaced repetition.
onSort: (card, zone) => {
const graded = schedule(card, GRADE[zone.id]); // SM-2
if (graded.interval === 0) deck.setItems([...deck.items.slice(1, 4), graded, ...deck.items.slice(4)]);
else scheduled.push(graded); // out of today's pile
}
The zone labels are rewritten for every card with setZones(), which is what makes the four
buttons honest: Easy on a card you have seen four times is not the same promise as Easy on a
card you have never seen. Same keys, same positions โ only the numbers move.
turns the card over (there is no "later" in a study session, so the skip key does the one thing that makes sense), a s d f grade it, takes the last one back โ including its schedule.