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.
78
91%
Does it follow best practices?
Impact
77%
1.18xAverage score across 27 eval scenarios
Advisory
Suggest reviewing before use
Reference for Step 5 (builds) and the build-insertion portion of Step 6
(apply to deck). The illustration-rules Build Process section is auto-loaded
— this file covers the script contract and deck insertion.
illustrations/slide-NN.ext).N-1.N-1 output as input, remove the next element → that's N-2.build-00 (empty frame with title/borders only).This backwards approach produces better results than building up from empty, because the model preserves the existing composition and style at each step.
python3 skills/illustrations/scripts/generate-illustrations.py outline.yaml --build 5 # one slide
python3 skills/illustrations/scripts/generate-illustrations.py outline.yaml --build all # all buildsOutput: illustrations/builds/slide-NN-build-MM.jpg.
Each build step in outline.yaml carries two fields. desc is the additive,
human-facing reveal ("Add the third panel") — it renders in slides.md and the
script. erase is the erase instruction that turns the next stage into this
one (backwards chaining), and it is the prompt --build actually sends to the
image model. "Panel 2 revealed — sergeant, STILL? stamp" does not tell the model
to erase anything, so the element survives and the stage comes out identical to
the previous one.
erase names what to ERASE, then lists what to KEEP — one Keep clause per
element that must persist (page chrome, frames, already-revealed panels,
borders, labels). This is component #3 of the Edit Prompt Safety rule, and it
is mandatory: --build validates that every non-final step's erase carries
a Keep clause and skips the slide with an error if one is missing.erase prompt.image_prompt — the chrome
that never appears in any build step (header bars, FIG labels, rules) is
exactly what drifts when it isn't named.DO NOT add any new elements, let background continue naturally) are auto-appended by the script — don't repeat them.erase_region — pixel-stable static backgroundsA step may also carry an optional erase_region: a normalized
[x0, y0, x1, y1] bounding box (0..1, origin top-left) around the element being
erased. It is the fix for build drift: a maskless edit redraws the whole
frame, so a static background can shift or lose elements between frames even
with a Keep clause. With erase_region, --build confines the change to the
box — OpenAI receives a real edit mask, and for both vendors the result is
composited back over the prior frame, so every pixel outside the box is the
source pixel exactly. The box is still redrawn by the model (the erased area
shows real background, not a flat fill).
Use it whenever a build has a background that must not move (conveyors,
baseplates, panel frames, blueprint chrome). Omit it for free-form scenes where
whole-frame regeneration is fine. The progress line marks masked steps
build-NN [masked]. The final (full-image) step is a verbatim copy and never
takes a region.
builds:
- step: 1
desc: "Panel 1 content + PLUGIN USELESS? stamp"
erase: 'Erase Panel 2 and the "STILL?" stamp. Keep the page chrome. Keep the three panel frames and labels. Keep Panel 1 content.'
erase_region: [0.34, 0.18, 0.66, 0.82] # the middle (Panel 2) column onlyExample (slide with three trial panels revealed progressively):
builds:
- step: 0
desc: "Empty trial panels — three labeled frames, no content"
erase: 'Erase Panel 1 content and the "PLUGIN USELESS?" stamp. Keep the page chrome. Keep the three empty panel frames and their TRIAL labels.'
- step: 1
desc: "Panel 1 content + PLUGIN USELESS? stamp"
erase: 'Erase Panel 2 and the "STILL?" stamp. Keep the page chrome. Keep the three panel frames and labels. Keep Panel 1 content.'
- step: 2
desc: "Panel 2 content + STILL? stamp"
erase: 'Erase Panel 3 and the "LIFT +81 PTS" stamp. Keep the page chrome (header bar, FIG label, bottom rule). Keep the three panel frames and their TRIAL labels. Keep Panel 1 and Panel 2 content.'
- step: 3
desc: "Panel 3 content + LIFT +81 PTS stamp — full slide"For near-perfect results, use --fix for targeted corrections rather than
regenerating the entire chain.
Build slides are inserted via the ExpandBuilds VBA pass (real PowerPoint —
structural slide insertion never uses python-pptx, per rules/deck-editing-rules.md):
# 1. Emit the build-expansion manifest from the outline + generated frames.
# Pass --notes <notes.json> so each parent's speaker notes ride onto its
# FINAL frame (expansion drops the parent slide, so notes must be carried).
python3 skills/illustrations/scripts/build-expansion-manifest.py \
outline.yaml illustrations/builds/ \
--notes notes.json --out builds-manifest.json
# 2. Expand: replace each parent slide with its frames as full-bleed bg-fill slides
skills/presentation-creator/scripts/expand-builds.sh \
<deck-copy.pptx> <deck-expanded.pptx> builds-manifest.jsonExpandBuilds processes parents descending so inserting one parent's frames
doesn't shift lower-numbered parents. Ordering: run it BEFORE the by-index
passes (inject-notes.sh, apply-backgrounds.sh, insert-qr.sh) — expansion
renumbers every slide after a build parent, so those passes must key on the
POST-expansion deck. Build parents' notes are applied to the final frame by
ExpandBuilds itself (from --notes), so the later inject-notes.sh pass must
NOT also target those original parent indices.
Build slides are inserted as separate slides in the deck (not PowerPoint animations). Each step is a full-bleed image:
| Step | Source | Layout | Notes |
|---|---|---|---|
build-00 | builds/slide-NN-build-00.jpg | BLANK | Empty frame — first slide shown |
build-01 | builds/slide-NN-build-01.jpg | BLANK | First element revealed |
| ... | ... | BLANK | Progressive reveals |
build-N | Copy of slide-NN.ext | BLANK | Full image — final reveal |
Insertion rules:
build-00, build-01, ..., build-N.left=0, top=0, width=13.333", height=7.5").build-N) is visually identical to the parent
slide. In the deck, the parent slide is replaced by its build sequence
— not duplicated after it..tessl-plugin
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
scenario-27
rules
skills
illustrations
presentation-creator
references
patterns
build
deliver
prepare
shownotes-publisher
vault-clarification
vault-ingress
vault-profile