Skip to content

feat(sre-agent): Packaged deployment, Teams delivery, Autonomous mode, UAT-validated scheduled tasks#2111

Draft
MSBrett wants to merge 45 commits intodevfrom
features/sre
Draft

feat(sre-agent): Packaged deployment, Teams delivery, Autonomous mode, UAT-validated scheduled tasks#2111
MSBrett wants to merge 45 commits intodevfrom
features/sre

Conversation

@MSBrett
Copy link
Copy Markdown
Contributor

@MSBrett MSBrett commented Apr 28, 2026

🛠️ Description

Add the FinOps SRE Agent as a new redistributable template under src/templates/sre-agent/. This PR delivers the packaged deployment story, Teams notification delivery, and UAT-validated scheduled tasks.

Key changes:

  • Packaged deployment: scripts/deploy.sh and scripts/deploy.ps1 as single entrypoints wrapping azd up with --clone-env, --replace, --destroy modes and B2B tenant fix
  • Autonomous mode: Switched from Review to Autonomous so scheduled tasks can deliver reports without human approval
  • Teams delivery: All 9 scheduled tasks post final reports to Teams channel via PostTeamsMessage. Knowledge doc documents the correct pattern (built-in tool, not Graph API)
  • Knowledge/Teams split: Financial results go to Teams only. Operational learnings go to #remember / synthesized knowledge only. Never financial data in knowledge.
  • Phase 0 preparation: All tasks read the knowledge base before starting to learn from prior runs
  • Idempotent post-provision: srectl scheduledtask apply instead of create prevents duplicates on re-run
  • 3 knowledge docs: onboarding recommendations, Teams notification guide, known issues and workarounds (7 error categories from UAT)
  • experimentalSettings: EnableV2AgentLoop + EnableWorkspaceTools enabled by default
  • execute_python on analytical subagents for code interpreter access
  • MS Learn docs: docs-mslearn/toolkit/hubs/configure-sre.md duo-reviewed against configure-ai.md and AGENTS.md
  • 18 tests (17 pass, 1 skipped) enforcing packaging, delivery, and knowledge contracts

UAT results: All 9 scheduled tasks executed against live ftk-sre-test3 deployment and delivered to Teams channel. 11 total Teams messages confirmed.

Fixes #

📋 Checklist

🔬 How did you test this change?

  • 🤏 Lint tests
  • 🤞 PS -WhatIf / az validate
  • 👍 Manually deployed + verified
  • 💪 Unit tests
  • 🙌 Integration tests

📦 Deploy to test?

  • Hubs + ADX (managed)
  • Hubs + Fabric (manual)
  • Hubs (manual)
  • Hubs (no data)
  • Workbooks
  • Alerts

🙋‍♀️ Do any of the following that apply?

  • 🚨 This is a breaking change.
  • 🤏 The change is less than 20 lines of code.

📑 Did you update docs/changelog.md?

  • ✅ Updated changelog (required for dev PRs)
  • ➡️ Will add log in a future PR (feature branch PRs only)
  • ❎ Log not needed (small/internal change)

📖 Did you update documentation?

  • ✅ Public docs in docs (required for dev)
  • ✅ Public docs in docs-mslearn (required for dev)
  • ✅ Internal dev docs in docs-wiki (required for dev)
  • ✅ Internal dev docs in src (required for dev)
  • ➡️ Will add docs in a future PR (feature branch PRs only)
  • ❎ Docs not needed (small/internal change)

…, UAT-validated scheduled tasks

- Add deploy.sh and deploy.ps1 as single packaged deployment entrypoints
  - --clone-env, --replace, --destroy modes
  - B2B tenant fix: az account set before azd up
  - Clone-env identity leak fix (unset AZURE_ENV_NAME/RG after sourcing)
- Switch agent action mode from Review to Autonomous
  - Review mode blocked all autonomous tool execution including Teams posts
  - Autonomous mode required for scheduled task delivery without human approval
- All 9 scheduled tasks updated with:
  - Phase 0: read knowledge base before starting work
  - Teams/knowledge split: financial results to Teams only, operational learnings to knowledge only
  - PostTeamsMessage delivery instruction in every task
- Fix duplicate task bug: post-provision uses srectl scheduledtask apply (idempotent)
- Add 3 knowledge docs for agent self-improvement:
  - onboarding-recommendations.md
  - teams-notification-guide.md (PostTeamsMessage vs 403 on Graph API)
  - known-issues-and-workarounds.md (7 error categories from UAT)
- Enable experimentalSettings (EnableV2AgentLoop, EnableWorkspaceTools)
- Enable execute_python on analytical subagents
- README updated as living product contract
- 17 tests passing (TC-4.1a, TC-4.2a enforce packaging and delivery contracts)

UAT validated: all 9 scheduled tasks executed and delivered to Teams channel.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@microsoft-github-policy-service microsoft-github-policy-service Bot added Needs: Documentation 📝 PR needs a changelog entry, public docs, or internal docs before it can be closed Needs: Review 👀 PR that is ready to be reviewed and removed Needs: Documentation 📝 PR needs a changelog entry, public docs, or internal docs before it can be closed labels Apr 28, 2026
…wledge/Teams split, memory model fix

- Add docs-mslearn/toolkit/hubs/configure-sre.md (duo-reviewed against configure-ai.md and AGENTS.md)
- Add to TOC.yml after Configure AI in Copilot Studio
- Switch Bicep from Review to Autonomous mode
- Fix README to reflect Autonomous mode
- Add 3 knowledge docs: onboarding, Teams notification guide, known issues and workarounds
- Fix scheduled task persistence: use #remember for operational notes, not git commits
- Replace 'save to knowledge base' with #remember in all 9 task prompts
- Add Phase 0 (read knowledge before starting) to all 9 tasks
- Enforce knowledge/Teams split: financial results to Teams only, operational learnings to memory only
- Fix post-provision: srectl scheduledtask apply (idempotent) instead of create
- Add known-issues-and-workarounds.md section 0: correct persistence model

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@microsoft-github-policy-service microsoft-github-policy-service Bot added Needs: Documentation 📝 PR needs a changelog entry, public docs, or internal docs before it can be closed and removed Needs: Documentation 📝 PR needs a changelog entry, public docs, or internal docs before it can be closed labels Apr 28, 2026
@MSBrett MSBrett requested a review from Copilot April 28, 2026 19:22
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@microsoft-github-policy-service microsoft-github-policy-service Bot added Needs: Documentation 📝 PR needs a changelog entry, public docs, or internal docs before it can be closed and removed Needs: Documentation 📝 PR needs a changelog entry, public docs, or internal docs before it can be closed labels Apr 28, 2026
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Adds a new redistributable FinOps SRE Agent template under src/templates/sre-agent/, including deploy automation, Bicep infrastructure, Kusto tool catalog, scheduled tasks, knowledge docs, and template validation tests, plus an MSLearn doc entry for configuring the agent with FinOps hubs.

