@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/lib/verify.js CHANGED
@@ -87,7 +87,7 @@ const EXPECTED_FINGERPRINT_PATH = path.join(ROOT, 'keys', 'EXPECTED_FINGERPRINT'
87
87
  function verifyAll() {
88
88
  const publicKey = loadPublicKey();
89
89
  if (!publicKey) {
90
- console.error('[verify] No public key at keys/public.pem — run: node lib/sign.js generate-keypair');
90
+ console.error('[verify] No public key at keys/public.pem — run `exceptd doctor --fix` (or `node $(exceptd path)/lib/sign.js generate-keypair` from a contributor checkout)');
91
91
  return { valid: [], invalid: [], missing_sig: [], missing_file: [], no_key: true };
92
92
  }
93
93
 
@@ -128,7 +128,7 @@ function verifyOne(skillName) {
128
128
  */
129
129
  function signAll() {
130
130
  const privateKey = loadPrivateKey();
131
- if (!privateKey) throw new Error('No private key at .keys/private.pem — run: node lib/sign.js generate-keypair');
131
+ if (!privateKey) throw new Error('No private key at .keys/private.pem — run `exceptd doctor --fix` (or `node $(exceptd path)/lib/sign.js generate-keypair` from a contributor checkout)');
132
132
 
133
133
  // P1-4: load the manifest without the signature gate. We're about to
134
134
  // mutate the manifest (re-sign skills + re-sign the manifest itself),
@@ -236,7 +236,7 @@ function validateSkillPath(skillPath) {
236
236
 
237
237
  function verifySkill(skill, publicKey) {
238
238
  if (!skill.signature) {
239
- return { status: 'missing_sig', reason: 'No Ed25519 signature in manifest — run: node lib/sign.js sign-all' };
239
+ return { status: 'missing_sig', reason: 'No Ed25519 signature in manifest — run `exceptd doctor --fix` (or `node $(exceptd path)/lib/sign.js sign-all` from a contributor checkout)' };
240
240
  }
241
241
 
242
242
  const skillPath = path.join(ROOT, skill.path);
@@ -447,7 +447,7 @@ function loadManifestValidated() {
447
447
  // console.warn would spam stderr per call. Node's emitWarning() with
448
448
  // a stable `code` collapses repeated emissions automatically.
449
449
  process.emitWarning(
450
- 'manifest.json has no top-level manifest_signature field. This tarball predates v0.12.17 manifest signing; skills will still be verified but a coordinated rewrite of manifest.json could go undetected. Re-run `node lib/sign.js sign-all` to add the signature.',
450
+ 'manifest.json has no top-level manifest_signature field. This tarball predates v0.12.17 manifest signing; skills will still be verified but a coordinated rewrite of manifest.json could go undetected. Re-run `exceptd doctor --fix` (or `node $(exceptd path)/lib/sign.js sign-all` from a contributor checkout) to add the signature.',
451
451
  { code: 'EXCEPTD_MANIFEST_UNSIGNED' }
452
452
  );
453
453
  } else if (sigResult.status === 'no-key') {
@@ -693,7 +693,7 @@ if (require.main === module) {
693
693
  if (arg === 'check-key') {
694
694
  const pub = loadPublicKey();
695
695
  if (!pub) {
696
- console.error('[verify] No public key — run: node lib/sign.js generate-keypair');
696
+ console.error('[verify] No public key — run `exceptd doctor --fix` (or `node $(exceptd path)/lib/sign.js generate-keypair` from a contributor checkout)');
697
697
  process.exit(1);
698
698
  }
699
699
  console.log('[verify] Public key present at keys/public.pem');
package/manifest.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "exceptd-security",
3
- "version": "0.12.40",
3
+ "version": "0.12.41",
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",
@@ -53,7 +53,7 @@
53
53
  ],
54
54
  "last_threat_review": "2026-05-01",
55
55
  "signature": "N6H4u/u1fCFE6f/3QVkAr2cumZvLNE+xYBC91CCxKoeaSKm5zqbwzb2mvFDk9XKUegUy5W6npLFGi75yxNMIAg==",
56
- "signed_at": "2026-05-16T15:50:05.556Z",
56
+ "signed_at": "2026-05-17T20:18:30.560Z",
57
57
  "cwe_refs": [
58
58
  "CWE-125",
59
59
  "CWE-362",
@@ -117,7 +117,7 @@
117
117
  ],
118
118
  "last_threat_review": "2026-05-01",
119
119
  "signature": "CmPu9xiYnUQyug3+aQ8jwuros3EGIIxL4/vaSgvaBVgI0Zd96ehlSBHw9ISd3eXzEImvGTdFEYZEpSHoH76fBw==",
120
- "signed_at": "2026-05-16T15:50:05.558Z",
120
+ "signed_at": "2026-05-17T20:18:30.564Z",
121
121
  "cwe_refs": [
122
122
  "CWE-1039",
123
123
  "CWE-1426",
@@ -180,7 +180,7 @@
180
180
  ],
181
181
  "last_threat_review": "2026-05-01",
182
182
  "signature": "5jdS7h9+CgfkXIf0OOLEIBxoBFv9TSQh0HPEs2Ra6hmpFbyBPV6zAs7yFi+66EAXoHicasGL04QA10L0MGZyAg==",
183
- "signed_at": "2026-05-16T15:50:05.559Z",
183
+ "signed_at": "2026-05-17T20:18:30.565Z",
184
184
  "cwe_refs": [
185
185
  "CWE-22",
186
186
  "CWE-345",
@@ -226,7 +226,7 @@
226
226
  "framework_gaps": [],
227
227
  "last_threat_review": "2026-05-01",
228
228
  "signature": "ZfW88vN0se3O9AEpjsfImRFCEC9ayOsNYthRSrj+eIOO8XVu4C0Jk9INSBwX+8ws6ZVsEMvQ3htyouTGIapcCQ==",
229
- "signed_at": "2026-05-16T15:50:05.559Z"
229
+ "signed_at": "2026-05-17T20:18:30.565Z"
230
230
  },
231
231
  {
232
232
  "name": "compliance-theater",
@@ -257,7 +257,7 @@
257
257
  ],
258
258
  "last_threat_review": "2026-05-01",
259
259
  "signature": "OTu6DScKDWxaR1+TZ3S6FGBmf7c6WKkXOdP2MdMwMNjY5OJ7RSSXrOWg4XnT32VRtGncOetlHG47VZ0KgwWNCA==",
260
- "signed_at": "2026-05-16T15:50:05.559Z"
260
+ "signed_at": "2026-05-17T20:18:30.566Z"
261
261
  },
262
262
  {
263
263
  "name": "exploit-scoring",
@@ -286,7 +286,7 @@
286
286
  ],
287
287
  "last_threat_review": "2026-05-01",
288
288
  "signature": "T34BtDdNUzPblA+dG4LSAqNycM1kEFQpQAX6bvXWX3B02LB7VNBfQnD/52sDteAi+ishRf5IihuEYez8wRHGBA==",
289
- "signed_at": "2026-05-16T15:50:05.560Z"
289
+ "signed_at": "2026-05-17T20:18:30.567Z"
290
290
  },
291
291
  {
292
292
  "name": "rag-pipeline-security",
@@ -323,7 +323,7 @@
323
323
  ],
324
324
  "last_threat_review": "2026-05-01",
325
325
  "signature": "kApombCESpQjg17tecmcOIPKxzKuYrkQM78S8eX8jA5ovjGgzl3kIJjcjKib15Vgy/MOpsh0GaWYpCEhCLRyDw==",
326
- "signed_at": "2026-05-16T15:50:05.560Z",
326
+ "signed_at": "2026-05-17T20:18:30.568Z",
327
327
  "cwe_refs": [
328
328
  "CWE-1395",
329
329
  "CWE-1426"
@@ -380,7 +380,7 @@
380
380
  ],
381
381
  "last_threat_review": "2026-05-01",
382
382
  "signature": "DRqLIBG1cJKMeTc5gpzWdb0ThvBTLrWl9CaFx4mNesIImUEWSEycrhILfPQ4fbA1jyhD1dsBJzttTZFKbezFDA==",
383
- "signed_at": "2026-05-16T15:50:05.560Z",
383
+ "signed_at": "2026-05-17T20:18:30.569Z",
384
384
  "d3fend_refs": [
385
385
  "D3-CA",
386
386
  "D3-CSPP",
@@ -415,7 +415,7 @@
415
415
  "framework_gaps": [],
416
416
  "last_threat_review": "2026-05-01",
417
417
  "signature": "87pHjZe0xEuYR18owLqCHDtHNQ7bf8YzF6RaJlILN0n7ohgAdkmhWVODpTMA+/Ku0RLhMwz8dSkx48ue3VfLAw==",
418
- "signed_at": "2026-05-16T15:50:05.561Z",
418
+ "signed_at": "2026-05-17T20:18:30.570Z",
419
419
  "cwe_refs": [
420
420
  "CWE-1188"
421
421
  ]
@@ -443,7 +443,7 @@
443
443
  "framework_gaps": [],
444
444
  "last_threat_review": "2026-05-01",
445
445
  "signature": "X8BQpeJFFTxvE9jWkmqF1J5EnSB63TMNF/VCU6RQLf/+XsGYarOokZ5lWvZT2IL3djwxzzbWhr0BMtuLMtEcAg==",
446
- "signed_at": "2026-05-16T15:50:05.561Z"
446
+ "signed_at": "2026-05-17T20:18:30.570Z"
447
447
  },
448
448
  {
449
449
  "name": "global-grc",
@@ -475,7 +475,7 @@
475
475
  "framework_gaps": [],
476
476
  "last_threat_review": "2026-05-01",
477
477
  "signature": "7yVjZkanFMKDQqXdX4B/7oLc2Rz72xHC1zscYd8F/+e5UAbR7ikK8Bn5EKZt3aBEOhHPAviSQNCMxpZD9U00CA==",
478
- "signed_at": "2026-05-16T15:50:05.562Z"
478
+ "signed_at": "2026-05-17T20:18:30.571Z"
479
479
  },
480
480
  {
481
481
  "name": "zeroday-gap-learn",
@@ -502,7 +502,7 @@
502
502
  "framework_gaps": [],
503
503
  "last_threat_review": "2026-05-01",
504
504
  "signature": "iwosQ4gcFZc+6QSmxUOhHB3jse8tHxd3XsXl155mU4K5UgbctHNhOUKMmF7WnUVfOUQ7PafHiMzZIbevvenNBA==",
505
- "signed_at": "2026-05-16T15:50:05.562Z"
505
+ "signed_at": "2026-05-17T20:18:30.572Z"
506
506
  },
507
507
  {
508
508
  "name": "pqc-first",
@@ -554,7 +554,7 @@
554
554
  ],
555
555
  "last_threat_review": "2026-05-01",
556
556
  "signature": "V+qn5FqUlETfsEjvvi6jZGuQdqLFtFejfgPA6KSYxSlBXBTbOBXP3BGk5S+ba9akIzgbKh1j9VGB1MqsIt56DA==",
557
- "signed_at": "2026-05-16T15:50:05.562Z",
557
+ "signed_at": "2026-05-17T20:18:30.572Z",
558
558
  "cwe_refs": [
559
559
  "CWE-327"
560
560
  ],
@@ -601,7 +601,7 @@
601
601
  ],
602
602
  "last_threat_review": "2026-05-01",
603
603
  "signature": "mqjxjEhZiF+yOlqFr6ak39+NkNsasDxW9in5EBczWDxD9ngIxfnpVjKbnr5g+prB4qz3cG28UBtu8cHz9vJbBw==",
604
- "signed_at": "2026-05-16T15:50:05.563Z"
604
+ "signed_at": "2026-05-17T20:18:30.573Z"
605
605
  },
606
606
  {
607
607
  "name": "security-maturity-tiers",
@@ -638,7 +638,7 @@
638
638
  ],
639
639
  "last_threat_review": "2026-05-01",
640
640
  "signature": "cZnSuh0PwPZjzxgfOoKNYDGz9bbdfDIAlQrUuavmRFxWmdAIoarOYsPwPG8NXYRqzxVdRbu8R7eF/+dssbfZDw==",
641
- "signed_at": "2026-05-16T15:50:05.563Z",
641
+ "signed_at": "2026-05-17T20:18:30.573Z",
642
642
  "cwe_refs": [
643
643
  "CWE-1188"
644
644
  ]
@@ -673,7 +673,7 @@
673
673
  "framework_gaps": [],
674
674
  "last_threat_review": "2026-05-11",
675
675
  "signature": "/lGgWehCMQUXjI6w4FUa+5wrbyRnct+txvVcXA+D2/ZEkoJKh+J/psO3j5HPf7Hpv+Y5SmkH71CoO+9qilyVDQ==",
676
- "signed_at": "2026-05-16T15:50:05.563Z"
676
+ "signed_at": "2026-05-17T20:18:30.575Z"
677
677
  },
678
678
  {
679
679
  "name": "attack-surface-pentest",
@@ -744,7 +744,7 @@
744
744
  "PTES revision incorporating AI-surface enumeration"
745
745
  ],
746
746
  "signature": "Zo+2DFJhxNkEvQ8X+eYnqtLKepukif9IyD7LmqK/MX6tyfOp/gXGl9KEOddhubuV2a79zEc/OGOYfTHsEVzcAg==",
747
- "signed_at": "2026-05-16T15:50:05.564Z"
747
+ "signed_at": "2026-05-17T20:18:30.575Z"
748
748
  },
749
749
  {
750
750
  "name": "fuzz-testing-strategy",
@@ -804,7 +804,7 @@
804
804
  "OSS-Fuzz-Gen / AI-assisted harness generation becoming the default expectation for OSS maintainers"
805
805
  ],
806
806
  "signature": "jZq4Kv81CxQMMOAnw3/A1tBe5fIfrr+SGltivqcmH4WjUKmk6byO5BWCZKTxWWuaGa/AonsSDk5CGUPx9h8ZBw==",
807
- "signed_at": "2026-05-16T15:50:05.564Z"
807
+ "signed_at": "2026-05-17T20:18:30.576Z"
808
808
  },
809
809
  {
810
810
  "name": "dlp-gap-analysis",
@@ -879,7 +879,7 @@
879
879
  "Quebec Law 25, India DPDPA, KSA PDPL enforcement actions naming AI-tool prompt data as in-scope personal information"
880
880
  ],
881
881
  "signature": "vY2ym7pUhzJBD6R6jI4JwSKciqVS1fyVPuszN4WTiKJvYGePkis6w7upk/Fw0OXjnNSNdEf3f534FHRzGk5UDg==",
882
- "signed_at": "2026-05-16T15:50:05.564Z"
882
+ "signed_at": "2026-05-17T20:18:30.576Z"
883
883
  },
