WR-02: Confirm and SetScore answer ErrAttemptOpen (409 attempt_open,
an admin refusal) for an answer of a running test, ConfirmBulk skips
such attempts, and the default open queue leaves them out, so
AnswerReviewed never fires before the test ends.
WR-01: a deterministic server-side guard behind the grader's prompt.
storeGrade drops feedback sharing a run of six words with the rubric
(runs also in the question or model answer do not count) and notes it
for the owner in grading_error.
- SetScore (0..points in 0.5 steps, comment shown to the student),
ConfirmBulk per quiz or attempt and Regrade through the quiz's grader
- close() announces an attempt reviewed while it was open
- quizzes_review_set_score, quizzes_review_confirm_bulk,
quizzes_review_regrade; 409 already_reviewed and grader_manual
- classes/review.go: review queue, detail and Confirm, shared by MCP and
the admin screen; AnswerReviewed and AttemptReviewed after commit
- /api/v1/quiz-reviews routes behind the quizzes permission
- quizzes_review_list, quizzes_review_show, quizzes_review_confirm