Changes:

  • Introduces 21 Kusto-backed ExtendedAgentTool definitions and wires them into multiple autonomous scheduled tasks.
  • Adds packaged deployment and post-provision automation (deploy.*, post-provision.*) plus full Bicep infra modules (agent, identity, monitoring, RBAC, optional ADX role).
  • Adds template tests and documentation updates (template README, catalog, UAT plan, and MSLearn article + TOC entry).

Reviewed changes

Copilot reviewed 66 out of 66 changed files in this pull request and generated 11 comments.

Show a summary per file
File Description
src/templates/sre-agent/tools/top-services-by-cost.yaml New Kusto tool for top services by effective cost.
src/templates/sre-agent/tools/top-resource-types-by-cost.yaml New Kusto tool for top resource types by cost and count.
src/templates/sre-agent/tools/top-resource-groups-by-cost.yaml New Kusto tool for top resource groups by effective cost.
src/templates/sre-agent/tools/top-other-transactions.yaml New Kusto tool to surface large non-usage/non-commitment purchases.
src/templates/sre-agent/tools/top-commitment-transactions.yaml New Kusto tool for commitment purchase transactions with helper columns.
src/templates/sre-agent/tools/service-price-benchmarking.yaml New Kusto tool to benchmark list/contracted/effective costs and savings.
src/templates/sre-agent/tools/savings-summary-report.yaml New Kusto tool to summarize savings and effective savings rate.
src/templates/sre-agent/tools/reservation-recommendation-breakdown.yaml New Kusto tool to analyze reservation recommendations and break-even.
src/templates/sre-agent/tools/quarterly-cost-by-resource-group.yaml New Kusto tool for quarterly-style RG cost rows.
src/templates/sre-agent/tools/monthly-cost-trend.yaml New Kusto tool for monthly billed/effective cost trends.
src/templates/sre-agent/tools/monthly-cost-change-percentage.yaml New Kusto tool for month-over-month cost change percentages.
src/templates/sre-agent/tools/costs-enriched-base.yaml New “base” enriched Costs() query for broader analytics.
src/templates/sre-agent/tools/cost-forecasting-model.yaml New Kusto time-series forecasting tool.
src/templates/sre-agent/tools/cost-by-region-trend.yaml New Kusto tool for regional effective-cost distribution.
src/templates/sre-agent/tools/cost-by-financial-hierarchy.yaml New Kusto tool for hierarchy showback with percent-of-total.
src/templates/sre-agent/tools/cost-anomaly-detection.yaml New Kusto anomaly detection time-series tool.
src/templates/sre-agent/tools/commitment-discount-utilization.yaml New Kusto tool for commitment utilization mix and percent-of-total.
src/templates/sre-agent/tools/ai-token-usage-breakdown.yaml New Kusto tool for Azure OpenAI token/cost breakdown and unit costs.
src/templates/sre-agent/tools/ai-model-cost-comparison.yaml New Kusto tool comparing cost per 1K tokens by model.
src/templates/sre-agent/tools/ai-daily-trend.yaml New Kusto tool for daily AI token/cost trends.
src/templates/sre-agent/tools/ai-cost-by-application.yaml New Kusto tool allocating AI spend by tags (app/team/env/cost center).
src/templates/sre-agent/tests/sprint1-artifacts.test.mjs Adds template validation tests for agents/skills/connectors/infra/scripts/tasks.
src/templates/sre-agent/sre-config/scheduled-tasks/ytd-report.yaml New autonomous YTD finance reporting scheduled task prompt.
src/templates/sre-agent/sre-config/scheduled-tasks/mom-report.yaml New autonomous MoM report scheduled task prompt.
src/templates/sre-agent/sre-config/scheduled-tasks/hubs-health-check.yaml New daily hubs health-check scheduled task prompt.
src/templates/sre-agent/sre-config/scheduled-tasks/cost-optimization.yaml New cost optimization scheduled task prompt (advisor/orphaned/commitments).
src/templates/sre-agent/sre-config/scheduled-tasks/capacity-weekly-supply-review.yaml New weekly capacity supply review scheduled task prompt.
src/templates/sre-agent/sre-config/scheduled-tasks/capacity-quarterly-strategy.yaml New quarterly capacity strategy scheduled task prompt.
src/templates/sre-agent/sre-config/scheduled-tasks/capacity-monthly-planning.yaml New monthly capacity planning scheduled task prompt.
src/templates/sre-agent/sre-config/scheduled-tasks/capacity-daily-monitor.yaml New daily capacity monitor scheduled task prompt.
src/templates/sre-agent/sre-config/scheduled-tasks/ai-workload-cost-analysis.yaml New monthly AI workload cost analysis scheduled task prompt.
src/templates/sre-agent/sre-config/knowledge/teams-notification-guide.md Adds guidance for Teams delivery via built-in PostTeamsMessage tool.
src/templates/sre-agent/sre-config/knowledge/onboarding-recommendations.md Adds onboarding guidance and connector setup constraints.
src/templates/sre-agent/sre-config/knowledge/known-issues-and-workarounds.md Adds UAT-derived known issues/workarounds and data persistence rules.
src/templates/sre-agent/sre-config/connectors/finops-hub-kusto.yaml Adds DataConnector YAML for FinOps Hub Kusto connector contract reference.
src/templates/sre-agent/sre-config/agents/ftk-hubs-agent.yaml Adds/updates hubs specialist agent definition.
src/templates/sre-agent/sre-config/agents/ftk-database-query.yaml Adds/updates KQL specialist agent with tool access list.
src/templates/sre-agent/sre-config/agents/finops-practitioner.yaml Adds/updates FinOps practitioner agent with tools and handoffs.
src/templates/sre-agent/sre-config/agents/chief-financial-officer.yaml Adds/updates CFO agent with tools for finance narratives.
src/templates/sre-agent/sre-config/agents/azure-capacity-manager.yaml Adds/updates capacity manager agent with quota/capacity guardrails.
src/templates/sre-agent/scripts/post-provision.sh Adds bash post-provision automation to apply repo artifacts via srectl.
src/templates/sre-agent/scripts/post-provision.ps1 Adds PowerShell post-provision automation to apply repo artifacts via srectl.
src/templates/sre-agent/scripts/deploy.sh Adds packaged bash deploy wrapper around azd environment workflow.
src/templates/sre-agent/scripts/deploy.ps1 Adds packaged PowerShell deploy wrapper around azd environment workflow.
src/templates/sre-agent/plan.md Adds UAT plan and status tracking for template completeness.
src/templates/sre-agent/infra/bicep/resources.bicep Adds RG-scoped orchestrator wiring identity/monitoring/agent modules.
src/templates/sre-agent/infra/bicep/modules/subscription-rbac.bicep Adds subscription-scope role assignments (Reader + Monitoring Contributor).
src/templates/sre-agent/infra/bicep/modules/sre-agent.bicep Adds SRE Agent resource deployment module + optional data connector resource.
src/templates/sre-agent/infra/bicep/modules/monitoring.bicep Adds Log Analytics + App Insights resources for agent telemetry.
src/templates/sre-agent/infra/bicep/modules/identity.bicep Adds UAMI creation module and outputs.
src/templates/sre-agent/infra/bicep/modules/adx-role.json Adds ARM JSON for ADX AllDatabasesViewer principal assignment (portal flow).
src/templates/sre-agent/infra/bicep/modules/adx-role.bicep Adds Bicep module to assign ADX AllDatabasesViewer.
src/templates/sre-agent/infra/bicep/main.parameters.json Adds azd parameter mapping for main.bicep.
src/templates/sre-agent/infra/bicep/main.json Checks in compiled ARM template output for subscription deployment.
src/templates/sre-agent/infra/bicep/main.bicep Adds subscription entrypoint: RG creation, modules, RBAC, optional ADX role.
src/templates/sre-agent/azure.yaml Adds azd template definition and postprovision hooks.
src/templates/sre-agent/README.md Adds template README with deploy instructions, verification, and connector guidance.
src/templates/sre-agent/CATALOG.md Adds scheduled task catalog and tool gap analysis.
src/templates/sre-agent/AGENTS.md Adds agent instruction metadata and example connection details.
docs-mslearn/toolkit/hubs/configure-sre.md Adds MSLearn article documenting deployment/config of SRE agent with hubs + Teams.
docs-mslearn/TOC.yml Adds TOC entry for the new “Configure an SRE agent” doc.
.gitmodules Adds azcapman submodule pointer for capacity-management lab content.

