@blamejs/exceptd-skills 0.13.63 → 0.13.65
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +2 -2
- package/CHANGELOG.md +8 -0
- package/CONTEXT.md +2 -2
- package/README.md +2 -2
- package/data/_indexes/_meta.json +14 -14
- package/data/_indexes/activity-feed.json +157 -157
- package/data/_indexes/catalog-summaries.json +2 -2
- package/data/_indexes/currency.json +46 -46
- package/data/_indexes/handoff-dag.json +9 -5
- package/data/_indexes/section-offsets.json +64 -64
- package/data/_indexes/summary-cards.json +23 -23
- package/data/_indexes/token-budget.json +54 -54
- package/data/cwe-catalog.json +2 -2
- package/data/d3fend-catalog.json +2 -2
- package/manifest.json +184 -93
- package/package.json +1 -1
- package/sbom.cdx.json +59 -44
- package/scripts/audit-cross-skill.js +6 -1
- package/scripts/builders/catalog-summaries.js +2 -2
- package/scripts/sync-manifest-metadata.js +88 -0
- package/skills/age-gates-child-safety/skill.md +1 -1
- package/skills/ai-attack-surface/skill.md +1 -1
- package/skills/ai-c2-detection/skill.md +1 -1
- package/skills/attack-surface-pentest/skill.md +1 -1
- package/skills/defensive-countermeasure-mapping/skill.md +2 -2
- package/skills/dlp-gap-analysis/skill.md +1 -1
- package/skills/mcp-agent-trust/skill.md +1 -1
- package/skills/rag-pipeline-security/skill.md +1 -1
- package/skills/researcher/skill.md +4 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@blamejs/exceptd-skills",
|
|
3
|
-
"version": "0.13.
|
|
3
|
+
"version": "0.13.65",
|
|
4
4
|
"description": "AI security skills grounded in mid-2026 threat reality, not stale framework documentation. 42 skills, 11 catalogs (312 CVEs / 171 CWEs / 805 ATT&CK + ICS / 170 ATLAS / 468 D3FEND / 7476 RFCs), 35 jurisdictions, 10-class catalog gap detector + budget gate, real XML parser + canonical-form diff + content-pattern regression detection, Ed25519-signed.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai-security",
|
package/sbom.cdx.json
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
{
|
|
2
2
|
"bomFormat": "CycloneDX",
|
|
3
3
|
"specVersion": "1.6",
|
|
4
|
-
"serialNumber": "urn:uuid:
|
|
4
|
+
"serialNumber": "urn:uuid:98b472c4-9438-4efb-bf8e-4776acac888d",
|
|
5
5
|
"version": 1,
|
|
6
6
|
"metadata": {
|
|
7
|
-
"timestamp": "
|
|
7
|
+
"timestamp": "2107-03-10T08:18:12.000Z",
|
|
8
8
|
"tools": [
|
|
9
9
|
{
|
|
10
10
|
"vendor": "blamejs",
|
|
11
11
|
"name": "scripts/refresh-sbom.js",
|
|
12
|
-
"version": "0.13.
|
|
12
|
+
"version": "0.13.65"
|
|
13
13
|
}
|
|
14
14
|
],
|
|
15
15
|
"component": {
|
|
16
|
-
"bom-ref": "pkg:npm/@blamejs/exceptd-skills@0.13.
|
|
16
|
+
"bom-ref": "pkg:npm/@blamejs/exceptd-skills@0.13.65",
|
|
17
17
|
"type": "application",
|
|
18
18
|
"name": "@blamejs/exceptd-skills",
|
|
19
|
-
"version": "0.13.
|
|
19
|
+
"version": "0.13.65",
|
|
20
20
|
"description": "AI security skills grounded in mid-2026 threat reality, not stale framework documentation. 42 skills, 11 catalogs (312 CVEs / 171 CWEs / 805 ATT&CK + ICS / 170 ATLAS / 468 D3FEND / 7476 RFCs), 35 jurisdictions, 10-class catalog gap detector + budget gate, real XML parser + canonical-form diff + content-pattern regression detection, Ed25519-signed.",
|
|
21
21
|
"licenses": [
|
|
22
22
|
{
|
|
@@ -25,17 +25,17 @@
|
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
27
|
],
|
|
28
|
-
"purl": "pkg:npm/%40blamejs/exceptd-skills@0.13.
|
|
28
|
+
"purl": "pkg:npm/%40blamejs/exceptd-skills@0.13.65",
|
|
29
29
|
"hashes": [
|
|
30
30
|
{
|
|
31
31
|
"alg": "SHA-256",
|
|
32
|
-
"content": "
|
|
32
|
+
"content": "2891a0efb6d7e83bbb9fef4c129bdb077e010a8ab5ffa97b628c8fb14ebfba1a"
|
|
33
33
|
}
|
|
34
34
|
],
|
|
35
35
|
"externalReferences": [
|
|
36
36
|
{
|
|
37
37
|
"type": "distribution",
|
|
38
|
-
"url": "https://www.npmjs.com/package/@blamejs/exceptd-skills/v/0.13.
|
|
38
|
+
"url": "https://www.npmjs.com/package/@blamejs/exceptd-skills/v/0.13.65"
|
|
39
39
|
},
|
|
40
40
|
{
|
|
41
41
|
"type": "vcs",
|
|
@@ -101,11 +101,11 @@
|
|
|
101
101
|
"hashes": [
|
|
102
102
|
{
|
|
103
103
|
"alg": "SHA-256",
|
|
104
|
-
"content": "
|
|
104
|
+
"content": "c53e00aca85205cfae25eba8f333e64f43e48823013cdc1e4f4dcdd8260ddfe7"
|
|
105
105
|
},
|
|
106
106
|
{
|
|
107
107
|
"alg": "SHA3-512",
|
|
108
|
-
"content": "
|
|
108
|
+
"content": "d7a884c53b790f39f8d487d07dfc4b75f56d433639e8cc7c592e1d6fa830b02a7fa82c32164264132b08342a082245d2396edf90884813cdeca1d79591ed0b75"
|
|
109
109
|
}
|
|
110
110
|
]
|
|
111
111
|
},
|
|
@@ -116,11 +116,11 @@
|
|
|
116
116
|
"hashes": [
|
|
117
117
|
{
|
|
118
118
|
"alg": "SHA-256",
|
|
119
|
-
"content": "
|
|
119
|
+
"content": "e81da1ef936ded554f744006bc412bc1f21006b04c50c78281de27c49493de95"
|
|
120
120
|
},
|
|
121
121
|
{
|
|
122
122
|
"alg": "SHA3-512",
|
|
123
|
-
"content": "
|
|
123
|
+
"content": "b358df8eb236f0abb2f6d36df5fba03afdd82002acbe9ac6015f4743c7de15f86d7946c3a79035b66d4109a167ffafd88b278d7445ecbd41356ace93922096b5"
|
|
124
124
|
}
|
|
125
125
|
]
|
|
126
126
|
},
|
|
@@ -131,11 +131,11 @@
|
|
|
131
131
|
"hashes": [
|
|
132
132
|
{
|
|
133
133
|
"alg": "SHA-256",
|
|
134
|
-
"content": "
|
|
134
|
+
"content": "2d41c604ecdc5fb61271bdf7ccb758b549f7587779952dc16e7675ec3bc4c634"
|
|
135
135
|
},
|
|
136
136
|
{
|
|
137
137
|
"alg": "SHA3-512",
|
|
138
|
-
"content": "
|
|
138
|
+
"content": "e9d808d434d7572ac408a7505d07904de20b4990176c1e802cebcb583a100ecb3b311e9742dcbba4f58478b0696751b4080d290f263a9bff2fbcbff6a0ca5971"
|
|
139
139
|
}
|
|
140
140
|
]
|
|
141
141
|
},
|
|
@@ -176,11 +176,11 @@
|
|
|
176
176
|
"hashes": [
|
|
177
177
|
{
|
|
178
178
|
"alg": "SHA-256",
|
|
179
|
-
"content": "
|
|
179
|
+
"content": "fcd1276c6ad9327cf34adfaf5f6d08fcbd4686ceac0d70db1fa315b287dd20b6"
|
|
180
180
|
},
|
|
181
181
|
{
|
|
182
182
|
"alg": "SHA3-512",
|
|
183
|
-
"content": "
|
|
183
|
+
"content": "5b9b1fb6eac22b50e062d96b28fe346d0bb7008f799a1de44ad91b68fdf32525b94e9dc73a5e7de202d6040b8fa49bae1e45aec7d99fb28af50b007ac3794143"
|
|
184
184
|
}
|
|
185
185
|
]
|
|
186
186
|
},
|
|
@@ -341,11 +341,11 @@
|
|
|
341
341
|
"hashes": [
|
|
342
342
|
{
|
|
343
343
|
"alg": "SHA-256",
|
|
344
|
-
"content": "
|
|
344
|
+
"content": "4cb1193c4e20ddd3f480a7f421f28e3472b856b0c070761a0fe149a64c90fa8e"
|
|
345
345
|
},
|
|
346
346
|
{
|
|
347
347
|
"alg": "SHA3-512",
|
|
348
|
-
"content": "
|
|
348
|
+
"content": "d956f305004ecb8a04e3aa6405679ac02500a453af0092ddcaf1291b7e31c9032ab2c537f794a5c11beed1ef2987f30defa32d9b97f357165edfbb080e7e11a1"
|
|
349
349
|
}
|
|
350
350
|
]
|
|
351
351
|
},
|
|
@@ -356,11 +356,11 @@
|
|
|
356
356
|
"hashes": [
|
|
357
357
|
{
|
|
358
358
|
"alg": "SHA-256",
|
|
359
|
-
"content": "
|
|
359
|
+
"content": "9a54bccb9f24f84b32024216cc3f53819a053721ac8ab43c326859e68fc0ffaf"
|
|
360
360
|
},
|
|
361
361
|
{
|
|
362
362
|
"alg": "SHA3-512",
|
|
363
|
-
"content": "
|
|
363
|
+
"content": "30e0c721b086eabb1445b99a945d25b0ace33b2c03aa0a4fe7c2cc9d87247a5344b12b9fc33a52ffcc805712f27273f125989439fbe8fba1f35d1946f14c968b"
|
|
364
364
|
}
|
|
365
365
|
]
|
|
366
366
|
},
|
|
@@ -1661,11 +1661,11 @@
|
|
|
1661
1661
|
"hashes": [
|
|
1662
1662
|
{
|
|
1663
1663
|
"alg": "SHA-256",
|
|
1664
|
-
"content": "
|
|
1664
|
+
"content": "3d668e206d800377a1ea731e226e36dd4b5aa02f4e608d07cdb87d323b5ad409"
|
|
1665
1665
|
},
|
|
1666
1666
|
{
|
|
1667
1667
|
"alg": "SHA3-512",
|
|
1668
|
-
"content": "
|
|
1668
|
+
"content": "8b04b5b6925d6b6a36b17a810c22bdacd0ecf311b83da45d0d1b0e1645e7cea3e7683806c30c7b45ea0d543c0c3bd25d042b51b92b69edb332092ecb6daf2804"
|
|
1669
1669
|
}
|
|
1670
1670
|
]
|
|
1671
1671
|
},
|
|
@@ -1796,11 +1796,11 @@
|
|
|
1796
1796
|
"hashes": [
|
|
1797
1797
|
{
|
|
1798
1798
|
"alg": "SHA-256",
|
|
1799
|
-
"content": "
|
|
1799
|
+
"content": "94d280168dbf61199f0fb46175558db3da6e4df3fc68600c2ccd1638e9caa667"
|
|
1800
1800
|
},
|
|
1801
1801
|
{
|
|
1802
1802
|
"alg": "SHA3-512",
|
|
1803
|
-
"content": "
|
|
1803
|
+
"content": "b51f7a6020f6ea435fb49a09598a1ed609c70d54d542f330385d9480aa3d93ec9b76c14d8d6907100157ef8af7df5b0b59232425ff18c365c677643d573f9b00"
|
|
1804
1804
|
}
|
|
1805
1805
|
]
|
|
1806
1806
|
},
|
|
@@ -1886,11 +1886,11 @@
|
|
|
1886
1886
|
"hashes": [
|
|
1887
1887
|
{
|
|
1888
1888
|
"alg": "SHA-256",
|
|
1889
|
-
"content": "
|
|
1889
|
+
"content": "4cafae018d02d6bca7a037b8131e66f40dc36620c919de69d9522705077aa2c2"
|
|
1890
1890
|
},
|
|
1891
1891
|
{
|
|
1892
1892
|
"alg": "SHA3-512",
|
|
1893
|
-
"content": "
|
|
1893
|
+
"content": "f82d6a2dc910d461647dd1bb5b16674cc8709bc4c62c4d8d5e71e495d6925e544e76fb217ca74de8f93022fcf1051988027c5272fcde05c3be1eb62f26bbbe42"
|
|
1894
1894
|
}
|
|
1895
1895
|
]
|
|
1896
1896
|
},
|
|
@@ -2359,6 +2359,21 @@
|
|
|
2359
2359
|
}
|
|
2360
2360
|
]
|
|
2361
2361
|
},
|
|
2362
|
+
{
|
|
2363
|
+
"bom-ref": "file:scripts/sync-manifest-metadata.js",
|
|
2364
|
+
"type": "file",
|
|
2365
|
+
"name": "scripts/sync-manifest-metadata.js",
|
|
2366
|
+
"hashes": [
|
|
2367
|
+
{
|
|
2368
|
+
"alg": "SHA-256",
|
|
2369
|
+
"content": "fff6e7b8d8d50d30fa8839bf529fb7551f4b78541d7dddc2613064bff4a0cc8b"
|
|
2370
|
+
},
|
|
2371
|
+
{
|
|
2372
|
+
"alg": "SHA3-512",
|
|
2373
|
+
"content": "b1adf63200cf14cbd6757c963e3f4c67342ed3db9ee33ae73dcaf5e34a00c862d2d40f5be26af0acd274eb7855481c4ab6ee7638253b7e94af9c92572e1110d8"
|
|
2374
|
+
}
|
|
2375
|
+
]
|
|
2376
|
+
},
|
|
2362
2377
|
{
|
|
2363
2378
|
"bom-ref": "file:scripts/validate-vendor-online.js",
|
|
2364
2379
|
"type": "file",
|
|
@@ -2396,11 +2411,11 @@
|
|
|
2396
2411
|
"hashes": [
|
|
2397
2412
|
{
|
|
2398
2413
|
"alg": "SHA-256",
|
|
2399
|
-
"content": "
|
|
2414
|
+
"content": "639b79a2724415afe9e4469202f806e5bec022c0946c9496d4e17ed73aabbe21"
|
|
2400
2415
|
},
|
|
2401
2416
|
{
|
|
2402
2417
|
"alg": "SHA3-512",
|
|
2403
|
-
"content": "
|
|
2418
|
+
"content": "50a86b044a31f3047f1cf5c01b51b71868a82b6e72a3dc500f388ebc1987df6cea1c04d7fe666dcea27a4c0ecac15ad71d5b7c11dc702f6878eb4ae6292a110c"
|
|
2404
2419
|
}
|
|
2405
2420
|
]
|
|
2406
2421
|
},
|
|
@@ -2411,11 +2426,11 @@
|
|
|
2411
2426
|
"hashes": [
|
|
2412
2427
|
{
|
|
2413
2428
|
"alg": "SHA-256",
|
|
2414
|
-
"content": "
|
|
2429
|
+
"content": "c4c1eb22a38ca7a959b5725222bab8fbd4f4044a548a93f3e288e6f698334b72"
|
|
2415
2430
|
},
|
|
2416
2431
|
{
|
|
2417
2432
|
"alg": "SHA3-512",
|
|
2418
|
-
"content": "
|
|
2433
|
+
"content": "2dd2a4ee45af9b58c779ec01b1e405c3273a149b44cd6a668c74235352f5f76eb52cca9ecb2694b54abc0738d3911ac2dfae37f18021e11f669162fae2aaf888"
|
|
2419
2434
|
}
|
|
2420
2435
|
]
|
|
2421
2436
|
},
|
|
@@ -2426,11 +2441,11 @@
|
|
|
2426
2441
|
"hashes": [
|
|
2427
2442
|
{
|
|
2428
2443
|
"alg": "SHA-256",
|
|
2429
|
-
"content": "
|
|
2444
|
+
"content": "de83dc284dc4f85a8a383c0b715ec7b9ea127ec49c3227bf4c72344bad4008ed"
|
|
2430
2445
|
},
|
|
2431
2446
|
{
|
|
2432
2447
|
"alg": "SHA3-512",
|
|
2433
|
-
"content": "
|
|
2448
|
+
"content": "cf17d7ea20823c58484171fea21dbfa1545d8b494c7b3a25b8b4517e982ca377dd3f3f0959481e0110611d405b7f8d9e28a97838843e30c1d8d94ad6dd2a549d"
|
|
2434
2449
|
}
|
|
2435
2450
|
]
|
|
2436
2451
|
},
|
|
@@ -2471,11 +2486,11 @@
|
|
|
2471
2486
|
"hashes": [
|
|
2472
2487
|
{
|
|
2473
2488
|
"alg": "SHA-256",
|
|
2474
|
-
"content": "
|
|
2489
|
+
"content": "6174a20b777a82c83941ef64d27e8c7e4091649358930ac1ba564a0ad4d9399f"
|
|
2475
2490
|
},
|
|
2476
2491
|
{
|
|
2477
2492
|
"alg": "SHA3-512",
|
|
2478
|
-
"content": "
|
|
2493
|
+
"content": "550ca5bec39365ff37bcbf607a5d06c5a59be78832c6845c7c2edc8d518a9a62d5a794728403878e303686e779da5ba2cd39e88f212bd9fe1a7a0b1427f36def"
|
|
2479
2494
|
}
|
|
2480
2495
|
]
|
|
2481
2496
|
},
|
|
@@ -2561,11 +2576,11 @@
|
|
|
2561
2576
|
"hashes": [
|
|
2562
2577
|
{
|
|
2563
2578
|
"alg": "SHA-256",
|
|
2564
|
-
"content": "
|
|
2579
|
+
"content": "dd89c729e7bbfa3c9455dec9b986455dec3c720249c559d2195179a5cbbb2933"
|
|
2565
2580
|
},
|
|
2566
2581
|
{
|
|
2567
2582
|
"alg": "SHA3-512",
|
|
2568
|
-
"content": "
|
|
2583
|
+
"content": "bf3fccad2e6e7b6027cd65c16336412e12b84fa388454b8d030ad610c3e56e17611eb815ab8288b76d3e29654b41be7db6162d868b4d6316a331fd7d1c039b29"
|
|
2569
2584
|
}
|
|
2570
2585
|
]
|
|
2571
2586
|
},
|
|
@@ -2576,11 +2591,11 @@
|
|
|
2576
2591
|
"hashes": [
|
|
2577
2592
|
{
|
|
2578
2593
|
"alg": "SHA-256",
|
|
2579
|
-
"content": "
|
|
2594
|
+
"content": "d59a136aa6478b069975b2406c4e3be4b227273641b054852ebc6eedeebd3754"
|
|
2580
2595
|
},
|
|
2581
2596
|
{
|
|
2582
2597
|
"alg": "SHA3-512",
|
|
2583
|
-
"content": "
|
|
2598
|
+
"content": "52d7570873bc806c7637e9093567e81107d9c6a675f6d7d6a208159a15c453129148e598c4999932238aaaa8fa48d068fd6fbc7119021a17a44777443cb5430f"
|
|
2584
2599
|
}
|
|
2585
2600
|
]
|
|
2586
2601
|
},
|
|
@@ -2726,11 +2741,11 @@
|
|
|
2726
2741
|
"hashes": [
|
|
2727
2742
|
{
|
|
2728
2743
|
"alg": "SHA-256",
|
|
2729
|
-
"content": "
|
|
2744
|
+
"content": "89ac89084391d2341b6513fefb1be2d36b93de1c130f057696219c1c59440f13"
|
|
2730
2745
|
},
|
|
2731
2746
|
{
|
|
2732
2747
|
"alg": "SHA3-512",
|
|
2733
|
-
"content": "
|
|
2748
|
+
"content": "dc78cd7182350ce1048e2d49cacca299fa4942e398f5d75e6e27020d04e6a4af7963d495f992594469678b8c091bd071612d40a2baa47069837497f33f7f61c6"
|
|
2734
2749
|
}
|
|
2735
2750
|
]
|
|
2736
2751
|
},
|
|
@@ -2801,11 +2816,11 @@
|
|
|
2801
2816
|
"hashes": [
|
|
2802
2817
|
{
|
|
2803
2818
|
"alg": "SHA-256",
|
|
2804
|
-
"content": "
|
|
2819
|
+
"content": "792c6f48a7ff06785c24258cac1714068feafefb3f8f05e6c62ddce2f2f9128d"
|
|
2805
2820
|
},
|
|
2806
2821
|
{
|
|
2807
2822
|
"alg": "SHA3-512",
|
|
2808
|
-
"content": "
|
|
2823
|
+
"content": "bb5b9ff697427b603bfa2aff6b06d1260cd19bdf4aca8406403061b8190e571c4b59a8d68677e9ddb4508712f5319488cdff7f689eecf517942020ed8bed7997"
|
|
2809
2824
|
}
|
|
2810
2825
|
]
|
|
2811
2826
|
},
|
|
@@ -2831,11 +2846,11 @@
|
|
|
2831
2846
|
"hashes": [
|
|
2832
2847
|
{
|
|
2833
2848
|
"alg": "SHA-256",
|
|
2834
|
-
"content": "
|
|
2849
|
+
"content": "dc8ceab8f69af370abb1165ed14ead6f3e9d236a8f703165eba52014ebfd43ab"
|
|
2835
2850
|
},
|
|
2836
2851
|
{
|
|
2837
2852
|
"alg": "SHA3-512",
|
|
2838
|
-
"content": "
|
|
2853
|
+
"content": "b08fe447bf5cc57f967207ad2926b139446f3034cb5145bad83918531fd4bcf5b1ee3f97db538ab4932407face1b922ea399c266f35b56005c4d73fd82a24fe1"
|
|
2839
2854
|
}
|
|
2840
2855
|
]
|
|
2841
2856
|
},
|
|
@@ -228,7 +228,12 @@ if (badgeMatch && Number(badgeMatch[1]) !== skills.length) {
|
|
|
228
228
|
const jurBadge = readme.match(/jurisdictions-(\d+)-/);
|
|
229
229
|
const liveJurs = (() => {
|
|
230
230
|
const g = JSON.parse(fs.readFileSync(ABS("data/global-frameworks.json"), "utf8"));
|
|
231
|
-
|
|
231
|
+
// Canonical jurisdiction count: every non-metadata top-level entry in the
|
|
232
|
+
// registry. GLOBAL (the International / Multi-Jurisdiction standards scope:
|
|
233
|
+
// ISO, CSA, CIS) is a counted entry, matching the README badge and the
|
|
234
|
+
// catalog-summary index. Only `_`-prefixed keys (_meta, _notification_summary,
|
|
235
|
+
// _patch_sla_summary) are metadata and excluded.
|
|
236
|
+
return Object.keys(g).filter((k) => !k.startsWith("_")).length;
|
|
232
237
|
})();
|
|
233
238
|
if (jurBadge && Number(jurBadge[1]) !== liveJurs) {
|
|
234
239
|
note(`README BADGE DRIFT: shows jurisdictions-${jurBadge[1]}- but live count is ${liveJurs}`);
|
|
@@ -19,9 +19,9 @@ const CATALOG_PURPOSES = {
|
|
|
19
19
|
"cve-catalog.json": "Per-CVE record (CVSS, EPSS, CISA KEV, RWEP, AI-discovery, vendor advisories, framework gaps, ATLAS/ATT&CK mappings). Cross-validated against NVD + CISA KEV + FIRST EPSS via validate-cves.",
|
|
20
20
|
"cwe-catalog.json": "MITRE CWE entries used by the project (subset with skill citations), with severity hint and category. Pinned to a CWE catalog version.",
|
|
21
21
|
"atlas-ttps.json": "MITRE ATLAS TTPs (AML.T0xxx) cited by skills, with tactic, name, description. Pinned to ATLAS v5.6.0 (May 2026).",
|
|
22
|
-
"d3fend-catalog.json": "MITRE D3FEND countermeasures (D3-xxx) keyed by id, with tactic + name. Pinned to D3FEND v1.
|
|
22
|
+
"d3fend-catalog.json": "MITRE D3FEND countermeasures (D3-xxx) keyed by id, with tactic + name. Pinned to D3FEND v1.3.0 release.",
|
|
23
23
|
"framework-control-gaps.json": "Per-control framework gap declarations: SI-2, A.8.8, PCI 6.3.3, etc. Each entry names the control, the lag, the evidence CVE, and remediation guidance.",
|
|
24
|
-
"global-frameworks.json": "Multi-jurisdiction framework registry:
|
|
24
|
+
"global-frameworks.json": "Multi-jurisdiction framework registry: per-jurisdiction applicable frameworks × patch_sla / notification_sla / critical_controls / framework_gaps (jurisdiction count is reported by entry_count, not duplicated here). Cross-cutting authority for jurisdiction-clocks index.",
|
|
25
25
|
"exploit-availability.json": "Per-CVE exploit availability: PoC public status, weaponization signal, AI-assist status, blast-radius. Project-curated (B2 Admiralty confidence) with source citations.",
|
|
26
26
|
"zeroday-lessons.json": "Distilled lessons from notable zero-days and campaigns (SesameOp, Copy Fail, Dirty Frag, Copilot RCE, Windsurf MCP). Each entry: technique, distinguishing characteristic, what it means for the framework lag.",
|
|
27
27
|
"rfc-references.json": "IETF RFCs + active Internet-Drafts cited by skills (TLS, IPsec, PQ crypto migration, HTTP/3, CT). Cross-validated against IETF Datatracker via validate-rfcs.",
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* scripts/sync-manifest-metadata.js
|
|
5
|
+
*
|
|
6
|
+
* The per-skill `forward_watch` and `last_threat_review` fields in
|
|
7
|
+
* manifest.json are a cache of the authoritative values in each skill's
|
|
8
|
+
* frontmatter. There was no step that refreshed that cache, so editing a
|
|
9
|
+
* skill's frontmatter (e.g. bumping last_threat_review on a threat-review
|
|
10
|
+
* pass, or rewording a forward_watch item) left the manifest copy stale.
|
|
11
|
+
* Over time the two diverged on dozens of skills.
|
|
12
|
+
*
|
|
13
|
+
* This script rewrites the manifest's `forward_watch` and
|
|
14
|
+
* `last_threat_review` for every skill from that skill's frontmatter, which
|
|
15
|
+
* is the single source of truth (the linter and the staleness gate both read
|
|
16
|
+
* frontmatter). Run it whenever skill frontmatter changes, then re-run the
|
|
17
|
+
* sign-all step so the refreshed manifest is signed.
|
|
18
|
+
*
|
|
19
|
+
* tests/manifest-frontmatter-sync.test.js fails the suite if the cache ever
|
|
20
|
+
* drifts again, so a missed run is caught before release rather than shipping
|
|
21
|
+
* a manifest that contradicts its own skill bodies.
|
|
22
|
+
*
|
|
23
|
+
* Exit codes: 0 = wrote (or already in sync), 1 = a skill file was missing or
|
|
24
|
+
* its frontmatter failed to parse.
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
const fs = require("fs");
|
|
28
|
+
const path = require("path");
|
|
29
|
+
const lint = require("../lib/lint-skills.js");
|
|
30
|
+
|
|
31
|
+
const ROOT = path.resolve(__dirname, "..");
|
|
32
|
+
const MANIFEST = path.join(ROOT, "manifest.json");
|
|
33
|
+
|
|
34
|
+
// The frontmatter fields the manifest caches and must mirror verbatim.
|
|
35
|
+
const MIRRORED_SCALAR = ["last_threat_review"];
|
|
36
|
+
const MIRRORED_ARRAY = ["forward_watch"];
|
|
37
|
+
|
|
38
|
+
function skillFrontmatter(id) {
|
|
39
|
+
const p = path.join(ROOT, "skills", id, "skill.md");
|
|
40
|
+
if (!fs.existsSync(p)) return null;
|
|
41
|
+
const { frontmatter } = lint.extractFrontmatterBlock(fs.readFileSync(p, "utf8"));
|
|
42
|
+
return lint.parseFrontmatter(frontmatter);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function sync() {
|
|
46
|
+
const manifest = JSON.parse(fs.readFileSync(MANIFEST, "utf8"));
|
|
47
|
+
let changed = 0;
|
|
48
|
+
const errors = [];
|
|
49
|
+
for (const entry of manifest.skills) {
|
|
50
|
+
const id = entry.id || entry.name;
|
|
51
|
+
let fm;
|
|
52
|
+
try {
|
|
53
|
+
fm = skillFrontmatter(id);
|
|
54
|
+
} catch (e) {
|
|
55
|
+
errors.push(`${id}: frontmatter parse failed — ${e.message}`);
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
if (!fm) {
|
|
59
|
+
errors.push(`${id}: skill.md not found`);
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
for (const key of MIRRORED_SCALAR) {
|
|
63
|
+
if (key in fm && entry[key] !== fm[key]) {
|
|
64
|
+
entry[key] = fm[key];
|
|
65
|
+
changed++;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
for (const key of MIRRORED_ARRAY) {
|
|
69
|
+
const want = Array.isArray(fm[key]) ? fm[key] : [];
|
|
70
|
+
const have = Array.isArray(entry[key]) ? entry[key] : [];
|
|
71
|
+
if (JSON.stringify(have) !== JSON.stringify(want)) {
|
|
72
|
+
entry[key] = want;
|
|
73
|
+
changed++;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (errors.length) {
|
|
78
|
+
for (const e of errors) process.stderr.write(`[sync-manifest-metadata] ${e}\n`);
|
|
79
|
+
process.exitCode = 1;
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
if (changed > 0) {
|
|
83
|
+
fs.writeFileSync(MANIFEST, JSON.stringify(manifest, null, 2) + "\n");
|
|
84
|
+
}
|
|
85
|
+
process.stdout.write(`[sync-manifest-metadata] ${changed} field(s) synced from frontmatter\n`);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
sync();
|
|
@@ -420,7 +420,7 @@ Ask: "Under COPPA, AADC, DSA Art. 28(2), and ANPD 2024 Guide, behavioural advert
|
|
|
420
420
|
|
|
421
421
|
## Defensive Countermeasure Mapping
|
|
422
422
|
|
|
423
|
-
Per AGENTS.md optional 8th section (required for skills shipped on or after 2026-05-11). Maps the offensive findings of this skill to MITRE D3FEND v1.0+ countermeasure references from `data/d3fend-catalog.json`, with explicit defense-in-depth layer position, least-privilege scope, zero-trust posture, and AI-pipeline applicability per Hard Rule #9.
|
|
423
|
+
Per AGENTS.md optional 8th section (required for skills shipped on or after 2026-05-11). Maps the offensive findings of this skill to MITRE D3FEND v1.3.0+ countermeasure references from `data/d3fend-catalog.json`, with explicit defense-in-depth layer position, least-privilege scope, zero-trust posture, and AI-pipeline applicability per Hard Rule #9.
|
|
424
424
|
|
|
425
425
|
| D3FEND ID | Technique | Child-Safeguarding Layer Position | Least-Privilege Scope | Zero-Trust Posture | AI-Pipeline Applicability (Hard Rule #9) |
|
|
426
426
|
|---|---|---|---|---|---|
|
|
@@ -309,7 +309,7 @@ The assessment produces a structured AI Attack Surface Assessment report. The sh
|
|
|
309
309
|
|
|
310
310
|
## Defensive Countermeasure Mapping
|
|
311
311
|
|
|
312
|
-
D3FEND v1.0+ references from `data/d3fend-catalog.json`. The AI attack surface enumerated above lands on five primary defensive techniques. Each entry below identifies which ATLAS TTP class the countermeasure addresses and the defense-in-depth layer it occupies.
|
|
312
|
+
D3FEND v1.3.0+ references from `data/d3fend-catalog.json`. The AI attack surface enumerated above lands on five primary defensive techniques. Each entry below identifies which ATLAS TTP class the countermeasure addresses and the defense-in-depth layer it occupies.
|
|
313
313
|
|
|
314
314
|
| D3FEND ID | Name | Layer | Rationale (what it counters here) |
|
|
315
315
|
|---|---|---|---|
|
|
@@ -413,7 +413,7 @@ For every identity flagged in Step 2, every prompt flagged in Step 3, every Sesa
|
|
|
413
413
|
|
|
414
414
|
## Defensive Countermeasure Mapping
|
|
415
415
|
|
|
416
|
-
D3FEND v1.0+ references from `data/d3fend-catalog.json`. Maps the SesameOp / PROMPTFLUX / PROMPTSTEAL detection surfaces to the defense-in-depth layer they actually live on.
|
|
416
|
+
D3FEND v1.3.0+ references from `data/d3fend-catalog.json`. Maps the SesameOp / PROMPTFLUX / PROMPTSTEAL detection surfaces to the defense-in-depth layer they actually live on.
|
|
417
417
|
|
|
418
418
|
| D3FEND ID | Name | Layer | Rationale (what it counters here) |
|
|
419
419
|
|---|---|---|---|
|
|
@@ -376,7 +376,7 @@ Apply each of the following tests to a candidate "we have a pen test" assertion.
|
|
|
376
376
|
|
|
377
377
|
## Defensive Countermeasure Mapping (D3FEND)
|
|
378
378
|
|
|
379
|
-
The findings the pen test typically produces map to D3FEND
|
|
379
|
+
The findings the pen test typically produces map to D3FEND v1.3.0+ defensive countermeasures from `data/d3fend-catalog.json`. The table below is the recommended-counter cross-walk used in section 8 of the output format.
|
|
380
380
|
|
|
381
381
|
| Typical finding | D3FEND ID | What the counter actually does |
|
|
382
382
|
|---|---|---|
|
|
@@ -79,7 +79,7 @@ The skill exists because the inverse direction — given a CVE or TTP, produce t
|
|
|
79
79
|
|
|
80
80
|
## Framework Lag Declaration
|
|
81
81
|
|
|
82
|
-
No major compliance framework requires technique-grained defensive mapping. Each requires controls; none require controls expressed in the D3FEND technique taxonomy that mirrors ATT&CK and ATLAS. The MITRE ATT&CK Mappings
|
|
82
|
+
No major compliance framework requires technique-grained defensive mapping. Each requires controls; none require controls expressed in the D3FEND technique taxonomy that mirrors ATT&CK and ATLAS. The MITRE Center for Threat-Informed Defense ATT&CK Mappings project (the NIST 800-53 → ATT&CK and D3FEND → NIST 800-53 crosswalks) provides the bridge, but its latest published crosswalk targets ATT&CK Enterprise v16.1 — lagging the current v19.0 matrix — operator awareness is limited, and no framework yet requires its use.
|
|
83
83
|
|
|
84
84
|
| Jurisdiction | Framework / Control | What It Requires | Why It Is Insufficient at D3FEND Grain |
|
|
85
85
|
|---|---|---|---|
|
|
@@ -290,7 +290,7 @@ This skill is itself the canonical mapper. The section name doubles as the secti
|
|
|
290
290
|
|
|
291
291
|
The cross-walks the skill maintains:
|
|
292
292
|
|
|
293
|
-
- **ATT&CK → D3FEND.** Sourced from the MITRE ATT&CK Mappings
|
|
293
|
+
- **ATT&CK → D3FEND.** Sourced from the MITRE Center for Threat-Informed Defense ATT&CK Mappings NIST 800-53 → ATT&CK and D3FEND → ATT&CK crosswalks (latest crosswalk targets ATT&CK Enterprise v16.1; the live matrix is v19.0), materialized locally in `data/d3fend-catalog.json` as the `counters_attack_techniques` array on every D3FEND entry. To map an ATT&CK T-number to D3FEND, scan every catalog entry and collect those whose `counters_attack_techniques` includes the T-number. This skill never invents a mapping not present in the catalog; if a T-number has no coverage, the absence is a finding routed to `zeroday-gap-learn`.
|
|
294
294
|
|
|
295
295
|
- **ATLAS → D3FEND.** Sourced from cross-references in `data/atlas-ttps.json` (each ATLAS entry's defensive references) and from `data/d3fend-catalog.json` (each D3FEND entry's `counters_attack_techniques` array, which carries AML.T-numbers in addition to T-numbers). To map an AML.T technique to D3FEND, scan the catalog the same way as for ATT&CK. The bidirectional consistency is enforced by `lib/lint-skills.js` and by the schemas declared in the catalog `_meta` blocks.
|
|
296
296
|
|
|
@@ -318,7 +318,7 @@ Ask: "A customer files a Data Subject Access Request under GDPR Art 15, LGPD Art
|
|
|
318
318
|
|
|
319
319
|
## Defensive Countermeasure Mapping
|
|
320
320
|
|
|
321
|
-
D3FEND v1.0+ countermeasure references from `data/d3fend-catalog.json`. Indicates which D3FEND defenses are the primary control category for each DLP channel.
|
|
321
|
+
D3FEND v1.3.0+ countermeasure references from `data/d3fend-catalog.json`. Indicates which D3FEND defenses are the primary control category for each DLP channel.
|
|
322
322
|
|
|
323
323
|
| DLP Channel | Primary D3FEND Defense | Secondary D3FEND Defenses | Notes |
|
|
324
324
|
|---|---|---|---|
|
|
@@ -353,7 +353,7 @@ For ephemeral / serverless AI-pipeline contexts (per AGENTS.md rule #9): live SL
|
|
|
353
353
|
|
|
354
354
|
## Defensive Countermeasure Mapping
|
|
355
355
|
|
|
356
|
-
D3FEND v1.0+ references from `data/d3fend-catalog.json`. MCP trust failures land on a tightly bounded set of defensive techniques because the attack surface is structural: a tool registered in `mcp.json` runs with the AI assistant's authority unless the listed controls intervene.
|
|
356
|
+
D3FEND v1.3.0+ references from `data/d3fend-catalog.json`. MCP trust failures land on a tightly bounded set of defensive techniques because the attack surface is structural: a tool registered in `mcp.json` runs with the AI assistant's authority unless the listed controls intervene.
|
|
357
357
|
|
|
358
358
|
| D3FEND ID | Name | Layer | Rationale (what it counters here) |
|
|
359
359
|
|---|---|---|---|
|
|
@@ -308,7 +308,7 @@ For ephemeral / serverless RAG pipelines (per AGENTS.md rule #9): embedding-dist
|
|
|
308
308
|
|
|
309
309
|
## Defensive Countermeasure Mapping
|
|
310
310
|
|
|
311
|
-
D3FEND v1.0+ references from `data/d3fend-catalog.json`. The five RAG attack classes above map to the following defensive techniques. Coverage for RAG pipelines is uneven across enterprises in mid-2026 — most have `D3-NTA` on the network layer and nothing else.
|
|
311
|
+
D3FEND v1.3.0+ references from `data/d3fend-catalog.json`. The five RAG attack classes above map to the following defensive techniques. Coverage for RAG pipelines is uneven across enterprises in mid-2026 — most have `D3-NTA` on the network layer and nothing else.
|
|
312
312
|
|
|
313
313
|
| D3FEND ID | Name | Layer | Rationale (what it counters here) |
|
|
314
314
|
|---|---|---|---|
|
|
@@ -222,11 +222,15 @@ Use this mapping. Pick one primary route and zero-or-more secondary routes.
|
|
|
222
222
|
- Financial cyber / banking cyber / DORA TLPT / PSD2 SCA / SWIFT CSCF / NYDFS 23 NYCRR 500 / FFIEC / MAS TRM / APRA CPS 234 / TIBER-EU / CBEST question → `sector-financial`
|
|
223
223
|
- Federal cyber / government cyber / FedRAMP / CMMC / EO 14028 / NIST 800-171 CUI / FISMA / M-22-09 Zero Trust / OMB M-24-04 AI / CISA BOD/ED question → `sector-federal-government`
|
|
224
224
|
- Energy cyber / electric grid cyber / NERC CIP / TSA pipeline / AWWA water / EU NCCS-G / AESCSF / DER cyber / inverter security / smart meter cyber question → `sector-energy`
|
|
225
|
+
- Telecom / 5G core / Salt Typhoon / Volt Typhoon / SS7 / Diameter / GTP / lawful intercept / CALEA / FCC CPNI / O-RAN / GSMA NESAS / 3GPP TS 33.501 question → `sector-telecom`
|
|
225
226
|
- API security / OWASP API Top 10 / BOLA / BFLA / mass assignment / GraphQL / gRPC / WebSocket / API gateway / rate limit policy question → `api-security`
|
|
226
227
|
- Cloud security / CSPM / CWPP / CNAPP / CSA CCM / AWS / Azure / GCP / shared responsibility / workload identity / cloud IAM question → `cloud-security`
|
|
227
228
|
- Container security / Kubernetes / CIS K8s Benchmark / Pod Security Standards / Kyverno / Gatekeeper / Falco / Tetragon / admission policy / NetworkPolicy question → `container-runtime-security`
|
|
228
229
|
- MLOps security / training data integrity / model registry / model signing / drift detection / MLflow / Kubeflow / Vertex AI / SageMaker / Hugging Face question → `mlops-security`
|
|
229
230
|
- Incident response / IR playbook / PICERL / NIST 800-61 / ISO 27035 / breach notification / BEC incident / AI-class incident handling question → `incident-response-playbook`
|
|
231
|
+
- Ransomware incident / encryption event / LockBit / ALPHV / Akira / RansomHub / Hunters International / ransom payment / OFAC sanctions screening / decryptor availability question → `ransomware-response`
|
|
232
|
+
- Cloud-IAM incident / AWS account takeover / GCP service-account compromise / Azure managed-identity replay / access-key leak / IAM role-assumption abuse / cross-account assume-role / IMDS SSRF / CloudTrail anomaly question → `cloud-iam-incident`
|
|
233
|
+
- IdP incident / Okta / Entra ID / Auth0 / Ping / OneLogin tenant compromise / federated-trust abuse / OAuth consent abuse / SAML-OIDC token forgery / Midnight Blizzard / Scattered Spider question → `idp-incident-response`
|
|
230
234
|
- Email security / anti-phishing / SPF / DKIM / DMARC / BIMI / ARC / MTA-STS / BEC / vishing / deepfake / AI-augmented phishing question → `email-security-anti-phishing`
|
|
231
235
|
- Age gate / age verification / age assurance / child online safety / COPPA / CIPA / California AADC / UK Children's Code / KOSA / GDPR Art. 8 / DSA Art. 28 / parental consent / CSAM detection question → `age-gates-child-safety`
|
|
232
236
|
|