v2.9.1
Hotfix to v2.9.0. Caught by live-tenant validation post-tag — the underlying lesson is also addressed by a new .claude/rules/releases.md rule requiring live verification before any future tag/publish.
Fixed
- HTML report rendered as a blank black screen when
window.REPORT_DATA.permissions.sections.<X>.requiredcame back empty.ConvertTo-Jsonround-trips empty arrays asnulland single-element arrays as bare scalars; the newPermissionsPanelReact component (#812 / v2.9.0) called.join()on the field directly. Emptyrequired: []for sections likeEmail(which uses EXO, not Graph) becamenull, the call threw, and React unmounted the entire app tree. Fixed by routing all three array fields (required,missing, top-levelmissing) through anasArraycoercion helper inside the component - HTML report generation silently failed when
-AutoBaselinewas supplied. PowerShell's parser interpretedNew-Object -TypeName System.Collections.Generic.Dictionary[string, System.IO.DirectoryInfo](introduced in C1 #780 / v2.9.0) as an array literal — the comma between the two type parameters became the array operator, producingCannot convert 'System.Object[]' to the type 'System.String' required by parameter 'TypeName'at runtime. Switched to::new()which parses the type literal unambiguously. Added the previously-missingtests/Common/Get-BaselineTrend.Tests.ps1regression suite — the bug slipped through because the function had zero Pester coverage and the runtime parse only fails inside theBuild-ReportData->Build-SectionHtml->Get-BaselineTrendcall stack - Report-generation failures no longer get swallowed silently. The
catchblock inInvoke-M365Assessment.ps1now also callsWrite-Warningand points at the log file path, instead of writing only to the assessment log. A consultant running a 5-minute assessment shouldn't have to grep the log to discover the report didn't generate