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

pattern_cohort_snapshot.pyskills/vault-profile/scripts/

"""Build the canonical live pattern cohort consumed by vault-profile.

This module is the shared deterministic boundary between ``load-vault.py`` and
the owner-side profile validator.  Both callers therefore select the same fresh
scoring-v5 talks, build the same raw-score baseline, and aggregate the same
per-pattern opportunity rows.  It performs no profile classification.
"""

from __future__ import annotations

import pathlib
import sys
from collections.abc import Mapping
from typing import Any, TypedDict


_INGRESS_SCRIPTS = (
    pathlib.Path(__file__).resolve().parents[2] / "vault-ingress" / "scripts"
)
if str(_INGRESS_SCRIPTS) not in sys.path:
    sys.path.insert(0, str(_INGRESS_SCRIPTS))

from adherence_baseline import (  # noqa: E402
    AdherenceBaselineError,
    ELIGIBLE_STATUSES,
    EvidenceFreshnessAssessor,
    build_current_cohort_baseline,
    partition_pattern_scoring_cohort,
)
from pattern_opportunities import (  # noqa: E402
    PatternOpportunityError,
    build_pattern_opportunity_rows,
)
from return_validation import (  # noqa: E402
    PATTERN_SCORING_SCHEMA_VERSION,
    ReturnValidationError,
    assess_current_persisted_pattern_evidence_freshness,
    load_catalog,
)
from video_evidence import VideoEvidenceAssessment  # noqa: E402
from vault_root_authority import (  # noqa: E402
    VaultRootAuthorityError,
    resolve_vault_root_authority,
)


class PatternCohortSnapshotError(ValueError):
    """The canonical profile cohort could not be selected or aggregated."""


class PatternCohortSnapshot(TypedDict):
    """Canonical typed payload shared by every profile cohort consumer."""

    baseline_talks: list[Mapping[str, object]]
    baseline_talk_filenames: list[str]
    excluded_pattern_scoring_talks: list[Mapping[str, object]]
    pattern_scoring_exclusions: list[dict[str, object]]
    pattern_baseline: dict[str, object]
    pattern_opportunities: dict[str, object]


def configured_evidence_freshness_assessor(
    vault_root: pathlib.Path,
    config: object,
    *,
    catalog: Any | None = None,
) -> EvidenceFreshnessAssessor:
    """Bind the shared evidence-freshness check to trusted live source roots."""
    source_roots = dict(config) if isinstance(config, Mapping) else {}
    try:
        evidence_vault_root = resolve_vault_root_authority(
            database_path=vault_root / "tracking-database.json",
            config=config,
            cli_vault_root=vault_root,
        )
    except VaultRootAuthorityError as exc:
        raise PatternCohortSnapshotError(str(exc)) from exc
    video_evidence_assessment = VideoEvidenceAssessment()
    freshness_cache: dict[int, tuple[str, ...]] = {}

    def assess(talk: Mapping[str, object]) -> tuple[str, ...]:
        identity = id(talk)
        if identity not in freshness_cache:
            freshness_cache[identity] = tuple(
                assess_current_persisted_pattern_evidence_freshness(
                    talk,
                    vault_root=evidence_vault_root,
                    source_roots=source_roots,
                    catalog=catalog,
                    video_evidence_assessment=video_evidence_assessment,
                )
            )
        return freshness_cache[identity]

    return assess


def build_current_pattern_snapshot(
    talks: object,
    *,
    as_of: object,
    evidence_freshness_assessor: EvidenceFreshnessAssessor,
    catalog: Any | None = None,
) -> PatternCohortSnapshot:
    """Return the one canonical current-cohort payload for profile generation."""
    try:
        if isinstance(talks, (str, bytes, Mapping)) or not isinstance(talks, list):
            raise AdherenceBaselineError("talks must be an array of talk objects")
        invalid_index = next(
            (
                index
                for index, talk in enumerate(talks)
                if not isinstance(talk, Mapping)
            ),
            None,
        )
        if invalid_index is not None:
            raise AdherenceBaselineError(f"talks[{invalid_index}] must be an object")
        processed_talks = [
            talk for talk in talks if talk.get("status") in ELIGIBLE_STATUSES
        ]
        resolved_catalog = catalog or load_catalog()
        (
            baseline_talks,
            excluded_pattern_talks,
            pattern_scoring_exclusions,
        ) = partition_pattern_scoring_cohort(
            processed_talks,
            excluded_filenames=(),
            pattern_catalog_fingerprint=resolved_catalog.fingerprint,
            pattern_scoring_schema_version=PATTERN_SCORING_SCHEMA_VERSION,
            evidence_freshness_assessor=evidence_freshness_assessor,
        )
        pattern_baseline = build_current_cohort_baseline(
            processed_talks,
            as_of=as_of,
            pattern_catalog_fingerprint=resolved_catalog.fingerprint,
            pattern_scoring_schema_version=PATTERN_SCORING_SCHEMA_VERSION,
            evidence_freshness_assessor=evidence_freshness_assessor,
        )
        pattern_opportunities = build_pattern_opportunity_rows(
            baseline_talks,
            catalog=resolved_catalog,
        )
        baseline_talk_filenames = sorted(
            str(talk["filename"]) for talk in baseline_talks
        )
        return {
            "baseline_talks": baseline_talks,
            "baseline_talk_filenames": baseline_talk_filenames,
            "excluded_pattern_scoring_talks": excluded_pattern_talks,
            "pattern_scoring_exclusions": pattern_scoring_exclusions,
            "pattern_baseline": pattern_baseline,
            "pattern_opportunities": pattern_opportunities,
        }
    except (
        AdherenceBaselineError,
        PatternOpportunityError,
        ReturnValidationError,
    ) as exc:
        raise PatternCohortSnapshotError(str(exc)) from exc

skills

README.md

tile.json