Four-skill presentation system: ingest talks into a rhetoric vault, run interactive clarification, generate a speaker profile, then create new presentations that match your documented patterns. Includes an 88-entry Presentation Patterns taxonomy for scoring, brainstorming, and go-live preparation.
96
93%
Does it follow best practices?
Impact
97%
1.21xAverage score across 30 eval scenarios
Advisory
Suggest reviewing before use
Before ANY Phase 6 action, load these 4 files. If any is missing, STOP and ask.
speaker-profile.json — publishing config, shortener, URL patterns, QR settingssecrets.json — API keys (bitly, rebrandly, gemini). Missing key = stop, not fallback.presentation-spec.md — talk slug, duration, mode. Source of truth for the slug.presentation-outline.md — the outline (slide references, shownotes URL text)Do not guess values that should come from these files. Do not proceed with partial context — every silent assumption becomes a wrong default downstream.
The publishing workflow is speaker-specific. Read publishing_process from
speaker-profile.json. Read the talk slug and metadata from presentation-spec.md
in the talk directory (saved in Phase 1). If the section is missing or empty,
fall back to asking the author interactively and document their answers for
next time.
Extract and curate resource links from the finalized outline before any publishing step. Resources scattered across speaker notes, visual descriptions, and Coda slides are easy to miss — this step catches them systematically.
Run the extraction script against the finalized outline:
python3 skills/presentation-creator/scripts/extract-resources.py \
presentation-outline.md --spec presentation-spec.mdThe script produces resources.json in the talk working directory with
categorized entries: URLs, repos, books/papers, RFCs, and tool mentions.
Each entry includes slide references and context.
Present the extracted resources to the speaker as a formatted review list, grouped by type. Coda section items are flagged and listed first — the speaker deliberately chose to surface them.
The speaker reviews, approves, removes false positives, adds missing items,
and edits entries. Save the approved list back to resources.json with
approved: true on accepted items.
Update tracking-database.json with a resources[] entry recording the
talk slug, item count, and category breakdown.
If the speaker declines resource gathering, skip this step — Step 6.1 will omit the resource links section from shownotes.
Read publishing_process.shownotes_publishing. If enabled:
method description (git push, CMS, manual)shownotes_repo_path and shownotes_template are provided, generate the pageresources.json exists and has approved: true items, include a
"Resources" section with those links. Read from resources.json in the
talk working directory (produced by Step 6.0) — do not re-scan the outline.shownotes_url_pattern from the speaker profile. The slug
was agreed with the author in Phase 1 — NEVER invent or rephrase it. Example:
pattern speaking.example.com/{slug} + spec slug arc-of-ai →
speaking.example.com/arc-of-aiIf not enabled, skip.
Read publishing_process.qr_code. If enabled:
Determine the URL to encode:
target is shownotes_url, use the shownotes URL from Step 6.1target is custom_url, use the custom_url fieldResolve URL shortening using one of these paths:
| Path | Short URL resolution | QR image |
|---|---|---|
| MCP (preferred when configured) | Agent calls Bitly/Rebrandly MCP tool, passes --short-url to script | Script generates locally from the resolved URL |
| Direct API | Script calls bit.ly/rebrand.ly REST API via secrets.json | Script generates locally |
| None | Script uses the raw shownotes URL | Script generates locally |
MCP path (preferred when Bitly or Rebrandly MCP server is installed):
npx @bitly/mcp — covers link creation, update, QR, and analyticsgenerate-qr.py via --short-urlDirect API path (when MCP is not available):
{vault_root}/secrets.json with chmod 600:
{
"gemini": {"api_key": "..."},
"bitly": {"api_token": "..."},
"rebrandly": {"api_key": "..."}
}secrets.json and calls the shortener's REST API directlyshortener field in the profile controls which service to useNone path (no shortening):
Run the QR generation script:
# MCP-preresolved mode:
python3 skills/presentation-creator/scripts/generate-qr.py deck.pptx \
--talk-slug SLUG --short-url https://bit.ly/arcofai
# Direct API mode:
python3 skills/presentation-creator/scripts/generate-qr.py deck.pptx \
--talk-slug SLUG --shownotes-url https://jbaru.ch/arc-of-ai \
--vault /path/to/vault
# No shortening:
python3 skills/presentation-creator/scripts/generate-qr.py deck.pptx \
--talk-slug SLUG --shownotes-url https://jbaru.ch/arc-of-ai
# PNG-only (no deck — for presenterm, PDF, or standalone use):
python3 skills/presentation-creator/scripts/generate-qr.py --png-only \
--talk-slug SLUG --shownotes-url https://jbaru.ch/arc-of-ai \
--output /path/to/qr.png --bg-color 128,0,128The script will:
tracking-database.json with the QR metadata in the qr_codes[] arrayRe-running for the same talk_slug with a different target URL will PATCH the
existing short link (keeping QR codes already printed valid) rather than creating
a new one.
No raw-dogging: NEVER bypass generate-qr.py with hand-rolled python-pptx or
direct qrcode library calls. If the script targets the wrong slides, uses the wrong
shortener, or produces the wrong colors — fix the inputs (profile config, secrets,
arguments), don't patch the outputs with ad-hoc code. The script is the single source
of truth for QR generation; working around it silently drops shortening, tracking,
and color matching.
Dependencies: pip install qrcode (Pillow is already a transitive dep of python-pptx).
Read publishing_process.export_format and publishing_process.export_method.
export_script is provided, run it (substituting the deck path)export_method is a description, follow its instructionsOptional step: generate this artifact when presentation-outline.md
includes a ## Pacing Summary table. If that section is absent, skip this step
unless the author explicitly asks for a talk timer file.
Source: the ## Pacing Summary table in presentation-outline.md.
Generate a plain-text timing file for timemytalk.app by running:
python3 skills/presentation-creator/scripts/generate-talk-timings.py \
presentation-outline.md --output talk-timings.txt
# If the talk slot includes Q&A time:
python3 skills/presentation-creator/scripts/generate-talk-timings.py \
presentation-outline.md --qa 5 --output talk-timings.txtFormat: one line per chapter, MM:SS Label, using cumulative start times.
The final line is always MM:SS FINISH where the timestamp equals the total
talk duration (including Q&A if applicable).
Granularity guidelines:
## Section headers to pacing entries by name overlap)Q&A: if the talk slot includes Q&A time, pass --qa MINUTES to append a
Q&A chapter before FINISH.
The speaker uploads the resulting .txt file to timemytalk.app before delivery.
Read publishing_process.additional_steps[]. For each entry:
automated is true and script is provided, run itautomated is false, present the step to the author as a manual TODOBefore delivery, surface unobservable patterns from patterns/_index.md (the "Unobservable Patterns — Go-Live Checklist" section) as a preparation reminder. These are patterns the vault cannot score retroactively because they involve pre-event logistics, physical stage behaviors, or external systems — but they still matter for delivery quality.
GO-LIVE CHECKLIST — {talk title}
==================================
PRE-EVENT:
[ ] Preparation — backups, cables, hydration, room layout check
[ ] Carnegie Hall — completed 4 rehearsals (pace, delivery, fixes, groove)
[ ] The Stakeout — staging area identified near venue
[ ] Posse — supporter(s) confirmed for front row
[ ] Seeding Satisfaction — plan to arrive early and mingle
[ ] Shoeless — comfort ritual ready
DURING DELIVERY:
[ ] Lightsaber — if laser pointer needed, max 2-3 steady moments
[ ] Red/Yellow/Green — exit feedback cards set up (if venue supports)
AVOID:
[ ] Laser Weapons — don't wave the pointer; use built-in highlights
[ ] Bunker — step out from behind the podium
[ ] Backchannel — don't monitor social media during the talk
==================================PUBLISHING REPORT — {talk title}
==================================
[DONE/SKIP] Resources: {N approved items from resources.json, or "skipped"}
[DONE/SKIP] Shownotes: {url or "not configured"}
[DONE/SKIP] QR code: {inserted at slide N, encoded URL, shortener used}
[DONE/SKIP] Export: {format} → {output path}
[DONE/SKIP] Talk timer: {output path, or "no pacing summary in outline"}
[DONE/SKIP/TODO] {additional step name}: {status}
[INFO] Go-live checklist: {presented above}
==================================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
scenario-28
scenario-29
scenario-30
rules
skills
presentation-creator
references
patterns
build
deliver
prepare
scripts
vault-clarification
vault-ingress
vault-profile