Skip to content

Docs / Technical

How an answer is scored.

Every answer you give produces one number between 0 and 1, and that number then has to serve four consumers that want different things from it. This page is the arithmetic, with the constants, and then one learning point followed end to end so the numbers have somewhere to land.

Everything here is read off the engine source and named with its real identifier, so you can go and check it rather than take it on trust.

What one answer has to serve.

The obvious design is one score: how well you did, used for everything. It does not survive contact with the four questions the app actually has to answer, because they are not the same question and a single number cannot be right for all of them at once.

The questionWho asks itWhich number it reads
Did I get it right?you, the badge, the end-of-session count, your correct-answer percentagethe score exactly as graded — never discounted
When should this come back?the schedulerthe score after the format's chance cap, turned into one of four grades
Is this point actually held?the durability gate, the "mastered" labelaccumulated evidence — how much each answer could prove, not how many there were
Is this lesson the problem?the content-revision passa running average of the discounted score

Two of those read a discounted number and two read the raw one, which is the single most confusing thing on this page and also the reason the design works. A score answers a question about the answer. A schedule answers a question about your memory. Paying the same number into both would mean either telling you that you got something wrong when you did not, or telling the scheduler that a coin-flip guess was a recall.

The two halves of a score.

A graded answer is carried through the engine as a pair, not a scalar (ItemScore, mastery/mod.rs). The raw half is what you are shown. The other half is what the scheduler is shown, and it is never above the raw one.

Where the raw number comes from

Nine of the fourteen formats are graded on your device, deterministically. Five need a model, because there is no way to compare prose to prose without one.

FormatGraded byHow the number is formed
mcq, true_falseyour device1 or 0. No partial credit exists to give.
matching, categorizeyour devicethe fraction of rows placed correctly.
orderingyour devicehow many pairs are in the correct relative order, rescaled so that a random arrangement sits at 0 rather than at a half-mark.
word_orderyour device1 or 0 — the sentence is right or it is not. Compared as a sentence, so a repeated word is not a wrong answer.
numeric_answer, code_traceyour device1 or 0, against the expected value.
flashcardnobodyyour own rating — you press again / hard / good / easy and that becomes 0 / 0.6 / 0.8 / 1.0. Nothing is read from you. This is the one format whose number is a self-report.
fill_blankyour device, then a modelthe fraction of blanks that match exactly, up to case and punctuation. If every blank matches, it scores 1.0 with no model call at all; only a miss goes to the judge, for synonym tolerance. With no model configured the deterministic score is final.
short_answer, writing, code_bug_spot, solve_equationa modela judge returns the number and the explanation. This is the one number on this page whose arithmetic we cannot show you — see the limits below.

Where the scheduler's number comes from

The raw score is capped by how much of that format you could have collected by guessing (chance_rate and clamp_fsrs_for_kind, mastery/mod.rs). One formula, one input:

cap = 1 − 0.5 × c

where c is the share of that format a random answer collects. The reasoning is that a cap should represent the most durability evidence one correct answer of that format can possibly carry, and the quantity that fixes it is how much of the answer could have been luck. A score already below its cap is untouched, and the stored attempt is never modified — only the copy handed to the scheduler.

FormatChance rate cCapBest grade reachable
true_false0.50 — a coin0.750Good
categorize, 3 categories0.333 — read off the item0.833Good
mcq, 4 options0.25 — read off the item0.875Good
ordering0.250.875Good
matching0.200.900Good
every typed or written answer0 — nothing to guess fromnoneEasy
flashcard0noneEasy

Two entries in that table deserve their own sentence. Every format where you pick from what is on screen tops out at Good — there is no perfect multiple choice, as far as the scheduler is concerned. And the flashcard is uncapped even though its number is a self-report, which looks like an oversight and is not: capping it would be treating it as a recognition format, and it is not one — you retrieve the answer from memory before you rate yourself. The problem with a flashcard is that we cannot verify you did; that is a problem about what it should be allowed to certify, not about what grade it should earn, and it is listed under the limits below.

