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.
96
Quality
96%
Does it follow best practices?
Impact
96%
1.57xAverage score across 15 eval scenarios
{
"context": "Tests whether the agent uses the correct python-pptx patterns for .pptx generation: the specific undocumented template-stripping internals (_sldIdLst + drop_rel), a separate batch speaker-notes injection step after slides are created, footer on every slide, and text overflow prevention with optimize_slide_text.",
"type": "weighted_checklist",
"checklist": [
{
"name": "Uses _sldIdLst",
"description": "The script accesses `slides._sldIdLst` (the undocumented internal attribute) to iterate over slide IDs during template stripping — not a public API like slides[0] or clear()",
"max_score": 12
},
{
"name": "Uses drop_rel()",
"description": "The script calls `part.drop_rel(rId)` or `tmpl.part.drop_rel(rId)` to remove the relationship during template stripping — not a delete or pop operation",
"max_score": 12
},
{
"name": "Correct relationship namespace URI",
"description": "The relationship ID is retrieved using the exact namespace URI string: '{http://schemas.openxmlformats.org/officeDocument/2006/relationships}id' — not a shortened version or variable substitution",
"max_score": 10
},
{
"name": "Template stripping before content",
"description": "The template stripping code (removing existing slides) appears BEFORE any new slide additions — the script does not add content slides to a template that still has demo slides",
"max_score": 11
},
{
"name": "Speaker notes in separate step",
"description": "Speaker notes are injected in a SEPARATE code block, function, or loop that runs AFTER all slides have been created — not inline during each slide's creation (e.g., a dedicated notes injection pass over existing slides)",
"max_score": 12
},
{
"name": "notes_text_frame access pattern",
"description": "Speaker notes are set via `slide.notes_slide.notes_text_frame.text = ...` (or equivalent attribute access chain) — not via placeholder manipulation or XML editing",
"max_score": 13
},
{
"name": "Text overflow prevention",
"description": "The script includes logic to prevent text overflow in placeholders — e.g., sets word_wrap to True, uses MSO_AUTO_SIZE, checks text length before insertion and adjusts font size, or truncates content — not just inserting text with no overflow consideration",
"max_score": 5
},
{
"name": "Footer on slides",
"description": "The script adds footer text to slides (e.g., via manage_text, add_textbox, or a helper function) — not absent or only mentioned in comments",
"max_score": 10
},
{
"name": "Final save call",
"description": "The script includes a save() call (tmpl.save(...) or prs.save(...)) to persist the generated .pptx to disk",
"max_score": 8
},
{
"name": "Background color applied",
"description": "The script sets a background color for slides (not leaving all slides at the default white), referencing the background_color_strategy or using a color value that is NOT #FFFFFF / white",
"max_score": 7
}
]
}Install with Tessl CLI
npx tessl i jbaruch/speaker-toolkit@0.6.2evals
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
skills
presentation-creator
references
patterns
build
deliver
prepare
rhetoric-knowledge-vault