SM-2 Calculator

SkillProductivity

SM-2 spaced-repetition algorithm reference for the Fluent language learning system. Use whenever the tutor schedules the next review of a vocabulary item, grammar rule, or error pattern — i.e. after every answered review question. Defines the 0-5 quality scale, interval formula, easiness-factor update, and mastery-level transitions that keep the spaced-repetition database correct.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the SM-2 Calculator skill

What this skill tells your AI

The instructions your AI receives, as published by m98/fluent in .claude/skills/fluent-sm2-calculator/SKILL.md and read by ahel’s review.

Overview

Fluent uses SM-2 (SuperMemo 2) to decide when the learner next sees an item. This skill is the single source of truth for the algorithm. Every practice skill updates <data_dir>/spaced-repetition.json (where <data_dir> is resolved by fluent_paths.data_dir()) through these rules after each answered question.

When to Use

Load this skill whenever the tutor:

  • Grades a review-queue item and must compute its next due date.
  • Maps a 0-10 score to an SM-2 quality.
  • Updates easiness_factor, interval_days, repetitions, or mastery_level on a spaced-repetition item.
  • Decides which queue (today / tomorrow / this_week / later) to place an item in.

Skip this skill when the fluent-db-updater skill is already being used — the update-db.py script runs SM-2 internally.

Instructions

1. Convert score to quality

ScoreQualityMeaning
10/105Perfect, instant recall
8-94Correct after hesitation
6-73Correct with difficulty
4-52Incorrect but remembered when shown
2-31Incorrect, familiar
0-10Complete blackout

Rule: quality = floor(score / 2).

2. Update interval

if quality >= 3:   # correct
    if repetitions == 0:
        interval = 1
    elif repetitions == 1:
        interval = 6
    else:
        interval = round(previous_interval * easiness_factor)
    repetitions += 1
else:              # incorrect
    interval = 1
    repetitions = 0

3. Update easiness factor

Apply after every answer:

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

4. Update mastery level

Track consecutive_correct and consecutive_incorrect per item:

if consecutive_correct >= 5:
    mastery_level = min(5, mastery_level + 1)
    consecutive_correct = 0
elif consecutive_incorrect >= 3:
    mastery_level = max(0, mastery_level - 1)
    consecutive_incorrect = 0

5. Update per-item fields

After each answer, the item in spaced-repetition.json must have:

  • easiness_factor — updated via formula
  • interval_days — new interval
  • repetitions — incremented or reset
  • consecutive_correct / consecutive_incorrect — one incremented, the other reset
  • total_reviews — incremented
  • mastery_level — possibly changed
  • due_datetoday + interval_days (YYYY-MM-DD)
  • last_reviewed — today

6. Route to correct queue

After updating:

  • interval_days == 1review_queue.tomorrow
  • interval_days <= 7review_queue.this_week
  • interval_days > 7review_queue.later

If the learner got it wrong (quality < 3), keep the item in review_queue.today so it reappears in the same session.

7. Preferred implementation

Do not hand-edit spaced-repetition.json. Call .claude/hooks/update-db.py with a review_results array — the script runs SM-2 atomically and rebuilds the queue. Only do manual math when the script is unavailable. See the fluent-db-updater skill for the payload schema.

python3 "${CLAUDE_PLUGIN_ROOT:-${CLAUDE_PROJECT_DIR:-.}}/.claude/hooks/update-db.py" <<'EOF'
{
  "session_id": "session-NNN",
  "date": "YYYY-MM-DD",
  "review_results": [
    { "item_id": "vocab_huis", "quality": 4 }
  ]
}
EOF

Examples

See .claude/references/sm2-worked-examples.md for 4 worked examples covering: correct answer (regular case), wrong answer (reset + EF drop), 5th consecutive correct (mastery bump), 3rd consecutive wrong (mastery drop). Each example shows the full before/after state.

Quick version:

  • Correct, q=4: interval = round(prev * EF), repetitions += 1, EF barely moves.
  • Wrong, q<3: interval = 1, repetitions = 0, EF drops sharply, item stays in today's queue.

Critical Rules

  • Floor EF at 1.3. Never let the easiness factor drop lower — rounds to infinite daily reviews.
  • Reset repetitions on wrong answer. The item returns to the start of the learning sequence.
  • Do not hand-tune intervals. Trust the algorithm. Shortcuts break long-term retention.
  • Prefer update-db.py. Only reimplement this math when the script is unavailable.

Why This Matters

SM-2 reviews items just before the learner forgets them, maximizing long-term retention per minute of practice. Wrong scheduling means wasted reviews (too early) or forgotten items (too late). The whole Fluent system rests on these numbers being correct.

Signals

GitHub stars
399
Forks
57
Last commit
Jun 2026
Advanced
Catalog kind
skill
Gateway key
fluent-sm2-calculator
Source
github.com/m98/fluent