@blamejs/exceptd-skills 0.18.24 → 0.18.26

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/sbom.cdx.json CHANGED
@@ -1,23 +1,23 @@
1
1
  {
2
2
  "bomFormat": "CycloneDX",
3
3
  "specVersion": "1.6",
4
- "serialNumber": "urn:uuid:894cbd3b-4618-4b79-a5c9-b11b5825edcb",
4
+ "serialNumber": "urn:uuid:17a665c7-0250-4aa5-a6f8-3fc5f08db9f8",
5
5
  "version": 1,
6
6
  "metadata": {
7
- "timestamp": "2098-12-29T23:16:11.000Z",
7
+ "timestamp": "2038-07-29T08:56:39.000Z",
8
8
  "tools": [
9
9
  {
10
10
  "vendor": "blamejs",
11
11
  "name": "scripts/refresh-sbom.js",
12
- "version": "0.18.24"
12
+ "version": "0.18.26"
13
13
  }
14
14
  ],
15
15
  "component": {
16
- "bom-ref": "pkg:npm/@blamejs/exceptd-skills@0.18.24",
16
+ "bom-ref": "pkg:npm/@blamejs/exceptd-skills@0.18.26",
17
17
  "type": "application",
18
18
  "name": "@blamejs/exceptd-skills",
19
- "version": "0.18.24",
20
- "description": "AI security skills grounded in mid-2026 threat reality, not stale framework documentation. 51 skills, 11 catalogs (819 CVEs / 218 CWEs / 805 ATT&CK + ICS / 170 ATLAS / 468 D3FEND / 8888 RFCs), 35 jurisdictions, 10-class catalog gap detector + budget gate, real XML parser + canonical-form diff + content-pattern regression detection, Ed25519-signed.",
19
+ "version": "0.18.26",
20
+ "description": "AI security skills grounded in mid-2026 threat reality, not stale framework documentation. 51 skills, 11 catalogs (823 CVEs / 218 CWEs / 805 ATT&CK + ICS / 170 ATLAS / 468 D3FEND / 8888 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
  {
23
23
  "license": {
@@ -25,17 +25,17 @@
25
25
  }
26
26
  }
27
27
  ],
28
- "purl": "pkg:npm/%40blamejs/exceptd-skills@0.18.24",
28
+ "purl": "pkg:npm/%40blamejs/exceptd-skills@0.18.26",
29
29
  "hashes": [
30
30
  {
31
31
  "alg": "SHA-256",
32
- "content": "a56e589d42bcb304e7660f06bf0d6edb07226f48d1aa4b67e503367ae4d4242d"
32
+ "content": "3e96aad34572b9d0bd661caddf3365a2381b47204d75450962dd869573164841"
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.18.24"
38
+ "url": "https://www.npmjs.com/package/@blamejs/exceptd-skills/v/0.18.26"
39
39
  },
40
40
  {
41
41
  "type": "vcs",
@@ -116,11 +116,11 @@
116
116
  "hashes": [
117
117
  {
118
118
  "alg": "SHA-256",
119
- "content": "a2b961c082f47916ac5e3dea188ef1049c94b751fc2828569f43515f6df60f37"
119
+ "content": "ec67d2c158d8a12f3109b8095d9e4f6b1c806e1139ec40f475d605a34faf39b1"
120
120
  },
121
121
  {
122
122
  "alg": "SHA3-512",
123
- "content": "293943c4b6fa2e5d9b57588c74178628df887e8bdc87f28146591812e4ded93d1980e5059d25d6f8fc4cac62730301443b72e7cda12fb8115c66b30732b75bb5"
123
+ "content": "fcd1c4b9f2790011111926b9be44178565bf4252fa77f62f3e4ed66249b489c437f4c5ee27ef14daa4a314d16fd75010a317d21bdcda40459fe2a9e8bfa88334"
124
124
  }
125
125
  ]
126
126
  },
@@ -311,11 +311,11 @@
311
311
  "hashes": [
312
312
  {
313
313
  "alg": "SHA-256",
314
- "content": "b9791cfae3465f95d8c59700b3fcf593e4a7a95e47bd28a18c10a782c4aa7ab7"
314
+ "content": "15110923850a8873f41d4d85612a63736279389b9567b1446dd88b8398f73457"
315
315
  },
316
316
  {
317
317
  "alg": "SHA3-512",
318
- "content": "4d48ce6bea5fc8b7b935e3bfa6477ca000ad2c16190e19ea7469afc229171bfab82e78c4118c252adaf12472561f2303501d5bb15b303e6d7c7447eaa56b5f6c"
318
+ "content": "8e99a9a2733aebd96f8e363a20dbc4cbc52f714bac65601a982b3992e0e9e2d50ab3d95b2a1e189bf9782ecb070c535be838d44a1bf3759ff7f18f2babb7f18d"
319
319
  }
320
320
  ]
321
321
  },
@@ -326,11 +326,11 @@
326
326
  "hashes": [
327
327
  {
328
328
  "alg": "SHA-256",
329
- "content": "c5545943732112ae69ef6d1381d76704e1621821a423bf4cd01b162a9afaae01"
329
+ "content": "662031d56c6ab7364328176339ae8f474c6312f288ca3d5154c8c31c7f5c86dd"
330
330
  },
331
331
  {
332
332
  "alg": "SHA3-512",
333
- "content": "a2640ec636a3a5540a6cec709d3cd694e802f0d6d895e9eaf82b529f864d40f7c4c352b827acec62d92528bd5b7bbc55b02eaf96cc225888a5410c019c31ad0c"
333
+ "content": "ff261e1f0b867a25162d45d54a4ae078a131af011364dcc5894244a1f5a3bd1c804ce08389d695638fd60501b4f62b8f2227edbfbc949db80e6abecc6f42e863"
334
334
  }
335
335
  ]
336
336
  },
@@ -341,11 +341,11 @@
341
341
  "hashes": [
342
342
  {
343
343
  "alg": "SHA-256",
344
- "content": "307122227ce1dd5975e5c602de7a82d538b258cdf2f04b62092a72f7b96f6fb2"
344
+ "content": "7c91d37ee96dea56047a368c6ca86399ef2c3d92385019f94a3613a0c257e634"
345
345
  },
346
346
  {
347
347
  "alg": "SHA3-512",
348
- "content": "139e9cc55e48421cdc42e4b8ea94155a67e1505d96f9f33c083b48353c5a093b482d4a4061c5563f5213a64918862ff73072bfd0b5b621ee6aa54ebeef8b45f5"
348
+ "content": "0b7bdfd5ceb6f21d40e5e864aa6a6383e060e5d2fa223696682fa83a60106d39ad3e6d4bd983db44cf7f78b199c04ef99493cb61f0a13108f0b5886af05cfd4f"
349
349
  }
350
350
  ]
351
351
  },
@@ -401,11 +401,11 @@
401
401
  "hashes": [
402
402
  {
403
403
  "alg": "SHA-256",
404
- "content": "c35e90008b2d99c20e33e341ea5440fc2a24bb10cdba9e709a1d34e069f94565"
404
+ "content": "f0bfc430eebdc5818179805f73b236fbbbc73763e5f11c4905aade9cacd41fd4"
405
405
  },
406
406
  {
407
407
  "alg": "SHA3-512",
408
- "content": "4c0faa7fedcc3c8af45a7648779f4f2cfb8e0b66369f87788a531de4bc706c1e2d3f57e3260c586ed6b649aa53647163284e79b1079170c7f360a4c55beae3ab"
408
+ "content": "b387ab676625be6a74f87f637bd54ed12d585f639ae5eef1e4298d81ccf6025a4a79f62c3a012fc02a112cd537ffb548abfe9669426d56f6feec67b4af77e68d"
409
409
  }
410
410
  ]
411
411
  },
@@ -941,11 +941,11 @@
941
941
  "hashes": [
942
942
  {
943
943
  "alg": "SHA-256",
944
- "content": "49ecd1aee2cfc5fe79a4ba0eb3c510d27427d773a5d56d15fef71b4b756b2ec1"
944
+ "content": "1712c3efebbe89e387105575be739ece9ac500a91b46fdd2b45c78f15ec5746b"
945
945
  },
946
946
  {
947
947
  "alg": "SHA3-512",
948
- "content": "6d6f81ebd1767e3ebc2a3cb159707924e1595cf3509c13344b0c81e8239abd7312eeb4360f5ea43d6ea464efdfb3f718f67e7ab22a083d6c97209a26e4947a91"
948
+ "content": "6b230aa4fdcaec9596381e6c904def8971ff42c79294e2228a655ec74caba3069407b177f9ff766865120c1f04658df6b66f05bb23bf1eacb03b1fee4585d805"
949
949
  }
950
950
  ]
951
951
  },
@@ -1796,11 +1796,11 @@
1796
1796
  "hashes": [
1797
1797
  {
1798
1798
  "alg": "SHA-256",
1799
- "content": "578cc34601ab5139f3cc0458a67dcef3e560f0d8af7bd35bd189776b34166d74"
1799
+ "content": "1374754d2105d46ab5a43a5da58d2730679e85b0aa7b9226b1052b543329f986"
1800
1800
  },
1801
1801
  {
1802
1802
  "alg": "SHA3-512",
1803
- "content": "2ff7fb40dbe9214d30214546d6d561c2d2d341abeaf7388f98ce6b8e67fa650034cea196d0a2c43a9e38dd59fc3560990c4c6eec9c2ca4ec26c74847d263b8ad"
1803
+ "content": "751354f4050264ab78a889e4b8b8aa66ae25468ec263f4b31ace716ac0f789e0f6931ff8dce9e5da3f3928c106dd0aac17bd91f9a13852c25be9f310c87d2689"
1804
1804
  }
1805
1805
  ]
1806
1806
  },
@@ -1931,11 +1931,11 @@
1931
1931
  "hashes": [
1932
1932
  {
1933
1933
  "alg": "SHA-256",
1934
- "content": "6d1b779b2fe397bdcb7cd3381a0fa9526875845cdec8ee0cd9496480f2c13bb7"
1934
+ "content": "4207cec11036cf109667a54673ac7de7aa7ef4110a3193a09c0879699c64369f"
1935
1935
  },
1936
1936
  {
1937
1937
  "alg": "SHA3-512",
1938
- "content": "940267f134e92af882b6cac9e22da4fefe37d1993fe99725d04ebc40ec1e57c4e59ea2272cb127c746fc0bd10093459cd98c849bd7d0fed2ede9005ed167a119"
1938
+ "content": "615a770c6beb260fd421102be17f99439f4c4364cf4d175dde74fc422a62cdcdc3d93713226c6bdfce5a73c945ed9c04206afe93e57e9c69c6cfc22a7b4f3534"
1939
1939
  }
1940
1940
  ]
1941
1941
  },
@@ -2404,6 +2404,21 @@
2404
2404
  }
2405
2405
  ]
2406
2406
  },
2407
+ {
2408
+ "bom-ref": "file:scripts/check-framework-gap-coverage.js",
2409
+ "type": "file",
2410
+ "name": "scripts/check-framework-gap-coverage.js",
2411
+ "hashes": [
2412
+ {
2413
+ "alg": "SHA-256",
2414
+ "content": "add8a9fbd8c99e349dd52243c797d2935f38e26cd7db92d00b0662e759f143e2"
2415
+ },
2416
+ {
2417
+ "alg": "SHA3-512",
2418
+ "content": "2aa68e3f24cd5883d4f536a9a2e754326000aaf0a49994fc68c2267a536c4eff83bcca07ec9f75a4e54e6c44a81c774a4e9a36d5a658139a80e9d055ef539b27"
2419
+ }
2420
+ ]
2421
+ },
2407
2422
  {
2408
2423
  "bom-ref": "file:scripts/check-manifest-snapshot.js",
2409
2424
  "type": "file",
@@ -2546,11 +2561,11 @@
2546
2561
  "hashes": [
2547
2562
  {
2548
2563
  "alg": "SHA-256",
2549
- "content": "9a78740b83a08ed8e45be5fc2c0116e2d961f7b6e487b6432fabdad7935b3295"
2564
+ "content": "3bde5d6bc4e5670229c6fa1aa1bb5125d5c078fdd5b9c1846ad583d6be7e34d6"
2550
2565
  },
2551
2566
  {
2552
2567
  "alg": "SHA3-512",
2553
- "content": "c432b0c2a4040b47566b32f8315674af371bb6b187576ee8c820c80714e3d00a2493cd6c7566cdbb3755a974531e5ae1323220efcf777fee5fc3058c9bb67b85"
2568
+ "content": "186dcc36e5ac1f9030f2ff61a66a176a2f393ebdb8534304157d0f28a56a5ad72ba517d879e452a2d4e8be72098845ec28cdfd84e690ee208296461dee0e5dab"
2554
2569
  }
2555
2570
  ]
2556
2571
  },
