@blamejs/exceptd-skills 0.12.20 → 0.12.22

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.
Files changed (52) hide show
  1. package/CHANGELOG.md +137 -6
  2. package/bin/exceptd.js +835 -70
  3. package/data/_indexes/_meta.json +14 -14
  4. package/data/_indexes/activity-feed.json +3 -3
  5. package/data/_indexes/catalog-summaries.json +3 -3
  6. package/data/_indexes/chains.json +15 -0
  7. package/data/_indexes/jurisdiction-map.json +3 -2
  8. package/data/_indexes/section-offsets.json +175 -175
  9. package/data/_indexes/summary-cards.json +1 -1
  10. package/data/_indexes/token-budget.json +83 -83
  11. package/data/cve-catalog.json +169 -2
  12. package/data/exploit-availability.json +16 -0
  13. package/data/playbooks/ai-api.json +18 -0
  14. package/data/playbooks/containers.json +30 -0
  15. package/data/playbooks/cred-stores.json +18 -0
  16. package/data/playbooks/crypto.json +18 -0
  17. package/data/playbooks/hardening.json +26 -1
  18. package/data/playbooks/kernel.json +22 -2
  19. package/data/playbooks/mcp.json +18 -0
  20. package/data/playbooks/runtime.json +22 -1
  21. package/data/playbooks/sbom.json +18 -0
  22. package/data/playbooks/secrets.json +6 -0
  23. package/data/zeroday-lessons.json +102 -0
  24. package/lib/auto-discovery.js +9 -9
  25. package/lib/cross-ref-api.js +43 -10
  26. package/lib/cve-curation.js +4 -4
  27. package/lib/playbook-runner.js +529 -70
  28. package/lib/prefetch.js +3 -3
  29. package/lib/refresh-external.js +13 -2
  30. package/lib/refresh-network.js +22 -17
  31. package/lib/scoring.js +22 -13
  32. package/lib/sign.js +5 -5
  33. package/lib/validate-catalog-meta.js +1 -1
  34. package/lib/validate-cve-catalog.js +2 -2
  35. package/lib/validate-indexes.js +2 -2
  36. package/lib/verify.js +63 -13
  37. package/manifest.json +47 -47
  38. package/package.json +1 -1
  39. package/sbom.cdx.json +6 -6
  40. package/scripts/check-manifest-snapshot.js +1 -1
  41. package/scripts/check-sbom-currency.js +1 -1
  42. package/scripts/predeploy.js +6 -6
  43. package/scripts/refresh-manifest-snapshot.js +2 -2
  44. package/scripts/validate-vendor-online.js +1 -1
  45. package/scripts/verify-shipped-tarball.js +15 -12
  46. package/skills/compliance-theater/skill.md +4 -1
  47. package/skills/exploit-scoring/skill.md +20 -1
  48. package/skills/framework-gap-analysis/skill.md +6 -2
  49. package/skills/kernel-lpe-triage/skill.md +50 -3
  50. package/skills/threat-model-currency/skill.md +7 -5
  51. package/skills/webapp-security/skill.md +1 -1
  52. package/skills/zeroday-gap-learn/skill.md +44 -1
package/manifest.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "exceptd-security",
3
- "version": "0.12.20",
3
+ "version": "0.12.22",
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",
@@ -51,8 +51,8 @@
51
51
  "RFC-7296"
52
52
  ],
53
53
  "last_threat_review": "2026-05-01",
54
- "signature": "GedX81xfe2Y/oIVTEvakZUcSPFccqsDjBibE+KbiiHezAx2EvCS4AOjlx4TO7F0iuC47G/wvOc12kMYe9iHtDw==",
55
- "signed_at": "2026-05-14T21:23:13.037Z",
54
+ "signature": "hRGoOFHglwqtRzGDiNxOIFk7QuDvFvUgsCxfGQ8cNB+DUgUFFAwTpbmX2ssP42LzbmT2GXo+h3RKDYQ1TGJdDw==",
55
+ "signed_at": "2026-05-15T06:49:35.663Z",
56
56
  "cwe_refs": [
57
57
  "CWE-125",
58
58
  "CWE-362",
@@ -116,7 +116,7 @@
116
116
  ],
117
117
  "last_threat_review": "2026-05-01",
118
118
  "signature": "Rz5jS554rDryT6FPVZy0PwHMCYoJQQhhNDNI9rvOptjDbsnnKtZkpVXlKke5OKmLu5fHEBaNPg856qMIZFq+Ag==",
119
- "signed_at": "2026-05-14T21:23:13.039Z",
119
+ "signed_at": "2026-05-15T06:49:35.665Z",
120
120
  "cwe_refs": [
121
121
  "CWE-1039",
122
122
  "CWE-1426",
@@ -179,7 +179,7 @@
179
179
  ],
