In a session you explain a confirmed concept without notes. Kizuki plays a curious student: it asks about what does not match your material, what you left out, and vague words you used. Every question about the material quotes it.
/teach osmosis starts a session on a confirmed concept. /teach alone picks the first concept due in the course and names it.session.started.continueSession moves a session to the next point where it waits for you, and answerRound saves a round's answers and moves on. Where a session stands comes from SessionStatus: thinking, answering, reviewing, ended, or failed. If you quit in the middle, /teach on the same concept asks whether to pick it up where you left off or stop it and start over. A model error marks the session failed, and Kizuki prints the message and asks you to start a new one.
After a session with misses, Kizuki asks "Explain it again now, from memory?" Yes starts another try at the same concept, again with the material hidden. startRetry records it as a new session that points back at the first try. Kizuki offers tries until one comes back clean or you say no, at most MAX_TRIES tries counting the first.
Only the first try sets the schedule. A first try with misses brings the concept back the next day, even if a later try in the same sitting is clean. Later tries are practice: they show in /history as "another try" and never make the next review later.
For each round, Kizuki gathers:
S1, S2, and so on;TEACH_SYSTEM tells the model to compare the details you wrote with the material first (places, numbers, names, directions, causes, and results), then look for missing ideas, then vague words, and to ask at most MAX_QUESTIONS questions.
The model replies in the shape teachReplySchema: for each question a kind, a sentence label, and words copied from what you wrote. It never writes the question. renderQuestion writes it from a fixed template:
| Kind | Meaning | Template |
|---|---|---|
| contradiction | Does this fit? | Page 4 of ch1.pdf says: “…” You wrote: “…”. How does that fit? The "You wrote" part appears only when those words pass the check against your own text; otherwise it ends How does that fit with what you said? |
| gap | Something you left out | Page 4 of ch1.pdf says: “…” Where does that fit in your explanation? |
| unclear | Say more | What do you mean by “…”? |
validateTeachReply is the guard. A contradiction or gap question survives only if its label points at a real sentence that passes the quote check. An unclear question survives only if its words appear word for word in your own explanation and answers, in at most 6 words. An unclear question that points at a sentence but not at your words becomes a gap question. It drops questions that repeat an earlier one and questions that quote text you corrected, and keeps at most MAX_QUESTIONS. Kizuki says how many questions were dropped.
If search found nothing for what you wrote and no question survived, the round says "Not in your material" and Kizuki asks nothing. With no passages at all, askQuestions returns that answer without asking the model.
For each question you can write an answer; Enter with nothing typed skips it. A "Does this fit?" question first shows a pick list of three choices, and recordAnswers refuses a round where one has no choice:
askMisses builds the list in two parts, using only the concept's own passages, so points from other topics never appear:
validateMisses keeps only real sentences that pass the quote check, drops repeats and sentences you corrected, and keeps at most MAX_MISSES. You tick the ones you missed; only those count.
After an unclean session, Kizuki names the concepts this one needs first that have no clean session yet (weakPrerequisites), as the likely reason. You can also record a catch, something Kizuki caught that you would have gotten wrong on an exam: /catch <note> saves it for the last session that ended (recordCatch). /history counts catches over the last 8 weeks.