UniPrepSource & verification ↗
Learning systems / evidence & state

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 paths
01Instruction reference
02Task contract
03Assessment validity
04Next learning step
Explore the behavior · synthetic fixtures

Schedule a review

Both invented answers match the rubric. The result advances the review clock; the topic remains open.

Download this result →

Score100 / 100
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.

Download this result →

Score50 / 100
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.

Download this result →

Evidence gateNo 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.

Download this result →

After replay1 event
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.