@blamejs/exceptd-skills 0.12.8 → 0.12.9

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.
@@ -669,17 +669,20 @@ function rfcDiffFromCache(ctx) {
669
669
 
670
670
  function pinsDiffFromCache(ctx) {
671
671
  // Cache layout under pins/: <owner>__<repo>__releases.json arrays.
672
+ // Only repos that publish via GitHub Releases live here — D3FEND and CWE
673
+ // were removed in the same pass that pruned them from lib/prefetch.js's
674
+ // SOURCES.pins (neither project tags releases on GitHub; D3FEND ships
675
+ // the ontology from d3fend/d3fend-ontology without tagged releases,
676
+ // and CWE distributes XML from cwe.mitre.org). Pin currency for those
677
+ // two frameworks is monitored via lib/upstream-check.js against their
678
+ // canonical mitre.org endpoints, not through the prefetch cache.
672
679
  const PIN_REPOS = {
673
680
  atlas_version: "mitre-atlas__atlas-data__releases",
674
681
  attack_version: "mitre-attack__attack-stix-data__releases",
675
- d3fend_version: "d3fend__d3fend-data__releases",
676
- cwe_version: "mitre__cwe__releases",
677
682
  };
678
683
  const localOf = {
679
684
  atlas_version: ctx.manifest.atlas_version,
680
685
  attack_version: ctx.manifest.attack_version,
681
- d3fend_version: ctx.d3fendCatalog?._meta?.version || ctx.d3fendCatalog?._meta?.d3fend_version || null,
682
- cwe_version: ctx.cweCatalog?._meta?.version || ctx.cweCatalog?._meta?.cwe_version || null,
683
686
  };
684
687
  const diffs = [];
685
688
  let errors = 0;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "_comment": "Auto-generated by scripts/refresh-manifest-snapshot.js — do not hand-edit. Public skill surface used by check-manifest-snapshot.js to detect breaking removals.",
3
- "_generated_at": "2026-05-13T13:51:52.021Z",
3
+ "_generated_at": "2026-05-13T15:30:27.029Z",
4
4
  "atlas_version": "5.1.0",
5
5
  "skill_count": 38,
6
6
  "skills": [
package/manifest.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "exceptd-security",
3
- "version": "0.12.8",
3
+ "version": "0.12.9",
4
4
  "description": "AI security skills grounded in mid-2026 threat reality, not stale framework documentation",
5
5
  "homepage": "https://exceptd.com",
6
6
  "license": "Apache-2.0",
@@ -52,7 +52,7 @@
52
52
  ],
53
53
  "last_threat_review": "2026-05-01",
54
54
  "signature": "GfdaqLFofMiou8doFBE68J+ll50MU3EfJh6N6mNL6RwjABmHsbyfOXCeEpR3NlhbDrYJaG4hpZg4PwhN+t9QAA==",
55
- "signed_at": "2026-05-13T13:49:35.661Z",
55
+ "signed_at": "2026-05-13T15:30:26.578Z",
56
56
  "cwe_refs": [
57
57
  "CWE-125",
58
58
  "CWE-362",
@@ -115,8 +115,8 @@
115
115
  "SOC2-CC6-logical-access"
116
116
  ],
117
117
  "last_threat_review": "2026-05-01",
118
- "signature": "nLX2BIN16cSk0wLO9f9lXrZgX8Xg1LTsewq2PUEdv96BTV/SmEWt9jsdHus7X+8bnBX24pGTVBA4lLkOcc1MCQ==",
119
- "signed_at": "2026-05-13T13:49:35.664Z",
118
+ "signature": "m93naZQwujXBedWEjRN+88R1b2q/Dzs595Rz0ufsctsSVL2kiqlorzqqwL4mIXBDUM/HJAMRyFzPQoxOhh5qBw==",
119
+ "signed_at": "2026-05-13T15:30:26.580Z",
120
120
  "cwe_refs": [
121
121
  "CWE-1039",
122
122
  "CWE-1426",
@@ -178,8 +178,8 @@
178
178
  "RFC-9700"
179
179
  ],
180
180
  "last_threat_review": "2026-05-01",
181
- "signature": "BfqANngtx1dcIgPqVbO1KkDV8MS4EjJrUM71zs7F9EdCnIA7/EO2tH/e1e5LKbx3K+XcUSrNKHCP/vjLDdU4Cg==",
182
- "signed_at": "2026-05-13T13:49:35.664Z",
181
+ "signature": "gvC+DFTp8TONJiYIq/Uvg/uTCWyQ2vjdU8hhNEjYqTghxwnNbryePTmvcxb1VZDBSv1r+kyE2MpHRBzSdLhxDQ==",
182
+ "signed_at": "2026-05-13T15:30:26.581Z",
183
183
  "cwe_refs": [
184
184
  "CWE-22",
185
185
  "CWE-345",
@@ -225,7 +225,7 @@
225
225
  "framework_gaps": [],
226
226
  "last_threat_review": "2026-05-01",
227
227
  "signature": "FqTRjHfEgw56pyHnyWzNtnhzDMEePBtmuamtW/iyX+h4yqbvP4Fyr7NRjRs3EgqT4j7oHuEZhV9Jt6ZTBgN4AA==",
228
- "signed_at": "2026-05-13T13:49:35.664Z"
228
+ "signed_at": "2026-05-13T15:30:26.582Z"
229
229
  },
230
230
  {
231
231
  "name": "compliance-theater",
@@ -255,8 +255,8 @@
255
255
  "CMMC-2.0-Level-2"
256
256
  ],
257
257
  "last_threat_review": "2026-05-01",
258
- "signature": "3fN4yotiIIq76PVTHwozCu28TzDZvWule6vX8SXUT3XXbIBSuvAO0M/euvc3pw3TdZ2UNf78dI18lOCNdJ0aAg==",
259
- "signed_at": "2026-05-13T13:49:35.665Z"
258
+ "signature": "69KnW3ol+BZAcIbex0JJo6/71BgBE4S4o9CxZPd5kgzm5kb85PwzE6KfnK40OaE1jz36FUYJgiQZo/T7RiDhAA==",
259
+ "signed_at": "2026-05-13T15:30:26.582Z"
260
260
  },
261
261
  {
262
262
  "name": "exploit-scoring",
@@ -284,8 +284,8 @@
284
284
  "CIS-Controls-v8-Control7"
285
285
  ],
286
286
  "last_threat_review": "2026-05-01",
287
- "signature": "yZfpk4lQMRXegj2ADWjMmZTchUN6Lxpv587O/0JMzbNkXQtD6FrSAQOBWjx8S7uQ/sTntxgGN7aQQDLxL9RWAA==",
288
- "signed_at": "2026-05-13T13:49:35.665Z"
287
+ "signature": "k13lnnr4U4H58LOr2rj+ygF80RnVsdpAyGLXAdyLaY5oJFwfmEMMZQVLrcPhDx6cIQgP+Muzgtolhkh577kCCw==",
288
+ "signed_at": "2026-05-13T15:30:26.582Z"
289
289
  },
