Skip to content

Add: Presentation Talk Track Builder - #75

Merged
adilei merged 2 commits into
microsoft:mainfrom
jchha001:add-presentation-talk-track-builder
Jul 17, 2026
Merged

Add: Presentation Talk Track Builder#75
adilei merged 2 commits into
microsoft:mainfrom
jchha001:add-presentation-talk-track-builder

Conversation

@jchha001

Copy link
Copy Markdown
Contributor

Add: Presentation Talk Track Builder

Adds a new skill that turns a slide deck (or slide images / pasted slide text)
into a first-person, ready-to-speak presenter script with delivery cues and a
calibrated timing table.

Why

Users often have a deck they need to present, but they either don't have
speaker notes at all or the existing notes are terse bullet fragments. This
skill turns whatever exists (slide content plus any existing notes, plus
optional supporting context and audience goals) into a natural spoken script
they can rehearse from or paste back into PowerPoint as speaker notes.

Highlights

  • Notes are authoritative. When existing speaker notes contradict slide
    text, the script follows the notes and silently drops the contradicted
    slide text — that's what the author intended to say.
  • First-person, spoken voice with [pause] cues, one-line slide-to-slide
    bridges, and a handoff line at the end.
  • Timing calibration. Word budget = target minutes × chosen pace
    (deliberate 110-130 wpm, average 130-150 wpm, brisk 165-185 wpm) split
    across slides by note density; returns a per-slide word/time table with a
    total.
  • Non-modification guardrail. Slide text, order, layouts, images, charts,
    and animations are never touched. If notes are written back into a .pptx,
    the helper writes them into a copied file only.
  • Explicit inputs: Step 0 captures audience & goals; Step 1 asks for
    optional supporting context (product brief, prior version of the talk,
    FAQ, etc.) so the model has a real escape hatch when notes are thin.
  • Confidentiality and PII guardrail covering enterprise sensitivity
    labels ("Confidential", "Internal Only", "Restricted"), unreleased
    figures, and customer/partner identifiers.

Platforms

Cowork, Copilot Studio, Scout — the bundled helper is Python stdlib only.

Local validation (per CONTRIBUTING.md)

Ran locally against the repo before opening this PR:

  • npm run check:submissions13 submission(s) passed validation.
  • npm run import:submissions → imported cleanly; produced
    src/content/skills/presentation-talk-track-builder.md and
    public/bundles/presentation-talk-track-builder.zip.
  • npm run build57 pages built in ~34s, including
    /skills/presentation-talk-track-builder and new
    /tags/speaker-notes/ and /tags/pptx/ tag pages.

Files

submissions/presentation-talk-track-builder/
├── SKILL.md
├── metadata.json
├── scripts/pptx_talk_track.py
├── references/tone-examples.md
└── assets/example-notes.json

Sample output

Sample runs against real decks (COST AI Foundations for SALT, COST Virtual AI
Session 4) produced first-person spoken scripts with [pause] cues, natural
bridges between slides, and timing tables. On the notes-rich deck, the
"notes-are-authoritative" behaviour was exercised on slides where the visible
slide content is minimal (e.g. section dividers) — the script correctly
followed the speaker notes rather than the sparse slide text.

First-person spoken presenter scripts calibrated to a target duration and speaking pace. Treats existing speaker notes as authoritative when they contradict slide text; never modifies visible slide content. Targets Cowork, Copilot Studio, and Scout.
@jchha001

Copy link
Copy Markdown
Contributor Author

@microsoft-github-policy-service agree company="Microsoft"

@adilei adilei left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed and tested — stdlib-only Python (great sandbox fit for all three platforms), extract/template/apply subcommands round-trip a real deck cleanly, and the notes-are-authoritative design plus timing calibration are well thought out. CI green. Approving.

@adilei
adilei merged commit e503e43 into microsoft:main Jul 17, 2026
2 checks passed
JagmeetChabraMSFT (jchha001) pushed a commit to jchha001/cat-agent-skills that referenced this pull request Jul 23, 2026
Adds authorUrl pointing to my GitHub profile so the CI-derived authorGithub is populated and the skillbot can @-mention me on the first comment of the skill's gallery discussion. Same shape as the previously merged presentation-talk-track-builder skill.
adilei added a commit that referenced this pull request Jul 24, 2026
* Add Regulation Monitor skill

Configure once and run on a schedule. On setup: user names the regulation, the skill auto-discovers the top 5 authoritative sources per topic and STOPS for explicit confirmation, captures a light WorkIQ-derived team profile, and locks everything into a config. Every run visits only the locked source list plus user seeds, classifies items with a topic/jurisdiction/stage/date taxonomy, flags team-relevant items via a keyword match against the WorkIQ profile, and renders a self-contained HTML dashboard. Guardrails: never fabricate, no speculation or rumors, no unofficial sources, empty topics reported as 'No significant developments this period', monitoring-not-advice, paywall/PII disciplined. Domain-agnostic (tax, privacy, AI, health, finance, ESG, labor). Targets Cowork, Copilot Studio, and Scout.

* Regulation Monitor: drop Copilot Studio from platforms

Copilot Studio removed from metadata.json, SKILL.md references section, and references/automation-template.md. Skill was not tested there; supported platforms are Cowork and Scout only.

* Regulation Monitor: address Copilot bot review comments

Fixed:
- Sanitize source_url in dashboard: only http/https/mailto schemes render (drops javascript:, data:, vbscript:); safe URLs get rel=noopener nofollow.
- Topic-scope seed sources: seed_sources -> seed_sources_by_topic (keyed the same as sources_by_topic) so the per-topic fallback-silent check is unambiguous.
- Clarify confirmation checkpoint wording: monitoring SWEEP is what's gated (small discovery pass to propose sources runs first, that's the point of the shortlist).
- Reword 'exactly 5 authoritative sources' to 'up to 5 (default target 5; fewer if the user asks or the domain has fewer)' to remove the internal conflict with the 'user can lower the target' option.
- automation-template.md: drop 'send silently if no items were found' (contradicts the empty-state rule); replace with 'always send, empty topics render as No significant developments this period.'
- sources-and-taxonomy.md: strip the path segment from 'ec.europa.eu/competition' (allowlist is domain-based).
- build_dashboard.py header: step reference for relevant_to_your_team fixed to Step 7 (was Step 4).
- Add note to source_url schema that only http/https/mailto is rendered.

* Regulation Monitor: address second round of bot review

Fixed:
- Add README.md sidecar (per updated submissions/README.md guidance which does support optional README.md — this becomes the detail page main content, is not bundled, and doesn't consume agent tokens). Human-facing overview, setup walkthrough, scheduling, tips.
- Delete references/automation-template.md (its content moved to README.md; keeping it under references/ was bundling human-facing docs verbatim into the agent's context).
- Slim SKILL.md ## Scheduling section to a one-liner that points at the README.md sidecar.
- Update SKILL.md ## References to drop the automation-template bullet.
- Defensive input validation in build_dashboard.py: error out cleanly if items[] is not a list; drop non-dict entries with a stderr warning rather than crashing during render.

* Regulation Monitor: address round 3 bot review

Fixed:
- metadata.json description now correctly reflects the locked-source-list behavior: auto-discovered + user-confirmed sources plus user seeds, with web_search only as a tightly-bounded fallback when a locked source is silent. Previous copy implied web_search runs every time, which conflicted with SKILL.md.
- Removed unused per_stage Counter from build_dashboard.py (dead code; stages are surfaced via the pill on each row, not aggregated in a tile).

* Regulation Monitor: implement client-side sortable dashboard + repair SKILL.md

The SKILL.md frontmatter description had been corrupted (truncated to 'on a') and stale references to references/automation-template.md and 'bundled automation template' remained after that file was removed in the round 2 commit. Rebuilt SKILL.md cleanly with the intended full description and pointer to README.md for scheduling.

Dashboard changes:
- Actually implement client-side sorting: each th is clickable, toggles asc/desc, updates aria-sort for a11y, sorts by data-sort key. Stage column sorts by taxonomy order (numeric); date sorts as ISO strings (lexicographic = chronological); text columns sort case-insensitively. Server-side pre-sort (team-relevant first, then stage, then date desc) still runs so first paint is meaningful.
- Small 'click any column header to sort' hint next to the Items heading so users know it's interactive.
- Updated SKILL.md and README.md copy to say 'client-side sortable' instead of just 'sortable' so the description matches behavior.

* Regulation Monitor: fix date-desc initial sort and drop stale talk-track guardrail text

Two bugs from round 5 bot review:

- sorted_items() sorted ISO date strings ascending (default) despite the docstring claim of descending. Fixed with a two-pass stable sort (date desc first, then stable-sort by (relevant, stage)). Python's sort() doesn't support per-key reverse on tuple elements, so two passes is the cleanest way to get desc on one field and asc on others. Added a comment explaining why. Verified with a two-item smoke test: newer item now renders before older in the initial paint.
- The Confidentiality guardrail bullet in SKILL.md was copy-pasted from the presentation-talk-track-builder skill and still talked about 'slides', 'spoken script', and 'presenter'. Rewrote it in regulation-monitor language: drop non-public sources at ingestion, never add PII/customer identifiers/non-public attribution to the dashboard. Also removed a stale 'Compute timings with code / so the presenter can recalibrate' bullet — same origin, not applicable here.

* Regulation Monitor: keyboard-accessible sortable columns + fix PR body file tree

- Column headers: added tabindex=0, role=button, aria-label per column, focus-visible outline. Sorter now responds to Enter and Space in addition to click. Bot review round 6.
- (Separate) also updating the PR body file tree to drop references/automation-template.md and add README.md — the file tree in the description had gone stale after the round 2 file deletion.

* Regulation Monitor: date-typed comparator + fix stale step reference

- Client-side sorter previously fell through to localeCompare for data-type='date' — worked for our zero-padded ISO strings but the sorter advertised date support that wasn't there. Added an explicit 'date' branch using byte-string comparison (which is stable for ISO 8601 and doesn't rely on JS Date parsing).
- sources-and-taxonomy.md: the item-taxonomy table said relevant_to_your_team is 'derived at Step 4' — should be Step 7. Same class of stale step reference we fixed earlier in build_dashboard.py, missed this one.

* Regulation Monitor: pre-commit audit sweep — concede on SKILL.md structure + code hardening

Ran an independent pre-commit audit before pushing more single-issue fixes to end the review back-and-forth. Rewrote in one clean sweep:

SKILL.md structure — concede fully to the recurring 'SKILL.md too human-facing' bot feedback:
- Frontmatter: single-line description (previous multi-line YAML block scalar got truncated by Scout's skill loader on every re-registration, causing the 'ends with on a' regressions).
- Removed sections: Overview, When to Use, When NOT to Use, Quick Start, Output, Scheduling — all restated content that lives in README.md (which is the intended human-facing sidecar per submissions/README.md, never bundled).
- Kept: Source discipline (agent needs it), Instructions (Steps 0-9), Guardrails, References.
- Renamed Core Instructions -> Instructions.
- Folded the Runtime budget table into Step 5 as an inline bullet list.
- Step 9 now carries the empty-topic rule ('No significant developments this period') directly.

sources-and-taxonomy.md — allowlist cleanup:
- Moved taxfoundation.org and taxpolicycenter.org from the government 'Tax' regulator subsection to 'Reputable trackers and think tanks' — they're think tanks, not regulators.
- Reworded the 'Tax' subsection to remove the 'state DOR sites (already covered by .gov)' parenthetical that looked like a domain entry.

build_dashboard.py — hardening:
- window_days: coerce via int() with try/except and default 7 on bad input.
- topic_name_by_key: skip topics with empty/whitespace key rather than colliding on ''.

* Regulation Monitor: clean load_json errors + spell out items file shape

Two nits from the post-audit bot pass. build_dashboard.py: wrap load_json in try/except so a missing file or malformed JSON exits 2 with a helpful stderr line instead of a raw traceback. Verified with smoke tests. SKILL.md Step 8: spell out that the items file is a JSON object (items array), not a bare array.

* Regulation Monitor: address round 11 review nits

Four fixes from round 11. Skip empty topic keys in KPI tiles loop (was inconsistent with topic_name_by_key which already skips them). Collapse Step 8 dashboard command to a single line so it does not rely on POSIX backslash line-continuation (Scout targets cross-OS). Clarify that trackers and firm alerts are pointers only and recorded items must cite the underlying official document. Remove hbr.org from the default allowlist since it is frequently paywalled and undermines the no-paywall guardrail.

* Regulation Monitor: also skip empty topic keys in Quiet-this-period section

Follow-up to 436a207. The empty-topics loop had the same is-key-empty check pattern as the tiles loop, but only guarded on key being falsy — a whitespace-only key would slip through and render as 'X — No significant developments this period'. Now normalizes via strip() and skips like the tiles loop does. Verified with a two-topic (one blank-key) smoke config that neither the KPI tiles nor the Quiet-this-period section render the blank-key topic.

* Regulation Monitor: harden dashboard input handling

Four defensive-programming nits from bot rounds 12-13. Treat relevant_to_your_team strictly as literal True (not truthy) so a string 'false' does not count as relevant. Normalize a null/missing topic to empty string so it does not render literal 'None' in the dashboard or leak into empty-topic detection. Validate config file is a JSON object with a clean error message (symmetry with items validation). Handle window_days=0 correctly by using explicit None check instead of falsy fallback.

* Regulation Monitor: drop 'works in any shell' claim from Step 8 command

The command still assumes python is on PATH; wording overpromised portability. Trimmed to just 'single-line command'.

* Regulation Monitor: add authorUrl (matches PR #75 pattern)

Adds authorUrl pointing to my GitHub profile so the CI-derived authorGithub is populated and the skillbot can @-mention me on the first comment of the skill's gallery discussion. Same shape as the previously merged presentation-talk-track-builder skill.

---------

Co-authored-by: jchha001 <51886135+jchha001@users.noreply.github.com>
Co-authored-by: adilei <adi.leibowitz@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants