diff --git a/docs-mslearn/TOC.yml b/docs-mslearn/TOC.yml index 7eaf13eee..7c7fd5f30 100644 --- a/docs-mslearn/TOC.yml +++ b/docs-mslearn/TOC.yml @@ -216,8 +216,8 @@ href: toolkit/optimization-engine/troubleshooting.md - name: Reference href: toolkit/optimization-engine/reference.md - - name: Open data - href: toolkit/open-data.md + - name: Agent plugins + href: toolkit/agent-plugin/finops-toolkit-agent-plugin-overview.md - name: PowerShell items: - name: All commands @@ -282,6 +282,8 @@ href: toolkit/bicep-registry/modules.md - name: Scheduled actions href: toolkit/bicep-registry/scheduled-actions.md + - name: Open data + href: toolkit/open-data.md - name: Data Lake Storage connectivity href: toolkit/data-lake-storage-connectivity.md - name: Help + support diff --git a/docs-mslearn/toolkit/agent-plugin/finops-toolkit-agent-plugin-overview.md b/docs-mslearn/toolkit/agent-plugin/finops-toolkit-agent-plugin-overview.md new file mode 100644 index 000000000..0bbf4be5f --- /dev/null +++ b/docs-mslearn/toolkit/agent-plugin/finops-toolkit-agent-plugin-overview.md @@ -0,0 +1,86 @@ +--- +title: FinOps toolkit agent plugin overview +description: The FinOps toolkit agent plugin brings AI-powered cloud financial management to Claude Code and GitHub Copilot CLI. +author: MSBrett +ms.author: brettwil +ms.date: 10/14/2026 +ms.topic: concept-article +ms.service: finops +ms.subservice: finops-toolkit +ms.reviewer: msbrett +#customer intent: As a FinOps practitioner, I need to learn about the FinOps toolkit agent plugin. +--- + +# FinOps toolkit agent plugin + +The FinOps toolkit agent plugin brings AI-powered cloud financial management to your coding agent. It works with both [Claude Code](https://claude.com/claude-code) and [GitHub Copilot CLI](https://docs.github.com/copilot/how-tos/set-up/install-copilot-cli), pairing role-specific agents, ready-to-run commands, and a FinOps hubs query skill with a read-only [Azure MCP server](https://github.com/Azure/azure-mcp) so you can analyze cost data, review recommendations, and manage FinOps hubs without leaving your terminal. + +## Installation + +Install the plugin from the FinOps toolkit repository: + +```bash +# Claude Code +claude plugin add microsoft/finops-toolkit + +# GitHub Copilot CLI +copilot plugin install microsoft/finops-toolkit +``` + +The plugin registers an Azure MCP server scoped to the Kusto namespace in read-only mode, so it can query FinOps hubs data without being able to modify your environment. + +## What's included + +### Agents + +| Agent | Description | +| ------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Chief Financial Officer** | Executive-level guidance across financial strategy, capital allocation, risk management, budgeting, forecasting, and cost optimization. | +| **FinOps practitioner** | Domain expertise on FinOps principles, cost allocation, showback/chargeback models, and the FinOps Framework maturity model. | +| **FinOps hubs database query** | Queries cost data, resource metadata, pricing, regional data, and service mappings from a FinOps hub's Data Explorer database. | +| **FinOps hubs agent** | Deploys, upgrades, configures, and troubleshoots FinOps hubs, including Cost Management exports and hub architecture questions. | +| **Azure capacity manager** | Azure capacity evidence for FinOps work: quota analysis, capacity reservation groups, SKU availability, region and zone access, and coordinating capacity guarantees with pricing commitments. | + +### Commands + +| Command | Description | +| ----------------------- | -------------------------------------------------------------------------------------------------------------- | +| `/ftk-hubs-connect` | Discover FinOps hub instances via Azure Resource Graph, connect to a cluster, and save environment settings. | +| `/ftk-hubs-healthCheck` | Check a deployed hub's version against the latest stable and dev releases and validate data freshness. | +| `/ftk-mom-report` | Autonomous month-over-month cost analysis with anomaly detection, forecasting, and actionable recommendations. | +| `/ftk-ytd-report` | Comprehensive fiscal year-to-date cost analysis with a forecast through your organization's fiscal year end. | + +### Skill and query catalog + +The **finops-toolkit** skill triggers on FinOps hubs, KQL, and Azure Data Explorer topics and provides task routing, a query catalog, and schema guidance for working with a FinOps hub's `Costs()`, `Prices()`, `Recommendations()`, and `Transactions()` functions. + +## Required permissions + +- [Azure CLI](/cli/azure/install-azure-cli) authenticated (`az login`). +- Azure RBAC permissions for the Cost Management APIs you want to query or manage. +- For FinOps hubs queries: Database Viewer access to the hub's Azure Data Explorer cluster. + +## Give feedback + +Let us know how we're doing with a quick review. We use these reviews to improve and expand FinOps tools and resources. + + +> [!div class="nextstepaction"] +> [Give feedback](https://portal.azure.com/#view/HubsExtension/InProductFeedbackBlade/extensionName/FinOpsToolkit/cesQuestion/How%20easy%20or%20hard%20is%20it%20to%20use%20the%20FinOps%20toolkit%20agent%20plugin%3F/cvaQuestion/How%20valuable%20is%20the%20FinOps%20toolkit%20agent%20plugin%3F/surveyId/FTK/bladeName/AgentPlugin/featureName/Overview) + + +If you're looking for something specific, vote for an existing or create a new idea. Share ideas with others to get more votes. We focus on ideas with the most votes. + + +> [!div class="nextstepaction"] +> [Vote on or suggest ideas](https://github.com/microsoft/finops-toolkit/issues?q=is%3Aissue%20is%3Aopen%20sort%3Areactions-%2B1-desc) + + +
+ +## Related content + +- [FinOps hubs](../hubs/finops-hubs-overview.md) +- [FinOps hubs data model](../hubs/data-model.md) + +
diff --git a/docs-mslearn/toolkit/changelog.md b/docs-mslearn/toolkit/changelog.md index 45cea194f..1bece4fe5 100644 --- a/docs-mslearn/toolkit/changelog.md +++ b/docs-mslearn/toolkit/changelog.md @@ -25,93 +25,24 @@ This article summarizes the features and enhancements in each release of the Fin The following section lists features and enhancements that are currently in development. -### [FinOps hubs](hubs/finops-hubs-overview.md) - -- **Added** - - Added VNet and private network modes, including opt-in NAT Gateway support for private mode; NAT Gateway incurs additional cost when enabled ([#2163](https://github.com/microsoft/finops-toolkit/pull/2163)). -- **Changed** - - Clarified that the FinOps toolkit exclusively manages the FinOps hub virtual network and documented customer-managed private endpoints as the preferred private-access topology, with virtual network peering as a secondary option ([#2156](https://github.com/microsoft/finops-toolkit/issues/2156)). - - Replaced redundant `tolower()` comparisons in hub KQL with case-insensitive operators (`has`, `=~`, `!~`) so the engine can use the term index instead of scanning every row ([#2213](https://github.com/microsoft/finops-toolkit/issues/2213)). - - Replaced whole-term `contains` matches with `has` across hub KQL and the query catalog (resource ID paths, licensing phrases, SKU description terms) and added a per-row operator-equivalence regression harness with unit test coverage ([#2220](https://github.com/microsoft/finops-toolkit/pull/2220)). -- **Fixed** - - Fixed ADF schedule trigger deployment failures (`InvalidWorkflowTriggerRecurrence`) in regions not covered by the region-to-time-zone map (for example, Sweden Central), where the trigger's `startTime` was missing the required `Z` suffix for the `UTC` fallback time zone ([#2157](https://github.com/microsoft/finops-toolkit/issues/2157), [#2291](https://github.com/microsoft/finops-toolkit/pull/2291)). - - Fixed managed exports failing with an `Unauthorized` error because the Role Based Access Control Administrator role was never assigned to the Data Factory identity. Roles requested by a hub app are now assigned on the publisher storage account even when the app doesn't create the storage account itself ([#2253](https://github.com/microsoft/finops-toolkit/issues/2253)). - - Fixed private-network deployments that Azure Policy blocked when `defaultOutboundAccess` was omitted. Private mode subnets now set it to `false`, while an Azure Files private endpoint supports deployment-script storage and the NAT Gateway provides required container egress ([#2258](https://github.com/microsoft/finops-toolkit/issues/2258), [#2259](https://github.com/microsoft/finops-toolkit/pull/2259)). - - Fixed the `ContractedCost` recompute guard to compare with a null-safe tolerance instead of exact float equality, eliminating millions of no-op rewrites that polluted the `x_SourceValues` audit trail while preserving the null-cost backfill and no longer overwriting an existing cost when the unit price is missing ([#2216](https://github.com/microsoft/finops-toolkit/issues/2216)). - - Fixed the SQL VMs without Azure Hybrid Benefit recommendation query to join on the SQL VM `virtualMachineResourceId` instead of a case-sensitive VM name match that skipped VMs with uppercase names and dropped duplicate names, and made all Azure Resource Graph join kinds explicit so no query relies on the `innerunique` default ([#2225](https://github.com/microsoft/finops-toolkit/pull/2225)). - - Switched dimension enrichment in the v1_0/v1_2 ingestion transforms (`PricingUnits`, `Regions`, `ResourceTypes`, `Services`) from `join` to the broadcast-optimized `lookup` operator and deduplicated the `Services` mapping per resource type to prevent cost row fan-out ([#2225](https://github.com/microsoft/finops-toolkit/pull/2225)). - - Fixed FinOps hub dashboard "Governance, policy, and risk" and "FinOps tools and services" links that landed on a 404 page by linking directly to the Microsoft Learn pages ([#2319](https://github.com/microsoft/finops-toolkit/issues/2319)). - - Fixed the v1_0 and v1_2 price transforms setting `x_CommitmentDiscountSpendEligibility` from reservation meters and `x_CommitmentDiscountUsageEligibility` from savings plan meters, the opposite of the FOCUS `CommitmentDiscountCategory` value the same transform assigns. The spend column now reports savings plan pricing and the usage column reports reservation pricing. Prices ingested after upgrading carry the corrected values; rows ingested earlier keep the old values until they are reingested ([#2279](https://github.com/microsoft/finops-toolkit/issues/2279)). - -### [FinOps workbooks](workbooks/finops-workbooks-overview.md) - -- **Fixed** - - Fixed the savings plan workbook summary and details queries silently dropping all but one recommendation per subscription due to an implicit `innerunique` join ([#2225](https://github.com/microsoft/finops-toolkit/pull/2225)). - - Fixed the AHB workbook "VM Latest Change Last 7 days" tile, which joined the `resourcechanges` record id against the resource id and always returned no rows, and the SQL VM queries, which never matched VMs with uppercase names ([#2225](https://github.com/microsoft/finops-toolkit/pull/2225)). - - Changed the savings plan workbook subscription name joins to `leftouter` so a recommendation is still shown when its subscription is missing from `resourcecontainers` ([#2225](https://github.com/microsoft/finops-toolkit/pull/2225)). - -### [FinOps alerts](alerts/finops-alerts-overview.md) - -- **Fixed** - - Made the idle application gateway and idle public IP query join kinds explicit so they no longer rely on the `innerunique` default ([#2225](https://github.com/microsoft/finops-toolkit/pull/2225)). - -### [Power BI reports](power-bi/reports.md) - -- **Changed** - - Switched the InstanceSizeFlexibility table in the storage and KQL shared datasets from the retired `ccmstorageprod` AutofitComboMeterData.csv to the FinOps toolkit [Instance size flexibility](open-data.md#instance-size-flexibility) open data file, joined to reservation recommendations on the unique ARM SKU name ([#2090](https://github.com/microsoft/finops-toolkit/issues/2090)). - -### [Optimization Engine](optimization-engine/overview.md) - -- **Added** - - Added a comprehensive [Azure Optimization Engine reference](optimization-engine/reference.md) for runbooks, schedules, variables, Log Analytics tables, and SQL Database tables ([#1271](https://github.com/microsoft/finops-toolkit/issues/1271)). -- **Changed** - - Switched the reservations and benefits workbooks from the retired `ccmstorageprod` isfratioblob.csv to the FinOps toolkit [Instance size flexibility](open-data.md#instance-size-flexibility) open data file ([#2090](https://github.com/microsoft/finops-toolkit/issues/2090)). -- **Fixed** - - Fixed a regression in the `AzureOptimizationConsumptionV1_CL` schema that was breaking the Reservations Usage workbook ([#2301](https://github.com/microsoft/finops-toolkit/issues/2301)). - - Fixed reservations disappearing from the reservation workbooks when their SKU is no longer sold. The instance size flexibility joins required a match, so an active reservation on a retired size was dropped from the report entirely rather than shown with its utilization. Unmatched SKUs now fall back to their own name as the flexibility group and a ratio of 1. The fallback applies to the reserved resource types that have instance size flexibility: virtual machines, Redis Cache, and dedicated hosts ([#2300](https://github.com/microsoft/finops-toolkit/issues/2300)). - -### [PowerShell module](powershell/powershell-commands.md) - -- **Fixed** - - Fixed [Start-FinOpsCostExport](powershell/cost/start-finopscostexport.md) exporting the wrong period for anyone running in a positive UTC offset. `-StartDate` and `-EndDate` are now treated as UTC calendar dates instead of being time zone converted, so the days you request are the days that get exported. Previously, local midnight converted to the previous UTC day, which moved the period back a day and made `-Backfill` run one extra month ([#2255](https://github.com/microsoft/finops-toolkit/issues/2255)). - -### [Open data](open-data.md) updates - -**[Instance size flexibility](open-data.md#instance-size-flexibility)** - -- **Added** - - Added a new [Instance size flexibility](open-data.md#instance-size-flexibility) dataset that maps each ARM SKU to its instance size flexibility group and ratio, sourced from the Azure Reservations Catalogs API. It replaces the deprecated ISF ratio files hosted on `ccmstorageprod.blob.core.windows.net` ([#2090](https://github.com/microsoft/finops-toolkit/issues/2090)). - - Ratios use the same scale as the retired isfratioblob.csv: each flexibility group is normalized so its smallest SKU is `1`, matching the retired file for 1,223 of the 1,291 rows the two share. The Catalogs API publishes them unnormalized, and the Optimization Engine converts quantities into units of a group's smallest SKU ([#2309](https://github.com/microsoft/finops-toolkit/issues/2309)). - - Covers every physical Azure region instead of a fixed region list, so SKUs that launch in only a handful of regions are included. - - Refreshes weekly from the live catalog, so newly released SKUs appear and retired SKUs age out without anyone republishing the file. - -**[Commitment discount eligibility](open-data.md#commitment-discount-eligibility)** - -- **Fixed** - - Fixed the commitment discount eligibility dataset refresh so it is reproducible and complete; retired meters now age out and previously missed meters are included ([#2164](https://github.com/microsoft/finops-toolkit/pull/2164)). - - Fixed the weekly commitment discount eligibility refresh timing out before it could publish, which left the dataset unchanged since it first shipped in v14. The refresh now walks each price type directly instead of sharding by service family, and verifies completeness by comparing two independent traversals before writing ([#2251](https://github.com/microsoft/finops-toolkit/pull/2251)). - - Fixed `x_CommitmentDiscountSpendEligibility` and `x_CommitmentDiscountUsageEligibility` carrying each other's values. FOCUS classifies a reservation as a usage commitment (committed to a quantity of usage) and a savings plan as a spend commitment (committed to an amount of money), so the spend column now reports savings plan pricing and the usage column reports reservation pricing. The dataset shipped with the two reversed from v14 ([#2279](https://github.com/microsoft/finops-toolkit/issues/2279)). - -->
## v15 -_Released June 2026_ +_Released October 2026_ ### [Implementing FinOps guide](../implementing-finops-guide.md) v15 - **Added** - Added a [FinOps toolkit ecosystem page](https://microsoft.github.io/finops-toolkit/ecosystem) listing independent tools and organizations that build on or support the FinOps toolkit. - - **Changed** - Aligned FinOps Framework capability names and links across guidance to current FinOps Framework terminology, including Usage optimization and Governance, policy, and risk ([#2170](https://github.com/microsoft/finops-toolkit/pull/2170)). - - **Fixed** - - Corrected stale and incorrect descriptions for `BilledCost`, `EffectiveCost`, `BillingCurrency`, `BillingProfileId`, `BillingProfileName`, `CommitmentDiscountQuantity`, `ListUnitPrice`, `PricingQuantity`, `PricingUnitDescription`, and `TotalSavingsRunningTotal` in the [data dictionary](help/data-dictionary.md) to align with FOCUS 1.2 ([#2112](https://github.com/microsoft/finops-toolkit/pull/2112)). + - Corrected stale and incorrect descriptions for `BilledCost`, `EffectiveCost`, `BillingCurrency`, `BillingProfileId`, `BillingProfileName`, `CommitmentDiscountQuantity`, `ListUnitPrice`, `PricingQuantity`, `PricingUnitDescription`, and `TotalSavingsRunningTotal` in the [data dictionary](help/data-dictionary.md) to align with FOCUS 1.2. -### FinOps toolkit agent plugins v15 +### [FinOps toolkit agent plugins](agent-plugin/finops-toolkit-agent-plugin-overview.md) v15 - **Added** - Added a shared FinOps Toolkit plugin for Claude Code and GitHub Copilot CLI with 5 agents (CFO, FinOps practitioner, database query, hubs agent, and Azure capacity manager), 4 commands (`/ftk/hubs-connect`, `/ftk/hubs-health-check`, `/ftk/mom-report`, and `/ftk/ytd-report`), a FinOps hubs KQL skill, and a read-only Azure MCP server. @@ -122,47 +53,84 @@ _Released June 2026_ - **Added** - Added a [Run hubs locally](hubs/run-hubs-locally.md) guide to stand up a FinOps hub in a local Kusto emulator container and ingest cost data using the same KQL, transforms, and open data as a deployed hub. - Added a build-generated `finops-hub-local-opendata.kql` release artifact that loads the open data reference tables from CSV, so the local hub guide stays in sync with published open data instead of hard-coding schemas. + - Added VNet and private network modes, including opt-in NAT Gateway support for private mode; NAT Gateway incurs additional cost when enabled ([#2163](https://github.com/microsoft/finops-toolkit/pull/2163)). - **Changed** - Added a callout to the `config_RunBackfillJob` backfill option clarifying that it isn't supported on Microsoft Customer Agreement (MCA) billing accounts or billing profiles ([#2113](https://github.com/microsoft/finops-toolkit/issues/2113)). + - Clarified that the FinOps toolkit exclusively manages the FinOps hub virtual network and documented customer-managed private endpoints as the preferred private-access topology, with virtual network peering as a secondary option ([#2156](https://github.com/microsoft/finops-toolkit/issues/2156)). + - Replaced redundant `tolower()` comparisons in hub KQL with case-insensitive operators (`has`, `=~`, `!~`) so the engine can use the term index instead of scanning every row ([#2213](https://github.com/microsoft/finops-toolkit/issues/2213)). + - Replaced whole-term `contains` matches with `has` across hub KQL and the query catalog (resource ID paths, licensing phrases, SKU description terms) and added a per-row operator-equivalence regression harness with unit test coverage ([#2220](https://github.com/microsoft/finops-toolkit/pull/2220)). + - Switched dimension enrichment in the v1_0/v1_2 ingestion transforms (`PricingUnits`, `Regions`, `ResourceTypes`, `Services`) from `join` to the broadcast-optimized `lookup` operator and deduplicated the `Services` mapping per resource type to prevent cost row fan-out ([#2225](https://github.com/microsoft/finops-toolkit/pull/2225)). - **Fixed** + - Fixed FinOps hub dashboard "Governance, policy, and risk" and "FinOps tools and services" links that landed on a 404 page by linking directly to the Microsoft Learn pages ([#2319](https://github.com/microsoft/finops-toolkit/issues/2319)). + - Fixed ADF schedule trigger deployment failures (`InvalidWorkflowTriggerRecurrence`) in regions not covered by the region-to-time-zone map (for example, Sweden Central), where the trigger's `startTime` was missing the required `Z` suffix for the `UTC` fallback time zone ([#2157](https://github.com/microsoft/finops-toolkit/issues/2157), [#2291](https://github.com/microsoft/finops-toolkit/pull/2291)). - Fixed Data Factory ingestion memory pressure during emptiness filtering. - - Replaced `isnotempty(strcat(x_SkuMeterId, x_SkuOfferId))` with separate `isnotempty()` checks in FinOps hub ingestion scripts to avoid temporary string allocation. - - Hardened the reservation price backfill to select the highest on-demand price (`max()` instead of `min()`) when duplicate price rows collapse under a single reservation price lookup key, preventing understated commitment discount savings ([#2189](https://github.com/microsoft/finops-toolkit/pull/2189)). + - Hardened the reservation price backfill to select the highest on-demand price (`max()` instead of `min()`) when duplicate price rows collapse under a single reservation price lookup key, preventing understated commitment discount savings ([#2176](https://github.com/microsoft/finops-toolkit/issues/2176)). + - Fixed the `ContractedCost` recompute guard to compare with a null-safe tolerance instead of exact float equality, eliminating millions of no-op rewrites that polluted the `x_SourceValues` audit trail while preserving the null-cost backfill and no longer overwriting an existing cost when the unit price is missing ([#2216](https://github.com/microsoft/finops-toolkit/issues/2216)). + - Fixed the SQL VMs without Azure Hybrid Benefit recommendation query to join on the SQL VM `virtualMachineResourceId` instead of a case-sensitive VM name match that skipped VMs with uppercase names and dropped duplicate names, and made all Azure Resource Graph join kinds explicit so no query relies on the `innerunique` default ([#2225](https://github.com/microsoft/finops-toolkit/pull/2225)). + - Fixed managed exports failing with an `Unauthorized` error because the Role Based Access Control Administrator role was never assigned to the Data Factory identity. Roles requested by a hub app are now assigned on the publisher storage account even when the app doesn't create the storage account itself ([#2253](https://github.com/microsoft/finops-toolkit/issues/2253)). + - Fixed private-network deployments that Azure Policy blocked when `defaultOutboundAccess` was omitted. Private mode subnets now set it to `false`, while an Azure Files private endpoint supports deployment-script storage and the NAT Gateway provides required container egress ([#2258](https://github.com/microsoft/finops-toolkit/issues/2258), [#2259](https://github.com/microsoft/finops-toolkit/pull/2259)). + - Fixed the v1_0 and v1_2 price transforms setting `x_CommitmentDiscountSpendEligibility` from reservation meters and `x_CommitmentDiscountUsageEligibility` from savings plan meters, the opposite of the FOCUS `CommitmentDiscountCategory` value the same transform assigns. The spend column now reports savings plan pricing and the usage column reports reservation pricing. Prices ingested after upgrading carry the corrected values; rows ingested earlier keep the old values until they are reingested ([#2279](https://github.com/microsoft/finops-toolkit/issues/2279)). ### [Power BI reports](power-bi/reports.md) v15 - **Changed** - Updated report labels and documentation to use current FinOps Framework capability names, including Usage optimization and Governance, policy, and risk ([#2170](https://github.com/microsoft/finops-toolkit/pull/2170)). + - Switched the InstanceSizeFlexibility table in the storage and KQL shared datasets from the retired `ccmstorageprod` AutofitComboMeterData.csv to the FinOps toolkit [Instance size flexibility](open-data.md#instance-size-flexibility) open data file, joined to reservation recommendations on the unique ARM SKU name ([#2090](https://github.com/microsoft/finops-toolkit/issues/2090)). - **Fixed** - Fixed Power BI storage report refresh errors caused by ISO 8601 duration `x_SkuTerm` values (like `P3Y`) and empty strings in cost exports ([#2174](https://github.com/microsoft/finops-toolkit/issues/2174)). - - Paginate Azure Resource Graph queries by subscription to mitigate [payload size limit](help/errors.md#response-payload-size-is-and-has-exceeded-the-limit) errors in the [Governance](power-bi/governance.md) and [Workload optimization](power-bi/workload-optimization.md) reports ([#1768](https://github.com/microsoft/finops-toolkit/issues/1768)). Queries still surface a payload size error (rather than silently returning truncated results) if a single batch of subscriptions exceeds the limit; see [Reduce the batch size](help/errors.md#option-1-reduce-the-batch-size) for the mitigation. As part of this change, the `AdvisorRecommendations` and `AdvisorReservationRecommendations` tables now return complete (non-truncated) results per batch, matching every other batched table; previously these two tables silently dropped rows beyond the payload limit instead of erroring. + - Paginated Azure Resource Graph queries by subscription to mitigate [payload size limit](help/errors.md#response-payload-size-is-and-has-exceeded-the-limit) errors in the [Governance](power-bi/governance.md) and [Workload optimization](power-bi/workload-optimization.md) reports ([#1768](https://github.com/microsoft/finops-toolkit/issues/1768)). + - The `AdvisorRecommendations` and `AdvisorReservationRecommendations` tables now return complete results per batch instead of silently dropping rows beyond the payload limit. + - A batch that still exceeds the limit surfaces an error rather than truncating; see [Reduce the batch size](help/errors.md#option-1-reduce-the-batch-size). ### [FinOps workbooks](workbooks/finops-workbooks-overview.md) v15 - **Changed** - Updated workbook labels and documentation to use current FinOps Framework capability names, including Usage optimization and Governance, policy, and risk ([#2170](https://github.com/microsoft/finops-toolkit/pull/2170)). +- **Fixed** + - Changed the savings plan workbook subscription name joins to `leftouter` so a recommendation is still shown when its subscription is missing from `resourcecontainers` ([#2225](https://github.com/microsoft/finops-toolkit/pull/2225)). + - Fixed the savings plan workbook summary and details queries silently dropping all but one recommendation per subscription due to an implicit `innerunique` join ([#2225](https://github.com/microsoft/finops-toolkit/pull/2225)). + - Fixed the AHB workbook "VM Latest Change Last 7 days" tile, which joined the `resourcechanges` record id against the resource id and always returned no rows, and the SQL VM queries, which never matched VMs with uppercase names ([#2225](https://github.com/microsoft/finops-toolkit/pull/2225)). + - Fixed the savings plan workbook subscription name join to use `leftouter` so a recommendation is still shown when its subscription is missing from `resourcecontainers` ([#2225](https://github.com/microsoft/finops-toolkit/pull/2225)). -### [Data dictionary](help/data-dictionary.md) updates +### [FinOps alerts](alerts/finops-alerts-overview.md) v15 - **Fixed** - - Corrected stale and incorrect descriptions for `BilledCost`, `EffectiveCost`, `BillingCurrency`, `BillingProfileId`, `BillingProfileName`, `CommitmentDiscountQuantity`, `ListUnitPrice`, `PricingQuantity`, `PricingUnitDescription`, and `TotalSavingsRunningTotal` to align with FOCUS 1.2 ([#2112](https://github.com/microsoft/finops-toolkit/pull/2112)). + - Made the idle application gateway and idle public IP query join kinds explicit so they no longer rely on the `innerunique` default ([#2225](https://github.com/microsoft/finops-toolkit/pull/2225)). ### [Optimization engine](optimization-engine/overview.md) v15 +- **Added** + - Added a comprehensive [Azure Optimization Engine reference](optimization-engine/reference.md) for runbooks, schedules, variables, Log Analytics tables, and SQL Database tables ([#1271](https://github.com/microsoft/finops-toolkit/issues/1271)). - **Changed** - Migrated Log Analytics ingestion from the Data Collection API (to be deprecated in September 2026) to a Data Collection Rule, Ingestion API-based solution. + - Switched the reservations and benefits workbooks from the retired `ccmstorageprod` isfratioblob.csv to the FinOps toolkit [Instance size flexibility](open-data.md#instance-size-flexibility) open data file ([#2090](https://github.com/microsoft/finops-toolkit/issues/2090)). - **Fixed** + - Fixed reservations disappearing from the reservation workbooks when their SKU is no longer sold. The instance size flexibility joins required a match, so an active reservation on a retired size was dropped from the report entirely rather than shown with its utilization. Unmatched SKUs now fall back to their own name as the flexibility group and a ratio of 1. The fallback applies to the reserved resource types that have instance size flexibility: virtual machines, Redis Cache, and dedicated hosts ([#2300](https://github.com/microsoft/finops-toolkit/issues/2300)). - Removed call to Azure Classic administrators endpoint (deprecated on May 1, 2026) from Azure RBAC assignments exports ([#2142](https://github.com/microsoft/finops-toolkit/issues/2142)). + - Fixed a regression in the `AzureOptimizationConsumptionV1_CL` schema that was breaking the Reservations Usage workbook ([#2301](https://github.com/microsoft/finops-toolkit/issues/2301)). ### [PowerShell module](powershell/powershell-commands.md) v15 - **Added** - Added [Initialize-FinOpsHubLocal](powershell/hubs/initialize-finopshublocal.md) to set up a local FinOps hub in a running Kusto emulator with one command. + - Added [Get-FinOpsCommitmentDiscountEligibility](powershell/data/get-finopscommitmentdiscounteligibility.md) and [Get-FinOpsInstanceSizeFlexibility](powershell/data/get-finopsinstancesizeflexibility.md) to generate the commitment discount eligibility and instance size flexibility open data files ([#2298](https://github.com/microsoft/finops-toolkit/pull/2298)). - **Changed** - Updated PowerShell test compatibility with Pester 6 ([#2204](https://github.com/microsoft/finops-toolkit/pull/2204)). - **Fixed** - Fixed [Get-FinOpsCostExport](powershell/cost/get-finopscostexport.md) `-RunHistory` to return the complete run history ([#2063](https://github.com/microsoft/finops-toolkit/issues/2063)). - Bumped the `Az.Accounts` required-module minimum to 2.17.0 so dependency resolution can't land on a version missing the `Get-AzAccessToken -AsSecureString` parameter that `Invoke-Rest` relies on ([#2185](https://github.com/microsoft/finops-toolkit/issues/2185)). + - Fixed [Start-FinOpsCostExport](powershell/cost/start-finopscostexport.md) exporting the wrong period for anyone running in a positive UTC offset. `-StartDate` and `-EndDate` are now treated as UTC calendar dates instead of being time zone converted, so the days you request are the days that get exported. Previously, local midnight converted to the previous UTC day, which moved the period back a day and made `-Backfill` run one extra month ([#2255](https://github.com/microsoft/finops-toolkit/issues/2255)). + +### [Open data](open-data.md) v15 + +- **Added** + - Added a new [Instance size flexibility](open-data.md#instance-size-flexibility) dataset that maps each ARM SKU to its instance size flexibility group and ratio, sourced from the Azure Reservations Catalogs API. It replaces the deprecated ISF ratio files hosted on `ccmstorageprod.blob.core.windows.net` ([#2090](https://github.com/microsoft/finops-toolkit/issues/2090)). +- **Fixed** + - Fixed the commitment discount eligibility dataset refresh so it is reproducible and complete; retired meters now age out and previously missed meters are included ([#2164](https://github.com/microsoft/finops-toolkit/pull/2164)). + - Fixed the [instance size flexibility](open-data.md#instance-size-flexibility) ratio scale and region coverage, and made regeneration produce the same output on any host. The dataset grew from 1,353 to 1,363 SKUs ([#2308](https://github.com/microsoft/finops-toolkit/pull/2308), [#2331](https://github.com/microsoft/finops-toolkit/pull/2331)). + - Fixed the [commitment discount eligibility](open-data.md#commitment-discount-eligibility) dataset refresh so it's reproducible and complete; retired meters now age out and previously missed meters are included ([#2164](https://github.com/microsoft/finops-toolkit/pull/2164)). + - Fixed the weekly commitment discount eligibility refresh timing out before it could publish, which left the dataset unchanged since it first shipped in v14. The refresh now walks each price type directly instead of sharding by service family, and verifies completeness by comparing two independent traversals before writing ([#2251](https://github.com/microsoft/finops-toolkit/pull/2251)). + - Fixed `x_CommitmentDiscountSpendEligibility` and `x_CommitmentDiscountUsageEligibility` carrying each other's values. FOCUS classifies a reservation as a usage commitment (committed to a quantity of usage) and a savings plan as a spend commitment (committed to an amount of money), so the spend column now reports savings plan pricing and the usage column reports reservation pricing. The dataset shipped with the two reversed from v14 ([#2279](https://github.com/microsoft/finops-toolkit/issues/2279)). > [!div class="nextstepaction"] diff --git a/docs-mslearn/toolkit/finops-toolkit-overview.md b/docs-mslearn/toolkit/finops-toolkit-overview.md index 22f68c7fb..befb94deb 100644 --- a/docs-mslearn/toolkit/finops-toolkit-overview.md +++ b/docs-mslearn/toolkit/finops-toolkit-overview.md @@ -3,7 +3,7 @@ title: FinOps toolkit overview description: Learn how the FinOps toolkit helps you automate and extend the Microsoft Cloud with starter kits, scripts, and advanced solutions to improve FinOps practices. author: flanakin ms.author: micflan -ms.date: 08/05/2026 +ms.date: 10/14/2026 ms.topic: concept-article ms.service: finops ms.subservice: finops-toolkit @@ -31,7 +31,9 @@ The FinOps toolkit is an ever-evolving collection of tools and resources. The fo - [FinOps workbooks](./workbooks/finops-workbooks-overview.md) – Central hub for cost optimization. - [Cost optimization workbook](./workbooks/optimization.md) – Central hub for cost optimization. - [Governance workbook](./workbooks/governance.md) – Central hub for governance. +- [FinOps alerts](./alerts/finops-alerts-overview.md) – Automate cost optimization by managing idle resources. - [Azure Optimization Engine](./optimization-engine/overview.md) – Extensible solution for custom optimization recommendations. +- [Agent plugin](./agent-plugin/finops-toolkit-agent-plugin-overview.md) – AI-powered cloud financial management for Claude Code and GitHub Copilot CLI. - [PowerShell module](./powershell/powershell-commands.md) – Automate and manage FinOps solutions and capabilities. - [Bicep Registry modules](./bicep-registry/modules.md) – Official repository for Bicep modules. - [Open data](open-data.md) – Data available for anyone to access, use, and share without restriction. diff --git a/docs-mslearn/toolkit/help/errors.md b/docs-mslearn/toolkit/help/errors.md index f9adc25eb..04325eb7b 100644 --- a/docs-mslearn/toolkit/help/errors.md +++ b/docs-mslearn/toolkit/help/errors.md @@ -3,7 +3,7 @@ title: Troubleshoot common FinOps toolkit errors description: This article describes common FinOps toolkit errors and provides solutions to help you resolve issues you might encounter. author: flanakin ms.author: micflan -ms.date: 08/13/2026 +ms.date: 10/14/2026 ms.topic: troubleshooting ms.service: finops ms.subservice: finops-toolkit @@ -376,6 +376,26 @@ We are following up with the Azure Data Explorer team to identify the correct re
+## DeploymentScriptACIProvisioningTimeout + +Severity: Major + +FinOps hub deployments use `Microsoft.Resources/deploymentScripts` resources to run PowerShell setup scripts. Each deployment script provisions a temporary Azure Container Instance (ACI) to execute its script. If that container instance doesn't start in time, the deployment script — and the overall deployment — fails with `DeploymentScriptACIProvisioningTimeout`. + +This error isn't caused by the script itself; it means the underlying ACI never finished provisioning. We've seen two causes: + +- **Transient ACI capacity or scheduling delay.** The container instance service is momentarily unable to place the container. This usually resolves on its own. +- **Restrictive tenant security policies (for example, Microsoft SFI) blocking the deployment script's use of a storage account key.** The container gets stuck in a `Waiting to run` or `Creating` state and never progresses. + +**Mitigation**: + +1. **Retry the deployment.** Most instances of this error are transient — simply redeploying resolves it. +2. **If it keeps failing, set the `SecurityControl` tag to `Ignore` on the target resource group before deploying.** Some tenant security policies disable the shared storage account key that deployment scripts rely on; this tag bypasses that restriction for the deployment. + +Report unresolved issues at . + +
+ ## ExportDataNotFound Severity: Critical diff --git a/docs-mslearn/toolkit/hubs/data-model.md b/docs-mslearn/toolkit/hubs/data-model.md index e06a19519..c16ab287e 100644 --- a/docs-mslearn/toolkit/hubs/data-model.md +++ b/docs-mslearn/toolkit/hubs/data-model.md @@ -3,7 +3,7 @@ title: FinOps hubs data model description: Learn about the tables and functions available in FinOps hubs to build your own queries, reports, and dashboards. author: flanakin ms.author: micflan -ms.date: 04/01/2026 +ms.date: 10/14/2026 ms.topic: reference ms.service: finops ms.subservice: finops-toolkit @@ -473,6 +473,12 @@ Examples:
+## InstanceSizeFlexibility table + +The **InstanceSizeFlexibility** table in Power BI and Data Explorer is populated from the [Instance size flexibility open data file](../open-data.md#instance-size-flexibility). This table is used to identify reservation-eligible SKUs that share instance size flexibility with a purchased reservation. + +
+ ## ManagementGroups table The **ManagementGroups** table in Power BI reports that queries Azure management groups from Azure Resource Graph. @@ -533,12 +539,12 @@ parse_resourceid('/subscriptions/###/resourceGroups/foo/providers/Microsoft.Comp ```json { - "ResourceId": "/subscriptions/###/resourceGroups/foo/providers/Microsoft.Compute/virtualMachines/bar", - "ResourceName": "bar", - "SubAccountId": "###", - "x_ResourceGroupName": "foo", - "x_ResourceProvider": "Microsoft.Compute", - "x_ResourceType": "microsoft.compute/virtualmachines" + "ResourceId": "/subscriptions/###/resourceGroups/foo/providers/Microsoft.Compute/virtualMachines/bar", + "ResourceName": "bar", + "SubAccountId": "###", + "x_ResourceGroupName": "foo", + "x_ResourceProvider": "Microsoft.Compute", + "x_ResourceType": "microsoft.compute/virtualmachines" } ``` @@ -549,8 +555,8 @@ parse_resourceid('/subscriptions/###/resourceGroups/foo/providers/Microsoft.Comp The **percent(table: (Count: long))** function in Data Explorer calculates the percentage of each record based on a required Count column. { - let total = todouble(toscalar(t | summarize sum(Count))); - percentOfTotal(t, total) +let total = todouble(toscalar(t | summarize sum(Count))); +percentOfTotal(t, total) }
@@ -575,12 +581,12 @@ Examples: ## plusminus() KQL function -The ****plusminus KQL function in Data Explorer a +/- sign based on the direction of the number. -plusminus(val: string) -{ - let neg = substring(val, 0, 1) == '-'; - iff(neg, val, strcat('+', val)) -} +The **plusminus()** KQL function in Data Explorer returns a +/- sign based on the direction of the number. + +Examples: + +- `plusminus(0.5)` = "+0.5" +- `plusminus(-0.5)` = "-0.5"
diff --git a/docs-mslearn/toolkit/hubs/data-processing.md b/docs-mslearn/toolkit/hubs/data-processing.md index 9c3e1cabb..f941c32ee 100644 --- a/docs-mslearn/toolkit/hubs/data-processing.md +++ b/docs-mslearn/toolkit/hubs/data-processing.md @@ -3,7 +3,7 @@ title: FinOps hubs data processing description: Learn how FinOps hubs process data, including scope setup, data normalization, and optimization, to enhance cost management and analysis. author: flanakin ms.author: micflan -ms.date: 04/01/2026 +ms.date: 10/14/2026 ms.topic: concept-article ms.service: finops ms.subservice: finops-toolkit @@ -183,6 +183,11 @@ Transforms: - `x_CommitmentDiscountPercent` - `x_TotalDiscountPercent` - Added `x_SourceValues` to track data changes during ingestion. +- v15+: + - Select the highest on-demand price when duplicate price rows collapse under a single reservation price lookup key, so commitment discount savings aren't understated. + - Only recompute `ContractedCost` when it differs beyond a null-safe tolerance, avoiding no-op rewrites that polluted the `x_SourceValues` audit trail. + - Enrich dimensions (`PricingUnits`, `Regions`, `ResourceTypes`, `Services`) with `lookup` instead of `join`. + - Deduplicate the `Services` mapping per resource type to prevent cost row fan-out. ### Price data transforms @@ -217,6 +222,8 @@ Transforms: - Renamed `x_SkuMeterName` to `SkuMeter`. - Implemented the following columns when not set by Cost Management: - `CommitmentDiscountUnit` +- v15+: + - Swap `x_CommitmentDiscountSpendEligibility` and `x_CommitmentDiscountUsageEligibility` to match the `CommitmentDiscountCategory` value assigned by the same transform. The spend column now reports savings plan pricing and the usage column reports reservation pricing. Prices ingested before upgrading keep the old values until they're reingested. ### Recommendation data transforms diff --git a/docs-mslearn/toolkit/hubs/upgrade.md b/docs-mslearn/toolkit/hubs/upgrade.md index eb7b112d6..1c7dfa099 100644 --- a/docs-mslearn/toolkit/hubs/upgrade.md +++ b/docs-mslearn/toolkit/hubs/upgrade.md @@ -3,7 +3,7 @@ title: Upgrade your FinOps hubs description: Learn how to upgrade your existing FinOps hub instance to the latest version, including necessary steps and considerations. author: flanakin ms.author: micflan -ms.date: 04/01/2026 +ms.date: 10/14/2026 ms.topic: how-to ms.service: finops ms.subservice: finops-toolkit @@ -162,6 +162,8 @@ Replace the use of deprecated columns and functions: | 0.7 | N/A | `daterange()` | `datestring(datetime, [datetime])` | | 0.7 | N/A | `monthsago()` | `startofmonth(datetime, [offset])` | +As of FinOps hubs v15, `x_CommitmentDiscountSpendEligibility` and `x_CommitmentDiscountUsageEligibility` were fixed to use the correct values. In previous releases, they were accurate, but swapped. `x_CommitmentDiscountSpendEligibility` now represents savings plan eligibility correctly and `x_CommitmentDiscountUsageEligibility` represents reservation eligibility. Before v15, the values were saved to the wrong columns. Prices ingested before upgrading keep the old values. You will need to re-ingest older months to fix these rows. + If using unversioned functions or updating from the `v1_0` schema version, review your code for any explicit use of the `decimal` data type and replace it with `real`. As of FinOps hubs v12 (schema version `v1_2`), all `decimal` data types changed to `real` to improve performance. To learn more about schema versions, see [About schema versions](data-model.md#schema-version). If updating queries to use a newer schema version, use the following table to understand the changes introduced in each schema version for each managed dataset. diff --git a/docs-wiki/Advisory-council.md b/docs-wiki/Advisory-council.md index dbbd5eebc..874f24737 100644 --- a/docs-wiki/Advisory-council.md +++ b/docs-wiki/Advisory-council.md @@ -61,6 +61,7 @@ This currently includes the following people: | Seat | Member | | ------------------------------------ | --------------------- | +| Agent plugin | Brett Wilson | | Azure Data Explorer | Brad Watts | | Azure Optimization Engine | Helder Pinto | | Bicep Registry | Vacant | diff --git a/docs/README.md b/docs/README.md index 82d0674bf..229a28a1c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -18,9 +18,9 @@ Automate and extend the Microsoft Cloud with starter kits, scripts, and advanced ---
-

