CtrlK
BlogDocsLog inGet started
Tessl Logo

jbaruch/speaker-toolkit

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.

Quality

Does it follow best practices?

Run evals on this skill

Adds up to 20 points to the overall score

View guide

SecuritybySnyk

Low

Low-risk findings worth noting

Overview
Quality
Evals
Security
Files

SKILL.mdskills/vault-profile/

name:
vault-profile
description:
Generates or updates the structured speaker-profile.json from vault data. Aggregates rhetoric summary, slide design spec, confirmed intents, and structured talk data into a machine-readable profile used by the presentation-creator skill. Also generates speaker achievement badges. Triggers: "generate speaker profile", "update speaker profile", "regenerate speaker profile", "sync speaker profile".
user-invocable:
Yes

Vault Profile — Speaker Profile Generator

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 core

Required References

  • Read profile-construction-rules.md before Steps 2, 4, and 6. It owns cohort use, merge rules, fail-closed edge cases, and diff semantics.
  • Use speaker-profile-schema.md for the full JSON shape and schemas-config.md for config and confirmed intents.
  • Treat tracking-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.

Prerequisites

  • 10+ talks parsed AND config.clarification_sessions_completed >= 1.
  • Also runs on explicit request (overrides prerequisites).
  • Auto-triggered by vault-ingress Step 7 (Regenerate Speaker Profile) if profile already exists.

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-video

This 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.

Step 1 — Load Vault Sources

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.json

I/O contract:

  • Args: optional vault-root path and optional timezone-aware --as-of timestamp; defaults are documented in the script's top-of-file contract.
  • Stdout (JSON): {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}.
  • Exit non-zero with stderr message if arguments, vault sources, catalog identity, scoring-generation metadata, or a present classification-policy override is invalid.

Apply the loader and missing-source rules in the construction reference.

Proceed immediately to Step 2.

Step 2 — Aggregate Structured Data

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.

Step 3 — Extract Template Layouts

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.json

I/O contract:

  • Args: path to a .pptx file.
  • Stdout (JSON): per-slide visual data, shape types, global design stats, and template_layouts; each layout has {index, master_index, name, placeholders: [{idx, type}]}.
  • Exit non-zero with stderr message if the file is missing, unreadable, or not a valid .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.

Step 4 — Construct the Profile

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):

  • Stdin (JSON): {"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.
  • Stdout (JSON): the 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.
  • Exit non-zero on malformed input.

Set schema_version to 5 and generated_date to today's date in YYYY-MM-DD form.

Proceed immediately to Step 5.

Step 5 — Validate the Profile

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:

  • Args: required --vault-root <path>; profile JSON is read from stdin when no profile path is supplied.
  • Stdin (JSON): the profile dict.
  • Stdout (JSON): {valid, schema_version, missing_keys, errors}.
  • Exit code: 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.

Step 6 — Diff Against Existing Profile

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.

Step 7 — Save the Profile

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.

Step 8 — Generate Achievement Badges

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.

skills

README.md

tile.json