diff --git a/docs-mslearn/best-practices/storage.md b/docs-mslearn/best-practices/storage.md
index 6e61ebd3f..cc15eaddd 100644
--- a/docs-mslearn/best-practices/storage.md
+++ b/docs-mslearn/best-practices/storage.md
@@ -3,7 +3,7 @@ title: FinOps best practices for Storage
description: This article outlines proven FinOps practices for storage services, focusing on cost optimization, efficiency improvements, and resource insights.
author: flanakin
ms.author: micflan
-ms.date: 04/01/2026
+ms.date: 05/12/2026
ms.topic: concept-article
ms.service: finops
ms.subservice: finops-learning-resources
@@ -76,7 +76,6 @@ Azure managed disks are block-level storage volumes that are managed by Azure an
Related resources:
-- [Managed disks product page](https://azure.microsoft.com/products/managed-disks)
- [Managed disks pricing](https://azure.microsoft.com/pricing/details/managed-disks)
- [Managed disks documentation](/azure/virtual-machines/managed-disks-overview)
diff --git a/docs-mslearn/framework/manage/onboarding.md b/docs-mslearn/framework/manage/onboarding.md
index 04a301c8a..e8a8800f1 100644
--- a/docs-mslearn/framework/manage/onboarding.md
+++ b/docs-mslearn/framework/manage/onboarding.md
@@ -3,7 +3,7 @@ title: Onboarding workloads
description: This article helps you understand the onboarding workloads capability within the FinOps Framework and how to implement that in the Microsoft Cloud.
author: flanakin
ms.author: micflan
-ms.date: 04/01/2026
+ms.date: 05/12/2026
ms.topic: concept-article
ms.service: finops
ms.subservice: finops-learning-resources
@@ -73,7 +73,7 @@ Document your onboarding process. Using existing tools and processes where avail
## Learn more at the FinOps Foundation
-This capability is a part of the FinOps Framework by the FinOps Foundation, a non-profit organization dedicated to advancing cloud cost management and optimization. For more information about FinOps, including useful playbooks, training and certification programs, and more, see the [Onboarding workloads capability](https://www.finops.org/framework/capabilities/onboarding-workloads/) article in the FinOps Framework documentation.
+This capability is a part of the FinOps Framework by the FinOps Foundation, a non-profit organization dedicated to advancing cloud cost management and optimization. For more information about FinOps, including useful playbooks, training and certification programs, and more, refer to the [FinOps Framework documentation](https://www.finops.org/framework/).
You can also find related videos on the FinOps Foundation YouTube channel:
diff --git a/docs-mslearn/framework/quantify/benchmarking.md b/docs-mslearn/framework/quantify/benchmarking.md
index 4db88a05f..5f18652ac 100644
--- a/docs-mslearn/framework/quantify/benchmarking.md
+++ b/docs-mslearn/framework/quantify/benchmarking.md
@@ -3,7 +3,7 @@ title: FinOps benchmarking
description: This article helps you understand the benchmarking capability within the FinOps Framework and how to implement that in the Microsoft Cloud.
author: flanakin
ms.author: micflan
-ms.date: 04/01/2026
+ms.date: 05/12/2026
ms.topic: concept-article
ms.service: finops
ms.subservice: finops-learning-resources
@@ -58,7 +58,7 @@ At this point, you implemented best practices based on cross-company benchmarks
## Learn more at the FinOps Foundation
-This capability is a part of the FinOps Framework by the FinOps Foundation, a non-profit organization dedicated to advancing cloud cost management and optimization. For more information about FinOps, including useful playbooks, training and certification programs, and more, see to the [benchmarking](https://www.finops.org/framework/capabilities/benchmarking) article in the FinOps Framework documentation.
+This capability is a part of the FinOps Framework by the FinOps Foundation, a non-profit organization dedicated to advancing cloud cost management and optimization. For more information about FinOps, including useful playbooks, training and certification programs, and more, refer to the [FinOps Framework documentation](https://www.finops.org/framework/).
diff --git a/docs-mslearn/toolkit/changelog.md b/docs-mslearn/toolkit/changelog.md
index dc22e673f..76fe1b70f 100644
--- a/docs-mslearn/toolkit/changelog.md
+++ b/docs-mslearn/toolkit/changelog.md
@@ -3,7 +3,7 @@ title: FinOps toolkit changelog
description: Review the latest features and enhancements in the FinOps toolkit, including updates to FinOps hubs, Power BI reports, and more.
author: MSBrett
ms.author: brettwil
-ms.date: 04/29/2026
+ms.date: 05/12/2026
ms.topic: reference
ms.service: finops
ms.subservice: finops-toolkit
@@ -1058,7 +1058,7 @@ _**Breaking change**_
- Added param to disable external access to Azure Data Lake and Azure Data Explorer.
- Added param to specify subnet range of virtual network - minimum size = /26
- Support for storage account infrastructure encryption.
- - Published a [schema file](https://aka.ms/finops/hubs/settings-schema) for the hub settings.json file.
+ - Published a schema file for the hub settings.json file in this release.
- **Changed**
- Changed dataset names in the ingestion container to facilitate Azure Data Explorer ingestion.
> [!IMPORTANT]
diff --git a/docs-mslearn/toolkit/hubs/deploy.md b/docs-mslearn/toolkit/hubs/deploy.md
index 4c7760ef0..eaae43be3 100644
--- a/docs-mslearn/toolkit/hubs/deploy.md
+++ b/docs-mslearn/toolkit/hubs/deploy.md
@@ -3,7 +3,7 @@ title: How to create and update FinOps hubs
description: This tutorial helps you create a new or update an existing FinOps hubs instance in Azure or Microsoft Fabric.
author: flanakin
ms.author: micflan
-ms.date: 04/21/2026
+ms.date: 05/12/2026
ms.topic: tutorial
ms.service: finops
ms.subservice: finops-toolkit
@@ -560,7 +560,7 @@ For more information, see [Configure Data Explorer dashboards](configure-dashboa
- **Azure Data Explorer (Kusto)** – Use an account that has at least viewer access to the Hub and Ingestion databases.
- **Azure Resource Graph** – Use an account that has direct access to any subscriptions you would like to report on.
- **(your storage account)** – Use a SAS token or an account that has Storage Blob Data Reader or greater access.
- - **...** – Anonymous access. This URL is used for reservation size flexibility data.
+ - **** – Anonymous access. This URL is used for reservation size flexibility data.
- **...** – Anonymous access. This URL is used for FinOps toolkit open data files.
For more information, see [Set up Power BI reports](../power-bi/setup.md).
diff --git a/docs-mslearn/toolkit/power-bi/setup.md b/docs-mslearn/toolkit/power-bi/setup.md
index 6aeae6653..7121162f8 100644
--- a/docs-mslearn/toolkit/power-bi/setup.md
+++ b/docs-mslearn/toolkit/power-bi/setup.md
@@ -3,7 +3,7 @@ title: Set up Power BI reports
description: Learn how to set up Power BI FinOps reports using the FinOps toolkit, customize visuals, and connect to your cost data for detailed analysis.
author: flanakin
ms.author: micflan
-ms.date: 04/01/2026
+ms.date: 05/12/2026
ms.topic: how-to
ms.service: finops
ms.subservice: finops-toolkit
@@ -115,7 +115,7 @@ The FinOps toolkit Power BI reports include preconfigured visuals, but aren't co
- **Azure Data Explorer (Kusto)** – Use an account that has at least viewer access to the Hub database.
- **Azure Resource Graph** – Use an account that has direct access to any subscriptions you would like to report on.
- **(your storage account)** – Use a SAS token or an account that has Storage Blob Data Reader or greater access.
- - **...** – Anonymous access. This URL is used for reservation size flexibility data.
+ - **** – Anonymous access. This URL is used for reservation size flexibility data.
- **...** – Anonymous access. This URL is used for FinOps toolkit open data files.
If you run into any issues syncing your data, see [Troubleshooting Power BI reports](../help/troubleshooting.md).
diff --git a/src/powershell/Tests/Unit/DocsLinks.Tests.ps1 b/src/powershell/Tests/Unit/DocsLinks.Tests.ps1
index 5415919a6..5d92fa414 100644
--- a/src/powershell/Tests/Unit/DocsLinks.Tests.ps1
+++ b/src/powershell/Tests/Unit/DocsLinks.Tests.ps1
@@ -102,6 +102,46 @@ BeforeDiscovery {
$mslearnFiles = Get-MarkdownFiles $mslearnRoot $mslearnRoot
$mslearnInternalLinks = Get-InternalMdLinks $mslearnFiles
$mslearnUrls = Get-MarkdownUrls $mslearnFiles
+ $knownBrokenExternalUrls = @(
+ 'https://azure.microsoft.com/products/managed-disks',
+ 'https://www.finops.org/framework/capabilities/onboarding-workloads/',
+ 'https://www.finops.org/framework/capabilities/benchmarking',
+ 'https://aka.ms/finops/hubs/settings-schema'
+ )
+ # Match incomplete ccmstorageprod URLs (no domain suffix), while allowing valid hosts like ccmstorageprod.blob.core.windows.net.
+ $incompletePlaceholderUrlPattern = 'https://ccmstorageprod(?!\.)'
+ $knownBrokenExternalUrlMatches = @()
+ $incompleteExternalUrlMatches = @()
+ foreach ($file in $mslearnFiles)
+ {
+ $cleanContent = Remove-HtmlComments $file.Content
+ foreach ($url in $knownBrokenExternalUrls)
+ {
+ $urlMatches = [regex]::Matches($cleanContent, [regex]::Escape($url))
+ foreach ($match in $urlMatches)
+ {
+ $knownBrokenExternalUrlMatches += @{
+ SourceFile = $file.FullName
+ SourceRel = $file.RelativePath
+ Url = $url
+ Pattern = "^$([regex]::Escape($url))$"
+ LineNumber = ($cleanContent.Substring(0, $match.Index) -split "`n").Count
+ }
+ }
+ }
+
+ $placeholderMatches = [regex]::Matches($cleanContent, $incompletePlaceholderUrlPattern)
+ foreach ($match in $placeholderMatches)
+ {
+ $incompleteExternalUrlMatches += @{
+ SourceFile = $file.FullName
+ SourceRel = $file.RelativePath
+ Url = $match.Value
+ Pattern = $incompletePlaceholderUrlPattern
+ LineNumber = ($cleanContent.Substring(0, $match.Index) -split "`n").Count
+ }
+ }
+ }
#endregion
#region docs (Jekyll site)
@@ -259,6 +299,20 @@ Describe 'Documentation links' {
}
}
+ Context 'docs-mslearn: No known broken external URLs' {
+
+ It 'Should not contain known broken external URL: : ' -ForEach $knownBrokenExternalUrlMatches {
+ $Url | Should -Not -Match $Pattern -Because "known broken external URLs should not appear in docs-mslearn content (${SourceRel}:${LineNumber})"
+ }
+ }
+
+ Context 'docs-mslearn: No incomplete placeholder external URLs' {
+
+ It 'Should not contain incomplete placeholder URL: : ' -ForEach $incompleteExternalUrlMatches {
+ $Url | Should -Not -Match $Pattern -Because "incomplete placeholder URLs should not appear in docs-mslearn content (${SourceRel}:${LineNumber})"
+ }
+ }
+
#endregion
#region docs (Jekyll site)