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.
startSessionAction calls startSession, which refuses a concept you have not confirmed and an empty explanation, and records session.started.The session page shows where the session is with SessionStatus: thinking, answering, reviewing, ended, or failed. While Kizuki is thinking, the page reloads itself. If a session stays in thinking for more than two minutes, the page offers "Restart it", which starts a new run that skips finished steps. On the concept page, "Stop it and start over" marks an open session as stopped.
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 | On the page | 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. The page 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. A "Does this fit?" question also needs one of three choices:
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, the page 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 (recordCatch). The Today and History pages count catches per week, against a goal of one a week.