rate_cpm = correct_answers / minutes_active
accuracy = correct_answers / (correct_answers + wrong_answers) (0–1)
retention_30d = rolling 30-day recall quality (0–1), implementation TBD
streak_days = consecutive days with ≥ X reviews (configurable)
eCPM = rate_cpm * accuracy
streak_multiplier = 1 + min(streak_days, 21) * 0.01 (max +21% boost)
retention_weight = 0.5 + 0.5 * retention_30d (weights between 0.5–1.0)
LS = eCPM * streak_multiplier * retention_weight
Grades:
S (Elite): LS ≥ 4.5
A: 3.6 ≤ LS < 4.5
B: 2.8 ≤ LS < 3.6
C: 2.0 ≤ LS < 2.8 (baseline)
D: 1.2 ≤ LS < 2.0
F: LS < 1.2
Academic Ability Index (optional, off by default):
LS_plus = LS * (0.9 + 0.2 * academic_index_norm)
Experimental; disabled by default.