884
884
  {
885
885
  "name": "supply-chain-integrity",
@@ -956,7 +956,7 @@
956
956
  "OpenSSF model-signing — emerging Sigstore-based signing standard for ML model weights; track for production adoption"
957
957
  ],
958
958
  "signature": "SB5gpZ8nT7yZNIr9qaXf9l0ShbsE/b1+XYNucaOIi/G6YcjLly+u+mKGiY7qBVv3CP1FO7pbSvB/e5dlR2AsCw==",
959
- "signed_at": "2026-05-16T15:50:05.565Z"
959
+ "signed_at": "2026-05-17T20:18:30.577Z"
960
960
  },
961
961
  {
962
962
  "name": "defensive-countermeasure-mapping",
@@ -1013,7 +1013,7 @@
1013
1013
  ],
1014
1014
  "last_threat_review": "2026-05-11",
1015
1015
  "signature": "XZigwq8X/csfrdG10O6Q1V5q0zUqSQGd3QrjRKkZ4fkaodG4mZahYuIQqxc8rU9jjtGAm9LtBXYB+I5csqj9Bw==",
1016
- "signed_at": "2026-05-16T15:50:05.565Z"
1016
+ "signed_at": "2026-05-17T20:18:30.578Z"
1017
1017
  },
1018
1018
  {
1019
1019
  "name": "identity-assurance",
@@ -1080,7 +1080,7 @@
1080
1080
  "d3fend_refs": [],
1081
1081
  "last_threat_review": "2026-05-11",
1082
1082
  "signature": "k0HrsZMBxiPWB1jl4dRwhv/R5IsqbZ+SLDv1Jx3/sRl51JyXjtm8vyogTNhSwsl5/IkaRakqIPJFRFRl5h/9CQ==",
1083
- "signed_at": "2026-05-16T15:50:05.565Z"
1083
+ "signed_at": "2026-05-17T20:18:30.578Z"
1084
1084
  },
