Seven-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, create and publish talk-content Agent Skills with talk pages to a Jekyll shownotes site, and verify a recorded screencast against its storyboard. Includes a 113-entry Presentation Patterns taxonomy (83 observable: 64 patterns + 19 antipatterns; 30 unobservable: 21 patterns + 9 antipatterns) for scoring, brainstorming, and go-live preparation.
75
94%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Input and output for scripts/verify-storyboard.py. The verifier reads structured
state only; it never opens media.
The approved storyboard (e.g. SCREEN-PLAN.md in a demo repo) is prose, on
purpose — a human approves visual intent, and conditions like "leave room for the
laugh" are judgments, not predicates. The recording rig emits the machine-checkable
half as the JSON below. Parsing prose pass-conditions is out of scope
(rules/script-delegation.md The Regex Trap).
{
"delivery": { "width": 1920, "height": 1080, "min_label_px": 14, "scale": 1.0 },
"narration": { "source": "actual_word_timestamps",
"words": [ { "word": " Hi,", "start": 0.0, "end": 0.62 } ] },
"clips": [ { "id": "a0-hook", "entry": {manifest}, "exit": {manifest},
"events": [ {event} ] } ],
"rows": [ { "id": "a0-hook-r1", "clip": "a0-hook", "phrase": "...",
"proof_frame_t": 3.1, "require": {…} } ],
"seam_tolerances": { "scroll": 2, "transform": 2 }
}narration.source must be actual_word_timestamps. Any other value fails the
time axis: WPM predicts whether a script is deliverable, never that a visual and
a phrase coincide.
delivery.scale converts a recorded label height to its delivered height, and
is required whenever min_label_px is set — defaulting it would assume the
conversion. A label readable in the browser and unreadable in the encode is the
case min_label_px exists to catch.
route, data_fingerprint, viewport {width,height}, zoom,
scroll {x,y}, transform {pan_x,pan_y,zoom}, tabs (ordered), active_tab,
cursor [x,y], labels [{text, height_px}].
{"type":"pan","axis":"x","delta":-640,"t":2.0} ·
{"type":"click","t":3.1,"pointer":[x,y],"target_rect":[x,y,w,h]}
A phrase spoken more than once is matched at every occurrence; a proof frame inside any of them passes.
Every declared requirement is type-checked: route and data_fingerprint are
strings, visible_labels a list of strings, click_on_target a boolean. A rect
— content_bounds or an event's target_rect — must describe a region with
positive width and height; four numbers enclosing no area contain no point.
route · data_fingerprint · visible_labels · content_bounds [x,y,w,h] ·
margin_px · pan {axis, min_abs_delta} · click_on_target
A declared pan must carry a positive min_abs_delta. A threshold of zero,
or an absent one, is satisfied by a take that never panned.
{ "ok": false,
"axes": {"semantic":"fail","geometry":"pass","motion":"pass","time":"pass",
"pixels":"unverified"},
"unverified_axes": {"pixels": "requires encoded frames; not checked by the manifest lane"},
"finding_count": 1,
"findings": [ {"code":"stale_data","axis":"semantic","subject":"a0-hook-r1",
"message":"...", "expected":"…","actual":"…"} ],
"counts": {"rows":1,"clips":2,"seams":1} }An axis is unverified for either of two reasons, and neither is a pass:
pixels, always — this lane cannot examine encoded frames.unverified_axes says which case applies. An axis reported as passing without
being examined is a false assurance, which is the failure the verification
doctrine exists to prevent — and which the first draft of this script committed
by passing an empty sequence on every axis.
A requirement whose evidence the take does not carry is refused, never
passed: require.content_bounds with no entry.viewport, visible_labels with
no entry.labels, click_on_target with a click lacking pointer/target_rect,
or proof_frame_t with no narration.words. Each yields evidence_missing
naming the requirement and the absent field, on the axis that requirement is
judged on — a missing viewport fails geometry, not semantic, so an axis
can never read pass while its own evidence is absent.
A seam field absent from either manifest is refused for the same reason: two absences compare equal, and equality between nothing and nothing is not agreement.
A document that does not satisfy the contract exits 2 with the violation named,
rather than failing later on a missing key. Validation covers structure
(clips/rows as lists of objects with unique, non-empty string ids), completeness
(scroll carries x/y, transform carries pan_x/pan_y/zoom, a
proof_frame_t has a phrase), and finiteness of every number. Dimensions and thresholds must also be
positive: min_label_px <= 0 makes readability vacuously true, a zero scale
erases the measurement it converts, and a content_bounds with non-positive
width or height describes no region. An explicit null is refused wherever a value is declared — it is not the
same as an absent key, and accepting it let a requirement skip both its
validation and the check it gates.
Finiteness is not pedantry: JSON admits NaN, and every comparison against
NaN is false, so a NaN measurement or threshold satisfies whatever it is
tested against. A bool is an int in Python and is rejected as a coordinate.
A Python int is unbounded, so a value with no float representation (10**400)
counts as non-finite rather than raising.
Exit 0 when every checked axis passes, 1 on any finding, 2 on usage error.
| code | axis | means |
|---|---|---|
route_mismatch | semantic | clip is not on the required route |
stale_data | semantic | route correct, rendered data is the wrong revision |
required_label_absent | semantic | a label the phrase names is not in the frame |
seam_state_mismatch | semantic | a seam does not carry a field across unchanged |
seam_tab_mismatch | semantic | tab set or active tab changed across a seam |
content_clipped | geometry | required content not fully inside the viewport at margin |
label_below_readable_size | geometry | a required label is under min_label_px at delivery scale |
pan_not_performed | motion | a required deliberate pan is absent |
click_absent | motion | a required visible click is absent |
cursor_off_target | motion | the pointer was not on the target when the click fired |
timing_not_from_actual_words | time | synchronisation asserted without transcribed timestamps |
phrase_not_spoken | time | the row's phrase is absent from the narration |
proof_outside_phrase | time | the proof frame falls outside every spoken occurrence |
evidence_missing | varies | a requirement cannot be judged; the take lacks its evidence |
sequence_empty | semantic | the sequence declares no rows, so it verifies nothing |
Seven of ten are checked here. Three need encoded frames and are not:
| # | negative test | here |
|---|---|---|
| 1 | correct route but wrong/stale data | stale_data |
| 2 | workflow present but partly clipped | content_clipped |
| 3 | missing horizontal pan | pan_not_performed |
| 4 | labels below readable size | label_below_readable_size (from recorded measurement; pixels must confirm) |
| 5 | cursor off the clicked target | cursor_off_target |
| 6 | click not visible in encoded frames | pixel lane — not checked |
| 7 | scroll/pan/zoom mismatch across a seam | seam_state_mismatch |
| 8 | different tab set or active tab across a seam | seam_tab_mismatch |
| 9 | menu bar / system clock in crop | pixel lane — not checked |
| 10 | timing from predicted WPM | timing_not_from_actual_words |
.tessl-plugin
rules
skills
illustrations
presentation-creator
references
patterns
build
deliver
prepare
scripts
screencast-recorder
shownotes-publisher
vault-clarification
vault-ingress
references
scripts
vault-profile