290
290
  {
291
291
  "name": "rag-pipeline-security",
@@ -321,8 +321,8 @@
321
321
  "OWASP-LLM-Top-10-2025-LLM08"
322
322
  ],
323
323
  "last_threat_review": "2026-05-01",
324
- "signature": "jftNQxDKXpcJQg5iZz2y0wNw7N6ZC3XuRrHsgxCv9bq5Mrke+L6sLyiYxcxOHZ/8Z0g7ThwBuyLEtnQOAyUvBQ==",
325
- "signed_at": "2026-05-13T13:49:35.665Z",
324
+ "signature": "X4avgw01bNVZjoiYDF+NN9qSOTjaH2I/7nRbPByoTLzMcORO7zTrZtqpGExJiV3Dmn0EtJ2dX07P65MqQIWHCA==",
325
+ "signed_at": "2026-05-13T15:30:26.582Z",
326
326
  "cwe_refs": [
327
327
  "CWE-1395",
328
328
  "CWE-1426"
@@ -378,8 +378,8 @@
378
378
  "RFC-9000"
379
379
  ],
380
380
  "last_threat_review": "2026-05-01",
381
- "signature": "y2SJLIuK/2QRD+hJxlANS0/fJUahvqbSCWEL+RCy7HpVOacpGZ7KyiVKYPAwbjc7MwRYIOfhcPixATMENV2TAA==",
382
- "signed_at": "2026-05-13T13:49:35.666Z",
381
+ "signature": "SQWndklQmECBemQj42XTfdXM9+7iH+LgIb+qanQsUGT6dhQi7RsXlLeMxe74hVvwpDeUKsn22u23J4bWJh+HCw==",
382
+ "signed_at": "2026-05-13T15:30:26.583Z",
383
383
  "d3fend_refs": [
384
384
  "D3-CA",
385
385
  "D3-CSPP",
@@ -413,8 +413,8 @@
413
413
  "attack_refs": [],
414
414
  "framework_gaps": [],
415
415
  "last_threat_review": "2026-05-01",
416
- "signature": "VMNGFvowXLbBjZp5nvWloKkqyqHKhnSzbVRU3gX9quOZJHH56w2M4id+oDsXIjR0CfRRb7eXl/so0Hq4xLBuBQ==",
417
- "signed_at": "2026-05-13T13:49:35.666Z",
416
+ "signature": "Dc740zhVm0mtlbj80QfgPcAKFyLZbbDJx/gdNHyYui0XKC3YNxykjcbqKOXnfdLAKkeLwWjMqZefkQk49wueAQ==",
417
+ "signed_at": "2026-05-13T15:30:26.583Z",
418
418
  "cwe_refs": [
419
419
  "CWE-1188"
420
420
  ]
@@ -441,8 +441,8 @@
441
441
  "attack_refs": [],
442
442
  "framework_gaps": [],
443
443
  "last_threat_review": "2026-05-01",
444
- "signature": "5MaJs7gPCuFlK4oAttLulAPOA1noeV+xD/UqVWaVyRedXZgebBGKjnlE2t1qmTugvxlNIfeAnBZapk+Wz3VAAg==",
445
- "signed_at": "2026-05-13T13:49:35.666Z"
444
+ "signature": "3w189PCSFqXTTqlzNc14EKcW7vZ/CtAkuKB2hE4ERdJX+0DNo5AOfrPLjOD1/LdZpPLayEjDTZ83WGtEsMu1Cw==",
445
+ "signed_at": "2026-05-13T15:30:26.583Z"
446
446
  },
447
447
  {
448
448
  "name": "global-grc",
@@ -474,7 +474,7 @@
474
474
  "framework_gaps": [],
475
475
  "last_threat_review": "2026-05-01",
476
476
  "signature": "S/YXUpI/mcG2FpdUTgMsccWBtTaR5A4Ph4QFQw31S9w9Hn/z3sOFHLkb1B5YSwlg+mMOtSIxMdet1eLGSZkTDg==",
477
- "signed_at": "2026-05-13T13:49:35.667Z"
477
+ "signed_at": "2026-05-13T15:30:26.584Z"
478
478
  },
479
479
  {
480
480
  "name": "zeroday-gap-learn",
@@ -500,8 +500,8 @@
500
500
  "attack_refs": [],
501
501
  "framework_gaps": [],
502
502
  "last_threat_review": "2026-05-01",
503
- "signature": "AKS+JsmhhBtytY2eIMuydjkZOYprWCmQ+RqxyxcVG9XcEI29ZSM/JbVIINQHozFl7OPPrOu1ouiTnk7LOJ86Bg==",
504
- "signed_at": "2026-05-13T13:49:35.667Z"
503
+ "signature": "84nQaJylnNIZ47BD7dSBryWwntprRc9zqoTb6i5K7jV6cq7bUm6fVlrCTlFGg/oWLMX3x9JHmc9hqZhgdzRMCw==",
504
+ "signed_at": "2026-05-13T15:30:26.585Z"
505
505
  },
506
506
  {
507
507
  "name": "pqc-first",
@@ -553,7 +553,7 @@
553
553
  ],
554
554
  "last_threat_review": "2026-05-01",
555
555
  "signature": "oEkK5bLS/G5RIHnxlNFJYdzhTJbKZnkJv+W4iS9UJ/uszZHgZGoxygELPc4kn3FowV5eE988SQYG4WKlXtNzCg==",