1085
1085
  {
1086
1086
  "name": "ot-ics-security",
@@ -1136,7 +1136,7 @@
1136
1136
  "d3fend_refs": [],
1137
1137
  "last_threat_review": "2026-05-11",
1138
1138
  "signature": "kAYm2ym/wCoYnA0cMP7kY/0R+/IFTzuZ2Dn514xnLdQ+6aTbxJel9tTn+a6d7F8IWidciC9Xx4nG1A11VqofCg==",
1139
- "signed_at": "2026-05-16T15:50:05.566Z"
1139
+ "signed_at": "2026-05-17T20:18:30.579Z"
1140
1140
  },
1141
1141
  {
1142
1142
  "name": "coordinated-vuln-disclosure",
@@ -1188,7 +1188,7 @@
1188
1188
  "NYDFS 23 NYCRR 500 amendments potentially adding explicit CVD program requirements"
1189
1189
  ],
1190
1190
  "signature": "f1w8AOT3bw+IeaAkg+vubUf7+Gx+/zTuQyIKOxQTbF9m1HGIE/SJQlWZST9ALtlH1BN4gJK5WPRmloX6LzQYBw==",
1191
- "signed_at": "2026-05-16T15:50:05.566Z"
1191
+ "signed_at": "2026-05-17T20:18:30.579Z"
1192
1192
  },
