Review — Spaced Repetition and the Failure Log
Every item you got wrong resurfaces at 1, 3, 7, and 21 days. Nothing leaves the queue because time passed — only because you answered it correctly, cold, at the 21-day interval.
Table of Contents
Why This Exists
Two distinct problems, one mechanism.
The forgetting problem. Over 26 weeks you will encounter several hundred discrete facts, mechanisms, and mistakes. Without scheduled resurfacing, the ones you learned in month one are gone by month four, and you will not know which ones until an interview finds them for you.
The confident-wrong problem, which is worse. A gap you know about is a study item — it costs you an "I'd have to check," which is a perfectly survivable answer. A gap you are confident about is a landmine: you will assert it, be corrected, and pay far more than the admission would have cost. Confident-wrong items therefore enter at the front of the queue and get a shorter first interval.
The Queue
cd review
python3 review.py due # what is due today
python3 review.py add "asyncio.gather orphans siblings on failure" \
--source mock-04 --tag async --confident-wrong
python3 review.py drill # run today's queue interactively
python3 review.py done <id> --correct # advance to the next interval
python3 review.py done <id> --wrong # reset to the 1-day interval
python3 review.py stats # queue health and leech report
State lives in queue.json — plain JSON, hand-editable, committed with the rest of the repo
so your progress is part of the record.
What Goes In
| Source | What to capture |
|---|---|
| Diagnostic quiz | Every wrong answer. Confident-wrong ones flagged |
| Mock interviews | Everything in the "what I got wrong" table |
| Harness gates | Any gate that took more than two test runs, plus the reason |
| Track B predict-then-run | Every output you predicted incorrectly |
| Design critiques | Every failure mode I found that you had not named |
| Deep-dive drills | Every question you could not answer about your own code |
| Agentic runs | Every bad diff you accepted |
Capture the gap, not the symptom. This is the single most important discipline in the whole file:
| Symptom (useless) | Gap (actionable) |
|---|---|
"I forgot close() is idempotent" | "I don't test the second call of any lifecycle method" |
| "I said gather cancels siblings" | "I assume structured-concurrency semantics apply to pre-3.11 APIs" |
| "I ran out of time on the design" | "I spend 20 minutes on architecture because I draw before I've decided what's hard" |
| "I got the KV cache formula wrong" | "I don't have the 2 × layers × kv_heads × head_dim shape memorized" |
A symptom generates one flashcard. A gap generates a drill, and the drill fixes every future instance of it.
The Failure Log
failures.md — the narrative companion to the queue. One entry per meaningful failure.
## F-014 — 2026-08-12 — Mock 07, system design
**What happened:** deep-dived the API tier and the data model; never got to
lease expiry or split brain. Scored hire (senior), capped by the 2C rule.
**The actual gap:** I start drawing before I have decided which two components
are hard. Drawing feels like progress, so I do it first.
**The fix:** deep-dive-selection drill, daily. Read a prompt, name the two
hardest components in 60 seconds, before any diagram.
**Recurrence check (3 weeks later):** mock 10, named both hard components at
minute 3. Fixed.
The recurrence check is what makes this a log rather than a diary. An entry with no recurrence check after three weeks is an unverified fix, and unverified fixes tend not to be fixes.
The Weekly Review
Twenty minutes, same slot every week, non-negotiable.
- Run
python3 review.py dueand clear the queue. - Read every
failures.mdentry from the last 7 days. - Do the recurrence check on entries now 3+ weeks old. Mark fixed or re-open.
- Run
python3 review.py stats. Any item that has reset to the 1-day interval three or more times is a leech — it is not a memory problem, it is a comprehension problem. Stop drilling it and go re-learn the underlying mechanism from the experiment or the design note. - Update
../STATE.md.
Why 1, 3, 7, 21
Expanding intervals exploit the spacing effect — retention improves when reviews are spread out rather than massed — and the testing effect: retrieving an answer strengthens memory far more than re-reading it. That is why the drill mode asks before it shows.
The specific ladder is chosen for a 26-week program:
- 1 day — catches the failure before it consolidates as a wrong belief.
- 3 days — the first real retrieval test, after some forgetting has occurred. Forgetting a little before you retrieve is what makes the retrieval work.
- 7 days — a weekly cadence you will actually keep.
- 21 days — long enough that surviving it means the item has genuinely stuck, and short enough to fit several times into 26 weeks.
A wrong answer at any interval resets to 1 day. There is no partial credit, because a fact you half-remember under no pressure is a fact you will not have in an interview.
References
- Roediger, H. L. and Karpicke, J. D. Test-Enhanced Learning: Taking Memory Tests Improves Long-Term Retention. Psychological Science, 2006 — the testing effect
- Cepeda et al. Distributed Practice in Verbal Recall Tasks. Psychological Bulletin, 2006 — the spacing effect
- Brown, Roediger, McDaniel. Make It Stick: The Science of Successful Learning. Harvard, 2014
../mocks/README.md— the main feeder../diagnostics/RUBRIC.md— why confident-wrong is scored separately