556
- "signed_at": "2026-05-13T13:49:35.668Z",
556
+ "signed_at": "2026-05-13T15:30:26.585Z",
557
557
  "cwe_refs": [
558
558
  "CWE-327"
559
559
  ],
@@ -599,8 +599,8 @@
599
599
  "Framework publication updates"
600
600
  ],
601
601
  "last_threat_review": "2026-05-01",
602
- "signature": "yX9SfZAba8XA8qIYHVtY8je6Jju40Y5ZnoOoWsze1vWlh++wO6OwDWdd2gXie78K6VjeGq8OzGRnSB49IOtXCQ==",
603
- "signed_at": "2026-05-13T13:49:35.668Z"
602
+ "signature": "JCrqB0GmldDIYPpgC+U3DDzxpYWJa0QgEQF7L1T8kxY0U0bsa7cw87CNC5KGk1VZRNsCa3v/I4XR1E/T5GkpBA==",
603
+ "signed_at": "2026-05-13T15:30:26.585Z"
604
604
  },
605
605
  {
606
606
  "name": "security-maturity-tiers",
@@ -636,8 +636,8 @@
636
636
  "PQC tooling maturity shifting overkill to practical"
637
637
  ],
638
638
  "last_threat_review": "2026-05-01",
639
- "signature": "43fjE2TSziIncgs+TssBWtY6dHGsmAWfLMsqecDd25Jj3gWruRMDBWe3IpGTE8PGbd27v7ySWGPPrz/kF/FTAQ==",
640
- "signed_at": "2026-05-13T13:49:35.668Z",
639
+ "signature": "ctxS+0nGTJgJ4YroLpckhG+ryjYxfwvisSeGt2o8OF6eiQBlu/VbrOk03Jb+qkahgD0mLnSeBE4sjRwekGL9BQ==",
640
+ "signed_at": "2026-05-13T15:30:26.585Z",
641
641
  "cwe_refs": [
642
642
  "CWE-1188"
643
643
  ]
@@ -671,8 +671,8 @@
671
671
  "attack_refs": [],
672
672
  "framework_gaps": [],
673
673
  "last_threat_review": "2026-05-11",
674
- "signature": "+evehnd2wSBb8uMTlTr5/aTN4bfLjsKzZJk/+OMLMOJrjCt+OuMU7EQC6xMUGeSc4cPEGajghDvq3xVaacV2Dw==",
675
- "signed_at": "2026-05-13T13:49:35.669Z"
674
+ "signature": "cdmQWTu9bFjeheH/B6pa88zCtPqVeEDDElnC/h7pUQ/JQSh9HuqCSiK/Jv2C4gaLA9h0dmKVe7NEFajshrZZDA==",
675
+ "signed_at": "2026-05-13T15:30:26.586Z"
676
676
  },
677
677
  {
678
678
  "name": "attack-surface-pentest",
@@ -743,7 +743,7 @@
743
743
  "PTES revision incorporating AI-surface enumeration"
744
744
  ],
745
745
  "signature": "6YqZpHsmUz1/aTyOPNDUgJquKaacOqEqTIELHc5wlaydDz4bYboutEu/YiTYy+wF/nYo2nOyuJfMdR8jsYwEDQ==",
746
- "signed_at": "2026-05-13T13:49:35.669Z"
746
+ "signed_at": "2026-05-13T15:30:26.586Z"
747
747
  },
748
748
  {
749
749
  "name": "fuzz-testing-strategy",
@@ -803,7 +803,7 @@
803
803
  "OSS-Fuzz-Gen / AI-assisted harness generation becoming the default expectation for OSS maintainers"
804
804
  ],
805
805
  "signature": "+ELdD+1AY5DymBitH7wU65CS60NY1nDoLowJAFn7cE5Gr/5jy9BTkyxsm7PEXaSlXWMOkTf/HQ+uyzyxUVD/Bw==",
806
- "signed_at": "2026-05-13T13:49:35.669Z"
806
+ "signed_at": "2026-05-13T15:30:26.586Z"
807
807
  },
808
808
  {
809
809
  "name": "dlp-gap-analysis",
@@ -878,7 +878,7 @@
878
878
  "Quebec Law 25, India DPDPA, KSA PDPL enforcement actions naming AI-tool prompt data as in-scope personal information"
879
879
  ],
880
880
  "signature": "H1N113M/YhnEPQptJ2B88wwAOB4eMPKuVABQ4DSlMjFMsX0ts1DBCupHHDoHcJHbi8vs+Wi10ekpL5SnsroZDQ==",
881
- "signed_at": "2026-05-13T13:49:35.669Z"
881
+ "signed_at": "2026-05-13T15:30:26.586Z"
882
882
  },
883
883
  {
884
884
  "name": "supply-chain-integrity",
@@ -955,7 +955,7 @@
955
955
  "OpenSSF model-signing — emerging Sigstore-based signing standard for ML model weights; track for production adoption"
956
956
  ],
957
957
  "signature": "TmV9ZBDYqp2pHIbNZKQYf+kZLNAiyagnH/pjK9+LiSd7OdFIN3KEpFHPUNzcivB/CT5q7nl7Tsmvc9UvGo8WDg==",
958
- "signed_at": "2026-05-13T13:49:35.670Z"
958
+ "signed_at": "2026-05-13T15:30:26.587Z"
959
959
  },
960
960
  {
961
961
  "name": "defensive-countermeasure-mapping",
@@ -1012,7 +1012,7 @@
1012
1012
  ],
1013
1013
  "last_threat_review": "2026-05-11",
1014
1014
  "signature": "XZigwq8X/csfrdG10O6Q1V5q0zUqSQGd3QrjRKkZ4fkaodG4mZahYuIQqxc8rU9jjtGAm9LtBXYB+I5csqj9Bw==",
1015
- "signed_at": "2026-05-13T13:49:35.670Z"
1015
+ "signed_at": "2026-05-13T15:30:26.587Z"
1016
1016
  },
