microsoft/powercat-overflow
Reviews every Power Automate cloud flow inside a Power Platform solution (.zip) against Microsoft's coding guidelines and produces a [SolutionName].findings.json next to the uploaded solution, then opens the hosted PowerCAT-Overflow viewer at https://microsoft.github.io/power-cat-skills/PowerCAT-Overflow.html and uploads both files so the user can explore the results. Triggers: 'powercat overflow', 'overflow my solution', 'review my solution', 'evaluate flows in this solution', 'audit Power Auto
npx skills add https://github.com/microsoft/power-cat-skills --skill powercat-overflow
Review every Power Automate cloud flow in a Power Platform solution ZIP against Microsoft's coding guidelines, write a single solution-level findings JSON next to the uploaded solution, then open the hosted PowerCAT-Overflow viewer with both files loaded.
Hosted viewer: <https://microsoft.github.io/power-cat-skills/PowerCAT-Overflow.html>
Before doing any analysis, fetch the canonical source list with web_fetch (raw: true):
https://raw.githubusercontent.com/microsoft/power-cat-skills/refs/heads/main/Common/PowerCAT%20OverFlow/sources.md
Parse the Markdown link list and treat that set as the only anchor citations allowed in findings. If the fetch fails (network error, 404, empty body), stop and tell the user the source list is unreachable — do not proceed with a review. Cache the parsed list in memory for the rest of this run.
.zip path in <tagged_files>. Use the most recent match.m_ask_user: "Please attach the Power Platform solution .zip you'd like me to review."Remember the absolute path of the ZIP and its parent directory — both are needed later.
Unpack the solution to a temp working directory (Expand-Archive on Windows, unzip elsewhere).
A valid Power Platform solution ZIP contains:
solution.xml at the rootWorkflows/ folder with one or more <FriendlyName>-<GUID>.json files (and matching .xml sidecars you can ignore for analysis)Read solution.xml and extract:
solution.nameUniqueName element) → solution.uniqueNameVersion element) → solution.versionFor each *.json in Workflows/:
-<GUID>.json suffix (e.g. cf_AcknowledgeCaseId-1234abcd-...-....json → cf_AcknowledgeCaseId). This friendly name is the key under which the flow's findings will be stored.properties.definition → definition if present, exactly as before.If Workflows/ is missing or empty, stop and tell the user the ZIP isn't a flow-bearing solution.
For every flow, walk all actions recursively (actions, else.actions, cases.*.actions, default.actions) and assign each finding an impact of low, medium, or high. Where a finding clearly points at a specific action, capture its name in the action field (must match the action key exactly, case-sensitive; triggers count). Cite only URLs from the Step 0 source list — never invent or paraphrase URLs.
description / peek-code notes → medium.Copyof-…, Test, Test2, MayankTest, etc.) shipped alongside originals → high (also surface at solution level).runtimeConfiguration.secureData.properties covering inputs and/or outputs → high.$authentication parameter reused across distinct external vendors → high.$filter or SQL fragments built by interpolating triggerBody() / user input → high.Request trigger without auth posture (no Entra/SAS/IP allow-list) → high.secureInputs → high.concat() of user input → medium.outputs('X') / body('X') where X belongs to a sibling Switch case or sibling parallel branch → high.retryPolicy → medium (group similar ones per flow).Wait actions with long fixed delays, or Until loops with > 30 iterations / > 1 h total → medium.Foreach without explicit runtimeConfiguration.concurrency → medium.concurrency on Foreach loops → low (positive callout).For each flow, produce 1–4 category objects (Complexity, Maintainability, Security, Performance in that order). Each category's impact = the highest impact among its items. 3–10 items per category is ideal; don't pad.
For every finding item, always include a fix field — a single actionable sentence (≤ 30 words, start with a verb) telling the developer exactly what to change. Examples:
"Enable secure inputs on HTTP action 'Send_Request' via Settings → Secure Inputs.""Replace the hardcoded URL in 'Initialize_Variable_Endpoint' with an environment variable.""Add concurrency (recommend: 10) to the Apply-to-each in its Settings panel."Collect across all flows:
summary, and set flowsAffected = how many flows had at least one item in that category.impact: high, a few medium if they affect the executive verdict). Each risk has label, desc, impact, optional category, optional fix (same single-sentence remediation convention as per-flow items), and — when applicable — flow (friendly name) and action (so the viewer can deep-link).flowCount, totalActions (sum of action counts across flows), highImpactFlows (flows where any category rolled up to high), flowsReviewed (= flowCount unless one failed to parse).Schema (authoritative): <https://raw.githubusercontent.com/microsoft/power-cat-skills/refs/heads/main/Common/PowerCAT%20OverFlow/solution.findings.schema.json>
Example: <https://raw.githubusercontent.com/microsoft/power-cat-skills/refs/heads/main/Common/PowerCAT%20OverFlow/solution.findings.sample.json>
Shape:
{
"solution": {
"name": "...",
"uniqueName": "...",
"version": "...",
"summary": "...",
"categories": [ { "category": "...", "impact": "...", "summary": "...", "flowsAffected": 0 } ],
"topRisks": [ { "label": "...", "desc": "...", "fix": "...", "impact": "...", "category": "...", "flow": "...", "action": "..." } ],
"stats": { "flowCount": 0, "totalActions": 0, "highImpactFlows": 0, "flowsReviewed": 0 }
},
"flows": {
"<FriendlyFlowName>": [
{ "category": "Complexity", "impact": "low|medium|high", "items": [ { "label": "...", "desc": "...", "fix": "...", "impact": "...", "action": "..." } ] },
{ "category": "Maintainability", "impact": "...", "items": [ ... ] },
{ "category": "Security", "impact": "...", "items": [ ... ] },
{ "category": "Performance", "impact": "...", "items": [ ... ] }
]
}
}
Output filename: <OriginalSolutionZipBaseName>.findings.json
Output location: the same folder as the uploaded .zip.
Validate the output against the JSON Schema before saving (at minimum: required keys present, category enum values, impact enum values, additionalProperties=false respected). If validation fails, fix and re-validate before continuing.
Open the hosted PowerCAT-Overflow viewer and upload the two files using the Playwright browser tools:
playwright-browser_navigate → https://microsoft.github.io/power-cat-skills/PowerCAT-Overflow.htmlplaywright-browser_snapshot to discover the two file inputs (one for the solution .zip, one for the findings .json). The labels in the UI clearly distinguish them.playwright-browser_file_upload once per input, passing the absolute paths in the right order. If the page exposes a single chooser that opens twice, call the upload tool twice with the appropriate path each time.playwright-browser_snapshot again to confirm both files are accepted (look for the rendered solution overview / flow list).If Playwright is unavailable, fall back to Start-Process "https://microsoft.github.io/power-cat-skills/PowerCAT-Overflow.html" and tell the user the two exact file paths to upload manually.
Write a short chat message (≤150 words) containing:
solution.topRisks (one line each, with the flow name when present)..findings.json file you wrote.sources.md.End with: "Handing over — explore the solution in the open viewer tab."
actions / triggers keys.solution.findings.schema.json.flows keys must match the rule: ZIP filename minus the trailing -<GUID>.json.Take microsoft/powercat-overflow from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.