# Presentation Talk Track Builder

> Writes natural, first-person spoken presenter scripts (talk tracks) for the slides in a PowerPoint deck, from slide images, or from pasted slide text. Treats existing speaker notes as AUTHORITATIVE when they contradict slide text. Produces one spoken script per slide with delivery cues, calibrated to a target duration and speaking pace, plus a timing table. Use when the user says "write a script for these slides", "I'm presenting slides X-Y, what should I say", "create a presenter script", "turn my speaker notes into a talk track", or "make a 6-minute script for these slides". Do NOT use to create or edit the visible content of slides, to summarize a recorded meeting or transcript, or for general document writing.

- Skill: `kody-w/presentation-talk-track-builder` (Agent Skill, multi-file: 5 files)
- Install (CLI): `npx skillmds@latest add kody-w/presentation-talk-track-builder`
- Raw SKILL.md: https://api.skillmd.com/api/skills/kody-w/presentation-talk-track-builder/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: kody-w (https://skillmd.com/u/kody-w)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/kody-w/presentation-talk-track-builder

---


## Overview

This skill turns slides into a spoken talk track. For each requested slide it
writes a first-person script the presenter can read aloud, grounded in the
slide's content and — above all — its **speaker notes**. It calibrates the
script length to a target time and speaking pace and returns a timing table
so the presenter knows whether they will land on time.

**Core rule:** the speaker notes are the source of truth. When notes and
slide text disagree, the script follows the notes and silently drops the
contradicted slide text. This is what the author intended to say.

Works across Scout, Copilot Studio, and Cowork. The user can attach a
`.pptx`, provide slide images, paste slide text, or provide an outline.

## When to Use

- "I'm presenting slides 8-11, write a script for each so I can present them."
- "Turn my speaker notes into what I should actually say."
- "Make a ~6-minute talk track for these four slides; I speak fast."
- "Write presenter narration for this deck / these slide images."
- "Give me a word-for-word script with pauses and a handoff to the next
  speaker."

## When NOT to Use

- Creating, designing, or editing the visible content of the slides
  themselves.
- Summarizing a recorded meeting, call, or transcript.
- Writing a standalone document, memo, or article.
- A quick one-line answer that isn't a spoken script — answer inline.

## Quick Start

```
User: "I'm presenting slides 8-11, write a script for each. If the notes
       contradict the slides, follow the notes. Target ~6 minutes, business
       audience."
1. Capture inputs — audience & goals, slide content, optional supporting
   context.
2. Extract BOTH slide text AND speaker notes for the requested slides.
3. Reconcile: where notes contradict slides, follow the notes.
4. Calibrate: target minutes × pace (words/min) = word budget; split by
   slide.
5. Write a first-person script per slide with delivery cues + a handoff line.
6. Return the scripts + a per-slide timing table (words → spoken minutes).
7. Offer to save as speaker notes back into a copy of the deck, or as a doc.
```

## Core Instructions

### Step 0 — Capture audience & goals (required)
Before writing anything, capture:
- **Audience**: who is in the room (or on the call)? Role, seniority,
  technical depth, familiarity with the topic.
- **Event context**: keynote, internal review, customer meeting, training,
  panel, webinar.
- **Presenter goal**: what should the audience *understand*, *decide*, or
  *do* after the presentation?
- **Tone**: formal, conversational, energetic, deliberate.
- **Target duration** and **speaking pace** (see Step 4).

If the user hasn't provided these, ask once. If they decline, use the
defaults below and label them as assumptions in the output:
- Audience: general business audience.
- Tone: clear, confident, conversational.
- Goal: help the audience understand the deck's main message and next step.

### Step 1 — Locate the slides and any supporting context
- If a `.pptx`/`.pptm` is attached or on disk, use it. Check the user's
  likely input folders first (Downloads, current workspace) even when the
  user does not name a path.
- If only slide **images** are provided, work from what's visible and tell
  the user there were no speaker notes to follow.
- If only pasted text or an outline is provided, use that directly.
- Confirm exactly which slide numbers to cover. If the user did not name
  specific slides, cover the whole deck.
- Ask the user for **optional supporting context** the model can weave into
  the narration (but not into the slides themselves): a product one-pager,
  a prior version of the talk, a customer brief, an FAQ, source links, or
  presenter background notes. This is especially useful when the existing
  speaker notes are thin or missing.

### Step 2 — Extract slide text AND speaker notes (both matter)
- Slide text and existing speaker notes can be extracted with the bundled
  helper:
  ```
  python scripts/pptx_talk_track.py extract <deck>.pptx <slides>.json
  ```
  The output JSON contains `title`, `visibleText`, and `existingNotes` per
  slide. Both fields matter.
- If you have python-pptx available you can also use
  `slide.notes_slide.notes_text_frame.text` to read notes.
- Map notes to the correct slide numbers.

### Step 3 — Reconcile notes vs. slides (notes win)
- Read both. Where the notes state something different from the slide (a
  different figure, name, framing, date, or emphasis), write the script to
  match the **notes** and drop the contradicted slide text.
- Where notes add context the slide omits, include it. Where notes are
  sparse, lean on the slide content and any supporting context to fill the
  spoken narrative — never invent.
- Note any contradiction you resolved in a one-line aside after the
  scripts, so the presenter knows why the script diverges from what's on
  screen.

### Step 4 — Calibrate timing to the target
- Ask for (or infer) two things: target duration and speaking pace. If the
  user says they "speak fast", use a brisk pace; otherwise default to
  average.
- Pace reference (words per minute):
  | Pace | WPM | Use when |
  |------|-----|----------|
  | Deliberate | 110-130 | Technical/dense content, non-native audience |
  | Average | 130-150 | Default |
  | Brisk / "I speak fast" | 165-185 | User says they rush or speak quickly |
- Word budget = target minutes × chosen WPM. Divide across slides by
  weight (slides with denser notes get more words). Compute totals and
  per-slide times with a code tool — never estimate arithmetic by hand.
- Presenters speed up live, so aim the *written* script slightly LONG of
  the target (e.g. write to ~6:15 for a 6:00 goal) and add `[pause]` cues,
  which both reinforce key points and naturally slow a fast speaker.

### Step 5 — Write the script (spoken, first person)
- One clearly-headed section per slide: `## Slide N — <short title>`.
- Natural spoken language, first person ("Let me show you…", "Here's why
  this matters…"). Contractions on. Short sentences. No bulleted
  fragments — full spoken prose.
- Put delivery cues in italics or brackets: *[pause]*, *(gesture to the
  diagram)*, *(click to reveal)*, *(hand off)*.
- Open each slide with a one-line bridge from the previous slide; close
  the last covered slide with a handoff line to the next presenter or to
  Q&A if relevant.
- Mirror the deck's terminology and the user's domain voice.
- Tailor the depth and framing to the audience captured in Step 0.

### Step 6 — Deliver with a timing table
- After the scripts, show a table: Slide | approx. words | spoken time,
  with a total and the estimated overall minutes at the chosen pace.
- Call out the easiest lines to cut if running long, and offer to tighten
  any slide to a specific per-slide time.

### Step 7 — Offer to save the output
- Offer to save the scripts back into a copy of the deck as speaker notes,
  using:
  ```
  python scripts/pptx_talk_track.py apply <deck>.pptx <notes>.json <output>.pptx
  ```
  The helper writes speaker notes only. It never changes visible slide
  content, order, formatting, images, charts, or animations.
- Alternatively, offer to save as a Word document for presenter notes.
- Only save a file when the user asks for one.

## Output

- Markdown by default (inline), one section per slide, in slide order.
- First-person spoken prose with italic delivery cues; a handoff line
  where relevant.
- A closing timing table (words + spoken minutes per slide, plus total)
  and a one-line note of any note-vs-slide contradiction resolved.
- Tone matches the deck; length matches the time budget.

See `references/tone-examples.md` for target voice samples.

## Guardrails

- **Notes are authoritative.** When speaker notes contradict slide text,
  follow the notes and drop the contradicted slide content — this is the
  whole point of the skill.
- **Never modify visible slide content.** Slide text, order, layouts,
  images, charts, and animations must stay unchanged. If notes are written
  back to a `.pptx`, only speaker notes in a copied file are updated.
- **Never fabricate facts.** Do not invent figures, names, dates, or
  quotes that aren't in the slides, notes, or supporting context. Mark
  genuine gaps as `[confirm: …]` rather than guessing.
- **Confidentiality and sensitivity.** If slides or notes carry a
  confidentiality label or sensitivity marking (for example
  "Confidential", "Internal Only", "Restricted", or an enterprise
  information-protection label), or contain unreleased figures,
  customer or partner identifiers, or names that aren't public yet,
  flag them and confirm with the user before including that content in
  the spoken script. Never add PII or customer identifiers the source
  material doesn't already contain.
- **Compute timings with code**, not by hand; state the pace assumption
  so the presenter can recalibrate.
- **Cover exactly the requested slides** — no more, no fewer — and
  preserve their order. If the user asks for "the whole deck", cover
  every slide.
- **Do not reproduce third-party copyrighted text** verbatim from slide
  images; paraphrase into the presenter's own spoken words.
- If you can't read the deck after a couple of attempts, say so plainly
  and ask the user to re-attach it — do not substitute placeholder slide
  content.

## Bundled helper script

`scripts/pptx_talk_track.py` uses only the Python standard library.

- `extract <deck>.pptx <slides>.json` — read slide titles, visible text,
  and existing speaker notes.
- `template <deck>.pptx <notes>.json` — write an empty notes JSON template
  with one entry per slide, ready to fill in with generated scripts.
- `apply <deck>.pptx <notes>.json <output>.pptx` — write the generated
  scripts into a copied deck as speaker notes. Never overwrites the
  original.

If a deck has no notes master, open and save it once in PowerPoint (or add
a note to one slide) before rerunning the helper.

**Runtime note:** the helper needs Python 3 available in the runtime.
Scout, Copilot Studio, and Cowork all support this, so the `extract` /
`template` / `apply` commands work on all three platforms. If the
runtime doesn't have Python for any reason, the skill still works —
paste slide text, an outline, or slide images, and the model writes
the talk track and timing table inline. In that case, users who want
the scripts embedded back into a `.pptx` as speaker notes can run the
helper locally with Python 3 installed.

## Assets and references

- `references/tone-examples.md` — short excerpts of the target
  first-person, spoken voice with delivery cues.
- `assets/example-notes.json` — example of the notes JSON shape the
  `apply` command consumes.

<!-- toaster:generated:begin -->

## Run this — do not improvise

This capability's deterministic implementation is a RAPP single-file agent, linked beside this file as `presentation_talk_track_builder_agent.py` and embedded as the fenced Python below (sha256 ce0a3943b95abe6f…; a byte-exact copy is also vaulted in the capsule comment at the end of this file). On a host with sandbox execution, run the linked file directly — if it is missing, write the fence contents verbatim to `presentation_talk_track_builder_agent.py` first:

```bash
python3 presentation_talk_track_builder_agent.py '{"key": "value"}'      # arguments as one JSON object
echo '{"key": "value"}' | python3 presentation_talk_track_builder_agent.py   # or on stdin
python3 presentation_talk_track_builder_agent.py --tool                      # emit the JSON tool contract
```

Treat stdout as a tool result. If it reports missing or unresolved inputs, stop and collect them. If it returns `steps`, execute those steps in order exactly as returned; if it returns `instructions`, follow them with the supplied inputs. Otherwise use the result verbatim. Do not invent behavior beyond that output. On a host without code execution, treat the Parameters schema and the code below as the exact specification and never paraphrase a step. Never edit inside the generated markers; a converter-equipped host can instead restore the original file checksum-verified with the installed `rapp-agent-converter/scripts/toast.py convert SKILL.md --to agent`.

````python  # rapp:deterministic
"""PresentationTalkTrackBuilder -- Writes natural, first-person spoken presenter scripts (talk tracks) for the
slides in a PowerPoint deck, from slide images, or from pasted slide text.
Treats existing speaker notes as AUTHORITATIVE when they contradict slide
text. Produces one spoken script per slide with delivery cues, calibrated to
a target duration and speaking pace, plus a timing table. Use when the user
says "write a script for these slides", "I'm presenting slides X-Y, what
should I say", "create a presenter script", "turn my speaker notes into a
talk track", or "make a 6-minute script for these slides". Do NOT use to
create or edit the visible content of slides, to summarize a recorded
meeting or transcript, or for general document writing.

Generated by the rapp skill from presentation-talk-track-builder. The RCI capsule at the bottom of this file carries the full original; `toast.py convert` restores it byte-exact."""

import json
import re
import sys

try:
    from agents.basic_agent import BasicAgent
except ImportError:  # running OUTSIDE a brainstem -- stay executable anyway.
    class BasicAgent:  # noqa: D101 - minimal stand-in, same contract
        def __init__(self, name=None, metadata=None):
            if name:
                self.name = name
            if metadata:
                self.metadata = metadata

        def perform(self, **kwargs):
            return "Not implemented."

        def system_context(self):
            return None

        def to_tool(self):
            return {"type": "function", "function": {
                "name": self.name,
                "description": self.metadata.get("description", ""),
                "parameters": self.metadata.get("parameters", {})}}

# The procedural layer, verbatim from the source capability.
INSTRUCTIONS = '## Overview\n\nThis skill turns slides into a spoken talk track. For each requested slide it\nwrites a first-person script the presenter can read aloud, grounded in the\nslide's content and — above all — its **speaker notes**. It calibrates the\nscript length to a target time and speaking pace and returns a timing table\nso the presenter knows whether they will land on time.\n\n**Core rule:** the speaker notes are the source of truth. When notes and\nslide text disagree, the script follows the notes and silently drops the\ncontradicted slide text. This is what the author intended to say.\n\nWorks across Scout, Copilot Studio, and Cowork. The user can attach a\n`.pptx`, provide slide images, paste slide text, or provide an outline.\n\n## When to Use\n\n- "I'm presenting slides 8-11, write a script for each so I can present them."\n- "Turn my speaker notes into what I should actually say."\n- "Make a ~6-minute talk track for these four slides; I speak fast."\n- "Write presenter narration for this deck / these slide images."\n- "Give me a word-for-word script with pauses and a handoff to the next\n  speaker."\n\n## When NOT to Use\n\n- Creating, designing, or editing the visible content of the slides\n  themselves.\n- Summarizing a recorded meeting, call, or transcript.\n- Writing a standalone document, memo, or article.\n- A quick one-line answer that isn't a spoken script — answer inline.\n\n## Quick Start\n\n```\nUser: "I'm presenting slides 8-11, write a script for each. If the notes\n       contradict the slides, follow the notes. Target ~6 minutes, business\n       audience."\n1. Capture inputs — audience & goals, slide content, optional supporting\n   context.\n2. Extract BOTH slide text AND speaker notes for the requested slides.\n3. Reconcile: where notes contradict slides, follow the notes.\n4. Calibrate: target minutes × pace (words/min) = word budget; split by\n   slide.\n5. Write a first-person script per slide with delivery cues + a handoff line.\n6. Return the scripts + a per-slide timing table (words → spoken minutes).\n7. Offer to save as speaker notes back into a copy of the deck, or as a doc.\n```\n\n## Core Instructions\n\n### Step 0 — Capture audience & goals (required)\nBefore writing anything, capture:\n- **Audience**: who is in the room (or on the call)? Role, seniority,\n  technical depth, familiarity with the topic.\n- **Event context**: keynote, internal review, customer meeting, training,\n  panel, webinar.\n- **Presenter goal**: what should the audience *understand*, *decide*, or\n  *do* after the presentation?\n- **Tone**: formal, conversational, energetic, deliberate.\n- **Target duration** and **speaking pace** (see Step 4).\n\nIf the user hasn't provided these, ask once. If they decline, use the\ndefaults below and label them as assumptions in the output:\n- Audience: general business audience.\n- Tone: clear, confident, conversational.\n- Goal: help the audience understand the deck's main message and next step.\n\n### Step 1 — Locate the slides and any supporting context\n- If a `.pptx`/`.pptm` is attached or on disk, use it. Check the user's\n  likely input folders first (Downloads, current workspace) even when the\n  user does not name a path.\n- If only slide **images** are provided, work from what's visible and tell\n  the user there were no speaker notes to follow.\n- If only pasted text or an outline is provided, use that directly.\n- Confirm exactly which slide numbers to cover. If the user did not name\n  specific slides, cover the whole deck.\n- Ask the user for **optional supporting context** the model can weave into\n  the narration (but not into the slides themselves): a product one-pager,\n  a prior version of the talk, a customer brief, an FAQ, source links, or\n  presenter background notes. This is especially useful when the existing\n  speaker notes are thin or missing.\n\n### Step 2 — Extract slide text AND speaker notes (both matter)\n- Slide text and existing speaker notes can be extracted with the bundled\n  helper:\n  ```\n  python scripts/pptx_talk_track.py extract <deck>.pptx <slides>.json\n  ```\n  The output JSON contains `title`, `visibleText`, and `existingNotes` per\n  slide. Both fields matter.\n- If you have python-pptx available you can also use\n  `slide.notes_slide.notes_text_frame.text` to read notes.\n- Map notes to the correct slide numbers.\n\n### Step 3 — Reconcile notes vs. slides (notes win)\n- Read both. Where the notes state something different from the slide (a\n  different figure, name, framing, date, or emphasis), write the script to\n  match the **notes** and drop the contradicted slide text.\n- Where notes add context the slide omits, include it. Where notes are\n  sparse, lean on the slide content and any supporting context to fill the\n  spoken narrative — never invent.\n- Note any contradiction you resolved in a one-line aside after the\n  scripts, so the presenter knows why the script diverges from what's on\n  screen.\n\n### Step 4 — Calibrate timing to the target\n- Ask for (or infer) two things: target duration and speaking pace. If the\n  user says they "speak fast", use a brisk pace; otherwise default to\n  average.\n- Pace reference (words per minute):\n  | Pace | WPM | Use when |\n  |------|-----|----------|\n  | Deliberate | 110-130 | Technical/dense content, non-native audience |\n  | Average | 130-150 | Default |\n  | Brisk / "I speak fast" | 165-185 | User says they rush or speak quickly |\n- Word budget = target minutes × chosen WPM. Divide across slides by\n  weight (slides with denser notes get more words). Compute totals and\n  per-slide times with a code tool — never estimate arithmetic by hand.\n- Presenters speed up live, so aim the *written* script slightly LONG of\n  the target (e.g. write to ~6:15 for a 6:00 goal) and add `[pause]` cues,\n  which both reinforce key points and naturally slow a fast speaker.\n\n### Step 5 — Write the script (spoken, first person)\n- One clearly-headed section per slide: `## Slide N — <short title>`.\n- Natural spoken language, first person ("Let me show you…", "Here's why\n  this matters…"). Contractions on. Short sentences. No bulleted\n  fragments — full spoken prose.\n- Put delivery cues in italics or brackets: *[pause]*, *(gesture to the\n  diagram)*, *(click to reveal)*, *(hand off)*.\n- Open each slide with a one-line bridge from the previous slide; close\n  the last covered slide with a handoff line to the next presenter or to\n  Q&A if relevant.\n- Mirror the deck's terminology and the user's domain voice.\n- Tailor the depth and framing to the audience captured in Step 0.\n\n### Step 6 — Deliver with a timing table\n- After the scripts, show a table: Slide | approx. words | spoken time,\n  with a total and the estimated overall minutes at the chosen pace.\n- Call out the easiest lines to cut if running long, and offer to tighten\n  any slide to a specific per-slide time.\n\n### Step 7 — Offer to save the output\n- Offer to save the scripts back into a copy of the deck as speaker notes,\n  using:\n  ```\n  python scripts/pptx_talk_track.py apply <deck>.pptx <notes>.json <output>.pptx\n  ```\n  The helper writes speaker notes only. It never changes visible slide\n  content, order, formatting, images, charts, or animations.\n- Alternatively, offer to save as a Word document for presenter notes.\n- Only save a file when the user asks for one.\n\n## Output\n\n- Markdown by default (inline), one section per slide, in slide order.\n- First-person spoken prose with italic delivery cues; a handoff line\n  where relevant.\n- A closing timing table (words + spoken minutes per slide, plus total)\n  and a one-line note of any note-vs-slide contradiction resolved.\n- Tone matches the deck; length matches the time budget.\n\nSee `references/tone-examples.md` for target voice samples.\n\n## Guardrails\n\n- **Notes are authoritative.** When speaker notes contradict slide text,\n  follow the notes and drop the contradicted slide content — this is the\n  whole point of the skill.\n- **Never modify visible slide content.** Slide text, order, layouts,\n  images, charts, and animations must stay unchanged. If notes are written\n  back to a `.pptx`, only speaker notes in a copied file are updated.\n- **Never fabricate facts.** Do not invent figures, names, dates, or\n  quotes that aren't in the slides, notes, or supporting context. Mark\n  genuine gaps as `[confirm: …]` rather than guessing.\n- **Confidentiality and sensitivity.** If slides or notes carry a\n  confidentiality label or sensitivity marking (for example\n  "Confidential", "Internal Only", "Restricted", or an enterprise\n  information-protection label), or contain unreleased figures,\n  customer or partner identifiers, or names that aren't public yet,\n  flag them and confirm with the user before including that content in\n  the spoken script. Never add PII or customer identifiers the source\n  material doesn't already contain.\n- **Compute timings with code**, not by hand; state the pace assumption\n  so the presenter can recalibrate.\n- **Cover exactly the requested slides** — no more, no fewer — and\n  preserve their order. If the user asks for "the whole deck", cover\n  every slide.\n- **Do not reproduce third-party copyrighted text** verbatim from slide\n  images; paraphrase into the presenter's own spoken words.\n- If you can't read the deck after a couple of attempts, say so plainly\n  and ask the user to re-attach it — do not substitute placeholder slide\n  content.\n\n## Bundled helper script\n\n`scripts/pptx_talk_track.py` uses only the Python standard library.\n\n- `extract <deck>.pptx <slides>.json` — read slide titles, visible text,\n  and existing speaker notes.\n- `template <deck>.pptx <notes>.json` — write an empty notes JSON template\n  with one entry per slide, ready to fill in with generated scripts.\n- `apply <deck>.pptx <notes>.json <output>.pptx` — write the generated\n  scripts into a copied deck as speaker notes. Never overwrites the\n  original.\n\nIf a deck has no notes master, open and save it once in PowerPoint (or add\na note to one slide) before rerunning the helper.\n\n**Runtime note:** the helper needs Python 3 available in the runtime.\nScout, Copilot Studio, and Cowork all support this, so the `extract` /\n`template` / `apply` commands work on all three platforms. If the\nruntime doesn't have Python for any reason, the skill still works —\npaste slide text, an outline, or slide images, and the model writes\nthe talk track and timing table inline. In that case, users who want\nthe scripts embedded back into a `.pptx` as speaker notes can run the\nhelper locally with Python 3 installed.\n\n## Assets and references\n\n- `references/tone-examples.md` — short excerpts of the target\n  first-person, spoken voice with delivery cues.\n- `assets/example-notes.json` — example of the notes JSON shape the\n  `apply` command consumes.'

# Ordered commands lifted verbatim from the capability's own documentation.
STEPS = []


class PresentationTalkTrackBuilderAgent(BasicAgent):
    def __init__(self):
        self.name = 'PresentationTalkTrackBuilder'
        self.metadata = {
          "name": "PresentationTalkTrackBuilder",
          "description": "Writes natural, first-person spoken presenter scripts (talk tracks) for the\nslides in a PowerPoint deck, from slide images, or from pasted slide text.\nTreats existing speaker notes as AUTHORITATIVE when they contradict slide\ntext. Produces one spoken script per slide with delivery cues, calibrated to\na target duration and speaking pace, plus a timing table. Use when the user\nsays \"write a script for these slides\", \"I'm presenting slides X-Y, what\nshould I say\", \"create a presenter script\", \"turn my speaker notes into a\ntalk track\", or \"make a 6-minute script for these slides\". Do NOT use to\ncreate or edit the visible content of slides, to summarize a recorded\nmeeting or transcript, or for general document writing.",
          "parameters": {
            "type": "object",
            "properties": {},
            "required": []
          }
        }
        super().__init__(name=self.name, metadata=self.metadata)

    def perform(self, **kwargs):  # toaster:generated-perform
        return json.dumps({"status": "ok", "instructions": INSTRUCTIONS,
                           "inputs": kwargs,
                           "note": "Prose-only capability: follow INSTRUCTIONS "
                                   "with the given inputs."}, indent=2)

if __name__ == "__main__":
    #     echo '{"arg": "value"}' | python3 presentation_talk_track_builder_agent.py
    #     python3 presentation_talk_track_builder_agent.py '{"arg": "value"}'
    #     python3 presentation_talk_track_builder_agent.py --tool          # emit the JSON tool contract
    _a = sys.argv[1:]
    if _a and _a[0] == "--tool":
        print(json.dumps(PresentationTalkTrackBuilderAgent().to_tool(), indent=2))
    else:
        _raw = _a[0] if _a else (sys.stdin.read().strip() or "{}")
        print(PresentationTalkTrackBuilderAgent().perform(**json.loads(_raw)))

# rci-capsule:v1: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

…(truncated)