What's new in April 2026v14

+

What's new in October 2026v15

- April adds recommendations ingestion and a Copilot Studio agent template for FinOps hubs, a new commitment discount eligibility open dataset, simplified hub deployment UI, Azure Optimization Engine pricesheet API upgrade, and minor improvements in Power BI, FinOps workbooks, and the PowerShell module. + October adds a shared FinOps Toolkit plugin for Claude Code and GitHub Copilot CLI, private networking support for FinOps hubs, a new Instance size flexibility open dataset, several KQL performance and correctness fixes across hubs, workbooks, and alerts, and minor improvements in Power BI, the Optimization Engine, and the PowerShell module.

See all changes

@@ -61,9 +61,9 @@ Automate and extend the Microsoft Cloud with starter kits, scripts, and advanced Learn more
-
🌐 Open data
-
Useful data for anyone to access, use, and share.
- Learn more +
🤖 Agent plugin
+
AI-powered cloud financial management for Claude Code and GitHub Copilot CLI.
+ Learn more
🖥️ PowerShell
@@ -75,6 +75,11 @@ Automate and extend the Microsoft Cloud with starter kits, scripts, and advanced
Official repository for Bicep modules.
Learn more
+
+
🌐 Open data
+
Useful data for anyone to access, use, and share.
+ Learn more +
Download FinOps toolkit {% include ftktag.txt %} diff --git a/docs/_includes/ftkver.txt b/docs/_includes/ftkver.txt index e6e484c9f..3d3be3c32 100644 --- a/docs/_includes/ftkver.txt +++ b/docs/_includes/ftkver.txt @@ -1 +1 @@ -15.0-dev \ No newline at end of file +15.0 \ No newline at end of file diff --git a/docs/agent-plugin.md b/docs/agent-plugin.md new file mode 100644 index 000000000..b596054a3 --- /dev/null +++ b/docs/agent-plugin.md @@ -0,0 +1,55 @@ +--- +layout: default +title: Agent plugin +browser: FinOps toolkit agent plugin - Automate your FinOps efforts +nav_order: 65 +description: 'The FinOps toolkit agent plugin brings AI-powered cloud financial management to Claude Code and GitHub Copilot CLI.' +permalink: /agent-plugin +#customer intent: As a Finops practitioner, I need to learn about the FinOps toolkit agent plugin +--- + +FinOps toolkit agent plugin +Bring AI-powered cloud financial management to Claude Code and GitHub Copilot CLI. +{: .fs-6 .fw-300 } + +Install +Documentation + +--- + +The FinOps toolkit agent plugin pairs role-specific agents, ready-to-run commands, and a FinOps hubs query skill with a read-only Azure MCP server, so you can analyze cost data, review recommendations, and manage FinOps hubs without leaving your terminal. + +
+

What's new in October 2026v15

+

+ The FinOps toolkit agent plugin is new this release: a shared plugin for Claude Code and GitHub Copilot CLI with 5 agents (CFO, FinOps practitioner, database query, hubs agent, and Azure capacity manager), 4 commands, a FinOps hubs KQL skill, and a read-only Azure MCP server. +

+

See all changes

+
+ + + +## What's included + +- **Agents** – Chief Financial Officer, FinOps practitioner, FinOps hubs database query, FinOps hubs agent, and Azure capacity manager. +- **Commands** – `/ftk-hubs-connect`, `/ftk-hubs-healthCheck`, `/ftk-mom-report`, and `/ftk-ytd-report`. +- **Skill** – A FinOps hubs KQL skill with task routing, a pre-built query catalog, and schema guidance. +- **MCP server** – A read-only [Azure MCP server](https://github.com/Azure/azure-mcp) scoped to the Kusto namespace for querying FinOps hubs data. + + + +## Install + +```bash +# Claude Code +claude plugin add microsoft/finops-toolkit + +# GitHub Copilot CLI +copilot plugin install microsoft/finops-toolkit +``` + +
+ +## Learn more + +[Read the full documentation](https://learn.microsoft.com/cloud-computing/finops/toolkit/agent-plugin/finops-toolkit-agent-plugin-overview) for required permissions and setup details. diff --git a/docs/alerts.md b/docs/alerts.md index 24e06851b..6d4d77de2 100644 --- a/docs/alerts.md +++ b/docs/alerts.md @@ -19,15 +19,13 @@ Accelerate your cost optimization efforts with scheduled notifications that cont Designed with flexibility in mind, FinOps alerts run on a fully configurable schedule, continuously scanning your selected subscriptions for idle resources. - ## Actionable insights for smarter cloud management diff --git a/docs/guide.md b/docs/guide.md index abe565fdb..d29e15b0c 100644 --- a/docs/guide.md +++ b/docs/guide.md @@ -16,9 +16,9 @@ Your guide to implementing FinOps in the Microsoft Cloud. FinOps is an expansive area with branches that extend out into many cloud management and governance activities. Cost especially is a part of many cloud and business initiatives, like security, resiliency, and adopting cloud-native solutions like AI. And to streamline cloud adoption in a way that prioritizes business value, you need the right guidance to help you make the right data-driven decisions. The Implementing FinOps guide is a collection of resources that help you facilitate your FinOps goals.
-