1193
1193
  {
1194
1194
  "name": "threat-modeling-methodology",
@@ -1238,7 +1238,7 @@
1238
1238
  "PASTA v2 updates incorporating AI/ML application threats"
1239
1239
  ],
1240
1240
  "signature": "bOexHUZApL+t6r84lombGCRHOh8jT9f3rm9ckcdu0Mz6hKuoa9uMGq5D+JESKMoOdFMPMZM4KpjZ+fcYExp2AQ==",
1241
- "signed_at": "2026-05-16T15:50:05.567Z"
1241
+ "signed_at": "2026-05-17T20:18:30.580Z"
1242
1242
  },
1243
1243
  {
1244
1244
  "name": "webapp-security",
@@ -1312,7 +1312,7 @@
1312
1312
  "d3fend_refs": [],
1313
1313
  "last_threat_review": "2026-05-11",
1314
1314
  "signature": "TS1bOSeoGVK77LkHrUrZALK5PeturDTZe68vippxgJ9q7dQYa6n+CQFydiPfam2HZZJWtRHfs+4bL8PS7qQtAw==",
1315
- "signed_at": "2026-05-16T15:50:05.567Z"
1315
+ "signed_at": "2026-05-17T20:18:30.581Z"
1316
1316
  },
1317
1317
  {
1318
1318
  "name": "ai-risk-management",
@@ -1362,7 +1362,7 @@
1362
1362
  "d3fend_refs": [],
1363
1363
  "last_threat_review": "2026-05-11",
1364
1364
  "signature": "8E82UwKFNraXV/MKAbiUV6gUryYuN+Ff/kiv1aW4/XtriShdTyt/UgRuQJ8LXGXl0jMH8hRJ/xTAV8LOJqexDA==",
1365
- "signed_at": "2026-05-16T15:50:05.567Z"
1365
+ "signed_at": "2026-05-17T20:18:30.581Z"
1366
1366
  },
1367
1367
  {
1368
1368
  "name": "sector-healthcare",
@@ -1422,7 +1422,7 @@
1422
1422
  "d3fend_refs": [],
1423
1423
  "last_threat_review": "2026-05-11",
1424
1424
  "signature": "oW7JP2esMH8RxJKHnKXj3uHKJ7E5iEvp+fg1PQWRL0FbTu1K/SwY56tVzeBZgfNBGb5W4Q7TKk7r+Fh9tXD+AQ==",
1425
- "signed_at": "2026-05-16T15:50:05.568Z"
1425
+ "signed_at": "2026-05-17T20:18:30.582Z"
1426
1426
  },
1427
1427
  {
1428
1428
  "name": "sector-financial",
@@ -1503,7 +1503,7 @@
1503
1503
  "TIBER-EU framework v2.0 alignment with DORA TLPT RTS (JC 2024/40); cross-recognition with CBEST and iCAST"
1504
1504
  ],
1505
1505
  "signature": "8YE9Csb1WGVXzHUG2ZIw7vG0f4h6xZ3dqZMH8vsCzs9/uNaifToOhHXfjfzycqoE9jmOTcp2lFLTvim1FrJjCA==",
1506
- "signed_at": "2026-05-16T15:50:05.568Z"
1506
+ "signed_at": "2026-05-17T20:18:30.583Z"
1507
1507
  },
1508
1508
  {
1509
1509
  "name": "sector-federal-government",
@@ -1572,7 +1572,7 @@
1572
1572
  "Australia PSPF 2024 revision and ISM quarterly updates — track for Essential Eight Maturity Level requirements for federal entities"
1573
1573
  ],
1574
1574
  "signature": "OJVU06d5AVJffRAWuo1FlkEmtNXckfte/aHBIny98w5644d7jcxxj7I1VH7PaRaBOz049T5MJ9PlAwaRIB2LDA==",
1575
- "signed_at": "2026-05-16T15:50:05.568Z"
1575
+ "signed_at": "2026-05-17T20:18:30.584Z"
1576
1576
  },
1577
1577
  {
1578
1578
  "name": "sector-energy",
@@ -1637,7 +1637,7 @@
1637
1637
  "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"
1638
1638
  ],
1639
1639
  "signature": "kp9RgI7ViCNA2fxdbPZQxKlIVSvcArIyYqQdfojgvh9OYALvI4Bp3XB2RMcJZX1VORfUm3bKZjV8MRZsqCNtDg==",
1640
- "signed_at": "2026-05-16T15:50:05.569Z"
1640
+ "signed_at": "2026-05-17T20:18:30.585Z"
1641
1641
  },
1642
1642
  {
1643
1643
  "name": "sector-telecom",
@@ -1723,7 +1723,7 @@
1723
1723
  "O-RAN SFG / WG11 security specifications"
1724
1724
  ],
1725
1725
  "signature": "VKLuoRkFq7lNXqySipwzPSaiHaqemHQ2cReemF/Xy9hUpD9orQaTVZWClOA4lzoF6d2eQ/CeS///Jjnj4g9dCg==",
1726
- "signed_at": "2026-05-16T15:50:05.569Z"
1726
+ "signed_at": "2026-05-17T20:18:30.585Z"
1727
1727
  },
1728
1728
  {
1729
1729
  "name": "api-security",
@@ -1792,7 +1792,7 @@
1792
1792
  "d3fend_refs": [],
1793
1793
  "last_threat_review": "2026-05-11",
1794
1794
  "signature": "bhgnM/PkYgduLokq5dCSm1geELvrfvKCGG4mwfgn4X9NdrheI1cjnrOqZjbOEt2q44iH2vDhqLJeA9l85GMeAg==",
1795
- "signed_at": "2026-05-16T15:50:05.570Z"
1795
+ "signed_at": "2026-05-17T20:18:30.586Z"
1796
1796
  },
