Explain first.Assess with evidence.
A learning workflow should know what was taught before it decides what to assess. Explore the same synthetic task under four conditions.
See how a goal becomes a lesson.
Choose a fictional learning goal. Follow the required material, read a short explanation, try a task and see what the next session should do.
Authored examples with a fixed answer key. This browser exercise makes no model call and saves no learner data. The recorded Python checks below demonstrate the implementation's evidence and state rules.
Download both learning pathsSchedule a review
Both invented answers match the rubric. The result advances the review clock; the topic remains open.
Inspect the generated JSON
{
"data_classification": "synthetic",
"case": "success",
"outcome": "valid",
"score": 100.0,
"next_action": "schedule_review",
"state": {
"data_classification": "synthetic",
"last_srs_tick": 1,
"week_progress": 1,
"topic_gate": "open",
"srs_status": "strong",
"review_due_at_tick": 4,
"review_due_on_date": "2032-01-08",
"events": [
{
"check_id": "demo-check-addition",
"task_id": "demo-addition-task",
"score": 100.0,
"data_classification": "synthetic"
}
]
},
"replayed": false
}Consolidate the concept
An incorrect answer changes the next action. A valid assessment can still point back to practice.
Inspect the generated JSON
{
"data_classification": "synthetic",
"case": "mistake",
"outcome": "valid",
"score": 50.0,
"next_action": "consolidate",
"state": {
"data_classification": "synthetic",
"last_srs_tick": 1,
"week_progress": 0,
"topic_gate": "open",
"srs_status": "weak",
"review_due_at_tick": 2,
"review_due_on_date": "2032-01-06",
"events": [
{
"check_id": "demo-check-addition",
"task_id": "demo-addition-task",
"score": 50.0,
"data_classification": "synthetic"
}
]
},
"replayed": false
}Withhold the grade
The instruction reference is removed. This is a sequence error, so the learner receives no failing grade.
Inspect the generated JSON
{
"data_classification": "synthetic",
"case": "missing-evidence",
"outcome": "system_sequence_error",
"score": null,
"next_action": "provide_missing_instruction",
"state": {
"data_classification": "synthetic",
"last_srs_tick": 0,
"week_progress": 0,
"topic_gate": "open",
"srs_status": "unrated",
"review_due_at_tick": null,
"review_due_on_date": null,
"events": []
},
"replayed": false
}Count it once
Running the same case again reuses its canonical result. The review clock and success count stay unchanged.
Inspect the generated JSON
{
"data_classification": "synthetic",
"case": "success",
"outcome": "valid",
"score": 100.0,
"next_action": "schedule_review",
"state": {
"data_classification": "synthetic",
"last_srs_tick": 1,
"week_progress": 1,
"topic_gate": "open",
"srs_status": "strong",
"review_due_at_tick": 4,
"review_due_on_date": "2032-01-08",
"events": [
{
"check_id": "demo-check-addition",
"task_id": "demo-addition-task",
"score": 100.0,
"data_classification": "synthetic"
}
]
},
"replayed": true
}These are fixed arithmetic fixtures generated by the Python demo. The browser switches between recorded outputs; it does not run an AI tutor or measure learning effectiveness.