The feature with the largest effect size in the Dartmouth pilot is the one no startup would put on a landing page. Not the AI grader. Not the chatbot. Cumulative module reviews: a big quiz covering every lesson, questions interleaved across topics, a 90% bar, unlimited retries. Students who passed all three scored 7.1 points higher on the final (d = 0.66), the strongest signal in the study. It looks like a quiz from 2005.
This is post 6 of the assessment-first series, and it assembles the pieces from posts 2 through 5 into a running web app — doerkit. Lessons, quizzes, and that unglamorous review engine, which is the part worth dwelling on.
Why interleaving beats blocked practice
A lesson quiz tests one topic while it’s fresh — you just read about the median, then answer about the median. That’s “blocked” practice, and it produces a specific illusion: fluency inside the current topic that evaporates when topics are mixed. The student feels like they know it because the context is doing half the retrieval.
A cumulative review mixes topics. Question 3 is about outliers, question 4 is about z-scores, question 5 is back to sampling. Now each question forces the harder move (which concept does this even call for) before you can answer it. Interleaved retrieval practice is one of the most replicated findings in learning science, and it consistently loses on the in-session feeling of mastery while winning on the exam weeks later. That gap between how it feels and how it works is exactly why it doesn’t sell, and exactly why it’s the feature that moved scores.
doerkit’s review builds a 10-question quiz by taking at most two questions per lesson across the whole module, so no student sees a topic-blocked run:
export function pickReviewQuiz(banks: QuestionBank[]): QuizQuestion[] {
const perLesson = banks.map((b) => pick(b.questions, 2));
return pick(perLesson.flat(), REVIEW_QUIZ_SIZE); // interleaved by construction
}
Spacing, and the nudge
The other half of the effect was timing. The Dartmouth retry logs showed students returning to reviews a median of ~1.5 days apart, spaced retrieval rather than cramming, and that spacing wasn’t designed, it emerged from a high pass bar plus unlimited retries. A 90% threshold you’ll rarely clear on the first try, with no penalty for coming back, quietly manufactures the exact study schedule the research recommends.
doerkit makes the nudge explicit. Retry within 20 hours of your last review attempt and it says so: “Retrieval sticks better with a gap; coming back in about 14h beats retrying now (you can retry anyway).” It never blocks the retry. The whole design principle from post 1 holds: the platform succeeds only when students choose to come back, so it persuades rather than gates. Manufacturing a good habit out of a pass threshold and a soft nudge is cheaper and more durable than any streak mechanic.
The stack, deliberately small
The whole app is Hono plus SQLite, server-rendered HTML, no client framework. Lessons are markdown authored from OpenStax OER. Quizzes draw from per-lesson banks of ten. The grading engine from post 2 grades written answers concurrently; multiple choice is a pure function. Content is never gated — you can read any lesson and take any quiz in any order, because the Dartmouth platform wasn’t gated and hit 90% voluntary adoption.
What’s deliberately absent is the tell. No LMS integration, no SSO, no multi-tenancy, no student roster, no RAG chatbot. Those are the features that make edtech an 18-month enterprise sale, and none of them touch the thing that moves exam scores. The scope is frozen to exactly what the evidence supports: read, write an answer, get judged, come back spaced. A pilot instructor can run this on a laptop the afternoon they find it.
Applying the pattern past statistics
The review engine is subject-agnostic. Any course with lessons and question banks gets interleaving for free — the scheduler just needs topics to mix and a pass bar high enough to invite a second visit. Language vocabulary, medical board prep, onboarding curricula: the same two knobs (interleave across units, set a threshold that manufactures spacing) transfer directly. The AI grader is what makes the written half economical; the review engine is what makes any of it stick. You need both, and only one of them is exciting.
Where this breaks
The spacing nudge is honest but toothless by design; a determined crammer ignores it, and without course credit attached (the Dartmouth quizzes were ungraded) the population that most needs spacing is the least likely to self-impose it. The interleaving is within-module only; true long-horizon spacing across a whole term needs scheduling state this version doesn’t keep. And the biggest honest caveat carries over from the study itself: the all-reviews-passed group was also the most self-selected, so some of that d = 0.66 is motivated students being motivated. The within-module comparison (passing the review predicted a 6.1-point midterm gain holding cohort fixed) is the cleaner evidence, and it’s smaller. Real, but smaller.
Next post — the last one — is the capstone: run it yourself, what a real institutional deployment would still need, and where this whole assessment-first bet does and doesn’t hold.