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
Fields below template_skip_patterns are asked during Step 5 (first session
only) when empty. The question column shows what to ask the speaker.
| Config field | Question |
|---|---|
speaker_name | "Name as it appears on slides?" |
speaker_handle | "Social handle for footers?" |
speaker_website | "Website for talk resources?" |
shownotes.source.type | "Where do your shownotes live? Local Jekyll, Hugo, Eleventy, Astro, a remote URL, or no shownotes site?" |
shownotes.source.path_or_url | "Path (or base URL) to the shownotes site root?" |
shownotes.source.talks_subdir | "Subdirectory under the site root where talk entries live? (e.g., _talks, content/talks)" |
shownotes.url.base | "Base URL where the shownotes site is deployed?" |
shownotes.url.template | "Permalink template for a single talk? (e.g., /talks/{slug}/, /{yyyy}-{mm}-{dd}-{slug}/). Verify against your deployed URLs before confirming." |
shownotes.thumbnail_path_template | "Where in the site repo does the SSG template expect the talk thumbnail? (e.g., assets/images/thumbnails/{slug}-thumbnail.png)" |
shownotes.slug_convention.template | "Convention for talk slugs? (e.g., {venue-compact}{yy}-{short-id} → devnexus26-robocoders). What components and format?" |
shownotes.ssg_template_pointer | "Which SSG template file encodes the URL/thumbnail conventions (so they can be re-derived after a redesign)? e.g., _layouts/default.html for Jekyll." |
template_pptx_path | "PowerPoint template path?" |
presentation_file_convention | "File organization? (default: {conference}/{year}/{talk-slug}/)" |
publishing_process.export_format | "How do you export final decks — PDF, keep .pptx only, or both?" |
publishing_process.export_method | "How do you produce the PDF? (e.g., PowerPoint AppleScript, LibreOffice CLI, manual)" |
publishing_process.qr_code | "Do you put QR codes in your decks? If yes, what do they link to?" |
publishing_process.qr_code.shortener | "Do you use a URL shortener for QR links? Options: bitly, rebrandly, or none." |
publishing_process.qr_code.bitly_domain | (Only if shortener=bitly) "Do you have a custom Bitly domain? (e.g., jbaru.ch) — save the domain, or null to record no custom domain (default bit.ly)." |
publishing_process.qr_code.rebrandly_domain | (Only if shortener=rebrandly) "What custom domain do you use with Rebrandly? (e.g., jbaru.ch) — save the domain, or null to record no custom domain (default)." |
publishing_process.qr_code.shortener_setup | (Only if shortener=bitly or rebrandly) "Add your API key to {vault_root}/secrets.json (chmod 600). Format: {\"bitly\": {\"api_token\": \"...\"}} or {\"rebrandly\": {\"api_key\": \"...\"}}. Alternatively, install the Bitly or Rebrandly MCP server for agent-driven shortening." |
gemini_api_key | "Add your Gemini API key to {vault_root}/secrets.json under gemini.api_key (chmod 600). Format: {\"gemini\": {\"api_key\": \"...\"}}. Get a key from https://aistudio.google.com/app/apikey. The GEMINI_API_KEY env var also works as a fallback." |
publishing_process.additional_steps | "Any other distribution steps after exporting?" |
See the canonical schema and field reference in
../../vault-profile/references/schemas-config.md.
Current writes preserve config schema v2, including the owner-validated
pptx_directory_exclusions; config v1 is owner-migration input, not writable
session state. That file also documents the migration path for the exclusion
field and for vaults created before the unified shownotes block.
Stored in the confirmed_intents array of the tracking database. Populated during
clarification sessions when the speaker confirms a pattern is intentional. Persist
records only with the ingress owner's upsert_confirmed_intent mutation; see the
owner mutation contract.
{
"confirmed_intents": [{
"schema_version": 1,
"pattern": "delayed_self_introduction",
"intent": "deliberate",
"rule": "Use two-phase intro: brief bio at slide 3, full re-intro mid-talk",
"note": "Speaker confirmed this is an intentional rhetorical device",
"confirmed_date": "2026-08-01",
"source_talk": "2026-08-01-example.md"
}]
}The complete record has required exact integer schema_version: 1 and string
fields pattern, intent, rule, and note, plus optional
speaker-confirmation provenance. Provenance may use one of singular source_talk
or legacy alias talk, or the non-empty unique string array source_talks;
confirmed_date is canonical YYYY-MM-DD, and retrofit_targets is an optional
non-empty unique string array. Existing speaker-owned intent labels outside the
three recommended labels remain valid non-empty classifications and must not be
discarded during an exact-record update. Unknown fields are rejected.
Stored in the improvement_goals array of the tracking database. This is the
artifact that closes the coaching loop: the speaker picks 1–2 focus areas, and a
later ingress run checks whether the targeted issue actually moved. Without it the
system diagnoses but never verifies that the speaker acted.
Artifact owner: vault-ingress owns the tracking database, record shapes, and
migrations. Authorized writer: vault-clarification creates and retires goals
during a session through upsert_improvement_goal. Reader/updater:
vault-ingress reads active goals and changes only the verification fields through
patch_improvement_goal_verification (status, current_value,
last_checked, checked_by, verification_state, verification_reasons) — never
the owner shape or fixed baseline. Both operations use the
owner mutation contract.
On a record whose schema_version it does not
recognize, vault-ingress treats it as read-only and skips verification.
Schema v2 binds every catalog-derived goal to the exact pattern-scoring generation
accepted by the speaker. The full baseline snapshot is copied from a validated
schema-v4 or schema-v5 speaker-profile.json; Section 15 is narrative context, never
the machine source. Schema-v5 derived labels may inform the offered goals only when
their exact classification domain is available; schema v4 remains occurrence-only.
The helper at scripts/goal_generation_provenance.py makes the mechanical
comparability decision for both the owner and reader.
{
"improvement_goals": [{
"id": "reduce-shortchanged",
"schema_version": 2,
"issue": "Shortchanged — rushing the final third under time pressure",
"kind": "antipattern|underuse|pacing|other",
"antipattern_id": "shortchanged (null unless kind=antipattern)",
"metric": "fraction of recent talks exhibiting Shortchanged",
"baseline_value": "4 of last 6 (0.67)",
"target": "at or below 1 of 3 (0.33)",
"set_date": "2026-06-11",
"set_by": "vault-clarification",
"status": "active|improving|achieved|stalled|regressed|retired",
"current_value": "",
"last_checked": null,
"checked_by": null,
"verification_state": "pending|current|needs_rebaseline|unverifiable",
"verification_reasons": [],
"supersedes_goal_id": null,
"baseline_provenance": {
"lane": "pattern_scoring",
"pattern_baseline": {
"schema_version": 2,
"as_of": "2026-06-11T12:00:00+00:00",
"scope": "global",
"active_batch_excluded": false,
"excluded_filenames": [],
"eligible_statuses": ["processed", "processed_partial"],
"pattern_scoring_generation_status": "current",
"pattern_scoring_generation_reasons": [],
"pattern_catalog_fingerprint": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"pattern_scoring_schema_version": 5,
"scored_talk_count": 12,
"pattern_score_sum": 72,
"average_pattern_score": 6.0,
"eligible_talk_count": 12,
"opportunity_coverage_identity": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"raw_score_comparison_status": "available",
"raw_score_comparison_reason": null
}
}
}]
}kind ties the goal to a coaching surface: antipattern (a speaker-selected
antipattern occurrence to reduce), underuse (a speaker-selected pattern occurrence
to increase), pacing (hit the time/slide budget), other (free-form). Raw
occurrence rows do not classify recurrence, signature status, or underuse.antipattern_id is set only when kind is antipattern; it is null for
underuse, pacing, and other goals (no antipattern exists to reference).baseline_value is the human-readable metric value accepted by the speaker. For
a pattern goal, compute it from the same validated profile cohort carried in
baseline_provenance.pattern_baseline; never parse it from Section 15.target is the speaker's own stated aim, not a generic standard.baseline_provenance.lane is pattern_scoring for antipattern and underuse,
pacing for pacing, and independent for other. Pacing/independent records omit
pattern_baseline. An other goal cannot be used to evade pattern provenance.active_batch_excluded: false, excluded_filenames: []). A fingerprint or scoring
schema mismatch produces needs_rebaseline; scoring-v5 also requires one available
opportunity_coverage_identity for raw-score comparability. A missing current
baseline or legacy schema-v1 pattern goal is unverifiable. Neither state permits
an outcome status.supersedes_goal_id. Never overwrite or
restamp the old baseline.antipattern/underuse goals remain read-only and
unverifiable. Existing schema-v1 pacing and truly non-pattern other goals remain
independent of catalog releases.status) lives in
../../vault-ingress/references/processing-rules.md
Improvement Goal Verification..tessl-plugin
rules
skills
illustrations
presentation-creator
references
patterns
build
deliver
prepare
scripts
shownotes-publisher
vault-clarification
vault-ingress
references
scripts
vault-profile