Skip to content

docs: regenerate FRAMEWORK-COVERAGE.md (unblock failing coverage-update workflow)#201

Open
ethanolivertroy wants to merge 5 commits into
mainfrom
cursor/regenerate-framework-coverage-4819
Open

docs: regenerate FRAMEWORK-COVERAGE.md (unblock failing coverage-update workflow)#201
ethanolivertroy wants to merge 5 commits into
mainfrom
cursor/regenerate-framework-coverage-4819

Conversation

@ethanolivertroy

@ethanolivertroy ethanolivertroy commented Jul 5, 2026

Copy link
Copy Markdown
Collaborator

Summary

The weekly Update framework coverage workflow has been failing for three consecutive runs with GitHub Actions is not permitted to create or approve pull requests — the regeneration succeeds but peter-evans/create-pull-request cannot open the PR because the org/repo Actions setting "Allow GitHub Actions to create and approve pull requests" is disabled.

This PR brings docs/FRAMEWORK-COVERAGE.md up to date (last generated 2026-04-18 → 2026-07-05): 15 → 28 frameworks with dedicated plugins, adding the 13 plugins shipped since April (NIS2, NIST CSF 2.0, CCPA, HIPAA Security, NERC CIP, SOX, CPS 234, Cyber Essentials Plus, DPDPA, APPI, MAS TRM, FADP, FINRA).

Review feedback on the initial regeneration surfaced three real metadata bugs, all fixed here:

  1. us-hipaa-security declared a non-existent SCF ID (US-HIPAA-Security). Corrected to the canonical usa-federal-law-hipaa-security-rule-2013 (136 SCF → 87 framework controls), including all command/skill references.
  2. cyber-essentials-plus declared emea-gbr-ce-2021, which the crosswalk doesn't publish. Corrected to emea-gbr-cyber-essentials-requirements-3-3, including all command/skill/README references.
  3. scf-client.js still claimed CSA CCM has no SCF crosswalk and refused to resolve it, while the csa-ccm plugin already declares general-csa-cmm-4-1-0 (which SCF 2026.1 publishes). Removed the stale refusal and added csa-ccm/ccm aliases. Verified: resolve('csa-ccm', 'A&A-01')GOV-02, GOV-03.

Because coverage joins plugins to SCF frameworks by exact framework_id, bugs 1–2 caused the count skew reviewers flagged (summary said 221 crosswalk-only while the regional sections summed to 223). After the fixes the regenerated doc is internally consistent: 221 = 69 + 22 + 46 + 84.

It also carries the same dead-link fix as #200 (the removed support.claude.com Cowork article → live claude.com/docs/cowork/3p/overview), because the lychee link check scans the whole repo on every PR and fails without it. The commit is identical in both PRs; whichever merges first, the other squash-merges cleanly on top.

