Skip to content

[QTI] Dual-publish Perseus zips for choice/text-entry (math input only) QTI items #6001

Closed

Description

@rtibbles

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

Overview

Derive a Perseus archive from QTI items whose interaction type Perseus can express (single/multiple choice, text/math input), published alongside the QTI package so older Kolibri still renders the content.

Complexity: High
Target branch: unstable

Context

  • Older Kolibri renders Perseus; newer renders QTI. The authored source of truth is QTI XML in raw_data.
  • PerseusExerciseGenerator builds Perseus from structured question/answers, which native QTI items no longer carry.
  • The pydantic models can read the choice/text-entry subset. Advanced interaction types have no Perseus equivalent.

The Change

  • For QTI items mapping to a Perseus question type, derive the structured form from the QTI XML and produce a Perseus archive in addition to the QTI package.
  • Publish QTI only for nodes containing any interaction with no Perseus equivalent — never a partial or invalid Perseus.

Acceptance Criteria

  • A node of choice/text-input QTI items publishes both a QTI package and a Perseus archive
  • The derived Perseus matches the QTI item: prompt, choices, correct answers
  • Hints in kolibri:hint catalog cards are derived back into Perseus hints ([QTI] Carry legacy hints into generated QTI items as dormant catalog content #6011 contract)
  • Nodes containing any non-Perseus-expressible interaction publish QTI only
  • Older Kolibri (Perseus) and newer Kolibri (QTI) each render the node
  • Tests cover single-choice derivation
  • Tests cover multiple-choice derivation
  • Tests cover text/math input derivation
  • Tests cover hint derivation
  • Tests cover the QTI-only fallback

References

  • contentcuration/contentcuration/utils/assessment/perseus.py

AI usage

Claude mapped the existing publish/validation/ricecooker code, proposed the issue breakdown, and drafted each issue; the maintainer steered every decision and reviewed throughout.

Activity

  1. added theissue type on Jun 28, 2026
  2. rtibblesbot commented on Jul 9, 2026

    @rtibblesbot
    Contributor

    Plan: When every assessment item on a node is a native QTI item whose interaction Perseus can express (single/multiple choice, text/math input), publish a Perseus archive in addition to the QTI package, so older Kolibri renders the node; otherwise publish QTI only.

    • QTI HTML/MathML → Perseus markdown converter
    • Derive structured Perseus data from a native QTI item
    • PerseusExerciseGenerator renders native QTI items via the deriver
    • Publish both archives for derivable nodes; QTI-only fallback

    @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
  3. rtibblesbot commented on Jul 10, 2026

    @rtibblesbot
    Contributor

    The bot has been waiting for a response for 2 hour(s). It will resume automatically when someone replies.

  4. rtibblesbot commented on Jul 10, 2026

    @rtibblesbot
    Contributor

    The bot has been waiting for a response for 2 hour(s). It will resume automatically when someone replies.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions