Kizuki brings a concept back for review on a schedule that grows while your sessions on it stay clean. planReviews works it out in plain code, with no model, from the logs every time a page loads.
A concept is blocked while any concept it needs first (a confirmed link to a confirmed concept) has never had a clean session. The Today page lists blocked concepts with what they wait on. After an unclean session, the session page names those weak prerequisites (weakPrerequisites) and suggests teaching them first.
Set an exam date on a course page (setExamDate). While the exam is today or later, a review that would fall after the day before the exam moves to the day before the exam, or to today if that day has passed.
Sessions on a concept that was later merged count toward the concept it was merged into (reviewPlans follows merges with resolveConceptId).
todayView builds the Today page's three lists from the plans: due now (today or earlier), coming up, and blocked, each sorted by date. The concept page shows "Due now.", "Next review …", or "Waiting on …", and the streak. A clean session's result says when the concept comes back.
Each plan (ReviewPlan) holds the due date, the status, the streak, the current wait in days, and what blocks it.