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
Steering rules for Phase 6 Step 6.0 — extracting and curating resource links from a presentation outline.
ALWAYS use extract-resources.py for initial resource extraction. Do not
manually scan the outline first — the script handles URL detection, repo
matching, book patterns, RFC citations, and tool mentions consistently.
Manual scanning misses items and introduces inconsistency.
Use the installed-root, configured-interpreter command in
skills/presentation-creator/references/phase6-publishing.md; do not duplicate
or improvise its invocation here.
The extracted list is candidates, not the final resource list. The speaker MUST review, approve, edit, or remove items before any publishing step uses them. Never auto-publish extracted resources without explicit speaker approval.
Present the extracted resources in a formatted, reviewable list grouped by type. The speaker may:
approved: true)Resources from Coda slides (closing/further-reading sections) are the most intentional — the speaker deliberately chose to surface them. Sort these higher in the review list and flag them as "from Coda section."
resources.json lives in the talk working directory alongside
outline.yaml. It is talk-specific, not vault-level. Path:
{presentations-dir}/{conference}/{year}/{talk-slug}/resources.json.
When shownotes are enabled (Step 6.1), the shownotes generation step reads
resources.json for the resource links section. Only approved: true items
are included. If resources.json doesn't exist or has no approved items,
the resource links section is omitted from shownotes.
The script deduplicates URLs and repos. If a GitHub repo URL appears as both a full URL and a repo reference, keep only the URL entry. When the speaker adds resources manually, check for duplicates before appending.
After resources are approved, prepare a complete resources[] record with
exactly these fields:
schema_version: exact integer 1.talk_slug: non-empty string without leading or trailing whitespace.item_count: exact non-negative integer.category_breakdown: object mapping non-empty category names without leading
or trailing whitespace to exact non-negative integer counts. Use urls,
repos, tools, books, and rfcs for the standard categories.item_count must equal the sum of the non-negative integer category counts.
Persist the record only with the ingress owner's upsert_resource mutation,
expecting the exact existing record for the slug or {"$missing": true}. In
the same typed plan, use update_talk_publishing for any talk publishing flags,
with exact field expectations. Dry-run the whole plan, review its changes, apply
against the reported input SHA, and re-read through the owner contract. Never
open or rewrite tracking-database.json directly.
The publishing destination for shownotes MUST be discoverable from the speaker profile — agents should never guess, search the web, or grep local files to find where shownotes are published.
Read from speaker-profile.json → publishing_process.shownotes:
url.base (e.g., https://speaking.jbaru.ch)url.template (e.g., /talks/{slug}/,
/{yyyy}-{mm}-{dd}-{slug}/) — reflects the SSG's actual deployed URL
structure, not a flat {slug} substitutionWhen checking talk metadata (video status, slide links, resource lists):
url.base + the result of substituting {slug}
and date variables ({yyyy}, {mm}, {dd}) into url.templateSupported template variables:
| Variable | Meaning |
|---|---|
{slug} | Talk slug from Presentation Spec |
{yyyy} / {yy} | Year from talk date |
{mm} / {dd} | Month / day |
{venue} | Slugified venue name |
If publishing_process.shownotes is absent or incomplete, ask the speaker
during vault-clarification (Step 4 infrastructure capture) — the config
object, not the individual legacy fields.
.tessl-plugin
rules
skills
illustrations
presentation-creator
references
patterns
build
deliver
prepare
scripts
shownotes-publisher
vault-clarification
vault-ingress
references
scripts
vault-profile