
❌ This issue is not open for contribution. Visit Contributing guidelines to learn about the contributing process and how to find suitable issues.

Overview
Run the one-time global backfill converting every legacy AssessmentItem to type='QTI' + raw_data XML via #6's conversion, then remove the API-layer dual-read.
Complexity: Medium
Target branch: unstable
Context
The Change
Acceptance Criteria
AI usage
Architecture decided with the maintainer across an iterative session: blanket QTI type with the item XML in raw_data; XSD-authoritative validation across all sources; a legacy→QTI global migration with an API-layer dual-read; ricecooker upload delegating to the AssessmentItem serializer; and a Perseus custom-interaction contract confirmed against the QTI 3.0 specification. Claude mapped the existing publish/validation/ricecooker code, proposed the breakdown, and drafted each issue; the maintainer steered every decision and reviewed throughout.
❌ This issue is not open for contribution. Visit Contributing guidelines to learn about the contributing process and how to find suitable issues.
Overview
Run the one-time global backfill converting every legacy
AssessmentItemtotype='QTI'+raw_dataXML via #6's conversion, then remove the API-layer dual-read.Complexity: Medium
Target branch: unstable
Context
The Change
type='QTI'+raw_dataXML via the resolves merge conflict that i allowed in... #6 conversion.perseus_questionrows untouched.Acceptance Criteria
type='QTI'withraw_dataXML; onlyperseus_questionrows remain unconvertedAI usage