v2.6.0
Combined release covering the v2.5.0 (closed 2026-04-24) and v2.6.0 -- Finding Interaction (closed 2026-04-25) milestones.
Added
- Smart search in the findings table: pressing Enter cycles through matches (Shift+Enter reverses), an inline
N/Mcounter shows position, Esc clears. Active match auto-expands and scrolls into view; previously cycled-to row auto-collapses to keep the table tidy. Reuses the existingfocusFinding+highlight-focusinfrastructure (#697) - Every top-level section header in the report is now collapsible. New
useCollapsibleSectionhook applied to Posture trend, Framework coverage, Findings table, Roadmap, Stryker, and Appendix.beforeprintlistener auto-expands so PDF/print exports never lose collapsed content. PlainuseStateper the existing no-localStorage policy (#737) - New
Get-RemediationLanePowerShell helper inCommon/is the single source of truth for Now/Next/Later lane bucketing. Build-ReportData precomputeslaneonto each finding; HTML report and XLSX export both read it instead of duplicating bucketing rules (#715) - XLSX export gains a Horizon column on the Compliance Matrix sheet (color-coded Now=red, Next=amber, Later=blue; empty for Pass) and a new dedicated Remediation Roadmap sheet -- one row per actionable finding, grouped by Now/Next/Later, sorted within each group by severity then CheckId. Closes the parity gap with the HTML report's roadmap (#715)
- New
Effortcolumn on the Compliance Matrix sheet surfacing the registry-derived effort estimate (#715) - Framework coverage panel CTA shows the filtered count when one or more level chips are active:
View N of TOTAL findings matching L1 + E3 ->. Reuses the existingmatchProfileTokenhelper (#748) - Inline
L2 contains L3indicator chip on the CMMC chip row with hover tooltip clarifying that every L3 control is also assessed at L2 by design (verified by probe: zero L3-only-by-controlId checks exist in v2.22.1+ registry) (#744) - Framework cards in the Framework Quilt carry a rotating chevron affordance in their top-right corner plus keyboard accessibility (
role="button",aria-expanded, Enter/Space to toggle,:focus-visibleoutline) and a more visible hover state (#743) - FilterBar Level row appears for CIS M365 as well as CMMC, with L1 / L2 / E3 / E5 only chips. Chips write to the same
filters.profilefield used by the Framework Quilt panel chips, so selecting a level in either place lights up the other (#740) - CMMC complete posture view in the Framework Quilt -- the CMMC detail panel surfaces EZ-CMMC handoff gaps (out-of-scope / partial / coverable / inherent) alongside the existing L1/L2/L3 coverage stats.
REPORT_DATA.cmmcHandoffandREPORT_DATA.cmmcCoverageare part of the report data contract.sync-checkid.ymlpulls the handoff artifact on every scheduled sync (#594) - Clickable CMMC and CIS profile chips in the Framework Quilt expanded panel toggle each level's membership in
filters.profile(multi-select). The findings table filters to checks whosefwMeta[fw].profilesmatches at least one active token; the panel's Coverage by Domain bars re-compute against the same filter so the chart and findings stay consistent (#730, #731, #736)
Changed
- Posture trend section is now opt-in via
-IncludeTrendonInvoke-M365Assessment(threaded through Export-AssessmentReport -> Build-ReportData ->window.REPORT_DATA.trendOptIn). Baselines still auto-save for drift comparison; only the trend section visibility is gated. Default behaviour: no trend section unless explicitly requested (#750) - Remediation block in the findings detail panel splits PowerShell commands from portal navigation steps. New
.remediation-ps(code-style with violet "PowerShell" label) and.remediation-portal(prose with accent "Portal" label) blocks; segments preserve original order but never share a line (#687) - Roadmap card visual polish: lane-level color tint via
:has()selector (Now=danger, Next=warn, Later=accent), stronger solid divider between guidance and metadata blocks, severity tag adopts chip palette colors, Learn more block gets accent border (#686) - Remediation roadmap default lane distribution rebalanced: Warnings and Reviews land in Later by default unless their severity is critical; only Fail-status findings earn a spot in Now / Next. Observed effect on reference tenant (147 tasks): Now 18 / Next 52 (was 126) / Later 77 (was 3) (#709)
- Framework coverage panel is expanded by default on report load; first visible framework opens automatically so L1/L2 chips and Coverage by Domain bars are immediately visible (#735)
- FilterBar FRAMEWORK and DOMAIN dropdowns cluster at the left of their row instead of being pushed apart by a flex-grow rule (#741)
- 12px vertical spacing added between the Executive Summary tile row and the critical-findings banner below it (#742)
sync-checkid.ymldeclares its CheckID release channel explicitly. Subscribes to the stable channel only; defense-in-depth verify-channel step fails the workflow if a preview-channel payload is received. Aligns with the cross-repo channel model from CheckID v0.1- Removed the local
Get-CmmcLevelsFromControlIdoverride inBuild-ReportData.ps1now that CheckID v2.22.1 publishes identity-semanticframeworks.cmmc.profilesupstream. Downstream code consumes registry values directly with zero behavioural change - Dropped "EZ-CMMC" project name from the Handoff gaps panel heading and footnote text in the report. Heading reads
Handoff gaps; footnote endstracked separately.Counts and chip behaviour unchanged (#732) - CheckID registry synced to v3.0.0 (additive
frameworks.X.sourcefield on per-framework mappings; no breaking changes for M365-Assess; all 1106 checks preserved including local extensions)
Fixed
- Posture trend was silently filtering baselines by tenant GUID while
Invoke-M365Assessmentsaves baselines with the tenant domain as the folder-name suffix.Build-SectionHtml.ps1now prefers the tenant'sDefaultDomainfrom the tenant CSV over the log-derived short-form prefix or the GUID (#733) - CMMC Level 1 and Level 2 coverage counts were identical on every tenant because CheckID's
registry.jsonuniformly tagged every CMMC-mapped check withprofiles=[L1,L2]. Build-ReportData now derives profiles from thecontrolIdstring. Observed effect on reference tenant: L1 drops from 233 to 118; L2 and L3 unchanged (now also resolved upstream in CheckID v2.22.1)