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
Process steps in order. Do not skip ahead.
Resolve the absolute path of this loaded SKILL.md, then set
speaker_toolkit_root to the plugin root two directories above the directory
containing this file. Never derive it from the consumer working directory.
Treat {speaker_toolkit_root} as absolute in every toolkit-owned command;
vault paths remain consumer-owned.
Generate or update speaker-profile.json from vault data. This profile is the
structured bridge between the vault and the presentation-creator skill.
The vault lives at ~/.claude/rhetoric-knowledge-vault/ (may be a symlink).
Set host_python to the current host's explicit absolute interpreter path (not
a PATH lookup). The sole interpreter-bootstrap exception is one stdlib-only
strict-owner read:
"{host_python}" "{speaker_toolkit_root}/skills/vault-ingress/scripts/read-tracking-database.py" \
"~/.claude/rhetoric-knowledge-vault/tracking-database.json"Use its JSON report to resolve vault_root and the exact non-empty
database.config.python_path. Set python_path to that value, then immediately
repeat the same owner-read command with "{python_path}" and the resolved
{vault_root}/tracking-database.json; require its database and SHA-256 to match
the bootstrap report. The unconfigured host_python above is authorized for
that one owner-reader invocation only, never for another toolkit script.
If vault-ingress Step 7 invoked this skill, accept its resolved {vault_root}
and {python_path} as handoff context, then re-read the database and require the stored value to match.
Before running any other toolkit script, read config.python_path from that tracking
database and set python_path to that exact value. It is the interpreter
authority for every operational command in this skill.
If python_path is absent, empty, mismatched, or cannot execute the core runtime
probe below, stop and direct the speaker to vault-ingress Step 1 to repair the
configuration. Never fall back to whichever python3 happens to be on PATH.
"{python_path}" "{speaker_toolkit_root}/skills/vault-ingress/scripts/check-runtime.py" \
--lanes core,pptx --require-lanes coretracking-database.json as source of truth and speaker-profile.json as the
output. Toolkit scripts, not prose, own cohort, opportunity, classification, pacing,
and validation arithmetic.config.clarification_sessions_completed >= 1.If any talk declares a preserved local recording through
structured_data.video_extraction.source_video_path, video_local_path, or
video_path, first require the configured interpreter's source-video evidence
lane:
"{python_path}" "{speaker_toolkit_root}/skills/vault-ingress/scripts/check-runtime.py" \
--lanes core,source-video --require-lanes core,source-videoThis check gates the load and validation commands below, which may inspect that
recording while assessing artifact freshness. Let the toolkit scripts perform
the bounded, exact-generation probe; do not pre-open, hash, hydrate, or invoke
ffprobe on a source recording directly. Use source-video for evidence over
an existing recording and the separate video lane only for frame extraction.
If a recording cannot be verified, only source-video capability is removed;
independently verified transcript, PDF, and PPTX evidence remains valid.
Load tracking-database.json, rhetoric-style-summary.md, and
slide-design-spec.md into one payload:
"{python_path}" "{speaker_toolkit_root}/skills/vault-profile/scripts/load-vault.py" \
"{vault_root}" > /tmp/vault-payload.jsonI/O contract:
--as-of timestamp;
defaults are documented in the script's top-of-file contract.{vault_root, config, confirmed_intents, talks, processed_talks, baseline_talks, excluded_pattern_scoring_talks, pattern_scoring_exclusions, pattern_baseline, pattern_opportunities, pattern_classification, current_instrumentation_talks, stale_instrumentation_talks, baseline_note, instrumentation_note, summary, design_spec}.Apply the loader and missing-source rules in the construction reference.
Proceed immediately to Step 2.
Aggregate the three named cohorts exactly as defined in
profile-construction-rules.md. Keep
catalog, non-catalog, and pacing sources separate. Copy the deterministic
pattern_opportunities and pattern_classification payloads; never recalculate either.
Proceed immediately to Step 3.
If config.template_pptx_path is set, require the configured interpreter's PPTX lane,
then extract layouts. An unavailable lane blocks extraction and must not be replaced
with another interpreter:
"{python_path}" "{speaker_toolkit_root}/skills/vault-ingress/scripts/check-runtime.py" \
--lanes core,pptx --require-lanes core,pptx"{python_path}" "{speaker_toolkit_root}/skills/vault-ingress/scripts/pptx-extraction.py" \
"$TEMPLATE_PPTX_PATH" > /tmp/template-layouts.jsonI/O contract:
.pptx file.template_layouts; each layout has
{index, master_index, name, placeholders: [{idx, type}]}..pptx.Apply the extraction-version and (master_index, name) merge rules in the
construction reference. If no template path is configured, emit an empty layout list.
Proceed immediately to Step 4.
Read profile-construction-rules.md in full,
then construct speaker-profile.json with the exact field ownership, cohort,
classification, empty-cohort, and non-pattern provenance rules there. Use
speaker-profile-schema.md for the complete
schema. Copy deterministic baseline, opportunity, policy stamp, availability, and
derived classification data; do not infer or recalculate catalog history. Regenerating
these profile fields reads existing tracking rows and does not reparse any talk.
Apply the independent speaking-rate contract in
speech-rates.md when measured word evidence is
available. Preserve speech-rate-profile.json separately; missing evidence
does not authorize a reparse. Legacy pacing.wpm_range is an unverified
narration assumption, never a measured speaker rate.
Compute pacing.adherence by running "{python_path}" "{speaker_toolkit_root}/skills/vault-profile/scripts/compute-pacing-adherence.py". The
deterministic arithmetic — duration parsing, slides-per-minute, budget-band
classification, over-budget counts, rate, and trend — lives in the script per
script-delegation, not in this prose.
echo "$PACING_INPUT" | "{python_path}" "{speaker_toolkit_root}/skills/vault-profile/scripts/compute-pacing-adherence.py"I/O contract (parse + budget-band rules in the script's top-of-file docstring):
{"talks": [...], "slide_budgets": [...]}. Pass each talk from
current_instrumentation_talks as
{filename, date, slide_count, talk_duration_estimate}, taking slide_count and
talk_duration_estimate from the talk's structured_data; pass
guardrail_sources.slide_budgets unchanged.pacing.adherence data fields (talks_over_budget,
talks_scored, over_budget_rate, trend, worst_offenders). Copy them into
pacing.adherence; also set pacing.adherence.cohort to
current_instrumentation_talks. The schema's note is optional descriptive text
(as elsewhere in the schema) and is not emitted by the script.Set schema_version to 5 and generated_date to today's date in YYYY-MM-DD form.
Proceed immediately to Step 5.
Pipe the constructed profile dict through
"{python_path}" "{speaker_toolkit_root}/skills/vault-profile/scripts/validate-profile.py" --vault-root "$VAULT_ROOT".
Treat validate-profile.py as the sole owner-validation contract. Do not reproduce or
summarize its live-source checks in this skill. It reads existing persisted sources for
validation. It does not reparse talks or mutate the tracking database.
echo "$PROFILE_JSON" | "{python_path}" "{speaker_toolkit_root}/skills/vault-profile/scripts/validate-profile.py" --vault-root "$VAULT_ROOT"I/O contract:
--vault-root <path>; profile JSON is read from stdin when no profile
path is supplied.{valid, schema_version, missing_keys, errors}.0 on valid, 1 on invalid.Write nothing unless the command exits 0 and stdout reports valid: true. On exit
1, report every missing_keys and errors entry, fix the offending fields in Step 4,
and rerun validation.
Proceed immediately to Step 6.
If {vault_root}/speaker-profile.json exists, apply the generation-boundary and
same-generation reporting rules in
profile-construction-rules.md. If no prior
profile exists, skip the diff.
Proceed immediately to Step 7.
Write the validated profile to {vault_root}/speaker-profile.json with 2-space indentation. Confirm: "speaker-profile.json written — {N} talks, {M} confirmed intents."
Proceed immediately to Step 8.
Generate badges under the non-pattern provenance rules in the construction reference. Append the array, rerun Step 5 validation, and re-save only when the final profile is valid.
Finish here.
.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