Creates presentations grounded in the speaker's documented rhetoric patterns, using a personal rhetoric-knowledge-vault as a constitutional style guide. Interactive and spec-driven: distill intent, jointly select rhetorical instruments from the vault catalog, architect the talk, develop content with speaker notes, run guardrail checks, generate a .pptx deck, publish per the speaker's workflow. Use whenever the user wants to create a presentation, build a talk, write a conference submission, design a slide deck, prepare for a speaking engagement, describe a topic to present on, or adapt an existing talk for a new audience. Also handles CFP abstracts; the sessions catalog of submission-ready titles, abstracts, and outlines; and single post-authoring tasks on an existing talk — QR code, deck export, shownotes page, YouTube thumbnail, linking a recording. Not a generic slide-deck tool — requires a populated rhetoric-knowledge-vault and follows the speaker's established style.
Recursos
1Instal·la
npx skillscat add jbaruch/speaker-toolkit/presentation-creator Instal·la des del registre de SkillsCat.
Presentation Creator
Process steps in order. Do not skip ahead.
Steps 0–7 are one sequential workflow — Step 0 before Step 1, Step 1 before
Step 2, and so on. Do not parallelize. A request may enter the workflow at a
later step (see "Where to enter" below), but from that point it still runs in
order, and every entry requires the vault-loading gate and the documented
pre-flight checklist before any action.
Resolve the absolute path of this loaded SKILL.md, then setspeaker_toolkit_root to the plugin root two directories above the directory
containing this file. Never derive it from the consumer working directory.
Treat {speaker_toolkit_root} as absolute in every toolkit-owned command;
talk, vault, and output paths remain consumer-owned.
Build presentations that match the speaker's documented rhetoric and style patterns.
The rhetoric-knowledge-vault is this skill's constitution. Every presentation is a
joint effort — the skill brings rhetoric knowledge, the author brings topic expertise.
Before You Start: Load the Vault
The vault lives at ~/.claude/rhetoric-knowledge-vault/ (may be a symlink to a custom
location). Load tracking-database.json with the strict owner reader at{speaker_toolkit_root}/skills/vault-ingress/scripts/read-tracking-database.py to
get config.vault_root; never parse it directly. The stdlib-only reader may use
the host interpreter for this one bootstrap read. It accepts the readable database
generations in the owner compatibility contract
without rewriting them. Stop on unsupported root
or owner-record generations and route migration to Skill(skill: "vault-ingress").
Discover the exact non-empty config.python_path, then immediately re-read the
same canonical database path with that interpreter and require the same SHA-256;
restart discovery if the generation changed. Use only that configured interpreter
for every later toolkit command. Missing or unusable configuration stops this flow
and invokes Skill(skill: "vault-ingress") with Step 1 as the handoff context.
Read-only phases may continue on readable legacy generations, but publishing and
post-event writes require the owner-current schema before their paired network,
deck, image, or tracking side effects. For a legacy generation, invokeSkill(skill: "vault-ingress") with a
Step 1 migration handoff before continuing.
Load from vault root: rhetoric-style-summary.md (constitution — all patterns),slide-design-spec.md (visual rules), speaker-profile.json (structured data).
The interaction-rules steering rule (one-question-at-a-time, applies to all phases)
is loaded automatically via plugin steering — do not treat it as a vault-root document.
Then load the reference for the phase you are entering — each Step below names its
own file. Pattern selection additionally reads
references/patterns/_index.md.
Checks: Warn if profile.generated_date < summary."Last updated" (stale profile).
Then run:
"{python_path}" "{speaker_toolkit_root}/skills/presentation-creator/scripts/pattern_history_status.py" \
path/to/speaker-profile.json path/to/rhetoric-style-summary.mdRead references/pattern-history-authorization.md
before consuming any catalog-derived historical field. It owns the emitted payload
shape, the six domain contracts, source selection, profile schema tiers, Section 15
eligibility, summary-only mode, and the cross-generation comparison rules.history_enabled is not blanket permission — require the specific domain per use.
Workflow Overview
| Phase | What happens | Gate |
|---|---|---|
| 0: Intake | Load vault, gather context | Topic and context captured |
| 1: Intent Distillation | Clarifying questions → talk: block of outline.yaml; generate TL;DR-only narrative.md (partial) |
Author confirms metadata |
| 2: Rhetorical Architecture | Joint instrument selection → architecture, applied_patterns, chapters[] in outline.yaml; regenerate narrative.md (partial) for review |
Author approves narrative + architecture |
| 3: Content Development | Fill slides[] + interludes[] in outline.yaml; finalize narrative.md (full) + generate script.md, slides.md, rhetorical-review.md |
Draft delivered |
| 4: Revision & Guardrails | Iterate on feedback, run guardrail checks against outline.yaml |
Author declares outline done |
| 5: Slide Generation | Build .pptx from template (or presenterm {slug}.md) using slides.md build-sheet |
Author declares slides done |
| 6: Publishing | Export, shownotes, QR per speaker's workflow | Published and ready |
| 7: Post-Event | YouTube thumbnail, video to shownotes | Thumbnail approved, video linked |
Do not skip phases. Do not write content before Phase 3. Phase 2 is joint, not autonomous.
Where to enter. A fresh talk starts at Step 0. Four requests enter later
instead: a single post-authoring task (QR code, export, shownotes, thumbnail,
linking a recording), adapting an existing talk, writing a CFP abstract, and
sessions-catalog work. Read
references/alternate-entry-flows.md for
the matching one — it names the step to enter at and the only sanctioned skip
(the CFP flow omits Phase 2, which an abstract does not need). Vault loading
stays mandatory for all of them.
Talk-directory artifacts.
By end of Phase 3, the talk directory contains:
| File | Role | Authored or generated? |
|---|---|---|
outline.yaml |
Source of truth — talk metadata, chapters, slides, interludes, patterns, callbacks | Authored (agent-edited, schema-validated) |
narrative.md |
TL;DR of the idea + one-line-per-slide deck walk | Generated by extract-narrative.py |
script.md |
Screenplay-form rehearsal artifact | Generated by extract-script.py |
slides.md |
Per-slide build-sheet (format, visual, image prompts, builds, callbacks) | Generated by extract-slides.py |
rhetorical-review.md |
Structural gap-check report | Generated by check-rhetorical.py |
{slug}.md |
Renderable deck (presenterm-format talks only) | Authored/built in Phase 5 |
*.pptx |
Renderable deck (pptx talks) | Built in Phase 5 |
Regenerate the four derived artifacts after every edit to outline.yaml:
"{python_path}" "{speaker_toolkit_root}/skills/presentation-creator/scripts/extract-narrative.py" outline.yaml > narrative.md
"{python_path}" "{speaker_toolkit_root}/skills/presentation-creator/scripts/extract-script.py" outline.yaml > script.md
"{python_path}" "{speaker_toolkit_root}/skills/presentation-creator/scripts/extract-slides.py" outline.yaml > slides.md
"{python_path}" "{speaker_toolkit_root}/skills/presentation-creator/scripts/check-rhetorical.py" outline.yaml > rhetorical-review.mdValidate the YAML with "{python_path}" "{speaker_toolkit_root}/skills/presentation-creator/scripts/outline_schema.py" outline.yaml — exits non-zero with a typed error if any validator fails.
narrative.md is the exception to "by end of Phase 3" — it is generated earlier
in partial form during Phases 1–2 with --partial, which validates talk +chapters without requiring slides[]. The plain (full-validation) commands
above apply from Phase 3 onward, once slides[] exists.
The four .md files are read-only — never edit them directly; they regenerate
deterministically from outline.yaml.
Step 0 — Intake & Context Loading
Read references/phase0-intake.md.
- Load vault documents (see above).
- Capture what the user has shared — topic, conference, audience, time slot.
- Read any provided CFP description, conference website, or existing talk to adapt.
- Report what you know and what you still need.
Proceed immediately to Step 1.
Step 1 — Intent Distillation
Read references/phase1-intent.md for the full
question set. Ask about what's missing; skip what's known.
Author the talk metadata block of outline.yaml. The field-by-field
reference is the ## The talk: block table in
references/phase3-content.md; outline_schema.py:TalkMetadata
is the authoritative list. Leave architecture, engine, deck_theme, andengine_source as placeholders — Phase 2 fills them.
Generate the slug per publishing_process.shownotes.slug_convention in the profile.
Slug validation is kebab-case (lowercase alphanumeric + single hyphens).
Gate: Author confirms or edits the metadata.
Save the partial outline to {presentations-dir}/{conference}/{year}/{talk-slug}/outline.yaml,
then generate the narrative stub so the author can read the TL;DR early:
"{python_path}" "{speaker_toolkit_root}/skills/presentation-creator/scripts/extract-narrative.py" --partial outline.yaml > narrative.mdAt this phase narrative.md carries the TL;DR only — the chapter body fills in
at Phase 2 and the per-slide walk replaces it once slides exist in Phase 3.
Surface it to the author for an early read.
The talk block is the source of truth for the slug, duration, mode, and other
metadata. Later phases extend the SAME file with chapters[], slides[],interludes[], etc. — do not create a separate spec or outline file.
Proceed immediately to Step 2.
Step 2 — Rhetorical Architecture
Read references/phase2-architecture.md; it
also owns the slide-budget calculation from guardrail_sources.slide_budgets[].
The instrument menu comes from the vault, not from a static file. Read the summary
(sections 2-13) and profile instrument_catalog for options.
12 decisions to make together: Mode, Engine & Theme Sourcing, Opening,
Narrative, Humor, Audience Interaction, Closing, Slide Design, Persuasion,
Template Patterns, Pattern Strategy, Illustration Strategy. Each reads from the
matching instrument_catalog entry + summary section. For each: present options,
recommend based on spec, let author choose. If co-presented, add role split and
voice differentiation — see references/phase1-intent.md.
- Decision #2 (Engine & Theme Sourcing) picks the deck tooling (pptx vs
presenterm) and theme via the idea-sourcing wizard; it readsprofile → presentation_enginesand the chosen mode'stypical_engine, and writestalk.engine/talk.deck_theme/talk.engine_source. - Decision #11 (Pattern Strategy) uses
references/patterns/_index.md. Use the full
4-tier history view only when the Phase 0 pattern-history status is enabled;
otherwise use a flat current-taxonomy menu without usage, novelty, strength,
underuse, or mode-history claims. - Decision #12 (Illustration Strategy) is optional — only when the author
wants AI-generated illustrations. Delegate toSkill(skill: "illustrations")
for the full collaboration (style proposals grounded in vaultvisual_style_history, format vocabulary, model choice, visual continuity
devices). The skill writes the approvedstyle_anchorblock intooutline.yaml.
Once the architecture is set, author chapters[] (section headings, target_min,argument_beats[]) into outline.yaml, then regenerate the narrative — now with
its chapter body — for human review:
"{python_path}" "{speaker_toolkit_root}/skills/presentation-creator/scripts/extract-narrative.py" --partial outline.yaml > narrative.mdPresent narrative.md to the author. This is the narrative-approval point: the
author reads the TL;DR and the chapter arc and approves or revises the argument
before any per-slide content is written in Phase 3. Leave argument_beats[].slide_refs
empty here — slides do not exist yet, so --partial validation rejects any ref;
wire them to real slides in Phase 3.
Gate: Author approves the narrative (narrative.md) and the architecture.
Proceed immediately to Step 3.
Step 3 — Content Development
Read references/phase3-content.md for the full
outline schema, field-by-field guidance, pattern application, callback ledger,
voice calibration, placeholder definitions, and meme-brief format.
Fill slides[] and interludes[] in outline.yaml.
Use the typed narration-planning contract in
speech-rates.md. Prefer a current
owner-validated measured profile; label uncalibrated rates as assumptions.
Author talk.pacing_rate and root schema_version: 1; never use articulation
WPM to plan elapsed narration or predicted timing to verify a recording.
Placeholders use typed, independent numbering (each type starts at 01):AUTHOR-01, DEMO-01, DATA-01, SCREENSHOT-01, IMAGE-01, MEME-01. Every
placeholder requiring author input MUST use one of these typed tags — never
generic TODO or TBD.
After saving outline.yaml, validate and regenerate the derived artifacts using
the commands in "Talk-directory artifacts" above, starting with outline_schema.py.
Gate: Draft delivered.
Proceed immediately to Step 4.
Step 4 — Revision & Guardrails
Read references/phase4-guardrails.md for the
full check list, report format, and iteration protocol.
Run two checkers — they cover different surfaces:
"{python_path}" "{speaker_toolkit_root}/skills/presentation-creator/scripts/check-rhetorical.py" outline.yaml > rhetorical-review.md
"{python_path}" "{speaker_toolkit_root}/skills/presentation-creator/scripts/guardrail-check.py" outline.yaml path/to/speaker-profile.jsoncheck-rhetorical.py enforces the closed pattern taxonomy and writes therhetorical-review.md artifact — PASS / FLAG / N/A per check.
guardrail-check.py enforces speaker-profile-aware rules and emits one schema-v1
JSON object on stdout. Render its recurring_antipatterns records unchanged; do
not inspect profile rows to recreate them. Exit 0 means the report was produced —
FAIL remains a check status. Input failures exit non-zero, write diagnostics to
stderr, and leave stdout empty.
The script reports the 7 independent non-pattern checks plus pattern-history
status; the agent adds these categories manually:
- Current-taxonomy contextual antipattern scan of the new outline — runs even when
history is disabled and uses[CONTEXTUAL], never[RECURRING] - Speaker-specific recurring issues from
profile.guardrail_sources.recurring_issues[]
— schema-v4/v5 entries withsource_lane: "non_pattern"remain usable
independently; legacy or ambiguous entries are suppressed, while catalog
warnings come from authorizedpattern_profilehistory - Illustration coverage when
style_anchoris present - Time-sensitive content scan
- Murder-Your-Darlings filter pass
- Emotion-balance and screening-with-critics where applicable
- AI writing patterns across every prose surface
Iterate on author feedback. Apply changes first, guardrail second. Flag but don't
block intentionally overridden guardrails.
Gate: Author declares the outline done.
Proceed immediately to Step 5.
Step 5 — Slide Generation
Read references/phase5-slides.md for the full
technical reference: the engine branch, deck-op emission, which ops to omit on
illustrated slides, the post-build pass order, and the presenterm build.
Op vocabulary and state rules live in
references/deckops-spec.md.
Build the deck from the finalized outline.yaml, using slides.md (the
build-sheet extracted by extract-slides.py) as the per-slide instruction list.
Branch on talk.engine, read via outline_schema.py — never re-parse YAML by hand.
For pptx talks, emit a deck op sequence from slides.md + the profile layout
map, validate it, then build with the real PowerPoint app:
"{python_path}" "{speaker_toolkit_root}/skills/presentation-creator/scripts/validate-deckops.py" ops.txt
bash "{speaker_toolkit_root}/skills/presentation-creator/scripts/build-deck.sh" "{template_copy_pptx_path}" "{output_path}" ops.txtAfter the build completes, if outline.yaml declares style_anchor, delegate toSkill(skill: "illustrations") to generate illustrations, generate any
progressive-reveal builds, and apply them to the deck.
Then run the post-build passes in the order phase5-slides.md prescribes —expand-builds.sh, then inject-notes.sh, then apply-backgrounds.sh last.
Never reorder them. See rules/deck-editing-rules.md.
For presenterm talks, hand-author {slug}.md from the slides.md
build-sheet per phase5-slides.md — Presenterm Talks.
Every layout, background, footer, and slide-number decision reads fromspeaker-profile.json (design_rules.*, infrastructure.template_layouts[]) at
runtime — phase5-slides.md names the exact field per decision. Never hardcode them.
Gate: Author declares slides done.
Proceed immediately to Step 6.
Step 6 — Publishing
Read references/phase6-publishing.md; export
detail lives in references/phase5-slides.md.
Read publishing_process from speaker-profile.json. Each speaker's workflow differs.
If publishing_process is missing or empty, ask the author interactively.
Execute the steps from the profile:
0. Resources — extract and curate resource list from outline (extract-resources.py)
- Export — run
export_method/export_script - Shownotes — if
publishing_process.shownotes.enabled, use curated resources from Step 6.0 - QR Code — if
qr_code.enabled, generate and insert per profile - Additional steps — execute each
additional_steps[]entry - Go-live checklist — surface unobservable patterns from
references/patterns/_index.md as a delivery
preparation reminder (see phase6-publishing.md Step 6.5)
Gate: Author confirms published and ready to deliver.
Finish here. Step 7 is triggered separately, days or weeks after delivery.
Step 7 — Post-Event
Triggered separately — days or weeks after delivery. Not part of the linear
Phase 0-6 flow. The talk has been given and recorded.
Read references/phase7-post-event.md for the
pre-flight checklist and Step 7.2. Step 7.1 detail lives inskills/illustrations/references/thumbnails.md.
- YouTube Thumbnail — delegate to
Skill(skill: "illustrations")(the
skill handles slide selection, speaker-photo resolution, aesthetic precedence,
composition via Gemini, and speaker iteration). - Video to Shownotes — add video embed/link to existing shownotes page.
Gate: Thumbnail approved, video linked. Finish here.