The user wants a speaking task, mock speaking interview, or feedback on an
answer they spoke (pasted as transcript or provided as an audio file).
-
Identify exam + level + part. Load data/exam-formats/<exam-id>.md,
data/cefr/speaking-descriptors.md, and
data/cefr/speaking-calibration-anchors.md (leveled transcript samples).
Seed shapes: data/item-bank/seed/speaking-tasks.md (imitate format,
never reuse).
-
Generate the task with the exam's real prep/speaking times (e.g.
IELTS Part 2: 1 min prep, 1–2 min talk; TOEFL interview answers: 45 s
each with no preparation time). Pitch the prompt's demand to the level
(B1 concrete/personal; B2 opinion on a familiar topic; C1 abstract, asks
the speaker to weigh/hypothesise; C2 nuanced) — speaking-calibration- anchors.md shows an at-level answer to aim the prompt at. Visual-dependent
tasks (Cambridge B1 Part 2 describe-a-photo; B2 First / C1 Advanced Part 2
compare-photographs; C2 Part 2 picture discussion) can't be rendered here;
say so and offer a non-visual part instead of faking it. IELTS Speaking uses
no visual prompts — its Part 2 is a text cue card and IS fully renderable.
Tell the user how to respond, in order of preference:
- record themselves (any voice recorder) and paste an accurate
transcript, noting hesitations/self-corrections honestly;
- or speak first and then type from memory (say that this loses fluency
information);
- for a paired-format task (collaborative discussion), play the partner:
alternate short turns with the user in chat.
TOEFL Listen and Repeat (7 of the 11 TOEFL speaking items) works
differently: deliver each sentence once via say when available (else
read it once as a partner), have the user repeat it from memory and type
what they said, and score each sentence on exactness — content words, word
order, grammatical endings. Report the sentence length at which recall
broke down; that breakdown point is itself the diagnostic. Log with
--task-type toefl-listen-and-repeat --score <n> --max 7.
-
Evaluate the transcript against the five paraphrased CEFR aspects
(range, accuracy, fluency, interaction, coherence) and the exam's
criteria structure. Calibrate before fixing a range: place the transcript
next to the nearest level in speaking-calibration-anchors.md per aspect
(aspects may land on different levels — say so). The anchors start at B1: if
the transcript sits clearly below the B1 anchor on most aspects, report it as
below B1 (approx. A1/A2) rather than snapping up to B1, and log --level /
--cefr-estimate as A1 or A2 accordingly. From text alone, fluency
and pronunciation are only partly observable — judge fluency from
fillers/self-corrections if the transcript preserves them, and say so;
only comment on pronunciation the user asks about or reports ("I struggle
with th-").
-
Return: (a) estimate as a range + CEFR level; (b) 3–5 prioritized
fixes with your phrase → stronger phrase rewrites from the user's own
answer; (c) one upgraded model answer fragment (2–3 sentences, next level
up); (d) one follow-up question to re-drill the weakest point now.
-
Log the attempt (silently):
python3 "${CLAUDE_PLUGIN_ROOT}/skills/progress-tracker/scripts/log_attempt.py" \
--exam <exam-id> --skill speaking-coach --task-type <slug> \
--level <anchor> --band-estimate "<low>-<high>" --cefr-estimate <cefr> \
--seconds <time-on-task>
On Windows, if python3 isn't found, use python or py instead.
Use the exact --task-type slug from data/task-types.md. Add
--criteria "fluency=B2,lexis=B2,grammar=B1,..." with the per-aspect
levels you just judged, and be honest about the evidence:
--evidence-grade partial for a transcript typed from memory (the content
survived, the delivery did not), full only when it came from audio.
-
Run the clock, and close the loop. For a timed task, run it under the
real exam clock instead of "start when ready" — that constraint is most of
the task's difficulty:
python3 "${CLAUDE_PLUGIN_ROOT}/skills/progress-tracker/scripts/timed_speak.py" \
--exam <exam-id> --task <slug>
It prints the seconds to log and --timing-source script. Afterwards log
2–5 mistakes with log_error.py, run queue.py sync, and offer a second
attempt at the same task, reporting the per-aspect delta. Full protocol:
../progress-tracker/references/the-loop.md.
For TOEFL estimate the 1–6 band scale: --score <band> --max 6
(half bands allowed; official CEFR alignment: 4 ≈ B2, 5 ≈ C1, 6 = C2).