Two-skill presentation system: analyze your speaking style into a rhetoric knowledge vault, then create new presentations that match your documented patterns. Includes an 88-entry Presentation Patterns taxonomy for scoring, brainstorming, and go-live preparation.
Overall
score
95%
Does it follow best practices?
Validation for skill structure
Fields below template_skip_patterns are asked during Step 5B (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_url_pattern | "URL pattern for talk pages? (e.g., speaking.example.com/{slug})" |
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.shownotes_publishing | "Do you publish shownotes for your talks? If yes, how?" |
publishing_process.qr_code | "Do you put QR codes in your decks? If yes, what do they link to?" |
publishing_process.additional_steps | "Any other distribution steps after exporting?" |
{
"config": {
"vault_root": "/path/to/rhetoric-knowledge-vault",
"talks_source_dir": "/path/to/_talks",
"pptx_source_dir": "/path/to/Presentations",
"python_path": "/path/to/python3",
"template_skip_patterns": ["template"],
"speaker_name": "",
"speaker_handle": "",
"speaker_website": "",
"shownotes_url_pattern": "",
"template_pptx_path": "",
"presentation_file_convention": "{pptx_source_dir}/{conference}/{year}/{talk-slug}/",
"clarification_sessions_completed": 0
},
"talks": [{
"filename": "2024-04-10-talk-slug.md",
"title": "Talk Title", "conference": "Name", "date": "2024-04-10",
"slides_url": "https://drive.google.com/file/d/{ID}/view (optional — but at least one of slides_url or pptx_path required)",
"video_url": "https://www.youtube.com/watch?v={ID}",
"youtube_id": "aBcDeFg", "google_drive_id": "1AbCdEfGhIjK",
"pptx_path": "Conference/Year/Talk Name.pptx (optional — but at least one of slides_url or pptx_path required)",
"slide_source": "pdf|pptx|both (set in Step 2 based on which slide sources exist)",
"pptx_visual_status": "pending|extracted|no_pptx",
"status": "pending|processed|processed_partial|needs-reprocessing|skipped_no_sources|skipped_download_failed",
"reprocess_reason": "null|pattern_scoring_added (set when status changed to needs-reprocessing by migration)",
"rhetoric_notes": "", "areas_for_improvement": "",
"structured_data": {}, "verbatim_examples": {},
"adherence_assessment": "", "processed_date": null,
"pattern_observations": {
"pattern_ids": [],
"antipattern_ids": [],
"pattern_score": 0
}
}],
"pptx_catalog": [{
"pptx_path": "Conference/Year/Talk Name.pptx",
"talk_filename": "2024-04-10-talk-slug.md or null",
"matched": true,
"slide_count": 60,
"visual_extracted": false
}],
"confirmed_intents": [{
"pattern": "delayed_self_introduction",
"intent": "deliberate|accidental|context_dependent",
"rule": "Use two-phase intro: brief bio at slide 3, full re-intro mid-talk",
"note": "Speaker confirmed this is an intentional rhetorical device"
}]
}Each subagent returns this JSON after processing one talk:
{
"filename": "the .md filename",
"rhetoric_notes": "500-1000 words: qualitative observations across dimensions 1-13",
"areas_for_improvement": "100-300 words: honest critical reflection (dimension 14)",
"structured_data": {
"slide_count": 60,
"talk_duration_estimate": "35 min (from transcript length/pacing clues)",
"meme_count": 15,
"image_only_slide_count": 25,
"audience_interaction_count": 3,
"opening_type": "provocative_image|failure_framing|audience_poll|story|bold_claim|demo_cold_open",
"closing_type": "summary_cta|callback|open_question|demo_finale|resource_list",
"narrative_arc_type": "problem_diagnosis_solution|discovery_demo|chronological|listicle",
"slide_design_style": "comic_book|minimal_dark|demo_scaffolding|mixed",
"opening_sequence": ["title", "provocative_hook", "bio", "shownotes_url", "first_argument"],
"closing_sequence": ["summary_bullets", "cta_with_qr", "thanks_with_humor"],
"color_coded_backgrounds": {
"purple_halftone": "slide numbers and semantic register"
},
"background_color_sequence": ["purple", "white", "red", "yellow", "...for every slide"],
"per_slide_visual": [
{
"slide_number": 1,
"background_color_name": "purple_halftone|red_halftone|yellow_halftone|etc",
"content_type": "title|bio|shownotes|content_bullets|data_chart|quote|meme_only|meme_with_text|section_divider|progressive_reveal|comparison_table|hot_take|cta|thanks",
"image_composition": "full_bleed|full_bleed_with_text|image_left_text_right|image_right_text_left|centered_image_with_title|inset_image|progressive_reveal|screenshot|meme_with_caption|none",
"has_speech_bubble": false,
"has_starburst": false,
"has_footer": true
}
],
"typography_observations": {
"title_font_description": "hand-lettered comic style, appears to be...",
"body_font_description": "...",
"bullet_character": "multiplication_sign|dash|circle|custom",
"title_color_adapts_to_background": true
},
"footer_observations": {
"element_count": 4,
"separator_character": "|",
"footer_color_adapts_to_background": false,
"watermark_present": true,
"watermark_description": "description of any corporate/sponsor logo or branding"
},
"shape_observations": {
"speech_bubble_slides": [1, 15, 42],
"starburst_slides": [8, 23, 55],
"speech_bubble_description": "white fill, black outline, tail pointing down-left",
"starburst_description": "red fill, white text, explosion/irregular star shape"
}
},
"verbatim_examples": {
"signature_phrases": ["actual phrases from transcript, e.g. 'is not a thing'"],
"jokes": ["verbatim joke/humor lines from transcript"],
"transitions": ["actual transition phrases, e.g. 'Next thing you know...'"],
"audience_addresses": ["how speaker addresses audience, e.g. 'raise your hand if...'"],
"opening_lines": ["first 2-3 sentences of the talk, verbatim"],
"closing_lines": ["last 2-3 sentences of the talk, verbatim"]
},
"adherence_assessment": "1-3 sentences, or '' if <10 talks parsed",
"new_patterns": "100-300 words on NEW patterns not in summary, or ''",
"summary_updates": "50-200 words: additions for rhetoric-style-summary.md by section #, or ''",
"pattern_observations": {
"patterns_detected": [
{
"pattern_id": "narrative-arc",
"confidence": "strong|moderate|weak",
"evidence": "brief description of what was observed",
"dimensions": [2, 5]
}
],
"antipatterns_detected": [
{
"pattern_id": "shortchanged",
"confidence": "strong|moderate|weak",
"evidence": "brief description of what was observed",
"dimensions": [12, 14]
}
],
"pattern_score": {
"patterns_used": 8,
"antipatterns_detected": 2,
"score": 6
}
}
}Produced by the extraction script in references/pptx-extraction.md:
{
"pptx_path": "Conference/Year/Talk.pptx",
"slide_count": 60,
"aspect_ratio": "16:9",
"per_slide_visual": [
{
"slide_number": 1,
"background_color_hex": "#5B2C6F",
"background_type": "solid|pattern|image|gradient",
"layout_name": "TITLE",
"shape_count": 3,
"has_text_placeholder": true,
"has_image": false,
"text_content_preview": "Talk Title",
"footer_text": "@handle | #conf | #topic | website",
"has_speaker_notes": true,
"shapes_summary": [
{"type": "placeholder", "name": "Title 1", "font": "Bangers", "font_size": 36, "font_color": "#FFFFFF", "bold": true},
{"type": "autoshape", "shape_type": "CLOUD_CALLOUT", "fill_color": "#FFFFFF", "line_color": "#000000"}
]
}
],
"global_design": {
"fonts_used": {"Bangers": 45, "Arial": 10},
"background_colors": {"#5B2C6F": 12, "#C0392B": 8},
"footer_pattern": {
"position_left": 0.5, "position_bottom": 0.1,
"font": "Arial", "font_size": 8, "font_color": "#FFFFFF", "separator": " | "
},
"shape_types_used": {"CLOUD_CALLOUT": 15, "EXPLOSION1": 8},
"color_sequence": ["#5B2C6F", "#FFFFFF", "#C0392B", "..."]
}
}Install with Tessl CLI
npx tessl i jbaruch/speaker-toolkitevals
scenario-0
scenario-1
scenario-2
scenario-3
scenario-4
scenario-5
scenario-6
scenario-7
scenario-8
scenario-9
skills
presentation-creator
references
patterns
build
deliver
prepare
rhetoric-knowledge-vault