diff --git a/CHANGELOG.md b/CHANGELOG.md
index d8fe09b..069243e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,24 @@ The format follows [Conventional Commits](https://www.conventionalcommits.org/)
+## [1.2.2] - 2026-09-24
+
+Patch release for the Intune Anomalies report.
+
+### Changes
+
+- **Autopilot device preparation (v2) is recognised.** The *Not in Autopilot* tab (was *No Autopilot Hash*) only lists devices with neither a hardware hash nor a corporate identifier.
+- **Cloud PCs are left out of the BitLocker and Autopilot tabs**, where they were always false positives.
+- **Every tab explains what it checks.**
+- **Noncompliant reasons use the names from the Intune admin center**, e.g. *Require BitLocker* or *Is active (no compliance check-in in the last 31 days)*.
+
+### Fixes
+
+- **Noncompliant reason no longer shows "Unknown"** for devices that fail the built-in Default Device Compliance Policy.
+- **Application failure percentages are correct** (100% was shown as 1%).
+
+---
+
## [1.2.1] - 2026-06-18
Patch release - fixes a perf regression and a missing-data symptom in the Intune Anomalies report's compliance fetch, plus a layout fix that affects every report.
diff --git a/Tests/Consistency.Tests.ps1 b/Tests/Consistency.Tests.ps1
index cb54372..2c7dfd1 100644
--- a/Tests/Consistency.Tests.ps1
+++ b/Tests/Consistency.Tests.ps1
@@ -148,6 +148,25 @@ Describe 'Public report cmdlet shape contracts' {
}
}
+Describe 'Compliance setting friendly names' {
+ BeforeAll {
+ Remove-Module -Name 'RKSolutions' -ErrorAction SilentlyContinue
+ Import-Module (Get-RKSolutionsManifestPath) -Force
+ }
+
+ It 'No friendly name contains ", " (the Noncompliant tab splits reasons on it)' {
+ $bad = InModuleScope RKSolutions { $script:ComplianceSettingFriendlyNames.Values | Where-Object { $_ -like '*, *' } }
+ $bad | Should -BeNullOrEmpty
+ }
+
+ It 'Translates known rules and passes unknown ones through' {
+ InModuleScope RKSolutions {
+ ConvertTo-ComplianceSettingFriendlyName 'Windows10CompliancePolicy.BitLockerEnabled' | Should -Be 'Require BitLocker'
+ ConvertTo-ComplianceSettingFriendlyName './Vendor/MSFT/Custom/Thing' | Should -Be './Vendor/MSFT/Custom/Thing'
+ }
+ }
+}
+
Describe 'BitLocker / LAPS anomaly resolver output contracts' {
# The HTML template emits
cells for each property in a specific order;
# if these resolvers ever stop emitting one of these columns, the rendered
diff --git a/docs/CMDLET-REFERENCE.md b/docs/CMDLET-REFERENCE.md
index df37187..bfda429 100644
--- a/docs/CMDLET-REFERENCE.md
+++ b/docs/CMDLET-REFERENCE.md
@@ -54,7 +54,7 @@ Connect first with **Connect-RKGraph**; this cmdlet uses the existing connection
## Get-IntuneAnomaliesReport
-Generates an interactive HTML report covering Intune app failures, multi-user devices, missing Autopilot hashes, inactive devices, non-compliant devices, disabled primary users, BitLocker key escrow, Windows LAPS backup, and deprecated Settings Catalog settings.
+Generates an interactive HTML report covering Intune app failures, multi-user devices, devices not registered for Autopilot, inactive devices, non-compliant devices, disabled primary users, BitLocker key escrow, Windows LAPS backup, and deprecated Settings Catalog settings.
| Parameter | Description |
diff --git a/module/Private/Get-RKSolutionsReportTemplate.ps1 b/module/Private/Get-RKSolutionsReportTemplate.ps1
index 8fc23df..245f71c 100644
--- a/module/Private/Get-RKSolutionsReportTemplate.ps1
+++ b/module/Private/Get-RKSolutionsReportTemplate.ps1
@@ -459,6 +459,21 @@ input:checked + .rk-theme-toggle-slider:before { transform: translateX(18px); }
[data-theme="dark"] .rk-stat-tile.t-pink .rk-stat-eyebrow { color: var(--tile-pink-eyebrow); opacity: 1; }
[data-theme="dark"] .rk-stat-tile.t-pink .rk-stat-caption { color: var(--tile-pink-caption); opacity: 1; }
+/* --- Tab intro (what this tab checks) --- */
+.rk-tab-intro {
+ background: var(--accent-soft);
+ border: 1px solid var(--border);
+ border-left: 3px solid var(--accent);
+ border-radius: 10px;
+ padding: 12px 18px;
+ margin-bottom: 16px;
+ font-family: 'Geist', -apple-system, sans-serif;
+ font-size: 0.85rem;
+ line-height: 1.5;
+ color: var(--text-body);
+}
+.rk-tab-intro strong { color: var(--text); }
+
/* --- Filter Bar --- */
.rk-filter-bar {
background: var(--bg-elevated);
diff --git a/module/Private/IntuneAnomalies.ps1 b/module/Private/IntuneAnomalies.ps1
index dd2fae4..a14d72e 100644
--- a/module/Private/IntuneAnomalies.ps1
+++ b/module/Private/IntuneAnomalies.ps1
@@ -81,7 +81,7 @@ function New-IntuneAnomaliesHTMLReport {
"@
}
- # Generate table rows for Non-company owned devices
+ # Generate table rows for devices not registered for Autopilot
$noAutopilotHashRows = ""
foreach ($item in $Report_DevicesWithoutAutopilotHash) {
$noAutopilotHashRows += @"
@@ -230,9 +230,9 @@ function New-IntuneAnomaliesHTMLReport {
Non-shared devices
-
NO AUTOPILOT HASH
+
NOT IN AUTOPILOT
$Report_DevicesWithoutAutopilotHash_Count
-
Missing hardware hash
+
No hash or corporate identifier
INACTIVE DEVICES
@@ -277,7 +277,7 @@ function New-IntuneAnomaliesHTMLReport {
-
+
@@ -289,6 +289,7 @@ function New-IntuneAnomaliesHTMLReport {
+
What we check: Windows apps in Intune with at least one failed installation, taken from the Intune app install status report and sorted by number of failed devices.