Vademecum GitHub

ADR 0031 — A learner model behind the Improvement Map, and what to study next

Context

By the end of phase one, Vademecum recorded plenty about the learner: board answers, flashcard answers, Socratic sessions and the gaps they named, pages read, open flags, and exam-report areas. Each feature used its own slice of that. The flashcard draw weighted flagged topics. "Strong and weak" added up signals. The Tutor shuffled every question equally. Nothing combined the record into a picture of what the learner knows and what is fading, and nothing used that picture to decide what comes next.

The project exists for the few spare minutes of a clinical day. Those minutes are best spent where they help most. The learning science on that is consistent:

Decision

One model, recomputed, never stored

storage/learner.py treats every current encyclopedia page as a unit of knowledge. So is any flagged topic or exam area that no page covers yet; its only step is to add a source. A flag or an exam area finds its page the way the map does (pages_matching). Board answers, flashcards and Socratic sessions carry their page directly.

The model is recomputed from records that already sync. There is no new table, no migration and no new sync rule, and the Mac and the phone always agree. It runs in tens of milliseconds on the owner's 680 pages.

Two estimates per unit

  1. How well it is understood. A Beta(1, 1) prior updated by every outcome: - board answers (weight 1.0); - flashcards (0.5, a narrower cue); - Socratic sessions (1.5, because they ask for explanation; each named gap takes a fifth off the outcome); - open flags (0.75 each, at most three, as an outcome of 0); - exam-report areas (2.0, with below, at and above taken as 0.2, 0.6 and 0.9).

Each item's weight halves every 60 days of age, so what you did recently counts more than what you did last spring. Confidence is the effective amount of evidence n, as n / (n + 3). This is a simplified knowledge-tracing estimate; with so little data a fuller model would only be guessing its own parameters. 2. How well it is holding now. A forgetting curve, recall = 2^(−days / h), in the spirit of half-life regression. h is 2.5 days after a first retrieval, so one right answer reads as holding for about a day, like a new flashcard's first gap. It is then replayed from the retrievals in order: - a success multiplies h by 1 + 1.5 × min(1, gap / h), at least 1.1, so retrieval spaced out to about the half-life gains the most and massed repetition gains little; - a failure (an outcome below 0.4) halves h, down to a floor of half a day; - an outcome in between, such as a Socratic session naming three gaps, leaves h where it was.

Reading a page is study, not retrieval. It is recorded, and it decides whether "read it first" is still the right step, but it does not move the curve.

A state, a need and a step

Each unit gets a state:

State Meaning
Not yet tried Never retrieved
Still forming Understood below 0.6
Fading Understood, but recall now below 0.75
Holding Understood and recall now at or above 0.75

Need is how much the next ten minutes would help. It is computed as (1 − understood × recall) × importance, plus a little for exploring what is barely known:

The step is chosen for the state, and each comes with its reason in a sentence:

Situation Step
Untried and unread Read the page, then test yourself (encoding before retrieval)
Untried and read Board questions or flashcards (the testing effect)
Forming after misses Talk it through with the Socratic tutor (self-explanation)
Fading Flashcards, else a board question (spacing: retrieve just as it fades)
Holding An occasional board question mixed in with other topics
No page Add a source

The plan takes the five units with the most need, at most one of them a gap with no page. It orders them so that no two steps in a row share a specialty where another is available (interleaving).

Where it is used

What it does not do

Product rules, AGENTS.md:

Consequences

References