Skip to content

feat(frameworks): own grouping/taxonomy upstream - fix M365-Assess sync regression + v3.5.0 render-taxonomy#411

Merged
Daren9m merged 3 commits into
mainfrom
fix/framework-grouping-metadata
Jun 14, 2026
Merged

feat(frameworks): own grouping/taxonomy upstream - fix M365-Assess sync regression + v3.5.0 render-taxonomy#411
Daren9m merged 3 commits into
mainfrom
fix/framework-grouping-metadata

Conversation

@Daren9m

@Daren9m Daren9m commented Jun 14, 2026

Copy link
Copy Markdown
Collaborator

Why

M365-Assess consumes CheckID's data/frameworks/*.json verbatim via its sync-checkid.yml workflow (see REFERENCES.md: "Fetch data/registry.json and data/frameworks/*.json from the tagged version"). The grouping/taxonomy presentation metadata that M365-Assess maintainers had hand-added downstream was never present in CheckID's source, so every sync overwrote it.

The v3.4.1 auto-sync PR Galvnyz/M365-Assess#989 dropped, among others:

  • cis-m365-v6 sections "4": "Intune" and "9": "Fabric (Power BI)"
  • the cisa-scuba groups map including MS.INTUNE
  • grouping/taxonomy metadata across ~12 more framework files

This PR makes CheckID the canonical owner of that metadata so the next sync is a no-op, and delivers the planned v3.5.0 render-taxonomy layer on top of it.

What

1. Stop the regression (fix(frameworks): carry grouping/taxonomy metadata ...)
Restore groupBy / groupLabel / groups / sections / taxonomyDecision / taxonomyReason / note to the 14 frameworks #989 regressed. Verified byte-idempotent against M365-Assess base, so re-syncing produces zero grouping diff. Relabels 31 previously-orphaned registry checks (5 Intune 4.x, 26 Power BI 9.x) under their correct CIS M365 v6 sections.

