What We Built
NumPath maintains a KCState for every student × Knowledge Component pair. After every attempt, update_bkt() revises the probability that the student has mastered that KC. That probability — p_mastery — is what the adaptive engine reads to pick the next problem and what the teacher dashboard displays as a progress bar.
The entire model is 37 lines. Here it is unabridged.
from dataclasses import dataclass
MASTERY_THRESHOLD = 0.80








