Six-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, and publish talk pages to a Jekyll shownotes site. Includes a 111-entry Presentation Patterns taxonomy (81 observable: 62 patterns + 19 antipatterns; 30 unobservable: 21 patterns + 9 antipatterns) for scoring, brainstorming, and go-live preparation.
—
—
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Low
Low-risk findings worth noting
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.
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
shownotes-publisher
vault-clarification
vault-ingress
references
scripts
vault-profile