How SM-2 Works in SmartRecall

A worked example of the SM-2 spaced-repetition algorithm — initial intervals, ease-factor updates, lapses, and how SmartRecall implements them.
Apr 29, 2026

How SM-2 Works in SmartRecall

SM-2 is the spaced-repetition algorithm Piotr Wozniak published in his 1987 SuperMemo paper. It's also the algorithm behind Anki and Mnemosyne. This page documents exactly how SmartRecall implements it — every constant, every transition, with a worked example.

The 60-second summary

After every review, you rate how the recall felt:

  • Again (0) — failed, didn't recall
  • Hard (3) — recalled, but with serious effort
  • Good (4) — recalled with normal effort
  • Easy (5) — trivial recall

SM-2 uses that rating to update two numbers per card:

  1. Interval (I) — days until the next review
  2. Ease factor (EF) — a multiplier that controls how fast the interval grows

Higher ratings → bigger EF → faster-growing intervals. Lower ratings → smaller EF → tighter intervals. A failure resets the interval but only nudges EF down.

The exact rules SmartRecall uses

Initial values for a new card:
  I  = 0       (will be set on first review)
  EF = 2.5
  reps = 0     (consecutive successful reviews)

On review with quality q (0–5):

  if q < 3:                  // lapse
    reps = 0
    I    = 1                 // back to 1 day
    // EF still updates below

  else:                      // success
    if reps == 0: I = 1
    elif reps == 1: I = 6
    else:          I = round(I_prev * EF)
    reps = reps + 1

  EF = max(1.3, EF + (0.1 - (5 - q) * (0.08 + (5 - q) * 0.02)))

The EF formula collapses to friendly numbers at each rating:

RatingqEF change
Again0−0.80
Hard3−0.14
Good40.00
Easy5+0.10

EF is clamped at a minimum of 1.3 — we never let a card grow exponentially slower than that, no matter how many lapses.

A worked example

A new card on "What is the spacing effect?":

ReviewRatingqreps afterEF afterI afterNext review
1Good412.501 daytomorrow
2Good422.506 days+6 d
3Easy532.6016 days+16 d
4Hard342.4639 days+39 d
5Again001.661 daytomorrow (lapse)
6Good411.661 day+1 d
7Good421.666 days+6 d

A few things to notice:

  • The first two intervals (1 d → 6 d) are fixed, not multiplied. SM-2 hard-codes them so brand-new cards don't immediately fly out to 30 days because of a high EF.
  • After review 4, the interval is round(16 * EF) = round(16 * 2.46) = 39.
  • Review 5 is a lapse — reps resets to 0, I resets to 1, but EF only drops by 0.80 (not back to 2.5). The card is "wounded," not erased.
  • After the lapse, the schedule does not repeat the 1 → 6 ramp; it continues from reps = 1 after review 6 because review 6 was successful.

What SmartRecall changes

SM-2 is the floor, not the ceiling. We make three pragmatic adjustments:

  1. Soft-lapse on Hard ratings. If you rate Hard three times in a row, we cap the next interval at I_prev — so a card you keep struggling with stops growing until you flip to Good. Pure SM-2 would keep multiplying by EF and surface it less often.
  2. Leech detection. If a card lapses 8 times total, we tag it as a leech and surface it on your dashboard so you can rewrite it. A bad card is a workflow problem, not an algorithm problem.
  3. Deterministic seeding from generation time. When the AI emits a 200-card deck, we don't drop them all on day one — we spread the initial I = 1 reviews across the next 5 days using a deterministic hash of the card ID. That keeps the daily review queue flat.

Everything else — EF formula, the 1/6 day ramp, the 1.3 floor, the lapse semantics — is exactly the 1987 paper.

Why not FSRS?

FSRS is a more recent scheduler that learns per-user retention curves from review history. It's measurably better than SM-2 once you have ~1000 reviews. We're working on it as an opt-in scheduler — track Updates for the rollout.

Further reading