CtrlK
BlogDocsLog inGet started
Tessl Logo

jbaruch/speaker-toolkit

Five-skill presentation system: ingest talks into a rhetoric vault, run interactive clarification, generate a speaker profile, create presentations that match your documented patterns, and produce the deck illustrations + thumbnail visual layer. Includes a 102-entry Presentation Patterns taxonomy (91 observable, 11 unobservable go-live items) for scoring, brainstorming, and go-live preparation.

95

1.20x
Quality

96%

Does it follow best practices?

Impact

95%

1.20x

Average score across 32 eval scenarios

SecuritybySnyk

Advisory

Suggest reviewing before use

Overview
Quality
Evals
Security
Files

criteria.jsonevals/scenario-30/

{
  "context": "Tests the thumbnail iteration rules: when speaker gives revision feedback, the agent modifies specific prompt components rather than regenerating from scratch. Also tests slide image resolution chain (existing illustration preferred), the framing-not-demands face rule (change style variant or title position to address face issues — never add face-preservation language), and generate-thumbnail.py argument changes.",
  "type": "weighted_checklist",
  "checklist": [
    {
      "name": "Iterate not restart strategy",
      "description": "The revision-plan.md explicitly describes iterating on specific components (style variant, title position, slide choice) rather than starting from scratch. The plan mentions that iterative refinement produces better results than cold restarts",
      "max_score": 15
    },
    {
      "name": "Style changed to split_panel",
      "description": "The revised generate-thumbnail.py command uses --style split_panel, overriding both the profile preference (overlay) and the first run value, matching the speaker's explicit request",
      "max_score": 10
    },
    {
      "name": "Title position changed to top",
      "description": "The revised command uses --title-position top, matching the speaker's request to move text to the top. This overrides the profile's bottom preference",
      "max_score": 10
    },
    {
      "name": "Title text unchanged",
      "description": "The --title argument remains 'JUDGMENT DAY' (or equivalent), not changed. The speaker said 'keep the same title text'",
      "max_score": 5
    },
    {
      "name": "Slide image unchanged",
      "description": "The --slide-image still references slide 10's illustration. The speaker said 'keep the same slide'",
      "max_score": 5
    },
    {
      "name": "Face issue addressed via style variant, not preservation language",
      "description": "The plan addresses the face idealization feedback by changing the style variant (the speaker's split_panel request fits this) or proposing to try a different slide image — NOT by adding 'maintain exact facial features' or other face-preservation demands. The thumbnail-generation-rules §6 framing-not-demands rule requires this: assertive face-preservation language combined with viral-styling demands trips Gemini's safety filter on real-person photos",
      "max_score": 15
    },
    {
      "name": "generate-thumbnail.py used",
      "description": "The revised command uses generate-thumbnail.py, not hand-rolled Gemini calls or PIL composition",
      "max_score": 10
    },
    {
      "name": "Slide image from illustrations directory",
      "description": "The plan uses the existing illustration file (illustrations/slide-10.png) as the slide image source, following the resolution chain that prefers existing illustrations over PPTX extraction",
      "max_score": 10
    },
    {
      "name": "Original vs revised comparison",
      "description": "The original-vs-revised.md clearly shows which arguments changed (style, title-position) and which stayed the same (slide-image, speaker-photo, title, brand-colors), making the iterative approach visible",
      "max_score": 10
    },
    {
      "name": "Speaker photo path unchanged",
      "description": "The --speaker-photo argument still uses the profile path (/Users/jbaruch/photos/devnexus-headshot.jpg), not changed for the revision",
      "max_score": 10
    }
  ]
}

evals

README.md

tile.json