Three outcomes, one taxonomy.
Each submission is parsed into a structured schema: the mark scheme's criteria on one side, the student's step-by-step working on the other, validated before classification begins.
Intake Parsing & Schema Validation
Pre-classification validation pipeline
Official Mark-Scheme Criteria
Discrete assessment criteria decomposed into method targets, dependency chains, and accuracy boundaries (M-type, A-type, B-type milestones).
MarkScheme(criteria=[...]) # classifier/schema.pyStudent Step-by-Step Working
Linear line-by-line script transcription mapped to logical units, isolating isolated transformations, notation, and substitution chains.
StudentStep(step_index=1, content="3x=12") # classifier/schema.pyCriterion M1 satisfied: isolates variable x via inverse operations
2x + 7 = 19 –> 2x = 12 –> x = 6
Method criterion matched; algebraic step preserved without deviation.
Criterion M1 satisfied: applies valid quadratic formula substitution
x = (-(-4) ± √((-4)² – 4(1)(3))) / 2(1) –> x = (4 ± √(16 – 12)) / 2 –> writes 4 ± 4 / 2
Methodology verified valid. Calculation error flagged at root extraction; downstream accuracy withheld.
Criterion B1 required: identifies angle sum in parallel transversals
Assumes alternate angles sum to 180° rather than being equal; writes 3x + 45 = 180
Core geometric postulate violated. No mark-scheme branch matches working.