What's new in April 2026v14

+

What's new in October 2026v15

- In April, the Implementing FinOps guide updated the FinOps overview video and error handling documentation. + In October, the Implementing FinOps guide added a FinOps toolkit ecosystem page and aligned capability names and links to current FinOps Framework terminology.

See all changes

diff --git a/docs/hubs.md b/docs/hubs.md index c3ff69557..5bbb21df8 100644 --- a/docs/hubs.md +++ b/docs/hubs.md @@ -20,9 +20,9 @@ Open, extensible, and scalable cost governance for the enterprise. FinOps hubs are a reliable, trustworthy platform for cost analytics, insights, and optimization – virtual command centers for leaders throughout the organization to report on, monitor, and optimize cost based on their organizational needs.
-

What's new in April 2026v14

+

What's new in October 2026v15

- In April, FinOps hubs added recommendations ingestion from Azure Advisor and custom ARG queries, a Copilot Studio agent template, simplified the deployment UI, and fixed deployment and ETL pipeline issues. + In October, FinOps hubs added VNet and private network modes with optional NAT Gateway support, a guide to run FinOps hubs using a local Kusto emulator, and fixed several KQL join, managed export permission, and cost recompute issues.

See all changes

diff --git a/docs/open-data.md b/docs/open-data.md index 7dd883fbb..11ef6dbd8 100644 --- a/docs/open-data.md +++ b/docs/open-data.md @@ -20,9 +20,9 @@ Leverage open data to normalize and enhance your FinOps reporting. FinOps toolkit open data is used to transform Cost Management actual and amortized data into FOCUS. Use the same mappings to clean your FinOps datasets.
-