@@ -0,0 +1,103 @@
1
+ #!/usr/bin/env node
2
+ /*
3
+ * scripts/check-framework-gap-coverage.js
4
+ *
5
+ * AGENTS.md Hard Rule #5 (global-first) enforcement gate. Every curated CVE
6
+ * in data/cve-catalog.json must declare a framework_control_gaps statement
7
+ * for all five jurisdiction buckets:
8
+ *
9
+ * NIST — NIST-800-53-* / NIST-800-63*
10
+ * EU — NIS2-* / DORA-* / EU-AI-* / GDPR-*
11
+ * UK — UK-CAF-*
12
+ * AU — AU-Essential-8-* / AU-ISM-*
13
+ * ISO — ISO-27001-2022-*
14
+ *
15
+ * A multi-jurisdiction operator reading the offline catalog's framework-gap
16
+ * output must get coverage for every required jurisdiction on every CVE, not
17
+ * a US-centric subset. Before this gate, two-thirds of the corpus mapped only
18
+ * a subset; a codex review surfaced it, the corpus was completed, and this
19
+ * gate keeps it from regressing when new CVEs are curated.
20
+ *
21
+ * Draft entries (_auto_imported === true) are exempt — they carry raw NVD
22
+ * data that has not been through curation yet. The curation bar (elsewhere)
23
+ * requires drafts to be promoted before shipping, at which point this gate
24
+ * applies.
25
+ *
26
+ * Exit code: 0 when every curated entry is complete, 1 when any entry omits a
27
+ * required bucket (the list is printed). Uses process.exitCode (not
28
+ * process.exit) so buffered stdout drains before the process ends.
29
+ */
30
+
31
+ 'use strict';
32
+
33
+ const fs = require('node:fs');
34
+ const path = require('node:path');
35
+
36
+ const ROOT = path.resolve(__dirname, '..');
37
+ // Catalog path is overridable (argv[2]) so the gate's own test can point it at
38
+ // a fixture; defaults to the shipped catalog for the real predeploy run.
39
+ const CATALOG = process.argv[2] || path.join(ROOT, 'data', 'cve-catalog.json');
40
+
41
+ const REQUIRED = ['NIST', 'EU', 'UK', 'AU', 'ISO'];
42
+
43
+ function bucketOf(key) {
44
+ if (/^NIST/i.test(key)) return 'NIST';
45
+ // EU bucket is the security-regulation family AGENTS.md Hard Rule #5 names:
46
+ // NIS2, DORA, the EU AI Act, and the EU Cyber Resilience Act. GDPR / EU-GDPR
47
+ // (data-protection) is NOT sufficient on its own — an entry mapped only to
48
+ // GDPR still owes NIS2/DORA/EU-AI coverage, so GDPR does not satisfy this
49
+ // bucket. Note EU-AI / EU-CRA match here; EU-GDPR deliberately does not.
50
+ if (/^(NIS2|DORA|EU-AI|EU-CRA)/i.test(key)) return 'EU';
51
+ if (/^UK-CAF/i.test(key)) return 'UK';
52
+ if (/^(AU-Essential-?8|AU-ISM|Essential-?8)/i.test(key)) return 'AU';
53
+ if (/^ISO-?27001/i.test(key)) return 'ISO';
54
+ return 'OTHER';
55
+ }
56
+
57
+ function main() {
58
+ let catalog;
59
+ try {
60
+ catalog = JSON.parse(fs.readFileSync(CATALOG, 'utf8'));
61
+ } catch (e) {
62
+ process.stdout.write(`[check-framework-gap-coverage] cannot read ${CATALOG}: ${e.message}\n`);
63
+ process.exitCode = 1;
64
+ return;
65
+ }
66
+
67
+ const partial = [];
68
+ let checked = 0;
69
+ for (const id of Object.keys(catalog)) {
70
+ if (id === '_meta') continue;
71
+ const entry = catalog[id];
72
+ if (!entry || entry._auto_imported === true) continue;
73
+ checked++;
74
+ const gaps = entry.framework_control_gaps || {};
75
+ const have = new Set(Object.keys(gaps).map(bucketOf));
76
+ const missing = REQUIRED.filter((b) => !have.has(b));
77
+ if (missing.length) partial.push({ id, missing });
78
+ }
79
+
80
+ if (partial.length === 0) {
81
+ process.stdout.write(
82
+ `[check-framework-gap-coverage] ok — all ${checked} curated entries declare framework-gap coverage for every required jurisdiction (${REQUIRED.join(', ')}).\n`
83
+ );
84
+ return;
85
+ }
86
+
87
+ process.stdout.write(
88
+ `[check-framework-gap-coverage] FAIL: ${partial.length} of ${checked} curated entries omit at least one required jurisdiction bucket (Hard Rule #5, global-first):\n`
89
+ );
90
+ for (const p of partial.slice(0, 40)) {
91
+ process.stdout.write(` ${p.id}: missing ${p.missing.join(', ')}\n`);
92
+ }
93
+ if (partial.length > 40) {
94
+ process.stdout.write(` ... and ${partial.length - 40} more\n`);
95
+ }
96
+ process.stdout.write(
97
+ 'Add a CVE-specific framework_control_gaps statement for each missing bucket ' +
98
+ '(NIST/EU/UK/AU/ISO). Keys must resolve to a real control in data/framework-control-gaps.json.\n'
99
+ );
100
+ process.exitCode = 1;
101
+ }
102
+
103
+ main();
@@ -211,6 +211,17 @@ const GATES = [
211
211
  args: [path.join(ROOT, "scripts", "check-catalog-gap-budget.js")],
212
212
  ciJobName: "Data integrity (catalog + manifest snapshot)",
213
213
  },
214
+ {
215
+ // Global-first framework-gap coverage gate (AGENTS.md Hard Rule #5).
216
+ // Every curated CVE must declare a framework_control_gaps statement for
217
+ // all five jurisdiction buckets (NIST, EU, UK, AU, ISO). Drafts are
218
+ // exempt. Prevents a US-centric subset from shipping in the offline
219
+ // catalog's framework-gap output for multi-jurisdiction operators.
220
+ name: "Framework-gap jurisdiction coverage (Hard Rule #5)",
221
+ command: process.execPath,
222
+ args: [path.join(ROOT, "scripts", "check-framework-gap-coverage.js")],
223
+ ciJobName: "Data integrity (catalog + manifest snapshot)",
224
+ },
214
225
  {
215
226
  // Version-tag drift gate. Compares the tracked tree against a
216
227
  // baseline snapshot of pre-existing `// vX.Y.Z` comments and