1017
1017
  {
1018
1018
  "name": "identity-assurance",
@@ -1079,7 +1079,7 @@
1079
1079
  "d3fend_refs": [],
1080
1080
  "last_threat_review": "2026-05-11",
1081
1081
  "signature": "pCvavMUh5wR/TFl03Vh6ggKJHWPjakOEPDh7IjaD/U3WLBGPF3eyLBzieNLrPDXxIBbCJqnt9E79Bd4e73xCCg==",
1082
- "signed_at": "2026-05-13T13:49:35.670Z"
1082
+ "signed_at": "2026-05-13T15:30:26.588Z"
1083
1083
  },
1084
1084
  {
1085
1085
  "name": "ot-ics-security",
@@ -1135,7 +1135,7 @@
1135
1135
  "d3fend_refs": [],
1136
1136
  "last_threat_review": "2026-05-11",
1137
1137
  "signature": "3V0ZpDLRTmCBx5Li+9m3XKA+k9QR+l0aE55cRPMX+UTDRlStKSG5PgrSGcL2ZKJog9hKaUPmjIVh7kkn54SfAg==",
1138
- "signed_at": "2026-05-13T13:49:35.670Z"
1138
+ "signed_at": "2026-05-13T15:30:26.588Z"
1139
1139
  },
1140
1140
  {
1141
1141
  "name": "coordinated-vuln-disclosure",
@@ -1187,7 +1187,7 @@
1187
1187
  "NYDFS 23 NYCRR 500 amendments potentially adding explicit CVD program requirements"
1188
1188
  ],
1189
1189
  "signature": "UCiNjncvhkZItmLQA/Sm1/NCsOiLMwdCjfUw+067v4NIxhaMMaqRrAeD3KgMyEtov7m2Hq2kfwYSt5+DQsYDCQ==",
1190
- "signed_at": "2026-05-13T13:49:35.671Z"
1190
+ "signed_at": "2026-05-13T15:30:26.588Z"
1191
1191
  },
1192
1192
  {
1193
1193
  "name": "threat-modeling-methodology",
@@ -1237,7 +1237,7 @@
1237
1237
  "PASTA v2 updates incorporating AI/ML application threats"
1238
1238
  ],
1239
1239
  "signature": "i8ZUFT7hwTQJyqYXWh8rchdEUNv1kk0bzkF3BHOANFwuVoM0+mukOPr+rhKdOWCPjTX72EG+0Mbs6hBTSfBBAg==",
1240
- "signed_at": "2026-05-13T13:49:35.671Z"
1240
+ "signed_at": "2026-05-13T15:30:26.588Z"
1241
1241
  },
1242
1242
  {
1243
1243
  "name": "webapp-security",
@@ -1311,7 +1311,7 @@
1311
1311
  "d3fend_refs": [],
1312
1312
  "last_threat_review": "2026-05-11",
1313
1313
  "signature": "3d+Hs8yfERF/NUuVhO3YFYCY+bVn7aAGbNCCyGeqYM2VIt7q/nzNXGfbNfJbSPezClwutOyxbzPwXMj+TjmMDA==",
1314
- "signed_at": "2026-05-13T13:49:35.671Z"
1314
+ "signed_at": "2026-05-13T15:30:26.589Z"
1315
1315
  },
1316
1316
  {
1317
1317
  "name": "ai-risk-management",
@@ -1361,7 +1361,7 @@
1361
1361
  "d3fend_refs": [],
1362
1362
  "last_threat_review": "2026-05-11",
1363
1363
  "signature": "runa3PkfcThZmv5I+F6D1hOR/kfBeVOcdDZHsJ/59WOjsPj4BPi4d9MtP1vV7G9qq9daGGz6YzZGnejjin4pCA==",
1364
- "signed_at": "2026-05-13T13:49:35.672Z"
1364
+ "signed_at": "2026-05-13T15:30:26.589Z"
1365
1365
  },
1366
1366
  {
1367
1367
  "name": "sector-healthcare",
@@ -1421,7 +1421,7 @@
1421
1421
  "d3fend_refs": [],
1422
1422
  "last_threat_review": "2026-05-11",
1423
1423
  "signature": "58fEAPnojhmGSpEIIyWIwfj65A2KB4SMyUCoieJ28OZaUktUF+56wLHQOdAW6v2fSeiriFqZEqGyKyLryGGcBg==",
1424
- "signed_at": "2026-05-13T13:49:35.672Z"
1424
+ "signed_at": "2026-05-13T15:30:26.589Z"
1425
1425
  },
1426
1426
  {
1427
1427
  "name": "sector-financial",
@@ -1502,7 +1502,7 @@
1502
1502
  "TIBER-EU framework v2.0 alignment with DORA TLPT RTS (JC 2024/40); cross-recognition with CBEST and iCAST"
1503
1503
  ],
1504
1504
  "signature": "wByxWUburbU5PB7EHLDVAByCpMbhKRTWqSoVsBmxIDsz2jCiKb3ogJutFnAV2r2oXuQIUaffGvrvACIrJ2GlBQ==",
1505
- "signed_at": "2026-05-13T13:49:35.672Z"
1505
+ "signed_at": "2026-05-13T15:30:26.590Z"
1506
1506
  },
1507
1507
  {
1508
1508
  "name": "sector-federal-government",
@@ -1571,7 +1571,7 @@
1571
1571
  "Australia PSPF 2024 revision and ISM quarterly updates — track for Essential Eight Maturity Level requirements for federal entities"
1572
1572
  ],
1573
1573
  "signature": "gdiwq/+AQxxNJ2t90dITyLd2ZWdDKHxbyS2I+AVRdM45VVKQEAY4XyheGZW8m5wdDF7N9X2ENIE5CRMfP5jnCA==",
1574
- "signed_at": "2026-05-13T13:49:35.673Z"
1574
+ "signed_at": "2026-05-13T15:30:26.590Z"
1575
1575
  },
1576
1576
  {
1577
1577
  "name": "sector-energy",
@@ -1636,7 +1636,7 @@
1636
1636
  "ICS-CERT advisory feed (https://www.cisa.gov/news-events/cybersecurity-advisories/ics-advisories) for vendor CVEs in Siemens, Rockwell, Schneider Electric, ABB, GE Vernova, Hitachi Energy, AVEVA / OSIsoft PI"
1637
1637
  ],
1638
1638
  "signature": "3M6nshB0ZNfr3H/rpcy58+/yve91u8kiTOhwUBePTZ0lQeuzlXZZV6/36i/NTWKC4SwgMn8fsZCpLxA5llRaCg==",
1639
- "signed_at": "2026-05-13T13:49:35.673Z"
1639
+ "signed_at": "2026-05-13T15:30:26.590Z"
1640
1640
  },
1641
1641
  {
1642
1642
  "name": "api-security",
@@ -1705,7 +1705,7 @@
1705
1705
  "d3fend_refs": [],
1706
1706
  "last_threat_review": "2026-05-11",
1707
1707
  "signature": "rLOJBYVELFSVT2zLEByuko5Z1+HwGY99pQOC1XIVHs9l7gmY7F8N8luU/EBvVDcnT9w6nPiC5YKmCy/50LbxBQ==",
1708
- "signed_at": "2026-05-13T13:49:35.673Z"
1708
+ "signed_at": "2026-05-13T15:30:26.591Z"
1709
1709
  },
1710
1710
  {
1711
1711
  "name": "cloud-security",
@@ -1786,7 +1786,7 @@
1786
1786
  "CISA KEV additions for cloud-control-plane CVEs (IMDSv1 abuses, federation token mishandling, cross-tenant boundary failures); CISA Cybersecurity Advisories for cross-cloud advisories"
1787
1787
  ],
1788
1788
  "signature": "PyA9IHcGNrCLC0AJW2jF5D5XheA60igeirjHb3IOz/HitBEg3t2g/siP6pAUImx3IUmwp9vh+A6k+KBuyHRgBQ==",
1789
- "signed_at": "2026-05-13T13:49:35.674Z"
1789
+ "signed_at": "2026-05-13T15:30:26.591Z"
1790
1790
  },
1791
1791
  {
1792
1792
  "name": "container-runtime-security",
@@ -1848,7 +1848,7 @@
1848
1848
  "d3fend_refs": [],
1849
1849
  "last_threat_review": "2026-05-11",
1850
1850
  "signature": "/RQD2SZghTsrG7qurGb1uabyJ2IL9nmbqd412k8tqZw6nzdvvNFWcYDUGBACEQLbSlJvuaJeQdMHQH5ZzzkNDA==",
1851
- "signed_at": "2026-05-13T13:49:35.674Z"
1851
+ "signed_at": "2026-05-13T15:30:26.591Z"
1852
1852
  },
1853
1853
  {
1854
1854
  "name": "mlops-security",
@@ -1919,7 +1919,7 @@
1919
1919
  "MITRE ATLAS v5.2 — track AML.T0010 sub-technique expansion and any new MLOps-pipeline-specific TTPs"
1920
1920
  ],
1921
1921
  "signature": "BeACZFTsTRZyGuOEc7NPGnGUQ84ZrFbYRsg+yqJxCH7QOM69jYJTnExyAyxXfiJyoytzSffJQNK3h0E48rm0BQ==",
1922
- "signed_at": "2026-05-13T13:49:35.674Z"
1922
+ "signed_at": "2026-05-13T15:30:26.592Z"
1923
1923
  },
1924
1924
  {
1925
1925
  "name": "incident-response-playbook",
@@ -1981,7 +1981,7 @@
1981
1981
  "NYDFS 23 NYCRR 500.17 amendments tightening ransom-payment 24h disclosure operationalization"
1982
1982
  ],
1983
1983
  "signature": "oy63A4wX5g9rYq3wWYGSS9L7wndNaa1+wJPRPtiHMvQ6CNhTzN8kCs9Ur2SkT7U9BKYdfPLni0gGMjoeDbx+AA==",
1984
- "signed_at": "2026-05-13T13:49:35.675Z"
1984
+ "signed_at": "2026-05-13T15:30:26.592Z"
1985
1985
  },
1986
1986
  {
1987
1987
  "name": "email-security-anti-phishing",
@@ -2034,7 +2034,7 @@
2034
2034
  "d3fend_refs": [],
2035
2035
  "last_threat_review": "2026-05-11",
2036
2036
  "signature": "EFhMVyQdiLRtYPHsMADrX3aDXyWd/F5sjnGoWtUTeTiIOmrhFMOCHsvpTPotfsLt0u3LgRK5ACgjgeON8PgQAg==",
2037
- "signed_at": "2026-05-13T13:49:35.675Z"
2037
+ "signed_at": "2026-05-13T15:30:26.592Z"
2038
2038
  },
2039
2039
  {
2040
2040
  "name": "age-gates-child-safety",
@@ -2102,7 +2102,7 @@
2102
2102
  "US state adult-site age-verification laws — 19+ states by mid-2026 (TX HB 18 upheld by SCOTUS June 2025 in Free Speech Coalition v. Paxton); track ongoing challenges in remaining states"
2103
2103
  ],
2104
2104
  "signature": "MMWvg3lIf5ygm31zyf1E43t3W9MfRbMBBPrqlj1wOa8AxVJL8LICnAXfmyJ/TNJXwpF+rfZeDdoxXkql8wmtBA==",
2105
- "signed_at": "2026-05-13T13:49:35.675Z"
2105
+ "signed_at": "2026-05-13T15:30:26.593Z"
2106
2106
  }
2107
2107
  ]
2108
2108
  }
