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 111-entry Presentation Patterns taxonomy (81 observable: 62 patterns + 19 antipatterns; 30 unobservable: 21 patterns + 9 antipatterns) for scoring, brainstorming, and go-live preparation.
—
—
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Low
Low-risk findings worth noting
A six-skill presentation system for conference speakers: analyze your existing talks to extract your rhetoric patterns, create new presentations that match your documented style, produce the deck illustrations + thumbnail visual layer, and publish talk pages to a Jekyll shownotes site.
Evidence-exact reparsing — fresh ingress work now uses schema-v5 claims, returns, talk records, and scoring. Every processed talk records an exhaustive outcome for each of the 81 observable catalog entries, bound to the exact live catalog and to owner-validated transcript, slide, video, or metadata evidence. Older generations remain readable history but cannot enter the current scoring cohort by implication.
Defensible absence and ready-to-use classification — all observable entries
declare explicit evidence gates, and the catalog keeps absence decisions source-bound.
Profile schema v5 preserves
each pattern's exact denominator and automatically applies the bundled
speaker-toolkit-default@1 thresholds. A vault may provide a strict optional override.
If that file is present but invalid, profile generation stops instead of silently
falling back. Mastery/novelty, antipattern recurrence, underuse, combinations, trends,
and modes report availability independently. Section 15 readers still accept
occurrence-only v2 blocks, while every replacement writes a policy-bound v3 block.
Safer installed operation — toolkit commands resolve from the installed plugin root and use the vault's configured Python interpreter. A stdlib-only runtime probe reports each source lane independently, while atomic, source-bound transcript quality and timing receipts keep optional enrichment failures from replacing trusted text.
Real PowerPoint deck engine — decks are now created and edited through the
real PowerPoint app (VBA driven via AppleScript), replacing python-pptx and the
MCP PPT server, which had been silently emitting broken .pptx files. A single
DeckOps module covers whole-deck creation, placeholder slides, background
images, speaker notes, and QR insertion; the deterministic pieces (op validation,
slide targeting, color matching) are unit-tested while the PowerPoint automation
layer is validated by opening the deck. macOS + Microsoft PowerPoint.
QR codes that survive deck reuse — the QR step detects an existing QR on any slide and replaces it in place, so a deck trimmed from another talk no longer ends up with a duplicate or a stale code. The short link's back-half is always the talk slug (bit.ly custom back-half and rebrand.ly slashtag), uses the vault's custom domain when one is configured, and the custom-domain decision is captured and saved on the first short link. Slugs are composed date-less, so the QR and the published shownotes page always match.
narrative.md for early review — narrative.md is now a TL;DR plus a
one-line-per-slide walk, generated from a partial outline in Phases 1–2 so the
argument can be reviewed before any slide exists.
Progressive-reveal build expansion — the toolkit now assembles generated
build frames into the deck: a new ExpandBuilds PowerPoint pass replaces each
progressive-reveal parent slide with its frames as full-bleed slides (notes on
the final frame), so a build sequence becomes the sequential slides you advance
through. Pairs with poster-theatrical for pure full-bleed, builds-and-all decks.
Deck tooling works on installed plugins — tessl install strips .bas/.applescript
files, which had left the PowerPoint deck layer dead on any installed copy. The
drivers now ship as committed .txt mirrors and are restored automatically on
first use (sync-deck-drivers.py), so RunDeckOps.bas and the AppleScript
drivers are there when you need them — no manual recovery.
No more per-illustration permission clicks — the background and build passes now stage illustrations into PowerPoint's own sandbox container before applying them, so the "grant access / select file" prompt that used to fire on every slide (once per Google Drive image) collapses to zero — no Full Disk Access grant needed.
Poster-theatrical composition — a style-wizard option where every slide is full-bleed and the title + footer are rendered into the image (stylized, blended), with only the QR code added afterward. No overlaid titles, no safe zones — an "all art, no chrome" look. Chosen in the wizard and baked into the STYLE ANCHOR header.
Idea-sourcing wizard + render-before-bake gate — illustration style strategy
is now an explicit multi-select wizard: pick where the visual ideas come from
(your usual, mode/series match, new, wild, what's trending, or bring your own),
with a Quick-default fast path that still renders and shows. The strategy steps
are individually gated, and a new --check-style-explore verdict plus a guard in
generate-illustrations.py refuse to generate from any model that wasn't rendered
in the exploration grid the speaker reviewed — you can no longer bake a model into
the STYLE ANCHOR by reasoning alone.
Explicit engine & theme sourcing — deck tooling (PowerPoint/pptx vs presenterm
terminal-markdown) is now a first-class Phase 2 decision sourced through the same
wizard, recorded on the outline (talk.engine) instead of inferred at build time.
A live-coding talk that should run in a terminal tool no longer silently becomes a
slide deck.
Structured style selection + model registry — Phase 2 style strategy now
runs as an ordered process: elicit what the speaker optimizes for (cost, speed,
quality, build-editability), narrow the model roster to a priority-driven
shortlist with model_registry.py --shortlist, propose styles, then render a
style × model × format grid into a structured style-explore/ directory with
an index.md contact sheet (generate-illustrations.py --style-explore) for a
visual pick. The model roster moved into a single source of truth,
model_registry.py — a structured registry with vendor aliases (so "nano-banana"
resolves to the canonical Gemini id instead of being dropped on refresh),
per-model attributes, and a deterministic --check-freshness precheck that
SKILL.md Step 2 now runs first and reports, closing the "freshness check never
ran" gap. The roster is a seed cache, not an allowlist: rendering accepts any id
from a supported vendor family, and a web-discovered model can be injected into
the shortlist for one talk via --add without a code edit.
Cross-vendor image generation + model-freshness check — generate-illustrations.py
now dispatches by model-name prefix to three vendor families: Google's
gemini-* / nano-banana-* (generateContent), Google's imagen-* (:predict),
and OpenAI's gpt-image-* (/images/generations and multipart /images/edits).
COMPARE_MODELS refreshed to current flagships including gpt-image-2,
imagen-4.0-ultra-generate-001, gemini-3.1-flash-image-preview, and
nano-banana-pro-preview. New SKILL.md Step 2 web-searches the model
landscape before any image generation runs and proposes re-running
--compare if a newer flagship has shipped since the outline's **Model:**
was last set — closes the months-long gap between picking a model in
Phase 2 and actually generating images in Phase 5.
Talk timer for timemytalk.app — New generate-talk-timings.py parses the
outline's pacing summary into MM:SS Chapter format for the timemytalk.app
delivery timer. Supports --qa flag, sub-minute resolution, and automatic
subdivision of long acts. Phase 6 publishing docs updated.
Keynote compatibility rules — Slide generation rules now document three
python-pptx gotchas that cause Keynote to reject generated .pptx files: use
rectangles not connectors for decorative lines, avoid create-then-remove shape
patterns, keep shape IDs contiguous.
Shownotes publishing destination — Agents can now resolve published shownotes
from publishing_process.shownotes_site in the speaker profile instead of
searching the web. Resources-gathering rules document the read path.
Fixed eval scenarios 12 and 13 with deterministic test data.
Test suite and CI — comprehensive pytest coverage runs on every push and PR via GitHub Actions with ffmpeg, LibreOffice, and Tesseract-backed source lanes.
See CHANGELOG.md for full history.
The toolkit is built on six skills connected by a shared rhetoric vault — a directory of structured knowledge about how you present.
VAULT
(shared data)
+-----------+
Vault skills | summary | Creator skills
(analysis) --> | design | <-- (generation)
| spec |
| profile |
+-----------+Vault skills (analysis):
Creator skills (generation):
speaking.jbaru.ch). Encodes the custom parser's format contract so authored content actually renders: abstract is one paragraph, video field absent = "coming soon" badge, slides/video URLs must be markdown links, no frontmatter title, etc. Invoked after the talk is delivered (or pre-talk for slides-only publish).The vault skills never run simultaneously with the creator skills. You build the vault first (once, then incrementally), then use the creator whenever you need a new talk. The vault grows over time as you parse more talks, and the creator automatically picks up new patterns.
tessl install jbaruch/speaker-toolkitEach talk needs at least one usable source:
.pptx (preferred), local PDF, or Google Drive PDF; orOrganize talk metadata as .md shownotes files in a directory and declare every
source that actually exists. Video is useful but is not a universal eligibility
requirement; ingress records source-limited outcomes as not_evaluable instead of
inventing evidence from an unavailable channel.
Then run:
parse my talksThe vault skill will:
~/.claude/rhetoric-knowledge-vault/ (or ask for a custom location on first run)Once the vault exists, invoke the creator:
create a presentation about [topic] for [conference]The creator will:
Every phase requires your approval before proceeding. The skill brings the rhetoric knowledge; you bring the topic expertise.
All skills are generic — they work for any speaker. All personalization lives in the vault:
| Component | What it defines |
|---|---|
| Skills (this plugin) | Process: phases, gates, output formats, guardrail structure |
| Vault (your data) | Content: what instruments exist, what the speaker sounds like, thresholds to enforce |
The vault lives at ~/.claude/rhetoric-knowledge-vault/ by default. If you prefer a different location (e.g., Google Drive for backup), the skill creates a symlink from the canonical path to your chosen directory. If you don't have a vault yet, the skill creates it from scratch on first run.
The vault lives at ~/.claude/rhetoric-knowledge-vault/ (or a symlink to a custom location). It contains:
rhetoric-knowledge-vault/
+-- tracking-database.json # Source of truth: all talks, status, config
+-- rhetoric-style-summary.md # Narrative analysis across all rhetoric dimensions
+-- slide-design-spec.md # Visual design rules (fonts, colors, layout taxonomy)
+-- speaker-profile.json # Machine-readable bridge to the creator
+-- sessions-catalog.md # Submission-ready titles, abstracts, outlines
+-- analyses/ # Per-talk rhetoric analysis + pattern scoring
+-- transcripts/ # Downloaded YouTube transcripts
+-- slides/ # Downloaded slide PDFsrhetoric-style-summary.md is the constitution — rich prose covering presentation modes, opening patterns, humor techniques, audience interaction styles, closing patterns, verbal signatures, persuasion techniques, and more. It grows every time you parse new talks.
speaker-profile.json is the structured specification that the creator reads at runtime. It contains presentation modes with quantitative thresholds, instrument catalogs, guardrail rules, pacing data, design rules, the publishing workflow, and a pattern_profile with exact positive/negative occurrence rows, per-pattern denominators, source cohort provenance, exhaustive classifications, and independent availability by domain. Schema v5 uses the bundled speaker-toolkit-default@1 policy automatically and embeds the full policy plus its semantic digest. An optional pattern-classification-policy.json overrides it only when the file passes strict validation. Schema-v4 profiles remain readable as occurrence-only history.
slide-design-spec.md captures visual design rules extracted from both PDF inspection and programmatic .pptx analysis: background colors, typography, footer specs, shape vocabulary, and template layout catalog.
The skills communicate exclusively through the vault files plus
per-talk artifacts (outline.yaml, _talks/*.md). When the vault
updates (new talks parsed), it regenerates the speaker profile. When
a downstream skill runs, it reads the latest vault state and the
talk's spec. A freshness check warns if the profile is stale.
Vault skills (analysis) Downstream skills (generation + publish)
======================= =======================================
vault-ingress ----+
vault-clarification +--> rhetoric-style-summary.md --> presentation-creator
vault-profile ----+ slide-design-spec.md illustrations
speaker-profile.json (via outline.yaml)
(incl. pattern_profile)
presentation-creator
produces outline.yaml
|
v
shownotes-publisher
reads outline.yaml +
resources.json, writes
_talks/<file>.mdThe plugin ships persistent rules (auto-loaded by the agent at runtime via .tessl-plugin/plugin.json → rules). Keep this table in sync with the manifest:
| Rule | Scope |
|---|---|
vault-language-policy | Vault analysis prose conventions and forbidden phrasings. |
slide-generation-rules | .pptx generation gotchas and Keynote compatibility constraints. |
deck-editing-rules | Structural edits (delete/reorder/import) to illustrated decks via real PowerPoint (macOS), not python-pptx. |
guardrail-rules | Creator guardrail checks (slide budget, Act 1 ratio, profanity, branding, antipattern scan). |
illustration-rules | Edit vs regenerate asymmetry, build chains, iteration hygiene. |
qr-generation-rules | QR step contract: always via generate-qr.py, slug back-half, shortener-URL encoding, artifact cataloging, custom-domain save, in-place replacement. |
title-overlay-rules | Title-safe-zone composition policy for FULL illustrations. |
thumbnail-generation-rules | Phase 7 thumbnail composition specifics. |
resources-gathering-rules | Phase 6 shownotes / resources read paths. |
interaction-rules | Conversational stance and gate behavior across phases. |
tessl-version-floating | Authority-of-record for the tessl.json floating-spec carve-out (paired with scripts/check_tessl_pins.py). |
shownotes-content-publish | Authority-of-record for the shownotes content direct-push carve-out (paired with skills/shownotes-publisher/scripts/content-only-gate.sh). |
transcript-fetch-authority | Authority-of-record for the Whisper layer's platform-bound untestable carve-out (paired with skills/vault-ingress/scripts/fetch-transcript.py). |
The vault skills (vault-ingress, vault-clarification,
vault-profile) share the analysis triggers and processing pipeline
below.
parse my talks / run the rhetoric analyzeranalyze my presentation stylehow many talks have been processedupdate the rhetoric knowledge base / check rhetoric vault statusprocess remaining talks for style patternsgenerate my speaker profile / update speaker profileEach talk is analyzed across:
Each dimension is cross-referenced with the Presentation Patterns taxonomy — the analysis notes which named patterns and antipatterns are detected per talk.
python_path, with core PyYAML;
pypdf + exactly psutil==7.2.2 for supervised PDF evidence; and
python-pptx + the same exact psutil version for resource-supervised
native-deck evidence. Preserved source-video evidence uses the separate
source-video runtime lane with exactly psutil==7.2.2 plus ffprobegdown for Google Drive acquisition,
youtube-transcript-api for captions, yt-dlp for provider probing/audio
download, pdftoppm for rendered-PDF inspection, Pillow + imagehash +
ffmpeg/ffprobe for video extraction, and optional mlx-whisper for local
Whisper fallbackInstalled plugin bundles do not include pyproject.toml; README and the
vault-ingress skill are the runtime authority. After python_path is
bootstrapped, run its stdlib-only check-runtime.py probe. Optional lane
dependency absence is isolated: missing pypdf cannot erase transcript/PPTX
capability, and missing python-pptx cannot erase transcript/PDF capability.
Dependency initializer exceptions, native crashes, timeouts, and invalid child
results remain lane-local and carry machine-readable failure reasons.
The checker emits report schema v2; each lane's required_module_versions
declares exact runtime pins, and an incompatible installed version is unavailable
rather than silently accepted.
The downstream skills (presentation-creator, illustrations,
shownotes-publisher) build new talks from vault data + per-talk
intent, generate the visual layer, and publish the talk page to the
shownotes site. presentation-creator is the entry point; the other
two are invoked via typed Skill(...) handoffs.
create a presentation about [topic]build a talk for [conference]write a CFP for [conference]adapt my [talk name] for [new venue]publish shownotes / add talk to shownotes / shownotes for [talk]update shownotes with the recording (once the video URL lands)presentation-creator Phase 6 when the
speaker says "now publish to shownotes"| Phase | What happens | Gate |
|---|---|---|
| 0: Intake | Load vault + pattern index, gather context | Topic and context captured |
| 1: Intent Distillation | Clarifying questions, produce Presentation Spec | Author confirms spec |
| 2: Rhetorical Architecture | Joint instrument selection + Pattern Strategy | Author approves architecture |
| 3: Content Development | Section-by-section outline with speaker notes | Draft delivered |
| 4: Revision & Guardrails | Iterate on feedback, run guardrail checks + antipattern scan | Author declares outline done |
| 5: Slide Generation | Build .pptx from outline using speaker's template | Author declares slides done |
| 6: Publishing | Export, shownotes, QR code, go-live checklist | Published and ready to deliver |
source_lane: "non_pattern")[CONTEXTUAL] always; [RECURRING] only when the profile's antipattern-recurrence domain is available[SKIP] otherwise)The creator includes a structured reference taxonomy of 111 presentation patterns and
antipatterns from Presentation Patterns (Ford, McCullough, Schutta 2013) supplemented
by Presentation Zen (Reynolds, 2nd ed. 2012), Resonate (Duarte 2010), Make It Stick
(Brown, Roediger, McDaniel 2014), The Whole Brain Business Book (Herrmann, 2nd ed.
2015), and a small set of vault-derived patterns observed
across the corpus (delayed-self-introduction, three-part-close, progressive-reveal,
anti-sell, meme-as-argument, second-look), organized by presentation lifecycle:
Of the 111 entries, 81 are observable (62 patterns + 19 antipatterns): directly detectable through their declared transcript, slide, or video locator channels, with allowlisted source metadata only as corroboration. The other 30 are unobservable (21 patterns + 9 antipatterns): pre-event logistics, hidden authoring/provenance processes, physical stage behaviors, post-event follow-up, and external systems the current artifacts cannot prove.
All 81 observable entries explicitly declare positive, strong, and absence source gates.
Only 16 currently permit an undetected/absence outcome: 11 from a fully inspected,
separately declared rendered PDF and 5 from a fully inspected transcript. The other 65
are positive-only and fail closed to not_evaluable on non-detection. Sampled,
deduplicated video-extracted slide PDFs remain valid positive evidence but are never
absence-complete; native decks, generic delivery-video roles, and comparison groups also
remain outside absence denominators until versioned capability/alignment receipts exist.
How it integrates:
| Integration point | Observable entries (81: 62 patterns + 19 antipatterns) | Unobservable entries (30: 21 patterns + 9 antipatterns) |
|---|---|---|
| Vault scoring (Step 3 B2) | Exhaustive per-talk outcomes aggregate into source-exact pattern_profile occurrence rows | Excluded from scoring |
| Creator Phase 2 | Four history tiers from an available mastery/novelty domain; flat current taxonomy for an older, missing, or unavailable domain | Included in recommendations |
| Creator Phase 4 | [CONTEXTUAL] flags always; [RECURRING] only when the antipattern-recurrence domain is available | Excluded from scan |
| Creator Phase 6 | — | Go-live preparation checklist |
| Speaker profile | Schema-v5 pattern_profile with opportunity-aware occurrence rows, a self-contained policy stamp, exhaustive classifications, and per-domain availability | Not in profile |
| Summary-only mode | Flat relevant-patterns list from reference files | Go-live checklist still applies |
If the speaker profile doesn't exist yet (fewer than 10 talks parsed), the creator runs in summary-only mode — drawing instruments from the rhetoric summary prose, using default guardrail thresholds, and asking for template/publishing details interactively. The pattern taxonomy still works as a flat relevant list without usage or novelty claims, and the go-live checklist still applies.
psutil==7.2.2, gdown, and youtube-transcript-api for the source lanes
actually usedyt-dlp, pdftoppm, ffmpeg, and ffprobe for the provider/download,
rendered-PDF, and video lanes that require them; optional mlx-whisper for
local Whisper fallbackDeckOps.pptm macro setup: skills/presentation-creator/references/deck-editing-setup.mdpython-pptx (extraction reads + the illustration scrim/title apply pass)~/Projects/shownotes
by default). The site must use the custom markdown parser plugin
this skill targets; see
skills/shownotes-publisher/references/parser-contract.mdbundle exec jekyll build available locally for the Step 8 validationgh CLI for the branch + PR publish flow (and for direct push under
the ci-safety Content-Only Direct-Push Carve-Out when the target
repo has it wired)speaker-toolkit/
+-- .tessl-plugin/plugin.json
+-- README.md
+-- CHANGELOG.md
+-- pyproject.toml # Dependencies + pytest config
+-- tests/ # Deterministic pytest unit and integration coverage
| +-- conftest.py # Script import helpers + PPTX fixtures
| +-- test_*.py # Runtime, contract, docs, and packaging regressions
+-- .github/workflows/
| +-- tests.yml # pytest on push/PR (ffmpeg + LibreOffice)
| +-- publish.yml # Tessl skill review + publish
+-- skills/
+-- vault-ingress/
| +-- SKILL.md # Main vault workflow (9 steps)
| +-- scripts/
| | +-- artifact_metadata.py # shared bounded metadata + cloud/reparse policy
| | +-- pdf_evidence.py # supervised exact-generation PDF evidence
| | +-- video_evidence.py # supervised exact-generation source-video evidence
| | +-- pptx-extraction.py # supervised PPTX extraction + bounded discovery
| | +-- video-slide-extraction.py # Video-to-slides via ffmpeg + perceptual dedup
| | +-- vtt-cleanup.py # WebVTT to plain text
| | +-- batch-download-videos.sh # Parallel video download for batch processing
| +-- references/
| +-- bootstrap-and-preflight.md # Runtime, discovery, migration, and preflight contract
| +-- queue-selection.md # Deterministic selection, claim, and lease contract
| +-- batch-persistence.md # Batch validation, atomic persistence, and rendering order
| +-- pptx-followup.md # Native-deck extraction and catalog follow-up
| +-- clarification-handoff.md # Post-processing clarification handoff
| +-- source-identity-preflight.md # Source ownership, artifact authority, and repair routing
| +-- rhetoric-dimensions.md # 14 analysis dimensions + pattern cross-refs
| +-- schemas-db.md # DB, subagent, and extraction output schemas
| +-- video-slide-extraction.md # Layout heuristics, tuning tables, limitations
| +-- processing-rules.md # Language policy, pattern migration logic
+-- vault-profile/
| +-- SKILL.md # Machine-readable speaker profile workflow
| +-- references/
| +-- profile-construction-rules.md # Cohort, merge, trend, and diff authority
+-- presentation-creator/
| +-- SKILL.md # Main creator workflow (7 phases)
| +-- scripts/
| | +-- generate-qr.py # QR generation + bg-color match (insert via InsertQR)
| | +-- extract-resources.py # Resource link extraction from outlines
| | +-- guardrail-check.py # Outline guardrail validation
| | +-- export-pdf.py # Export deck to PDF (PowerPoint or LibreOffice)
| | +-- validate-deckops.py # Validate a deck op sequence before BuildDeck (tested)
| | +-- build-deck.sh # Wrapper for BuildDeck (whole-deck creation via real PowerPoint)
| | +-- build-deck.applescript # AppleScript driver for BuildDeck (reads ops as UTF-8)
| | +-- RunDeckOps.bas # VBA: BuildDeck + trim/reorder/import/notes/bg/placeholder/QR via real PowerPoint
| | +-- run-deck-ops.sh # Wrapper for RunDeckOps (staging + move into place)
| | +-- run-deck-ops.applescript # AppleScript driver for RunDeckOps
| | +-- make-bg-slide.sh # Wrapper for MakeBgImageSlide (illustration -> bg slide)
| | +-- make-bg-slide.applescript # AppleScript driver for MakeBgImageSlide
| | +-- make-placeholder-slide.sh # Wrapper for MakePlaceholderSlide (yellow [PLACEHOLDER] slide)
| | +-- make-placeholder-slide.applescript # AppleScript driver for MakePlaceholderSlide
| | +-- apply-backgrounds.sh # Wrapper for ApplyBackgrounds (bulk FULL-slide bg fills)
| | +-- apply-backgrounds.applescript # AppleScript driver for ApplyBackgrounds
| | +-- backgrounds-manifest-to-spec.py # Manifest JSON -> ApplyBackgrounds spec (tested)
| | +-- inject-notes.sh # Wrapper for SetSpeakerNotes (notes via real PowerPoint)
| | +-- inject-notes.applescript # AppleScript driver for SetSpeakerNotes (reads notes as UTF-8)
| | +-- notes-to-packed.py # Notes JSON -> SetSpeakerNotes wire format (tested)
| | +-- insert-qr.sh # Wrapper for InsertQR (QR PNG bottom-right via real PowerPoint)
| | +-- insert-qr.applescript # AppleScript driver for InsertQR
| +-- references/
| +-- phase0-intake.md through phase7-post-event.md # Phase detail docs
| +-- patterns/ # Presentation Patterns taxonomy (111 entries)
| +-- _index.md # Master index, phase mapping, dimension lookup
| +-- prepare/ # 20 patterns + 4 antipatterns
| +-- build/ # 41 patterns + 10 antipatterns
| +-- deliver/ # 22 patterns + 14 antipatterns (14 unobservable)
+-- illustrations/
| +-- SKILL.md # Visual layer workflow (7 mode-routed steps)
| +-- scripts/
| | +-- model_registry.py # Model roster, aliases, attributes; --check-freshness + --shortlist
| | +-- generate-illustrations.py # Illustration generator + model comparison + style exploration + builds
| | +-- apply-illustrations-to-deck.py # Swap into deck, reposition title, position IMG+TXT
| | +-- suggest-scrim-color.py # Sample deck-tuned scrim color from illustrations
| | +-- generate-thumbnail.py # YouTube thumbnail via Gemini composition
| +-- references/
| +-- strategy.md # Phase 2 D#11 — priorities, model shortlist, style proposals, exploration render
| +-- generation.md # Setup, edit/fix workflow, format vocabulary, apply-to-deck
| +-- builds.md # Backwards-chained build generation + deck insertion
| +-- thumbnails.md # Phase 7 thumbnail composition + slide selection
| +-- style-explore-candidates-schema.md # candidates.json contract for --style-explore
| +-- title-placement.md # Outline schema + scripts for Safe-zone title placement
+-- shownotes-publisher/
+-- SKILL.md # Jekyll shownotes publish workflow (9 steps)
+-- references/
+-- parser-contract.md # `_plugins/markdown_parser.rb` capture rules per extracted_* field
+-- template-conditionals.md # `talk.html` conditional rendering per extracted field
+-- common-mistakes.md # 13 failure modes (1, 1b, 1c, 2-11) with right-way fixesMIT
.tessl-plugin
rules
skills
illustrations
presentation-creator
references
patterns
build
deliver
prepare
scripts
shownotes-publisher
vault-clarification
vault-ingress
references
scripts
vault-profile