You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[QTI] Publish raw_data QTI assessment items as QTI/IMSCP packages #6000
Publish exercise nodes of authored QTI by packaging the stored item XML into a QTI/IMS content package, rather than rebuilding it from structured fields.
Complexity: High Target branch: unstable
Context
Today QTI is chosen only when a node has a free_response question; QTIExerciseGenerator (contentcuration/contentcuration/utils/assessment/qti/archive.py) builds item XML from structured fields and writes imsmanifest.xml + the zip.
Native QTI items already hold their full XML in raw_data.
Items reference media; dependencies must be collected from the XML (existing LocalSrcPath / get_file_dependencies mechanics).
The Change
Route nodes whose items are all QTI (no perseus_question) to QTI packaging.
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.
Plan: When a node's assessment items are natively-authored QTI (AssessmentItem.type == exercises.QTI, XML stored in raw_data), publish packages that XML verbatim into the QTI/IMSCP zip instead of rebuilding it from structured fields, and route nodes to QTI packaging based on the absence of perseus_question items rather than the presence of free_response.
Extract a shared QTI media-reference scanner
Refactor QTIExerciseGenerator to a generator-agnostic resource list
Package native type=QTI items from raw_data verbatim
Route nodes without perseus_question items to QTI packaging
@rtibblesbot's comments are generated by an LLM, and should be evaluated accordingly
How was this generated?
Implemented code following the pre-approved plan using test-driven development (red-green-refactor)
Ran the project's full test suite and linter before committing
For UI changes: captured live screenshots to verify rendering
For backend changes: verified with example API/CLI output
Activity
rtibblesbot commentedon Jul 3, 2026
Plan: When a node's assessment items are natively-authored QTI (
AssessmentItem.type == exercises.QTI, XML stored inraw_data), publish packages that XML verbatim into the QTI/IMSCP zip instead of rebuilding it from structured fields, and route nodes to QTI packaging based on the absence ofperseus_questionitems rather than the presence offree_response.QTIExerciseGeneratorto a generator-agnostic resource listtype=QTIitems fromraw_dataverbatimperseus_questionitems to QTI packaging@rtibblesbot's comments are generated by an LLM, and should be evaluated accordingly
How was this generated?
rtibblesbot commentedon Jul 3, 2026
I was unable to complete this task after multiple attempts. Manual review and intervention may be needed.