@@ -246,7 +246,7 @@ function runSkillContext(skillName) {
246
246
  const context = getSkillContext(skillName);
247
247
  if (!context) {
248
248
  // Unified error shape across the CLI surface — see v0.10.3 bug #18.
249
- process.stderr.write(JSON.stringify({ ok: false, error: `Skill not found: ${skillName}`, verb: "skill", hint: "Run `exceptd plan` or check skills/ for available skill IDs." }) + "\n");
249
+ process.stderr.write(JSON.stringify({ ok: false, error: `Skill not found: ${skillName}`, verb: "skill", hint: "Run `exceptd brief --all` or check skills/ for available skill IDs." }) + "\n");
250
250
  process.exit(1);
251
251
  }
252
252
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blamejs/exceptd-skills",
3
- "version": "0.12.8",
3
+ "version": "0.12.9",
4
4
  "description": "AI security skills grounded in mid-2026 threat reality, not stale framework documentation. 38 skills, 10 catalogs, 34 jurisdictions, pre-computed indexes, Ed25519-signed.",
5
5
  "keywords": [
6
6
  "ai-security",
package/sbom.cdx.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "bomFormat": "CycloneDX",
3
3
  "specVersion": "1.6",
4
- "serialNumber": "urn:uuid:2cda6fb1-3404-42b8-9567-cf563b1e2306",
4
+ "serialNumber": "urn:uuid:f5c39899-1746-48ea-92a0-6a78a4d1cae2",
5
5
  "version": 1,
6
6
  "metadata": {
7
- "timestamp": "2026-05-13T13:51:52.436Z",
7
+ "timestamp": "2026-05-13T15:30:27.459Z",
8
8
  "tools": [
9
9
  {
10
10
  "name": "hand-written",
@@ -13,10 +13,10 @@
13
13
  }
14
14
  ],
15
15
  "component": {
16
- "bom-ref": "pkg:npm/@blamejs/exceptd-skills@0.12.8",
16
+ "bom-ref": "pkg:npm/@blamejs/exceptd-skills@0.12.9",
17
17
  "type": "application",
18
18
  "name": "@blamejs/exceptd-skills",
19
- "version": "0.12.8",
19
+ "version": "0.12.9",
20
20
  "description": "AI security skills grounded in mid-2026 threat reality, not stale framework documentation. 38 skills, 10 catalogs, 34 jurisdictions, pre-computed indexes, Ed25519-signed.",
21
21
  "licenses": [
22
22
  {
@@ -25,11 +25,11 @@
25
25
  }
26
26
  }
27
27
  ],
28
- "purl": "pkg:npm/%40blamejs/exceptd-skills@0.12.8",
28
+ "purl": "pkg:npm/%40blamejs/exceptd-skills@0.12.9",
29
29
  "externalReferences": [
30
30
  {
31
31
  "type": "distribution",
32
- "url": "https://www.npmjs.com/package/@blamejs/exceptd-skills/v/0.12.8"
32
+ "url": "https://www.npmjs.com/package/@blamejs/exceptd-skills/v/0.12.9"
33
33
  },
34
34
  {
35
35
  "type": "vcs",
@@ -212,7 +212,17 @@ function diffSets(before, after) {
212
212
  function extractLibExports(content) {
213
213
  if (!content) return new Set();
214
214
  const out = new Set();
215
- const m = content.match(/module\.exports\s*=\s*\{([^}]+)\}/);
215
+ // v0.12.9: strip block + line comments before matching `module.exports`
216
+ // so a doc-comment example like `module.exports = {...}` inside a /** */
217
+ // block does not shadow the real exports lower in the file. Pre-fix, the
218
+ // analyzer's own file matched a 3-char doc-comment fragment first and
219
+ // returned an empty export set — any source that mentions `module.exports`
220
+ // in a JSDoc/banner block hit the same bug. After stripping comments,
221
+ // the `module.exports = {...}` match runs against real code only.
222
+ const stripped = content
223
+ .replace(/\/\*[\s\S]*?\*\//g, "")
224
+ .replace(/^\s*\/\/.*$/gm, "");
225
+ const m = stripped.match(/module\.exports\s*=\s*\{([^}]+)\}/);
216
226
  if (m) {
217
227
  for (const tok of m[1].split(",")) {
218
228
  const id = tok.split(":")[0].trim();
@@ -221,9 +231,9 @@ function extractLibExports(content) {
221
231
  }
222
232
  const re = /module\.exports\.([a-zA-Z_$][\w$]*)\s*=/g;
223
233
  let mm;
224
- while ((mm = re.exec(content)) !== null) out.add(mm[1]);
234
+ while ((mm = re.exec(stripped)) !== null) out.add(mm[1]);
225
235
  const re2 = /^exports\.([a-zA-Z_$][\w$]*)\s*=/gm;
226
- while ((mm = re2.exec(content)) !== null) out.add(mm[1]);
236
+ while ((mm = re2.exec(stripped)) !== null) out.add(mm[1]);
227
237
  return out;
228
238
  }
229
239
 
@@ -294,10 +304,21 @@ function coversCliFlag(corpus, flag) {
294
304
 
295
305
  function coversLibExport(corpus, libRel, ident) {
296
306
  const baseName = path.basename(libRel).replace(/\.js$/, "");
297
- const requireRe = new RegExp("require\\([^)]*" + escapeRe(baseName) + "[^)]*\\)");
298
- if (!requireRe.test(corpus)) return false;
307
+ const baseFile = path.basename(libRel); // e.g. "check-sbom-currency.js"
299
308
  const identRe = new RegExp("\\b" + escapeRe(ident) + "\\b");
300
- return identRe.test(corpus);
309
+ // Primary: a `require()` that mentions the module name AND a reference
310
+ // to the identifier anywhere in the test corpus. Catches the canonical
311
+ // `const { foo } = require('../lib/x')` test shape.
312
+ const requireRe = new RegExp("require\\([^)]*" + escapeRe(baseName) + "[^)]*\\)");
313
+ if (requireRe.test(corpus) && identRe.test(corpus)) return true;
314
+ // v0.12.9: a test that spawns the script under test (e.g.
315
+ // `spawnSync(node, [".../scripts/check-sbom-currency.js", ...])`) is
316
+ // real coverage too. Accept that shape when the corpus references the
317
+ // full filename AND the identifier elsewhere. The `.js` suffix is what
318
+ // distinguishes a real spawn-path from an arbitrary mention of the
319
+ // module base name.
320
+ if (corpus.includes(baseFile) && identRe.test(corpus)) return true;
321
+ return false;
301
322
  }
302
323
 
303
324
  function coversPlaybookId(corpus, id) {
@@ -152,18 +152,16 @@ const GATES = [
152
152
  requiresKeys: true,
153
153
  },
154
154
  {
155
- // v0.12.8 — AGENTS.md hard rule #15 (e2e no-MVP). Every diff that
156
- // touches a CLI verb, CLI flag, lib/orchestrator/scripts export,
157
- // playbook indicator, or CVE iocs field must land with a covering
158
- // test reference in the same PR. The analyzer parses git diff against
155
+ // AGENTS.md hard rule #15 (e2e no-MVP). Every diff that touches a
156
+ // CLI verb, CLI flag, lib/orchestrator/scripts export, playbook
157
+ // indicator, or CVE iocs field must land with a covering test
158
+ // reference in the same PR. The analyzer parses git diff against
159
159
  // origin/main, classifies each change shape, and fails if a covered
160
- // surface lacks a test literal anywhere under tests/. Run with
161
- // --warn-only during the v0.12.8 v0.12.9 rollout window so the gate
162
- // surfaces gaps without blocking; flip to blocking after one release
163
- // cycle.
160
+ // surface lacks a test literal anywhere under tests/. Blocking — a
161
+ // covered surface change without a covering test fails the gate.
164
162
  name: "Diff coverage (feature changes require test coverage)",
165
163
  command: process.execPath,
166
- args: [path.join(ROOT, "scripts", "check-test-coverage.js"), "--warn-only"],
164
+ args: [path.join(ROOT, "scripts", "check-test-coverage.js")],
167
165
  ciJobName: "Diff coverage",
168
166
  },
169
167
  ];
@@ -49,6 +49,9 @@ cwe_refs:
49
49
  d3fend_refs:
50
50
  - D3-IOPR
51
51
  - D3-NTA
52
+ - D3-EAL
53
+ - D3-FAPA
54
+ - D3-CSPP
52
55
  last_threat_review: "2026-05-13"
53
56
  ---
54
57
 
@@ -278,6 +281,28 @@ For each identified risk, declare the framework gap:
278
281
 
279
282
  ---
280
283
 
284
+ ## Defensive Countermeasure Mapping
285
+
286
+ 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.
287
+
288
+ | D3FEND ID | Name | Layer | Rationale (what it counters here) |
289
+ |---|---|---|---|
290
+ | `D3-IOPR` | Input/Output Profiling | SDK / application | SDK-level prompt and completion inspection — the foundational control for AML.T0051 (prompt injection), AML.T0096 (LLM C2), AML.T0054 (extraction). Without per-call I/O profiling, every detection step below is degraded. |
291
+ | `D3-CSPP` | Client-server Payload Profiling | LLM / MCP gateway | Gateway-layer inspection of tool-call args and prompt/completion bodies. Necessary when the AI client (mobile app, browser extension, IDE) cannot host `D3-IOPR` instrumentation in-process — the gateway becomes the only content-aware control. |
292
+ | `D3-EAL` | Executable Allowlisting | Endpoint / managed host | Restricts which AI-tool binaries (IDE assistants, browser extensions, MCP servers) can execute on managed endpoints. Direct counter to AML.T0010 (ML supply-chain compromise) for tooling shipped as native binaries; precondition for managed-endpoint clipboard- and code-completion controls. |
293
+ | `D3-FAPA` | File Access Pattern Analysis | Endpoint / data tier | Detects RAG-corpus and training-data abuse by pattern-matching the file-access shape of AML.T0018 (model poisoning at training time) and AML.T0020 (RAG retrieval abuse). Anchors the data-tier defence against poisoning that prompt-layer controls cannot see. |
294
+ | `D3-NTA` | Network Traffic Analysis | Network egress | Per-identity baseline of model-API and MCP-server egress. Catches the AML.T0017 capability-development pattern (PROMPTFLUX-style rapid querying) and the AML.T0096 covert-C2 destination shape when SDK instrumentation is partial or missing. |
295
+
296
+ **Defense-in-depth posture:** `D3-EAL` is the prerequisite endpoint layer (only sanctioned AI clients run); `D3-FAPA` is the data-tier layer (RAG and training corpora); `D3-IOPR` and `D3-CSPP` are the content-aware application and gateway layers; `D3-NTA` is the network-observability backstop. Skills that recommend a single layer alone are flagged as incomplete during Analysis Procedure Step 7.
297
+
298
+ **Least-privilege scope:** every AI principal (human developer, agent identity, MCP server) has the minimum set of model-API, MCP-tool, and RAG-corpus authorisations required for its sanctioned use case. `D3-EAL` allowlists are per-host-class (developer ≠ production ≠ CI); `D3-FAPA` access-pattern baselines are per-corpus-per-principal; `D3-IOPR` logs include the principal identity on every prompt/completion pair.
299
+
300
+ **Zero-trust posture:** every prompt is verified content-shape and origin-identity before downstream tool invocation; every RAG retrieval is clearance-checked at retrieval time (not just at index time); every MCP tool call has its args inspected at the gateway before reaching the tool. No "trusted prompt" exemption — AML.T0051 indirect prompt injection enters via documents and tool outputs, not just user prompts.
301
+
302
+ **AI-pipeline applicability (per AGENTS.md Hard Rule #9):** `D3-EAL` is not applicable to serverless inference endpoints (no executable to allowlist on the consumer side). The scoped alternative is `D3-CSPP` at the gateway plus signed-image attestation at the provider — the model-serving container is the executable surface, and its provenance is the prerequisite. `D3-FAPA` on ephemeral RAG indices degrades to per-query retrieval logging (`D3-IOPR`) plus index-build provenance signed at construction.
303
+
304
+ ---
305
+
281
306
  ## Compliance Theater Check
282
307
 
283
308
  > "Your security awareness training includes phishing detection. 82.6% of phishing emails now contain AI-generated content indistinguishable by grammar or style checks. Open your most recent phishing simulation report: what percentage of simulated phishes used AI-generated content? If zero, the simulation is testing resistance to 2021 phishing, not 2026 phishing. If your detection rule set has not been updated to reflect AI-generated content as the baseline, the control is theater for the threat it claims to address."
@@ -395,6 +395,30 @@ For every identity flagged in Step 2, every prompt flagged in Step 3, every Sesa
395
395
 
396
396
  ---
397
397
 
398
+ ## Defensive Countermeasure Mapping
399
+
400
+ 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.
401
+
402
+ | D3FEND ID | Name | Layer | Rationale (what it counters here) |
403
+ |---|---|---|---|
404
+ | `D3-NTA` | Network Traffic Analysis | Network egress | Establishes the AI-provider-egress baseline (per-identity volume, cadence, time-of-day) that SesameOp's persistent bursty-but-aperiodic shape violates. Primary detection control when SDK-level prompt logging is absent. |
405
+ | `D3-NTPM` | Network Traffic Policy Mapping | Network egress | Per-identity sanctioned-business-reason allowlist for AI provider domains. Implements the SC-7 real_requirement; without it, blanket domain allowlisting is theater. |
406
+ | `D3-CSPP` | Client-server Payload Profiling | Gateway / TLS-inspected proxy | The only layer that can observe prompt/completion content shape (entropy, base64 ratio, recognisable IOC tokens) without per-SDK instrumentation. Covers the QUIC / HTTP/3 case where boundary inspection sees only ciphertext. |
407
+ | `D3-IOPR` | Input/Output Profiling | SDK / application | SDK-level prompt and completion logging with identity binding. The single most-load-bearing control for AI C2 — every Step in the Analysis Procedure degrades to "structurally zero coverage" without it. |
408
+ | `D3-CA` | Connection Attempt Analysis | Network egress | Detects the AI-API connection from processes that have no business reason on this host type (e.g. a system service contacting `api.openai.com`). Cheap; deployable without TLS interception. |
409
+ | `D3-DA` | Domain Analysis | Network egress | Catches Oblivious HTTP (RFC 9458) relays and atypical AI-provider edge endpoints whose direct upstream is a sanctioned LLM provider — the SesameOp evasion shape when ECH is in play. |
410
+ | `D3-NI` | Network Isolation | Network segmentation | For non-developer host classes (databases, network gear, OT) where no AI API egress is ever sanctioned, hard-blocking the provider AS-paths removes the C2 channel entirely. |
411
+
412
+ **Defense-in-depth posture:** `D3-NTA` + `D3-CA` + `D3-NI` are the network layer; `D3-CSPP` is the gateway layer; `D3-IOPR` is the SDK layer; `D3-NTPM` is the policy layer that binds the other four to identity. No single layer is sufficient — SesameOp is invisible to network-only deployments without `D3-CSPP` or `D3-IOPR`, and `D3-IOPR` is invisible without `D3-NTPM` to give it the per-identity baseline against which Step 3 anomaly detection fires.
413
+
414
+ **Least-privilege scope:** `D3-NTPM` is implemented per-identity-per-business-reason — the developer using Cursor on a workstation is allowlisted for `api.anthropic.com`; the same developer's service account is not. `D3-IOPR` retention is scoped to the identities authorised to call AI APIs; prompts from unauthorised identities trigger Step 2 the moment they appear in the log, not after retention review.
415
+
416
+ **Zero-trust posture:** every prompt is logged and identity-bound regardless of source host trust level; `D3-CSPP` and `D3-IOPR` verify content shape on every call rather than sampling. The verification primitive at the gateway is entropy + identity + business-reason; at the SDK layer it is full prompt + identity + retention. No "trusted developer" exemption — PROMPTFLUX is delivered to developer workstations as readily as to production hosts.
417
+
418
+ **AI-pipeline applicability (per AGENTS.md Hard Rule #9):** `D3-IOPR` is the only control that survives serverless / ephemeral runtimes; per-host `D3-NTA` and `D3-CA` cannot baseline a host whose lifetime is shorter than the correlation window. The scoped alternative for ephemeral workloads is workload-identity-bound `D3-IOPR` correlated by IAM role / service-account identity rather than by host — preserving the PROMPTFLUX cadence shape and PROMPTSTEAL credential-access correlation across short-lived function invocations.
419
+
420
+ ---
421
+
398
422
  ## Compliance Theater Check
399
423
 
400
424
  > "Your SC-7 boundary-protection evidence shows AI provider domains — `api.openai.com`, `api.anthropic.com`, `generativelanguage.googleapis.com`, Azure OpenAI endpoints, Bedrock endpoints — on the egress allowlist, with NetFlow or Zeek records demonstrating that egress is monitored. Now answer two questions. First: for each AI provider domain on the allowlist, does the allowlist entry enumerate the specific sanctioned business reason and the identities or services entitled to use it, or is the entry a blanket allow for the domain? Second: do you have SDK-level prompt and completion logging, bound to identity, retained for at least 90 days, and forwarded to the SIEM, for every place AI APIs are called in production? If the allowlist is a blanket domain allow and SDK-level prompt logging is absent, the SC-7 control is theater for AI C2 — boundary inspection of an allowlisted domain cannot distinguish a developer prompt from a SesameOp-encoded C2 prompt, and you have no content-layer evidence to fall back on. SC-7 evidence is structurally incomplete for any org using AI APIs in production unless both an identity-bound business-reason allowlist and SDK-level prompt logging are in place. The control gap is recorded in `data/framework-control-gaps.json` under NIST-800-53-SC-7 — the real requirement names exactly these components."
@@ -32,6 +32,12 @@ This skill identifies the specific, testable conditions where audit-passing cont
32
32
 
33
33
  ---
34
34
 
35
+ ## Frontmatter Scope
36
+
37
+ The `atlas_refs` and `attack_refs` arrays are intentionally empty. This skill is a meta-analysis that correlates findings *across* every other playbook and skill in the project — it has no native TTP attachment because its input is the existing TTP-to-control evidence base produced elsewhere. The `framework_gaps` array is populated because each theater pattern below points at specific named controls (FedRAMP-Rev5-Moderate, CMMC-2.0-Level-2, and the two ALL- gaps) whose mid-2026 inadequacy is the skill's primary subject. Defensive Countermeasure Mapping is not present as a body section because this skill produces a *coverage-gap* output, not a defensive-control prescription — the D3FEND mapping is the responsibility of the downstream skills the gap-findings route into.
38
+
39
+ ---
40
+
35
41
  ## Threat Context (mid-2026)
36
42
 
37
43
  The defining mid-2026 reality is that an organization can pass a clean ISO 27001:2022, SOC 2 Type II, or PCI DSS 4.0 audit while remaining exposed to KEV-listed deterministic LPEs and zero-interaction RCEs. The contrast cases drive every theater pattern below: