Training-spec drills
One section per trspec the drill engine currently serves (19 total) --
prerequisites, the learner's state before and after, how the drill works, and what it teaches.
Same "served" definition as trspecs-list.php: any status string
starting with "runnable".
CV Decoding (any script) — glyph to sound via IPA (cv-read)
status: runnable (per-script resources permitting)
Prerequisites
after_stage: ["identification","identification in company"]
after_stage_note: TWO prior stages, not one -- road.json's own step 6 needs both step 3 (identification) and step 4 (identification in company) first; after_stage was extended to hold a list for exactly this case (card road-chain-fixup-20260907, 2026-09-08).
symbols_known: 6
device: ["speaker"]
Learner state -- before / after
Before: identification and identification in company
After: minimal sequence reading
How it works
literacy-design.md §1 row 2 + interaction-model.md stage 2: script syllable displayed → pick its IPA among K numbered buttons (tap or digit key); correct flashes green and plays the syllable's audio as confirmation.
Shape: ? in, multiple_choice out
What it teaches
stage: minimal sequence reading
unit: syllable
CV Decoding (any script) — glyph to sound, audio choices (cv-read-audio)
status: runnable for devanagari (needs per-script cv-survey.tset + wavs, same as identify)
Prerequisites
after_stage: identification
symbols_known: 6
device: ["speaker"]
Learner state -- before / after
Before: identification
After: minimal sequence reading
How it works
Written syllable displayed; the K=4 candidate audios auto-play in sequence, each numbered button highlighting as its sound plays (the sweep); tap a button to hear it again and ARM it; tap the armed button (or press its digit twice) to commit. Space replays the sweep. Working-memory bound says K=4, not 6.
Shape: ? in, multiple_choice out
What it teaches
stage: minimal sequence reading
unit: syllable
CV Decoding — Hindi (cv-read-hi)
status: runnable for devanagari (24 of 135 cv-survey rows have real audio, borrowed from exact-match IPA recordings; the rest need real devanagari recordings)
Prerequisites
after_stage: identification
symbols_known: 6
device: ["speaker"]
Learner state -- before / after
Before: identification
After: minimal sequence reading
How it works
literacy-design.md §1 row 2: CV cell text → pick matching audio from choices; confusors are same-C-other-V and same-V-other-C cells; itemSource = tglx CV worklists (devanagari/sets/cv-survey.tset)
Shape: ? in, multiple_choice out
What it teaches
stage: minimal sequence reading
unit: syllable
Word-shape Decoding (CVC) - read a three-sound word (cvc-read)
status: runnable (text decode; rate-scoring still open)
Prerequisites
after_stage: minimal sequence reading
symbols_known: 12
device: ["speaker"]
Learner state -- before / after
Before: minimal sequence reading
After: extended sequence reading
How it works
literacy-design.md §1 row 3 + interaction-model.md §3 stage 3 (prereq: stage 2 cv-read certified + word meanings exist as PICTURES, no L1 text prereq): word text stimulus → pick meaning-picture among K; confusors = words sharing 2 of 3 phonemes (CVCVC near-homophones); itemSource = tglx lex/ + picture set.
Shape: ? in, multiple_choice out
What it teaches
stage: extended sequence reading
unit: word
Word-shape Decoding (any script/lang) — CVCVC (cvcvc-read)
status: runnable
Prerequisites
after_stage: ["minimal sequence reading","sequence"]
after_stage_note: TWO prior stages, not one -- road.json's own step 7 needs both step 6 (minimal sequence reading) and step 5 (sequence) first; after_stage was extended to hold a list for exactly this case (card road-chain-fixup-20260907, 2026-09-08).
symbols_known: 12
device: ["speaker"]
Learner state -- before / after
Before: minimal sequence reading and sequence
After: extended sequence reading
How it works
Show the written word; pick the sound it makes among K audio buttons. Confusors: feature_nearest on c,v.
Shape: ? in, multiple_choice out
What it teaches
stage: extended sequence reading
unit: word
Word-shape Decoding — Hindi (CVCVC) (cvcvc-read-hi)
status: runnable
Prerequisites
after_stage: minimal sequence reading
symbols_known: 12
device: ["speaker"]
Learner state -- before / after
Before: minimal sequence reading
After: extended sequence reading
How it works
Show the written CVCVC word; pick the sound it makes among K audio buttons, same doctrine as cvcvc-read.json (b158 verdict A). Confusors: feature_nearest on c,v (the word's own consonant/vowel skeleton).
Shape: ? in, multiple_choice out
What it teaches
stage: extended sequence reading
unit: word
Grapheme-Phoneme Correspondence (any orthography) (gpc)
status: runnable for en (data live 2026-07-04); other languages need their gpc.tset
Prerequisites
after_stage: minimal sequence reading
symbols_known: 12
device: ["speaker"]
Learner state -- before / after
Before: minimal sequence reading
After: orthography
How it works
literacy-design.md §1 row 5 + interaction-model.md stage 5: hear the word (audio prompt) → pick the TRUE spelling among K, where same-rule trap spellings (nite, fone, sent) are preferred distractors. Proof P1. Misses re-show the rule decomposition.
Shape: ? in, multiple_choice out
What it teaches
stage: orthography
unit: spelling
English Grapheme-Phoneme Correspondence (gpc-en)
status: runnable
Prerequisites
after_stage: minimal sequence reading
symbols_known: 12
device: ["speaker"]
Learner state -- before / after
Before: minimal sequence reading
After: English orthography
How it works
Show the target word with the grapheme highlighted (PhaseRenderer's word_with_highlighted_sequence rendering, b143); pick the SOUND it makes here among audio choices. Confusors: same_written_form (the other sounds this exact grapheme makes elsewhere).
Shape: ? in, multiple_choice out
What it teaches
stage: English orthography
unit: spelling
Identify Glyphs (identify)
status: runnable (per-script resources permitting)
Prerequisites
after_stage: auditory exposure
symbols_known: 0
device: ["speaker"]
Learner state -- before / after
Before: auditory exposure
After: identification
How it works
literacy-design.md §1 row 1 + interaction-model.md stage 1: audio prompt → tap the glyph among K; no literacy prerequisite (entry-level drill).
Shape: ? in, multiple_choice out
What it teaches
stage: identification
unit: symbol
Identify Devanagari Glyphs (identify-devanagari)
status: runnable-pending-listen
Prerequisites
after_stage: auditory exposure
symbols_known: 0
device: ["speaker"]
Learner state -- before / after
Before: auditory exposure
After: identification
How it works
literacy-design.md §1 row 1: audio (tts/wav) → tap glyph among K; confusors from competence-model nearest confusable glyphs (visual + phonetic distance); itemSource = tglx sym/ + sets/
Shape: ? in, multiple_choice out
What it teaches
stage: identification
unit: symbol
Identify Glyphs (letter shown, pick the sound) (identify-sound)
status: runnable (per-script resources permitting)
Prerequisites
after_stage: auditory exposure
symbols_known: 0
device: ["speaker"]
Learner state -- before / after
Before: auditory exposure
After: identification
How it works
Reverse of identify.json: show the glyph as text, offer K sounds as audio buttons, tap the one this glyph makes.
Shape: ? in, multiple_choice out
What it teaches
stage: identification
unit: symbol
Identify IPA Symbols (ipa-identify-alone)
status: runnable
Prerequisites
after_stage: auditory exposure
symbols_known: 0
device: ["speaker"]
Learner state -- before / after
Before: auditory exposure
After: identification
How it works
literacy-design.md §1 row 1 + interaction-model.md stage 1: audio prompt → tap the glyph among K; no literacy prerequisite (entry-level drill).
Shape: ? in, multiple_choice out
What it teaches
stage: identification
unit: symbol
IPA Sounds — Inside a Syllable (ipa-identify-in-sequence)
status: runnable
Prerequisites
after_stage: identification
symbols_known: 3
device: ["speaker"]
Learner state -- before / after
Before: identification
After: identification
How it works
Runs on the RECORDED ipa syllable sets (cv 286, cvc 50, cvcvc 100 - all have Tom-recorded audio). The learner hears a syllable and picks its written form from choices. Every item CONTAINS a letter the learner has already met, so the drill is always about their own letters, never a cold symbol. Confusors are chosen to differ in exactly the target letter where possible, so getting it right REQUIRES hearing that letter, not guessing from the rest.
Shape: ? in, multiple_choice out
What it teaches
stage: identification
unit: syllable
Spell What You Hear — IPA (ipa-transcribe-sequence)
status: runnable
Prerequisites
after_stage: minimal sequence reading
symbols_known: 2
device: ["speaker"]
note: Offer only once the learner knows the two sounds in the syllable on their own; before that they are guessing the spelling.
Learner state -- before / after
Before: minimal sequence reading
After: production
How it works
Hear a syllable, build its spelling from letter tiles: one tile for the consonant, one for the vowel, among a few wrong ones. Nothing written is shown in the question, because the spelling IS the answer. Fills the last open stage of wiki learning-trajectory.md, production: of 28 drills 17 ask the learner to pick one of several and none asks them to write what they hear.
Shape: ? in, tile_construct out
What it teaches
stage: production
unit: syllable
Spanish articles — el, la, los, un, una (paradigm-es-articles)
status: runnable
Prerequisites
after_stage: minimal sequence reading
device: ["speaker"]
Learner state -- before / after
Before: minimal sequence reading
After: closed-class paradigm
How it works
isolated-paradigm: show one member of a real, cited paradigm subgroup; pick its meaning among the OTHER members of the SAME subgroup (same_grid confusors), so a learner is never asked to tell el apart from an unrelated word -- only from the ones that could really sit in that same slot.
Shape: ? in, multiple_choice out
What it teaches
stage: closed-class paradigm
unit: article
Japanese case particles — what job a word does (paradigm-ja-case)
status: runnable
Prerequisites
after_stage: minimal sequence reading
device: ["speaker"]
Learner state -- before / after
Before: minimal sequence reading
After: closed-class paradigm
How it works
isolated-paradigm: show one member of a real, cited paradigm subgroup; pick its meaning among the OTHER members of the SAME subgroup (same_grid confusors), so a learner is never asked to tell ga apart from an unrelated particle -- only from the ones that could really sit in that same slot.
Shape: ? in, multiple_choice out
What it teaches
stage: closed-class paradigm
unit: particle
Russian case markers and prepositions — what job a word does (paradigm-ru-case)
status: runnable
Prerequisites
after_stage: minimal sequence reading
device: ["speaker"]
Learner state -- before / after
Before: minimal sequence reading
After: closed-class paradigm
How it works
isolated-paradigm: show one member of a real, cited paradigm subgroup; pick its meaning among the OTHER members of the SAME subgroup (same_grid confusors), so a learner is never asked to tell -a apart from an unrelated word -- only from the ones that could really sit in that same slot.
Shape: ? in, multiple_choice out
What it teaches
stage: closed-class paradigm
unit: case marker
Sanskrit masculine -a stem — one, two, or more than two (paradigm-sa-M-a_number_NOM)
status: runnable
Prerequisites
after_stage: minimal sequence reading
device: ["speaker"]
Learner state -- before / after
Before: minimal sequence reading
After: closed-class paradigm
How it works
isolated-paradigm: show one member of a real, cited paradigm subgroup; pick its meaning among the OTHER members of the SAME subgroup (same_grid confusors), so a learner is never asked to tell -aḥ apart from an unrelated ending -- only from the ones that could really sit in that same case-and-stem slot.
Shape: ? in, multiple_choice out
What it teaches
stage: closed-class paradigm
unit: case ending
See It, Say It, Hear Both - read a symbol aloud and judge yourself (see-it-say-it-hear-both)
status: runnable - record_compare shipped (PhaseEngine/PhaseRenderer v019+), RecordCompareInteraction.js mounted
Prerequisites
not specified in this trspec's data
Learner state -- before / after
Before: not specified in this trspec's data
After: not specified in this trspec's data
How it works
Shape: ? in, record_compare out
What it teaches
not specified in this trspec's data