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

Overview
During a short transition window, the AssessmentItem API endpoint converts legacy items to QTI on read — via the reusable conversion (#6003) — so the frontend only ever receives QTI and needs no backward-compatibility handling. The one-time global backfill that makes this permanent and removes the dual-read is #6007.
Complexity: Medium
Target branch: unstable
Context
The Change
Acceptance Criteria
References
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
During a short transition window, the
AssessmentItemAPI endpoint converts legacy items to QTI on read — via the reusable conversion (#6003) — so the frontend only ever receives QTI and needs no backward-compatibility handling. The one-time global backfill that makes this permanent and removes the dual-read is #6007.Complexity: Medium
Target branch: unstable
Context
perseus_questionitems as raw Perseus — out of scope here; handled by mixed publishing ([QTI] Publish mixed Perseus + QTI exercises as one QTI package #6006).The Change
AssessmentItemendpoint returns QTI (type='QTI',raw_dataXML) for a still-legacy row by converting it via [QTI] Reusable legacy→QTI assessment-item conversion utility #6003.perseus_questionrows through unchanged.Acceptance Criteria
perseus_questionrows are returned unchangedReferences
AI usage