- graders registry collected at boot from every HasGraders plugin,
manual first; a duplicate or reserved code fails boot
- grading job on queue quizzes_grading with three attempts; a stale
or reviewed answer is never touched; the last failure marks it failed
- learning answers enqueue at once, tests at close; a grade
recalculates a finished attempt and fires AnswerGradedEvent after
commit
- migration: open question type, rubric, max_length, quiz grader and
the grading and review columns of attempt answers
- open answers are checked, stored as pending and never scored on
answer; a changed text resets the grading state
- student JSON gains text, grading_status, grader_feedback,
review_comment, max_length, needs_review and open_answers; the
rubric is never serialized