
❌ This issue is not open for contribution. Visit Contributing guidelines to learn about the contributing process and how to find suitable issues.

Overview
An ExerciseNode with no m/n fails validation and is left out of the channel. This covers the constructor default, {"mastery_model": M_OF_N} alone, and CSV exercises with blank M/N columns. The defaults that v0.7.3 filled in are applied only after validation has already failed. m=None crashes the run.
Complexity: Low
Target branch: main
Context
The Change
m/n should be defaulted, as in v0.7.3, before validation checks them. Values that can't be converted to an integer should fail the node, not the run.
How to Get There
Build ExerciseNode(source_id="e", title="E", license=licenses.CC_BY, questions=[q]) with no exercise_data and call process_files().
Acceptance Criteria
AI usage
I directed the regression hunt and decided which behaviour changes were intended; Claude Code compared v0.7.3 against main, reproduced each regression with scripts, and drafted this issue.
❌ This issue is not open for contribution. Visit Contributing guidelines to learn about the contributing process and how to find suitable issues.
Overview
An
ExerciseNodewith nom/nfails validation and is left out of the channel. This covers the constructor default,{"mastery_model": M_OF_N}alone, and CSV exercises with blank M/N columns. The defaults that v0.7.3 filled in are applied only after validation has already failed.m=Nonecrashes the run.Complexity: Low
Target branch: main
Context
nodes.py:1137-1159checks for"m"/"n"before callingprocess_exercise_data()(nodes.py:1093-1108), which is what fills in the defaults.m=None,int(None)raisesTypeError, which is not caught.tests/testchannels/csv_channel_with_exercisesloses 4 of its 5 exercises.The Change
m/nshould be defaulted, as in v0.7.3, before validation checks them. Values that can't be converted to an integer should fail the node, not the run.How to Get There
Build
ExerciseNode(source_id="e", title="E", license=licenses.CC_BY, questions=[q])with noexercise_dataand callprocess_files().Acceptance Criteria
csv_channel_with_exercisesuploads all 5 exercises.exercise_datauploads withm = n = min(5, questions), minimum 1.muploads withn = m, and the reverse.m=Noneor a non-numericmfails that node, and the run continues.AI usage
I directed the regression hunt and decided which behaviour changes were intended; Claude Code compared v0.7.3 against main, reproduced each regression with scripts, and drafted this issue.