Add OWASP AISVS 1.0 mapping across all three source lists (25 → 26 frameworks) - #94
Merged
Merged
Conversation
Ports the AISVS 1.0 mapping authored by Otto Sulin (AISVS co-lead) in GenAI-Security-Project/GenAI-Data-Security-Initiative#64 (squash d0c4ff5) into this repo. Only the hand-authored sources were carried over; every generated file was regenerated here. Ported: agentic-top10/Agentic_AISVS.md 83 rows, ASI01–ASI10 dsgai-2026/DSGAI_AISVS.md 141 rows, DSGAI01–DSGAI21 data/frameworks/owasp-aisvs.json 191 requirements Not ported: llm-top10/LLM_AISVS.md (74 rows). It maps the LLM Top 10 2025; this repo targets the 2026 list, where eight entries changed number and LLM08/LLM10 were re-scoped (MIGRATION.md). Re-keying it is an SME call, not a mechanical port, so it is left for follow-up. Adaptations, mapping rows unchanged: - "LLM Top 10:" cross-references in both files renumbered 2025 → 2026 with the MIGRATION.md map (91 ids). generate.js unions these into entries' crossrefs.llm_top10, so leaving them would have attached wrong LLM ids to ASI and DSGAI entries. - Header block, H1, source-list links and footer aligned with sibling files; prose wrapped to 120 columns and blank lines added before lists for markdownlint; changelog row added. - Registry: `kind: control` on all 191 items and an inventory_completeness block (status complete, 191/191), required by framework-schema.json and stats.js. Requirement ids, text and levels re-verified against OWASP/AISVS 1.0/en today: 191/191 identical. Registration, mirroring 2338d1a: FRAMEWORK_FILES in generate.js; framework-sources.json (checked 2026-09-14, current 1.0); AISVS in inventory-completeness COMPLETE_BY_DEFINITION so `npm run inventory` does not downgrade it; REPORT_FRAMEWORKS/FW_META in compliance-report.js; README matrix, file tables and tree; webapp, agentic landing, standards-crosswalk page and llms.txt framework counts; package.json description; FRESHNESS_SLA; CHANGELOG. Regenerated: data/entries (31), backlinks, docs bundles, stats.json and README markers. Counts: 3,497 → 3,721 mappings, 74 → 76 mapping files, 25 → 26 frameworks mapped and registered, 1,372 → 1,563 controls, freshness 2 → 3 current. validate.js: 0 errors, warning set identical to main. Tests 50/50. Co-authored-by: Otto Sulin <ottosulin@users.noreply.github.com> Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KJVKF6raJCNKBWjTkDSqR4
Re-key Otto Sulin's LLM Top 10 x AISVS mapping from the 2025 list to the 2026 list per MIGRATION.md: sections renumbered and renamed, cross- references renumbered, severities re-baselined. Add eight requirements for the 2026 scope changes: LLM01 cross-modal (2.2.3, 2.2.4), LLM04 artifact provenance (3.1.1, 3.1.3), LLM05 fine-tuning subversion (6.1.2, 3.5.1), LLM08 hidden context (10.2.4), LLM10 generated code (9.3.7). Merge main (#91, #92) and regenerate entries, backlinks, bundles and stats: 3,803 mappings, 77 mapping files, 26 frameworks. Co-authored-by: Otto Sulin <ottosulin@users.noreply.github.com> Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KJVKF6raJCNKBWjTkDSqR4
emmanuelgjr
added a commit
that referenced
this pull request
Sep 14, 2026
Conflicts only in docs/backlinks.js and docs/frameworks-registry.js, both generated: #94 regenerated them with a `// Generated:` date header that this branch removes. Resolved by re-running scripts/generate.js on the merged sources; the CI generated-output assertion passes locally. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014SfR2YzLxRH54DAVzDk8gR
emmanuelgjr
added a commit
that referenced
this pull request
Sep 14, 2026
#37 landed as a squash, so this branch's copies of its commits resolve as identical content. Generated files re-run on the merged sources; a second generation is byte-identical. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014SfR2YzLxRH54DAVzDk8gR
emmanuelgjr
added a commit
that referenced
this pull request
Sep 14, 2026
#37 landed as a squash, so this branch's copies of its commits resolve as identical content. Generated files re-run on the merged sources; a second generation is byte-identical. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014SfR2YzLxRH54DAVzDk8gR
emmanuelgjr
added a commit
that referenced
this pull request
Sep 14, 2026
#37 landed as a squash, so this branch's copies of its commits resolve as identical content. Generated files re-run on the merged sources; a second generation is byte-identical. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014SfR2YzLxRH54DAVzDk8gR
emmanuelgjr
added a commit
that referenced
this pull request
Sep 14, 2026
#37 landed as a squash, so this branch's copies of its commits resolve as identical content. Generated files re-run on the merged sources; a second generation is byte-identical. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014SfR2YzLxRH54DAVzDk8gR
emmanuelgjr
added a commit
that referenced
this pull request
Sep 15, 2026
One hand-resolved conflict, docs/index.html: #94 changed the About paragraph to "26 industry frameworks with 3,803 individual control mappings" while this branch had changed the same sentence to 3,475. Kept #94's sentence and set the count to the merged data's own total, 3,781 (= 3,803 minus the 22 junk rows this branch removes, all on DSGAI21; 0 rows added). Generated files re-run on the merged sources; a second generation is byte-identical. validate 0 errors; stats current. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014SfR2YzLxRH54DAVzDk8gR
emmanuelgjr
added a commit
that referenced
this pull request
Sep 15, 2026
…uracy Generated files re-run on the merged sources; a second generation is byte-identical. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014SfR2YzLxRH54DAVzDk8gR
emmanuelgjr
added a commit
that referenced
this pull request
Sep 15, 2026
Generated files re-run on the merged sources; a second generation is byte-identical. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014SfR2YzLxRH54DAVzDk8gR
emmanuelgjr
added a commit
that referenced
this pull request
Sep 15, 2026
No conflicts. The one intermittent local test failure seen during verification is the pre-existing data/entries read/write race (Unexpected end of JSON input), fixed by #87; captured and confirmed, not caused by this merge. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014SfR2YzLxRH54DAVzDk8gR
emmanuelgjr
added a commit
that referenced
this pull request
Sep 15, 2026
No conflicts. The one intermittent local test failure seen during verification is the pre-existing data/entries read/write race (Unexpected end of JSON input), fixed by #87; captured and confirmed, not caused by this merge. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014SfR2YzLxRH54DAVzDk8gR
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
This adds OWASP AISVS 1.0 as a mapped framework, taking the count from 25 to 26.
data/frameworks/owasp-aisvs.json: all 191 AISVS 1.0 requirements, one control each, inventorycompleteagentic-top10/Agentic_AISVS.md: 83 mappings, ASI01–ASI10dsgai-2026/DSGAI_AISVS.md: 141 mappings, DSGAI01–DSGAI21llm-top10/LLM_AISVS.md: 82 mappings, LLM01–LLM10. The source's 74 rows were re-keyed to 2026, and 8 rows were added; see belowThat's 306 mappings over 41 entries.
The totals move from 3,497 to 3,803 mappings, 74 to 77 mapping files, 25 to 26 frameworks (both mapped and registered), 1,372 to 1,563 controls, and 2 to 3 "current" in the freshness count.
Compatibility findings
LLM Top 10: re-keyed to 2026.
LLM_AISVS.mdwas written against the 2025 list. It was moved to the 2026 list using the MIGRATION.md map in a single pass:Sections were renumbered and renamed (LLM03 Excessive Agency, LLM04 Supply Chain, LLM08 Hidden Context Exposure, LLM10 Improper Output Handling, and so on).
Cross-references were renumbered.
Severities follow the 2026 re-baselining (LLM03 Critical, LLM06 and LLM07 High).
Otto's 74 rows are otherwise unchanged. The 2026 scope changes add 8 AISVS requirements, each marked
(2026 scope)in its row:@ottosulin, a review of the 8 added rows would be welcome.
ASI and DSGAI: IDs and names match exactly (all 31 checked). Header block, H1, source-list links and footer now match the sibling files.
LLM cross-references inside the ASI/DSGAI files were renumbered from 2025 to 2026 using the MIGRATION.md map (91 IDs).
generate.jsmerges these intocrossrefs.llm_top10, so leaving them as they were would have attached the wrong LLM IDs to ASI and DSGAI entries.The registry format has changed since the source was written.
framework-schema.jsonnow requireskindon every control andstats.jsthrows without it.kind: controlwas added to all 191 items, plus aninventory_completenessblock. The file validates with ajv against the schema and withingest-framework.mjs --validate.Checked against upstream: requirement IDs, text and levels match
OWASP/AISVS1.0/enon 2026-09-14 for all 191.markdownlint: prose is wrapped to 120 columns and blank lines were added before lists. The mapping rows themselves are unchanged. The generated AISVS rows match the monorepo output field for field (
control_id,control_name,tier,scope,notes).Registration (following 2338d1a)
FRAMEWORK_FILESingenerate.jsframework-sources.jsonentryCOMPLETE_BY_DEFINITIONininventory-completeness.js, sonpm run inventorydoesn't downgrade AISVS tounknownREPORT_FRAMEWORKSandFW_METAincompliance-report.jsdocs/index.html, the agentic landing page,ai-standards-crosswalk(new table row, and its stale 23 / 3,211 figures corrected) andllms.txtpackage.jsondescription, FRESHNESS_SLA, CHANGELOGThe i18n READMEs are older snapshots (they don't list CoSAI either), so I left them alone.
Verification
Re-run after merging
main(#91, #92) and adding the LLM file:validate.jspasses,stats:checkis current, unit tests pass 50/50, a second generator run leaves no drift, and markdownlint is clean on the changed files.node scripts/generate.js: 10/10 and 21/21 entries extracted, 0 WARN. A second run leaves no diff indata/entries,docs/data.jsordocs/incidents.js.npm run stats:checkpasses, andgit diff --exit-code -- README.md data/stats.jsonis clean.node scripts/validate.js: 0 errors. The warning set is identical to main (84), with 312 → 320 checks passed.npm run test:scripts: 50/50, and the tree is clean afterwards. One earlier run hit a parallel-run race:exports.testread an entry file whilegenerate.testwas rewriting it. It passed on re-run and with--test-concurrency=1.inventory-completeness --checkpasses.Merge notes
data/entries/*,data/backlinks.json,docs/*.jsandstats.json. Expect conflicts in generated files. Resolve them by re-runningnode scripts/generate.js && npm run statson the merged tree, not by editing by hand.Generated:date in the docs bundles makes the generator CI job date-dependent (T-ENG03: make the webapp data bundles deterministic #37).Ported from GenAI-Security-Project/GenAI-Data-Security-Initiative#64 by @ottosulin (that copy of crosswalk/ has since been removed)
🤖 Generated with Claude Code
https://claude.ai/code/session_01KJVKF6raJCNKBWjTkDSqR4