1797
1797
  {
1798
1798
  "name": "cloud-security",
@@ -1873,7 +1873,7 @@
1873
1873
  "CISA KEV additions for cloud-control-plane CVEs (IMDSv1 abuses, federation token mishandling, cross-tenant boundary failures); CISA Cybersecurity Advisories for cross-cloud advisories"
1874
1874
  ],
1875
1875
  "signature": "wTxiyl9IN127tDk8msLw1/0REqZ3Ldeyj5HSwNdmJWOFkqGs1MbgQYFt0wCSVNcGtdoWtZtV6uuUxdOlCoo4AA==",
1876
- "signed_at": "2026-05-16T15:50:05.570Z"
1876
+ "signed_at": "2026-05-17T20:18:30.587Z"
1877
1877
  },
1878
1878
  {
1879
1879
  "name": "container-runtime-security",
@@ -1935,7 +1935,7 @@
1935
1935
  "d3fend_refs": [],
1936
1936
  "last_threat_review": "2026-05-11",
1937
1937
  "signature": "kYHthY7uKOnVV64XC7evRWZuwQxY1Ihdsz4KAqGFnjTg+9hkBMcMfW1K3lwCIXEXElENznsZ8RI6LcwcbmDjBg==",
1938
- "signed_at": "2026-05-16T15:50:05.571Z"
1938
+ "signed_at": "2026-05-17T20:18:30.587Z"
1939
1939
  },
1940
1940
  {
1941
1941
  "name": "mlops-security",
@@ -2005,8 +2005,8 @@
2005
2005
  "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",
2006
2006
  "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"
2007
2007
  ],
2008
- "signature": "L0OCRb+jIzUqdx+pZHY9WsF1fJ+FxGF3+ALWqjHerBi+EbHxi5js81xZMATRf4dIGH/4YpSjVn5Xu/apu94lBA==",
2009
- "signed_at": "2026-05-16T15:50:05.571Z"
2008
+ "signature": "e4IaAtuKgDd7wzaV5Fs8unk3ui1PVMSM7/sLsHTxo5e/kA7i/KHuiQ/K7xQciqe6iuyAx+6NGA4DnPlKaAMGBw==",
2009
+ "signed_at": "2026-05-17T20:18:30.588Z"
2010
2010
  },
2011
2011
  {
2012
2012
  "name": "incident-response-playbook",
@@ -2068,7 +2068,7 @@
2068
2068
  "NYDFS 23 NYCRR 500.17 amendments tightening ransom-payment 24h disclosure operationalization"
2069
2069
  ],
2070
2070
  "signature": "f2AhpIOdMBZaOPfGa0ebnHc0Iofv5Aj+NcyW3rwlP7oxx4WbvhO5n+ECVtqZ8HRoD3BC/2KxrFGcvBhnObf+AA==",
2071
- "signed_at": "2026-05-16T15:50:05.571Z"
2071
+ "signed_at": "2026-05-17T20:18:30.589Z"
2072
2072
  },
2073
2073
  {
2074
2074
  "name": "ransomware-response",
@@ -2148,7 +2148,7 @@
2148
2148
  ],
2149
2149
  "last_threat_review": "2026-05-15",
2150
2150
  "signature": "2+KCRXcUy0d1DdV2RHNFTCadii+2m9DXVcygPVFITwoGbNwnN3e10JZRjLewMtRkxXboYPZ7Qt25xoDRszYQAg==",
2151
- "signed_at": "2026-05-16T15:50:05.572Z"
2151
+ "signed_at": "2026-05-17T20:18:30.589Z"
2152
2152
  },
2153
2153
  {
2154
2154
  "name": "email-security-anti-phishing",
@@ -2201,7 +2201,7 @@
2201
2201
  "d3fend_refs": [],
2202
2202
  "last_threat_review": "2026-05-11",
2203
2203
  "signature": "RiCryJEd66T2NNcSo/mZTd3sGWDycE3C37guLJanLdVL5co35DrPFmIl8qy3ZM/y+Wzg5vpny8VKgr1//1/bCA==",
2204
- "signed_at": "2026-05-16T15:50:05.572Z"
2204
+ "signed_at": "2026-05-17T20:18:30.590Z"
2205
2205
  },
2206
2206
  {
2207
2207
  "name": "age-gates-child-safety",
@@ -2269,7 +2269,7 @@
2269
2269
  "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"
2270
2270
  ],
2271
2271
  "signature": "rRX0+wEkhrjEIi1e+OSjg1U5uR0/hDoaai36WcIrzxViRVuIS5WwyH0GBeJF1eTcbMOIvd7QZApG8aHbXmTpAg==",
2272
- "signed_at": "2026-05-16T15:50:05.572Z"
2272
+ "signed_at": "2026-05-17T20:18:30.590Z"
2273
2273
  },