Not changed: amaericas-can-osfi-self-assessment (CodeRabbit's typo flag) is the framework_id the SCF API actually publishes — the doc must mirror it or gap-assessment lookups break. regionFromFrameworkId() already special-cases the amaericas- prefix. The real fix belongs upstream in GRCEngClub/scf-api / SCF source data.

Type of change

  • Connector
  • Framework plugin
  • Persona plugin
  • Documentation
  • Community / governance
  • CI / automation
  • Other

Schema impact

  • No schema changes
  • schemas/finding.schema.json changed
  • Another schema or contract surface changed

Test plan

  • Regenerated with node plugins/grc-engineer/scripts/generate-coverage.js --offline against SCF 2026.1 data (cache seeded from the GRCEngClub/scf-api repo, since the pages endpoint is unreachable under this environment's restricted egress).
  • npm run test:contract, npm run test:plugin-manifests, npm run test:grc-diagrams, npm run test:contract:findings, npm run test:wiz-inspector — all pass.
  • Verified summary/regional count consistency: 221 = 69 + 22 + 46 + 84.
  • Verified csa-ccm resolution end-to-end against cached crosswalk data.

CHANGELOG

  • No CHANGELOG entry needed
  • I added a CHANGELOG entry
  • A maintainer should add the CHANGELOG entry during merge

Notes for reviewers

To let the coverage bot open these PRs itself going forward, enable Settings → Actions → General → Allow GitHub Actions to create and approve pull requests on the repo (or org). Once that's enabled, the stranded bot/regenerate-coverage branch can be deleted and this manual relay won't be needed again.

Open in Web Open in Cursor 

Summary by CodeRabbit

  • Documentation
    • Refreshed the framework coverage report with the latest generated data and updated timestamp.
    • Updated coverage summary counts and “not started” guidance to reflect current status.
    • Regenerated regional framework tables (Americas, APAC, EMEA, and Global) with updated framework listings and mapping counts.
    • Updated third-party platform guide links in the documentation to point to the newer official resources page.

@ethanolivertroy ethanolivertroy requested a review from a team as a code owner July 5, 2026 05:47
@coderabbitai

coderabbitai Bot commented Jul 5, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

This PR regenerates docs/FRAMEWORK-COVERAGE.md auto-generated content, updating the last-generated timestamp, overall coverage summary counts, and regional (Americas, APAC, EMEA, Global) framework tables with added, removed, and replaced framework rows.

Changes

Framework Coverage Documentation Update

Layer / File(s) Summary
Summary and overview counts
docs/FRAMEWORK-COVERAGE.md
Updated the “Last generated” timestamp, overall SCF coverage summary, “By depth” counts, shipped plugins table, and the “Not started” crosswalk-only framework count.
Americas regional table updates
docs/FRAMEWORK-COVERAGE.md
Updated the Americas heading count and regenerated rows for California, Canada OSFI (added self-assessment row), removed FINRA row, and updated Nevada/New York/Oregon/NNPI/SEC rows.
APAC regional table updates
docs/FRAMEWORK-COVERAGE.md
Updated the APAC heading count and regenerated China, India, Hong Kong entries, plus added South Korea (PIPA) and Taiwan (PDPA) rows.
EMEA and Global table updates
docs/FRAMEWORK-COVERAGE.md
Removed EU NIS2 and Swiss FADP rows from EMEA, updated the Global heading count, regenerated initial Global rows, and replaced NIST CSF v2.0 with NIST AI RMF/AI 600-1 rows.

Estimated code review effort: 1 (Trivial) | ~5 minutes

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly describes the main change: regenerating FRAMEWORK-COVERAGE.md to unblock the failing coverage-update workflow.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch cursor/regenerate-framework-coverage-4819

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@qodo-code-review

Copy link
Copy Markdown

PR Summary by Qodo

Docs: regenerate FRAMEWORK-COVERAGE.md (unblock coverage-update workflow)

📝 Documentation 🕐 10-20 Minutes

Grey Divider

AI Description

• Refresh FRAMEWORK-COVERAGE.md to the latest generated coverage snapshot (2026-06-28).
• Reflect newly shipped framework plugins and updated plugin-depth totals.
• Update regional “Not started” counts after moving frameworks into “Shipped plugins”.
Diagram

graph TD
  A["generate-coverage.js"] --> B["FRAMEWORK-COVERAGE.md"] --> C["Docs readers"]
  A --> D(("SCF crosswalk source"))
  subgraph Legend
    direction LR
    _file["Repo file"] ~~~ _doc["Generated doc"] ~~~ _ext(("External source"))
  end
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Enable Actions PR creation permission
  • ➕ Restores the intended weekly automation with no manual intervention
  • ➕ Keeps coverage snapshots consistently up to date
  • ➖ Requires org/repo policy change that may be disallowed for governance reasons
2. Use a PAT (or GitHub App) for create-pull-request
  • ➕ Unblocks automation without enabling broad “Actions can create PRs” permission
  • ➕ Allows tighter scoping and auditing via token/app permissions
  • ➖ Adds secret/app management overhead and rotation requirements
  • ➖ Still needs security review/approval
3. Publish generated coverage as an artifact/site instead of a PR
  • ➕ Avoids PR-creation permissions entirely
  • ➕ Can still provide discoverable, versioned snapshots
  • ➖ Moves the update mechanism away from the repo’s documentation workflow
  • ➖ Harder to review diffs inline during normal PR review

Recommendation: For this PR, cherry-picking the bot-generated markdown is the lowest-risk way to unblock the failing workflow and deliver the already-produced snapshot. For ongoing maintenance, prefer enabling PR creation permission if policy allows; otherwise use a scoped PAT/GitHub App for create-pull-request to keep the weekly regeneration automated without manual relays.

Files changed (1) +24 / -22

Documentation (1) +24 / -22
FRAMEWORK-COVERAGE.mdUpdate generated framework coverage snapshot and shipped plugin list +24/-22

Update generated framework coverage snapshot and shipped plugin list

• Refreshes the auto-generated coverage report to the 2026-06-28 snapshot, updating totals (15→28 dedicated plugins) and depth distribution (Reference 15→26, Stub 0→2). Adds newly shipped plugin namespaces/SCF IDs to the shipped list and adjusts the regional “Not started” framework counts accordingly.

docs/FRAMEWORK-COVERAGE.md

… docs link

The support.claude.com article 14680729 (Use Claude Cowork with
third-party platforms) was removed and now returns 404, which fails the
lychee link-check workflow on main and on any PR that touches README.md
or docs/CLAUDE-COWORK.md. Replace all three references with the live
official guide at https://claude.com/docs/cowork/3p/overview.

Co-authored-by: Ethan Troy <ethanolivertroy@users.noreply.github.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/FRAMEWORK-COVERAGE.md`:
- Line 103: The framework ID in the coverage table is misspelled and should
match the existing americas-* naming pattern. Update the entry for the OSFI
self-assessment row in FRAMEWORK-COVERAGE so the identifier uses the correct
spelling in the table and remains consistent with other crosswalk IDs.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: ee64a002-3afc-45be-ada8-734e42897e0f

📥 Commits

Reviewing files that changed from the base of the PR and between 42cdc08 and 47b5e57.

📒 Files selected for processing (1)
  • docs/FRAMEWORK-COVERAGE.md

Comment thread docs/FRAMEWORK-COVERAGE.md
@qodo-code-review

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (3) 📘 Rule violations (0) 📜 Skill insights (0)

Context used
✅ Compliance rules (platform): 17 rules

Grey Divider


Remediation recommended

1. Coverage totals mismatch 🐞 Bug ≡ Correctness
Description
docs/FRAMEWORK-COVERAGE.md reports 221 crosswalk-only frameworks, but the regional “Not started”
sections total 223 (70 + 22 + 47 + 84), so the published counts are internally inconsistent.
generate-coverage.js computes notStarted as totalScf - plugins.size even when some plugin
scf_framework_id values don’t match any SCF framework_id, while region counts are derived only
from exact matches.
Code

docs/FRAMEWORK-COVERAGE.md[R14-15]

+| With dedicated plugin | **28** (11.2%) |
+| Crosswalk-only (no plugin yet) | 221 |
Evidence
The doc’s Summary reports Crosswalk-only as 221, but the region headers list 70 (Americas), 22
(APAC), 47 (EMEA), and 84 (Global), which sum to 223. The generator computes notStarted from
plugins.size but region group sizes from exact framework_id membership, so any plugin SCF IDs
not present in the SCF index will reduce the Summary notStarted count without reducing the
per-region row counts.

docs/FRAMEWORK-COVERAGE.md[9-16]
docs/FRAMEWORK-COVERAGE.md[81-90]
docs/FRAMEWORK-COVERAGE.md[240-256]
plugins/grc-engineer/scripts/generate-coverage.js[84-99]
plugins/grc-engineer/scripts/generate-coverage.js[155-160]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`plugins/grc-engineer/scripts/generate-coverage.js` computes `notStarted` from `plugins.size` (unique `framework_metadata.scf_framework_id` values) without verifying those IDs exist in the SCF crosswalk index. This can make the Summary counts disagree with the per-region “Not started” section, which is built from SCF frameworks minus exact-matching plugin IDs.

## Issue Context
In the regenerated doc, `Crosswalk-only` is 221, but the region headers add up to 223. This implies at least 2 shipped plugins are being counted as “dedicated plugin” in the Summary while not actually matching any SCF crosswalk `framework_id`.

## Fix Focus Areas
- plugins/grc-engineer/scripts/generate-coverage.js[84-99]
- plugins/grc-engineer/scripts/generate-coverage.js[155-160]
- docs/FRAMEWORK-COVERAGE.md[9-16]

## Suggested fix
- When building the shipped plugin list, split plugins into:
 - **matched**: `scf_framework_id` exists in `scfFrameworks`
 - **unmatched**: `scf_framework_id` is set but not found in SCF index
- Compute `shippedCount` / `notStarted` from the **matched** set, and render a small section (or add to the existing “Shipped without SCF mapping” section) listing “Shipped plugins with unknown SCF framework_id” so the mismatch is visible and actionable.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. HIPAA SCF ID mismatch 🐞 Bug ≡ Correctness
Description
The coverage doc lists /us-hipaa-security as shipped for SCF ID US-HIPAA-Security, but
scf-client.js treats the canonical HIPAA SCF framework as
usa-federal-law-hipaa-security-rule-2013. Because downstream tooling joins shipped plugins to SCF
frameworks by exact framework_id, the HIPAA SCF entry remains listed under “Not started” despite
the plugin being shipped.
Code

docs/FRAMEWORK-COVERAGE.md[57]

+| `/us-hipaa-security:` | reference | `US-HIPAA-Security` | US HIPAA Security Rule (45 CFR Part 164, Subpart C) |
Evidence
The shipped plugins table includes US-HIPAA-Security, while the “Not started” section still
includes usa-federal-law-hipaa-security-rule-2013. The repo’s SCF client explicitly maps HIPAA to
usa-federal-law-hipaa-security-rule-2013, and the HIPAA plugin metadata uses US-HIPAA-Security,
creating an exact-ID mismatch for any code that joins on framework_id.

docs/FRAMEWORK-COVERAGE.md[45-58]
docs/FRAMEWORK-COVERAGE.md[133-137]
plugins/grc-engineer/scripts/scf-client.js[242-245]
plugins/frameworks/us-hipaa-security/.claude-plugin/plugin.json[10-17]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`plugins/frameworks/us-hipaa-security/.claude-plugin/plugin.json` declares `framework_metadata.scf_framework_id` as `US-HIPAA-Security`, but the SCF client’s canonical HIPAA mapping is `usa-federal-law-hipaa-security-rule-2013`. This prevents exact-ID joins from recognizing that HIPAA is covered, leaving HIPAA in the “Not started” list and skewing coverage totals.

## Issue Context
- Coverage doc shows shipped: `US-HIPAA-Security`.
- Same doc still lists the SCF crosswalk entry `usa-federal-law-hipaa-security-rule-2013` under “Not started”.
- `scf-client.js` canonicalizes HIPAA to `usa-federal-law-hipaa-security-rule-2013`.

## Fix Focus Areas
- plugins/frameworks/us-hipaa-security/.claude-plugin/plugin.json[10-17]
- plugins/grc-engineer/scripts/scf-client.js[242-245]
- docs/FRAMEWORK-COVERAGE.md[55-58]
- docs/FRAMEWORK-COVERAGE.md[133-137]

## Suggested fix
- Update `plugins/frameworks/us-hipaa-security/.claude-plugin/plugin.json`:
 - set `framework_metadata.scf_framework_id` to `usa-federal-law-hipaa-security-rule-2013` (the canonical SCF crosswalk ID already used by `scf-client.js`).
- Re-run `node plugins/grc-engineer/scripts/generate-coverage.js` to regenerate `docs/FRAMEWORK-COVERAGE.md` and ensure the HIPAA entry disappears from “Not started” and counts reconcile.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


3. CSA CCM crosswalk conflict 🐞 Bug ⚙ Maintainability
Description
scf-client.js explicitly classifies csa-ccm as having no SCF crosswalk, yet the csa-ccm plugin
declares framework_metadata.scf_framework_id and is counted as SCF-mapped in coverage. This makes
coverage reporting inconsistent with the repo’s own SCF resolution policy and contributes to the
Summary/region count skew.
Code

docs/FRAMEWORK-COVERAGE.md[36]

| `/csa-ccm:` | reference | `general-csa-cmm-4-1-0` | Cloud Controls Matrix (CCM) (v4.1.0) |
Evidence
The SCF client’s FRAMEWORKS_WITHOUT_SCF_CROSSWALK explicitly lists csa-ccm as not present in the
SCF crosswalk index, while the CSA plugin metadata declares an SCF ID anyway. The coverage
generator’s Summary counts are derived from plugins.size (all plugins with any
scf_framework_id), so this inconsistency affects reported coverage.

plugins/grc-engineer/scripts/scf-client.js[278-286]
plugins/frameworks/csa-ccm/.claude-plugin/plugin.json[10-17]
plugins/grc-engineer/scripts/generate-coverage.js[84-99]
docs/FRAMEWORK-COVERAGE.md[32-37]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The repo has conflicting sources of truth for CSA CCM:
- `scf-client.js` says `csa-ccm` is not in the SCF crosswalk index.
- `plugins/frameworks/csa-ccm/.claude-plugin/plugin.json` declares an SCF framework_id (`general-csa-cmm-4-1-0`).
- `generate-coverage.js` counts any plugin with `scf_framework_id` as SCF-mapped, even if it doesn’t exist in the SCF index.

## Issue Context
This inconsistency makes the generated coverage doc disagree with SCF-client’s behavior/policy and can skew coverage totals.

## Fix Focus Areas
- plugins/grc-engineer/scripts/scf-client.js[278-286]
- plugins/frameworks/csa-ccm/.claude-plugin/plugin.json[10-17]
- plugins/grc-engineer/scripts/generate-coverage.js[84-99]

## Suggested fix
Choose one consistent path:
1) **If CSA CCM truly has no SCF crosswalk**: remove `framework_metadata.scf_framework_id` from the CSA plugin (or set it to null) so it is treated as “Shipped without SCF mapping”, and regenerate coverage.
2) **If CSA CCM now has an SCF crosswalk**: update `scf-client.js` to remove `csa-ccm` from `FRAMEWORKS_WITHOUT_SCF_CROSSWALK` and verify the SCF `framework_id` is correct.

Additionally, harden `generate-coverage.js` to only count SCF IDs that exist in the SCF frameworks index (see finding #1).

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Qodo Logo

Comment thread docs/FRAMEWORK-COVERAGE.md
Comment thread docs/FRAMEWORK-COVERAGE.md Outdated
Comment thread docs/FRAMEWORK-COVERAGE.md
@greptile-apps

greptile-apps Bot commented Jul 5, 2026

Copy link
Copy Markdown

Greptile Summary

This PR delivers the auto-generated FRAMEWORK-COVERAGE.md update that the weekly bot workflow could not open as a PR (GitHub Actions PR creation is disabled), and bundles two correctness fixes that were prerequisites for a clean generation.

  • Coverage regeneration: 15 → 28 shipped plugins (13 new: NIS2, NIST CSF 2.0, CCPA, HIPAA Security, NERC CIP, SOX, CPS 234, Cyber Essentials Plus, DPDPA, APPI, MAS TRM, FADP, FINRA); all regional section totals (69+22+46+84=221) now agree with the summary line, resolving both count discrepancies flagged in the previous review.
  • SCF ID fixes: us-hipaa-security corrected from non-canonical US-HIPAA-Security to usa-federal-law-hipaa-security-rule-2013; cyber-essentials-plus corrected from stale emea-gbr-ce-2021 to emea-gbr-cyber-essentials-requirements-3-3; control-count metadata in us-hipaa-security/plugin.json updated to match the SCF crosswalk (136 SCF controls, 87 framework controls).
  • scf-client.js: Adds csa-ccm/ccm aliases pointing to general-csa-cmm-4-1-0 and removes the now-incorrect "no crosswalk" error entry, unblocking /grc-engineer:gap-assessment "csa-ccm" calls.

Confidence Score: 5/5

Safe to merge — all changes are documentation updates, dead-link fixes, and SCF ID correctness fixes with no logic-bearing code changes beyond the CSA CCM alias addition in scf-client.js.

The documentation is auto-generated and its arithmetic has been independently verified (28 shipped plugins, regional totals 69+22+46+84=221, matches summary). The two SCF ID fixes resolve exactly the issues flagged in the previous review. The scf-client.js change is a straightforward alias addition that makes CSA CCM lookups work rather than returning an error; the alias points to the same ID used by the shipped /csa-ccm: plugin. No runtime paths are affected beyond that one lookup correction.

No files require special attention.

Important Files Changed

Filename Overview
docs/FRAMEWORK-COVERAGE.md Auto-generated regeneration: 15 → 28 shipped plugins; regional totals (69+22+46+84=221) now match the summary line, resolving both previously flagged count discrepancies.
plugins/frameworks/us-hipaa-security/.claude-plugin/plugin.json Corrects scf_framework_id from non-standard "US-HIPAA-Security" to canonical "usa-federal-law-hipaa-security-rule-2013"; updates control-count metadata to match SCF crosswalk numbers (136/87).
plugins/frameworks/cyber-essentials-plus/.claude-plugin/plugin.json Corrects scf_framework_id from stale "emea-gbr-ce-2021" to current canonical ID "emea-gbr-cyber-essentials-requirements-3-3".
plugins/grc-engineer/scripts/scf-client.js Adds "csa-ccm" / "ccm" aliases pointing to general-csa-cmm-4-1-0 and removes the now-incorrect "no crosswalk" entry; correctly unblocks CSA CCM lookups.
README.md Replaces two dead support.claude.com article links with the live claude.com/docs/cowork/3p/overview URL.
docs/CLAUDE-COWORK.md Same dead-link fix as README.md — support.claude.com article replaced with claude.com/docs/cowork/3p/overview.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[Weekly workflow\ngenerate-coverage.js] -->|fetches| B[SCF API\ngrcengclub.github.io/scf-api]
    B -->|249 frameworks| C[scan plugin.json\nscf_framework_id per plugin]
    C -->|match on canonical ID| D{ID in SCF catalog?}
    D -->|yes| E[Shipped plugins table\n28 frameworks]
    D -->|no - old bug| F[Plugin invisible to generator\nappears in both shipped + not-started]
    E --> G[FRAMEWORK-COVERAGE.md\nregenerated]
    G -->|PR creation blocked\nActions setting disabled| H[Manual cherry-pick\nthis PR]

    subgraph Fixes in this PR
        I[US-HIPAA-Security\n→ usa-federal-law-hipaa-security-rule-2013]
        J[emea-gbr-ce-2021\n→ emea-gbr-cyber-essentials-requirements-3-3]
        K[csa-ccm removed from\nFRAMEWORKS_WITHOUT_SCF_CROSSWALK\n+ added to FRAMEWORK_ALIASES]
    end

    I --> D
    J --> D
    K -->|fixes alias lookup| L[gap-assessment csa-ccm\nnow resolves correctly]
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
flowchart TD
    A[Weekly workflow\ngenerate-coverage.js] -->|fetches| B[SCF API\ngrcengclub.github.io/scf-api]
    B -->|249 frameworks| C[scan plugin.json\nscf_framework_id per plugin]
    C -->|match on canonical ID| D{ID in SCF catalog?}
    D -->|yes| E[Shipped plugins table\n28 frameworks]
    D -->|no - old bug| F[Plugin invisible to generator\nappears in both shipped + not-started]
    E --> G[FRAMEWORK-COVERAGE.md\nregenerated]
    G -->|PR creation blocked\nActions setting disabled| H[Manual cherry-pick\nthis PR]

    subgraph Fixes in this PR
        I[US-HIPAA-Security\n→ usa-federal-law-hipaa-security-rule-2013]
        J[emea-gbr-ce-2021\n→ emea-gbr-cyber-essentials-requirements-3-3]
        K[csa-ccm removed from\nFRAMEWORKS_WITHOUT_SCF_CROSSWALK\n+ added to FRAMEWORK_ALIASES]
    end

    I --> D
    J --> D
    K -->|fixes alias lookup| L[gap-assessment csa-ccm\nnow resolves correctly]
Loading

Reviews (2): Last reviewed commit: "docs: regenerate FRAMEWORK-COVERAGE.md w..." | Re-trigger Greptile

Comment thread docs/FRAMEWORK-COVERAGE.md
Comment thread docs/FRAMEWORK-COVERAGE.md
cursoragent and others added 3 commits July 5, 2026 06:22
…cyber-essentials-plus

- us-hipaa-security declared 'US-HIPAA-Security', which does not exist in
  the SCF crosswalk index; the canonical ID is
  usa-federal-law-hipaa-security-rule-2013 (136 SCF -> 87 framework
  controls per the 2026.1 crosswalk).
- cyber-essentials-plus declared 'emea-gbr-ce-2021'; the crosswalk
  publishes emea-gbr-cyber-essentials-requirements-3-3.

Because generate-coverage.js and gap-assessment join plugins to SCF
frameworks by exact framework_id, both plugins were invisible to the
crosswalk: coverage counted them as shipped but left their SCF entries
in the 'Not started' lists (summary said 221 crosswalk-only while the
regional sections summed to 223). Updates plugin.json metadata plus all
command/skill/README references to the old IDs.

Co-authored-by: Ethan Troy <ethanolivertroy@users.noreply.github.com>
…f refusing

FRAMEWORKS_WITHOUT_SCF_CROSSWALK claimed CSA CCM v4 was absent from the
crosswalk index, but SCF 2026.1 publishes it as general-csa-cmm-4-1-0
(291 SCF -> 207 framework controls), and the csa-ccm plugin already
declares that ID in its framework_metadata. Remove the stale refusal and
add csa-ccm/ccm aliases so resolve() and gap-assessment reach the real
crosswalk.

Verified: resolveFrameworkId('csa-ccm') -> general-csa-cmm-4-1-0 and
resolve('csa-ccm','A&A-01') -> GOV-02, GOV-03 against cached 2026.1 data.

Co-authored-by: Ethan Troy <ethanolivertroy@users.noreply.github.com>
Regenerated with generate-coverage.js against SCF 2026.1 (cache seeded
from the scf-api repo since the pages endpoint is unreachable from this
environment). Crosswalk-only total (221) now matches the sum of the
regional sections (69+22+46+84), resolving the 223-vs-221 skew flagged
in review.

Co-authored-by: Ethan Troy <ethanolivertroy@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants