* fix(generation): enforce quiz option value/label contract
When a model puts choice content in value and a bare A-Z letter in label,
swap those fields so persisted quiz options keep a letter as the selection
identity and the content as the label. Correct objects, plain strings, and
answer-key normalization stay as they were.
Closes#1375
* fix(generation): rewrite swapped quiz letter keys to option values
When a bare label is moved onto the option value, a raw answer token that
exactly equals that original label is rewritten to the uppercased letter
before exact alignment. The stored key is then the letter QuizView submits,
so that submission grades correct. A stored "a" on an already-correct
value "A" is left unresolved.
Closes#1375
* fix(generation): reject invalid quiz option shapes instead of swapping
Stop rewriting quiz options when a model puts content in value and a
letter in label. The quiz prompt now requires value to be one ASCII
letter A-Z and label to be the option content. A choice question that
still breaks that contract, or whose answer does not name an option
value, is invalid model output and regenerates.
Closes#1375
---------
Co-authored-by: wyuc <wang-yc24@mails.tsinghua.edu.cn>