180
180
  "last_threat_review": "2026-05-01",
181
181
  "signature": "goSMEVE6QbfcdqCEgq324TNy6rZ2mWwPA28gMPvojy8ZzGFng87hLdyvKhDMo4S3KTK1D6CaTBksAzZw4Go8Cg==",
182
- "signed_at": "2026-05-14T21:23:13.039Z",
182
+ "signed_at": "2026-05-15T06:49:35.666Z",
183
183
  "cwe_refs": [
184
184
  "CWE-22",
185
185
  "CWE-345",
@@ -224,8 +224,8 @@
224
224
  "attack_refs": [],
225
225
  "framework_gaps": [],
226
226
  "last_threat_review": "2026-05-01",
227
- "signature": "XFQO+fdOb388MLxMLoTqjOHhmV/PBOPKH0nZTp5NY4uzk5iUTo6G2T/IrgZGV7/CvsuvOvaXWP8+BDllXzOpDw==",
228
- "signed_at": "2026-05-14T21:23:13.040Z"
227
+ "signature": "cPRRTsNQT1MYR3cE5O3KdC4MB037EMc0fsMIbOyfOv16sR+DkiXmAhQOjlIC47HngHz3vhLI+rbqItN91VWpBg==",
228
+ "signed_at": "2026-05-15T06:49:35.666Z"
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": "1UD9hHv44RWc1GSvN99pmxk26xaHLC74EbJ1ndn5Sptgd7w2rU9QznqCKf7Qc18uRyNEFhqW3jHvEs9c/XgrAw==",
259
- "signed_at": "2026-05-14T21:23:13.040Z"
258
+ "signature": "79NrFMRsqGsipWeE5ETQSVICGO4BjTJYgyir+PSaNVFpkLqLcwZd8Dr1V7iwX0H0fXFL3WpPz35gtrYCEG32BQ==",
259
+ "signed_at": "2026-05-15T06:49:35.666Z"
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": "4tt6UuIkq/Mi8zMhO5cydYlXyG7jKxF2MFBC34Q6Q5l3FHPhhqrL5HLOB4WFgVmq27wBbD6AgUu2czVnKa5MDQ==",
288
- "signed_at": "2026-05-14T21:23:13.041Z"
287
+ "signature": "HSU+zjDZBGEVpPARxe0kw//H5Uz5cGrPIKOZWGcJybEl4MgxTsWiQd9qxCyuWoVSRE7mZFO7YwUCn67W0BiODw==",
288
+ "signed_at": "2026-05-15T06:49:35.667Z"
289
289
  },
290
290
  {
291
291
  "name": "rag-pipeline-security",
@@ -322,7 +322,7 @@
322
322
  ],
323
323
  "last_threat_review": "2026-05-01",
324
324
  "signature": "4mstnPFMNhiorB7iEwqb7Jh+OCG79Mhqt2h/RwL5JbnAIPBi0Fcv0JBhQ5msEaHO4gNnpcBrdMfiDxLDwetZCw==",
325
- "signed_at": "2026-05-14T21:23:13.041Z",
325
+ "signed_at": "2026-05-15T06:49:35.667Z",
326
326
  "cwe_refs": [
327
327
  "CWE-1395",
328
328
  "CWE-1426"
@@ -379,7 +379,7 @@
379
379
  ],
380
380
  "last_threat_review": "2026-05-01",
381
381
  "signature": "FjdIy9NqQpSSMhIbyv5WhnJKrVLhO98iBfQ0AHqXw6yqXdVoWucyr729Jwhelq40oAkiBzbXi9RoVo63DHJwDw==",
382
- "signed_at": "2026-05-14T21:23:13.041Z",
382
+ "signed_at": "2026-05-15T06:49:35.667Z",
383
383
  "d3fend_refs": [
384
384
  "D3-CA",
385
385
  "D3-CSPP",
@@ -414,7 +414,7 @@
414
414
  "framework_gaps": [],
415
415
  "last_threat_review": "2026-05-01",
416
416
  "signature": "DxfXhSyoAGUo1emHh0uIIcg324ZreBYxmFdBDVAKOOuPmMlfN4RqNc/JGDSfVmMv5CjgYCUcSmkcYB0A5lk0Cg==",
417
- "signed_at": "2026-05-14T21:23:13.041Z",
417
+ "signed_at": "2026-05-15T06:49:35.668Z",
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": "xwlad/p5XlICc76KqrdWpEpBgwx1D87oM5qlccRQ5LKC/o0pr8vQ8LN3WLiiziBChplwNbruiIN6UETniZpjCg==",
445
- "signed_at": "2026-05-14T21:23:13.042Z"
444
+ "signature": "xALyn4ZC71A8oxFV18AZgTvLbggo5erRpMOwVJToNFZ0zdf1GF8O0dUBDxqKmEGfp5qDytR1mgyPw8TFwahBAg==",
445
+ "signed_at": "2026-05-15T06:49:35.668Z"
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": "7yVjZkanFMKDQqXdX4B/7oLc2Rz72xHC1zscYd8F/+e5UAbR7ikK8Bn5EKZt3aBEOhHPAviSQNCMxpZD9U00CA==",
477
- "signed_at": "2026-05-14T21:23:13.043Z"
477
+ "signed_at": "2026-05-15T06:49:35.669Z"
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": "pKv1b8JAj1ldwR2KGccvjUKqlor2KNXXzxkKypkv+4O8WbqY7v8fWlbFe1F36OJrL2xYJdnZL5mJzqjYVHLRCg==",
504
- "signed_at": "2026-05-14T21:23:13.043Z"
503
+ "signature": "OsoKfE75/MJQXdBKXfosPDE701t9kWHRAOx/1iCS/z5FJCWgcUGJJ0IvMbno2BT3O1UB5rL6QDCHK9arRyxLBQ==",
504
+ "signed_at": "2026-05-15T06:49:35.669Z"
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": "V+qn5FqUlETfsEjvvi6jZGuQdqLFtFejfgPA6KSYxSlBXBTbOBXP3BGk5S+ba9akIzgbKh1j9VGB1MqsIt56DA==",
556
- "signed_at": "2026-05-14T21:23:13.043Z",
556
+ "signed_at": "2026-05-15T06:49:35.669Z",
557
557
  "cwe_refs": [
558
558
  "CWE-327"
559
559
  ],
@@ -600,7 +600,7 @@
600
600
  ],
601
601
  "last_threat_review": "2026-05-01",
602
602
  "signature": "UayHLLWXAkhnLPaPRsgDpAyE8FGk1tuG1/DYyhw84Uv4tfCKXMamsAhXHOyMIosQfsJq5ZHYVXZz0bYNpnlvDw==",
603
- "signed_at": "2026-05-14T21:23:13.044Z"
603
+ "signed_at": "2026-05-15T06:49:35.670Z"
604
604
  },
605
605
  {
606
606
  "name": "security-maturity-tiers",
@@ -637,7 +637,7 @@
637
637
  ],
638
638
  "last_threat_review": "2026-05-01",
639
639
  "signature": "zjq6ACAHD46xvhvQJKlrCPh5xDCuBuIWBI+QJB8RxcudpC7p7I1pqv+BY8DZdsAgU4tquCU8KC+xlduMIk3/DQ==",
640
- "signed_at": "2026-05-14T21:23:13.044Z",
640
+ "signed_at": "2026-05-15T06:49:35.670Z",
641
641
  "cwe_refs": [
642
642
  "CWE-1188"
643
643
  ]
@@ -672,7 +672,7 @@
672
672
  "framework_gaps": [],
673
673
  "last_threat_review": "2026-05-11",
674
674
  "signature": "/lGgWehCMQUXjI6w4FUa+5wrbyRnct+txvVcXA+D2/ZEkoJKh+J/psO3j5HPf7Hpv+Y5SmkH71CoO+9qilyVDQ==",
675
- "signed_at": "2026-05-14T21:23:13.044Z"
675
+ "signed_at": "2026-05-15T06:49:35.670Z"
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": "rh+/cr+wTcEmBwrGscBni/jXpxjjYP91pUKDFIGkahZpw+nghCM/3aLKFf5RFRnl3JKTyBRywIrYhUH1YuSlDw==",
746
- "signed_at": "2026-05-14T21:23:13.044Z"
746
+ "signed_at": "2026-05-15T06:49:35.671Z"
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-14T21:23:13.045Z"
806
+ "signed_at": "2026-05-15T06:49:35.671Z"
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": "/BCBGUVjGs1RZzqXfElxBWB8UoD4+MY2G1YekdWsTDbMcHvt3NZJf0/JcqdYHOsEhFQ21NEz3w3+6tmQ8htKDw==",
881
- "signed_at": "2026-05-14T21:23:13.045Z"
881
+ "signed_at": "2026-05-15T06:49:35.671Z"
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": "mySOkGScsNPtEZcHg42EKcvUSBzADIB9mSlNe0L1yPllrB/83ypBj6cCERRw9ql+rtrNxapyc6Do+nCz7E5rDg==",
958
- "signed_at": "2026-05-14T21:23:13.045Z"
958
+ "signed_at": "2026-05-15T06:49:35.672Z"
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-14T21:23:13.046Z"
1015
+ "signed_at": "2026-05-15T06:49:35.672Z"
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": "k0HrsZMBxiPWB1jl4dRwhv/R5IsqbZ+SLDv1Jx3/sRl51JyXjtm8vyogTNhSwsl5/IkaRakqIPJFRFRl5h/9CQ==",
1082
- "signed_at": "2026-05-14T21:23:13.046Z"
1082
+ "signed_at": "2026-05-15T06:49:35.672Z"
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": "oHxjumOhk8y86WcwhAX8sSWIlPzt60KfTMn4DCJLeRrrQd5+i54fVADKAdZ3vOqfDN+DexO0uX4f5dLPtacRCQ==",
1138
- "signed_at": "2026-05-14T21:23:13.046Z"
1138
+ "signed_at": "2026-05-15T06:49:35.673Z"
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-14T21:23:13.047Z"
1190
+ "signed_at": "2026-05-15T06:49:35.673Z"
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": "V9kl8Cf8UMjNFyn3D/fSyhWHLeXWlx3WV/jT9jdF9SrjfDqymimuTt2o91cZ2FOEJndAH9V0JGXB13Ohz8K4CQ==",
1240
- "signed_at": "2026-05-14T21:23:13.047Z"
1240
+ "signed_at": "2026-05-15T06:49:35.673Z"
1241
1241
  },
