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 Kizuki needs it.
A concept is blocked while any concept it needs first (a confirmed link to a confirmed concept) has never had a clean session. /due lists blocked concepts with what they wait on. After an unclean session, Kizuki names those weak prerequisites (weakPrerequisites) as the likely reason.
Set an exam date with /exam 2026-12-15, or clear it with /exam none (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 three lists from the plans: due now (today or earlier), coming up, and blocked, each sorted by date. /due prints them for the current course, and Kizuki prints them at start. The line under the input shows how many concepts are due. /concepts shows "due now", "next …", or "waiting on what it needs" for each concept. Every 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.