[QTI] Editing a question keeps the interaction attributes the editor doesn't set
Maintainers usually reply within 1 day
@rtibblesbot is already working on this.
Since Oct 5, 2026.
Assessment
This issue has not been assessed yet.
Description
❌ This issue is not open for contribution. Visit Contributing guidelines to learn about the contributing process and how to find suitable issues.
Target branch: unstable
Observed behavior
The first edit to a QTI question rewrites its interaction element with only the attributes its builder sets. Any other attribute is dropped.
- Text entry:
buildTextEntryInteractionXMLwrites onlyresponse-identifierandexpected-length. - Every legacy input question converted by
convert.pycarriesplaceholder-text="Enter your answer here", which is lost. - Choice: the builder drops
class, soclass="qti-labels-upper-alpha"is lost.
Errors and logs
None.
Expected behavior
An edit keeps every attribute on the interaction element that the editor doesn't set.
User-facing consequences
Learners see a question that differs from the one uploaded, e.g. an answer field without its placeholder, or choices without their labels.
Steps to reproduce
- Open an exercise with a legacy input question that was converted to QTI.
- Click Edit and change a hint.
- Inspect the emitted
raw_data:<qti-text-entry-interaction>has noplaceholder-text.
Acceptance Criteria
- Editing a converted text entry question keeps
placeholder-text. - Editing a choice question keeps a
classon<qti-choice-interaction>. - Tests cover both cases through parse, build and assemble.
AI usage
Claude Code found this while reviewing the #6225 branch and drafted this issue. Both losses were reproduced under Jest by parsing an item, rebuilding it with its descriptor and assembling it.
- Dominant language
- Python
- Stars
- 191
- Forks
- 308
- Avg merge
- 2d 14h
- Merged PRs (30d)
- 57
Getting set up
- Ships a Dockerfile or Docker Compose file
- No pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from learningequality/studio
-
DEV: frontend P3 - low
Difficulty 2/5 1-3 hours Newbie friendliness 74/100
learningequality/studio#5868 ·
Maintainers usually reply within 1 day
-
TAG: tech update / debt
Difficulty 2/5 1-3 hours Newbie friendliness 62/100
learningequality/studio#2245 ·
Maintainers usually reply within 1 day
-
DEV: frontend
Difficulty 3/5 1-2 days Newbie friendliness 45/100
learningequality/studio#6296 ·
Maintainers usually reply within 1 day
-
bug DEV: backend
Difficulty 3/5 Half a day Newbie friendliness 35/100
learningequality/studio#6294 ·
Maintainers usually reply within 1 day
-
DEV: frontend P1 - important TAG: a11y
Difficulty 2/5 1-3 hours Newbie friendliness 28/100
learningequality/studio#6292 ·
Maintainers usually reply within 1 day
All issues in learningequality/studio
Similar issues
-
Harmony OPeNDAP SubSetter (HOSS) Geographic LARC_CLOUD PREFIRE_SAT2_AUX-SAT R01 production
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
nasa/harmony-autotester#245 ·
-
feature
Difficulty 2/5 1-3 hours Newbie friendliness 66/100
-
L: github:actions L: php:composer
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
dependabot/dependabot-core#16493 ·
Maintainers usually reply within 1 day
-
Difficulty 1/5 Under an hour Newbie friendliness 92/100
DataTalksClub/machine-learning-zoomcamp#730 ·
Maintainers usually reply within 2 days
-
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
Maintainers usually reply within 4 days