CtrlK
BlogDocsLog inGet started
Tessl Logo

jbaruch/speaker-toolkit

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, publish 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.

74

Quality

93%

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

establish-date-provenance.pyskills/vault-ingress/scripts/

#!/usr/bin/env python3
"""Record the provider ceiling for every talk whose delivery date is unrecorded.

Usage: establish-date-provenance.py DATABASE [--apply --expected-sha256 SHA]
       [--as-of TIMEZONE_AWARE_ISO_TIME]

Default is a dry run. The report names every proposal, every talk this owner
cannot bound and why, and a coverage block that makes backlog progress
measurable across runs instead of re-derived by each audit (#430).

This owner writes `date_provenance` records only. It never writes a talk's
`date`, never fetches from a provider, and never invents a delivery day: a
provider upload bounds a recording, and only methods that establish a day may
supply one. Talks whose date is already comparable are left alone — their
provenance is a question about evidence a human holds, not one this owner can
answer from a stored upload date.

Stdout: one schema-v1 {schema_version, ok, ...} report. Exit 0 on a completed
plan or apply, 1 on a refused input or failed precondition, 2 on usage error.
"""

from __future__ import annotations

import argparse
import datetime as dt
import hashlib
import json
from pathlib import Path
import re
import sys
from typing import Any, NoReturn

from source_identity_matching import parse_catalog_date
from tracking_database import (
    DATE_PROVENANCE_RECORD_SCHEMA_VERSION,
    TrackingDatabaseError,
    require_current_tracking_database,
)
from tracking_database_io import (
    BackupRequest,
    TrackingDatabaseIOError,
    commit_tracking_database,
    decode_json_object,
    render_json_object,
    snapshot_tracking_database,
)

REPORT_SCHEMA_VERSION = 1
CEILING_METHOD = "provider_upload_ceiling"
_ISO_DAY = re.compile(r"\d{4}-\d{2}-\d{2}")
_SHA256 = re.compile(r"[0-9a-f]{64}")

# Why a talk this owner looked at received no proposal. Closed so a new refusal
# has to be named here rather than disappearing into a silent skip.
BLOCKED_REASONS = (
    "date_already_comparable",
    "date_present_but_uncomparable",
    "provenance_already_recorded",
    "no_provider_upload_date",
)


class DateProvenanceError(RuntimeError):
    """The owner refused an input; the message names the repair."""


def _upload_evidence(talk: Any) -> tuple[str, str] | None:
    """Return the stored upload day and the identity it came from.

    Both halves come out of the same `source_identity` block. The talk's own
    `youtube_id` is deliberately not consulted: the bound is derived from that
    block, so citing anything else could point a later re-check at a different
    recording than the one that produced the date.
    """
    identity = talk.get("source_identity")
    if not isinstance(identity, dict):
        return None
    value = identity.get("upload_date")
    if not isinstance(value, str) or not _ISO_DAY.fullmatch(value.strip()):
        return None
    stamped = value.strip()
    try:
        dt.date.fromisoformat(stamped)
    except ValueError:
        return None
    provider = identity.get("provider")
    video_id = identity.get("video_id")
    if not isinstance(provider, str) or not provider.strip():
        return None
    if not isinstance(video_id, str) or not video_id.strip():
        return None
    return stamped, f"{provider.strip()} {video_id.strip()}"


def classify_talk(talk: Any, *, has_provenance: bool) -> str | None:
    """Name why a talk gets no ceiling, or None when one should be proposed.

    A talk whose date already parses is left alone: this owner knows only that
    the recording was published by some day, which says nothing about how a date
    that exists was arrived at, and one record per talk means writing a ceiling
    there would displace the real account.
    """
    if has_provenance:
        return "provenance_already_recorded"
    recorded = talk.get("date")
    if parse_catalog_date(recorded) is not None:
        return "date_already_comparable"
    absent = recorded is None or (isinstance(recorded, str) and not recorded.strip())
    if not absent:
        # Month precision and anything else the comparator refuses. The ceiling
        # would be unverifiable against it, so the reader refuses it too.
        return "date_present_but_uncomparable"
    if _upload_evidence(talk) is None:
        return "no_provider_upload_date"
    return None


def plan_ceilings(database: Any, *, established_at: str) -> dict[str, Any]:
    """Return the proposals, the refusals, and the coverage this run observed."""
    talks = database.get("talks")
    if not isinstance(talks, list):
        raise DateProvenanceError("tracking database has no readable talks array")
    recorded = {
        record.get("talk_filename")
        for record in database.get("date_provenance", [])
        if isinstance(record, dict)
    }
    proposals: list[dict[str, Any]] = []
    blocked: list[dict[str, str]] = []
    comparable = 0
    for index, talk in enumerate(talks):
        if not isinstance(talk, dict):
            raise DateProvenanceError(f"talks[{index}] must be a JSON object")
        filename = talk.get("filename")
        if not isinstance(filename, str) or not filename.strip():
            raise DateProvenanceError(f"talks[{index}] has no usable filename")
        if parse_catalog_date(talk.get("date")) is not None:
            comparable += 1
        reason = classify_talk(talk, has_provenance=filename in recorded)
        if reason is not None:
            blocked.append({"talk_filename": filename, "reason": reason})
            continue
        evidence = _upload_evidence(talk)
        assert evidence is not None  # classify_talk returned a reason otherwise
        upload, identity = evidence
        proposals.append(
            {
                "schema_version": DATE_PROVENANCE_RECORD_SCHEMA_VERSION,
                "talk_filename": filename,
                "method": CEILING_METHOD,
                "evidence": (
                    f"stored source_identity.upload_date {upload} for {identity}"
                ),
                "established_at": established_at,
                "not_later_than": upload,
            }
        )
    proposals.sort(key=lambda record: record["talk_filename"])
    blocked.sort(key=lambda item: (item["talk_filename"], item["reason"]))
    return {
        "proposals": proposals,
        "blocked": blocked,
        "coverage": {
            "talks": len(talks),
            "with_comparable_date": comparable,
            "with_provenance_before": len(recorded),
            "with_provenance_after": len(recorded) + len(proposals),
            "blocked_by_reason": {
                reason: sum(1 for item in blocked if item["reason"] == reason)
                for reason in BLOCKED_REASONS
            },
        },
    }


def _validate_expected_digest(value: str) -> None:
    if not _SHA256.fullmatch(value):
        raise DateProvenanceError("--expected-sha256 must be 64 lowercase hex digits")


def _validate_as_of(value: str) -> str:
    try:
        parsed = dt.datetime.fromisoformat(value.replace("Z", "+00:00"))
    except ValueError as exc:
        raise DateProvenanceError(
            "--as-of must be a timezone-aware ISO-8601 timestamp"
        ) from exc
    if parsed.tzinfo is None or parsed.utcoffset() is None:
        raise DateProvenanceError("--as-of must be a timezone-aware ISO-8601 timestamp")
    return value


def _backup_path(path: Path, input_sha256: str) -> Path:
    """Beside the owner migration's backups, never loose in the vault root.

    The vault already collects database backups under `.backups/`, and a `.bak`
    dropped next to the database is a stray file in a directory a human reads.
    The operation is named in the filename for the same reason the migration
    names its own: two backups of one input are otherwise indistinguishable.
    """
    return path.parent / ".backups" / f"{path.name}.date-provenance-{input_sha256}.bak"


def execute(
    path: Path,
    *,
    apply: bool,
    expected_sha256: str | None,
    as_of: str,
) -> dict[str, Any]:
    database_path = path.expanduser().absolute()
    if expected_sha256 is not None:
        _validate_expected_digest(expected_sha256)
    if apply and expected_sha256 is None:
        raise DateProvenanceError(
            "--apply requires --expected-sha256 from a dry-run report"
        )
    try:
        snapshot = snapshot_tracking_database(database_path)
        database = decode_json_object(snapshot)
    except TrackingDatabaseIOError as exc:
        raise DateProvenanceError(str(exc)) from exc
    database_path = snapshot.path
    if expected_sha256 is not None and expected_sha256 != snapshot.sha256:
        raise DateProvenanceError(
            "input sha256 precondition failed: "
            f"expected {expected_sha256}, found {snapshot.sha256}"
        )
    try:
        require_current_tracking_database(database)
    except TrackingDatabaseError as exc:
        raise DateProvenanceError(
            f"{exc}; migrate the tracking database before establishing provenance"
        ) from exc

    plan = plan_ceilings(database, established_at=as_of)
    changed = bool(plan["proposals"])
    candidate = json.loads(json.dumps(database))
    if changed:
        candidate.setdefault("date_provenance", [])
        candidate["date_provenance"] = sorted(
            [*candidate["date_provenance"], *plan["proposals"]],
            key=lambda record: record["talk_filename"],
        )
        # The reader is the authority on whether these records are admissible.
        # Validating the candidate before it is rendered keeps a refusal a
        # refusal rather than a file the next reader rejects.
        try:
            require_current_tracking_database(candidate)
        except TrackingDatabaseError as exc:
            raise DateProvenanceError(
                f"proposed provenance would not validate: {exc}"
            ) from exc
    try:
        rendered = render_json_object(candidate) if changed else snapshot.raw
    except (TrackingDatabaseError, TrackingDatabaseIOError) as exc:
        raise DateProvenanceError(str(exc)) from exc

    predicted_backup = _backup_path(database_path, snapshot.sha256) if changed else None
    output_sha256 = hashlib.sha256(rendered).hexdigest()
    database_written = False
    durability_state = "dry_run"
    warnings: list[str] = []
    reported_backup = str(predicted_backup) if predicted_backup is not None else None

    if apply:
        try:
            result = commit_tracking_database(
                snapshot,
                rendered,
                backup=(
                    BackupRequest(path=predicted_backup, input_sha256=snapshot.sha256)
                    if predicted_backup is not None
                    else None
                ),
            )
        except TrackingDatabaseIOError as exc:
            raise DateProvenanceError(str(exc)) from exc
        output_sha256 = result.output_sha256
        database_written = result.installed
        durability_state = result.durability_state
        warnings = list(result.warnings)
        reported_backup = result.backup

    return {
        "schema_version": REPORT_SCHEMA_VERSION,
        "ok": True,
        "mode": "apply" if apply else "dry-run",
        "database": str(database_path),
        "input_sha256": snapshot.sha256,
        "established_at": as_of,
        "changed": changed,
        "database_written": database_written,
        "backup": reported_backup,
        "output_sha256": output_sha256,
        "durability_state": durability_state,
        "warnings": warnings,
        **plan,
    }


def _fail(message: str) -> NoReturn:
    """Refuse on both channels: stdout stays the report, stderr the diagnostic."""
    print(
        json.dumps(
            {"schema_version": REPORT_SCHEMA_VERSION, "ok": False, "error": message},
            indent=2,
        )
    )
    print(f"establish-date-provenance failed: {message}", file=sys.stderr)
    raise SystemExit(1)


def main(argv: list[str] | None = None) -> int:
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument("database", type=Path)
    parser.add_argument("--apply", action="store_true")
    parser.add_argument("--expected-sha256")
    parser.add_argument(
        "--as-of",
        help="timezone-aware ISO-8601 stamp for established_at; defaults to now",
    )
    args = parser.parse_args(argv)
    try:
        as_of = (
            _validate_as_of(args.as_of)
            if args.as_of is not None
            else dt.datetime.now(dt.timezone.utc).isoformat().replace("+00:00", "Z")
        )
        report = execute(
            args.database,
            apply=args.apply,
            expected_sha256=args.expected_sha256,
            as_of=as_of,
        )
    except DateProvenanceError as exc:
        _fail(str(exc))
    print(json.dumps(report, indent=2))
    return 0


if __name__ == "__main__":
    raise SystemExit(main())

skills

vault-ingress

scripts

adherence_baseline.py

aggregate-catalog-feedback.py

apply-source-repairs.py

artifact_locator.py

artifact_metadata.py

artifact_supervisor.py

audit-pattern-catalog.py

audit-persisted-pattern-observations.py

audit-source-identities.py

batch-download-videos.py

build-contact-sheet.py

build-crop-reviewer.py

build-score-basis.py

catalog_dimension_registry.py

catalog_io.py

catalog_normalization.py

check-runtime.py

classify-pptx-evidence.py

cloud_artifacts.py

cooperative_lock.py

crop_frames.py

crop-reviewer-shell.html

crop-reviewer-shell.html.txt

crop-reviewer.js

crop-reviewer.js.txt

establish-date-provenance.py

failure_diagnostics.py

fetch-transcript.py

ingress_contract.py

local_media_contract.py

local_media_download.py

local_media_evidence.py

local_media_process.py

local_media_sampling.py

local_media_transcription.py

local_media_words.py

markdown_deck.py

migrate-tracking-database.py

mutate-tracking-database.py

pattern_evidence.py

pdf_evidence.py

persist-results.py

persisted_pattern_observations.py

pptx_catalog_selection.py

pptx_deck_facts.py

pptx_discovery_contract.py

pptx_evidence.py

pptx_talk_identity.py

pptx-extraction.py

preflight-vault.py

queue_claim_contract.py

queue-state.py

read-tracking-database.py

render-markdown-deck.py

render-vault-status.py

retained_stage.py

return_validation.py

scan-shownotes.py

source_alias_contract.py

source_identity_matching.py

summary_lock.py

sweep-pptx-talk-identity.py

tracking_database_io.py

tracking_database.py

transcript_quality.py

transcript_timing.py

validate-returns.py

vault_root_authority.py

video_evidence.py

video_integrity.py

video-slide-extraction.py

vtt-cleanup.py

write-analysis.py

ytdlp_runtime.py

SKILL.md

README.md

tile.json