Skip to content

a2learn primitives: the exhaustive pedagogical vocabulary, and the build plan #100

Description

@adamstankiewicz

The middle tier of #98, planned end to end. Two rules govern everything below:

  1. 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.
  2. 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

  • 1 — Harden what shipped (no new words): zod schemas for Sequence/Reveal/Callout; conformance gains a composition layer — validate primitives surfaces against those schemas, golden per composed kind, negative controls. Unblocks trusting everything after.
  • 2 — Content (verdict-free, prover ready): narrated-card composes as Sequence+Content(audio, transcript); renderer view; three-tier demo row.
  • 3 — Check + Response (blocked on a2learn interaction contract: a standard event/function vocabulary for registry widgets #99): the verdict contract must exist first. Then: Response schema with the QTI-collapsing type enum; provers drag-sort → swiper-flashcard → draft-meter (extended-text through the a2learn.score function); evidence events per a2learn interaction contract: a standard event/function vocabulary for registry widgets #99; assessmentType enforcement with negative controls proving a verdict-free primitive cannot emit one.
  • 4 — Constructive tier: Elaboration (find-the-flaw prover), Dialogue (debate-ai prover), Interaction (fraction-area-model) — with an explicit per-kind decision recorded where a manipulative's essence resists parameterization (whole-widget tier is the honest answer there, not a forced primitive).
  • 5 — Atoms completion + policy growth: Term, Source; Example via the step-reveal fadeSteps spec upgrade (own issue — contract change); Sequence branching + spacing/interleaving policies; Reflection stays spec-only until a prover exists.
  • 6 — Catalog formalization: versioned catalog document + served schema + vendoring rules + two-direction conformance. This is the milestone that un-drafts docs: the a2learn format draft #74.

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

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions