@blamejs/exceptd-skills 0.12.40 → 0.12.41

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,22 +1,22 @@
1
1
  {
2
2
  "bomFormat": "CycloneDX",
3
3
  "specVersion": "1.6",
4
- "serialNumber": "urn:uuid:95bf338d-5ba0-4981-b255-54818523e480",
4
+ "serialNumber": "urn:uuid:3e4749be-65f9-4891-832a-68678b93ceaf",
5
5
  "version": 1,
6
6
  "metadata": {
7
- "timestamp": "2026-05-16T15:51:16.605Z",
7
+ "timestamp": "2026-05-17T19:49:31.500Z",
8
8
  "tools": [
9
9
  {
10
10
  "vendor": "blamejs",
11
11
  "name": "scripts/refresh-sbom.js",
12
- "version": "0.12.40"
12
+ "version": "0.12.41"
13
13
  }
14
14
  ],
15
15
  "component": {
16
- "bom-ref": "pkg:npm/@blamejs/exceptd-skills@0.12.40",
16
+ "bom-ref": "pkg:npm/@blamejs/exceptd-skills@0.12.41",
17
17
  "type": "application",
18
18
  "name": "@blamejs/exceptd-skills",
19
- "version": "0.12.40",
19
+ "version": "0.12.41",
20
20
  "description": "AI security skills grounded in mid-2026 threat reality, not stale framework documentation. 42 skills, 10 catalogs, 34 jurisdictions, pre-computed indexes, 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.12.40",
28
+ "purl": "pkg:npm/%40blamejs/exceptd-skills@0.12.41",
29
29
  "hashes": [
30
30
  {
31
31
  "alg": "SHA-256",
32
- "content": "daaae589704c5fe330aa496f32e30546d800faf75fdd6d30fc1edbe6bf54e170"
32
+ "content": "b573867d9a7b8eeb707c7232a25d7732c3ec0436c1928153c2b9a227f1f310ba"
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.12.40"
38
+ "url": "https://www.npmjs.com/package/@blamejs/exceptd-skills/v/0.12.41"
39
39
  },
40
40
  {
41
41
  "type": "vcs",
@@ -86,7 +86,7 @@
86
86
  "hashes": [
87
87
  {
88
88
  "alg": "SHA-256",
89
- "content": "90f9f12c572b5c55a86aa67940f247751ab346e20d7b14be86b9104aa7f3b6e3"
89
+ "content": "65493e20f232b92d5a22c354f5043631f4ae4565d11a291e3868d25cab617623"
90
90
  }
91
91
  ]
92
92
  },
@@ -97,7 +97,7 @@
97
97
  "hashes": [
98
98
  {
99
99
  "alg": "SHA-256",
100
- "content": "d32c31dec321b6daba763b3aa2a210dd12673410f81418de2cb3b67e6135e017"
100
+ "content": "b2428492132e3405cb564ddedaba6dbf7c4bf10e7f42623fc07788eafa0bc48c"
101
101
  }
102
102
  ]
103
103
  },
@@ -108,7 +108,7 @@
108
108
  "hashes": [
109
109
  {
110
110
  "alg": "SHA-256",
111
- "content": "10b9202ae2db7c37a9e67a1834a608424a701e53c3d6a735024433e7a89bc152"
111
+ "content": "62f756ac3289b26629078dfe10f13c35f09b8f564727379bc879388b0b46b40c"
112
112
  }
113
113
  ]
114
114
  },
@@ -119,7 +119,7 @@
119
119
  "hashes": [
120
120
  {
121
121
  "alg": "SHA-256",
122
- "content": "8bec99f10923681050ee07e510cc1c966137f03c880ef8f9b373cba4a4214053"
122
+ "content": "2d1ea8c3f03420c07a8d76f5979f9b43c4a23c1fd7cb8e86688a8600d6882e67"
123
123
  }
124
124
  ]
125
125
  },
@@ -152,7 +152,7 @@
152
152
  "hashes": [
153
153
  {
154
154
  "alg": "SHA-256",
155
- "content": "cef346c414332e249a5235bb9e7cef99f81702ac27575aabb87750ba15259355"
155
+ "content": "a3feda318adf801afc9243d73f5fc77c6dd88125c5b3511486703c2d23739df8"
156
156
  }
157
157
  ]
158
158
  },
@@ -218,7 +218,7 @@
218
218
  "hashes": [
219
219
  {
220
220
  "alg": "SHA-256",
221
- "content": "af27f2a05842b96dbb77a4887131ef3c61015193c0affdbcdd5f0548e31854c4"
221
+ "content": "3fffe9400690054eb1899e34b84e5ebbafe2cf2795fee697954aea03c12028ab"
222
222
  }
223
223
  ]
224
224
  },
@@ -229,7 +229,7 @@
229
229
  "hashes": [
230
230
  {
231
231
  "alg": "SHA-256",
232
- "content": "160382c1b0682e790e0601eeb403027d3a69563da94a6635246fba5214b86028"
232
+ "content": "5b774902c6b20817408b98fab9ef76dc178a9747f4e67dc295796d45f7df727f"
233
233
  }
234
234
  ]
235
235
  },
@@ -262,7 +262,7 @@
262
262
  "hashes": [
263
263
  {
264
264
  "alg": "SHA-256",
265
- "content": "5bfd08a3fc62850e0cdaf454a2dce3e6719acb8917b7c7249c4c02bf945b62f5"
265
+ "content": "415384660f879d26491a612e579943092135acb676cbb95327f309c921ff69ed"
266
266
  }
267
267
  ]
268
268
  },
@@ -306,7 +306,7 @@
306
306
  "hashes": [
307
307
  {
308
308
  "alg": "SHA-256",
309
- "content": "a9eeda95d24b56c28a0d0178fc601b531653e2ba7dc857160b35ad23ad6c7471"
309
+ "content": "003a400f5ae5b15527589571679ccdb9b3a62e60073627b5fbdeb2a9fe330a7a"
310
310
  }
311
311
  ]
312
312
  },
@@ -317,7 +317,7 @@
317
317
  "hashes": [
318
318
  {
319
319
  "alg": "SHA-256",
320
- "content": "aa66fa78b0aad53767755532e41e391a41e75d7d81d77d3fad5eaa744f32f4de"
320
+ "content": "8ad45086bce2a6991fea664f36b72794123a4aeaa02eab4322d3ac9fd03d427a"
321
321
  }
322
322
  ]
323
323
  },
@@ -328,7 +328,7 @@
328
328
  "hashes": [
329
329
  {
330
330
  "alg": "SHA-256",
331
- "content": "0168825497e03f079274c9da2e5529310a2ba5bd7c7da7c93acd0b66ed845b8a"
331
+ "content": "9ba563a85f7f8d6c3c957de64945e20925a89d0ed6ea6fc561cf093811acf558"
332
332
  }
333
333
  ]
334
334
  },
@@ -383,7 +383,7 @@
383
383
  "hashes": [
384
384
  {
385
385
  "alg": "SHA-256",
386
- "content": "9c1367218daa3d54dcae0a510639521093e5a2c588c7742816e5dd075bec1ee9"
386
+ "content": "042bf1ad0af026606ebff4b048a94ff0adcc56958600c24e121443f7004b03fe"
387
387
  }
388
388
  ]
389
389
  },
@@ -526,7 +526,7 @@
526
526
  "hashes": [
527
527
  {
528
528
  "alg": "SHA-256",
529
- "content": "c927653e6d9d86d1a36c23a3d782b099a49675ccd928cdc204887c79b0cfbbf1"
529
+ "content": "27d46a0e09a3edbe97dfbb070c3991348567cf93c86a3e94c767c5ad2dfb653e"
530
530
  }
531
531
  ]
532
532
  },
@@ -647,7 +647,7 @@
647
647
  "hashes": [
648
648
  {
649
649
  "alg": "SHA-256",
650
- "content": "8e56ee29977db9287e213b515e05c9bb76babc403a66c77a7bd353b170b473c7"
650
+ "content": "7baf7c4e2a42e85c8a92d6b5b4c48aba4448065765b775e1cb8d38bd43742e7f"
651
651
  }
652
652
  ]
653
653
  },
@@ -658,7 +658,7 @@
658
658
  "hashes": [
659
659
  {
660
660
  "alg": "SHA-256",
661
- "content": "fd05bb2df95d6faf755edc8fa67d61760bb26232c9ada9f5641f3849447f216b"
661
+ "content": "f5395b0e858ba67d5c78fe61dcb50ebbe8cff01ce38d7fdbf3cab6b30aa84afd"
662
662
  }
663
663
  ]
664
664
  },
@@ -746,7 +746,7 @@
746
746
  "hashes": [
747
747
  {
748
748
  "alg": "SHA-256",
749
- "content": "4ecf41dee39945536de0246d16a27a5889cc1b76087b22886ad8188506c95fad"
749
+ "content": "f229e9d388e4ef6827b738cec820db3b2ddf6077317ff1bbd016f29103bbcda8"
750
750
  }
751
751
  ]
752
752
  },
@@ -757,7 +757,7 @@
757
757
  "hashes": [
758
758
  {
759
759
  "alg": "SHA-256",
760
- "content": "c93aaaa4253b0f836543fcec8baeff30e8624f7aef99518de8f55f6c6576e4eb"
760
+ "content": "ac71e496084eefcf80f4e1ed44f91d6d41b871f0cbdfbfcc119142e70acbf994"
761
761
  }
762
762
  ]
763
763
  },
@@ -889,7 +889,7 @@
889
889
  "hashes": [
890
890
  {
891
891
  "alg": "SHA-256",
892
- "content": "1fef6f6954bcb9f141938c3b4dc8962e92358d30a4bb71c123140d7dfcb2936c"
892
+ "content": "020c5a64bec15476da61711d4219164ddc1957f5f6b6779eb3c5d70b90c6b98e"
893
893
  }
894
894
  ]
895
895
  },
@@ -933,7 +933,7 @@
933
933
  "hashes": [
934
934
  {
935
935
  "alg": "SHA-256",
936
- "content": "32dc1f7ebdf72e65bac8a969abc45e539f506ca4ec9149cd548d72fb41252548"
936
+ "content": "5e40214440835b3fadd18b181196a56ecb6f868ec2719db2bc753ced6e3f674c"
937
937
  }
938
938
  ]
939
939
  },
@@ -944,7 +944,7 @@
944
944
  "hashes": [
945
945
  {
946
946
  "alg": "SHA-256",
947
- "content": "dd90c25c9729357d6c943344eaf40eb4868f15fd4483f8305c45fbc91d4eb5cf"
947
+ "content": "772059acd0bc4355ed8db0cd65e6258d753ef38b93eb6fb03e02c8e3142a61c7"
948
948
  }
949
949
  ]
950
950
  },
@@ -977,7 +977,7 @@
977
977
  "hashes": [
978
978
  {
979
979
  "alg": "SHA-256",
980
- "content": "123736b4ec7210424f7e9f77ef4e87373e9ad6d949bda404fb60050bc1f2510e"
980
+ "content": "8bc56bbb518d7be3fd983e939239317c49e71309f9a7aa8997cbc3331af6e356"
981
981
  }
982
982
  ]
983
983
  },
@@ -1010,7 +1010,7 @@
1010
1010
  "hashes": [
1011
1011
  {
1012
1012
  "alg": "SHA-256",
1013
- "content": "a3ae7cd6a7908d4404140cb69e74ebf598aa371d9b7eb919e80704f11b33b81d"
1013
+ "content": "cef87c48a92c3709140f9171631804df04450b8383ca55147b458580d19314dc"
1014
1014
  }
1015
1015
  ]
1016
1016
  },
@@ -1252,7 +1252,7 @@
1252
1252
  "hashes": [
1253
1253
  {
1254
1254
  "alg": "SHA-256",
1255
- "content": "7268e2b1096db71e4104830a16859a47a993e0abbb6d3c7c4032715c046a2e11"
1255
+ "content": "716f44a51df7c61f79e2da21015a0e93997fa493a366b39f9f83b605c2c5f8b6"
1256
1256
  }
1257
1257
  ]
1258
1258
  },
@@ -1296,7 +1296,7 @@
1296
1296
  "hashes": [
1297
1297
  {
1298
1298
  "alg": "SHA-256",
1299
- "content": "eb4b71ec5d896f16f192a2f78c848bfb0d15a26f4c2e5c1c0564f41f70a3b73a"
1299
+ "content": "2552423461774bb472c69a8344a919b76b0db56b4f47c353c3d144788389521f"
1300
1300
  }
1301
1301
  ]
1302
1302
  },
@@ -1604,7 +1604,7 @@
1604
1604
  "hashes": [
1605
1605
  {
1606
1606
  "alg": "SHA-256",
1607
- "content": "cb6871691028f55d59e3efe47be2f1d6bf65fa8c6f3cf301e78d5d119fe3616d"
1607
+ "content": "a7bf448527e15bb0c6936217c69f3e18cc823f534e0c7f749966cde32039c63e"
1608
1608
  }
1609
1609
  ]
1610
1610
  },
@@ -193,9 +193,9 @@ const DOCS_ALWAYS_GREEN = new Set([
193
193
  "CLAUDE.md", "SUPPORT.md", ".gitignore", ".npmrc", ".editorconfig",
194
194
  ]);
195
195
 
196
- // Cycle 9 finding: operator-facing docs (release notes, install instructions,
197
- // security disclosure policy, migration guides, AI-assistant ground truth)
198
- // previously auto-greened. A PR could land deceptive copy here without any
196
+ // Operator-facing docs (release notes, install instructions, security
197
+ // disclosure policy, migration guides, AI-assistant ground truth) must not
198
+ // auto-green a PR could otherwise land deceptive copy here without any
199
199
  // reviewer signal. Downgrade to manual-review so the diff surfaces in the
200
200
  // gate output — a human (or the maintainer reviewing the bot summary) at
201
201
  // least sees the change exists.
@@ -478,9 +478,9 @@ function coversCveIoc(corpus, cveId) {
478
478
  // assert.notEqual(foo.status, 2, 'must not be unknown-cmd') ← also refused
479
479
  // unless the same line ends with `// allow-notEqual: <reason>`.
480
480
  //
481
- // Cycle 8 JJJ: pre-fix, this class was a per-instance hunt across 25+ test
482
- // sites. Moving it to a structural lint keeps new tests / new ports from
483
- // regressing. Fix the class, not the instance (CLAUDE.md pitfall).
481
+ // Structural lint replaces a per-instance hunt across 25+ test sites — keeps
482
+ // new tests / new ports from regressing into coincidence-passing assertions.
483
+ // Fix the class, not the instance.
484
484
  function scanForCoincidenceAsserts(cwd) {
485
485
  const out = [];
486
486
  const testsDir = path.join(cwd, "tests");
@@ -10,7 +10,8 @@
10
10
  * atlas-ttps, `skills_referencing` for the other three) listing every
11
11
  * skill that points at that entry. The reverse field drifts whenever a
12
12
  * skill adds or removes a forward ref without the catalog being updated
13
- * in lockstep — Cycle 9 audit found this drift in production.
13
+ * in lockstep — this script rebuilds the reverse direction from the
14
+ * forward source of truth so the two never disagree.
14
15
  *
15
16
  * Behaviour. For each catalog file:
16
17
  * 1. Walk every skill's relevant forward-ref array in manifest.json.
@@ -22,7 +23,7 @@
22
23
  *
23
24
  * The script does NOT touch playbooks_referencing — that field carries
24
25
  * playbook ids (data/playbooks/*.json), not skill names; it has its own
25
- * source of truth and is out of scope for this audit fix.
26
+ * source of truth and is out of scope for this refresh.
26
27
  *
27
28
  * Run: node scripts/refresh-reverse-refs.js
28
29
  * npm run refresh-reverse-refs
@@ -46,8 +47,8 @@ const DATA_DIR = path.join(REPO_ROOT, 'data');
46
47
  * forwardField source-collection[].* array name
47
48
  * reverseField per-entry reverse field name in the catalog
48
49
  * source 'manifest.skills' (default) — walk every skill's forward ref
49
- * 'cve.entries' — walk every CVE's forward ref (cycle 12 F3
50
- * extension); contributes CVE-IDs (skipping `_draft: true`
50
+ * 'cve.entries' — walk every CVE's forward ref (added in
51
+ * v0.12.32); contributes CVE-IDs (skipping `_draft: true`
51
52
  * entries so the reverse direction tracks operator-queryable
52
53
  * truth, not in-progress curation state)
53
54
  * entryKey field on the source object used as the reverse-list value
@@ -83,12 +84,12 @@ const CATALOGS = [
83
84
  source: 'manifest.skills',
84
85
  entryKey: 'name',
85
86
  },
86
- // Cycle 12 F3 (v0.12.32): CVE → CWE reverse direction. CWE entries
87
- // declare `evidence_cves` as the operator-facing "which CVEs land here"
88
- // index; pre-fix this was hand-maintained and drifted whenever a new
89
- // CVE landed without the matching CWE's evidence_cves being updated.
90
- // Now mirrors `cve.cwe_refs` → `cwe.evidence_cves` automatically.
91
- // Drafts excluded (they're invisible to default consumers anyway).
87
+ // v0.12.32: CVE → CWE reverse direction. CWE entries declare
88
+ // `evidence_cves` as the operator-facing "which CVEs land here" index;
89
+ // previously hand-maintained and drifted whenever a new CVE landed
90
+ // without the matching CWE's evidence_cves being updated. Now mirrors
91
+ // `cve.cwe_refs` → `cwe.evidence_cves` automatically. Drafts excluded
92
+ // (they're invisible to default consumers anyway).
92
93
  {
93
94
  file: 'cwe-catalog.json',
94
95
  forwardField: 'cwe_refs',
@@ -96,13 +97,13 @@ const CATALOGS = [
96
97
  source: 'cve.entries',
97
98
  entryKey: null, // value is the iterating CVE id
98
99
  },
99
- // Cycle 20 B F4 (v0.12.40): CVE → framework-gap reverse direction.
100
- // Pre-fix 137 directional mismatches between cve.framework_control_gaps
101
- // (dict-keyed by gap-id) and gap.evidence_cves (array of CVE ids).
102
- // The forward shape on the CVE side is an OBJECT not an array — keys
103
- // are the gap ids, values are per-CVE narrative. The reverse direction
104
- // (which CVEs cite this gap) is a simple set of CVE ids on the gap
105
- // entry. The helper handles the dict-keyed forward field via the
100
+ // v0.12.40: CVE → framework-gap reverse direction. Resolved 137
101
+ // directional mismatches between cve.framework_control_gaps (dict-keyed
102
+ // by gap-id) and gap.evidence_cves (array of CVE ids). The forward
103
+ // shape on the CVE side is an OBJECT not an array — keys are the gap
104
+ // ids, values are per-CVE narrative. The reverse direction (which CVEs
105
+ // cite this gap) is a simple set of CVE ids on the gap entry. The
106
+ // helper handles the dict-keyed forward field via the
106
107
  // `forwardFieldShape: 'object-keys'` flag.
107
108
  {
108
109
  file: 'framework-control-gaps.json',
@@ -131,14 +132,14 @@ function buildReverseIndex(skills, forwardField) {
131
132
  return index;
132
133
  }
133
134
 
134
- // Cycle 12 F3 (v0.12.32): build a reverse index keyed by catalog ID from the
135
- // CVE catalog's forward refs. Each CVE entry has cwe_refs / attack_refs
135
+ // v0.12.32: build a reverse index keyed by catalog ID from the CVE
136
+ // catalog's forward refs. Each CVE entry has cwe_refs / attack_refs
136
137
  // arrays; the reverse side is the CVE ID, indexed by the catalog entry.
137
138
  // Draft entries are skipped — drafts are invisible to default consumers
138
139
  // via cross-ref-api, so the reverse direction should track operator-
139
140
  // queryable truth, not in-progress curation state.
140
141
  //
141
- // Cycle 20 B F4 (v0.12.40): forwardFieldShape parameter handles the
142
+ // v0.12.40: forwardFieldShape parameter handles the
142
143
  // CVE.framework_control_gaps case where the forward field is a dict
143
144
  // (gap-id → narrative) rather than an array.
144
145
  function buildCveReverseIndex(cveCatalog, forwardField, forwardFieldShape) {
@@ -61,7 +61,7 @@ forward_watch:
61
61
  - OpenSSF model-signing emergence to v1.0 — Sigstore-based model-weight signing; track for production adoption and admission-control integration
62
62
  - SLSA v1.1 ML profile (draft) — model-provenance extension for training-run attestation chains; track ID and section changes
63
63
  - EU AI Act high-risk technical-file implementing acts (2026-2027) — operational requirements for Article 10 / 13 / 15 documentation may pin ML-BOM or model-signing
64
- - MITRE ATLAS v5.4.0 (released February 2026) shipped the AML.T0010 sub-technique expansion this forecast tracked plus new techniques ("Publish Poisoned AI Agent Tool", "Escape to Host"); inventory now 16 tactics, 84 techniques, 56 sub-techniques. Forward watch: ATLAS v5.5 / v6.0 — track next-cadence updates to agentic-AI TTPs and MLOps-pipeline-specific techniques
64
+ - MITRE ATLAS v5.4.0 (released February 2026) shipped the AML.T0010 sub-technique expansion this forecast tracked plus new techniques ("Publish Poisoned AI Agent Tool", "Escape to Host"); inventory now 16 tactics, 84 techniques, 56 sub-techniques. Forward watch: subsequent ATLAS minor and major releases — track next-cadence updates to agentic-AI TTPs and MLOps-pipeline-specific techniques
65
65
  last_threat_review: "2026-05-15"
66
66
  ---
67
67