What's new in April 2026v14

+

What's new in October 2026v15

- In April, open data added a new commitment discount eligibility dataset with pre-computed reservation and savings plan eligibility per meter, sourced from the Azure Retail Prices API. + In October, open data added a new Instance size flexibility dataset sourced from the Azure Reservations Catalogs API, replacing the deprecated ISF ratio files, fixed the commitment discount eligibility dataset refresh and its spend and usage columns, and corrected instance size flexibility ratios and region coverage.

See all changes

diff --git a/docs/optimization-engine.md b/docs/optimization-engine.md index 878b982d0..38013b494 100644 --- a/docs/optimization-engine.md +++ b/docs/optimization-engine.md @@ -20,9 +20,9 @@ Optimize your Azure environment. The Azure Optimization Engine (AOE) is an extensible solution designed to generate optimization recommendations for your Azure environment. See it like a fully customizable Azure Advisor.
-

What's new in April 2026v14

+

What's new in October 2026v15

- In April, Azure Optimization Engine upgraded the EA/MCA pricesheet API version (the previous version is deprecated June 1, 2026) and improved retail prices export resilience with retry logic, streamed CSV writes, and progress logging. + In October, Azure Optimization Engine added a comprehensive reference for runbooks, schedules, variables, and tables, migrated Log Analytics ingestion to a Data Collection Rule-based solution, switched to the new Instance size flexibility open dataset, and removed a deprecated Azure Classic administrators API call.

