Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
6cf3059
feat(sre-agent): packaged deployment, Teams delivery, Autonomous mode…
Apr 28, 2026
99330ad
feat(sre-agent): add configure-sre.md docs page, Autonomous mode, kno…
Apr 28, 2026
23fd521
docs: add SRE agent changelog entry for v14
Apr 28, 2026
9f5ba45
fix: address Copilot PR review findings
Apr 28, 2026
15b9dbb
feat(sre-agent): 14 Python tools, UAMI auth, Hub function freshness, …
Apr 29, 2026
67263a5
fix(sre-agent): remove untestable tools, fix 3 SDKβ†’REST, fix spot API…
Apr 29, 2026
37a4378
feat(sre-agent): sprint 4 β€” 18 scheduled tasks with Python tools, 9 n…
Apr 29, 2026
6a1707e
fix(sre-agent): remove repo connector β€” causes agent to search codeba…
Apr 29, 2026
923c34d
fix(sre-agent): post-provision uses srectl workspace apply pattern, r…
Apr 29, 2026
588c732
fix(sre-agent): enable EnableCodeInterpreter + EnableMemory, fix post…
Apr 29, 2026
a3f6a6e
fix(sre-agent): strip guessed experimentalSettings, document visualiz…
Apr 29, 2026
416fe7f
feat(sre-agent): add dry-run mode to deployment scripts
Apr 29, 2026
f8f38f4
docs(sre-agent): add FinOps SRE Agent documentation section
Apr 29, 2026
7d6be06
docs(hubs): update architecture diagram with SRE Agent and Copilot St…
May 1, 2026
10c5e2b
Merge remote-tracking branch 'origin/dev' into features/sre
May 1, 2026
3543675
feat: harden SRE agent deployment
May 1, 2026
7490ea9
fix(sre-agent): fix CRLF line endings and validate hub cluster URI (#P0)
May 1, 2026
115cb45
fix(sre-agent): prohibit manual Azure resource intervention in AGENTS.md
May 1, 2026
0e2d8c2
fix(sre-agent): harden existing hub deployment
May 2, 2026
2848a56
chore: remove local MCP config
May 2, 2026
b7ff32a
chore(sre-agent): update docs and agent naming
May 2, 2026
7ce06bf
WIP: V8 SRE agent release training deck (LOCAL ONLY β€” DO NOT PUSH)
May 3, 2026
86bf43f
WIP: Tier 1 pixel-perfect fixes (LOCAL ONLY β€” DO NOT PUSH)
May 3, 2026
2aa5d79
WIP: V8 deck pixel-perfect rubric + 0 violations (LOCAL ONLY β€” DO NOT…
May 3, 2026
9584658
V8 deck: GAF-structured speaker notes for all 94 slides
May 3, 2026
eaf90f6
V8 deck: remove all hardcoded English copy from build.py
May 3, 2026
dc8f8fa
V8 deck: rewrite all slides to teach product, not narrate Contoso
MSBrett May 3, 2026
8f2b0aa
V8 deck: freeze unified pptx, add --part flag, build 3 split decks
MSBrett May 3, 2026
24690fe
V8 deck: speaker notes rewritten as voiceover narration
MSBrett May 3, 2026
ed295c3
docs(sre-agent): apply Microsoft Style Guide anaphora and brevity to …
May 3, 2026
f6adf16
V8 deck: add Asks (verbatim) column to canonical, lock voice rules
May 3, 2026
a6cfb65
V8 deck: migrate to per-slide YAML, keep MD as escape hatch
May 3, 2026
423e573
V8 deck: reorganize release-deck folder
May 3, 2026
c8e0127
V8 deck: fix cover attribution β€” drop false partnership claim
May 3, 2026
fd7bc13
release-deck rename β†’ yaml-to-deck skill (initial stub)
May 3, 2026
d81af2e
Stage all skills baseline (doc-to-yaml + narrated-deck untracked work)
May 3, 2026
607b893
yaml-to-deck: full skill buildout + narrated-deck folded in
May 3, 2026
9d24824
yaml-to-deck: replace fake renderer with canonical V8 build.py
May 3, 2026
1cef8a8
yaml-to-deck: add transcript.py with manifest.json output
May 3, 2026
ad62d30
yaml-to-deck: vertically center ASK_B left text column
May 3, 2026
b0ae875
release-deck: strip B-slide images to placeholder pending content reb…
May 4, 2026
3a1e839
release-deck: P1.1 cluster B/C rewritten + lint moved to yaml-to-deck…
May 4, 2026
55a473c
release-deck: nuke all B/C slides β€” content unsalvageable, A slides r…
May 4, 2026
29c5d04
chore: update SRE Agent release deck
May 4, 2026
9f3c0a3
chore(sre-agent): apply Microsoft Style Guide tweaks to docs
May 6, 2026
f6aeb2d
feat(sre-agent): add database service quota tool
May 7, 2026
d9601f6
feat(sre-agent): adopt canonical sreagent-templates pattern
May 9, 2026
269b78b
feat(sre-agent): add dry-run deployment mode (default)
May 9, 2026
0ccaeb8
feat(sre-agent): simplify Kusto deployment, add Automatic mode
May 9, 2026
5952b48
fix(sre-agent): actionMode is Autonomous, not Automatic
May 9, 2026
921e5bf
feat(sre-agent): canonicalize deployment and add kusto rbac
May 11, 2026
98ddb94
docs(sre-agent): rewrite deploy.md to match canonical bin/deploy.sh
May 12, 2026
774ddd4
merge: merge dev into SRE branch
May 13, 2026
4395df6
fix(sre-agent): make deploy parameter-driven and redistributable
May 19, 2026
97aa69a
Merge worker/sre-deploy-cli into features/sre
May 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
122 changes: 122 additions & 0 deletions .copilot/skills/_archive/narrated-deck/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
---
name: narrated-deck
description: Consume per-slide YAML files (output of doc-to-yaml or release-deck) and produce a branded FinOps Toolkit PowerPoint deck plus TTS-ready transcript files. Use this skill whenever you have a directory of slide YAML files and want to turn them into a narrated training video deck, generate transcripts for downstream text-to-speech, build the PPTX from a YAML scene plan, or produce the final slide assets in the FinOps Toolkit visual style. Typically chained after doc-to-yaml, which produces the YAML from MS Learn docs. Outputs feed text-to-speech (per-scene .txt β†’ .mp3), gpt-image-2 (optional alternate slide backgrounds), music, sound-effects, and ffmpeg for full video assembly.
---

# narrated-deck

Consume a directory of per-slide YAML files and produce the narrated-video asset set.

| Input | Output |
|---|---|
| `slides/*.yaml` (release-deck schema) | `slides.pptx` (FinOps Toolkit branded) |
| | `transcripts/scene_NN_<slug>.txt` (TTS-ready, one per scene) |
| | `scenes.json` (combined scene index for downstream skills) |

This skill is the second half of the doc-to-video pipeline:

```
docs-mslearn/*.md
↓ doc-to-yaml (extract scenes, normalize voice, emit YAML)
slides/*.yaml
↓ narrated-deck (this skill: build PPTX + write TTS transcripts)
slides.pptx + transcripts/
↓ text-to-speech (each .txt β†’ .mp3 via ElevenLabs / Azure)
↓ gpt-image-2 (optional: replace slide backgrounds with brand art)
↓ music + sound-effects (background bed + transitions)
↓ ffmpeg (compose PPTX-rendered PNGs + audio β†’ MP4)
final video
```

## When this skill triggers

Any of:
- "Build the deck from this YAML"
- "Consume the YAML slides into a PPTX"
- "Make the PowerPoint from `slides/`"
- "Generate transcripts and PPTX from doc-to-yaml output"
- "Render the narrated deck"

## Usage

```
narrated-deck consume <slides_dir> --output <out_dir> [--next "Next module title"]
```

`<slides_dir>` is a directory containing `*.yaml` files in release-deck per-slide format. `<out_dir>` will receive `slides.pptx`, `transcripts/`, and `scenes.json`.

## YAML schema (release-deck-compatible)

Every input file has these keys:

```yaml
id: '1'
order: 0
cluster: overview
asks_verbatim: []
title: 'Heading text'
content: 'β€’ Bullet 1<br/>β€’ Bullet 2'
notes: 'Spoken narration. Already normalized by upstream.<br/><br/>Second paragraph.'
layout:
kind: BULLETS # TITLE | BULLETS | TABLE | CODE | CALLOUT | OUTRO
addresses: [] # release-deck-only (MCAPS asks); ignored here
verdict: null # release-deck-only; ignored here
screens: null # asset directives or null
```

The skill reads files in filename order. Each becomes one slide. Layout choice drives the renderer:

| Layout | Renderer |
|---|---|
| `TITLE` | Hero slide with H1 (from `title`) + subtitle (first sentence of `notes`) |
| `BULLETS` | Standard slide with `title` + `content` bullets |
| `TABLE` | Standard slide with `title` + bullets (TABLE layouts work best when paired with hand-edited YAML carrying actual table data) |
| `CODE` | Standard slide with `title` + monospace block |
| `CALLOUT` | Section header with pull-quote |
| `OUTRO` | Closing slide (uses `--next` flag for "Coming up next" copy) |

Speaker notes pane is populated from the `notes` field verbatim β€” assumes upstream (doc-to-yaml) already applied the Microsoft spoken-voice rules.

## Brand identity

Slides inherit the FinOps Toolkit master template bundled at `assets/source-template-clean.pptx`:
- Purple gradient (`#7B33C0` β†’ `#4E2E7A`)
- FinOps Toolkit hexagon logo
- Microsoft Learn typography

The clean template is generated from the original release-deck `source-template.pptx` by `scripts/prepare_template.py`, which strips orphan slide parts that would otherwise corrupt the output PPTX (causing PowerPoint's "found a problem with content" repair prompt).

## Output layout

```
<out_dir>/
β”œβ”€β”€ slides.pptx ← branded editable deck
β”œβ”€β”€ scenes.json ← combined scene index
└── transcripts/
β”œβ”€β”€ scene_01_intro.txt ← TTS-ready, with <break time="1300ms" /> tags
β”œβ”€β”€ scene_02_what_you_get.txt ← (slide-only marker if narration_only=true)
└── ...
```

## Transcripts

One file per scene at `transcripts/scene_NN_<slug>.txt`. Format:

- Prose-bearing scenes: the YAML `notes` field with `<break time="1300ms" />` between paragraphs
- Slide-only scenes (table/code-dominated, no narration): a marker file starting with `# slide-only`

The break tag is SSML β€” interpreted natively by ElevenLabs and Azure Speech Service. For consumers that don't speak SSML, run `transcript.py --no-breaks` to omit the tags.

## Constraints

- **No paraphrasing.** Speaker notes are written verbatim from the YAML. Voice rules are doc-to-yaml's responsibility, not this skill's.
- **No source-doc access.** This skill only reads YAML; it doesn't touch the original `.md`.
- **Brand-template-bound.** Output uses the bundled `assets/source-template-clean.pptx`. To use a different brand template, replace that file (or run `prepare_template.py` on a new master).

## Constraints on YAML input

- File extension must be `.yaml` (not `.yml`)
- `layout.kind` must be one of: `TITLE`, `BULLETS`, `TABLE`, `CODE`, `CALLOUT`, `OUTRO`
- `notes` should be in spoken voice (anaphora, articles, no source citations) β€” this skill does NOT re-normalize
- For `TABLE` and `CODE` slides, the visual will currently render as a bullet list. Hand-edit the YAML or use release-deck/build_yaml.py for richer rendering of those layouts.

Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Binary file not shown.
52 changes: 52 additions & 0 deletions .copilot/skills/_archive/narrated-deck/evals/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
# narrated-deck β€” evals

This directory contains test cases and reference inputs for the `narrated-deck` skill.

## Test inputs

`inputs/` contains three SRE agent docs of varying complexity, used as fixtures across the eval set:

| Doc | Size | Why it's in the eval set |
|---|---|---|
| `overview.md` | ~1.1k words, 5 scenes | Smallest β€” exercises the basic pipeline + table-driven scene detection |
| `get-started.md` | ~1.1k words, 7 scenes | Medium β€” exercises the normalizer (run-on splitting on prose with semicolons) |
| `kusto-tools.md` | ~2.7k words, 25 scenes | Largest β€” stress-tests the per-doc subagent throughput and confirms source-citation parenthetical removal at scale |

These fixtures are snapshots of `docs-mslearn/toolkit/sre-agent/*.md` taken after the Microsoft Style Guide cleanup commit `ed295c3d`. They're committed alongside the skill so eval results stay reproducible even if the source docs evolve.

## Running the evals

The recommended path is per-doc subagent fan-out β€” spawn one subagent per eval, each invoking the skill on its assigned input. The orchestrator collates results.

For a quick local check (single doc, no subagents):

```bash
python3 .copilot/skills/narrated-deck/scripts/convert.py \
.copilot/skills/narrated-deck/evals/inputs/overview.md \
--output .copilot/skills/narrated-deck/evals/outputs/eval-1
```

For the full batch (still single-process β€” subagent fan-out is the calling agent's responsibility):

```bash
python3 .copilot/skills/narrated-deck/scripts/convert.py \
.copilot/skills/narrated-deck/evals/inputs/overview.md \
.copilot/skills/narrated-deck/evals/inputs/get-started.md \
.copilot/skills/narrated-deck/evals/inputs/kusto-tools.md \
--output .copilot/skills/narrated-deck/evals/outputs/batch
```

## What to verify in the outputs

For each eval directory, check:

1. **`scenes.json`** β€” scene count matches the doc's H2 count (minus dropped sections). `narration_only: true` flags appear on table/code-dominated scenes.
2. **`transcripts/scene_NN_*.txt`** β€” prose scenes carry natural-sounding narration with `<break time="1300ms" />` between paragraphs. Slide-only scenes are marker files starting with `# slide-only`.
3. **`deck-outline.md`** β€” 7-cell table parses cleanly (no broken pipes from unescaped `|` in cell content). Speaker notes reproduce the transcript content with `<br/>` instead of `<break>`.
4. **`slides.pptx`** β€” opens in PowerPoint. First slide is the title. Last is the outro. Each H2 from the source is a slide. Speaker notes pane shows the narration.

## Expected qualitative observations

- `overview.md` β†’ 5 prose-bearing scenes + 1 slide-only ("What you get") + outro
- `get-started.md` β†’ 6 prose-bearing scenes + 1 slide-only ("Automation map") + outro
- `kusto-tools.md` β†’ ~25 scenes; "Source validation" is table-only; each tool subsection is a separate `BULLETS` scene
26 changes: 26 additions & 0 deletions .copilot/skills/_archive/narrated-deck/evals/evals.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
{
"skill_name": "narrated-deck",
"evals": [
{
"id": 1,
"name": "overview-short-doc-with-table-and-architecture-flow",
"prompt": "Convert the SRE agent overview doc at .copilot/skills/narrated-deck/evals/inputs/overview.md into TTS-ready transcripts and a slide deck. Output goes to .copilot/skills/narrated-deck/evals/outputs/eval-1/. Apply the canonical FinOps Toolkit voice rules.",
"files": [".copilot/skills/narrated-deck/evals/inputs/overview.md"],
"expected_output": "Per-doc output dir with scenes.json (5 scenes), deck-outline.md (7-cell table), slides.pptx (5+ slides + outro), and transcripts/scene_NN_*.txt (one per scene; 'What you get' should be a slide-only marker file because that section is table-dominated)."
},
{
"id": 2,
"name": "get-started-medium-doc-exercises-normalizer",
"prompt": "Convert the SRE agent get-started doc at .copilot/skills/narrated-deck/evals/inputs/get-started.md into TTS-ready transcripts and a slide deck. Output goes to .copilot/skills/narrated-deck/evals/outputs/eval-2/. Make sure the normalizer splits semicolon run-ons in the prose.",
"files": [".copilot/skills/narrated-deck/evals/inputs/get-started.md"],
"expected_output": "Output dir with all four artifacts. Transcripts must contain natural anaphora ('the agent' / 'It' on second mention). 'Automation map' section is table-dominated and should produce a slide-only marker."
},
{
"id": 3,
"name": "kusto-tools-long-reference-doc-stress-test",
"prompt": "Convert the SRE agent kusto-tools doc at .copilot/skills/narrated-deck/evals/inputs/kusto-tools.md into TTS-ready transcripts and a slide deck. Output goes to .copilot/skills/narrated-deck/evals/outputs/eval-3/. This is a 21-tool reference doc β€” the slide deck should have one slide per tool subsection (so ~25 slides total).",
"files": [".copilot/skills/narrated-deck/evals/inputs/kusto-tools.md"],
"expected_output": "Output dir with all four artifacts. ~25 scenes in scenes.json. The deck handles tools as BULLETS scenes with the 'Source YAML:' link preserved as the only inline source reference per tool. No '([source YAML](path))' parentheticals appear in any transcript."
}
]
}
Loading
Loading