Six-skill presentation system: ingest talks into a rhetoric vault, run interactive clarification, generate a speaker profile, create presentations that match your documented patterns, produce the deck illustrations + thumbnail visual layer, and publish talk pages to a Jekyll shownotes site. Includes a 102-entry Presentation Patterns taxonomy (91 observable, 11 unobservable go-live items) for scoring, brainstorming, and go-live preparation.
86
92%
Does it follow best practices?
Impact
86%
1.24xAverage score across 26 eval scenarios
Advisory
Suggest reviewing before use
Slide structure is created by the real PowerPoint app via the BuildDeck macro
(scripts/build-deck.sh), driven by a flat op sequence — never python-pptx, never
the MCP PPT server. The agent emits the ops; BuildDeck executes them. Op
vocabulary and state rules: skills/presentation-creator/references/deckops-spec.md.
Speaker notes MUST be injected as a separate step AFTER all slides are created,
never inline during slide creation. Inject them with the SetSpeakerNotes macro
(scripts/inject-notes.sh) — see Keynote Compatibility below.
The clean deck retains only the template's layout definitions, no demo/sample
slides. BuildDeck deletes the template's demo slides before creating content,
so stripping is not a separate step.
Keynote uses a stricter OOXML parser than PowerPoint. The rules below
prevent generated .pptx files from being rejected on import.
Inject notes via the real PowerPoint app (scripts/inject-notes.sh →
SetSpeakerNotes); it writes the required <p:notesMasterIdLst> element
natively. No manual patch — the python-pptx pass that omitted-then-patched it
is retired. See rules/deck-editing-rules.md.
Connectors emit <p:cxnSp> elements that Keynote's parser may reject. For a
decorative line, emit a thin SHAPE op with a rectangle msoAutoShapeType (a
small height makes it read as a line) — never a connector.
This applies to any residual python-pptx editing of a deck (e.g. the scrim /
title apply pass). Do not create a shape through python-pptx and then delete it
with element.getparent().remove(element) in the same flow — python-pptx's
internal state diverges from the serialized XML and strict parsers (Keynote)
reject the result. If a shape is not needed, do not create it. Narrowly scoped
XML cleanup utilities that remove pre-existing elements are fine — they operate
on elements not managed by python-pptx's in-memory state.
.github
eval-resources
humor-postmortem-blind-spots
qr-bitly-slug-from-outline
qr-missing-shortener-detection
shownotes-publisher-omit-placeholder
shownotes-publisher-publish-no-date
shownotes-publisher-publish-with-date
shownotes-publisher-update-add-video
video-extraction-diagnostics
evals
scenario-1
scenario-2
scenario-3
scenario-4
scenario-5
scenario-6
scenario-7
scenario-8
scenario-9
scenario-10
scenario-11
scenario-12
scenario-13
scenario-14
scenario-15
scenario-16
scenario-17
scenario-18
scenario-19
scenario-20
scenario-21
scenario-22
scenario-23
scenario-24
scenario-25
scenario-26
rules
scripts
skills
illustrations
presentation-creator
references
patterns
build
deliver
prepare
scripts
shownotes-publisher
vault-clarification
vault-ingress
vault-profile
tests