diff --git a/docs/power-bi.md b/docs/power-bi.md index b64c6fd4a..14aac976b 100644 --- a/docs/power-bi.md +++ b/docs/power-bi.md @@ -20,9 +20,9 @@ Accelerate your analytics efforts with simple, targeted reports. Summarize and b FinOps toolkit Power BI reports provide a great starting point for FinOps reporting. Customize and augment reports with your own data to facilitate organizational requirements.
-

What's new in April 2026v14

+

What's new in October 2026v15

- In April, Power BI reports fixed storage report refresh errors caused by unrecognized Term values like P10Y in pricesheet exports. + In October, Power BI reports switched to the new Instance size flexibility open dataset, fixed storage report refresh errors from ISO 8601 duration values, and paginated Azure Resource Graph queries to avoid payload size errors.

See all changes

diff --git a/docs/powershell.md b/docs/powershell.md index 26cd4b910..3d755e93e 100644 --- a/docs/powershell.md +++ b/docs/powershell.md @@ -20,9 +20,9 @@ Automate and scale your FinOps efforts with PowerShell commands that streamline The FinOps toolkit PowerShell module helps you automate and scale common Cost Management and FinOps toolkit management operations and work with FinOps toolkit open data.
-

What's new in April 2026v14

+

What's new in October 2026v15

- In April, the PowerShell module added WhatIf support for resource provider registration in New-FinOpsCostExport and fixed inverted verbose logging in Start-FinOpsCostExport. + In October, the PowerShell module added Initialize-FinOpsHubLocal for setting up a local FinOps hub with one command, plus commands to generate the commitment discount eligibility and instance size flexibility open data, updated test compatibility with Pester 6, and fixed Get-FinOpsCostExport -RunHistory and Start-FinOpsCostExport date handling for UTC offsets.

See all changes

diff --git a/docs/workbooks.md b/docs/workbooks.md index 7559f8d03..58e795a87 100644 --- a/docs/workbooks.md +++ b/docs/workbooks.md @@ -20,9 +20,9 @@ Engineering hub to maximize cloud ROI through FinOps. FinOps workbooks are Azure workbooks that provide a series of tools to help engineers perform targeted FinOps tasks, modeled after the Well-Architected Framework guidance.
-

What's new in April 2026v14

+

What's new in October 2026v15

- In April, FinOps workbooks fixed the broken feedback link in the Optimization workbook, excluded dev/test subscriptions from Azure Hybrid Benefit reports, and fixed AHB reports to include Windows VMs from all publishers. + In October, FinOps workbooks fixed savings plan and Azure Hybrid Benefit queries that were silently dropping or missing recommendations due to implicit join behavior.

See all changes

