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
Reference for Step 4 (deck illustrations) and Step 6 (apply to deck) in
SKILL.md. The illustration-rules and title-overlay-rules steering rules
are auto-loaded — apply them, don't restate them.
Before generating, ensure:
API key(s) — the script dispatches by model-name prefix:
gpt-image-* → OpenAI; imagen-* and gemini-* / nano-banana-* →
Google. Add whichever keys the run will actually use to
{vault}/secrets.json (preferred):
{
"gemini": { "api_key": "your-google-key" },
"openai": { "api_key": "your-openai-key" }
}For single-model generation (generate, --edit, --build, --fix),
only the key for the outline's baked **Model:** vendor is required —
the other can be omitted. For --compare, every vendor in COMPARE_MODELS
is hit; for --style-explore, every vendor among the candidates.json
models is hit — provide all corresponding keys (the current roster spans
both Google and OpenAI, so both are usually needed).
Env-var fallbacks: GEMINI_API_KEY, OPENAI_API_KEY. Get keys from
https://aistudio.google.com/app/apikey (Google) and
https://platform.openai.com/api-keys (OpenAI).
Model availability — verify the model in the outline header is
accessible with your key. The script reads it from the
**Model:** \model-name`line in the Illustration Style Anchor section. Imagen models have no edit endpoint —--edit, --build, and --fix`
require a Gemini or OpenAI model.
Python 3 — stdlib only (urllib, json, base64, uuid). No pip
install needed.
python3 skills/illustrations/scripts/generate-illustrations.py presentation-outline.md remainingremaining skips slides whose images already exist; all regenerates every
slide; specific slides can be passed as 2 5 9 or a range 2-10.
Phase 2 strategy uses --style-explore (renders candidate styles × the
priority-driven model shortlist × formats into a structured style-explore/
grid) — see strategy.md Sub-steps 3 and 5.
--compare remains a quick single-slide model spot-check: it renders one
slide's prompt across the cached COMPARE_MODELS roster.
python3 skills/illustrations/scripts/generate-illustrations.py presentation-outline.md --compare 2Output lands in illustrations/model-comparison/. The roster, vendor aliases,
and per-model attributes live in skills/illustrations/scripts/model_registry.py.
| Command | When to use | Output |
|---|---|---|
--edit N "<prompt>" | Removing content from an existing image | slide-NN-vM.ext |
--fix N "<prompt>" | Iterating on a near-perfect image (90%+ correct) | slide-NN-vM.ext (next version) |
-v 2 5 9 | Generate without overwriting the base image | slide-NN-vM.ext |
--edit and --fix auto-append the safety suffixes (DO NOT add any new elements, Let background continue naturally). The explicit preservation
list (Keep the X. Keep the Y.) must always be added manually — the script
cannot know what to preserve.
The outline's Illustration Style Anchor block defines format codes per slide.
The apply-illustrations-to-deck.py script maps each code to a layout +
positioning:
| Outline Format | Layout | Image Handling |
|---|---|---|
FULL | BLANK | Full-bleed image at 16:9 slide dimensions (left=0, top=0, width=13.333", height=7.5"); title repositioned into the declared Safe zone |
FULL + text overlay | BLANK | Full-bleed image + text overlay |
IMG+TXT | TITLE only (no body) | Image ~60% of slide on the left, title + body on the right. Exact geometry is owned by the IMGTXT_* constants in skills/illustrations/scripts/apply-illustrations-to-deck.py (image left=0.3", top=0.8", width=8.0", height=5.9"; text column left=8.5", width≈4.5") — read the constants when debugging layout, not the table |
EXCEPTION | Per content type | No generated image — real asset from [IMAGE NN] placeholder; handled by presentation-creator's slide walk, not by this skill |
{talk-dir}/illustrations/
├── slide-01.jpg ← one file per illustrated slide
├── slide-02.png
├── slide-05-v2.jpg ← versioned iterations (--fix / --edit / -v)
├── builds/ ← progressive reveal build steps (see builds.md)
│ ├── slide-05-build-00.jpg
│ ├── slide-05-build-01.jpg
│ └── slide-05-build-02.jpg
└── model-comparison/ ← --compare output
{talk-dir}/style-explore/ ← --style-explore output (Phase 2 strategy)
├── candidates.json ← agent-written input (styles × shortlist × formats)
├── index.md ← contact sheet grouping every render by style
└── <style-slug>/<format>/<model>.<ext>The Safe zone: line in each FULL slide block tells the script to append a
TITLE SAFE ZONE directive to the prompt before generation. Five zones are
supported: upper_third, middle_third, lower_third, left_half,
right_half. See skills/illustrations/references/title-placement.md
for the outline schema and rules/title-overlay-rules.md
for the full policy (auto-loaded).
python3 skills/illustrations/scripts/apply-illustrations-to-deck.py \
deck.pptx illustrations/ presentation-outline.md \
--out deck-with-titles.pptx \
--scrim-color 100903 --scrim-alpha 47553 # omit for plain 45% blackThe script:
Safe zone: field), records the illustration in a
backgrounds manifest (--backgrounds-out, default <out_stem>.backgrounds.json)
for the PowerPoint background pass below — it does NOT insert a picture shape.Format: IMG+TXT, applies the IMG+TXT layout
(image ~60% on the left as a picture shape, title placeholder + body on the right).- Builds: block.Then set the FULL-slide backgrounds via the real PowerPoint app, so each illustration becomes the slide BACKGROUND FILL (covered by the layout's halftone-dot overlay) and survives — a python-pptx round-trip would drop it. Run this as the FINAL write of the build, AFTER speaker notes are injected:
# operate on a uniquely-named copy — PowerPoint keys open decks by filename
cp deck-with-titles.pptx deck-bg-src.pptx
skills/presentation-creator/scripts/apply-backgrounds.sh \
deck-bg-src.pptx deck-final.pptx deck-with-titles.backgrounds.jsonmacOS + Microsoft PowerPoint only; see rules/deck-editing-rules.md.
If no scrim color is supplied, run python3 skills/illustrations/scripts/suggest-scrim-color.py illustrations/
first to sample a deck-tuned color. For warm or cool styled decks, the
sampled color reads as "deeper shadow in the same style" instead of a flat
black film.
.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