2274
2274
  {
2275
2275
  "name": "cloud-iam-incident",
@@ -2349,7 +2349,7 @@
2349
2349
  ],
2350
2350
  "last_threat_review": "2026-05-15",
2351
2351
  "signature": "L85ONmu51m4EKwat2IJlMYz9V3Wvl+ISVHe92B01/mfPv/kf0TpYqaUZ8NoBT9G4rO5yNUtsWS0NMOJHHNANCA==",
2352
- "signed_at": "2026-05-16T15:50:05.573Z"
2352
+ "signed_at": "2026-05-17T20:18:30.591Z"
2353
2353
  },
2354
2354
  {
2355
2355
  "name": "idp-incident-response",
@@ -2430,11 +2430,11 @@
2430
2430
  ],
2431
2431
  "last_threat_review": "2026-05-15",
2432
2432
  "signature": "n9d4fdaSHCMieXRDkBz88kITsUFFlngr2gn2IvGFqJLH+xOEDp4ohS62Vk/zq4+Mhi4QEVKSu3mONOAk3nsYBQ==",
2433
- "signed_at": "2026-05-16T15:50:05.573Z"
2433
+ "signed_at": "2026-05-17T20:18:30.592Z"
2434
2434
  }
2435
2435
  ],
2436
2436
  "manifest_signature": {
2437
2437
  "algorithm": "Ed25519",
2438
- "signature_base64": "PSaiWmP07ZPzixTlLo78S2sTFrqFcmEDwc5WgdY3+mjU0sssloownIt/Jf8hjvP3/qXuoQLZUFgE2dAn/EAfAw=="
2438
+ "signature_base64": "tL22F4bchkekSqLelV6NAGjU7xdiu9ErmwqyJtZTjKz1S2HAhYVfnIEG9dLJbrTKXMZR6kWdT5qdYn8FdRPPDw=="
2439
2439
  }
2440
2440
  }
@@ -60,25 +60,25 @@ Scheduled tasks:
60
60
 
61
61
  ```bash
62
62
  # Scan current environment and produce findings
63
- node orchestrator/index.js scan
63
+ exceptd scan
64
64
 
65
65
  # Route findings to relevant skills
66
- node orchestrator/index.js dispatch
66
+ exceptd dispatch
67
67
 
68
68
  # Run a specific skill programmatically
69
- node orchestrator/index.js skill kernel-lpe-triage
69
+ exceptd skill kernel-lpe-triage
70
70
 
71
71
  # Run the full agent pipeline (threat-researcher → report)
72
- node orchestrator/index.js pipeline
72
+ exceptd pipeline
73
73
 
74
74
  # Check skill currency scores
75
- node orchestrator/index.js currency
75
+ exceptd currency
76
76
 
77
77
  # Generate an executive report from current findings
78
- node orchestrator/index.js report --format executive
78
+ exceptd report --format executive
79
79
 
80
80
  # Watch for events and trigger updates automatically
81
- node orchestrator/index.js watch
81
+ exceptd watch
82
82
  ```
83
83
 
84
84
  ## Output Formats
@@ -145,7 +145,10 @@ Examples:
145
145
  exceptd framework-gap NIST-800-53 CVE-2026-31431
146
146
  exceptd framework-gap PCI-DSS-4.0 "prompt injection"
147
147
  exceptd framework-gap all CVE-2025-53773 --json`);
148
- process.exit(2);
148
+ // Pinned exit 2 by operator contract. Envelope harmonization
149
+ // across orchestrator + CLI is a v0.13 concern.
150
+ process.exitCode = 2;
151
+ return;
149
152
  }
150
153
 
151
154
  const root = path.join(__dirname, '..');
@@ -155,7 +158,8 @@ Examples:
155
158
  cveCatalog = JSON.parse(fs.readFileSync(path.join(root, 'data', 'cve-catalog.json'), 'utf8'));
156
159
  } catch (err) {
157
160
  console.error(`[framework-gap] cannot read catalog: ${err.message}`);
158
- process.exit(2);
161
+ process.exitCode = 2;
162
+ return;
159
163
  }
160
164
 
161
165
  const requested = args[0].toLowerCase() === 'all'
@@ -292,20 +296,24 @@ async function runDispatch() {
292
296
 
293
297
  function runSkillContext(skillName) {
294
298
  if (!skillName) {
295
- // Cycle 20 A P2 (v0.12.40): operator-facing surface must reference
296
- // the canonical `exceptd skill <name>` form, not the orchestrator
297
- // path that's an implementation detail. CLAUDE.md global rule:
298
- // "no internal narrative in operator-facing artifacts."
299
+ // v0.12.40: operator-facing surface uses the canonical `exceptd skill
300
+ // <name>` form, not the orchestrator path that's an implementation
301
+ // detail.
299
302
  console.error('Usage: exceptd skill <skill-name>');
