[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-dotnet-flow-analysis":3,"mdc--wm79gp-key":36,"related-org-dotnet-flow-analysis":3101,"related-repo-dotnet-flow-analysis":3270},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":25,"repoUrl":26,"updatedAt":27,"license":28,"forks":29,"topics":30,"repo":31,"sourceUrl":34,"mdContent":35},"flow-analysis","analyze VMR codeflow health","Analyze VMR codeflow health using maestro MCP tools and GitHub MCP tools. USE FOR: investigating stale codeflow PRs, checking if fixes have flowed through the VMR pipeline, debugging dependency update issues, checking overall flow status for a repo, diagnosing why backflow PRs are missing or blocked, subscription health, build freshness, URLs containing dotnet-maestro or \"Source code updates from dotnet\u002Fdotnet\". DO NOT USE FOR: CI build failures (use ci-analysis skill), code review (use code-review skill), general PR investigation without codeflow context, tracing whether a specific commit\u002FPR has reached another repo (use flow-tracing skill). INVOKES: maestro and GitHub MCP tools, flow-health.cs script.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"dotnet",".NET (Microsoft)","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fdotnet.png",[12,16,19,22],{"name":13,"slug":14,"type":15},"GitHub","github","tag",{"name":17,"slug":18,"type":15},"MCP","mcp",{"name":20,"slug":21,"type":15},"Engineering","engineering",{"name":23,"slug":24,"type":15},"CI\u002FCD","ci-cd",12,"https:\u002F\u002Fgithub.com\u002Fdotnet\u002Farcade-skills","2026-07-12T08:21:53.151866",null,18,[],{"repoUrl":26,"stars":25,"forks":29,"topics":32,"description":33},[],"Reuseable AI skills, plugins, agents for use in the dotnet product repos, such as dotnet\u002Fruntime","https:\u002F\u002Fgithub.com\u002Fdotnet\u002Farcade-skills\u002Ftree\u002FHEAD\u002Fplugins\u002Fdotnet-dnceng\u002Fskills\u002Fflow-analysis","---\nname: flow-analysis\ndescription: >\n  Analyze VMR codeflow health using maestro MCP tools and GitHub MCP tools.\n  USE FOR: investigating stale codeflow PRs, checking if fixes have flowed\n  through the VMR pipeline, debugging dependency update issues, checking overall\n  flow status for a repo, diagnosing why backflow PRs are missing or blocked,\n  subscription health, build freshness, URLs containing dotnet-maestro or\n  \"Source code updates from dotnet\u002Fdotnet\".\n  DO NOT USE FOR: CI build failures (use ci-analysis skill), code review\n  (use code-review skill), general PR investigation without codeflow context,\n  tracing whether a specific commit\u002FPR has reached another repo (use\n  flow-tracing skill).\n  INVOKES: maestro and GitHub MCP tools, flow-health.cs script.\nallowed-tools: shell\n---\n\n# Flow Analysis\n\nAnalyze VMR codeflow PR health using **scripts** for data collection and **MCP tools** for enrichment and remediation. For single-PR analysis, `Get-CodeflowStatus.ps1` does comprehensive data collection (VMR commit comparison, forward flow discovery, staleness detection); maestro MCP tools provide subscription triggering and build freshness. For repo-wide flow health, `flow-health.cs` handles batch GitHub scanning in parallel.\n\n> 🚨 **NEVER** use `gh pr review --approve` or `--request-changes`. Only `--comment` is allowed.\n\n## When to Use This Skill\n\nUse this skill when:\n- A codeflow PR (from `dotnet-maestro[bot]`) is stale or failing and you need to understand why\n- You need to check if a specific fix has flowed through the VMR pipeline\n- A PR has a Maestro staleness warning or conflict\n- You want to check overall flow health for a repo (\"what's the flow status for the sdk?\")\n- You need to diagnose why backflow PRs are missing or blocked\n- You're asked \"is this codeflow PR up to date\", \"why is the codeflow blocked\", \"what's the flow status for net11\"\n\n## Prerequisites\n\n- **Maestro MCP server** — provides subscription health, build freshness, and codeflow management. See [lewing\u002Fmaestro.mcp](https:\u002F\u002Fgithub.com\u002Flewing\u002Fmaestro.mcp) for setup.\n- **GitHub CLI (`gh`)** — must be installed and authenticated. Required by `flow-health.cs`.\n\n## Quick Start\n\nFor **\"is the backflow healthy for repo X on branch Y?\"** — use PR Analysis (`Get-CodeflowStatus.ps1 -Repository -Branch`). The script finds the open backflow PR (if any), compares VMR commits, discovers forward flow, and extracts warnings — all in one call.\n\nFor **\"what's the flow status across all repos?\"** or **multi-repo\u002Fmulti-branch scanning** — use the Codeflow Overview (MCP tools for subscription health + build freshness across many repos simultaneously).\n\nFor **investigating a specific PR** — use PR Analysis (`Get-CodeflowStatus.ps1 -PRNumber`). If **no open PR exists**, the script reports this; use MCP tools to check the subscription state.\n\n## Codeflow Concepts\n\n- **Backflow** (VMR → product repo): PRs titled `[branch] Source code updates from dotnet\u002Fdotnet`\n- **Forward flow** (product repo → VMR): PRs titled `[branch] Source code updates from dotnet\u002F\u003Crepo>`\n- **Staleness**: Forward flow merging while backflow PR is open blocks further updates. **Merging `main` into the PR branch does NOT resolve staleness** — it only fixes git conflicts. The only resolutions are: merge the PR as-is, close it, or force trigger the subscription.\n- **VMR backflow vs dependency subs**: Don't confuse stuck dependency subscriptions (from product repos) with VMR backflow problems (from `dotnet\u002Fdotnet`). See [vmr-codeflow-reference.md](references\u002Fvmr-codeflow-reference.md#vmr-backflow-vs-dependency-subscriptions) for details.\n\n## Channel Resolution\n\nUsers refer to channels with shorthand. **.NET major = year − 2015** (2026 → .NET 11, 2025 → .NET 10).\n\n| User says | Resolve to | Example exact channel name |\n|-----------|-----------|---------------------------|\n| `net11` | Filter channels for `11.0` | `.NET 11.0.1xx SDK` |\n| `11.0.1xx` | Use directly | `.NET 11.0.1xx SDK` |\n| `net10 3xx` | Version 10, band 3 | `.NET 10.0.3xx SDK` |\n| `release\u002F10.0.3xx` | Strip `release\u002F` → `10.0.3xx` | `.NET 10.0.3xx SDK` |\n| `main` | Current dev (major = year − 2015, band = `1xx`) | `.NET 11.0.1xx SDK` |\n\n> ⚠️ **Channel filter requires an exact substring match.** Use the full channel name (e.g., `.NET 11.0.1xx SDK`) when filtering codeflow PRs or subscriptions. Partial names like `.NET 11.0` may not match.\n\n### SDK Bands and Forward Flow\n\nThe **1xx band** has full source-build with runtime forward flow. **2xx\u002F3xx bands** consume runtime as prebuilts — missing runtime forward flow on these bands is expected, not broken. See [vmr-codeflow-reference.md](references\u002Fvmr-codeflow-reference.md#sdk-bands-and-forward-flow) for the full band table.\n\n## Analysis Modes\n\n| Question | Mode | Approach |\n|----------|------|----------|\n| \"What's the flow status for X?\" | **Codeflow overview** | Codeflow statuses → subscription health with validate → build freshness |\n| \"Is backflow healthy for X on Y?\" | **PR analysis** | `Get-CodeflowStatus.ps1 -Repository -Branch` → read output → MCP enrichment |\n| \"Why is this PR stale\u002Fblocked?\" | **PR analysis** | `Get-CodeflowStatus.ps1 -PrUrl` → read output → MCP enrichment |\n| \"What's the flow status across all repos?\" | **Codeflow overview** | Codeflow statuses for each repo → subscription health + build freshness |\n| \"Full flow health report for X\" | **Flow health** | `flow-health.cs` script for batch GitHub scanning + maestro enrichment |\n\n## Codeflow Overview Workflow\n\nWhen the user asks \"what codeflow PRs are active?\" or \"what's the flow status?\", start with **codeflow statuses** for the target repo\u002Fbranch — one call shows per-mapping forward flow and backflow status with active PRs and build staleness. Then drill into problems with subscription health and scripts.\n\n> 🚨 **Trust \"commits behind\", don't trust \"builds behind\".** Subscription health returns two kinds of staleness numbers — **\"N commits behind\"** is real commit distance (trust it, report it directly) and **\"~N builds behind\"** (note the `~` prefix) is a meaningless BAR build ID delta that overstates staleness by 10x-300x. For any stale entry showing `~builds behind`, compute the real commit distance yourself (see Step 5).\n\n### Step 0: Quick Status via Codeflow Statuses\n\nFor any repo or the VMR, get **codeflow statuses** for the repo and branch (defaults to `dotnet\u002Fdotnet` on `main`). This returns per-mapping forward flow and backflow status in one call — active PRs, build staleness, and subscription details. Use this as the initial triage to identify which mappings need investigation before drilling into subscription health.\n\n> 💡 **When to skip Step 0**: If you already have a specific PR URL or subscription ID, go directly to PR Analysis or subscription health. Codeflow statuses is for \"what's the overall picture?\" questions.\n\n### Step 1: Check Subscription Health\n\nCheck subscription health for the target repository. This shows which subscriptions are stale and which are current. Entries showing \"N commits behind\" (no `~`) have real commit distances — use those directly. Entries showing \"~N builds behind\" (with `~`) need commit distance computation in Step 5.\n\nUse the `validate` option to enable **cross-validation** — this checks subscription state against GitHub PR state, detects state oscillation patterns, and traces source-manifest commits. Always use `validate` when investigating stuck subscriptions.\n\n> ⚠️ **Output includes ALL subscriptions** (all branches and channels). For a version-specific query like \"net11 status\", filter the results for channels containing your target version (e.g., `11.0`) and the relevant branch (`main` for current dev).\n\n### Step 2: Check Forward Flow\n\n**Before drilling into backflow problems**, check for open forward flow PRs from the product repo into `dotnet\u002Fdotnet`. An open forward flow PR is the #1 cause of backflow staleness — if forward flow is pending, backflow is blocked by design.\n\nIf codeflow statuses (Step 0) shows a forward flow subscription with failures or high commit distance, investigate:\n\n1. **Check the subscription's update history** — look for consecutive `Failed` or state oscillation (e.g., repeating `ApplyingUpdates → MergingPullRequest → ApplyingUpdates`). State oscillation means Maestro keeps retrying but something prevents completion.\n2. **Check if a tracked PR exists** — a forward flow subscription may report failures but actually have a merged-then-reopened PR, or no PR at all. The tracked PR tells you what Maestro thinks is happening.\n3. **Cross-validate against GitHub** — if Maestro says the subscription is failing but a PR exists and is merged, the subscription has a **bookkeeping bug** (Maestro never updated `LastAppliedBuildId`). Use `validate` on subscription health to detect this automatically.\n\n> 🚨 **Forward flow bookkeeping bug**: When a forward flow subscription shows \"N builds behind\" with consecutive failures but GitHub shows PRs merging successfully, this is a known Maestro issue where `LastAppliedBuildId` doesn't update after merge. The subscription is stuck in an infinite retry loop. **Remedy**: force-trigger the subscription — this resets Maestro's state by creating a fresh PR branch.\n\n### Step 3: List Tracked PRs\n\nList all codeflow PRs currently tracked by Maestro, optionally filtering by channel name.\n\n> ⚠️ **Output is large** (200+ PRs across all repos). Filter by `channelName` parameter (use exact name like `.NET 11.0.1xx SDK`), or grep\u002Fsearch the output for your target repo.\n\n### Step 4: Drill Into Problems\n\nFor subscriptions that are stale — whether they have a stuck PR or no PR at all:\n- Check the subscription's update history to find the failure point\n- Check build freshness to rule out VMR build failures (if builds are stale, it's a VMR issue, not Maestro)\n- For stuck PRs, check the PR's age and recent activity — a PR open >3 days with no progress needs attention\n\n### Step 5: Get Real Commit Distance\n\nFor stale entries showing \"~N builds behind\", request **commit details** when checking subscription health. This returns the actual commit count and recent commit metadata (SHA, message, author, date) — no manual GitHub API calls needed.\n\nReport the commit count as \"N commits behind\". Use the recent commit list to explain *what* is behind (e.g., \"3 commits behind — latest: Fix NuGet restore race condition\").\n\n### Step 6: Enrich with GitHub Data\n\nUse GitHub PR details to check state, comments, and merge status for any PRs flagged as problematic.\n\n### Multi-Repo Health Check\n\nWhen asked about flow health across \"all repos\" or a major version (e.g., \"net11 status\"), check the core product repos. Subscription health calls are independent — run them in parallel.\n\n**Core repos**: `dotnet\u002Fruntime`, `dotnet\u002Fsdk`, `dotnet\u002Faspnetcore`, `dotnet\u002Froslyn`, `dotnet\u002Fefcore`, `dotnet\u002Fwinforms`, `dotnet\u002Fwpf`, `dotnet\u002Fmsbuild`\n\n**Branch names differ across repos** — `runtime`\u002F`aspnetcore` use `release\u002FX.0`, `sdk` uses `release\u002FX.0.Nxx`, `msbuild` uses `vsNN.N`, `roslyn` uses `release\u002FdevNN.0` (VS major = .NET major + 8). Current dev is `main` for all. See [vmr-codeflow-reference.md](references\u002Fvmr-codeflow-reference.md#branch-naming-per-repo) for the full table.\n\nWhen asked about a major version, check **all branches** — don't ask for clarification. Present a consolidated cross-repo summary.\n\n## PR Analysis Workflow\n\n> 🚨 **Script-first.** Always run `Get-CodeflowStatus.ps1` first. It produces a `[CODEFLOW_SUMMARY]` JSON block with VMR commit comparison, forward flow discovery, and staleness detection that cannot be replicated by individual MCP calls. **Do NOT re-query the same data via MCP tools** — read and interpret the script output.\n\n### Step 1: Run the Script\n\n```powershell\n# Analyze a specific PR by number\n.\u002Fscripts\u002FGet-CodeflowStatus.ps1 -Repository \"dotnet\u002Fruntime\" -PRNumber 12345\n\n# Check if a PR exists for a repo\u002Fbranch (finds the open backflow PR)\n.\u002Fscripts\u002FGet-CodeflowStatus.ps1 -Repository \"dotnet\u002Fruntime\" -CheckMissing -Branch \"main\"\n\n# Check for missing PRs across all branches\n.\u002Fscripts\u002FGet-CodeflowStatus.ps1 -Repository \"dotnet\u002Fruntime\" -CheckMissing\n```\n\nThe script outputs a `[CODEFLOW_SUMMARY]` JSON block followed by a text summary. **Parse the JSON** — it contains:\n- **`status`**: MERGED \u002F CLOSED \u002F NO-OP \u002F IN_PROGRESS \u002F STALE \u002F ACTIVE\n- **`vmrComparison.aheadBy`**: How many VMR commits behind (the *real* staleness number)\n- **`forwardFlow.prs[]`**: All open forward flow PRs with their state\n- **`warnings[]`**: Maestro staleness and conflict warnings extracted from PR comments\n- **`subscription.id`**: For use with MCP remediation tools\n- **`build.id`**: BAR build ID for triggering\n\n### Step 2: After the Script — Use Its Output\n\n🚨 The script already collected PR metadata, VMR commit distances, forward flow PRs, and Maestro warnings. **Do NOT re-query this data.** Instead:\n\n1. **Read the `[CODEFLOW_SUMMARY]` JSON** and extract key facts:\n   - `vmrComparison.aheadBy` = how far behind (this is VMR commits, NOT builds)\n   - `forwardFlow.prs` = what's blocking backflow (open forward flow = blocked by design)\n   - `warnings` = staleness\u002Fconflict details from Maestro comments\n   - `commits.mergeCommitDetails` = merge commits on the PR (who merged `main` and when — note: merging `main` does NOT resolve staleness)\n   - `status` = overall PR health classification\n\n2. **Use MCP tools only for enrichment** the script can't provide:\n   - Check **build freshness** — are VMR builds healthy? (channel-level, not per-PR)\n   - Check **subscription history** — timeline of when the subscription got stuck (if script shows STALE)\n   - **Trigger the subscription** — to remediate a stuck subscription (needs subscription ID + build ID from script output)\n\n3. **Synthesize** script data + MCP enrichment into a diagnosis and recommendation.\n\n> 💡 **No open PR?** If `-Repository`\u002F`-Branch` finds no open backflow PR, the script reports this. Look up the **tracked PR for the subscription** to check Maestro's view, then check the most recently merged matching PR. A missing PR with a healthy subscription means flow is working normally.\n\n### Step 3: Trace a Fix (Optional)\n\nTo check if a specific fix has reached the PR:\n1. Read `src\u002Fsource-manifest.json` from the VMR at the PR's snapshot commit — find the product repo's `commitSha`\n2. Check if the fix commit is an ancestor of that SHA\n\n## Flow Health Workflow (Script + MCP)\n\nFlow health scanning uses a **hybrid approach**: the `flow-health.cs` script handles batch GitHub API calls in parallel, while maestro MCP tools provide subscription and build freshness data.\n\n> 💡 **Why a script for flow health?** Scanning all branches requires 10-30+ parallel GitHub API calls (PR searches, body fetches, VMR HEAD lookups, commit comparisons). The script fires these in parallel using `Task.Run`; sequential MCP calls would be prohibitively slow.\n\n### Step 1: Run the Script\n\n```shell\n# Scan all branches for a repo\ndotnet .\u002Fscripts\u002Fflow-health.cs -- dotnet\u002Fsdk\n\n# Scan a specific branch only\ndotnet .\u002Fscripts\u002Fflow-health.cs -- dotnet\u002Fsdk --branch main\n```\n\nThe script outputs structured JSON with:\n- **`backflow.branches[]`**: Per-branch status (healthy\u002Fstale\u002Fconflict\u002Fmissing\u002Fup-to-date\u002Freleased-preview), PR numbers, VMR commit mapping, ahead-by counts, **CI status** (`ciStatus`: green\u002Fred\u002Fpending\u002Fnone, `ciFailedCount`\u002F`ciTotalCount` when red)\n- **`backflow.summary`**: Counts of healthy\u002FupToDate\u002Fblocked\u002Fmissing branches\n- **`forwardFlow.prs[]`**: Open forward flow PRs with health status\n- **`forwardFlow.summary`**: Counts of healthy\u002Fstale\u002Fconflicted forward PRs\n\n### Step 2: Enrich with Maestro MCP Data\n\nAfter the script runs, enrich with maestro data:\n\n1. **Build freshness**: For each `vmrBranch` found in the script output, check build freshness with the channel short name to verify official VMR builds are healthy.\n\n2. **Subscription health**: For branches with `status: \"missing\"`, check subscription health for the target repository to diagnose *why* — is the subscription stuck, disabled, or is the channel frozen?\n\n3. **Update history**: For stuck subscriptions, check the subscription's update history to see the timeline — when was the last successful application? Was there a failed attempt?\n\n4. **Tracked PRs**: Cross-reference script results with the codeflow PR list to see Maestro's view of tracked PRs — the script sees GitHub state while Maestro may have a different picture.\n\n5. **Latest builds**: For stuck subscriptions, find the latest build to get the buildId needed for triggering.\n\n### Step 3: Synthesize\n\nCombine script output (GitHub PR state) + MCP data (Maestro health) to produce the diagnosis:\n- If multiple branches show `missing` AND build freshness is stale → VMR build failure (not a Maestro issue)\n- If one branch is `missing` but builds are fresh → Maestro is stuck, suggest triggering\n- If a branch has `status: \"conflict\"` → suggest `darc vmr resolve-conflict`\n\n## Interpreting Results\n\n### Current State\n- **✅ MERGED**: No action needed\n- **✖️ CLOSED**: Maestro should create a replacement; check subscription health\n- **📭 NO-OP**: Empty diff — changes landed via other paths\n- **🔄 IN PROGRESS**: Recent force push within 24h — someone is working on it\n- **⏳ STALE**: No activity for >3 days — needs attention\n- **🔴 CI-RED**: CI is failing — investigate with ci-analysis even if codeflow is otherwise healthy\n- **✅ ACTIVE**: PR has content and recent activity\n\n### CI Status on Open PRs\n\n> 🚨 **Always report CI status for open PRs.** A \"healthy\" PR with red CI is NOT healthy — CI failure is a problem regardless of codeflow state. A stale PR with red CI is stale *because* CI is failing. Report `ciStatus` from the script output in every PR row.\n\n| ciStatus | Meaning | Action |\n|----------|---------|--------|\n| `green` | All checks passing | PR is mergeable if no conflicts |\n| `red` | CI failures (`ciFailedCount`\u002F`ciTotalCount`) | **Always flag this** — even on \"healthy\" PRs. Suggest ci-analysis for deeper investigation. |\n| `pending` | Checks still running | Wait for completion |\n| `none` | No checks found | Unusual — may be freshly pushed |\n\n### Subscription Health Diagnostics\n- **`maestro-stuck`**: Subscription enabled, but last applied build is older than latest — Maestro isn't processing. Trigger the subscription to remediate.\n- **`subscription-disabled`**: Subscription turned off — intentional or oversight\n- **`channel-frozen`**: Latest build is `Released` — no action needed (preview shipped)\n- **`subscription-missing`**: No subscription exists — expected for shipped previews\n\n### Subscription History Patterns\n\nCheck **subscription history** to understand failure timelines. Key patterns: one-off `ApplyingUpdates` failures are normal retry; **alternating failures spanning weeks** indicate systemic problems (conflict, CI, blocked forward flow). Long gaps mean disabled subscription or no new builds. See [vmr-codeflow-reference.md](references\u002Fvmr-codeflow-reference.md#subscription-history-patterns) for the full pattern catalog.\n\n> ❌ **Never assume \"Unknown\" means healthy.** API failures produce Unknown status — exclude from positive counts.\n\n## Generating Recommendations\n\nCheck `isCodeflowPR` first — if the PR isn't from `dotnet-maestro[bot]`, skip codeflow advice.\n\n| State | Action |\n|-------|--------|\n| MERGED | Mention Maestro will create new PR if VMR has newer content |\n| CLOSED | Suggest triggering subscription if ID available |\n| NO-OP | Recommend closing\u002Fmerging to clear state |\n| IN_PROGRESS | Wait, then check back |\n| STALE | Check warnings for what's blocking |\n| ACTIVE | Check freshness and warnings for nuance |\n\n### Remediation via Maestro\n\n| Action | When |\n|--------|------|\n| Trigger subscription | PR was closed or no PR exists for an enabled subscription |\n| Trigger with source repo + channel | Provide source repository URL and channel name to auto-resolve latest build (eliminates manual build lookup) |\n| Force-trigger subscription | Bookkeeping bug — subscription shows failures but PRs merge. Force-trigger overwrites the existing PR branch with fresh content, resetting Maestro's state |\n| Check subscription history | Diagnosing when a subscription got stuck or failed |\n| Check backflow status for a VMR build | Understanding which product repos received a VMR build |\n| Bypass cache after action | After triggering, verify state changed using noCache |\n\n> 💡 **Smart trigger**: When triggering a subscription, you can provide the source repository and channel name instead of looking up the latest build ID manually. The MCP server resolves the latest build automatically.\n\n> 💡 **Force trigger**: Force-trigger overwrites the existing PR branch with fresh content. Use this when the subscription has a bookkeeping bug (consecutive failures but PRs merge) or when the tracked PR is in a broken state. Force-trigger is available via MCP.\n\n### Darc Commands (When MCP Insufficient)\n\n```bash\ndarc vmr resolve-conflict --subscription \u003Csubscription-id>   # Resolve conflicts locally\n```\n\n## Widespread Staleness Pattern\n\nWhen multiple repos are missing backflow simultaneously, the root cause is usually **VMR build failures**, not Maestro:\n\n1. Check **build freshness** across multiple channels — if all are stale, VMR builds are broken\n2. Check public VMR CI builds at `dnceng-public\u002Fpublic` pipeline 278 for failures\n3. Search `dotnet\u002Fdotnet` issues with `[Operational Issue]` label\n\n## References\n\n- **VMR codeflow concepts & darc commands**: [references\u002Fvmr-codeflow-reference.md](references\u002Fvmr-codeflow-reference.md)\n- **VMR build topology**: [references\u002Fvmr-build-topology.md](references\u002Fvmr-build-topology.md)\n- **Maestro MCP server**: [github.com\u002Flewing\u002Fmaestro.mcp](https:\u002F\u002Fgithub.com\u002Flewing\u002Fmaestro.mcp)\n",{"data":37,"body":39},{"name":4,"description":6,"allowed-tools":38},"shell",{"type":40,"children":41},"root",[42,50,88,128,135,140,183,189,238,244,264,281,306,312,398,404,416,602,632,639,665,671,816,822,834,878,884,909,924,930,949,976,1004,1010,1027,1032,1104,1132,1138,1143,1172,1178,1183,1201,1207,1219,1232,1238,1243,1249,1254,1320,1410,1422,1428,1464,1470,1555,1574,1668,1674,1686,1832,1868,1874,1879,1906,1912,1931,1953,1958,2044,2049,2137,2143,2148,2224,2230,2235,2282,2288,2294,2367,2373,2401,2532,2538,2605,2611,2643,2658,2664,2683,2782,2788,2887,2901,2915,2921,2980,2986,2998,3044,3050,3095],{"type":43,"tag":44,"props":45,"children":46},"element","h1",{"id":4},[47],{"type":48,"value":49},"text","Flow Analysis",{"type":43,"tag":51,"props":52,"children":53},"p",{},[54,56,62,64,69,71,78,80,86],{"type":48,"value":55},"Analyze VMR codeflow PR health using ",{"type":43,"tag":57,"props":58,"children":59},"strong",{},[60],{"type":48,"value":61},"scripts",{"type":48,"value":63}," for data collection and ",{"type":43,"tag":57,"props":65,"children":66},{},[67],{"type":48,"value":68},"MCP tools",{"type":48,"value":70}," for enrichment and remediation. For single-PR analysis, ",{"type":43,"tag":72,"props":73,"children":75},"code",{"className":74},[],[76],{"type":48,"value":77},"Get-CodeflowStatus.ps1",{"type":48,"value":79}," does comprehensive data collection (VMR commit comparison, forward flow discovery, staleness detection); maestro MCP tools provide subscription triggering and build freshness. For repo-wide flow health, ",{"type":43,"tag":72,"props":81,"children":83},{"className":82},[],[84],{"type":48,"value":85},"flow-health.cs",{"type":48,"value":87}," handles batch GitHub scanning in parallel.",{"type":43,"tag":89,"props":90,"children":91},"blockquote",{},[92],{"type":43,"tag":51,"props":93,"children":94},{},[95,97,102,104,110,112,118,120,126],{"type":48,"value":96},"🚨 ",{"type":43,"tag":57,"props":98,"children":99},{},[100],{"type":48,"value":101},"NEVER",{"type":48,"value":103}," use ",{"type":43,"tag":72,"props":105,"children":107},{"className":106},[],[108],{"type":48,"value":109},"gh pr review --approve",{"type":48,"value":111}," or ",{"type":43,"tag":72,"props":113,"children":115},{"className":114},[],[116],{"type":48,"value":117},"--request-changes",{"type":48,"value":119},". Only ",{"type":43,"tag":72,"props":121,"children":123},{"className":122},[],[124],{"type":48,"value":125},"--comment",{"type":48,"value":127}," is allowed.",{"type":43,"tag":129,"props":130,"children":132},"h2",{"id":131},"when-to-use-this-skill",[133],{"type":48,"value":134},"When to Use This Skill",{"type":43,"tag":51,"props":136,"children":137},{},[138],{"type":48,"value":139},"Use this skill when:",{"type":43,"tag":141,"props":142,"children":143},"ul",{},[144,158,163,168,173,178],{"type":43,"tag":145,"props":146,"children":147},"li",{},[148,150,156],{"type":48,"value":149},"A codeflow PR (from ",{"type":43,"tag":72,"props":151,"children":153},{"className":152},[],[154],{"type":48,"value":155},"dotnet-maestro[bot]",{"type":48,"value":157},") is stale or failing and you need to understand why",{"type":43,"tag":145,"props":159,"children":160},{},[161],{"type":48,"value":162},"You need to check if a specific fix has flowed through the VMR pipeline",{"type":43,"tag":145,"props":164,"children":165},{},[166],{"type":48,"value":167},"A PR has a Maestro staleness warning or conflict",{"type":43,"tag":145,"props":169,"children":170},{},[171],{"type":48,"value":172},"You want to check overall flow health for a repo (\"what's the flow status for the sdk?\")",{"type":43,"tag":145,"props":174,"children":175},{},[176],{"type":48,"value":177},"You need to diagnose why backflow PRs are missing or blocked",{"type":43,"tag":145,"props":179,"children":180},{},[181],{"type":48,"value":182},"You're asked \"is this codeflow PR up to date\", \"why is the codeflow blocked\", \"what's the flow status for net11\"",{"type":43,"tag":129,"props":184,"children":186},{"id":185},"prerequisites",[187],{"type":48,"value":188},"Prerequisites",{"type":43,"tag":141,"props":190,"children":191},{},[192,213],{"type":43,"tag":145,"props":193,"children":194},{},[195,200,202,211],{"type":43,"tag":57,"props":196,"children":197},{},[198],{"type":48,"value":199},"Maestro MCP server",{"type":48,"value":201}," — provides subscription health, build freshness, and codeflow management. See ",{"type":43,"tag":203,"props":204,"children":208},"a",{"href":205,"rel":206},"https:\u002F\u002Fgithub.com\u002Flewing\u002Fmaestro.mcp",[207],"nofollow",[209],{"type":48,"value":210},"lewing\u002Fmaestro.mcp",{"type":48,"value":212}," for setup.",{"type":43,"tag":145,"props":214,"children":215},{},[216,229,231,236],{"type":43,"tag":57,"props":217,"children":218},{},[219,221,227],{"type":48,"value":220},"GitHub CLI (",{"type":43,"tag":72,"props":222,"children":224},{"className":223},[],[225],{"type":48,"value":226},"gh",{"type":48,"value":228},")",{"type":48,"value":230}," — must be installed and authenticated. Required by ",{"type":43,"tag":72,"props":232,"children":234},{"className":233},[],[235],{"type":48,"value":85},{"type":48,"value":237},".",{"type":43,"tag":129,"props":239,"children":241},{"id":240},"quick-start",[242],{"type":48,"value":243},"Quick Start",{"type":43,"tag":51,"props":245,"children":246},{},[247,249,254,256,262],{"type":48,"value":248},"For ",{"type":43,"tag":57,"props":250,"children":251},{},[252],{"type":48,"value":253},"\"is the backflow healthy for repo X on branch Y?\"",{"type":48,"value":255}," — use PR Analysis (",{"type":43,"tag":72,"props":257,"children":259},{"className":258},[],[260],{"type":48,"value":261},"Get-CodeflowStatus.ps1 -Repository -Branch",{"type":48,"value":263},"). The script finds the open backflow PR (if any), compares VMR commits, discovers forward flow, and extracts warnings — all in one call.",{"type":43,"tag":51,"props":265,"children":266},{},[267,268,273,274,279],{"type":48,"value":248},{"type":43,"tag":57,"props":269,"children":270},{},[271],{"type":48,"value":272},"\"what's the flow status across all repos?\"",{"type":48,"value":111},{"type":43,"tag":57,"props":275,"children":276},{},[277],{"type":48,"value":278},"multi-repo\u002Fmulti-branch scanning",{"type":48,"value":280}," — use the Codeflow Overview (MCP tools for subscription health + build freshness across many repos simultaneously).",{"type":43,"tag":51,"props":282,"children":283},{},[284,285,290,291,297,299,304],{"type":48,"value":248},{"type":43,"tag":57,"props":286,"children":287},{},[288],{"type":48,"value":289},"investigating a specific PR",{"type":48,"value":255},{"type":43,"tag":72,"props":292,"children":294},{"className":293},[],[295],{"type":48,"value":296},"Get-CodeflowStatus.ps1 -PRNumber",{"type":48,"value":298},"). If ",{"type":43,"tag":57,"props":300,"children":301},{},[302],{"type":48,"value":303},"no open PR exists",{"type":48,"value":305},", the script reports this; use MCP tools to check the subscription state.",{"type":43,"tag":129,"props":307,"children":309},{"id":308},"codeflow-concepts",[310],{"type":48,"value":311},"Codeflow Concepts",{"type":43,"tag":141,"props":313,"children":314},{},[315,331,347,372],{"type":43,"tag":145,"props":316,"children":317},{},[318,323,325],{"type":43,"tag":57,"props":319,"children":320},{},[321],{"type":48,"value":322},"Backflow",{"type":48,"value":324}," (VMR → product repo): PRs titled ",{"type":43,"tag":72,"props":326,"children":328},{"className":327},[],[329],{"type":48,"value":330},"[branch] Source code updates from dotnet\u002Fdotnet",{"type":43,"tag":145,"props":332,"children":333},{},[334,339,341],{"type":43,"tag":57,"props":335,"children":336},{},[337],{"type":48,"value":338},"Forward flow",{"type":48,"value":340}," (product repo → VMR): PRs titled ",{"type":43,"tag":72,"props":342,"children":344},{"className":343},[],[345],{"type":48,"value":346},"[branch] Source code updates from dotnet\u002F\u003Crepo>",{"type":43,"tag":145,"props":348,"children":349},{},[350,355,357,370],{"type":43,"tag":57,"props":351,"children":352},{},[353],{"type":48,"value":354},"Staleness",{"type":48,"value":356},": Forward flow merging while backflow PR is open blocks further updates. ",{"type":43,"tag":57,"props":358,"children":359},{},[360,362,368],{"type":48,"value":361},"Merging ",{"type":43,"tag":72,"props":363,"children":365},{"className":364},[],[366],{"type":48,"value":367},"main",{"type":48,"value":369}," into the PR branch does NOT resolve staleness",{"type":48,"value":371}," — it only fixes git conflicts. The only resolutions are: merge the PR as-is, close it, or force trigger the subscription.",{"type":43,"tag":145,"props":373,"children":374},{},[375,380,382,388,390,396],{"type":43,"tag":57,"props":376,"children":377},{},[378],{"type":48,"value":379},"VMR backflow vs dependency subs",{"type":48,"value":381},": Don't confuse stuck dependency subscriptions (from product repos) with VMR backflow problems (from ",{"type":43,"tag":72,"props":383,"children":385},{"className":384},[],[386],{"type":48,"value":387},"dotnet\u002Fdotnet",{"type":48,"value":389},"). See ",{"type":43,"tag":203,"props":391,"children":393},{"href":392},"references\u002Fvmr-codeflow-reference.md#vmr-backflow-vs-dependency-subscriptions",[394],{"type":48,"value":395},"vmr-codeflow-reference.md",{"type":48,"value":397}," for details.",{"type":43,"tag":129,"props":399,"children":401},{"id":400},"channel-resolution",[402],{"type":48,"value":403},"Channel Resolution",{"type":43,"tag":51,"props":405,"children":406},{},[407,409,414],{"type":48,"value":408},"Users refer to channels with shorthand. ",{"type":43,"tag":57,"props":410,"children":411},{},[412],{"type":48,"value":413},".NET major = year − 2015",{"type":48,"value":415}," (2026 → .NET 11, 2025 → .NET 10).",{"type":43,"tag":417,"props":418,"children":419},"table",{},[420,444],{"type":43,"tag":421,"props":422,"children":423},"thead",{},[424],{"type":43,"tag":425,"props":426,"children":427},"tr",{},[428,434,439],{"type":43,"tag":429,"props":430,"children":431},"th",{},[432],{"type":48,"value":433},"User says",{"type":43,"tag":429,"props":435,"children":436},{},[437],{"type":48,"value":438},"Resolve to",{"type":43,"tag":429,"props":440,"children":441},{},[442],{"type":48,"value":443},"Example exact channel name",{"type":43,"tag":445,"props":446,"children":447},"tbody",{},[448,481,506,532,571],{"type":43,"tag":425,"props":449,"children":450},{},[451,461,472],{"type":43,"tag":452,"props":453,"children":454},"td",{},[455],{"type":43,"tag":72,"props":456,"children":458},{"className":457},[],[459],{"type":48,"value":460},"net11",{"type":43,"tag":452,"props":462,"children":463},{},[464,466],{"type":48,"value":465},"Filter channels for ",{"type":43,"tag":72,"props":467,"children":469},{"className":468},[],[470],{"type":48,"value":471},"11.0",{"type":43,"tag":452,"props":473,"children":474},{},[475],{"type":43,"tag":72,"props":476,"children":478},{"className":477},[],[479],{"type":48,"value":480},".NET 11.0.1xx SDK",{"type":43,"tag":425,"props":482,"children":483},{},[484,493,498],{"type":43,"tag":452,"props":485,"children":486},{},[487],{"type":43,"tag":72,"props":488,"children":490},{"className":489},[],[491],{"type":48,"value":492},"11.0.1xx",{"type":43,"tag":452,"props":494,"children":495},{},[496],{"type":48,"value":497},"Use directly",{"type":43,"tag":452,"props":499,"children":500},{},[501],{"type":43,"tag":72,"props":502,"children":504},{"className":503},[],[505],{"type":48,"value":480},{"type":43,"tag":425,"props":507,"children":508},{},[509,518,523],{"type":43,"tag":452,"props":510,"children":511},{},[512],{"type":43,"tag":72,"props":513,"children":515},{"className":514},[],[516],{"type":48,"value":517},"net10 3xx",{"type":43,"tag":452,"props":519,"children":520},{},[521],{"type":48,"value":522},"Version 10, band 3",{"type":43,"tag":452,"props":524,"children":525},{},[526],{"type":43,"tag":72,"props":527,"children":529},{"className":528},[],[530],{"type":48,"value":531},".NET 10.0.3xx SDK",{"type":43,"tag":425,"props":533,"children":534},{},[535,544,563],{"type":43,"tag":452,"props":536,"children":537},{},[538],{"type":43,"tag":72,"props":539,"children":541},{"className":540},[],[542],{"type":48,"value":543},"release\u002F10.0.3xx",{"type":43,"tag":452,"props":545,"children":546},{},[547,549,555,557],{"type":48,"value":548},"Strip ",{"type":43,"tag":72,"props":550,"children":552},{"className":551},[],[553],{"type":48,"value":554},"release\u002F",{"type":48,"value":556}," → ",{"type":43,"tag":72,"props":558,"children":560},{"className":559},[],[561],{"type":48,"value":562},"10.0.3xx",{"type":43,"tag":452,"props":564,"children":565},{},[566],{"type":43,"tag":72,"props":567,"children":569},{"className":568},[],[570],{"type":48,"value":531},{"type":43,"tag":425,"props":572,"children":573},{},[574,582,594],{"type":43,"tag":452,"props":575,"children":576},{},[577],{"type":43,"tag":72,"props":578,"children":580},{"className":579},[],[581],{"type":48,"value":367},{"type":43,"tag":452,"props":583,"children":584},{},[585,587,593],{"type":48,"value":586},"Current dev (major = year − 2015, band = ",{"type":43,"tag":72,"props":588,"children":590},{"className":589},[],[591],{"type":48,"value":592},"1xx",{"type":48,"value":228},{"type":43,"tag":452,"props":595,"children":596},{},[597],{"type":43,"tag":72,"props":598,"children":600},{"className":599},[],[601],{"type":48,"value":480},{"type":43,"tag":89,"props":603,"children":604},{},[605],{"type":43,"tag":51,"props":606,"children":607},{},[608,610,615,617,622,624,630],{"type":48,"value":609},"⚠️ ",{"type":43,"tag":57,"props":611,"children":612},{},[613],{"type":48,"value":614},"Channel filter requires an exact substring match.",{"type":48,"value":616}," Use the full channel name (e.g., ",{"type":43,"tag":72,"props":618,"children":620},{"className":619},[],[621],{"type":48,"value":480},{"type":48,"value":623},") when filtering codeflow PRs or subscriptions. Partial names like ",{"type":43,"tag":72,"props":625,"children":627},{"className":626},[],[628],{"type":48,"value":629},".NET 11.0",{"type":48,"value":631}," may not match.",{"type":43,"tag":633,"props":634,"children":636},"h3",{"id":635},"sdk-bands-and-forward-flow",[637],{"type":48,"value":638},"SDK Bands and Forward Flow",{"type":43,"tag":51,"props":640,"children":641},{},[642,644,649,651,656,658,663],{"type":48,"value":643},"The ",{"type":43,"tag":57,"props":645,"children":646},{},[647],{"type":48,"value":648},"1xx band",{"type":48,"value":650}," has full source-build with runtime forward flow. ",{"type":43,"tag":57,"props":652,"children":653},{},[654],{"type":48,"value":655},"2xx\u002F3xx bands",{"type":48,"value":657}," consume runtime as prebuilts — missing runtime forward flow on these bands is expected, not broken. See ",{"type":43,"tag":203,"props":659,"children":661},{"href":660},"references\u002Fvmr-codeflow-reference.md#sdk-bands-and-forward-flow",[662],{"type":48,"value":395},{"type":48,"value":664}," for the full band table.",{"type":43,"tag":129,"props":666,"children":668},{"id":667},"analysis-modes",[669],{"type":48,"value":670},"Analysis Modes",{"type":43,"tag":417,"props":672,"children":673},{},[674,695],{"type":43,"tag":421,"props":675,"children":676},{},[677],{"type":43,"tag":425,"props":678,"children":679},{},[680,685,690],{"type":43,"tag":429,"props":681,"children":682},{},[683],{"type":48,"value":684},"Question",{"type":43,"tag":429,"props":686,"children":687},{},[688],{"type":48,"value":689},"Mode",{"type":43,"tag":429,"props":691,"children":692},{},[693],{"type":48,"value":694},"Approach",{"type":43,"tag":445,"props":696,"children":697},{},[698,719,745,770,790],{"type":43,"tag":425,"props":699,"children":700},{},[701,706,714],{"type":43,"tag":452,"props":702,"children":703},{},[704],{"type":48,"value":705},"\"What's the flow status for X?\"",{"type":43,"tag":452,"props":707,"children":708},{},[709],{"type":43,"tag":57,"props":710,"children":711},{},[712],{"type":48,"value":713},"Codeflow overview",{"type":43,"tag":452,"props":715,"children":716},{},[717],{"type":48,"value":718},"Codeflow statuses → subscription health with validate → build freshness",{"type":43,"tag":425,"props":720,"children":721},{},[722,727,735],{"type":43,"tag":452,"props":723,"children":724},{},[725],{"type":48,"value":726},"\"Is backflow healthy for X on Y?\"",{"type":43,"tag":452,"props":728,"children":729},{},[730],{"type":43,"tag":57,"props":731,"children":732},{},[733],{"type":48,"value":734},"PR analysis",{"type":43,"tag":452,"props":736,"children":737},{},[738,743],{"type":43,"tag":72,"props":739,"children":741},{"className":740},[],[742],{"type":48,"value":261},{"type":48,"value":744}," → read output → MCP enrichment",{"type":43,"tag":425,"props":746,"children":747},{},[748,753,760],{"type":43,"tag":452,"props":749,"children":750},{},[751],{"type":48,"value":752},"\"Why is this PR stale\u002Fblocked?\"",{"type":43,"tag":452,"props":754,"children":755},{},[756],{"type":43,"tag":57,"props":757,"children":758},{},[759],{"type":48,"value":734},{"type":43,"tag":452,"props":761,"children":762},{},[763,769],{"type":43,"tag":72,"props":764,"children":766},{"className":765},[],[767],{"type":48,"value":768},"Get-CodeflowStatus.ps1 -PrUrl",{"type":48,"value":744},{"type":43,"tag":425,"props":771,"children":772},{},[773,778,785],{"type":43,"tag":452,"props":774,"children":775},{},[776],{"type":48,"value":777},"\"What's the flow status across all repos?\"",{"type":43,"tag":452,"props":779,"children":780},{},[781],{"type":43,"tag":57,"props":782,"children":783},{},[784],{"type":48,"value":713},{"type":43,"tag":452,"props":786,"children":787},{},[788],{"type":48,"value":789},"Codeflow statuses for each repo → subscription health + build freshness",{"type":43,"tag":425,"props":791,"children":792},{},[793,798,806],{"type":43,"tag":452,"props":794,"children":795},{},[796],{"type":48,"value":797},"\"Full flow health report for X\"",{"type":43,"tag":452,"props":799,"children":800},{},[801],{"type":43,"tag":57,"props":802,"children":803},{},[804],{"type":48,"value":805},"Flow health",{"type":43,"tag":452,"props":807,"children":808},{},[809,814],{"type":43,"tag":72,"props":810,"children":812},{"className":811},[],[813],{"type":48,"value":85},{"type":48,"value":815}," script for batch GitHub scanning + maestro enrichment",{"type":43,"tag":129,"props":817,"children":819},{"id":818},"codeflow-overview-workflow",[820],{"type":48,"value":821},"Codeflow Overview Workflow",{"type":43,"tag":51,"props":823,"children":824},{},[825,827,832],{"type":48,"value":826},"When the user asks \"what codeflow PRs are active?\" or \"what's the flow status?\", start with ",{"type":43,"tag":57,"props":828,"children":829},{},[830],{"type":48,"value":831},"codeflow statuses",{"type":48,"value":833}," for the target repo\u002Fbranch — one call shows per-mapping forward flow and backflow status with active PRs and build staleness. Then drill into problems with subscription health and scripts.",{"type":43,"tag":89,"props":835,"children":836},{},[837],{"type":43,"tag":51,"props":838,"children":839},{},[840,841,846,848,853,855,860,862,868,870,876],{"type":48,"value":96},{"type":43,"tag":57,"props":842,"children":843},{},[844],{"type":48,"value":845},"Trust \"commits behind\", don't trust \"builds behind\".",{"type":48,"value":847}," Subscription health returns two kinds of staleness numbers — ",{"type":43,"tag":57,"props":849,"children":850},{},[851],{"type":48,"value":852},"\"N commits behind\"",{"type":48,"value":854}," is real commit distance (trust it, report it directly) and ",{"type":43,"tag":57,"props":856,"children":857},{},[858],{"type":48,"value":859},"\"~N builds behind\"",{"type":48,"value":861}," (note the ",{"type":43,"tag":72,"props":863,"children":865},{"className":864},[],[866],{"type":48,"value":867},"~",{"type":48,"value":869}," prefix) is a meaningless BAR build ID delta that overstates staleness by 10x-300x. For any stale entry showing ",{"type":43,"tag":72,"props":871,"children":873},{"className":872},[],[874],{"type":48,"value":875},"~builds behind",{"type":48,"value":877},", compute the real commit distance yourself (see Step 5).",{"type":43,"tag":633,"props":879,"children":881},{"id":880},"step-0-quick-status-via-codeflow-statuses",[882],{"type":48,"value":883},"Step 0: Quick Status via Codeflow Statuses",{"type":43,"tag":51,"props":885,"children":886},{},[887,889,893,895,900,902,907],{"type":48,"value":888},"For any repo or the VMR, get ",{"type":43,"tag":57,"props":890,"children":891},{},[892],{"type":48,"value":831},{"type":48,"value":894}," for the repo and branch (defaults to ",{"type":43,"tag":72,"props":896,"children":898},{"className":897},[],[899],{"type":48,"value":387},{"type":48,"value":901}," on ",{"type":43,"tag":72,"props":903,"children":905},{"className":904},[],[906],{"type":48,"value":367},{"type":48,"value":908},"). This returns per-mapping forward flow and backflow status in one call — active PRs, build staleness, and subscription details. Use this as the initial triage to identify which mappings need investigation before drilling into subscription health.",{"type":43,"tag":89,"props":910,"children":911},{},[912],{"type":43,"tag":51,"props":913,"children":914},{},[915,917,922],{"type":48,"value":916},"💡 ",{"type":43,"tag":57,"props":918,"children":919},{},[920],{"type":48,"value":921},"When to skip Step 0",{"type":48,"value":923},": If you already have a specific PR URL or subscription ID, go directly to PR Analysis or subscription health. Codeflow statuses is for \"what's the overall picture?\" questions.",{"type":43,"tag":633,"props":925,"children":927},{"id":926},"step-1-check-subscription-health",[928],{"type":48,"value":929},"Step 1: Check Subscription Health",{"type":43,"tag":51,"props":931,"children":932},{},[933,935,940,942,947],{"type":48,"value":934},"Check subscription health for the target repository. This shows which subscriptions are stale and which are current. Entries showing \"N commits behind\" (no ",{"type":43,"tag":72,"props":936,"children":938},{"className":937},[],[939],{"type":48,"value":867},{"type":48,"value":941},") have real commit distances — use those directly. Entries showing \"~N builds behind\" (with ",{"type":43,"tag":72,"props":943,"children":945},{"className":944},[],[946],{"type":48,"value":867},{"type":48,"value":948},") need commit distance computation in Step 5.",{"type":43,"tag":51,"props":950,"children":951},{},[952,954,960,962,967,969,974],{"type":48,"value":953},"Use the ",{"type":43,"tag":72,"props":955,"children":957},{"className":956},[],[958],{"type":48,"value":959},"validate",{"type":48,"value":961}," option to enable ",{"type":43,"tag":57,"props":963,"children":964},{},[965],{"type":48,"value":966},"cross-validation",{"type":48,"value":968}," — this checks subscription state against GitHub PR state, detects state oscillation patterns, and traces source-manifest commits. Always use ",{"type":43,"tag":72,"props":970,"children":972},{"className":971},[],[973],{"type":48,"value":959},{"type":48,"value":975}," when investigating stuck subscriptions.",{"type":43,"tag":89,"props":977,"children":978},{},[979],{"type":43,"tag":51,"props":980,"children":981},{},[982,983,988,990,995,997,1002],{"type":48,"value":609},{"type":43,"tag":57,"props":984,"children":985},{},[986],{"type":48,"value":987},"Output includes ALL subscriptions",{"type":48,"value":989}," (all branches and channels). For a version-specific query like \"net11 status\", filter the results for channels containing your target version (e.g., ",{"type":43,"tag":72,"props":991,"children":993},{"className":992},[],[994],{"type":48,"value":471},{"type":48,"value":996},") and the relevant branch (",{"type":43,"tag":72,"props":998,"children":1000},{"className":999},[],[1001],{"type":48,"value":367},{"type":48,"value":1003}," for current dev).",{"type":43,"tag":633,"props":1005,"children":1007},{"id":1006},"step-2-check-forward-flow",[1008],{"type":48,"value":1009},"Step 2: Check Forward Flow",{"type":43,"tag":51,"props":1011,"children":1012},{},[1013,1018,1020,1025],{"type":43,"tag":57,"props":1014,"children":1015},{},[1016],{"type":48,"value":1017},"Before drilling into backflow problems",{"type":48,"value":1019},", check for open forward flow PRs from the product repo into ",{"type":43,"tag":72,"props":1021,"children":1023},{"className":1022},[],[1024],{"type":48,"value":387},{"type":48,"value":1026},". An open forward flow PR is the #1 cause of backflow staleness — if forward flow is pending, backflow is blocked by design.",{"type":43,"tag":51,"props":1028,"children":1029},{},[1030],{"type":48,"value":1031},"If codeflow statuses (Step 0) shows a forward flow subscription with failures or high commit distance, investigate:",{"type":43,"tag":1033,"props":1034,"children":1035},"ol",{},[1036,1062,1072],{"type":43,"tag":145,"props":1037,"children":1038},{},[1039,1044,1046,1052,1054,1060],{"type":43,"tag":57,"props":1040,"children":1041},{},[1042],{"type":48,"value":1043},"Check the subscription's update history",{"type":48,"value":1045}," — look for consecutive ",{"type":43,"tag":72,"props":1047,"children":1049},{"className":1048},[],[1050],{"type":48,"value":1051},"Failed",{"type":48,"value":1053}," or state oscillation (e.g., repeating ",{"type":43,"tag":72,"props":1055,"children":1057},{"className":1056},[],[1058],{"type":48,"value":1059},"ApplyingUpdates → MergingPullRequest → ApplyingUpdates",{"type":48,"value":1061},"). State oscillation means Maestro keeps retrying but something prevents completion.",{"type":43,"tag":145,"props":1063,"children":1064},{},[1065,1070],{"type":43,"tag":57,"props":1066,"children":1067},{},[1068],{"type":48,"value":1069},"Check if a tracked PR exists",{"type":48,"value":1071}," — a forward flow subscription may report failures but actually have a merged-then-reopened PR, or no PR at all. The tracked PR tells you what Maestro thinks is happening.",{"type":43,"tag":145,"props":1073,"children":1074},{},[1075,1080,1082,1087,1089,1095,1097,1102],{"type":43,"tag":57,"props":1076,"children":1077},{},[1078],{"type":48,"value":1079},"Cross-validate against GitHub",{"type":48,"value":1081}," — if Maestro says the subscription is failing but a PR exists and is merged, the subscription has a ",{"type":43,"tag":57,"props":1083,"children":1084},{},[1085],{"type":48,"value":1086},"bookkeeping bug",{"type":48,"value":1088}," (Maestro never updated ",{"type":43,"tag":72,"props":1090,"children":1092},{"className":1091},[],[1093],{"type":48,"value":1094},"LastAppliedBuildId",{"type":48,"value":1096},"). Use ",{"type":43,"tag":72,"props":1098,"children":1100},{"className":1099},[],[1101],{"type":48,"value":959},{"type":48,"value":1103}," on subscription health to detect this automatically.",{"type":43,"tag":89,"props":1105,"children":1106},{},[1107],{"type":43,"tag":51,"props":1108,"children":1109},{},[1110,1111,1116,1118,1123,1125,1130],{"type":48,"value":96},{"type":43,"tag":57,"props":1112,"children":1113},{},[1114],{"type":48,"value":1115},"Forward flow bookkeeping bug",{"type":48,"value":1117},": When a forward flow subscription shows \"N builds behind\" with consecutive failures but GitHub shows PRs merging successfully, this is a known Maestro issue where ",{"type":43,"tag":72,"props":1119,"children":1121},{"className":1120},[],[1122],{"type":48,"value":1094},{"type":48,"value":1124}," doesn't update after merge. The subscription is stuck in an infinite retry loop. ",{"type":43,"tag":57,"props":1126,"children":1127},{},[1128],{"type":48,"value":1129},"Remedy",{"type":48,"value":1131},": force-trigger the subscription — this resets Maestro's state by creating a fresh PR branch.",{"type":43,"tag":633,"props":1133,"children":1135},{"id":1134},"step-3-list-tracked-prs",[1136],{"type":48,"value":1137},"Step 3: List Tracked PRs",{"type":43,"tag":51,"props":1139,"children":1140},{},[1141],{"type":48,"value":1142},"List all codeflow PRs currently tracked by Maestro, optionally filtering by channel name.",{"type":43,"tag":89,"props":1144,"children":1145},{},[1146],{"type":43,"tag":51,"props":1147,"children":1148},{},[1149,1150,1155,1157,1163,1165,1170],{"type":48,"value":609},{"type":43,"tag":57,"props":1151,"children":1152},{},[1153],{"type":48,"value":1154},"Output is large",{"type":48,"value":1156}," (200+ PRs across all repos). Filter by ",{"type":43,"tag":72,"props":1158,"children":1160},{"className":1159},[],[1161],{"type":48,"value":1162},"channelName",{"type":48,"value":1164}," parameter (use exact name like ",{"type":43,"tag":72,"props":1166,"children":1168},{"className":1167},[],[1169],{"type":48,"value":480},{"type":48,"value":1171},"), or grep\u002Fsearch the output for your target repo.",{"type":43,"tag":633,"props":1173,"children":1175},{"id":1174},"step-4-drill-into-problems",[1176],{"type":48,"value":1177},"Step 4: Drill Into Problems",{"type":43,"tag":51,"props":1179,"children":1180},{},[1181],{"type":48,"value":1182},"For subscriptions that are stale — whether they have a stuck PR or no PR at all:",{"type":43,"tag":141,"props":1184,"children":1185},{},[1186,1191,1196],{"type":43,"tag":145,"props":1187,"children":1188},{},[1189],{"type":48,"value":1190},"Check the subscription's update history to find the failure point",{"type":43,"tag":145,"props":1192,"children":1193},{},[1194],{"type":48,"value":1195},"Check build freshness to rule out VMR build failures (if builds are stale, it's a VMR issue, not Maestro)",{"type":43,"tag":145,"props":1197,"children":1198},{},[1199],{"type":48,"value":1200},"For stuck PRs, check the PR's age and recent activity — a PR open >3 days with no progress needs attention",{"type":43,"tag":633,"props":1202,"children":1204},{"id":1203},"step-5-get-real-commit-distance",[1205],{"type":48,"value":1206},"Step 5: Get Real Commit Distance",{"type":43,"tag":51,"props":1208,"children":1209},{},[1210,1212,1217],{"type":48,"value":1211},"For stale entries showing \"~N builds behind\", request ",{"type":43,"tag":57,"props":1213,"children":1214},{},[1215],{"type":48,"value":1216},"commit details",{"type":48,"value":1218}," when checking subscription health. This returns the actual commit count and recent commit metadata (SHA, message, author, date) — no manual GitHub API calls needed.",{"type":43,"tag":51,"props":1220,"children":1221},{},[1222,1224,1230],{"type":48,"value":1223},"Report the commit count as \"N commits behind\". Use the recent commit list to explain ",{"type":43,"tag":1225,"props":1226,"children":1227},"em",{},[1228],{"type":48,"value":1229},"what",{"type":48,"value":1231}," is behind (e.g., \"3 commits behind — latest: Fix NuGet restore race condition\").",{"type":43,"tag":633,"props":1233,"children":1235},{"id":1234},"step-6-enrich-with-github-data",[1236],{"type":48,"value":1237},"Step 6: Enrich with GitHub Data",{"type":43,"tag":51,"props":1239,"children":1240},{},[1241],{"type":48,"value":1242},"Use GitHub PR details to check state, comments, and merge status for any PRs flagged as problematic.",{"type":43,"tag":633,"props":1244,"children":1246},{"id":1245},"multi-repo-health-check",[1247],{"type":48,"value":1248},"Multi-Repo Health Check",{"type":43,"tag":51,"props":1250,"children":1251},{},[1252],{"type":48,"value":1253},"When asked about flow health across \"all repos\" or a major version (e.g., \"net11 status\"), check the core product repos. Subscription health calls are independent — run them in parallel.",{"type":43,"tag":51,"props":1255,"children":1256},{},[1257,1262,1264,1270,1272,1278,1279,1285,1286,1292,1293,1299,1300,1306,1307,1313,1314],{"type":43,"tag":57,"props":1258,"children":1259},{},[1260],{"type":48,"value":1261},"Core repos",{"type":48,"value":1263},": ",{"type":43,"tag":72,"props":1265,"children":1267},{"className":1266},[],[1268],{"type":48,"value":1269},"dotnet\u002Fruntime",{"type":48,"value":1271},", ",{"type":43,"tag":72,"props":1273,"children":1275},{"className":1274},[],[1276],{"type":48,"value":1277},"dotnet\u002Fsdk",{"type":48,"value":1271},{"type":43,"tag":72,"props":1280,"children":1282},{"className":1281},[],[1283],{"type":48,"value":1284},"dotnet\u002Faspnetcore",{"type":48,"value":1271},{"type":43,"tag":72,"props":1287,"children":1289},{"className":1288},[],[1290],{"type":48,"value":1291},"dotnet\u002Froslyn",{"type":48,"value":1271},{"type":43,"tag":72,"props":1294,"children":1296},{"className":1295},[],[1297],{"type":48,"value":1298},"dotnet\u002Fefcore",{"type":48,"value":1271},{"type":43,"tag":72,"props":1301,"children":1303},{"className":1302},[],[1304],{"type":48,"value":1305},"dotnet\u002Fwinforms",{"type":48,"value":1271},{"type":43,"tag":72,"props":1308,"children":1310},{"className":1309},[],[1311],{"type":48,"value":1312},"dotnet\u002Fwpf",{"type":48,"value":1271},{"type":43,"tag":72,"props":1315,"children":1317},{"className":1316},[],[1318],{"type":48,"value":1319},"dotnet\u002Fmsbuild",{"type":43,"tag":51,"props":1321,"children":1322},{},[1323,1328,1330,1336,1338,1344,1345,1351,1352,1358,1360,1366,1367,1373,1374,1380,1381,1387,1388,1394,1396,1401,1403,1408],{"type":43,"tag":57,"props":1324,"children":1325},{},[1326],{"type":48,"value":1327},"Branch names differ across repos",{"type":48,"value":1329}," — ",{"type":43,"tag":72,"props":1331,"children":1333},{"className":1332},[],[1334],{"type":48,"value":1335},"runtime",{"type":48,"value":1337},"\u002F",{"type":43,"tag":72,"props":1339,"children":1341},{"className":1340},[],[1342],{"type":48,"value":1343},"aspnetcore",{"type":48,"value":103},{"type":43,"tag":72,"props":1346,"children":1348},{"className":1347},[],[1349],{"type":48,"value":1350},"release\u002FX.0",{"type":48,"value":1271},{"type":43,"tag":72,"props":1353,"children":1355},{"className":1354},[],[1356],{"type":48,"value":1357},"sdk",{"type":48,"value":1359}," uses ",{"type":43,"tag":72,"props":1361,"children":1363},{"className":1362},[],[1364],{"type":48,"value":1365},"release\u002FX.0.Nxx",{"type":48,"value":1271},{"type":43,"tag":72,"props":1368,"children":1370},{"className":1369},[],[1371],{"type":48,"value":1372},"msbuild",{"type":48,"value":1359},{"type":43,"tag":72,"props":1375,"children":1377},{"className":1376},[],[1378],{"type":48,"value":1379},"vsNN.N",{"type":48,"value":1271},{"type":43,"tag":72,"props":1382,"children":1384},{"className":1383},[],[1385],{"type":48,"value":1386},"roslyn",{"type":48,"value":1359},{"type":43,"tag":72,"props":1389,"children":1391},{"className":1390},[],[1392],{"type":48,"value":1393},"release\u002FdevNN.0",{"type":48,"value":1395}," (VS major = .NET major + 8). Current dev is ",{"type":43,"tag":72,"props":1397,"children":1399},{"className":1398},[],[1400],{"type":48,"value":367},{"type":48,"value":1402}," for all. See ",{"type":43,"tag":203,"props":1404,"children":1406},{"href":1405},"references\u002Fvmr-codeflow-reference.md#branch-naming-per-repo",[1407],{"type":48,"value":395},{"type":48,"value":1409}," for the full table.",{"type":43,"tag":51,"props":1411,"children":1412},{},[1413,1415,1420],{"type":48,"value":1414},"When asked about a major version, check ",{"type":43,"tag":57,"props":1416,"children":1417},{},[1418],{"type":48,"value":1419},"all branches",{"type":48,"value":1421}," — don't ask for clarification. Present a consolidated cross-repo summary.",{"type":43,"tag":129,"props":1423,"children":1425},{"id":1424},"pr-analysis-workflow",[1426],{"type":48,"value":1427},"PR Analysis Workflow",{"type":43,"tag":89,"props":1429,"children":1430},{},[1431],{"type":43,"tag":51,"props":1432,"children":1433},{},[1434,1435,1440,1442,1447,1449,1455,1457,1462],{"type":48,"value":96},{"type":43,"tag":57,"props":1436,"children":1437},{},[1438],{"type":48,"value":1439},"Script-first.",{"type":48,"value":1441}," Always run ",{"type":43,"tag":72,"props":1443,"children":1445},{"className":1444},[],[1446],{"type":48,"value":77},{"type":48,"value":1448}," first. It produces a ",{"type":43,"tag":72,"props":1450,"children":1452},{"className":1451},[],[1453],{"type":48,"value":1454},"[CODEFLOW_SUMMARY]",{"type":48,"value":1456}," JSON block with VMR commit comparison, forward flow discovery, and staleness detection that cannot be replicated by individual MCP calls. ",{"type":43,"tag":57,"props":1458,"children":1459},{},[1460],{"type":48,"value":1461},"Do NOT re-query the same data via MCP tools",{"type":48,"value":1463}," — read and interpret the script output.",{"type":43,"tag":633,"props":1465,"children":1467},{"id":1466},"step-1-run-the-script",[1468],{"type":48,"value":1469},"Step 1: Run the Script",{"type":43,"tag":1471,"props":1472,"children":1477},"pre",{"className":1473,"code":1474,"language":1475,"meta":1476,"style":1476},"language-powershell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Analyze a specific PR by number\n.\u002Fscripts\u002FGet-CodeflowStatus.ps1 -Repository \"dotnet\u002Fruntime\" -PRNumber 12345\n\n# Check if a PR exists for a repo\u002Fbranch (finds the open backflow PR)\n.\u002Fscripts\u002FGet-CodeflowStatus.ps1 -Repository \"dotnet\u002Fruntime\" -CheckMissing -Branch \"main\"\n\n# Check for missing PRs across all branches\n.\u002Fscripts\u002FGet-CodeflowStatus.ps1 -Repository \"dotnet\u002Fruntime\" -CheckMissing\n","powershell","",[1478],{"type":43,"tag":72,"props":1479,"children":1480},{"__ignoreMap":1476},[1481,1492,1501,1511,1520,1529,1537,1546],{"type":43,"tag":1482,"props":1483,"children":1486},"span",{"class":1484,"line":1485},"line",1,[1487],{"type":43,"tag":1482,"props":1488,"children":1489},{},[1490],{"type":48,"value":1491},"# Analyze a specific PR by number\n",{"type":43,"tag":1482,"props":1493,"children":1495},{"class":1484,"line":1494},2,[1496],{"type":43,"tag":1482,"props":1497,"children":1498},{},[1499],{"type":48,"value":1500},".\u002Fscripts\u002FGet-CodeflowStatus.ps1 -Repository \"dotnet\u002Fruntime\" -PRNumber 12345\n",{"type":43,"tag":1482,"props":1502,"children":1504},{"class":1484,"line":1503},3,[1505],{"type":43,"tag":1482,"props":1506,"children":1508},{"emptyLinePlaceholder":1507},true,[1509],{"type":48,"value":1510},"\n",{"type":43,"tag":1482,"props":1512,"children":1514},{"class":1484,"line":1513},4,[1515],{"type":43,"tag":1482,"props":1516,"children":1517},{},[1518],{"type":48,"value":1519},"# Check if a PR exists for a repo\u002Fbranch (finds the open backflow PR)\n",{"type":43,"tag":1482,"props":1521,"children":1523},{"class":1484,"line":1522},5,[1524],{"type":43,"tag":1482,"props":1525,"children":1526},{},[1527],{"type":48,"value":1528},".\u002Fscripts\u002FGet-CodeflowStatus.ps1 -Repository \"dotnet\u002Fruntime\" -CheckMissing -Branch \"main\"\n",{"type":43,"tag":1482,"props":1530,"children":1532},{"class":1484,"line":1531},6,[1533],{"type":43,"tag":1482,"props":1534,"children":1535},{"emptyLinePlaceholder":1507},[1536],{"type":48,"value":1510},{"type":43,"tag":1482,"props":1538,"children":1540},{"class":1484,"line":1539},7,[1541],{"type":43,"tag":1482,"props":1542,"children":1543},{},[1544],{"type":48,"value":1545},"# Check for missing PRs across all branches\n",{"type":43,"tag":1482,"props":1547,"children":1549},{"class":1484,"line":1548},8,[1550],{"type":43,"tag":1482,"props":1551,"children":1552},{},[1553],{"type":48,"value":1554},".\u002Fscripts\u002FGet-CodeflowStatus.ps1 -Repository \"dotnet\u002Fruntime\" -CheckMissing\n",{"type":43,"tag":51,"props":1556,"children":1557},{},[1558,1560,1565,1567,1572],{"type":48,"value":1559},"The script outputs a ",{"type":43,"tag":72,"props":1561,"children":1563},{"className":1562},[],[1564],{"type":48,"value":1454},{"type":48,"value":1566}," JSON block followed by a text summary. ",{"type":43,"tag":57,"props":1568,"children":1569},{},[1570],{"type":48,"value":1571},"Parse the JSON",{"type":48,"value":1573}," — it contains:",{"type":43,"tag":141,"props":1575,"children":1576},{},[1577,1591,1612,1626,1640,1654],{"type":43,"tag":145,"props":1578,"children":1579},{},[1580,1589],{"type":43,"tag":57,"props":1581,"children":1582},{},[1583],{"type":43,"tag":72,"props":1584,"children":1586},{"className":1585},[],[1587],{"type":48,"value":1588},"status",{"type":48,"value":1590},": MERGED \u002F CLOSED \u002F NO-OP \u002F IN_PROGRESS \u002F STALE \u002F ACTIVE",{"type":43,"tag":145,"props":1592,"children":1593},{},[1594,1603,1605,1610],{"type":43,"tag":57,"props":1595,"children":1596},{},[1597],{"type":43,"tag":72,"props":1598,"children":1600},{"className":1599},[],[1601],{"type":48,"value":1602},"vmrComparison.aheadBy",{"type":48,"value":1604},": How many VMR commits behind (the ",{"type":43,"tag":1225,"props":1606,"children":1607},{},[1608],{"type":48,"value":1609},"real",{"type":48,"value":1611}," staleness number)",{"type":43,"tag":145,"props":1613,"children":1614},{},[1615,1624],{"type":43,"tag":57,"props":1616,"children":1617},{},[1618],{"type":43,"tag":72,"props":1619,"children":1621},{"className":1620},[],[1622],{"type":48,"value":1623},"forwardFlow.prs[]",{"type":48,"value":1625},": All open forward flow PRs with their state",{"type":43,"tag":145,"props":1627,"children":1628},{},[1629,1638],{"type":43,"tag":57,"props":1630,"children":1631},{},[1632],{"type":43,"tag":72,"props":1633,"children":1635},{"className":1634},[],[1636],{"type":48,"value":1637},"warnings[]",{"type":48,"value":1639},": Maestro staleness and conflict warnings extracted from PR comments",{"type":43,"tag":145,"props":1641,"children":1642},{},[1643,1652],{"type":43,"tag":57,"props":1644,"children":1645},{},[1646],{"type":43,"tag":72,"props":1647,"children":1649},{"className":1648},[],[1650],{"type":48,"value":1651},"subscription.id",{"type":48,"value":1653},": For use with MCP remediation tools",{"type":43,"tag":145,"props":1655,"children":1656},{},[1657,1666],{"type":43,"tag":57,"props":1658,"children":1659},{},[1660],{"type":43,"tag":72,"props":1661,"children":1663},{"className":1662},[],[1664],{"type":48,"value":1665},"build.id",{"type":48,"value":1667},": BAR build ID for triggering",{"type":43,"tag":633,"props":1669,"children":1671},{"id":1670},"step-2-after-the-script-use-its-output",[1672],{"type":48,"value":1673},"Step 2: After the Script — Use Its Output",{"type":43,"tag":51,"props":1675,"children":1676},{},[1677,1679,1684],{"type":48,"value":1678},"🚨 The script already collected PR metadata, VMR commit distances, forward flow PRs, and Maestro warnings. ",{"type":43,"tag":57,"props":1680,"children":1681},{},[1682],{"type":48,"value":1683},"Do NOT re-query this data.",{"type":48,"value":1685}," Instead:",{"type":43,"tag":1033,"props":1687,"children":1688},{},[1689,1776,1822],{"type":43,"tag":145,"props":1690,"children":1691},{},[1692,1704,1706],{"type":43,"tag":57,"props":1693,"children":1694},{},[1695,1697,1702],{"type":48,"value":1696},"Read the ",{"type":43,"tag":72,"props":1698,"children":1700},{"className":1699},[],[1701],{"type":48,"value":1454},{"type":48,"value":1703}," JSON",{"type":48,"value":1705}," and extract key facts:",{"type":43,"tag":141,"props":1707,"children":1708},{},[1709,1719,1730,1741,1766],{"type":43,"tag":145,"props":1710,"children":1711},{},[1712,1717],{"type":43,"tag":72,"props":1713,"children":1715},{"className":1714},[],[1716],{"type":48,"value":1602},{"type":48,"value":1718}," = how far behind (this is VMR commits, NOT builds)",{"type":43,"tag":145,"props":1720,"children":1721},{},[1722,1728],{"type":43,"tag":72,"props":1723,"children":1725},{"className":1724},[],[1726],{"type":48,"value":1727},"forwardFlow.prs",{"type":48,"value":1729}," = what's blocking backflow (open forward flow = blocked by design)",{"type":43,"tag":145,"props":1731,"children":1732},{},[1733,1739],{"type":43,"tag":72,"props":1734,"children":1736},{"className":1735},[],[1737],{"type":48,"value":1738},"warnings",{"type":48,"value":1740}," = staleness\u002Fconflict details from Maestro comments",{"type":43,"tag":145,"props":1742,"children":1743},{},[1744,1750,1752,1757,1759,1764],{"type":43,"tag":72,"props":1745,"children":1747},{"className":1746},[],[1748],{"type":48,"value":1749},"commits.mergeCommitDetails",{"type":48,"value":1751}," = merge commits on the PR (who merged ",{"type":43,"tag":72,"props":1753,"children":1755},{"className":1754},[],[1756],{"type":48,"value":367},{"type":48,"value":1758}," and when — note: merging ",{"type":43,"tag":72,"props":1760,"children":1762},{"className":1761},[],[1763],{"type":48,"value":367},{"type":48,"value":1765}," does NOT resolve staleness)",{"type":43,"tag":145,"props":1767,"children":1768},{},[1769,1774],{"type":43,"tag":72,"props":1770,"children":1772},{"className":1771},[],[1773],{"type":48,"value":1588},{"type":48,"value":1775}," = overall PR health classification",{"type":43,"tag":145,"props":1777,"children":1778},{},[1779,1784,1786],{"type":43,"tag":57,"props":1780,"children":1781},{},[1782],{"type":48,"value":1783},"Use MCP tools only for enrichment",{"type":48,"value":1785}," the script can't provide:",{"type":43,"tag":141,"props":1787,"children":1788},{},[1789,1801,1812],{"type":43,"tag":145,"props":1790,"children":1791},{},[1792,1794,1799],{"type":48,"value":1793},"Check ",{"type":43,"tag":57,"props":1795,"children":1796},{},[1797],{"type":48,"value":1798},"build freshness",{"type":48,"value":1800}," — are VMR builds healthy? (channel-level, not per-PR)",{"type":43,"tag":145,"props":1802,"children":1803},{},[1804,1805,1810],{"type":48,"value":1793},{"type":43,"tag":57,"props":1806,"children":1807},{},[1808],{"type":48,"value":1809},"subscription history",{"type":48,"value":1811}," — timeline of when the subscription got stuck (if script shows STALE)",{"type":43,"tag":145,"props":1813,"children":1814},{},[1815,1820],{"type":43,"tag":57,"props":1816,"children":1817},{},[1818],{"type":48,"value":1819},"Trigger the subscription",{"type":48,"value":1821}," — to remediate a stuck subscription (needs subscription ID + build ID from script output)",{"type":43,"tag":145,"props":1823,"children":1824},{},[1825,1830],{"type":43,"tag":57,"props":1826,"children":1827},{},[1828],{"type":48,"value":1829},"Synthesize",{"type":48,"value":1831}," script data + MCP enrichment into a diagnosis and recommendation.",{"type":43,"tag":89,"props":1833,"children":1834},{},[1835],{"type":43,"tag":51,"props":1836,"children":1837},{},[1838,1839,1844,1846,1852,1853,1859,1861,1866],{"type":48,"value":916},{"type":43,"tag":57,"props":1840,"children":1841},{},[1842],{"type":48,"value":1843},"No open PR?",{"type":48,"value":1845}," If ",{"type":43,"tag":72,"props":1847,"children":1849},{"className":1848},[],[1850],{"type":48,"value":1851},"-Repository",{"type":48,"value":1337},{"type":43,"tag":72,"props":1854,"children":1856},{"className":1855},[],[1857],{"type":48,"value":1858},"-Branch",{"type":48,"value":1860}," finds no open backflow PR, the script reports this. Look up the ",{"type":43,"tag":57,"props":1862,"children":1863},{},[1864],{"type":48,"value":1865},"tracked PR for the subscription",{"type":48,"value":1867}," to check Maestro's view, then check the most recently merged matching PR. A missing PR with a healthy subscription means flow is working normally.",{"type":43,"tag":633,"props":1869,"children":1871},{"id":1870},"step-3-trace-a-fix-optional",[1872],{"type":48,"value":1873},"Step 3: Trace a Fix (Optional)",{"type":43,"tag":51,"props":1875,"children":1876},{},[1877],{"type":48,"value":1878},"To check if a specific fix has reached the PR:",{"type":43,"tag":1033,"props":1880,"children":1881},{},[1882,1901],{"type":43,"tag":145,"props":1883,"children":1884},{},[1885,1887,1893,1895],{"type":48,"value":1886},"Read ",{"type":43,"tag":72,"props":1888,"children":1890},{"className":1889},[],[1891],{"type":48,"value":1892},"src\u002Fsource-manifest.json",{"type":48,"value":1894}," from the VMR at the PR's snapshot commit — find the product repo's ",{"type":43,"tag":72,"props":1896,"children":1898},{"className":1897},[],[1899],{"type":48,"value":1900},"commitSha",{"type":43,"tag":145,"props":1902,"children":1903},{},[1904],{"type":48,"value":1905},"Check if the fix commit is an ancestor of that SHA",{"type":43,"tag":129,"props":1907,"children":1909},{"id":1908},"flow-health-workflow-script-mcp",[1910],{"type":48,"value":1911},"Flow Health Workflow (Script + MCP)",{"type":43,"tag":51,"props":1913,"children":1914},{},[1915,1917,1922,1924,1929],{"type":48,"value":1916},"Flow health scanning uses a ",{"type":43,"tag":57,"props":1918,"children":1919},{},[1920],{"type":48,"value":1921},"hybrid approach",{"type":48,"value":1923},": the ",{"type":43,"tag":72,"props":1925,"children":1927},{"className":1926},[],[1928],{"type":48,"value":85},{"type":48,"value":1930}," script handles batch GitHub API calls in parallel, while maestro MCP tools provide subscription and build freshness data.",{"type":43,"tag":89,"props":1932,"children":1933},{},[1934],{"type":43,"tag":51,"props":1935,"children":1936},{},[1937,1938,1943,1945,1951],{"type":48,"value":916},{"type":43,"tag":57,"props":1939,"children":1940},{},[1941],{"type":48,"value":1942},"Why a script for flow health?",{"type":48,"value":1944}," Scanning all branches requires 10-30+ parallel GitHub API calls (PR searches, body fetches, VMR HEAD lookups, commit comparisons). The script fires these in parallel using ",{"type":43,"tag":72,"props":1946,"children":1948},{"className":1947},[],[1949],{"type":48,"value":1950},"Task.Run",{"type":48,"value":1952},"; sequential MCP calls would be prohibitively slow.",{"type":43,"tag":633,"props":1954,"children":1956},{"id":1955},"step-1-run-the-script-1",[1957],{"type":48,"value":1469},{"type":43,"tag":1471,"props":1959,"children":1962},{"className":1960,"code":1961,"language":38,"meta":1476,"style":1476},"language-shell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Scan all branches for a repo\ndotnet .\u002Fscripts\u002Fflow-health.cs -- dotnet\u002Fsdk\n\n# Scan a specific branch only\ndotnet .\u002Fscripts\u002Fflow-health.cs -- dotnet\u002Fsdk --branch main\n",[1963],{"type":43,"tag":72,"props":1964,"children":1965},{"__ignoreMap":1476},[1966,1975,1999,2006,2014],{"type":43,"tag":1482,"props":1967,"children":1968},{"class":1484,"line":1485},[1969],{"type":43,"tag":1482,"props":1970,"children":1972},{"style":1971},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[1973],{"type":48,"value":1974},"# Scan all branches for a repo\n",{"type":43,"tag":1482,"props":1976,"children":1977},{"class":1484,"line":1494},[1978,1983,1989,1994],{"type":43,"tag":1482,"props":1979,"children":1981},{"style":1980},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[1982],{"type":48,"value":8},{"type":43,"tag":1482,"props":1984,"children":1986},{"style":1985},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[1987],{"type":48,"value":1988}," .\u002Fscripts\u002Fflow-health.cs",{"type":43,"tag":1482,"props":1990,"children":1991},{"style":1985},[1992],{"type":48,"value":1993}," --",{"type":43,"tag":1482,"props":1995,"children":1996},{"style":1985},[1997],{"type":48,"value":1998}," dotnet\u002Fsdk\n",{"type":43,"tag":1482,"props":2000,"children":2001},{"class":1484,"line":1503},[2002],{"type":43,"tag":1482,"props":2003,"children":2004},{"emptyLinePlaceholder":1507},[2005],{"type":48,"value":1510},{"type":43,"tag":1482,"props":2007,"children":2008},{"class":1484,"line":1513},[2009],{"type":43,"tag":1482,"props":2010,"children":2011},{"style":1971},[2012],{"type":48,"value":2013},"# Scan a specific branch only\n",{"type":43,"tag":1482,"props":2015,"children":2016},{"class":1484,"line":1522},[2017,2021,2025,2029,2034,2039],{"type":43,"tag":1482,"props":2018,"children":2019},{"style":1980},[2020],{"type":48,"value":8},{"type":43,"tag":1482,"props":2022,"children":2023},{"style":1985},[2024],{"type":48,"value":1988},{"type":43,"tag":1482,"props":2026,"children":2027},{"style":1985},[2028],{"type":48,"value":1993},{"type":43,"tag":1482,"props":2030,"children":2031},{"style":1985},[2032],{"type":48,"value":2033}," dotnet\u002Fsdk",{"type":43,"tag":1482,"props":2035,"children":2036},{"style":1985},[2037],{"type":48,"value":2038}," --branch",{"type":43,"tag":1482,"props":2040,"children":2041},{"style":1985},[2042],{"type":48,"value":2043}," main\n",{"type":43,"tag":51,"props":2045,"children":2046},{},[2047],{"type":48,"value":2048},"The script outputs structured JSON with:",{"type":43,"tag":141,"props":2050,"children":2051},{},[2052,2096,2110,2123],{"type":43,"tag":145,"props":2053,"children":2054},{},[2055,2064,2066,2071,2073,2079,2081,2087,2088,2094],{"type":43,"tag":57,"props":2056,"children":2057},{},[2058],{"type":43,"tag":72,"props":2059,"children":2061},{"className":2060},[],[2062],{"type":48,"value":2063},"backflow.branches[]",{"type":48,"value":2065},": Per-branch status (healthy\u002Fstale\u002Fconflict\u002Fmissing\u002Fup-to-date\u002Freleased-preview), PR numbers, VMR commit mapping, ahead-by counts, ",{"type":43,"tag":57,"props":2067,"children":2068},{},[2069],{"type":48,"value":2070},"CI status",{"type":48,"value":2072}," (",{"type":43,"tag":72,"props":2074,"children":2076},{"className":2075},[],[2077],{"type":48,"value":2078},"ciStatus",{"type":48,"value":2080},": green\u002Fred\u002Fpending\u002Fnone, ",{"type":43,"tag":72,"props":2082,"children":2084},{"className":2083},[],[2085],{"type":48,"value":2086},"ciFailedCount",{"type":48,"value":1337},{"type":43,"tag":72,"props":2089,"children":2091},{"className":2090},[],[2092],{"type":48,"value":2093},"ciTotalCount",{"type":48,"value":2095}," when red)",{"type":43,"tag":145,"props":2097,"children":2098},{},[2099,2108],{"type":43,"tag":57,"props":2100,"children":2101},{},[2102],{"type":43,"tag":72,"props":2103,"children":2105},{"className":2104},[],[2106],{"type":48,"value":2107},"backflow.summary",{"type":48,"value":2109},": Counts of healthy\u002FupToDate\u002Fblocked\u002Fmissing branches",{"type":43,"tag":145,"props":2111,"children":2112},{},[2113,2121],{"type":43,"tag":57,"props":2114,"children":2115},{},[2116],{"type":43,"tag":72,"props":2117,"children":2119},{"className":2118},[],[2120],{"type":48,"value":1623},{"type":48,"value":2122},": Open forward flow PRs with health status",{"type":43,"tag":145,"props":2124,"children":2125},{},[2126,2135],{"type":43,"tag":57,"props":2127,"children":2128},{},[2129],{"type":43,"tag":72,"props":2130,"children":2132},{"className":2131},[],[2133],{"type":48,"value":2134},"forwardFlow.summary",{"type":48,"value":2136},": Counts of healthy\u002Fstale\u002Fconflicted forward PRs",{"type":43,"tag":633,"props":2138,"children":2140},{"id":2139},"step-2-enrich-with-maestro-mcp-data",[2141],{"type":48,"value":2142},"Step 2: Enrich with Maestro MCP Data",{"type":43,"tag":51,"props":2144,"children":2145},{},[2146],{"type":48,"value":2147},"After the script runs, enrich with maestro data:",{"type":43,"tag":1033,"props":2149,"children":2150},{},[2151,2169,2194,2204,2214],{"type":43,"tag":145,"props":2152,"children":2153},{},[2154,2159,2161,2167],{"type":43,"tag":57,"props":2155,"children":2156},{},[2157],{"type":48,"value":2158},"Build freshness",{"type":48,"value":2160},": For each ",{"type":43,"tag":72,"props":2162,"children":2164},{"className":2163},[],[2165],{"type":48,"value":2166},"vmrBranch",{"type":48,"value":2168}," found in the script output, check build freshness with the channel short name to verify official VMR builds are healthy.",{"type":43,"tag":145,"props":2170,"children":2171},{},[2172,2177,2179,2185,2187,2192],{"type":43,"tag":57,"props":2173,"children":2174},{},[2175],{"type":48,"value":2176},"Subscription health",{"type":48,"value":2178},": For branches with ",{"type":43,"tag":72,"props":2180,"children":2182},{"className":2181},[],[2183],{"type":48,"value":2184},"status: \"missing\"",{"type":48,"value":2186},", check subscription health for the target repository to diagnose ",{"type":43,"tag":1225,"props":2188,"children":2189},{},[2190],{"type":48,"value":2191},"why",{"type":48,"value":2193}," — is the subscription stuck, disabled, or is the channel frozen?",{"type":43,"tag":145,"props":2195,"children":2196},{},[2197,2202],{"type":43,"tag":57,"props":2198,"children":2199},{},[2200],{"type":48,"value":2201},"Update history",{"type":48,"value":2203},": For stuck subscriptions, check the subscription's update history to see the timeline — when was the last successful application? Was there a failed attempt?",{"type":43,"tag":145,"props":2205,"children":2206},{},[2207,2212],{"type":43,"tag":57,"props":2208,"children":2209},{},[2210],{"type":48,"value":2211},"Tracked PRs",{"type":48,"value":2213},": Cross-reference script results with the codeflow PR list to see Maestro's view of tracked PRs — the script sees GitHub state while Maestro may have a different picture.",{"type":43,"tag":145,"props":2215,"children":2216},{},[2217,2222],{"type":43,"tag":57,"props":2218,"children":2219},{},[2220],{"type":48,"value":2221},"Latest builds",{"type":48,"value":2223},": For stuck subscriptions, find the latest build to get the buildId needed for triggering.",{"type":43,"tag":633,"props":2225,"children":2227},{"id":2226},"step-3-synthesize",[2228],{"type":48,"value":2229},"Step 3: Synthesize",{"type":43,"tag":51,"props":2231,"children":2232},{},[2233],{"type":48,"value":2234},"Combine script output (GitHub PR state) + MCP data (Maestro health) to produce the diagnosis:",{"type":43,"tag":141,"props":2236,"children":2237},{},[2238,2251,2263],{"type":43,"tag":145,"props":2239,"children":2240},{},[2241,2243,2249],{"type":48,"value":2242},"If multiple branches show ",{"type":43,"tag":72,"props":2244,"children":2246},{"className":2245},[],[2247],{"type":48,"value":2248},"missing",{"type":48,"value":2250}," AND build freshness is stale → VMR build failure (not a Maestro issue)",{"type":43,"tag":145,"props":2252,"children":2253},{},[2254,2256,2261],{"type":48,"value":2255},"If one branch is ",{"type":43,"tag":72,"props":2257,"children":2259},{"className":2258},[],[2260],{"type":48,"value":2248},{"type":48,"value":2262}," but builds are fresh → Maestro is stuck, suggest triggering",{"type":43,"tag":145,"props":2264,"children":2265},{},[2266,2268,2274,2276],{"type":48,"value":2267},"If a branch has ",{"type":43,"tag":72,"props":2269,"children":2271},{"className":2270},[],[2272],{"type":48,"value":2273},"status: \"conflict\"",{"type":48,"value":2275}," → suggest ",{"type":43,"tag":72,"props":2277,"children":2279},{"className":2278},[],[2280],{"type":48,"value":2281},"darc vmr resolve-conflict",{"type":43,"tag":129,"props":2283,"children":2285},{"id":2284},"interpreting-results",[2286],{"type":48,"value":2287},"Interpreting Results",{"type":43,"tag":633,"props":2289,"children":2291},{"id":2290},"current-state",[2292],{"type":48,"value":2293},"Current State",{"type":43,"tag":141,"props":2295,"children":2296},{},[2297,2307,2317,2327,2337,2347,2357],{"type":43,"tag":145,"props":2298,"children":2299},{},[2300,2305],{"type":43,"tag":57,"props":2301,"children":2302},{},[2303],{"type":48,"value":2304},"✅ MERGED",{"type":48,"value":2306},": No action needed",{"type":43,"tag":145,"props":2308,"children":2309},{},[2310,2315],{"type":43,"tag":57,"props":2311,"children":2312},{},[2313],{"type":48,"value":2314},"✖️ CLOSED",{"type":48,"value":2316},": Maestro should create a replacement; check subscription health",{"type":43,"tag":145,"props":2318,"children":2319},{},[2320,2325],{"type":43,"tag":57,"props":2321,"children":2322},{},[2323],{"type":48,"value":2324},"📭 NO-OP",{"type":48,"value":2326},": Empty diff — changes landed via other paths",{"type":43,"tag":145,"props":2328,"children":2329},{},[2330,2335],{"type":43,"tag":57,"props":2331,"children":2332},{},[2333],{"type":48,"value":2334},"🔄 IN PROGRESS",{"type":48,"value":2336},": Recent force push within 24h — someone is working on it",{"type":43,"tag":145,"props":2338,"children":2339},{},[2340,2345],{"type":43,"tag":57,"props":2341,"children":2342},{},[2343],{"type":48,"value":2344},"⏳ STALE",{"type":48,"value":2346},": No activity for >3 days — needs attention",{"type":43,"tag":145,"props":2348,"children":2349},{},[2350,2355],{"type":43,"tag":57,"props":2351,"children":2352},{},[2353],{"type":48,"value":2354},"🔴 CI-RED",{"type":48,"value":2356},": CI is failing — investigate with ci-analysis even if codeflow is otherwise healthy",{"type":43,"tag":145,"props":2358,"children":2359},{},[2360,2365],{"type":43,"tag":57,"props":2361,"children":2362},{},[2363],{"type":48,"value":2364},"✅ ACTIVE",{"type":48,"value":2366},": PR has content and recent activity",{"type":43,"tag":633,"props":2368,"children":2370},{"id":2369},"ci-status-on-open-prs",[2371],{"type":48,"value":2372},"CI Status on Open PRs",{"type":43,"tag":89,"props":2374,"children":2375},{},[2376],{"type":43,"tag":51,"props":2377,"children":2378},{},[2379,2380,2385,2387,2392,2394,2399],{"type":48,"value":96},{"type":43,"tag":57,"props":2381,"children":2382},{},[2383],{"type":48,"value":2384},"Always report CI status for open PRs.",{"type":48,"value":2386}," A \"healthy\" PR with red CI is NOT healthy — CI failure is a problem regardless of codeflow state. A stale PR with red CI is stale ",{"type":43,"tag":1225,"props":2388,"children":2389},{},[2390],{"type":48,"value":2391},"because",{"type":48,"value":2393}," CI is failing. Report ",{"type":43,"tag":72,"props":2395,"children":2397},{"className":2396},[],[2398],{"type":48,"value":2078},{"type":48,"value":2400}," from the script output in every PR row.",{"type":43,"tag":417,"props":2402,"children":2403},{},[2404,2424],{"type":43,"tag":421,"props":2405,"children":2406},{},[2407],{"type":43,"tag":425,"props":2408,"children":2409},{},[2410,2414,2419],{"type":43,"tag":429,"props":2411,"children":2412},{},[2413],{"type":48,"value":2078},{"type":43,"tag":429,"props":2415,"children":2416},{},[2417],{"type":48,"value":2418},"Meaning",{"type":43,"tag":429,"props":2420,"children":2421},{},[2422],{"type":48,"value":2423},"Action",{"type":43,"tag":445,"props":2425,"children":2426},{},[2427,2449,2488,2510],{"type":43,"tag":425,"props":2428,"children":2429},{},[2430,2439,2444],{"type":43,"tag":452,"props":2431,"children":2432},{},[2433],{"type":43,"tag":72,"props":2434,"children":2436},{"className":2435},[],[2437],{"type":48,"value":2438},"green",{"type":43,"tag":452,"props":2440,"children":2441},{},[2442],{"type":48,"value":2443},"All checks passing",{"type":43,"tag":452,"props":2445,"children":2446},{},[2447],{"type":48,"value":2448},"PR is mergeable if no conflicts",{"type":43,"tag":425,"props":2450,"children":2451},{},[2452,2461,2478],{"type":43,"tag":452,"props":2453,"children":2454},{},[2455],{"type":43,"tag":72,"props":2456,"children":2458},{"className":2457},[],[2459],{"type":48,"value":2460},"red",{"type":43,"tag":452,"props":2462,"children":2463},{},[2464,2466,2471,2472,2477],{"type":48,"value":2465},"CI failures (",{"type":43,"tag":72,"props":2467,"children":2469},{"className":2468},[],[2470],{"type":48,"value":2086},{"type":48,"value":1337},{"type":43,"tag":72,"props":2473,"children":2475},{"className":2474},[],[2476],{"type":48,"value":2093},{"type":48,"value":228},{"type":43,"tag":452,"props":2479,"children":2480},{},[2481,2486],{"type":43,"tag":57,"props":2482,"children":2483},{},[2484],{"type":48,"value":2485},"Always flag this",{"type":48,"value":2487}," — even on \"healthy\" PRs. Suggest ci-analysis for deeper investigation.",{"type":43,"tag":425,"props":2489,"children":2490},{},[2491,2500,2505],{"type":43,"tag":452,"props":2492,"children":2493},{},[2494],{"type":43,"tag":72,"props":2495,"children":2497},{"className":2496},[],[2498],{"type":48,"value":2499},"pending",{"type":43,"tag":452,"props":2501,"children":2502},{},[2503],{"type":48,"value":2504},"Checks still running",{"type":43,"tag":452,"props":2506,"children":2507},{},[2508],{"type":48,"value":2509},"Wait for completion",{"type":43,"tag":425,"props":2511,"children":2512},{},[2513,2522,2527],{"type":43,"tag":452,"props":2514,"children":2515},{},[2516],{"type":43,"tag":72,"props":2517,"children":2519},{"className":2518},[],[2520],{"type":48,"value":2521},"none",{"type":43,"tag":452,"props":2523,"children":2524},{},[2525],{"type":48,"value":2526},"No checks found",{"type":43,"tag":452,"props":2528,"children":2529},{},[2530],{"type":48,"value":2531},"Unusual — may be freshly pushed",{"type":43,"tag":633,"props":2533,"children":2535},{"id":2534},"subscription-health-diagnostics",[2536],{"type":48,"value":2537},"Subscription Health Diagnostics",{"type":43,"tag":141,"props":2539,"children":2540},{},[2541,2555,2569,2591],{"type":43,"tag":145,"props":2542,"children":2543},{},[2544,2553],{"type":43,"tag":57,"props":2545,"children":2546},{},[2547],{"type":43,"tag":72,"props":2548,"children":2550},{"className":2549},[],[2551],{"type":48,"value":2552},"maestro-stuck",{"type":48,"value":2554},": Subscription enabled, but last applied build is older than latest — Maestro isn't processing. Trigger the subscription to remediate.",{"type":43,"tag":145,"props":2556,"children":2557},{},[2558,2567],{"type":43,"tag":57,"props":2559,"children":2560},{},[2561],{"type":43,"tag":72,"props":2562,"children":2564},{"className":2563},[],[2565],{"type":48,"value":2566},"subscription-disabled",{"type":48,"value":2568},": Subscription turned off — intentional or oversight",{"type":43,"tag":145,"props":2570,"children":2571},{},[2572,2581,2583,2589],{"type":43,"tag":57,"props":2573,"children":2574},{},[2575],{"type":43,"tag":72,"props":2576,"children":2578},{"className":2577},[],[2579],{"type":48,"value":2580},"channel-frozen",{"type":48,"value":2582},": Latest build is ",{"type":43,"tag":72,"props":2584,"children":2586},{"className":2585},[],[2587],{"type":48,"value":2588},"Released",{"type":48,"value":2590}," — no action needed (preview shipped)",{"type":43,"tag":145,"props":2592,"children":2593},{},[2594,2603],{"type":43,"tag":57,"props":2595,"children":2596},{},[2597],{"type":43,"tag":72,"props":2598,"children":2600},{"className":2599},[],[2601],{"type":48,"value":2602},"subscription-missing",{"type":48,"value":2604},": No subscription exists — expected for shipped previews",{"type":43,"tag":633,"props":2606,"children":2608},{"id":2607},"subscription-history-patterns",[2609],{"type":48,"value":2610},"Subscription History Patterns",{"type":43,"tag":51,"props":2612,"children":2613},{},[2614,2615,2619,2621,2627,2629,2634,2636,2641],{"type":48,"value":1793},{"type":43,"tag":57,"props":2616,"children":2617},{},[2618],{"type":48,"value":1809},{"type":48,"value":2620}," to understand failure timelines. Key patterns: one-off ",{"type":43,"tag":72,"props":2622,"children":2624},{"className":2623},[],[2625],{"type":48,"value":2626},"ApplyingUpdates",{"type":48,"value":2628}," failures are normal retry; ",{"type":43,"tag":57,"props":2630,"children":2631},{},[2632],{"type":48,"value":2633},"alternating failures spanning weeks",{"type":48,"value":2635}," indicate systemic problems (conflict, CI, blocked forward flow). Long gaps mean disabled subscription or no new builds. See ",{"type":43,"tag":203,"props":2637,"children":2639},{"href":2638},"references\u002Fvmr-codeflow-reference.md#subscription-history-patterns",[2640],{"type":48,"value":395},{"type":48,"value":2642}," for the full pattern catalog.",{"type":43,"tag":89,"props":2644,"children":2645},{},[2646],{"type":43,"tag":51,"props":2647,"children":2648},{},[2649,2651,2656],{"type":48,"value":2650},"❌ ",{"type":43,"tag":57,"props":2652,"children":2653},{},[2654],{"type":48,"value":2655},"Never assume \"Unknown\" means healthy.",{"type":48,"value":2657}," API failures produce Unknown status — exclude from positive counts.",{"type":43,"tag":129,"props":2659,"children":2661},{"id":2660},"generating-recommendations",[2662],{"type":48,"value":2663},"Generating Recommendations",{"type":43,"tag":51,"props":2665,"children":2666},{},[2667,2668,2674,2676,2681],{"type":48,"value":1793},{"type":43,"tag":72,"props":2669,"children":2671},{"className":2670},[],[2672],{"type":48,"value":2673},"isCodeflowPR",{"type":48,"value":2675}," first — if the PR isn't from ",{"type":43,"tag":72,"props":2677,"children":2679},{"className":2678},[],[2680],{"type":48,"value":155},{"type":48,"value":2682},", skip codeflow advice.",{"type":43,"tag":417,"props":2684,"children":2685},{},[2686,2701],{"type":43,"tag":421,"props":2687,"children":2688},{},[2689],{"type":43,"tag":425,"props":2690,"children":2691},{},[2692,2697],{"type":43,"tag":429,"props":2693,"children":2694},{},[2695],{"type":48,"value":2696},"State",{"type":43,"tag":429,"props":2698,"children":2699},{},[2700],{"type":48,"value":2423},{"type":43,"tag":445,"props":2702,"children":2703},{},[2704,2717,2730,2743,2756,2769],{"type":43,"tag":425,"props":2705,"children":2706},{},[2707,2712],{"type":43,"tag":452,"props":2708,"children":2709},{},[2710],{"type":48,"value":2711},"MERGED",{"type":43,"tag":452,"props":2713,"children":2714},{},[2715],{"type":48,"value":2716},"Mention Maestro will create new PR if VMR has newer content",{"type":43,"tag":425,"props":2718,"children":2719},{},[2720,2725],{"type":43,"tag":452,"props":2721,"children":2722},{},[2723],{"type":48,"value":2724},"CLOSED",{"type":43,"tag":452,"props":2726,"children":2727},{},[2728],{"type":48,"value":2729},"Suggest triggering subscription if ID available",{"type":43,"tag":425,"props":2731,"children":2732},{},[2733,2738],{"type":43,"tag":452,"props":2734,"children":2735},{},[2736],{"type":48,"value":2737},"NO-OP",{"type":43,"tag":452,"props":2739,"children":2740},{},[2741],{"type":48,"value":2742},"Recommend closing\u002Fmerging to clear state",{"type":43,"tag":425,"props":2744,"children":2745},{},[2746,2751],{"type":43,"tag":452,"props":2747,"children":2748},{},[2749],{"type":48,"value":2750},"IN_PROGRESS",{"type":43,"tag":452,"props":2752,"children":2753},{},[2754],{"type":48,"value":2755},"Wait, then check back",{"type":43,"tag":425,"props":2757,"children":2758},{},[2759,2764],{"type":43,"tag":452,"props":2760,"children":2761},{},[2762],{"type":48,"value":2763},"STALE",{"type":43,"tag":452,"props":2765,"children":2766},{},[2767],{"type":48,"value":2768},"Check warnings for what's blocking",{"type":43,"tag":425,"props":2770,"children":2771},{},[2772,2777],{"type":43,"tag":452,"props":2773,"children":2774},{},[2775],{"type":48,"value":2776},"ACTIVE",{"type":43,"tag":452,"props":2778,"children":2779},{},[2780],{"type":48,"value":2781},"Check freshness and warnings for nuance",{"type":43,"tag":633,"props":2783,"children":2785},{"id":2784},"remediation-via-maestro",[2786],{"type":48,"value":2787},"Remediation via Maestro",{"type":43,"tag":417,"props":2789,"children":2790},{},[2791,2806],{"type":43,"tag":421,"props":2792,"children":2793},{},[2794],{"type":43,"tag":425,"props":2795,"children":2796},{},[2797,2801],{"type":43,"tag":429,"props":2798,"children":2799},{},[2800],{"type":48,"value":2423},{"type":43,"tag":429,"props":2802,"children":2803},{},[2804],{"type":48,"value":2805},"When",{"type":43,"tag":445,"props":2807,"children":2808},{},[2809,2822,2835,2848,2861,2874],{"type":43,"tag":425,"props":2810,"children":2811},{},[2812,2817],{"type":43,"tag":452,"props":2813,"children":2814},{},[2815],{"type":48,"value":2816},"Trigger subscription",{"type":43,"tag":452,"props":2818,"children":2819},{},[2820],{"type":48,"value":2821},"PR was closed or no PR exists for an enabled subscription",{"type":43,"tag":425,"props":2823,"children":2824},{},[2825,2830],{"type":43,"tag":452,"props":2826,"children":2827},{},[2828],{"type":48,"value":2829},"Trigger with source repo + channel",{"type":43,"tag":452,"props":2831,"children":2832},{},[2833],{"type":48,"value":2834},"Provide source repository URL and channel name to auto-resolve latest build (eliminates manual build lookup)",{"type":43,"tag":425,"props":2836,"children":2837},{},[2838,2843],{"type":43,"tag":452,"props":2839,"children":2840},{},[2841],{"type":48,"value":2842},"Force-trigger subscription",{"type":43,"tag":452,"props":2844,"children":2845},{},[2846],{"type":48,"value":2847},"Bookkeeping bug — subscription shows failures but PRs merge. Force-trigger overwrites the existing PR branch with fresh content, resetting Maestro's state",{"type":43,"tag":425,"props":2849,"children":2850},{},[2851,2856],{"type":43,"tag":452,"props":2852,"children":2853},{},[2854],{"type":48,"value":2855},"Check subscription history",{"type":43,"tag":452,"props":2857,"children":2858},{},[2859],{"type":48,"value":2860},"Diagnosing when a subscription got stuck or failed",{"type":43,"tag":425,"props":2862,"children":2863},{},[2864,2869],{"type":43,"tag":452,"props":2865,"children":2866},{},[2867],{"type":48,"value":2868},"Check backflow status for a VMR build",{"type":43,"tag":452,"props":2870,"children":2871},{},[2872],{"type":48,"value":2873},"Understanding which product repos received a VMR build",{"type":43,"tag":425,"props":2875,"children":2876},{},[2877,2882],{"type":43,"tag":452,"props":2878,"children":2879},{},[2880],{"type":48,"value":2881},"Bypass cache after action",{"type":43,"tag":452,"props":2883,"children":2884},{},[2885],{"type":48,"value":2886},"After triggering, verify state changed using noCache",{"type":43,"tag":89,"props":2888,"children":2889},{},[2890],{"type":43,"tag":51,"props":2891,"children":2892},{},[2893,2894,2899],{"type":48,"value":916},{"type":43,"tag":57,"props":2895,"children":2896},{},[2897],{"type":48,"value":2898},"Smart trigger",{"type":48,"value":2900},": When triggering a subscription, you can provide the source repository and channel name instead of looking up the latest build ID manually. The MCP server resolves the latest build automatically.",{"type":43,"tag":89,"props":2902,"children":2903},{},[2904],{"type":43,"tag":51,"props":2905,"children":2906},{},[2907,2908,2913],{"type":48,"value":916},{"type":43,"tag":57,"props":2909,"children":2910},{},[2911],{"type":48,"value":2912},"Force trigger",{"type":48,"value":2914},": Force-trigger overwrites the existing PR branch with fresh content. Use this when the subscription has a bookkeeping bug (consecutive failures but PRs merge) or when the tracked PR is in a broken state. Force-trigger is available via MCP.",{"type":43,"tag":633,"props":2916,"children":2918},{"id":2917},"darc-commands-when-mcp-insufficient",[2919],{"type":48,"value":2920},"Darc Commands (When MCP Insufficient)",{"type":43,"tag":1471,"props":2922,"children":2926},{"className":2923,"code":2924,"language":2925,"meta":1476,"style":1476},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","darc vmr resolve-conflict --subscription \u003Csubscription-id>   # Resolve conflicts locally\n","bash",[2927],{"type":43,"tag":72,"props":2928,"children":2929},{"__ignoreMap":1476},[2930],{"type":43,"tag":1482,"props":2931,"children":2932},{"class":1484,"line":1485},[2933,2938,2943,2948,2953,2959,2964,2970,2975],{"type":43,"tag":1482,"props":2934,"children":2935},{"style":1980},[2936],{"type":48,"value":2937},"darc",{"type":43,"tag":1482,"props":2939,"children":2940},{"style":1985},[2941],{"type":48,"value":2942}," vmr",{"type":43,"tag":1482,"props":2944,"children":2945},{"style":1985},[2946],{"type":48,"value":2947}," resolve-conflict",{"type":43,"tag":1482,"props":2949,"children":2950},{"style":1985},[2951],{"type":48,"value":2952}," --subscription",{"type":43,"tag":1482,"props":2954,"children":2956},{"style":2955},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[2957],{"type":48,"value":2958}," \u003C",{"type":43,"tag":1482,"props":2960,"children":2961},{"style":1985},[2962],{"type":48,"value":2963},"subscription-i",{"type":43,"tag":1482,"props":2965,"children":2967},{"style":2966},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[2968],{"type":48,"value":2969},"d",{"type":43,"tag":1482,"props":2971,"children":2972},{"style":2955},[2973],{"type":48,"value":2974},">",{"type":43,"tag":1482,"props":2976,"children":2977},{"style":1971},[2978],{"type":48,"value":2979},"   # Resolve conflicts locally\n",{"type":43,"tag":129,"props":2981,"children":2983},{"id":2982},"widespread-staleness-pattern",[2984],{"type":48,"value":2985},"Widespread Staleness Pattern",{"type":43,"tag":51,"props":2987,"children":2988},{},[2989,2991,2996],{"type":48,"value":2990},"When multiple repos are missing backflow simultaneously, the root cause is usually ",{"type":43,"tag":57,"props":2992,"children":2993},{},[2994],{"type":48,"value":2995},"VMR build failures",{"type":48,"value":2997},", not Maestro:",{"type":43,"tag":1033,"props":2999,"children":3000},{},[3001,3011,3024],{"type":43,"tag":145,"props":3002,"children":3003},{},[3004,3005,3009],{"type":48,"value":1793},{"type":43,"tag":57,"props":3006,"children":3007},{},[3008],{"type":48,"value":1798},{"type":48,"value":3010}," across multiple channels — if all are stale, VMR builds are broken",{"type":43,"tag":145,"props":3012,"children":3013},{},[3014,3016,3022],{"type":48,"value":3015},"Check public VMR CI builds at ",{"type":43,"tag":72,"props":3017,"children":3019},{"className":3018},[],[3020],{"type":48,"value":3021},"dnceng-public\u002Fpublic",{"type":48,"value":3023}," pipeline 278 for failures",{"type":43,"tag":145,"props":3025,"children":3026},{},[3027,3029,3034,3036,3042],{"type":48,"value":3028},"Search ",{"type":43,"tag":72,"props":3030,"children":3032},{"className":3031},[],[3033],{"type":48,"value":387},{"type":48,"value":3035}," issues with ",{"type":43,"tag":72,"props":3037,"children":3039},{"className":3038},[],[3040],{"type":48,"value":3041},"[Operational Issue]",{"type":48,"value":3043}," label",{"type":43,"tag":129,"props":3045,"children":3047},{"id":3046},"references",[3048],{"type":48,"value":3049},"References",{"type":43,"tag":141,"props":3051,"children":3052},{},[3053,3067,3081],{"type":43,"tag":145,"props":3054,"children":3055},{},[3056,3061,3062],{"type":43,"tag":57,"props":3057,"children":3058},{},[3059],{"type":48,"value":3060},"VMR codeflow concepts & darc commands",{"type":48,"value":1263},{"type":43,"tag":203,"props":3063,"children":3065},{"href":3064},"references\u002Fvmr-codeflow-reference.md",[3066],{"type":48,"value":3064},{"type":43,"tag":145,"props":3068,"children":3069},{},[3070,3075,3076],{"type":43,"tag":57,"props":3071,"children":3072},{},[3073],{"type":48,"value":3074},"VMR build topology",{"type":48,"value":1263},{"type":43,"tag":203,"props":3077,"children":3079},{"href":3078},"references\u002Fvmr-build-topology.md",[3080],{"type":48,"value":3078},{"type":43,"tag":145,"props":3082,"children":3083},{},[3084,3088,3089],{"type":43,"tag":57,"props":3085,"children":3086},{},[3087],{"type":48,"value":199},{"type":48,"value":1263},{"type":43,"tag":203,"props":3090,"children":3092},{"href":205,"rel":3091},[207],[3093],{"type":48,"value":3094},"github.com\u002Flewing\u002Fmaestro.mcp",{"type":43,"tag":3096,"props":3097,"children":3098},"style",{},[3099],{"type":48,"value":3100},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":3102,"total":3269},[3103,3119,3136,3151,3169,3183,3203,3213,3225,3235,3248,3259],{"slug":3104,"name":3104,"fn":3105,"description":3106,"org":3107,"tags":3108,"stars":3116,"repoUrl":3117,"updatedAt":3118},"multithreaded-task-migration","migrate MSBuild tasks to multithreaded mode","Guide for migrating MSBuild tasks to multithreaded mode support, including compatibility red-team review. Use this when converting tasks to thread-safe versions, implementing IMultiThreadableTask, adding TaskEnvironment support, or auditing migrations for behavioral compatibility.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3109,3112,3113],{"name":3110,"slug":3111,"type":15},".NET","net",{"name":20,"slug":21,"type":15},{"name":3114,"slug":3115,"type":15},"Performance","performance",5535,"https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fmsbuild","2026-07-22T05:37:33.965588",{"slug":3120,"name":3120,"fn":3121,"description":3122,"org":3123,"tags":3124,"stars":3133,"repoUrl":3134,"updatedAt":3135},"analyzing-dotnet-performance","analyze .NET code for performance anti-patterns","Scans .NET code for ~50 performance anti-patterns across async, memory, strings, collections, LINQ, regex, serialization, and I\u002FO with tiered severity classification. Use when analyzing .NET code for optimization opportunities, reviewing hot paths, or auditing allocation-heavy patterns.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3125,3126,3129,3132],{"name":3110,"slug":3111,"type":15},{"name":3127,"slug":3128,"type":15},"Code Analysis","code-analysis",{"name":3130,"slug":3131,"type":15},"Debugging","debugging",{"name":3114,"slug":3115,"type":15},4576,"https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fskills","2026-07-12T08:23:25.400375",{"slug":3137,"name":3137,"fn":3138,"description":3139,"org":3140,"tags":3141,"stars":3133,"repoUrl":3134,"updatedAt":3150},"android-tombstone-symbolication","symbolicate .NET runtime frames in Android tombstones","Symbolicate the .NET runtime frames in an Android tombstone file. Extracts BuildIds and PC offsets from the native backtrace, downloads debug symbols from the Microsoft symbol server, and runs llvm-symbolizer to produce function names with source file and line numbers. USE FOR triaging a .NET MAUI or Mono Android app crash from a tombstone, resolving native backtrace frames in libmonosgen-2.0.so or libcoreclr.so to .NET runtime source code, or investigating SIGABRT, SIGSEGV, or other native signals originating from the .NET runtime on Android. DO NOT USE FOR pure Java\u002FKotlin crashes, managed .NET exceptions that are already captured in logcat, or iOS crash logs. INVOKES Symbolicate-Tombstone.ps1 script, llvm-symbolizer, Microsoft symbol server.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3142,3143,3146,3147],{"name":3110,"slug":3111,"type":15},{"name":3144,"slug":3145,"type":15},"Android","android",{"name":3130,"slug":3131,"type":15},{"name":3148,"slug":3149,"type":15},"Microsoft","microsoft","2026-07-12T08:23:21.595572",{"slug":3152,"name":3152,"fn":3153,"description":3154,"org":3155,"tags":3156,"stars":3133,"repoUrl":3134,"updatedAt":3168},"apple-crash-symbolication","symbolicate .NET runtime frames in crash logs","Symbolicate .NET runtime frames in Apple platform .ips crash logs (iOS, tvOS, Mac Catalyst, macOS). Extracts UUIDs and addresses from the native backtrace, locates dSYM debug symbols, and runs atos to produce function names with source file and line numbers. Automatically downloads .dwarf symbols from the Microsoft symbol server using Mach-O UUIDs. USE FOR triaging a .NET MAUI or Mono app crash from an .ips file on any Apple platform, resolving native backtrace frames in libcoreclr or libmonosgen-2.0 to .NET runtime source code, retrieving .ips crash logs from a connected iOS device or iPhone, or investigating EXC_CRASH, EXC_BAD_ACCESS, SIGABRT, or SIGSEGV originating from the .NET runtime. DO NOT USE FOR pure Swift\u002FObjective-C crashes with no .NET components, or Android tombstone files. INVOKES Symbolicate-Crash.ps1 script, atos, dwarfdump, idevicecrashreport.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3157,3158,3159,3162,3165],{"name":3110,"slug":3111,"type":15},{"name":3130,"slug":3131,"type":15},{"name":3160,"slug":3161,"type":15},"iOS","ios",{"name":3163,"slug":3164,"type":15},"macOS","macos",{"name":3166,"slug":3167,"type":15},"Observability","observability","2026-07-12T08:23:20.369986",{"slug":3170,"name":3170,"fn":3171,"description":3172,"org":3173,"tags":3174,"stars":3133,"repoUrl":3134,"updatedAt":3182},"assertion-quality","evaluate assertion quality in test suites","Analyzes the variety and depth of assertions across test suites in any language. Use when the user asks to evaluate assertion quality, find shallow tests, identify assertion-free tests (no assertions or only trivial ones like Assert.IsNotNull \u002F toBeTruthy()), flag self-referential or tautological assertions, measure assertion diversity, or audit whether tests verify different facets of behavior. Polyglot: .NET, Python, TS\u002FJS, Java, Go, Ruby, Rust, Swift, Kotlin, PowerShell, C++. DO NOT USE FOR: writing new tests (use code-testing-agent \u002F writing-mstest-tests), mutation reasoning about whether tests would catch a bug (use test-gap-analysis), or a general severity-ranked anti-pattern audit (use test-anti-patterns), fixing or rewriting assertions, or writing, fixing, or modernizing MSTest tests, assertions, or attributes (use writing-mstest-tests).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3175,3176,3179],{"name":3127,"slug":3128,"type":15},{"name":3177,"slug":3178,"type":15},"QA","qa",{"name":3180,"slug":3181,"type":15},"Testing","testing","2026-07-12T08:23:51.277743",{"slug":3184,"name":3184,"fn":3185,"description":3186,"org":3187,"tags":3188,"stars":3133,"repoUrl":3134,"updatedAt":3202},"author-component","create and review Blazor components","Create or review Blazor components (.razor files) with correct architecture. USE FOR: writing new Blazor components that do NOT involve JavaScript interop, implementing parameters and EventCallback, RenderFragment slots, component lifecycle (OnInitializedAsync, OnParametersSet), async patterns, IAsyncDisposable, CancellationToken, CSS isolation, code-behind. DO NOT USE FOR: creating new projects (use create-blazor-project), JavaScript interop or calling browser APIs from Blazor (use use-js-interop), forms and validation (use collect-user-input), prerendering issues (use support-prerendering), HTTP data fetching patterns (use fetch-and-send-data), coordinating state between unrelated components (use coordinate-components).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3189,3190,3193,3196,3199],{"name":3110,"slug":3111,"type":15},{"name":3191,"slug":3192,"type":15},"Blazor","blazor",{"name":3194,"slug":3195,"type":15},"C#","csharp",{"name":3197,"slug":3198,"type":15},"UI Components","ui-components",{"name":3200,"slug":3201,"type":15},"Web Development","web-development","2026-07-15T06:03:29.216359",{"slug":3204,"name":3204,"fn":3205,"description":3206,"org":3207,"tags":3208,"stars":3133,"repoUrl":3134,"updatedAt":3212},"binlog-failure-analysis","analyze MSBuild binary logs","Analyze MSBuild binary logs to diagnose build failures. USE FOR: build errors that are unclear from console output, diagnosing cascading failures across multi-project builds, tracing MSBuild target execution order, and generally any MSBuild build issues. Requires an existing .binlog file. DO NOT USE FOR: generating binlogs (use binlog-generation), non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3209,3210,3211],{"name":3127,"slug":3128,"type":15},{"name":3130,"slug":3131,"type":15},{"name":3148,"slug":3149,"type":15},"2026-07-12T08:21:34.637923",{"slug":3214,"name":3214,"fn":3215,"description":3216,"org":3217,"tags":3218,"stars":3133,"repoUrl":3134,"updatedAt":3224},"binlog-generation","generate MSBuild binary logs for diagnostics","Generate MSBuild binary logs (binlogs) for build diagnostics and analysis. USE FOR: adding \u002Fbl:{} to any dotnet build, test, pack, publish, or restore command to capture a full build execution trace, prerequisite for binlog-failure-analysis and build-perf-diagnostics skills, enabling post-build investigation of errors or performance. Requires MSBuild 17.8+ \u002F .NET 8 SDK+ for {} placeholder; PowerShell needs -bl:{{}}. DO NOT USE FOR: non-MSBuild build systems (npm, Maven, CMake), analyzing an existing binlog (use binlog-failure-analysis instead).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3219,3222,3223],{"name":3220,"slug":3221,"type":15},"Build","build",{"name":3130,"slug":3131,"type":15},{"name":20,"slug":21,"type":15},"2026-07-19T05:38:19.340791",{"slug":3226,"name":3226,"fn":3227,"description":3228,"org":3229,"tags":3230,"stars":3133,"repoUrl":3134,"updatedAt":3234},"build-parallelism","optimize MSBuild build parallelism","Diagnose and fix under-parallelized MSBuild builds. USE WHEN a multi-project solution build is slower than expected, doesn't speed up when you add cores, pegs a single core while others idle, or you want to know why `-m` isn't helping. Note: `\u002Fmaxcpucount` default is 1 (sequential) — always pass `-m` for parallel builds. Covers finding the critical path (longest serial ProjectReference chain), graph build (`\u002Fgraph`), BuildInParallel, and solution filters (`.slnf`). DO NOT USE FOR: single-project builds, incremental issues (use incremental-build), compilation slowness inside one project (use build-perf-diagnostics), non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3231,3232,3233],{"name":3110,"slug":3111,"type":15},{"name":20,"slug":21,"type":15},{"name":3114,"slug":3115,"type":15},"2026-07-19T05:38:18.364937",{"slug":3236,"name":3236,"fn":3237,"description":3238,"org":3239,"tags":3240,"stars":3133,"repoUrl":3134,"updatedAt":3247},"build-perf-baseline","establish and optimize build performance baselines","Establish build performance baselines and apply systematic optimization techniques. USE FOR: diagnosing slow builds, establishing before\u002Fafter measurements (cold, warm, no-op scenarios), applying optimization strategies like MSBuild Server, static graph builds, artifacts output, and dependency graph trimming. Start here before diving into build-perf-diagnostics, incremental-build, or build-parallelism. DO NOT USE FOR: non-MSBuild build systems, detailed bottleneck analysis (use build-perf-diagnostics after baselining).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3241,3242,3245,3246],{"name":20,"slug":21,"type":15},{"name":3243,"slug":3244,"type":15},"Monitoring","monitoring",{"name":3114,"slug":3115,"type":15},{"name":3180,"slug":3181,"type":15},"2026-07-12T08:21:35.865649",{"slug":3249,"name":3249,"fn":3250,"description":3251,"org":3252,"tags":3253,"stars":3133,"repoUrl":3134,"updatedAt":3258},"build-perf-diagnostics","diagnose MSBuild build performance bottlenecks","Diagnose MSBuild build performance bottlenecks using binary log analysis. USE FOR: identifying why builds are slow by analyzing binlog performance summaries, detecting ResolveAssemblyReference (RAR) taking >5s, Roslyn analyzers consuming >30% of Csc time, single targets dominating >50% of build time, node utilization below 80%, excessive Copy tasks, NuGet restore running every build. Covers timeline analysis, Target\u002FTask Performance Summary interpretation, and 7 common bottleneck categories. Use after build-perf-baseline has established measurements. DO NOT USE FOR: establishing initial baselines (use build-perf-baseline first), fixing incremental build issues (use incremental-build), parallelism tuning (use build-parallelism), non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3254,3255,3256,3257],{"name":3110,"slug":3111,"type":15},{"name":3130,"slug":3131,"type":15},{"name":20,"slug":21,"type":15},{"name":3114,"slug":3115,"type":15},"2026-07-12T08:21:40.961722",{"slug":3260,"name":3260,"fn":3261,"description":3262,"org":3263,"tags":3264,"stars":3133,"repoUrl":3134,"updatedAt":3268},"check-bin-obj-clash","detect MSBuild output path conflicts","Detects MSBuild projects with conflicting OutputPath or IntermediateOutputPath. USE FOR: builds failing with 'Cannot create a file when that file already exists', 'The process cannot access the file because it is being used by another process', intermittent build failures that succeed on retry, or missing\u002Foverwritten outputs in multi-project or multi-targeting builds where bin\u002Fobj (or project.assets.json) collide. Common causes: shared OutputPath, missing AppendTargetFrameworkToOutputPath, extra global properties (e.g. PublishReadyToRun), or SetTargetFramework on a ProjectReference to a single-targeting project. DO NOT USE FOR: file access errors unrelated to MSBuild (OS-level locking), single-project single-TFM builds, non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3265,3266,3267],{"name":3130,"slug":3131,"type":15},{"name":20,"slug":21,"type":15},{"name":3177,"slug":3178,"type":15},"2026-07-19T05:38:14.336279",144,{"items":3271,"total":25},[3272,3287,3300,3313,3324,3331,3341],{"slug":3273,"name":3273,"fn":3274,"description":3275,"org":3276,"tags":3277,"stars":25,"repoUrl":26,"updatedAt":3286},"binskim-analysis","investigate BinSkim SDL security findings","Investigate BinSkim SDL findings from official pipelines — understand Guardian filtering, compare raw vs merged SARIF, decode portal results, and determine fix ownership. Use when asked about SDL scan results, portal findings, Guardian filtering, rule meanings, or discrepancies between local and official results. Also use when asked \"why does the portal show X\", \"what's filtered\", \"explain Guardian\", \"investigate SDL findings\", \"portal BA2008\", \"binskim failures in pipeline\", or \"what rules are required\". DO NOT USE FOR: running BinSkim locally (use binskim-scan), source code analysis (use CodeQL), or credential scanning (use CredScan).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3278,3279,3282,3283],{"name":3110,"slug":3111,"type":15},{"name":3280,"slug":3281,"type":15},"Audit","audit",{"name":3127,"slug":3128,"type":15},{"name":3284,"slug":3285,"type":15},"Security","security","2026-07-12T08:23:11.212231",{"slug":3288,"name":3288,"fn":3289,"description":3290,"org":3291,"tags":3292,"stars":25,"repoUrl":26,"updatedAt":3299},"binskim-scan","run BinSkim binary security analysis","Run BinSkim binary security analysis locally against a dotnet repository. Use when asked to scan binaries, check BinSkim compliance, verify a fix for a rule violation, or run a local SDL scan. Also use when asked \"run binskim\", \"binary security scan\", \"scan binaries\", \"check binskim\", \"verify my fix\", \"repro BA2008 locally\", or \"verify BA2008 fix\". DO NOT USE FOR: investigating official pipeline results or portal findings (use binskim-analysis), source code analysis (use CodeQL), credential scanning (use CredScan), or general build\u002Ftest failures (use ci-analysis).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3293,3294,3297,3298],{"name":3110,"slug":3111,"type":15},{"name":3295,"slug":3296,"type":15},"CLI","cli",{"name":3127,"slug":3128,"type":15},{"name":3284,"slug":3285,"type":15},"2026-07-12T08:23:09.911458",{"slug":3301,"name":3301,"fn":3302,"description":3303,"org":3304,"tags":3305,"stars":25,"repoUrl":26,"updatedAt":3312},"ci-analysis","analyze .NET CI build and test status","Analyze CI build and test status from Azure DevOps and Helix for dotnet repository PRs. Use when checking CI status, investigating failures, determining if a PR is ready to merge, or given URLs containing dev.azure.com or helix.dot.net. Also use when asked \"why is CI red\", \"test failures\", \"retry CI\", \"rerun tests\", \"is CI green\", \"build failed\", \"checks failing\", or \"flaky tests\". DO NOT USE FOR: investigating stale codeflow PRs or dependency update health, tracing whether a commit has flowed from one repo to another, reviewing code changes for correctness or style.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3306,3307,3310,3311],{"name":3110,"slug":3111,"type":15},{"name":3308,"slug":3309,"type":15},"Azure","azure",{"name":23,"slug":24,"type":15},{"name":3130,"slug":3131,"type":15},"2026-07-12T08:21:49.360882",{"slug":3314,"name":3314,"fn":3315,"description":3316,"org":3317,"tags":3318,"stars":25,"repoUrl":26,"updatedAt":3323},"ci-crash-dump","debug CI crash dumps","Download and debug crash dumps from CI test failures in dotnet repositories. Use when a CI test crashed (not just failed), when the user wants to debug a crash dump from a PR or build, or when asked \"debug dump\", \"download dump\", \"crash dump from CI\", \"test crashed\", \"analyze crash in PR\", or \"why did the test crash\". DO NOT USE FOR: test failures that are not crashes (use ci-analysis), build failures, performance analysis, or analyzing dumps you already have locally.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3319,3320,3321,3322],{"name":3110,"slug":3111,"type":15},{"name":23,"slug":24,"type":15},{"name":3130,"slug":3131,"type":15},{"name":3180,"slug":3181,"type":15},"2026-07-12T08:21:56.945844",{"slug":4,"name":4,"fn":5,"description":6,"org":3325,"tags":3326,"stars":25,"repoUrl":26,"updatedAt":27},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3327,3328,3329,3330],{"name":23,"slug":24,"type":15},{"name":20,"slug":21,"type":15},{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"slug":3332,"name":3332,"fn":3333,"description":3334,"org":3335,"tags":3336,"stars":25,"repoUrl":26,"updatedAt":3340},"flow-tracing","trace .NET dependency flow in VMR","Trace dependency flow across .NET repos through the VMR pipeline. USE FOR: checking if a PR\u002Fcommit from repo A has reached repo B, finding what runtime SHA is in an SDK build, tracing dependency versions through the VMR, checking if a commit is included in an SDK build, decoding SDK version strings, \"has my fix reached runtime\", \"did roslyn#80873 flow to runtime\", \"what SHA is in SDK version X\", cross-repo dependency tracing, mapping SDK versions to VMR commits. DO NOT USE FOR: codeflow PR health or staleness (use flow-analysis skill), CI build failures (use ci-analysis skill). INVOKES: maestro and GitHub MCP tools, Get-SdkVersionTrace.ps1 script.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3337],{"name":3338,"slug":3339,"type":15},"Data Pipeline","data-pipeline","2026-07-12T08:21:55.689056",{"slug":3342,"name":3342,"fn":3343,"description":3344,"org":3345,"tags":3346,"stars":25,"repoUrl":26,"updatedAt":3350},"helix-investigation","investigate Helix test failures","Deep-dive investigation of Helix test failures starting from AzDO build legs. USE FOR: investigating recurring Helix test failures, downloading and analyzing Helix console logs, comparing passing vs failing runs, identifying machine-specific issues, XHarness timeout analysis, Android emulator DEVICE_NOT_FOUND errors, bulk failure aggregation across legs, \"why does this test fail on some machines\", \"top 5 failing tests in the last 2 days\", \"download helix logs for build X\", \"compare passing and failing helix runs\", \"what are the most common failures\". DO NOT USE FOR: high-level CI status checks (use ci-analysis), codeflow PRs (use flow-analysis). INVOKES: Helix and AzDO MCP tools, curl, gh CLI.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3347,3348,3349],{"name":3130,"slug":3131,"type":15},{"name":20,"slug":21,"type":15},{"name":3180,"slug":3181,"type":15},"2026-07-12T08:21:46.445586"]