The middle tier of #98, planned end to end. Two rules govern everything below:
- Pedagogically correct: every primitive is grounded in a named, evidence-based learning pattern (citation in the vocabulary table) — UI convenience alone never adds a word.
- Implementation is prover-gated: a primitive merges only when a real registry kind composes through it (labels are earned). The exhaustive vocabulary is spec'd up front; code lands prover by prover.
Exhaustiveness test: all 16 registry kinds must decompose into the vocabulary. They do (table below) — a kind that can't decompose means a missing word, not a forced fit.
The vocabulary
Atoms — content & encoding support (never interactive, no verdicts)
| Primitive |
Params |
Pedagogy |
Prover |
Text |
markdown (basic catalog) |
— |
shipped (basic) |
Callout |
intent, label, text |
emphasis/admonition (DITA taxonomy) |
✅ shipped |
Content |
src, mediaType, transcript, caption |
dual coding (Paivio; Dunlosky et al. 2013) |
narrated-card |
Term |
label, definition, revealMode |
vocabulary anchoring |
flashcard fronts; glossary future |
Example |
content, fadeSteps |
worked examples + fading (Sweller; Ge et al. 2012) |
step-reveal spec upgrade (own issue) |
Source |
passage, attribution |
evidence-grounded argument (cite-the-text) |
defend-claim, draft-meter passages |
Molecules — behavior, policy-parameterized
| Primitive |
Params |
Pedagogy |
Verdict |
Prover |
Sequence |
order, disclosure, revealed (+later: branching, spacing/interleave schedule) |
scaffolded progression; interleaving (Rohrer) |
inherits |
✅ shipped |
Reveal |
faces (+later: trigger click|prerequisite, hint-ladder) |
retrieval structure; hint escalation |
none |
✅ shipped |
Check |
prompt, responseType, feedbackMode, confidence? |
formative retrieval practice (Roediger & Karpicke); calibration |
formative — never transcript |
low-stakes uses of assessing kinds |
Response |
type (choice|text|extended-text|numeric|expression|match|order|hotspot|drawing), cardinality, scoring (pre-authored) |
assessment; collapses QTI 3.0's ~20 interactions |
summative — declared |
drag-sort (order), drag-categorize (match), swiper-flashcard (choice), timeline-builder (order), draft-meter (extended-text via a2learn.score), draw-the-curve (drawing), crossword (gap-text) |
Elaboration |
prompt, targetConcept, support |
self-explanation / elaborative interrogation (Chi; ICAP Constructive) |
optional rubric |
find-the-flaw's diagnose-why; step-reveal upgrade |
Interaction |
tool, constraints, feedback |
discovery/manipulatives (ICAP Active→Constructive) |
none by design |
fraction-area-model |
Dialogue |
turns policy, role, closure |
ICAP Interactive — deepest tier |
via embedded Check/Response |
debate-ai, writing-workshop |
Reflection |
prompt, scale/goal |
metacognition/SRL (Zimmerman) |
never |
no prover yet — waits for one |
Full decomposition of the registry (the exhaustiveness proof): markdown-card=Text+Callout ✅ · flashcard=Sequence+Reveal ✅ · step-reveal=Sequence(gated)+Callout ✅ · narrated-card=Sequence+Content · swiper-flashcard=Sequence+Response(choice) · drag-sort=Response(order) · drag-categorize=Response(match) · timeline-builder=Response(order,time) · crossword=Response(gap-text) · fraction-area-model=Interaction · draw-the-curve=Response(drawing)+Check · draft-meter=Source?+Response(extended-text) · find-the-flaw=Sequence+Response(choice)+Elaboration · defend-claim=Source+Response(extended-text)+Elaboration · debate-ai=Dialogue · writing-workshop=Dialogue+Response(extended-text)
Cross-cutting contracts: assessmentType: summative|formative forced by schema wherever a verdict exists (invariant 3 as schema, not convention); scoring pre-authored, never model-generated at render time; anonymous ids only in any event payload (invariant 2); ICAP tier as planner-guidance metadata on every primitive (not schema).
Phases
Ordering rationale: verdict-free before verdict-carrying (contract risk isolated to phase 3), provers-in-hand before spec-only, formalization last so the catalog freezes after the vocabulary has been exercised, not before.
Relations: the vocabulary lives under #98; verdict semantics join at #99; phase 6 un-drafts #74. Research base in #98 (comment).
🤖 Generated with Claude Code
The middle tier of #98, planned end to end. Two rules govern everything below:
Exhaustiveness test: all 16 registry kinds must decompose into the vocabulary. They do (table below) — a kind that can't decompose means a missing word, not a forced fit.
The vocabulary
Atoms — content & encoding support (never interactive, no verdicts)
TextCalloutContentTermExampleSourceMolecules — behavior, policy-parameterized
SequenceRevealCheckResponseElaborationInteractionDialogueReflectionFull decomposition of the registry (the exhaustiveness proof): markdown-card=Text+Callout ✅ · flashcard=Sequence+Reveal ✅ · step-reveal=Sequence(gated)+Callout ✅ · narrated-card=Sequence+Content · swiper-flashcard=Sequence+Response(choice) · drag-sort=Response(order) · drag-categorize=Response(match) · timeline-builder=Response(order,time) · crossword=Response(gap-text) · fraction-area-model=Interaction · draw-the-curve=Response(drawing)+Check · draft-meter=Source?+Response(extended-text) · find-the-flaw=Sequence+Response(choice)+Elaboration · defend-claim=Source+Response(extended-text)+Elaboration · debate-ai=Dialogue · writing-workshop=Dialogue+Response(extended-text)
Cross-cutting contracts:
assessmentType: summative|formativeforced by schema wherever a verdict exists (invariant 3 as schema, not convention); scoring pre-authored, never model-generated at render time; anonymous ids only in any event payload (invariant 2); ICAP tier as planner-guidance metadata on every primitive (not schema).Phases
Ordering rationale: verdict-free before verdict-carrying (contract risk isolated to phase 3), provers-in-hand before spec-only, formalization last so the catalog freezes after the vocabulary has been exercised, not before.
Relations: the vocabulary lives under #98; verdict semantics join at #99; phase 6 un-drafts #74. Research base in #98 (comment).
🤖 Generated with Claude Code