Comment thread src/templates/sre-agent/AGENTS.md Outdated
Comment thread src/templates/sre-agent/sre-config/scheduled-tasks/mom-report.yaml
Comment thread src/templates/sre-agent/tools/costs-enriched-base.yaml
Comment thread src/templates/sre-agent/scripts/post-provision.sh Outdated
Comment thread src/templates/sre-agent/scripts/post-provision.ps1
Comment thread src/templates/sre-agent/sre-config/scheduled-tasks/ytd-report.yaml
Comment thread src/templates/sre-agent/infra/bicep/modules/sre-agent.bicep Outdated
Comment thread src/templates/sre-agent/README.md Outdated
Comment thread src/templates/sre-agent/infra/bicep/main.json
Comment thread src/templates/sre-agent/tools/costs-enriched-base.yaml
- Remove real subscription/tenant IDs from AGENTS.md, replace with placeholders
- Fix sre-agent.bicep comment: Review → Autonomous
- Fix README architecture diagram: Review → Autonomous
- Regenerate main.json from Bicep (Autonomous mode)
- Remove PyYAML dependency from post-provision scripts (use grep/Select-String)
- Fix KQL isempty()/isnotempty() on integer fields → isnull()/isnotnull()
- Tighten #remember in MOM task to exclude financial figures
- Update ms.date on changelog to 04/28/2026

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@MSBrett
Copy link
Copy Markdown
Contributor Author

MSBrett commented Apr 28, 2026

@copilot re-review please — all 11 findings addressed in commit 9f5ba45. 8 fixed directly, 3 acknowledged as follow-ups (tool parameter specificity in MOM/YTD prompts, required:true metadata in costs-enriched-base).

Copy link
Copy Markdown
Contributor

Copilot AI commented Apr 28, 2026

@MSBrett I'm unable to start working on this because of repository rules that prevent me from pushing to the branch:

  • Changes must be made through a pull request due to branch protection rules

See the documentation for more details.

msbrett and others added 7 commits April 28, 2026 17:42
…custom zone-peers role

Sprint 3: 14 Python tools built via TDD gate pipeline (14/14 done).

Capacity tools (from azcapman scripts):
- vm-quota-usage: ARM REST compute usages with warning/critical thresholds
- zone-mapping: ARM REST checkZonePeers for cross-sub zone alignment
- capacity-reservation-groups: ARM REST CRG list with instanceView utilization
- sku-availability: ARM REST compute SKUs with restriction parsing
- data-freshness-check: Kusto REST querying Hub functions (Costs/Prices/Recommendations/Transactions)
- resource-graph-query: ARM REST Resource Graph for orphaned resource detection
- non-compute-quotas: ARM REST Storage/Network usages + Resource Graph counts
- spot-placement-scores: ARM REST spot placement scores API
- benefit-recommendations: Cost Management REST benefitRecommendations with pagination

Governance tools (from azcapman scripts):
- deploy-budget: ARM REST subscription budget creation with validation
- deploy-bulk-budgets: Resource Graph discovery + per-sub budget deployment
- deploy-anomaly-alert: Cost Management scheduled actions for anomaly detection
- deploy-bulk-anomaly-alerts: Resource Graph discovery + per-sub alert deployment
- suppress-advisor-recommendations: Advisor REST suppression with GUID-validated IDs

Architecture decisions:
- All tools use requests + ARM REST (not azure-mgmt-* SDKs — not pre-installed in sandbox)
- All tools use ManagedIdentityCredential(client_id) for UAMI auth with DefaultAzureCredential fallback
- Entry point is def main(**kwargs) per platform harness requirement
- Write tools include input validation (GUID, email, enum, positive amount)
- Custom role 'FinOps SRE Zone Peers Reader' added for checkZonePeers/action
- data-freshness-check queries Hub functions (Costs/Prices/Recommendations/Transactions) not .show tables

UAT: 6/7 tools pass on live agent. zone-mapping needs the custom role deployed.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
… version

- Removed zone-mapping: requires AvailabilityZonePeering feature + custom role
  that cannot be verified end-to-end in this session. Documented the feature
  registration prerequisite in README for future reintroduction.
- Removed spot-placement-scores: requires Microsoft.Compute/locations/
  placementScores/generate/action not included in Reader role.
- Fixed deploy-bulk-budgets, deploy-bulk-anomaly-alerts, suppress-advisor-
  recommendations: replaced azure.mgmt.resourcegraph SDK (not installed in
  sandbox) with ARM REST API for Resource Graph queries.
- Fixed spot-placement-scores API version from 2024-11-01 (nonexistent) to
  2024-06-01-preview before removal.
- Moved custom role creation from Bicep to post-provision.sh for management
  group scope flexibility.
- Added AvailabilityZonePeering feature registration to README prerequisites.
- Verified vm-quota-usage returns 215 real quotas on live agent with UAMI auth.
- All 12 remaining Python tools pass local testing (14/14 local, 12 deployed).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ew capacity audits

T-4.1: Wired 12 Python tools into all 9 existing scheduled tasks. Each task
prompt now references the relevant Python tools by name and instructs the
agent to pass client_id for UAMI authentication. Replaced az CLI fallback
references with Python tool equivalents.

T-4.2: Created 9 new scheduled tasks from azcapman lab mapping:
- ComputeUtilizationTrend (weekly): VM quota utilization trends
- StoragePaasGrowthForecast (monthly): storage/PaaS growth projection
- SkuAvailabilityAudit (weekly): SKU restrictions across regions
- NonComputeQuotaAudit (weekly): storage/network quota health
- BudgetCoverageAudit (monthly): subscriptions missing budgets
- AlertCoverageAudit (monthly): subscriptions missing anomaly alerts
- MonitoringScopeValidation (weekly): Hub coverage vs active subscriptions
- BenefitRecommendationReview (weekly): reservation/savings plan recommendations
- AdvisorSuppressionReview (monthly): stale/expired Advisor suppressions

T-4.3: All 18 tasks deployed to live agent via srectl scheduledtask apply.
Old duplicates cleaned up. Converted all tasks to v1 YAML format (snake_case)
required by the srectl API.

T-4.4: README updated with final inventory — 33 tools (21 Kusto + 12 Python),
18 scheduled tasks.

T-4.5: post-provision.sh already uses directory glob iteration — no changes
needed for new tasks.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…se and attempt git commits

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…emove set -e

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…-provision tests

- Added EnableCodeInterpreter and EnableMemory to experimentalSettings
- Updated tests: removed repo connector assertions, relaxed apply-yaml to accept tool/agent apply

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ation as portal step

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 117 out of 117 changed files in this pull request and generated 5 comments.

Comment on lines +70 to +72
experimentalSettings: {
EnableWorkspaceTools: true
}
Copy link

Copilot AI Apr 29, 2026

Choose a reason for hiding this comment

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

experimentalSettings is missing EnableV2AgentLoop: true. The repo test suite expects both EnableV2AgentLoop and EnableWorkspaceTools enabled for this template, and leaving it out will break TC-5.2 (and may prevent the newer agent loop behavior the template relies on). Add EnableV2AgentLoop: true alongside EnableWorkspaceTools: true.

Copilot uses AI. Check for mistakes.
Comment on lines +1 to +12
api_version: azuresre.ai/v1
kind: ScheduledTask
metadata:
name: YTD
owner:
version:
tags:
spec:
name: YTD
cron_expression: ''
agent_prompt: >-
# Fiscal Year-to-Date Analysis
Copy link

Copilot AI Apr 29, 2026

Choose a reason for hiding this comment

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

These sre-config/scheduled-tasks/scheduledtasks/** YAMLs appear to be exported runtime/task-instance artifacts (BOM at start of file, blank owner/version/tags, cron_expression: '', plus fields like start_time, duration_hours, and a separate cron field). They don’t match the canonical scheduled task definitions in sre-config/scheduled-tasks/*.yaml and (since post-provision doesn’t recurse) won’t be applied anyway. Consider removing this exported scheduledtasks/ tree from the redistributable template, or converting it into a clearly separated example/export location so it can’t be mistaken for deployable config.

Copilot uses AI. Check for mistakes.
spec:
name: YTD
description: Fiscal year-to-date analysis with forecast through end of fiscal year
cron_expression: 0 9 1 * *
Copy link

Copilot AI Apr 29, 2026

Choose a reason for hiding this comment

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

This task is scheduled for 0 9 1 * *, which is the same cron as other heavyweight monthly tasks (e.g., CapacityMonthlyPlanning and AdvisorSuppressionReview). If these run concurrently they can compete for tool quotas, increase execution time, and spam the Teams channel at the same time. Consider staggering monthly tasks (different minutes/hours) to reduce concurrency and improve reliability.

Copilot uses AI. Check for mistakes.
spec:
name: CapacityMonthlyPlanning
description: Monthly capacity planning cycle — forecast demand, procurement pipeline, governance review
cron_expression: 0 9 1 * *
Copy link

Copilot AI Apr 29, 2026

Choose a reason for hiding this comment

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

This task is scheduled for 0 9 1 * *, which is the same cron as other monthly tasks (e.g., YTD and AdvisorSuppressionReview). Running multiple long tasks at the same time can cause tool throttling and longer runtimes. Consider staggering the cron schedules to reduce concurrency.

Copilot uses AI. Check for mistakes.
spec:
name: AdvisorSuppressionReview
description: Monthly review of active Advisor recommendation suppressions for stale or expired decisions
cron_expression: 0 9 1 * *
Copy link

Copilot AI Apr 29, 2026

Choose a reason for hiding this comment

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

This task is scheduled for 0 9 1 * *, which overlaps with other monthly tasks (e.g., CapacityMonthlyPlanning and YTD). Consider staggering the cron schedule to avoid multiple monthly reports running concurrently and posting to Teams at the same time.

Copilot uses AI. Check for mistakes.
msbrett and others added 4 commits April 29, 2026 10:15
Add --dry-run flag to post-provision.sh and -DryRun switch to
post-provision.ps1. When enabled, scripts log every srectl/az command
that would execute without actually calling them. Output uses
[DRY-RUN] prefix per category (skill, agent, tool, knowledge,
scheduled task).

Additional fixes from red-team audit:
- Remove Add-RepoConnector from PS1 (parity with .sh safety removal;
  agent was searching full codebase and attempting git commits)
- Unknown arguments now fail closed in .sh instead of being ignored

Includes TDD test suite:
- tests/test-dry-run.sh (shell contract test)
- tests/Test-DryRun.Tests.ps1 (Pester 5 contract test, 5 cases)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Create new top-level docs section at docs-mslearn/toolkit/sre-agent/
with 9 pages covering the full FinOps SRE Agent feature surface:

- overview.md: what it is, architecture, cost estimate
- deploy.md: prerequisites, azd up, notifications, dry-run, regions
- agents.md: 5 subagents, handoff model, 3 skills
- tools.md: 33 tools (21 Kusto + 12 Python) grouped by domain
- scheduled-tasks.md: 18 deployed tasks by cadence
- knowledge.md: knowledge docs, memory system, persistence
- security.md: RBAC, managed identity, least privilege, run modes
- troubleshooting.md: B2B tenants, known issues, workarounds
- template.md: Bicep params, azd outputs, script flags

Also:
- Add FinOps SRE Agent section to TOC after FinOps hubs
- Remove old Configure SRE agent entry from hubs TOC
- Add redirect from hubs/configure-sre to sre-agent/overview
- Update cross-links in changelog and other docs
- Set ms.reviewer to brettwil (micflan no longer at MS)

Audited against MS Learn metadata requirements and
partner-center-pr/finops/docfx.json globalMetadata contract.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…udio

Add Azure SRE Agent and Azure Copilot Studio as AI integrations
alongside the existing GitHub Copilot in the FinOps hubs architecture
diagram. All three query the ADX / Fabric normalized data layer.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
# Conflicts:
#	docs-mslearn/toolkit/changelog.md
msbrett and others added 30 commits May 1, 2026 07:23
Add safer SRE Agent deployment wiring, remove unsafe teardown validation, and add Azure Data Explorer SKU preflight guidance for FinOps Hub deployments.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
T-5.1: Convert all shell scripts to LF line endings and add .gitattributes
to enforce LF for *.sh files. Fixes macOS bash 3.2 parse failures that
completely blocked deployment.

T-5.2: Add hub cluster URI validation to deploy.sh and deploy.ps1 —
auto-appends /hub database suffix when missing. Update help text and
README examples to document the required format.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Agents have repeatedly corrupted production deployments by running ad-hoc
srectl/az commands against live resources outside the deploy.sh release
process. Add explicit prohibition at the top of AGENTS.md.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Require existing FinOps Hub Kusto connections to resolve, provision, post-provision, and verify without false success. Add lock preflight, post-provision marker validation, and connector/ADX assignment checks.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Stop tracking .mcp.json and ignore it as local AI tooling configuration.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Confidential MCAPS field training material. Will be squashed and
removed before any push to remote. Stays local until cleanup.

Includes:
- 94-slide branded deck with editorial design (ASK/SHOW/TELL)
- build.py — python-pptx pipeline
- 18 evidence packs + 51 SVG charts
- deck-outline-v8.md — 3-table outline source

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Pixel review across all 94 slides identified ~80 visual issues. This commit
addresses the highest-leverage Tier 1 fixes (single change → many slides).

## Build script fixes (build.py)
- TELL slides: dynamic accent rule height tracking actual content (was fixed 5.4")
- TELL slides: Monday-move callout shrunk to 0.45" with 12pt font (was 0.6" + 13pt)
- SHOW slides: chart frame now wraps the actual fitted image tightly with 0.05" padding (was 0.1" frame around full panel — chart looked tiny in oversized box)
- SHOW slides no-chart fallback: filters duplicate content; falls back to full-width text when no owner-specific bullets exist

## Outline content fixes (deck-outline-v8.md)
- INDEX titles shortened (slides 0.2/0.3/0.4) — were wrapping and overlapping body
- Honest cluster titles (H.1-H.5) shortened — were wrapping, orphaning words
- Z.1 "Monday after" — removed redundant 1./2./3. prefixes (template adds bullets)
- P1.6.C decision tree — broken from one long sentence into separate bullets

## Verified
- 94 slides build clean, no PowerPoint repair prompt
- Spot-checked: slides 03, 06, 07, 24, 89, 92 — fixes confirmed at full resolution

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
… PUSH)

Confidential MCAPS field training material. Will be squashed/removed before
any push to remote. Stays local until cleanup.

## rubric.py — automated pixel-perfect checker
Hard binary rules. No vibes, no judgement. Catches what humans miss.

  R1: no overlapping text          (text shapes that share any pixel)
  R2: no off-canvas text           (anything past 13.33"x7.50")
  R3: no touching text (<0.10")    (stacked or sandwiched text)
  R4: ovals are circles            (1:1 aspect for OVAL shapes)
  R5: images preserve aspect       (compares native vs embedded ratio)

Usage: python3 rubric.py
Exit code 0 if all rules pass, 1 otherwise.

## build.py fixes
- Chyron moved from 1.05" to 1.25" — clears template title bottom (1.11")
- ASK_B/ASK_C content_top moved to 1.85" — clears chyron bottom
- ASK_B fallback restructured — text+chart-card OR full-width text, never both
  (was rendering bullets twice on no-chart slides → R1 overlap)
- BULLETS body.top moved to 1.25" — clears template title (was touching at 1.20")
- TELL prose y-increment bumped to 0.18" — gap between segments
- Atomic write + lock-file detection — no more PowerPoint-open corruption

## Outline content fixes (deck-outline-v8.md)
- INDEX titles shortened (slides 0.2/0.3/0.4) — were wrapping
- Honest cluster titles (H.1-H.5) shortened — were wrapping/orphaning
- Z.1 'Monday after' — removed redundant 1./2./3. (template adds bullets)
- P1.6.C decision tree — broken from one sentence into separate bullets

## Audit results
Before: 190 failures across 62 slides
After:  0 failures across 0 slides ✅

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Rewrote cell 5 (notes) of every row in deck-outline-v8.md with the 4-section
structure: Why you GAF / Talk track / Anchors / References. Each note grounded
in maenifold memory + evidence packs, with memory:// URIs and concept wikilinks
cited. Notes will feed ElevenLabs voiceover for trio of training videos.

Build: 94 slides, 0 rubric violations.
Notes drafted by 3 SME drafter subagents (cap-manager, finops-practitioner, CFO).

Also adds AGENTS.md operating instructions for the deck workflow.

CONFIDENTIAL: DO NOT PUSH.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The table is now the deck. All user-visible strings live in either:
- Row content cells (per-slide copy via find_prefixed convention)
- DECK-LABELS metadata block at top of deck-outline-v8.md (shared labels)

Changes:
- Delete 11 unused renderers (wheel, matrix, cards, table, three_block, etc.)
  and their helper functions. Only 6 renderers survive (TITLE, BULLETS, INDEX,
  ASK_A, ASK_B, ASK_C) — the kinds actually used by the deck. 1087 lines
  removed.
- Add DECK-LABELS HTML-comment block to deck-outline-v8.md with cover labels,
  ask-footer prefix/separator, ASK_B owners header, ASK_C monday header,
  parser-key prefixes (Subtitle/Audience tag/Co-brand), index entry separator,
  pptx author.
- Add parse_labels() to build.py. All renderers + main() read from LABELS dict.

Build: 94 slides, 0 rubric violations. No English copy literals remain in
build.py — only file paths, regexes, dict keys, and console output.

CONFIDENTIAL: DO NOT PUSH.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Removed every R&D test-tenant evidence value presented as customer truth
(specific dollars, percentages, row counts, and run results from the sample
hub). Each B (Implementation) and C (Details) slide now teaches:
- what the named scheduled task / agent / tool produces
- the structural shape of the Teams card or chart output
- the read pattern (what to look at first, second, third)
- the decision pattern in any customer environment
- the explicit boundary (what this agent does NOT own)

Replaced banned 'Why you GAF' header on all 94 slides with the required
Microsoft-voice 'Why this matters' header per AGENTS.md voice rules.

Anchored all references on docs-mslearn/toolkit/sre-agent/ as the
authoritative product source.

Build passes: 94 slides written. Rubric passes 0/0.

LOCAL ONLY -- DO NOT PUSH.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Frozen the 94-slide unified V8 deck as v8-frozen.pptx.

Added --part {1,2,3,all} flag to build.py (no new script per cardinal
rule). Filters slides by ID against three precompiled regex patterns
that map to the deck's three logical parts.

Built three split decks from the same canonical deck-outline-v8.md:
- part1-deal-motion.pptx (36 slides: 0.1, 0.2, P1.1-P1.11, 1.99)
- part2-operate-motion.pptx (48 slides: 2.0.1, 2.0.2, P2.1-P2.15, 2.99)
- part3-honest-and-close.pptx (8 slides: H.1-H.5, Z.1-Z.3)

All three pass rubric 0/0.

Updated AGENTS.md with frozen-artifact list and per-part build commands.

LOCAL ONLY -- DO NOT PUSH.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Voice: Microsoft style guide. Sentence case. Second person. Plain
language. Single voiceover block per slide. Each note opens with the
customer problem, explains how the agent addresses it, and ends with
the boundary or the operator move.

14 slides re-grounded against memory: positioning-synthesis,
blog-scenario-1, blog-scenario-5, blog-scenario-6, deck-to-agent-mapping,
and the MCAPS asks corpus.

All 4 decks rebuilt and pass rubric 0/0: unified (94), part 1 (36),
part 2 (48), part 3 (8).

LOCAL ONLY -- DO NOT PUSH.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…all 12 docs

Apply Microsoft Writing Style Guide rules to docs-mslearn/toolkit/sre-agent
prose so it reads naturally in narration and in the browser:

- Anaphora rule: first body mention uses full product name 'the FinOps
  toolkit SRE Agent' (with article); subsequent mentions use 'the agent'
  / 'It' / 'the template' / 'the deployment' as fits the referent
- Sentence-style headings: 'Why use FinOps toolkit SRE Agent?' ->
  'When to use the agent' (overview.md) — heading focuses on customer
  task, not product name
- Brevity: split semicolon run-on sentences in get-started.md
- Source citations: remove ~80 redundant '([source YAML](path))'
  parentheticals from kusto-tools.md tool subsections; the 'Source
  YAML:' opener already provides the canonical link
- Bump ms.date to 05/03/2026 across all 12 docs (CI requirement)

Files (12):
- agents.md, deploy.md, get-started.md, knowledge.md, kusto-tools.md,
  overview.md, python-tools.md, scheduled-tasks.md, security.md,
  template.md, tools.md, troubleshooting.md

References:
- learn.microsoft.com/style-guide/grammar/nouns-pronouns
- learn.microsoft.com/style-guide/scannable-content/headings
- learn.microsoft.com/style-guide/top-10-tips-style-voice
- learn.microsoft.com/contribute/content/style-quick-start (machine-translation 'small words' rule)
- learn.microsoft.com/graph/onenote-branding (anaphora pattern)
- learn.microsoft.com/azure/sre-agent/overview (canonical sibling product reference)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- New 8th column 'Asks (verbatim)' between Cluster and Title in all 3 tables.
- Every body row carries the verbatim MCAPS ask theme(s) inline (from
  memory://work/mcaps/mcaps-internal-asks-finops-toolkit-azure-capacity-ai-cost-may-2026).
- H.1-H.5 honest slides correctly pull asks from content cell.
- 11 non-body rows (intros, indexes, end-of-parts, close) use '-' placeholder.
- build.py parser accepts both 7-column (legacy) and 8-column schemas;
  new column is invisible to the renderer (authoring aid only).
- AGENTS.md voice rules locked: speaker note intent (informational, not
  prescriptive), citation requirement, humility (no overclaim language),
  SRECTL caps in narration, research jargon banned, three-paragraph shape.
- All 4 .pptx files rebuilt: 94/36/48/8 slides, rubric 0/0.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- New canonical: slides/*.yaml (94 numbered files, one per slide)
- New build script: build_yaml.py (mirrors build.py, reads YAML)
- Original .md table: deck-outline-v8.md kept; build.py still works
- Both pipelines produce layout-identical output (visual diff verified)
- AGENTS.md updated: YAML is primary source, .md is escape hatch
- Migration backup: deck-outline-v8.md.bak-pre-yaml-migration-*

Why: 8-column markdown table with multi-paragraph cells got fragile.
YAML gives one slide per file, typed fields, multi-line strings, no
pipe-delimiter drift risk.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Top-level dropped from 33 → 20 items:

- archive/ — older versions (v5/v6/v7 outlines, parse_v6.py, stale .pdf,
  qa4 screenshot, .DS_Store, __pycache__/)
- backups/ — every .bak-* of deck-outline-v8.md plus the
  backup-pre-spoken-rewrite-20260503/ directory

Active files at top level:
- slides/ + build_yaml.py (PRIMARY)
- deck-outline-v8.md + build.py (escape hatch)
- rubric.py, source-template.pptx
- 5 build artifact .pptx files
- assets/, charts/, evidence/, renders/

Both build pipelines verified to still work after move (94 slides each).
AGENTS.md updated with new file layout.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The cover slides (0.1 and 2.0.1) previously said:
  Built by FinOps Toolkit | In partnership with Azure SRE Agent product team

That partnership claim was false — we did not build this in partnership
with the SRE Agent PG. Replaced with:
  Built by FinOps Toolkit community | aka.ms/finops/toolkit

Renderer change in build.py: when the right side of the cover banner
is a URL (aka.ms/, http(s)://, www.), drop the 'In partnership with'
prefix and render the URL standalone, right-aligned.

Files changed:
- slides/000-0.1-...yaml + slides/038-2.0.1-...yaml (canonical)
- deck-outline-v8.md (escape hatch, kept in sync)
- build.py render_title (URL detection)
- All 4 .pptx artifacts rebuilt (94/36/48/8, rubric 0/0)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Renamed .copilot/skills/release-deck → yaml-to-deck (per pipeline naming
  convention: docs → doc-to-yaml → YAML → yaml-to-deck → PPTX+TTS)
- Updated SKILL.md frontmatter name and sibling-skill references
- finops-toolkit-sre-agent-release-training.pptx rebuilt clean (content
  identical to previous commit, just rebuild from current YAML state)

Sibling skills doc-to-yaml and narrated-deck are untracked — owned by
another agent's lane; they will commit separately.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Snapshot of full .copilot/skills/ state before yaml-to-deck buildout:
- doc-to-yaml: other agent's docs → YAML pipeline
- narrated-deck: legacy YAML → PPTX (to be archived/folded into yaml-to-deck)
- yaml-to-deck: my stub (already committed in fd7bc13)

Committing as a single baseline so dogfood + buildout work has a clean
restore point.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
What this commit does
- Builds out the yaml-to-deck skill from a stub to a complete
  YAML → PPTX + transcripts pipeline.
- Folds narrated-deck's renderer (build_pptx.py), transcript writer,
  template prep, and orchestrator (consume.py) into yaml-to-deck so
  one skill owns the full output side.
- Archives narrated-deck under _archive/ to take it out of skill-trigger
  rotation while preserving the work.

yaml-to-deck contents now
- SKILL.md      — covers both general docs-derived YAML (TITLE/BULLETS/
                  TABLE/CODE/CALLOUT/OUTRO) and the V8 SRE deck
                  (ASK_A/B/C/INDEX) by pointing at the project's
                  build_yaml.py for those specialized layouts.
- scripts/
    build_pptx.py        — branded renderer (FinOps Toolkit purple,
                           hexagon logo, MS Learn typography)
    consume.py           — orchestrator: YAML dir → pptx + transcripts
                           + scenes.json
    transcript.py        — TTS-ready .txt with SSML <break> tags
    prepare_template.py  — strips orphan slide parts from master
    lint.py              — schema + voice + citation + render-hazard
                           checks; deliberate-bad input produces 8
                           errors + 10 warnings; clean input passes
- references/
    yaml-schema.md       — full 9-field schema + edge cases
    layout-kinds.md      — every kind, when to use, fields it consumes
    voice-spec.md        — Microsoft Style Guide rules with citations
    output-formats.md    — scenes.json + transcripts + PPTX schemas
    mcaps-asks.md        — V8 SRE deck citation requirement, pointer
                           to canonical asks memory note
- assets/
    source-template-clean.pptx  — branded master (orphan-stripped)
    source-template.pptx        — original
    finops-toolkit-logo.png
    templates/{title,bullets,table,code,callout,outro}.yaml
                                — copy-paste scaffolding per layout
- evals/                        — sample MS Learn docs for regression

Dogfood verification
- Ran end-to-end against docs-mslearn/toolkit/sre-agent/get-started.md:
  doc-to-yaml extracted 7 scenes → emit_yaml produced 7 .yaml files →
  yaml-to-deck rendered 7-slide PPTX (26 MB), 7 transcripts with SSML
  break tags, scenes.json. All slides have populated titles and notes
  (300–1023 chars each).
- V8 SRE deck untouched; build_yaml.py + build.py + 94 slides/*.yaml
  load and parse cleanly. Project's specialized renderer remains the
  source of truth for ASK_A/B/C/INDEX layouts.
- Linter run on V8 deck surfaces 7 real findings (4 'There are/is'
  passive openers in P2.6.C/P2.7.C/P2.8.C/P2.15.B, plus 3 misc warnings)
  — left for a separate voice-cleanup pass.

Constraints respected
- features/sre branch only, no push
- No audio rendered (out of scope per user budget)
- doc-to-yaml left untouched (other agent's work, audited as complete)
- V8 deck source files untouched

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Previous commit shipped a parallel "general" renderer (build_pptx.py)
with TITLE/BULLETS/TABLE/CODE/CALLOUT/OUTRO layouts. The canonical
V8 deck schema uses TITLE/INDEX/BULLETS/ASK_A/ASK_B/ASK_C — 78 of 94
slides silently fell back to BULLETS in the fake renderer.

What changed
- Burned the fake renderer + fake schema:
    - scripts/build_pptx.py (deleted)
    - scripts/consume.py (deleted)
    - scripts/transcript.py (deleted)
    - scripts/prepare_template.py (deleted)
    - assets/templates/*.yaml (deleted)
    - assets/source-template-clean.pptx (deleted)
    - references/yaml-schema.md (deleted)
    - references/layout-kinds.md (deleted)
    - references/output-formats.md (deleted)
    - evals/ (deleted)

- Copied the canonical V8 renderer from the project:
    - scripts/build.py        ← was src/templates/.../release-deck/build.py
    - scripts/build_yaml.py   ← was src/templates/.../release-deck/build_yaml.py
    - scripts/rubric.py       ← was src/templates/.../release-deck/rubric.py
    - assets/source-template.pptx (project's canonical template)

- Parameterized paths via required CLI args. No defaults, no fallbacks:
    - build.py exposes configure(template, labels, charts_dir, assets_dir,
      outline_md, output) — must be called before any render. Module
      globals (SOURCE/LABELS/V8/OUT/CHARTS/ASSETS) start as None.
    - build_yaml.py requires --slides-dir, --template, --labels, --output;
      optional --charts, --assets, --part.
    - Missing required args fail with a clear ERROR message.

- Extracted DECK-LABELS from deck-outline-v8.md into assets/labels.yaml
  so the skill's renderer doesn't depend on the .md outline.

- Bundled one canonical example per layout kind under assets/examples/
  (TITLE/INDEX/BULLETS/ASK_A/ASK_B/ASK_C) — copied from real V8 slides.

- Rewrote SKILL.md to reflect what's actually in the skill.

Verified
- python3 build_yaml.py against the canonical V8 slides/ produces a
  PPTX byte-identical (SHA256 over zip entries excl. timestamps) to
  the project's canonical build:
    skill: 406f90338f2aaa7e1d765ec2f94b444c98deba5d99d677a4a55247a639cdf995
    proj:  406f90338f2aaa7e1d765ec2f94b444c98deba5d99d677a4a55247a639cdf995
- 94 slides rendered, all layouts dispatched correctly.
- rubric.py: 0/0 violations.
- lint.py: 0 errors, 7 known voice warnings on V8 slides.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
New scripts/transcript.py reads slides/*.yaml and emits both:
  - per-scene .txt files (existing behavior)
  - --manifest manifest.json (V8 baseline shape: id, text, chars)

Default break tag is <break time="0.9s"/> to match the V8 deck's
canonical baseline at renders/audio/manifest.json. Configurable via
--break-time. Use --no-breaks for plain text (no SSML).

Verified: regenerating manifest.json from current slides/*.yaml and
byte-comparing to the V8 baseline at
src/templates/sre-agent/training/release-deck/renders/audio/manifest.json:
  - 67/94 entries byte-identical (intro, index, ASK_A, ASK_B, honest,
    close, Z clusters)
  - 27/94 differ — all *.C slides — content was edited after baseline
    manifest was rendered (every drifter has *more* chars, none shrink).
    No baseline exists for the polished versions; verified only by
    render (transcript.py produces self-consistent output).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
ASK_B (SHOW slide) had left bullet column anchored top-of-textbox while
the right chart panel was vertically centered. Visual mismatch — bullets
hugged the top, chart sat in the middle.

Patch: set MSO_ANCHOR.MIDDLE on the left text frame and zero its top/bottom
margins (matches the existing pattern used in ASK_C's callout panel).
Applied to both branches: two-column (when chart asset present) and
full-width (text-only fallback).

Verified: 4-deck rebuild succeeds, rubric 0/0, lint 0 errors.

Note: this diverges from the project's build.py at
src/templates/sre-agent/training/release-deck/build.py — skill version
now slightly improved over the project canonical for ASK_B layout.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…uild

The 23 implementation (B) slides previously referenced dev-environment
chart SVGs that mixed shape with implied real findings. While we rebuild
B/C content from canonical sources (sre-config/, MCAPS asks note), point
all image references at a single placeholder.svg and preserve the
original filename in a YAML comment for restoration.

Rollback anchor: tag release-deck/pre-image-strip-2026-05-03

Touches:
- assets/placeholder.svg (new)
- 23 slides/*.B-*.yaml: screens redirected with '# was: <orig>' marker

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
… skill

P1.1 (Quota != Capacity):
- B/C content+notes rewritten against canonical sources (asks #8/13/14/23/24,
  sre-config/scheduled-tasks/capacity-daily-monitor.yaml, azure-capacity-manager
  agent, real ARM surfaces). Spoken-voice notes per Microsoft Voice rules.
- A slide unchanged.
- All three pass yaml-to-deck lint clean. Render verified — P1.1.C dark navy
  code panel matches P1.2.C cluster sibling.

Tooling:
- rubric.py removed (was a stub pixel checker, not the real linter).
- The mandatory pre-build linter lives in the yaml-to-deck skill at
  ~/.copilot/skills/yaml-to-deck/scripts/lint.py and now enforces
  renderer-token rules: ASK_C must have paired code fences (the rule that
  would have caught today's regression), ASK_A must have a pull-quote marker,
  ASK_B must have a right-column cue.
- AGENTS.md cardinal rule #5 swapped from rubric.py to the lint gate.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…etained

Per user direction: every B (Implementation) and C (Details) slide treated
Contoso/dev-environment artifacts as real customer evidence and over-claimed
on agent capability. Cannot be salvaged by editing — full rewrite required
from canonical sources (MCAPS asks note, sre-config/**, framing memory).

Deleted: 52 files (P1.1-P1.11 B+C, P2.1-P2.15 B+C).
Retained: all 26 A (Ask) slides — verbatim customer voice from MCAPS asks
note, validated separately and untouched.

Rebuild target: each cluster's B and C will be authored fresh, grounded
against:
- memory://work/mcaps/mcaps-internal-asks-finops-toolkit-azure-capacity-ai-cost-may-2026
- memory://thinking/sequential/2026/05/03/session-1777846402443-12272 (canonical framing + 16 banned patterns)
- src/templates/sre-agent/sre-config/** (live YAML, not blog evidence)
- yaml-to-deck skill linter (blocks build on schema/voice/render-token violations)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Needs: Review 👀 PR that is ready to be reviewed

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants