Skip to content

Rename FinOps multitool to FinOps Explorer - #2368

Draft
Zac Larsen (z-larsen) wants to merge 180 commits into
microsoft:devfrom
z-larsen:feature/finops-explorer-rename
Draft

Zac Larsen (z-larsen) wants to merge 180 commits into
microsoft:devfrom
z-larsen:feature/finops-explorer-rename

Conversation

@z-larsen

@z-larsen Zac Larsen (z-larsen) commented Oct 22, 2026 •

Copy link
Copy Markdown

🛠️ Description

Stacked on #2155.

#2155's branch lives in my fork, so this diff also shows its commits. To see only the rename, use this comparison:
z-larsen/finops-toolkit@feature/finops-multitool...feature/finops-explorer-rename

This branch also merges the current #2155 head (a4457936), which has the latest data-correctness fixes and dev through the v15 prep, so the stack stays in sync and doesn't conflict with dev. The conflicts were in docs and skill text. I kept the #2155 wording and applied the new names.

The ms.date workflow doesn't run for fork PRs, so I set ms.date to 10/29/2026 on the six docs-mslearn articles this PR changes. I'll refresh it if this merges on a later day.

What changed

  • New public command Start-FinOpsExplorer. Start-FinOpsMultitool stays as a thin wrapper that forwards every parameter to it.
  • The product name in the Learn docs, TOC, changelog entry, toolkit overview, GitHub Pages docs, and the TUI's HTML report and summary text.
  • The default report folder is now FinOpsToolkit/Explorer/Reports under local application data. Reports already in the old folder aren't moved.
  • The finops-multitool agent skill is now finops-explorer, in the skills folder and the plugin. The other skills point to the new name.
  • Tests for legacy forwarding, parameter parity, and the Windows PowerShell 5.1 guard.

Agent skill fixes

I checked the skills against the Agent Skills spec, the scan code, and Microsoft Learn. Fixed:

  • The idle VM and storage tier examples used P14D and P30D intervals, which these metrics don't offer. They now use az rest with interval=FULL, as the scans do.
  • The forecast example sends date-times. The reservation utilization example uses the right parameters per scope (billing profiles take startDate and endDate).
  • The legacy resources query flagged every Standard_LRS resource. It now matches the scan, and Basic public IPs and load balancers are described as retired.
  • Per-deployment Azure OpenAI tokens come from platform metrics, because exporting to Log Analytics flattens the deployment dimension.
  • The tag policy table no longer lists an Audit variant that doesn't exist.
  • Removed allowed-tools: az pwsh, which doesn't name tools in the documented syntax.
  • Noted the az graph extension and the PowerShell 7 prerequisite.

Left alone

  • File names, doc URLs, and the /multitool site route, so existing links keep working.
  • Internal names: Invoke-FinOpsMultitool, the FinOpsMultitool module folder and its Parquet cache path, and CI job names.
  • The feedback survey IDs.

Questions

  • Start-FinOpsMultitool hasn't shipped in a toolkit release, so the wrapper only protects people on preview builds. I can drop it and its docs section if you'd rather not carry it.
  • The new command's help has no .LINK. The aka.ms/ftk/Start-FinOpsExplorer short link would need to exist first.

📋 Checklist

🔬 How did you test this change?

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

Local, Pester 6.0.0, on this branch after merging the current #2155 head: Lint 7,669 passed. Unit 3,781 passed, 8 skipped, 2 failed. The two failures are Resource-backed usage allocation tests in MultitoolSafety that need the Az.OperationalInsights module, which isn't installed on my machine. They pass with that command stubbed. MultitoolPackage integration 3/3.

📦 Deploy to test?

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

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

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

📑 Did you update docs/changelog.md?

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

📖 Did you update documentation?

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

Zac Larsen added 30 commits May 19, 2026 14:08
… GUI

Adds the Azure FinOps Multitool as a new PowerShell cmdlet in the FinOps toolkit. The Multitool is a WPF-based GUI that scans an Azure tenant for cost optimization, governance, and FinOps insights including cost trends, orphaned resources, idle VMs, tag hygiene, reservation/savings plan utilization, AHB opportunities, budgets, anomaly alerts, and policy compliance.

- Public/Start-FinOpsMultitool.ps1: thin launcher cmdlet with comment-based help

- Private/FinOpsMultitool/: full implementation (24 scanner modules, WPF GUI, Power BI template)

- Tests/Unit/Start-FinOpsMultitool.Tests.ps1: Pester unit tests

Windows-only (requires WPF support).
…info

- Add contract-aware cost access warning banner (EA/MCA/CSP) on Overview tab
- Add contract-specific billing tab messages when billing access unavailable
- Add MG hierarchy unavailable info node in tree view with role guidance
- Fix tag cost queries: use TagKey grouping type (not Tag/Dimension)
- Add batched TagKey+TagValue query attempt with per-tag fallback
- Clear skipSubs between batched and per-tag strategies
- Add throttle pacing (2s every 2 queries) to avoid 429s
- Add EA/MCA cost access detection in Get-CostData
- Add runspace pool for API call parallelization
Add 11 FinOps-adjacent agent skills that route through the finops-multitool MCP server: power-bi-finops, cost-allocation, azure-policy-governance, unit-economics, finops-reporting, azure-workbooks-finops, forecasting-budgeting, anomaly-investigation, focus-data-quality, sustainability-carbon, and rate-optimization-portfolio. Add a skill-ecosystem hub table to the finops-multitool skill and include the MCP server, tests, and mcp.json config.
…istory throttle fix, Power BI template

Rotate 'Crunching numbers/Fetching numbers/Organizing costs' during 429 backoff in REST and Resource Graph retries. Budget History reuses Cost Trend per-sub monthly data to avoid redundant throttled Cost Management queries. Includes accumulated multitool module updates and the New-PowerBITemplate generator.
…ce modules

Adds three new scan modules and wires them into the TUI, MCP server, and module loader:

- Get-CarbonMetrics (Sustainability): cloud carbon emissions, MoM change, 12-month trend

- Get-UnitEconomics (Cost Analysis): cost per vCPU, per VM, and per GB stored

- Get-LegacyResources (Optimization): legacy/retiring SKUs needing modernization

Documents the new scans, MCP tools, and FinOps KPI usage examples in the README.
Zac Larsen added 6 commits October 14, 2026 12:12
# Conflicts:
#	docs-mslearn/toolkit/changelog.md
- Linux lookups: take only the first PATH match for id, stat, dotnet, chmod and mkdir. /bin links to /usr/bin there, so each program was listed twice and the call that used the result failed with "The term '/usr/bin/id /bin/id' is not recognized".
- Tests: add a guard that scans the module for unrestricted application lookups, and make the Get-Command fixtures return two matches unless one is requested.
Updates the changelog entry, toolkit overview, GitHub Pages docs, and the TUI's report and summary text. Adds a Windows PowerShell 5.1 guard test for Start-FinOpsExplorer and restores the wrapper's trailing newline.
Renames the skill folder and its plugin link, then updates the name,
description, and every reference in the other skills and the docs.

Also fixes problems found while checking the skills against the Agent
Skills spec, the scan code, and Microsoft Learn:

- The idle VM and storage tier examples used P14D and P30D intervals.
  A metric accepts only the time grains in its metric definition, so
  those return an error, and az monitor metrics list rejects FULL. The
  examples now use az rest with interval=FULL, like the scans do.
- The forecast example shows the body it needs, a Custom timeframe with
  date-times. The reservation utilization example shows the
  reservationSummaries call, with startDate and endDate for billing
  profile scopes.
- The legacy resources query flagged every Standard_LRS resource. It now
  runs the same checks as the scan, and Basic public IPs and load
  balancers are described as retired (September 30, 2025).
- The Azure OpenAI token queries now use platform metrics for
  per-deployment counts, because exporting to Log Analytics flattens
  dimensions, and set --top because filtered queries return 10 series
  by default.
- The tag policy table no longer lists an Audit variant that doesn't
  exist. Deny-only built-ins get a DoNotEnforce assignment first.
- Removes allowed-tools: az pwsh. az and pwsh aren't tool names in the
  documented syntax of the clients checked.
- Notes that az graph query uses the resource-graph extension, adds the
  PowerShell 7 requirement, points to the bundled Learn doc paths, offers
  az bicep build when no Bicep MCP server is available, and fixes a
  table row that broke on literal pipes.
Reports now default to FinOpsToolkit/Explorer/Reports under the user's
local application data, not FinOpsToolkit/Multitool/Reports. Reports
already in the old folder aren't moved.
Zac Larsen and others added 6 commits October 22, 2026 11:25
Reservation utilization at billing profile scope now passes startDate and
endDate. The Consumption API documents $filter as not applicable to
billing profiles, so every other scope keeps $filter. A unit test covers
both request shapes, and fails against the old query.

The Basic public IP and Basic Load Balancer findings, their header
comments, and the sample output in the README now say these SKUs retired in
September 2025 instead of that they are retiring.
Brings in the billing profile query and retirement wording fixes from the
parent PR (microsoft#2155) so this branch stays stacked on top of it.
The overview and the Start-FinOpsExplorer page said FinOps Explorer also
includes a separate Desktop app. That app isn't part of the toolkit, so
both pages now describe only the TUI.
Preserve Power BI test triggers and multitool workflow permissions.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Resolves the conflict in .github/workflows/dev.yml by keeping both changes:
the Power BI trigger paths from dev and the permissions block from this
branch.
Brings in the latest dev through microsoft#2155 and keeps the newer ms.date
(10/23/2026) in the changelog.
@flanakin Michael Flanakin (flanakin) added this to the v15 milestone Oct 26, 2026
Correct recommendation identity, pagination and scope handling; preserve incomplete and unavailable results. Fix Hub JSON and AI classification, decimal monetary rounding, shared allocation and report guidance with related regression coverage.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Brings in the data-correctness fixes pushed to microsoft#2155 (017d781 and the
merge that preserves its history). The one conflict, in the agent skill,
keeps the new scan-count wording and the renamed Start-FinOpsExplorer
command.
Correct billing ownership, allocation weights, capacity completeness, resource identities, orphan cost aggregation, and effective policy rollup. Preserve explicit data-source routing and documented unsupported paths.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@flanakin Michael Flanakin (flanakin) modified the milestones: v15, v16 Oct 28, 2026
Resolves the two conflicts in docs-mslearn/toolkit:
- changelog.md: keeps the FinOps multitool entry under Unreleased. Dev's v15
  release prep moved everything else out of Unreleased, so the entry stays
  out of the v15 section. Takes dev's ms.date (10/28/2026).
- finops-toolkit-overview.md: takes dev's ms.date (10/28/2026). The multitool
  bullet and dev's new bullets are both kept.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

🤖 [AI] PR review (rename-only diff vs #2155 branch)

The rename is consistent and the wrapper has forwarding, parameter-parity, and PS 5.1 guard tests. One item:

  • ⚠️ Should fix: ms.date is 10/21/2026 in the changed docs-mslearn files. The ms.date workflow doesn't run for fork PRs, so it won't be bumped automatically. Per repo convention, set it to the merge date (MM/DD/YYYY) for every docs-mslearn file whose body changed.

Zac Larsen added 2 commits October 29, 2026 09:21
Brings in the current microsoft#2155 head (a445793: financial attribution fixes plus
dev through the v15 prep). Five conflicts, all docs and skill text. Each takes
the microsoft#2155 wording and keeps the FinOps Explorer names:
- changelog.md: keeps the FinOps Explorer entry under Unreleased. Dev's v15
  prep moved the rest of Unreleased into v15.
- finops-toolkit-overview.md, finops-multitool-commands.md and
  start-finopsmultitool.md: ms.date takes the microsoft#2155 value. The next commit
  sets it to today's date.
- finops-multitool-commands.md, start-finopsmultitool.md and
  cost-data-source/SKILL.md: the Kusto text follows microsoft#2155 (FINOPS_HUB_KUSTO_URI
  only, no automatic discovery), with the renamed product, command and skill
  names.
The ms.date workflow doesn't run for fork PRs, so the six docs-mslearn
articles whose body changed in this PR still carried older dates (10/21 to
10/28). Sets them to today's date, as the repo convention in AGENTS.md
requires. The date needs another refresh if this merges on a later day.
@z-larsen

Copy link
Copy Markdown
Author

Thanks for the review. I set ms.date to 10/29/2026 on the six docs-mslearn articles whose body this PR changes (a84d3d9). I used today's date because the merge date isn't known yet, and I'll refresh it when I rebase onto dev after #2155 lands.

I also merged the current #2155 head (a445793), so the branch no longer conflicts with dev. Lint, unit, and package tests pass locally. Two allocation tests need Az.OperationalInsights, which I don't have installed, and they pass with it stubbed.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Needs: Review 👀 PR that is ready to be reviewed

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants