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".
Resources
2Install
npx skillscat add jbaruch/speaker-toolkit/vault-profile Install via the SkillsCat registry.
Vault Profile — Speaker Profile Generator
Process steps in order. Do not skip ahead.
Resolve the absolute path of this loaded SKILL.md, then setspeaker_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-emptydatabase.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 coreRequired 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. - Read speech-rates.md before speech calibration or
narration planning. Keep measured word-timing profiles separate from slide pacing. - Read speech-calibration.md for the standalone
vault-root calibration command, sampled evidence, family balance and uncertainty. - Treat
tracking-database.jsonas source of truth andspeaker-profile.jsonas 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 throughstructured_data.video_extraction.source_video_path, video_local_path, orvideo_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 invokeffprobe 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, andslide-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:
- Args: optional vault-root path and optional timezone-aware
--as-oftimestamp;
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 deterministicpattern_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.jsonI/O contract:
- Args: path to a
.pptxfile. - 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.
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 perscript-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 fromcurrent_instrumentation_talksas{filename, date, slide_count, talk_duration_estimate}, takingslide_countandtalk_duration_estimatefrom the talk'sstructured_data; passguardrail_sources.slide_budgetsunchanged. - Stdout (JSON): the
pacing.adherencedata fields (talks_over_budget,talks_scored,over_budget_rate,trend,worst_offenders). Copy them intopacing.adherence; also setpacing.adherence.cohorttocurrent_instrumentation_talks. The schema'snoteis 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:
0on valid,1on invalid.
Write nothing unless the command exits 0 and stdout reports valid: true. On exit1, 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.