1242
1242
  {
1243
1243
  "name": "webapp-security",
@@ -1310,8 +1310,8 @@
1310
1310
  ],
1311
1311
  "d3fend_refs": [],
1312
1312
  "last_threat_review": "2026-05-11",
1313
- "signature": "csC9KRA3ExCSK77+UF6gj0OFPPZzOvuPxQtKEoaUZmLvn3V37My4IpbUjXAN2ZavTHqyFG9yQNfq3ELZeSJ7Cg==",
1314
- "signed_at": "2026-05-14T21:23:13.047Z"
1313
+ "signature": "CgqHC9W0PUKbTMUR+K2lG/Dq8EAQGBKb07o8IqIDcn5Q9zxiIzE9kJg8AL+zN8z0vTkZSAIv2O+FfErNNkMvBw==",
1314
+ "signed_at": "2026-05-15T06:49:35.674Z"
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": "P2D++lB5hea3oi2vl9mf8C7N+E7zASoqt1v4tjKxtaTeb+U0UARgMOaZsoK/sO9TT/PG/au14Rl4EFxv+Xi1BA==",
1364
- "signed_at": "2026-05-14T21:23:13.048Z"
1364
+ "signed_at": "2026-05-15T06:49:35.674Z"
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": "BDuLcpTeFp2BNSf1q4rYOhYKNhlgd3o5RZ0Uw9xW5olyYxPbZSgqekQ+6Ggaec09s7y6sqR37GS0vuAMdbrdDQ==",
1424
- "signed_at": "2026-05-14T21:23:13.048Z"
1424
+ "signed_at": "2026-05-15T06:49:35.674Z"
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": "4IUJePr6XbE1Ns+cPvEFAVgrwdHLImuxdPYiilurxM2SmJym1itRC1prFMcuT6Kh6e1clYXwlzflcKm/eikyDA==",
1505
- "signed_at": "2026-05-14T21:23:13.048Z"
1505
+ "signed_at": "2026-05-15T06:49:35.675Z"
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": "nMsyJ+rp5fM8/VjC7zsZyDjOC4hpxB+noT1VX7W0HBlq5t3SY56cwOGApwES/kBcCuf4qexKY376OxUr93zvCQ==",
1574
- "signed_at": "2026-05-14T21:23:13.049Z"
1574
+ "signed_at": "2026-05-15T06:49:35.675Z"
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": "L1moEqEGkBkqY/3ohJcfqrlJn40UurDCyb2MOP/IwTAeZD+QbVZ17/drdsydkJ6qSXPiyiE6u8HDfZsDS13NBQ==",
1639
- "signed_at": "2026-05-14T21:23:13.049Z"
1639
+ "signed_at": "2026-05-15T06:49:35.676Z"
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": "ad1pHD4QQ8uXkhrzqLuWgnDpESOapzx3qGFchU9rxiX1aeLQkYKwpDzqIItFq82B5xjNsW7g5jXlF1sgK2HmCA==",
1708
- "signed_at": "2026-05-14T21:23:13.050Z"
1708
+ "signed_at": "2026-05-15T06:49:35.676Z"
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": "UEn0305KAEqIfYOdzadLBdPG/PJ+3sJ/8ubvPFNcXfqXp2uOWTfqGUqY65PApA992VEEa1RBQt5R7Nyhd/OjDQ==",
1789
- "signed_at": "2026-05-14T21:23:13.051Z"
1789
+ "signed_at": "2026-05-15T06:49:35.677Z"
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": "4easZDYn25XK4E9MRnwnZohG3xdYMmOLlPznNVmr1ykNfB+343+ooj+R0quG8uEV/IqbTQpR1ink35K6jCghCg==",
1851
- "signed_at": "2026-05-14T21:23:13.051Z"
1851
+ "signed_at": "2026-05-15T06:49:35.677Z"
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": "chbPWzjfx92OjEAwMIm+J4GObxy8uwTahNBvbhMfYL7vTAJe/lf2BaW8wUpchpMIwYL0985A/+WykH8zmk/DBA==",
1922
- "signed_at": "2026-05-14T21:23:13.051Z"
1922
+ "signed_at": "2026-05-15T06:49:35.677Z"
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": "3V7kvM5cxXdCBoMnjvOoTvT3zD+/yZEBHYgiunYQe8tBm+vVnS4jCz1Nzv/ymePIfbYDo/PlzKeGTWStSsGiAg==",
1984
- "signed_at": "2026-05-14T21:23:13.052Z"
1984
+ "signed_at": "2026-05-15T06:49:35.678Z"
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": "RiCryJEd66T2NNcSo/mZTd3sGWDycE3C37guLJanLdVL5co35DrPFmIl8qy3ZM/y+Wzg5vpny8VKgr1//1/bCA==",
2037
- "signed_at": "2026-05-14T21:23:13.052Z"
2037
+ "signed_at": "2026-05-15T06:49:35.678Z"
2038
2038
  },
2039
2039
  {
2040
2040
  "name": "age-gates-child-safety",
@@ -2102,11 +2102,11 @@
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-14T21:23:13.053Z"
2105
+ "signed_at": "2026-05-15T06:49:35.678Z"
2106
2106
  }
2107
2107
  ],
2108
2108
  "manifest_signature": {
2109
2109
  "algorithm": "Ed25519",
2110
- "signature_base64": "Ql9tfxW2Qoi/Zjfhwgm0o2TrefcyaOusalb9vMbfwhHPiNlAsPwDs5iFXA4oI3ZwNJ72GE2FY54Wtmq/QU7cDA=="
2110
+ "signature_base64": "NkAWf7ofAvj1EuZz7Mo6G4M41r8YJBKfShO7qDwoJ0vCPXARYnD15RqKkBYPKLhM7TRvBL9kdAwi86TXoERjBw=="
2111
2111
  }
2112
2112
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blamejs/exceptd-skills",
3
- "version": "0.12.20",
3
+ "version": "0.12.22",
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:4ae17d1f-ac0e-41e3-95eb-0b58ced8b08d",
4
+ "serialNumber": "urn:uuid:ca7fd1e9-8239-4241-afb0-399835da7965",
5
5
  "version": 1,
6
6
  "metadata": {
7
- "timestamp": "2026-05-14T21:23:13.962Z",
7
+ "timestamp": "2026-05-15T06:17:57.473Z",
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.20",
16
+ "bom-ref": "pkg:npm/@blamejs/exceptd-skills@0.12.22",
17
17
  "type": "application",
18
18
  "name": "@blamejs/exceptd-skills",
19
- "version": "0.12.20",
19
+ "version": "0.12.22",
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.20",
28
+ "purl": "pkg:npm/%40blamejs/exceptd-skills@0.12.22",
29
29
  "externalReferences": [
30
30
  {
31
31
  "type": "distribution",
32
- "url": "https://www.npmjs.com/package/@blamejs/exceptd-skills/v/0.12.20"
32
+ "url": "https://www.npmjs.com/package/@blamejs/exceptd-skills/v/0.12.22"
33
33
  },
34
34
  {
35
35
  "type": "vcs",
@@ -190,7 +190,7 @@ if (require.main === module) {
190
190
  process.exit(2);
191
191
  }
192
192
 
193
- // Audit G F23 — when manifest-snapshot.sha256 is present, validate that
193
+ // when manifest-snapshot.sha256 is present, validate that
194
194
  // the on-disk snapshot still hashes to the recorded value. Catches a
195
195
  // hand-edit of manifest-snapshot.json that bypassed refresh-manifest-
196
196
  // snapshot.js (so the F5 commit-only guard never had a chance to fire).
@@ -63,7 +63,7 @@ function checkSbomCurrency(root) {
63
63
  errors.push("SBOM is not CycloneDX 1.6");
64
64
  }
65
65
 
66
- // Audit G F2 — component-level cross-check. A renamed or version-bumped
66
+ // component-level cross-check. A renamed or version-bumped
67
67
  // skill that never made it into the SBOM refresh will pass the count
68
68
  // check (the cardinality is unchanged) but the per-component name +
69
69
  // version comparison surfaces it. Two component classes are recognised:
@@ -20,7 +20,7 @@
20
20
  * in .github/workflows/ci.yml. Test coverage in tests/predeploy.test.js
21
21
  * asserts the two stay in sync.
22
22
  *
23
- * Audit G F5 — when the manifest-snapshot gate fails, the fix is NOT to
23
+ * when the manifest-snapshot gate fails, the fix is NOT to
24
24
  * run `npm run refresh-snapshot` blindly. The refresh script now refuses
25
25
  * unless the operator passes `--commit-only` or sets
26
26
  * EXCEPTD_SNAPSHOT_AUDIT_ACK=1. This is intentional: a failing snapshot
@@ -71,7 +71,7 @@ const GATES = [
71
71
  args: [path.join(ROOT, "lib", "validate-cve-catalog.js")],
72
72
  ciJobName: "Data integrity (catalog + manifest snapshot)",
73
73
  },
74
- // Audit G F13 — the "validate-cves --offline --no-fail" and
74
+ // the "validate-cves --offline --no-fail" and
75
75
  // "validate-rfcs --offline --no-fail" gates were enumeration-only sanity
76
76
  // checks: `--no-fail` forced them to always exit 0, so they never blocked
77
77
  // a release on a real catalog problem. The deep catalog validation is
@@ -94,7 +94,7 @@ const GATES = [
94
94
  },
95
95
  {
96
96
  // Informational — surfaces the forward_watch horizon across all skills.
97
- // Audit G F12: an exit code of 0 means "ok", 1 means "items present
97
+ // an exit code of 0 means "ok", 1 means "items present
98
98
  // (informational)", 2+ means a runtime error in the gate itself.
99
99
  // The runner now distinguishes the two: 0/1 stay informational, 2+
100
100
  // surface as a real failure. Pre-fix, any non-zero exit was rolled up
@@ -177,7 +177,7 @@ const GATES = [
177
177
  args: [path.join(ROOT, "lib", "validate-playbooks.js")],
178
178
  ciJobName: "Validate playbooks",
179
179
  informational: true,
180
- // audit Y F30: cap informational acceptance at exit 1 so a CRASH (137 OOM,
180
+ // cap informational acceptance at exit 1 so a CRASH (137 OOM,
181
181
  // 139 SIGSEGV, 134 SIGABRT, etc.) surfaces as a real failure instead of
182
182
  // being absorbed under the informational bucket. Matches the
183
183
  // forward-watch gate (line ~111) which already pins the same ceiling.
@@ -198,7 +198,7 @@ function runGate(gate) {
198
198
  }
199
199
  }
200
200
  const t0 = Date.now();
201
- // Audit G F21 — spawn the child with piped stdio + tee to the parent so we
201
+ // spawn the child with piped stdio + tee to the parent so we
202
202
  // can count `WARN ` lines for the summary table. We still want the live
203
203
  // output, so each chunk is forwarded as it arrives.
204
204
  const { spawnSync } = require("child_process");
@@ -222,7 +222,7 @@ function runGate(gate) {
222
222
  if (r.status === 0) {
223
223
  return { status: "passed", durationMs, warnCount };
224
224
  }
225
- // Audit G F12 — gates may declare informationalMaxExitCode to distinguish
225
+ // gates may declare informationalMaxExitCode to distinguish
226
226
  // "soft signal" (exit codes 0..N) from "crash" (> N). Default behaviour
227
227
  // for an informational gate without that field stays the same.
228
228
  if (gate.informational) {
@@ -11,7 +11,7 @@
11
11
  * blindly — read the breaking-change list first. A breaking change is
12
12
  * a surface narrowing every downstream consumer needs to know about.
13
13
  *
14
- * Audit G F5 — commitOnly mode. Pass `--commit-only` (or set the env
14
+ * commitOnly mode. Pass `--commit-only` (or set the env
15
15
  * EXCEPTD_SNAPSHOT_AUDIT_ACK=1) to acknowledge that the operator
16
16
  * deliberately wants to overwrite the committed snapshot. When neither
17
17
  * flag nor env is set AND the snapshot would actually change, the
@@ -98,7 +98,7 @@ fs.writeFileSync(SNAPSHOT_PATH, newJson, "utf8");
98
98
  console.log(`[refresh-manifest-snapshot] wrote ${snapshot.skill_count} skills to manifest-snapshot.json`);
99
99
  console.log("[refresh-manifest-snapshot] commit this file alongside the surface change.");
100
100
 
101
- // Audit G F23 — write a tracked SHA-256 of the snapshot so the
101
+ // write a tracked SHA-256 of the snapshot so the
102
102
  // check-manifest-snapshot.js gate can verify integrity (no hand edits
103
103
  // after refresh).
104
104
  const crypto = require("crypto");
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  "use strict";
3
3
  /**
4
- * scripts/validate-vendor-online.js — Audit G F6.
4
+ * scripts/validate-vendor-online.js
5
5
  *
6
6
  * Optional, network-touching companion to lib/validate-vendor.js. For every
7
7
  * file recorded in vendor/blamejs/_PROVENANCE.json, fetches the upstream
@@ -18,8 +18,7 @@
18
18
  * The bug was invisible because CI's verify ran against the SOURCE tree,
19
19
  * not the shipped tarball. This gate closes that gap.
20
20
  *
21
- * Audit G:
22
- * F9 — After the first-pass extraction (using the source-tree parseTar),
21
+ * * F9 — After the first-pass extraction (using the source-tree parseTar),
23
22
  * re-parse the tarball using the parseTar shipped INSIDE the
24
23
  * extracted tree itself. If the two parses disagree, fail with a
25
24
  * structured error. Catches the class where the shipped parser
@@ -45,7 +44,7 @@ const path = require("path");
45
44
  const os = require("os");
46
45
  const { spawnSync } = require("child_process");
47
46
 
48
- // v0.12.16 (audit I P1-1): mirror the byte-stability normalize() contract
47
+ // v0.12.16: mirror the byte-stability normalize() contract
49
48
  // from lib/sign.js + lib/verify.js + lib/refresh-network.js. Duplicated
50
49
  // (not require'd) to keep this script's dep surface minimal and to ensure
51
50
  // a bug in the normalize() implementation in lib/ doesn't simultaneously
@@ -58,7 +57,7 @@ function normalizeSkillBytes(buf) {
58
57
  return Buffer.from(s.replace(/\r\n/g, "\n"), "utf8");
59
58
  }
60
59
 
61
- // Audit O P1-C: in-line manifest-signature verifier for the extracted
60
+ // C: in-line manifest-signature verifier for the extracted
62
61
  // tarball. Kept here (rather than imported) for the same defense-in-depth
63
62
  // reasoning as normalizeSkillBytes: a bug in lib/verify.js's verifier
64
63
  // should not also disable this gate (we want at least one independent
@@ -109,7 +108,7 @@ function verifyExtractedManifestSignature(manifest, publicKeyPem) {
109
108
  return ok ? { status: "valid" } : { status: "invalid", reason: "Ed25519 manifest signature did not verify against extracted public.pem" };
110
109
  }
111
110
 
112
- // Audit P P1-A: exported so tests/normalize-contract.test.js can assert
111
+ // A: exported so tests/normalize-contract.test.js can assert
113
112
  // byte-identical normalize() behavior across all four implementations.
114
113
  module.exports = {
115
114
  normalizeSkillBytes,
@@ -125,7 +124,7 @@ function fail(msg, code = 1) {
125
124
  process.exit(code);
126
125
  }
127
126
 
128
- // Audit P P1-A: gate the script body behind require.main === module so
127
+ // A: gate the script body behind require.main === module so
129
128
  // tests can `require()` this file to load the exported helpers (notably
130
129
  // normalizeSkillBytes for the byte-stability contract test) without
131
130
  // invoking npm pack as a side effect of import.
@@ -176,7 +175,7 @@ try {
176
175
  }
177
176
  emit(`extracted to ${pkgRoot}`);
178
177
 
179
- // Audit G F9 — load the extracted tree's OWN parseTar and re-parse the
178
+ // load the extracted tree's OWN parseTar and re-parse the
180
179
  // tarball. If the two parsers diverge on entry list or content, the
181
180
  // gate trips: this means CI exercised a different parser than operators
182
181
  // will. Defense against drift between source and shipped tarball when
@@ -248,7 +247,7 @@ try {
248
247
  const pubPem = fs.readFileSync(pubKeyPath, "utf8");
249
248
  const pubKey = crypto.createPublicKey(pubPem);
250
249
 
251
- // Audit O P1-C: verify the top-level manifest_signature on the
250
+ // C: verify the top-level manifest_signature on the
252
251
  // EXTRACTED manifest.json. Per-skill signatures only sign the skill body
253
252
  // bytes — they do not sign skill.name / skill.path / skill.atlas_refs or
254
253
  // any other manifest envelope metadata. A tarball whose body bytes are
@@ -286,14 +285,18 @@ try {
286
285
  emit(`*** Something between sign and pack is swapping the key. Verify will fail below. ***`);
287
286
  }
288
287
 
289
- // Audit G F4 — key-pin cross-check against the EXTRACTED tree. The pin
288
+ // key-pin cross-check against the EXTRACTED tree. The pin
290
289
  // is consumed from keys/EXPECTED_FINGERPRINT in the extracted package —
291
290
  // that's the file operators will actually receive on `npm install`.
292
291
  // Warn when absent, fail when present-but-mismatched (unless KEYS_ROTATED).
293
292
  const expectedFpPath = path.join(pkgRoot, "keys", "EXPECTED_FINGERPRINT");
294
293
  if (fs.existsSync(expectedFpPath)) {
295
- const raw = fs.readFileSync(expectedFpPath, "utf8").trim();
296
- const firstLine = raw.split(/\r?\n/).map((l) => l.trim()).find((l) => l.length > 0) || "";
294
+ // KK P1-5: route through the shared lib/verify loader so a BOM-prefixed
295
+ // pin file (Notepad with files.encoding=utf8bom in the source tree) is
296
+ // tolerated identically across every verify site. The helper strips
297
+ // leading U+FEFF + ignores comment lines (`#`).
298
+ const { loadExpectedFingerprintFirstLine } = require(path.join(ROOT, "lib", "verify.js"));
299
+ const firstLine = loadExpectedFingerprintFirstLine(expectedFpPath) || "";
297
300
  const liveFpLine = `SHA256:${pubFp}`;
298
301
  if (firstLine !== liveFpLine) {
299
302
  if (process.env.KEYS_ROTATED === "1") {
@@ -323,7 +326,7 @@ try {
323
326
  failures.push(`${s.name}: file not found at ${s.path}`);
324
327
  continue;
325
328
  }
326
- // v0.12.16 (audit I P1-1): the prior code passed the raw file bytes
329
+ // v0.12.16: the prior code passed the raw file bytes
327
330
  // directly to crypto.verify. lib/sign.js + lib/verify.js both NORMALIZE
328
331
  // bytes (strip UTF-8 BOM, convert CRLF -> LF) before sign/verify, per
329
332
  // the byte-stability contract in lib/verify.js's normalize() header.
@@ -21,7 +21,7 @@ framework_gaps:
21
21
  - ALL-PROMPT-INJECTION-ACCESS-CONTROL
22
22
  - FedRAMP-Rev5-Moderate
23
23
  - CMMC-2.0-Level-2
24
- last_threat_review: "2026-05-01"
24
+ last_threat_review: "2026-05-14"
25
25
  ---
26
26
 
27
27
  # Compliance Theater Detection
@@ -98,6 +98,7 @@ The theater patterns most acutely under attack today are those backed by high-RW
98
98
  | Vendor Management Theater (AI APIs / MCP) | CVE-2026-30615 (Windsurf MCP local-vector RCE) | 8.0 | 35 | No | Partial | No | Yes (IDE update) | Suspected |
99
99
  | Access Control Theater (AI agents) | CVE-2025-53773 (Copilot YOLO-mode RCE) | 7.8 | 30 | No | Yes (demonstrated) | Yes (AI tooling enables) | Yes (SaaS push / IDE update) | Suspected |
100
100
  | Network Segmentation Theater (IPsec) | CVE-2026-43284 (Dirty Frag) | High | High | Pending | Partial | No | Limited (subsystem-dependent) | Suspected |
101
+ | Patch Management Theater (Bug-Family Sequel) | CVE-2026-46300 (Fragnesia) | 7.8 | 20 (today) / 55+ on KEV | No (candidate) | Yes (one-liner vs /usr/bin/su) | No | Yes (kpatch / canonical-livepatch / KernelCare) | None observed |
101
102
  | Incident Response Theater (AI pipeline) | SesameOp campaign + AML.T0096 | N/A | High | N/A | ATLAS-documented | Yes | N/A | Confirmed campaign |
102
103
  | Change Management Theater (AI models) | Continuous provider updates | N/A | Medium | N/A | N/A | N/A | N/A | Ongoing (uncontrolled) |
103
104
  | Security Awareness Theater (AI phishing) | AI-generated phishing baseline (82.6%) | N/A | High | N/A | Operational | Yes | N/A | Confirmed (industry-wide) |
@@ -132,6 +133,8 @@ The first three rows (Critical / Critical / High RWEP with public PoC or active
132
133
 
133
134
  **What a real control looks like:** Tiered SLA: CISA KEV = 4 hours to live-patch or isolate; public PoC = 24 hours; Critical (no public PoC) = 72 hours; High = 7 days. Live patching capability deployed and verified quarterly.
134
135
 
136
+ **Bug-family sequel sub-pattern (Fragnesia, CVE-2026-46300):** when a CVE patch lands, retain the pre-patch compensating controls (module blacklists, sysctl restrictions) until the patched code has soaked. The Dirty Frag patch introduced Fragnesia — a sibling page-cache-corruption bug in the same primitive class. The module-unload mitigation (`blacklist esp4 / esp6 / rxrpc`) covers both. A patch-management program that removed the Dirty Frag blacklist when the patch landed re-exposed the host to Fragnesia. Theater signal: a vulnerability scanner that reports "patched for CVE-2026-43284" while the kernel still lacks the CVE-2026-46300 patch and the module blacklist has been removed.
137
+
135
138
  ---
136
139
 
137
140
  ### Pattern 2: Network Segmentation Theater (IPsec Edition)