Scoring exam readiness from spaced repetition

How we turned Leitner review boxes into a per-domain readiness score for CertBrain, why one weak domain blocks "ready", and the cramming bug we had to fix first.

Photo by Kelly Sikkema on Unsplash

CertBrain is a study app for the AWS Certified AI Practitioner exam, built on the Braineos codebase and now on Android. Every exam learner eventually asks the same thing: am I ready to book it? We’ve just shipped a Readiness page to help answer that. Here’s how the score works, and the bug it exposed.

Start from the data you already have

Every card a learner studies sits in a Leitner-style review box, with intervals of 0, 1, 3, 7, 14 and 30 days. A wrong answer drops it to box 0. Each right answer on a due card moves it up a box, and the gap until the next review grows. That box is already a decent signal of how well something has stuck, so we didn’t add any new tracking. Readiness is a pure function of the boxes.

Each card earns credit:

  • 0 if it’s unstudied or the last answer was wrong.
  • 0.5 if it was answered right recently (boxes 1–2).
  • 1 once it’s in box 3 or higher: recalled on schedule after 1-day and 3-day gaps, and now on a weekly review.

The half step matters. Without it, a learner who has done a lot of first-pass study sees almost nothing until a week later, which feels broken.

Weight what the exam weights

Two kinds of weighting go on top.

Cards. Exam-style multiple-choice questions count double compared with flashcards. They’re closer to what the exam actually asks.

Domains. CertBrain has one course per exam domain, and the exam guide gives each domain a share of the scored content. Rather than hard-code those percentages, the content importer reads them from the course pages and stores them on the course. The overall score is the weighted average of the domain scores. If any course is missing its weighting, every domain counts equally. A fair plain average beats a half-weighted one.

Because it’s all driven by course data and a site flag, the same code works for any Braineos site with a course per exam domain.

One weak domain blocks “ready”

An average hides things. A learner at 95% in four domains and 40% in the fifth can average well above 80%, and still lose a lot of points on exam day.

So “Ready to book” needs two things: at least 80% overall and at least 70% in every domain. Below that, the page names the domain that’s holding you back and lists its three weakest lessons. The page always ends with a next step, not just a number.

Two smaller guards:

  • A minimum of 10 studied cards before a score appears. Below that, a near-zero score is just noise, so the page sends people to the free diagnostic instead.
  • No pass prediction. We don’t yet have pass/fail outcomes to calibrate against, so the 80/70 thresholds are a starting point. The page says plainly that it’s a study guide, not an exam score or a guarantee of passing.

The bug readiness found

Building this, we noticed the boxes could lie. Studying a deck again with “Study anyway” moved every correct card up a box, even when it wasn’t due. One afternoon of cramming could push a card to box 5, a 30-day interval, without a single real gap.

For review scheduling that was a minor annoyance. For a readiness score it was a real problem, because cramming would read as mastery. The fix: a right answer on a card that isn’t due yet now leaves its box and due date alone. A wrong answer still resets it, because forgetting is real information whenever it happens.

That’s the lesson we keep relearning: a new feature that reads your data is a good audit of the code that writes it.

What’s next

Once there are real exam outcomes to compare against, we’ll tune the thresholds against them, not against intuition. Until then, the score stays honest about what it is.

CertBrain is an independent study resource. It isn’t affiliated with or endorsed by Amazon Web Services.

Planning an app?

Start a project