300
303
  console.error(' (Lists available skills: exceptd brief --all)');
301
- process.exit(1);
304
+ process.exitCode = 1;
305
+ return;
302
306
  }
303
307
 
304
308
  const context = getSkillContext(skillName);
305
309
  if (!context) {
306
310
  // Unified error shape across the CLI surface — see v0.10.3 bug #18.
311
+ // Stderr is the documented stream for ok:false bodies emitted by
312
+ // orchestrator dispatch; envelope harmonization across the CLI is
313
+ // a v0.13 concern.
307
314
  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");
308
- process.exit(1);
315
+ process.exitCode = 1;
316
+ return;
309
317
  }
310
318
 
311
319
  console.log(`Skill: ${context.skill.name} v${context.skill.version}`);
@@ -332,7 +340,7 @@ function runPipeline(triggerType, payload) {
332
340
  console.log(` Agent: ${stage.agent_path}`);
333
341
  }
334
342
  console.log('\nTo run each stage, load the agent definition and follow its instructions:');
335
- console.log(' node orchestrator/index.js skill skill-update-loop');
343
+ console.log(' exceptd skill skill-update-loop');
336
344
  return run;
337
345
  }
338
346
 
@@ -368,12 +376,16 @@ async function runReport(format) {
368
376
  // string. Now: reject with structured JSON error matching other verbs.
369
377
  const VALID_REPORT_FORMATS = ['executive', 'technical', 'compliance', 'csaf'];
370
378
  if (!VALID_REPORT_FORMATS.includes(format)) {
379
+ // Pinned exit 2 + stderr-stream by operator contract. Envelope
380
+ // harmonization across orchestrator + CLI is a v0.13 concern.
371
381
  process.stderr.write(JSON.stringify({
372
382
  ok: false,
373
383
  error: `report: format "${format}" not in accepted set ${JSON.stringify(VALID_REPORT_FORMATS)}.`,
374
384
  verb: 'report',
385
+ accepted_formats: VALID_REPORT_FORMATS,
375
386
  }) + '\n');
376
- process.exit(2);
387
+ process.exitCode = 2;
388
+ return;
377
389
  }
378
390
 
379
391
  // v0.11.1 feature #55: `report csaf` emits a CSAF 2.0 envelope covering
@@ -1078,7 +1090,8 @@ function runWatchlist(rawArgs = []) {
1078
1090
  manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));
1079
1091
  } catch (err) {
1080
1092
  console.error(`[watchlist] cannot read ${manifestPath}: ${err.message}`);
1081
- process.exit(2);
1093
+ process.exitCode = 2;
1094
+ return;
1082
1095
  }
1083
1096
 
1084
1097
  // Exclude entries that are explicitly marked `status: "deprecated"` so
@@ -1378,11 +1391,11 @@ Environment variables:
1378
1391
  EXCEPTD_SCAN_TARGETS Directories to scan for MCP configs
1379
1392
 
1380
1393
  Examples:
1381
- node orchestrator/index.js scan
1382
- node orchestrator/index.js skill kernel-lpe-triage
1383
- node orchestrator/index.js currency
1384
- node orchestrator/index.js report executive
1385
- node orchestrator/index.js watch
1394
+ exceptd scan
1395
+ exceptd skill kernel-lpe-triage
1396
+ exceptd currency
1397
+ exceptd report executive
1398
+ exceptd watch
1386
1399
  `);
1387
1400
  }
1388
1401
 
@@ -1394,7 +1407,7 @@ Examples:
1394
1407
  if (require.main === module) {
1395
1408
  main().catch(err => {
1396
1409
  console.error('[orchestrator] Fatal:', err.message);
1397
- process.exit(1);
1410
+ process.exitCode = 1;
1398
1411
  });
1399
1412
  }
1400
1413
 
@@ -277,12 +277,12 @@ function runMonthlyCveValidation() {
277
277
  console.log(`[scheduler] Monthly CVE validation reminder — ${timestamp}`);
278
278
  console.log('[scheduler] Action: Verify all data/cve-catalog.json entries against NVD and CISA KEV.');
279
279
  console.log('[scheduler] Action: Update last_verified dates in data/exploit-availability.json.');
280
- console.log('[scheduler] Run: node orchestrator/index.js validate-cves');
280
+ console.log('[scheduler] Run: exceptd validate-cves');
281
281
 
282
282
  return {
283
283
  task: 'monthly_cve_validation',
284
284
  timestamp,
285
- action: 'Run node orchestrator/index.js validate-cves to check all CVE entries'
285
+ action: 'Run `exceptd validate-cves` to check all CVE entries'
286
286
  };
287
287
  }
288
288
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blamejs/exceptd-skills",
3
- "version": "0.12.40",
3
+ "version": "0.12.41",
4
4
  "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.",
5
5
  "keywords": [
6
6
  "ai-security",