2. Backfill + completeness (feat(frameworks): backfill native grouping axes ...)
Declare native axes for the 4 frameworks that had none (#323):

framework groupBy strategy axis
iso-27017 section-prefix ISO/IEC 27002:2015 clauses 5-18
nist-800-171 nist-800-171-family (new) families 3.1-3.14 + NFO bucket
gdpr article-prefix (new) GDPR articles
nis2 article-prefix (new) NIS2 articles

Also completes PCI-DSS: adds appendix groups A1 / A2 / A3. The registry has appendix controls that the 1-12 requirement map did not cover (a latent "Other" bucket on the M365-Assess side too).

3. Contract + enforcement (feat(frameworks): formalize render-taxonomy schema keys ...)
Formalize the render-taxonomy keys in data/frameworks.schema.json (#407): groupBy (enum of 9 strategies), groupLabel, groups / sections / controls, taxonomyDecision, taxonomyReason. additionalProperties stays true; all 20 framework files validate. Add tests/framework-grouping-coverage.Tests.ps1 asserting every registry controlId resolves to a declared group for each groupBy framework.

New contract vocabulary (please review)

Two new groupBy strategy names join the cross-repo contract; consumers that render native grouping must implement them:

  • article-prefix -- ^Article\s+(\d+) -> article number (gdpr, nis2)
  • nist-800-171-family -- NFO* -> NFO, else first two dot-segments (3.12.1 -> 3.12)

Testing

  • 409 Pester tests pass (was 377; +32 from the new coverage test), 0 failures.
  • All 20 framework files validate against the updated frameworks.schema.json.
  • Idempotency confirmed: every edited file's grouping/taxonomy keys equal M365-Assess base.
  • Group coverage: every groupBy framework's map covers 100% of registry controlId prefixes.

Rollout

Closes #318, #319, #320, #321, #322, #323, #407
Refs #317, #324, Galvnyz/M365-Assess#989

Daren9m added 3 commits June 13, 2026 21:37
…stops regressing it

M365-Assess consumes data/frameworks/*.json verbatim via sync-checkid.yml, but its
hand-added grouping/taxonomy presentation metadata (groupBy, groupLabel, groups,
sections, taxonomyDecision, taxonomyReason, note) was absent from CheckID's source —
so every sync (e.g. Galvnyz/M365-Assess#989 for v3.4.1) overwrote it, dropping CIS
M365 v6 sections "4: Intune" and "9: Fabric (Power BI)", the SCuBA groups map (incl.
MS.INTUNE), and grouping metadata across 12 other frameworks.

Port the enrichment upstream so CheckID is the complete source of truth and the next
sync is a no-op for these keys. Also relabels 31 previously-orphaned registry checks
(5 Intune 4.x, 26 Power BI 9.x) under their correct CIS M365 v6 sections.

No schema change (frameworks.schema.json already permits these via additionalProperties).
Idempotency verified against M365-Assess base for all 14 files; 377 Pester tests pass.
…pendices

Declare render-taxonomy grouping for the 4 frameworks that had none (#323) and
close a latent coverage gap in PCI-DSS:

- iso-27017: section-prefix axis (ISO/IEC 27002:2015 clauses 5-18)
- nist-800-171: family axis (3.1-3.14 NIST 800-171 R2 families + NFO bucket;
  new groupBy strategy "nist-800-171-family")
- gdpr / nis2: article axis (new groupBy strategy "article-prefix")
- pci-dss: add appendix groups A1/A2/A3 — registry has appendix controls the
  1-12 requirement map did not cover (would have landed in downstream "Other")

Every declared group map covers 100% of the controlId prefixes present in
data/registry.json (verified by the new group-coverage test).
…age test

Resolves the schema half of the render-taxonomy contract (#407): declare the
optional keys groupBy (enum of 9 parser strategies), groupLabel, groups,
sections, controls, taxonomyDecision, taxonomyReason in data/frameworks.schema.json
(additionalProperties stays true; no existing file breaks — all 20 validate).

Add tests/framework-grouping-coverage.Tests.ps1: for every framework that
declares a groupBy, assert each registry controlId resolves to a declared group
key via that strategy's parser. Satisfies the "every controlId resolves to a
declared family" acceptance criterion shared by #318-#322. 409 Pester tests pass.
@github-actions

Copy link
Copy Markdown

Content enrichment population

Overall (1106 checks): rationale 26.4% (292/1106) • impact 26.4% (292/1106) • references 26.4% (292/1106)

Framework n rationale impact references
cis-controls-v8 1021 25.2% (257/1021) 25.2% (257/1021) 25.2% (257/1021)
cis-m365-v6 167 100.0% (167/167) 100.0% (167/167) 100.0% (167/167)
cisa-scuba 52 100.0% (52/52) 100.0% (52/52) 100.0% (52/52)
cmmc 1081 26.4% (285/1081) 26.4% (285/1081) 26.4% (285/1081)
eidsca 21 100.0% (21/21) 100.0% (21/21) 100.0% (21/21)
essential-eight 631 22.3% (141/631) 22.3% (141/631) 22.3% (141/631)
fedramp 1073 27.2% (292/1073) 27.2% (292/1073) 27.2% (292/1073)
gdpr 11 100.0% (11/11) 100.0% (11/11) 100.0% (11/11)
hipaa 502 33.5% (168/502) 33.5% (168/502) 33.5% (168/502)
iso-27001 1021 26.6% (272/1021) 26.6% (272/1021) 26.6% (272/1021)
iso-27002 1021 26.6% (272/1021) 26.6% (272/1021) 26.6% (272/1021)
iso-27017 1013 26.1% (264/1013) 26.1% (264/1013) 26.1% (264/1013)
mitre-attack 893 30.8% (275/893) 30.8% (275/893) 30.8% (275/893)
nis2 311 25.7% (80/311) 25.7% (80/311) 25.7% (80/311)
nist-800-171 1081 26.4% (285/1081) 26.4% (285/1081) 26.4% (285/1081)
nist-800-53 1073 27.2% (292/1073) 27.2% (292/1073) 27.2% (292/1073)
nist-csf 827 31.2% (258/827) 31.2% (258/827) 31.2% (258/827)
pci-dss 1053 26.4% (278/1053) 26.4% (278/1053) 26.4% (278/1053)
soc2 1104 26.4% (292/1104) 26.4% (292/1104) 26.4% (292/1104)
stig 13 100.0% (13/13) 100.0% (13/13) 100.0% (13/13)

Informational only — does not gate the build. The hard release-gate for Critical/High enrichment lives in #281 (v3.2.0).

@github-actions

Copy link
Copy Markdown

Framework mapping count delta

Framework main this PR Δ Δ% Status
cis-controls-v8 1021 1021 0 +0.00% ✓ OK
cis-m365-v6 167 167 0 +0.00% ✓ OK
cisa-scuba 52 52 0 +0.00% ✓ OK
cmmc 1081 1081 0 +0.00% ✓ OK
eidsca 21 21 0 +0.00% ✓ OK
essential-eight 631 631 0 +0.00% ✓ OK
fedramp 1073 1073 0 +0.00% ✓ OK
gdpr 11 11 0 +0.00% ✓ OK
hipaa 502 502 0 +0.00% ✓ OK
iso-27001 1021 1021 0 +0.00% ✓ OK
iso-27002 1021 1021 0 +0.00% ✓ OK
iso-27017 1013 1013 0 +0.00% ✓ OK
mitre-attack 893 893 0 +0.00% ✓ OK
nis2 311 311 0 +0.00% ✓ OK
nist-800-171 1081 1081 0 +0.00% ✓ OK
nist-800-53 1073 1073 0 +0.00% ✓ OK
nist-csf 827 827 0 +0.00% ✓ OK
pci-dss 1053 1053 0 +0.00% ✓ OK
soc2 1104 1104 0 +0.00% ✓ OK
stig 13 13 0 +0.00% ✓ OK

Result: ✓ PASS — no framework mapping regressions detected.

@Daren9m Daren9m merged commit 929af99 into main Jun 14, 2026
9 checks passed
@Daren9m Daren9m deleted the fix/framework-grouping-metadata branch June 14, 2026 05:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

enhancement: declare CMMC practice-family axis (16 NIST 800-171 families)

1 participant