diff --git a/package-lock.json b/package-lock.json index d1993e489..2b84a1d70 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ftk", - "version": "15.0.0-dev.0", + "version": "15.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "ftk", - "version": "15.0.0-dev.0", + "version": "15.0.0", "license": "MIT", "devDependencies": { "all-contributors-cli": "^6.26.1" diff --git a/package.json b/package.json index 898ab1baa..6c0a6b93b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ftk", - "version": "15.0.0-dev.0", + "version": "15.0.0", "description": "Starter kits, scripts, and advanced solutions to accelerate your FinOps journey in the Microsoft Cloud.", "main": "index.js", "directories": { diff --git a/src/optimization-engine/ftkver.txt b/src/optimization-engine/ftkver.txt index e6e484c9f..3d3be3c32 100644 --- a/src/optimization-engine/ftkver.txt +++ b/src/optimization-engine/ftkver.txt @@ -1 +1 @@ -15.0-dev \ No newline at end of file +15.0 \ No newline at end of file diff --git a/src/powershell/Private/Get-VersionNumber.ps1 b/src/powershell/Private/Get-VersionNumber.ps1 index 097964a44..c14edf29b 100644 --- a/src/powershell/Private/Get-VersionNumber.ps1 +++ b/src/powershell/Private/Get-VersionNumber.ps1 @@ -4,5 +4,5 @@ function Get-VersionNumber { param() - return '15.0-dev' + return '15.0' } diff --git a/src/scripts/Get-Version.ps1 b/src/scripts/Get-Version.ps1 index 90ad37c7f..452f681fc 100644 --- a/src/scripts/Get-Version.ps1 +++ b/src/scripts/Get-Version.ps1 @@ -16,6 +16,9 @@ .PARAMETER AsTag Optional. Returns the version as a git tag (e.g., "v13" instead of "13.0"). Default = false. + .PARAMETER AsSemVer + Optional. Returns a full three-part semantic version (e.g., "13.0.0" instead of "13.0") for files that require it, like marketplace.json. Default = false. + .PARAMETER AsDotNetVersion Optional. Indicates that the returned version should be in the format "x.x.x.x". Otherwise, semantic versioning is used. Default = false. @@ -33,6 +36,9 @@ param( [switch] $AsTag, + [switch] + $AsSemVer, + [switch] $AsDotNetVersion ) @@ -48,6 +54,14 @@ if ($AsTag) return 'v' + (($ver -replace '-.*$', '') -replace '\.0$', '') } +if ($AsSemVer) +{ + # Pad major.minor to major.minor.patch and keep any prerelease label + $base = ($ver -replace '-.*$', '') -split '\.' + while ($base.Count -lt 3) { $base += '0' } + return ($base[0..2] -join '.') + ($ver -replace '^[^-]*', '') +} + if ($AsDotNetVersion -and $ver.Contains('-')) { $arr = (($ver -replace '-[^\.0-9]+', '') -split '\.') + @(0, 0) diff --git a/src/scripts/Update-Version.ps1 b/src/scripts/Update-Version.ps1 index ee814b78e..03ddb091b 100644 --- a/src/scripts/Update-Version.ps1 +++ b/src/scripts/Update-Version.ps1 @@ -141,6 +141,7 @@ if ($update -or $Version) # Update version in marketplace.json plugin entries Write-Verbose "Updating marketplace.json files..." + $semVer = & "$PSScriptRoot/Get-Version" -AsSemVer Get-RepositoryVersionFiles "marketplace.json" ` | ForEach-Object { $json = Get-Content $_ -Raw | ConvertFrom-Json @@ -149,13 +150,13 @@ if ($update -or $Version) Write-Verbose "- $($_.FullName.Replace($repoRoot + [IO.Path]::DirectorySeparatorChar, ''))" if ($json.PSObject.Properties['metadata'] -and $json.metadata.PSObject.Properties['version']) { - $json.metadata.version = $ver + $json.metadata.version = $semVer } foreach ($plugin in $json.plugins) { if ($plugin.PSObject.Properties['version']) { - $plugin.version = $ver + $plugin.version = $semVer } } $json | ConvertTo-Json -Depth 10 | Out-File $_ -Encoding utf8 -NoNewline diff --git a/src/templates/agent-plugin/.claude-plugin/plugin.json b/src/templates/agent-plugin/.claude-plugin/plugin.json index 109c206d7..09d2a04d0 100644 --- a/src/templates/agent-plugin/.claude-plugin/plugin.json +++ b/src/templates/agent-plugin/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "microsoft-finops-toolkit", - "version": "15.0.0", + "version": "15.0", "description": "Microsoft FinOps toolkit plugin for AI-powered cloud financial management.", "author": { "name": "FinOps Toolkit Team", @@ -9,10 +9,19 @@ "homepage": "https://aka.ms/finops/toolkit", "repository": "https://github.com/microsoft/finops-toolkit", "license": "MIT", - "keywords": ["finops", "cost-management", "reservations", "savings-plans", "cloud-optimization", "commitments", "credits", "macc"], + "keywords": [ + "finops", + "cost-management", + "reservations", + "savings-plans", + "cloud-optimization", + "commitments", + "credits", + "macc" + ], "commands": "./commands/", "skills": [ "./skills/" ], "outputStyles": "./output-styles/" -} +} \ No newline at end of file diff --git a/src/templates/agent-plugin/plugin.json b/src/templates/agent-plugin/plugin.json index bc7d4da20..946292328 100644 --- a/src/templates/agent-plugin/plugin.json +++ b/src/templates/agent-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "microsoft-finops-toolkit", - "version": "15.0.0", + "version": "15.0", "description": "Microsoft FinOps toolkit plugin for AI-powered cloud financial management.", "author": { "name": "FinOps Toolkit Team", @@ -9,11 +9,20 @@ "homepage": "https://aka.ms/finops/toolkit", "repository": "https://github.com/microsoft/finops-toolkit", "license": "MIT", - "keywords": ["finops", "cost-management", "reservations", "savings-plans", "cloud-optimization", "commitments", "credits", "macc"], + "keywords": [ + "finops", + "cost-management", + "reservations", + "savings-plans", + "cloud-optimization", + "commitments", + "credits", + "macc" + ], "commands": "./commands/", "agents": "./agents/", "skills": [ "skills/" ], "mcpServers": ".mcp.json" -} +} \ No newline at end of file diff --git a/src/templates/finops-alerts/modules/ftkver.txt b/src/templates/finops-alerts/modules/ftkver.txt index e6e484c9f..3d3be3c32 100644 --- a/src/templates/finops-alerts/modules/ftkver.txt +++ b/src/templates/finops-alerts/modules/ftkver.txt @@ -1 +1 @@ -15.0-dev \ No newline at end of file +15.0 \ No newline at end of file diff --git a/src/templates/finops-hub/modules/Microsoft.CostManagement/Exports/app.bicep b/src/templates/finops-hub/modules/Microsoft.CostManagement/Exports/app.bicep index b372acac7..015eef74a 100644 --- a/src/templates/finops-hub/modules/Microsoft.CostManagement/Exports/app.bicep +++ b/src/templates/finops-hub/modules/Microsoft.CostManagement/Exports/app.bicep @@ -1109,6 +1109,7 @@ resource dataFactory 'Microsoft.DataFactory/factories@2018-06-01' existing = { } } fieldList: [ + 'exists' 'childItems' ] storeSettings: { @@ -1128,14 +1129,14 @@ resource dataFactory 'Microsoft.DataFactory/factories@2018-06-01' existing = { { activity: 'Get Existing Parquet Files' dependencyConditions: [ - 'Completed' + 'Succeeded' ] } ] userProperties: [] typeProperties: { items: { - value: '@if(contains(activity(\'Get Existing Parquet Files\').output, \'childItems\'), activity(\'Get Existing Parquet Files\').output.childItems, json(\'[]\'))' + value: '@if(and(activity(\'Get Existing Parquet Files\').output.exists, contains(activity(\'Get Existing Parquet Files\').output, \'childItems\')), activity(\'Get Existing Parquet Files\').output.childItems, json(\'[]\'))' type: 'Expression' } condition: { diff --git a/src/templates/finops-hub/modules/Microsoft.FinOpsHubs/Analytics/app.bicep b/src/templates/finops-hub/modules/Microsoft.FinOpsHubs/Analytics/app.bicep index 84a29d95c..b87b230a1 100644 --- a/src/templates/finops-hub/modules/Microsoft.FinOpsHubs/Analytics/app.bicep +++ b/src/templates/finops-hub/modules/Microsoft.FinOpsHubs/Analytics/app.bicep @@ -1694,6 +1694,7 @@ resource pipeline_ExecuteIngestionETL 'Microsoft.DataFactory/factories/pipelines } } fieldList: [ + 'exists' 'childItems' ] storeSettings: { @@ -1720,7 +1721,7 @@ resource pipeline_ExecuteIngestionETL 'Microsoft.DataFactory/factories/pipelines userProperties: [] typeProperties: { items: { - value: '@if(contains(activity(\'Get Existing Parquet Files\').output, \'childItems\'), activity(\'Get Existing Parquet Files\').output.childItems, json(\'[]\'))' + value: '@if(and(activity(\'Get Existing Parquet Files\').output.exists, contains(activity(\'Get Existing Parquet Files\').output, \'childItems\')), activity(\'Get Existing Parquet Files\').output.childItems, json(\'[]\'))' type: 'Expression' } condition: { diff --git a/src/templates/finops-hub/modules/fx/ftkver.txt b/src/templates/finops-hub/modules/fx/ftkver.txt index e6e484c9f..3d3be3c32 100644 --- a/src/templates/finops-hub/modules/fx/ftkver.txt +++ b/src/templates/finops-hub/modules/fx/ftkver.txt @@ -1 +1 @@ -15.0-dev \ No newline at end of file +15.0 \ No newline at end of file diff --git a/src/templates/finops-workbooks/ftkver.txt b/src/templates/finops-workbooks/ftkver.txt index e6e484c9f..3d3be3c32 100644 --- a/src/templates/finops-workbooks/ftkver.txt +++ b/src/templates/finops-workbooks/ftkver.txt @@ -1 +1 @@ -15.0-dev \ No newline at end of file +15.0 \ No newline at end of file diff --git a/src/workbooks/.scaffold/ftkver.txt b/src/workbooks/.scaffold/ftkver.txt index e6e484c9f..3d3be3c32 100644 --- a/src/workbooks/.scaffold/ftkver.txt +++ b/src/workbooks/.scaffold/ftkver.txt @@ -1 +1 @@ -15.0-dev \ No newline at end of file +15.0 \ No newline at end of file