Four grades, and the five bands you land in.

The capped score is turned into one of four grades (grade_of). Separately, a different constant decides whether the answer counts as a successful retrieval for durability (CORRECT_THRESHOLD, 0.80). That second line falls inside the third grade, so there are four grades and five bands.

Capped scoreGradeCounts as a success?What happens
0 → 0.50AgainnoTreated as forgotten. The interval collapses, the point is queued to return in ten minutes, inside the same session, and the forgetting counter goes up by one.
0.50 → 0.70HardnoRecalled, with difficulty. The interval still grows, but the growth is multiplied by 0.23. The forgetting counter is not touched — this is neither a lapse nor a success.
0.70 → 0.80GoodnoNormal recall for the scheduler, and still short of the durability line. The interval grows at full rate; the sitting is not recorded as a successful retrieval.
0.80 → 0.95GoodyesNormal recall, and it counts. The sitting is a successful retrieval, and the run of failures since your last clean success resets to zero.
0.95 → 1EasyyesRecalled without effort. Interval growth is multiplied by 2.99.

The Easy boundary is set at 0.95 rather than 0.90 on purpose: with automatic grading a clean answer hits exactly 1.0 constantly, and a lower boundary plus the large Easy bonus over-extends intervals, which shows up as points quietly going un-reviewed. That is a calibration decision, not a finding.

What a grade actually buys.

The scheduler keeps two numbers per learning point: a stability, which is roughly how many days it takes for your chance of recalling it to decay to the target, and a difficulty, which governs how fast stability can grow. The grade enters in two places.

  • On the first successful retrieval, the grade seeds both numbers. Left alone, the seeds are 0.40, 1.18, 3.17 and 15.69 days for Again, Hard, Good and Easy. They are then clamped to one day on a freshly introduced point (HOT_FIRST_INTERVAL_DAYS), because a concept met minutes ago sits on the steepest part of the forgetting curve and one recall straight after teaching does not earn a two-week gap. The grade still seeds the difficulty, so the signal is kept and shapes every later interval — the first interval is the one the app takes out of the algorithm's hands, and only the first.
  • On every later review, the grade scales the growth. Stability grows by an increment that depends on the current difficulty, the current stability and how likely you were to recall it at that moment — and that increment is then multiplied by 0.23 for a Hard, 1 for a Good and 2.99 for an Easy (next_stability_recall).

Which is abstract until you put days on it. Take a point sitting at a stability of one day, reviewed exactly when it was due — so your chance of recalling it was 0.90, which is what "due" means here:

The answer you gaveGradeNew stabilityNext review in
0.65, a judge on a short answerHard1.671.7 days
1.0 on a matching set (capped to 0.90)Good3.883.9 days
1.0 on an answer you typedEasy9.619.6 days

That is the whole of "an easy format is worth less to your schedule", in two rows. A flawless matching set and a flawless typed answer, on the same point, on the same day, differ by a factor of about two and a half in when you next see it — not because one is punished, but because the matching set could have been one fifth guessed and the typed answer could not.

One point, from first sight to its second review.

A single learning point — say osmosis — in a course where the terminal objective puts it at a retention target of 0.90. Nothing here is illustrative: the numbers are the ones the engine produces for these inputs.

Session 1 · the point is brand new

Slot 1 — a matching set, with support. You place 4 of the 5 rows.

  • Raw score 0.80. The badge says 80%, and the answer counts in your correct-answer percentage. That number is never touched again.
  • Scheduler's score 0.80. The matching cap is 0.90 and you are below it, so the cap does nothing here — a point worth noticing, because the cap only ever bites on a near-perfect answer.
  • Nothing is written yet. This is one answer in a sitting that is not over. The schedule is set once, when the sitting's answers on this point are combined — so read this slot as one input, not as an event.
  • Its evidence weight is 0.80 — one minus the 0.20 a matching set of five rows hands to someone arranging at random.

Session 1 · same point, a few exercises later

Slot 2 — the support is gone. You type the answer, and it is exactly right.

  • Raw score 1.0, uncapped — a typed answer has nothing to guess from. Its evidence weight is 1.00.
  • Now the sitting closes, and the two answers become one observation. Each answer is weighted by how much of it could not have been guessed: (0.80 × 0.80 + 1.00 × 1.00) ÷ 1.80 = 0.91.
  • Grade: Good, and the sitting counts as a successful retrieval (0.91 is above the 0.80 line). Not Easy — the perfect answer is pulled down by the supported one that came minutes before it, which is the honest reading of the sitting.
  • Stability seeded at 3.17 days, then clamped to 1.0. Difficulty seeded at 5.28 out of 10. Next review: tomorrow.
  • Evidence: 0 → 1.76. Not the sum of the two weights (1.80), because the second answer on the same point in the same sitting proves slightly less than the first. The durability gate wants 1.95, so the point is not there yet.
  • Running average: 0 → 0.27. One step per sitting, not one per answer — four exercises in ten minutes should not move the struggle signal four times.
  • Why one observation rather than two: four answers given within minutes of each other are not four spaced reviews. The gap is what makes a second answer mean something, and the session does not have one. But the answers are combined, not discarded — the difference is that the second one is now visible in both numbers.

Session 2 · the next day, the point is due

A short answer, graded by a model. It comes back 0.65.

  • Your chance of recalling it at that moment: 0.90. Not a coincidence — the interval was chosen so that this is what "due" means.
  • Grade: Hard. Stability 1.00 → 1.67. Next review in 1.7 days.
  • Not a successful retrieval — 0.65 is below the durability line. And the forgetting counter stays at 0 — it is not a lapse either. This is the band that surprises people: recalled, credited in the schedule, and counted as neither a success nor a failure.
  • Evidence: 1.76 → 2.76, and the gate's 1.95 is now cleared. A typed answer proves something about recall whether or not it was a good one — evidence is how much the format could show, and the verdict on the answer is the separate number above. Evidence across different days adds up undiscounted, because two sittings separated by a night are genuinely two observations.
  • Running average: 0.27 → 0.39.
  • Status: still Learning. Being called durable needs a stability of 21 days and enough accumulated evidence and no failures since the last clean success and at least one success on a freshly generated item. This point now has three of the four, and the one it is missing is stability — which no single answer can buy, only time can.

And the counterfactual, which is the useful part.

Had that second-session answer been a flawless typed one instead, the same point would have gone to a stability of 9.6 days and disappeared for a week and a half. Had it been a flawless matching set, 3.9 days — the same answer, in a format where a fifth of it comes free, is worth a third as much time. Had it come back 0.45, the point would have been treated as forgotten, returned ten minutes later in the same session, and the forgetting counter would have gone to 1 — two of those and the app queues a dedicated practice session on it without being asked.

So one answer, on one day, moves the next sighting of a point between ten minutes and ten days. That is the whole mechanism, and it is why the app cares much more about which format you answered in than about squeezing the last two percent out of a mark.

What this does not buy.

Five of these are real gaps rather than modesty, and two of them we are actively arguing about.

  • The judge's number has no arithmetic we can show you. For the five formats that need a model, everything on this page downstream of the score is exact and auditable, and the score itself is a model's judgement. We can tell you it is graded per submission on its own text, that it always comes with an explanation, and that the same answer re-graded may not land on the same number. We cannot show you a formula, because there is not one.
  • We know the direction of one correction and not its size. Several exercises on one point in one sitting are now combined into a single observation rather than kept-first-and-discarded, which is the repair this page used to promise. The combination deliberately makes each further answer on the same point count for a little less than the one before. That shape is not a preference: in test theory a bundle of items that share an object is called a testlet, and the measured consequence of treating such a bundle as independent answers is that the value comes out roughly right while the precision comes out overstated. Our two numbers split exactly along that line — the grade and the interval are the robust half, the evidence total is the half that would be inflated. So the discount corrects a bias whose direction is established. Its magnitude is not: the published way to size a testlet effect is to estimate it from a population of learners answering the same items, and a private, single-learner app has no such population. We use a fixed rate borrowed from the adjacent literature and we would rather say so than imply we measured it.
  • The caps are principled in shape and approximate in size. That a format's cap should fall as its guess rate rises is an argument. That the coefficient is one half is a calibration notch. What we defend is the ordering of the caps, which is pinned by a test; the absolute values are due a revisit against real answer data.
  • There is no difficulty per question. Nothing in the app knows that one question on a point is harder than another. The only difficulty in the engine belongs to the memory model and describes the point, not the item. So two questions of very different hardness on the same point produce scores the scheduler reads identically.
  • One format cannot be verified at all, and we have not finished deciding what that should cost it. A flashcard is graded by the button you press. It is a genuinely demanding format — you have to produce the answer before you can rate yourself — and it is also the one place where a generous self-rating stretches your own intervals. What bounds it today is only that a single self-reported Easy seeds a stability below the durability threshold, so it cannot on its own reach "mastered". Whether it should be allowed to count towards durability at all is an open question, and it is ours, not the algorithm's.
  • The confidence you report is collected and unused. Some exercises ask how sure you were. It is stored, it is put beside the result on the exercise you have just answered, and no decision reads it. It is the only signal in the app that distinguishes two people with the same score — succeeding while certain and succeeding while guessing come out identical otherwise — and right now we are not spending it. Either it gets wired into something or it should stop being asked for.
  • The 0.80 line is ours, not a result. Where "this counts as a successful retrieval" falls is a decision about how strict the durability claim should be. It is not derived from anything, and it sits inside a grade band rather than on a boundary, which is why the first question in the list below is the first question everybody asks.

Questions.

I got 80% and the app did not count it as a success. Why?

Because two different thresholds sit close together and they mean different things. At 0.80 and above, an answer counts as a successful retrieval — that is the counter the durability gate reads. The grade the scheduler uses has its own boundaries, and its middle band runs from 0.70 to 0.95. So an answer at 0.75 is graded as a normal recall and grows the interval, while adding nothing to the pile of evidence a point needs before it can be called durable. It is not a bug and it is not a penalty; the two numbers answer different questions, and 0.80 is where we drew the line for the second one.

Why did a perfect answer not push the review further out?

Because a session moves a point's schedule once, not once per exercise. Every graded answer you give on the same point in the same sitting is combined into a single observation, and that observation sets the interval. So a perfect answer does not add a review interval of its own — it pulls the sitting's combined value up, and the interval follows the combination. The reason is that four answers given within ten minutes are not four spaced reviews: the gap is what makes a second answer mean something, and the session does not have one. What the perfect answer does buy is evidence, which is counted separately and is what the durability gate reads. This is a change: until recently the app kept the first answer and discarded the rest, which meant three recoveries after one miss bought nothing at all.

Does the model grade harder than the deterministic scorer?

Different, not harder. Nine of the fourteen formats are scored on your device with no model involved: a multiple choice is right or wrong, a matching set is the fraction of rows you placed correctly, a re-ordering is scored by how many pairs are in the right relative order. Five formats need a model because the answer is prose. Those get a number from a judge, and that number is the one thing on this page we cannot show you the arithmetic for.

Can a score go down?

No. Within an exercise that offers a second try, rows you already got right are frozen, so a second attempt can only raise the mark. Across time, a score is never rewritten: each answer is stored with the score it was given, and the schedule is recomputed from that history rather than from a single running number.

Does taking a hint cost me the mark?

Not the mark you see. If you end up giving the right answer, the exercise reads 100%, because that question — did I get it right — has one honest answer. What the hint changes is what the scheduler concludes: an answer you reached with help is not evidence that you could reach it without help, and the attempt that already told the scheduler something was the unaided one, which you missed. So the point comes back soon rather than being treated as recalled.

Sources.

What each one is doing here, so you can tell which claim rests on which work. Every one of these is a published paper you can look up.

  • Ye, J., Su, J., & Cao, Y. (2022). A stochastic shortest path algorithm for optimizing spaced repetition scheduling. Proceedings of the 28th ACM SIGKDD Conference on Knowledge Discovery and Data Mining, 4381–4390.

    The primary paper behind the scheduler this page describes, deployed at scale on millions of review logs. Its optimisation goal is stated in the authors' own words — "to minimize the memorization cost for users to form long-term memory" — and their algorithm is named for it. So a scheduler of this family does not maximise how much you remember: it minimises how much reviewing it takes to hold a chosen retention target. That is why a grade here is a measurement and not a reward. It is also where the engine's notion of difficulty comes from, and that difficulty describes a memory state rather than how hard a question is.

  • Rowland, C. A. (2014). The effect of testing versus restudy on retention: A meta-analytic review of the testing effect. Psychological Bulletin, 140(6), 1432–1463.

    Why the formats where you produce the answer are not capped while the formats where you pick it are. The format of the initial test moderates how much the test helps: producing an answer beats recognising one. We cite it for that ordering only.

  • Kang, S. H. K., McDermott, K. B., & Roediger, H. L. (2007). Test format and corrective feedback modify the effect of testing on long-term retention. European Journal of Cognitive Psychology, 19(4–5), 528–558.

    The condition that decides which way the ordering runs, and the reason it runs our way: with corrective feedback a constructed answer beats a multiple choice, and without feedback it is the other way round. Ignia always returns feedback, which is what puts us in the first branch — and means the day a format stops explaining itself, its ranking flips.

  • Carlson, J. E., & von Davier, M. (2017). Item response theory. In R. E. Bennett & M. von Davier (Eds.), Advancing Human Assessment: The Methodological, Psychometric, and Policy Contributions of ETS (pp. 133–178). Springer. Open access.

    Where the name for what a session does to one point comes from, and where the consequence is reported. A set of items sharing one object is a testlet, and its answers are not independent. The chapter records what happens when that dependence is ignored: Wainer and Wang, on TOEFL data, found difficulty estimated well either way while discrimination and the guessing floor were biased; Bradlow, Wainer and Wang found the resulting precision bias to be a function of the bundle's design; Li and colleagues found little difference in the estimates and more in the information. That split — value robust, precision overstated — is why the evidence total is discounted and the grade is not. We name this review rather than the three studies because this is the text we read.

  • Pelánek, R. (2016). Applications of the Elo rating system in adaptive educational systems. Computers & Education, 98, 169–179.

    Where the shape of the discount comes from: an update weight that falls as the number of answers rises, fitted on real system data. We borrow the function and not the model — the model it belongs to needs a difficulty value per question, which we do not have, and a population of learners on the same items, which a private single-learner app cannot produce. The rate we use is therefore an imported constant, which is the limit stated on this page rather than hidden in it.

  • Wilson, R. C., Shenhav, A., Straccia, M., & Cohen, J. D. (2019). The eighty five percent rule for optimal learning. Nature Communications, 10, 4646.

    Here as the rule the app does NOT apply, because this is the page where you can see why. It is derived for two-choice tasks with continuously adjustable difficulty. The caps below exist precisely because 85% on a true-or-false and 85% on a typed answer are not the same evidence, so a single target success rate has nothing to attach to.

You will find effect sizes in these papers. We deliberately do not print them on this page: an average across studies does not predict what any one person will get, and a number quoted without its conditions reads as more precise than it is. In the papers they come with those conditions.

Related.

Why it is harder than it needs to be — the same caps, argued rather than tabulated. · Why the app makes you wait — what the interval is estimating in the first place. · Session engine — which exercises you are given, one level up from this page.