Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Internal speech module for /codeck. Reads deck content, asks about style and duration only when missing, generates a verbatim speech transcript with stage directions. Outputs $DECK_DIR/speech.md.
.claude/skills/hiyeshu-codeck-speech/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 67% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 91% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 105% | 0% |
| case-15 | ✗→✓ | ▲ Improved | 86% | 0% |
| case-18 | ✗→✓ | ▲ Improved | 169% | 0% |
<!-- INPUT]: Depends on deck content, HTML notes, MEMORY.md, tasks/tasks.md, and threads/threads.md. OUTPUT]: Provides speech.md and fragment-synced HTML data-notes. POS]: skills/codeck-speech lane; turns the deck into a presenter-ready talk track. PROTOCOL]: 变更时更新此头部,然后检查 CLAUDE.md -->
@speech owns the talk track, presenter rhythm, and fragment-synced notes.
Write boundaries:
$DECK_DIR/speech.mddata-notes in $DECK_DIR/slides.html$DECK_DIR/roles/speech.md, $DECK_DIR/tasks/tasks.md, and $DECK_DIR/channel/YYYY-MM-DD.mddeck.md, DESIGN.md, custom.css, review.md, or export files$DECK_DIR/threads/threads.mdRead $DECK_DIR/diagnosis.md. If a speech role is recommended, use it. Otherwise, pick a coach based on domain and audience:
> Technical → Feynman: simplify the complex, bridge with analogy > > Business → Jobs: build anticipation, one "one more thing" > > Academic → Hans Rosling: let data tell the story
bashDECK_DIR="$HOME/.codeck/projects/$(basename "$(pwd)")" CODECK_SKILL_DIR="${CODECK_SKILL_DIR:-}" if [ -z "$CODECK_SKILL_DIR" ]; then for d in \ "${CLAUDE_PLUGIN_ROOT}/skills/codeck" \ "$HOME"/.claude/plugins/cache/*/codeck/*/skills/codeck \ "$HOME"/.codex/plugins/cache/*/codeck/*/skills/codeck \ "$HOME/.agents/skills/codeck" \ "$HOME/.codex/skills/codeck" \ "$HOME/.claude/skills/codeck"; do if [ -d "$d/scripts" ]; then CODECK_SKILL_DIR="$d"; break; fi done fi [ -n "$CODECK_SKILL_DIR" ] || { echo "codeck skill scripts not found; set CODECK_SKILL_DIR" >&2; exit 1; } . "$CODECK_SKILL_DIR/scripts/resolve-dirs.sh" mkdir -p "$DECK_DIR" mkdir -p "$DECK_DIR/channel" "$DECK_DIR/tasks" "$DECK_DIR/threads" "$DECK_DIR/roles" bash "$CODECK_SKILL_DIR/scripts/init-room.sh" "$DECK_DIR" bash "$CODECK_SKILL_DIR/scripts/status.sh" "$DECK_DIR"
Read:
*-r*.html) — actual slide contentoutline.mdIf no HTML and no deck.md, run /codeck to build the missing deck state first.
If only deck.md exists, write based on deck.md — note that the script is based on structure, not final visuals.
Do not read channel/YYYY-MM-DD.md unless debugging history.
Smart skip: skip Decision Ask if the user's instruction, MEMORY.md, open threads/threads.md rows, deck.md, or existing speech.md already specifies style and duration.
Before writing, claim the work ticket:
markdown@orchestrator Owner: @speech. Task: create presenter script and sync data-notes. @speech I claim the speech pass. I will write `speech.md`, sync fragment notes, and leave source conflicts in threads.
Append the exchange to today's channel file and update tasks/tasks.md.
Speech Style is one allowed Decision Ask moment under /codeck.
Use the shared /codeck Decision Ask Policy. Create one D-YYYYMMDD-NN decision only when style or duration is missing. Bundle both into one choice so the user is deciding the speech shape, not filling a form.
textcodeck needs the speech shape. Current read: {deck audience and rhythm}. I suggest {recommended package} because {reason}. A) {style + duration package} (recommended) B) {contrasting style + duration package} C) {deeper/shorter package}
Use these defaults when the deck gives no signal:
If the decision is non-blocking and the user does not answer, use the recommended package and write assumed default to MEMORY.md. If the speech commitment is blocking and no structured AskUser UI is available, leave it open in threads/threads.md and stop before writing speech.md.
Record the final style and duration in speech.md front matter and MEMORY.md.
Before writing, build a fragment map. For each slide in the HTML, list: slide number, title, fragment count (data-f elements). This map determines the speech structure — slides with fragments get ### [on enter] + ### [fragment N] sections, slides without get a single block. Do not skip this step.
Write a complete, readable-aloud transcript. Page by page.
[pause 2s], [slow down], [look at audience]. For other languages, translate the stage directions so the speaker never has to switch languages while presenting.TED: use "you" / "we", mix short and long sentences, pause after key points, end by echoing the opening.
Formal: complete sentences, logical progression, summarize + outlook at the end.
Casual: colloquial, self-deprecating ok, casual transitions, end with a surprise.
| Slide | Title | Words | Estimate | |-------|-------|-------|----------| | 1 | ... | ... | ... |
If a section is over budget, trim it directly before writing the final script. Do not ask another question.
The engine's buildNotes() concatenates the slide's data-notes with each visible fragment's data-notes as the presenter steps through. Use this to sync speech rhythm with fragment rhythm.
data-f="N" to know the stepping orderdata-notes → what to say when the slide first appears (before any fragment)data-f="1" element's data-notes → what to say when fragment 1 revealsdata-f="2" element's data-notes → what to say when fragment 2 revealsSpeech for slide 3: > "Let's talk about the three ideas behind codeck. pause 2s] First, it recruits people, not rules. pause] Second, isomorphic mapping. pause] Third, no schema ceiling."
Slide 3 has data-f="1", data-f="2", data-f="3":
html<section class="slide" data-notes="Let's talk about the three ideas behind codeck. [pause 2s]"> <h2 data-f="1" data-notes="First, it recruits people, not rules. [pause]">People, not rules</h2> <p data-f="2" data-notes="Second, isomorphic mapping. [pause]">Isomorphic mapping</p> <p data-f="3" data-notes="Third, no schema ceiling.">No schema ceiling</p> </section>
Presenter presses → three times. Notes build up progressively:
data-notesdata-notes attribute values[pause], [slow down], etc.) in the notesmarkdown--- style: "{style}" duration: "{target}" totalEstimate: "{estimate}" --- # Speech: {topic} --- ## Slide 1: {title} <!-- estimate: {N}s | {M} words | fragments: 0 --> {verbatim speech text} [pause 2s] --- ## Slide 2: {title} <!-- estimate: {N}s | {M} words | fragments: 3 --> ### [on enter] {what to say when slide appears, before any fragment} ### [fragment 1] {what to say when fragment 1 reveals} ### [fragment 2] {what to say when fragment 2 reveals} ### [fragment 3] {what to say when fragment 3 reveals} ---
After writing:
MEMORY.md Active Context, Latest Channel Summary, Task Index, and Artifacts.@speech task done in tasks/tasks.md.threads/threads.md.Point to the single strongest moment in the script — the line or pause that will land hardest:
> codeck speech done. > > @speech > I wrote speech.md, synced fragment notes, and recorded the speech shape in memory. > > Strongest moment: {slide N — what happens and why it works. e.g., "Slide 4, the three-second pause after the question. That silence is where the audience decides you're worth listening to."} > > {one line — readiness assessment} > > Output: $DECK_DIR/speech.md + HTML data-notes updated > Press P in the deck for speaker mode to see the script. > > Export: /codeck export. Overview: /codeck.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 39,315 | 10,608 | -73% | 1 | 1 | 0% | 6,232 | 3,440 | -45% | 0 | 0 | — |
case-02 | fail→fail | 32,309 | 10,587 | -67% | 1 | 1 | 0% | 5,693 | 3,350 | -41% | 0 | 0 | — |
case-03 | fail→fail | 24,165 | 9,306 | -61% | 1 | 1 | 0% | 4,363 | 3,159 | -28% | 0 | 0 | — |
case-04 | fail→pass | 12,382 | 6,078 | -51% | 1 | 1 | 0% | 2,224 | 3,717 | +67% | 0 | 0 | — |
case-05 | fail→fail | 3,391 | 6,392 | +88% | 1 | 1 | 0% | 474 | 3,457 | +629% | 0 | 0 | — |
case-06 | pass→fail | 10,230 | 10,187 | -0% | 1 | 1 | 0% | 1,638 | 3,206 | +96% | 0 | 0 | — |
case-07 | fail→fail | 6,178 | 12,655 | +105% | 1 | 1 | 0% | 850 | 3,448 | +306% | 0 | 0 | — |
case-08 | fail→fail | 11,541 | 5,259 | -54% | 1 | 1 | 0% | 1,565 | 3,381 | +116% | 0 | 0 | — |
case-09 | fail→pass | 16,400 | 10,709 | -35% | 1 | 1 | 0% | 2,124 | 4,053 | +91% | 0 | 0 | — |
case-10 | fail→pass | 13,763 | 7,805 | -43% | 1 | 1 | 0% | 1,799 | 3,690 | +105% | 0 | 0 | — |
case-11 | fail→fail | 15,811 | 11,651 | -26% | 1 | 1 | 0% | 2,256 | 3,281 | +45% | 0 | 0 | — |
case-12 | pass→pass | 8,407 | 4,744 | -44% | 1 | 1 | 0% | 1,346 | 3,405 | +153% | 0 | 0 | — |
case-13 | pass→pass | 8,751 | 11,235 | +28% | 1 | 1 | 0% | 1,335 | 3,462 | +159% | 0 | 0 | — |
case-14 | fail→fail | 6,407 | 2,513 | -61% | 1 | 1 | 0% | 884 | 3,090 | +250% | 0 | 0 | — |
case-15 | fail→pass | 11,698 | 4,140 | -65% | 1 | 1 | 0% | 1,782 | 3,320 | +86% | 0 | 0 | — |
case-16 | pass→pass | 8,044 | 3,447 | -57% | 1 | 1 | 0% | 1,269 | 3,274 | +158% | 0 | 0 | — |
case-17 | pass→pass | 10,880 | 5,023 | -54% | 1 | 1 | 0% | 1,650 | 3,570 | +116% | 0 | 0 | — |
case-18 | fail→pass | 7,927 | 3,652 | -54% | 1 | 1 | 0% | 1,241 | 3,336 | +169% | 0 | 0 | — |
case-19 | fail→pass | 10,132 | 2,288 | -77% | 1 | 1 | 0% | 1,286 | 3,115 | +142% | 0 | 0 | — |
case-20 | fail→pass | 12,280 | 6,529 | -47% | 1 | 1 | 0% | 1,713 | 3,625 | +112% | 0 | 0 | — |
case-21 | fail→pass | 6,891 | 2,651 | -62% | 1 | 1 | 0% | 1,027 | 3,147 | +206% | 0 | 0 | — |
case-22 | pass→pass | 8,910 | 1,540 | -83% | 1 | 1 | 0% | 1,402 | 2,931 | +109% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 16 counted toward the lift figure. The other 6 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +32 percentage points is the difference between those two pass rates over the 16 comparable cases. 3 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.