@blamejs/exceptd-skills 0.13.62 → 0.13.64

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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@blamejs/exceptd-skills",
3
- "version": "0.13.62",
4
- "description": "AI security skills grounded in mid-2026 threat reality, not stale framework documentation. 42 skills, 10 catalogs (312 CVEs / 171 CWEs / 805 ATT&CK + ICS / 170 ATLAS / 468 D3FEND / 7476 RFCs), 35 jurisdictions, 10-class catalog gap detector + budget gate, real XML parser + canonical-form diff + content-pattern regression detection, Ed25519-signed.",
3
+ "version": "0.13.64",
4
+ "description": "AI security skills grounded in mid-2026 threat reality, not stale framework documentation. 42 skills, 11 catalogs (312 CVEs / 171 CWEs / 805 ATT&CK + ICS / 170 ATLAS / 468 D3FEND / 7476 RFCs), 35 jurisdictions, 10-class catalog gap detector + budget gate, real XML parser + canonical-form diff + content-pattern regression detection, Ed25519-signed.",
5
5
  "keywords": [
6
6
  "ai-security",
7
7
  "ai-skills",
package/sbom.cdx.json CHANGED
@@ -1,23 +1,23 @@
1
1
  {
2
2
  "bomFormat": "CycloneDX",
3
3
  "specVersion": "1.6",
4
- "serialNumber": "urn:uuid:d905be3b-b5b0-4701-9bc1-43dcc2f5fb90",
4
+ "serialNumber": "urn:uuid:aaf8fc24-f4e2-4453-8640-762eede96983",
5
5
  "version": 1,
6
6
  "metadata": {
7
- "timestamp": "2141-05-19T13:50:51.000Z",
7
+ "timestamp": "2116-11-24T14:03:16.000Z",
8
8
  "tools": [
9
9
  {
10
10
  "vendor": "blamejs",
11
11
  "name": "scripts/refresh-sbom.js",
12
- "version": "0.13.62"
12
+ "version": "0.13.64"
13
13
  }
14
14
  ],
15
15
  "component": {
16
- "bom-ref": "pkg:npm/@blamejs/exceptd-skills@0.13.62",
16
+ "bom-ref": "pkg:npm/@blamejs/exceptd-skills@0.13.64",
17
17
  "type": "application",
18
18
  "name": "@blamejs/exceptd-skills",
19
- "version": "0.13.62",
20
- "description": "AI security skills grounded in mid-2026 threat reality, not stale framework documentation. 42 skills, 10 catalogs (312 CVEs / 171 CWEs / 805 ATT&CK + ICS / 170 ATLAS / 468 D3FEND / 7476 RFCs), 35 jurisdictions, 10-class catalog gap detector + budget gate, real XML parser + canonical-form diff + content-pattern regression detection, Ed25519-signed.",
19
+ "version": "0.13.64",
20
+ "description": "AI security skills grounded in mid-2026 threat reality, not stale framework documentation. 42 skills, 11 catalogs (312 CVEs / 171 CWEs / 805 ATT&CK + ICS / 170 ATLAS / 468 D3FEND / 7476 RFCs), 35 jurisdictions, 10-class catalog gap detector + budget gate, real XML parser + canonical-form diff + content-pattern regression detection, Ed25519-signed.",
21
21
  "licenses": [
22
22
  {
23
23
  "license": {
@@ -25,17 +25,17 @@
25
25
  }
26
26
  }
27
27
  ],
28
- "purl": "pkg:npm/%40blamejs/exceptd-skills@0.13.62",
28
+ "purl": "pkg:npm/%40blamejs/exceptd-skills@0.13.64",
29
29
  "hashes": [
30
30
  {
31
31
  "alg": "SHA-256",
32
- "content": "69652e30ed68856a926cc9b7993e8b629916bcfa4b9783edb94a7322fcfff6e9"
32
+ "content": "1e6d554aa266e9d6a150562f44b56772728eb5cfed34a0e46c395dcff7f02016"
33
33
  }
34
34
  ],
35
35
  "externalReferences": [
36
36
  {
37
37
  "type": "distribution",
38
- "url": "https://www.npmjs.com/package/@blamejs/exceptd-skills/v/0.13.62"
38
+ "url": "https://www.npmjs.com/package/@blamejs/exceptd-skills/v/0.13.64"
39
39
  },
40
40
  {
41
41
  "type": "vcs",
@@ -116,11 +116,11 @@
116
116
  "hashes": [
117
117
  {
118
118
  "alg": "SHA-256",
119
- "content": "56b52f1a5a7e134c2578bb4c1f676ddaff8c9210572978a42ee4e74438cef1fa"
119
+ "content": "964e4c41230e398ab679c1bcbc2b977eb68967c7275ab5bed51063281335acf3"
120
120
  },
121
121
  {
122
122
  "alg": "SHA3-512",
123
- "content": "f2e0e0a96f6c5eec7b66b66a9048fef9f2f9cd4bcde0aa1c62564cb65676132c7339861c445bad81a96dc3357e4e9263b434330550c339a497d340c47dba6287"
123
+ "content": "86c39b266e94f5e732d971b92cba0e831ef725b9a0fc9e516585e2d6fdca4f98dca6d48f867501244e64342ca20ac5af2f1ed96806f2f43011dd207124970a6f"
124
124
  }
125
125
  ]
126
126
  },
@@ -296,11 +296,11 @@
296
296
  "hashes": [
297
297
  {
298
298
  "alg": "SHA-256",
299
- "content": "d296c1d3e71807c9279b731f047e57796e85137f186586743a8cdad214b408f9"
299
+ "content": "019f12d24dc45ef8f5ae8812dec7c31a9506429a94751aaa559890a007ec6b22"
300
300
  },
301
301
  {
302
302
  "alg": "SHA3-512",
303
- "content": "8db56ff2f1cc24058a4bb8533c76afa36700c9a36ee75bdf75573dac08f82e938d9f7ae463eda9fd4a32beac4d6b6c9d31d2b0d1c44de1c4b35de621b133e545"
303
+ "content": "d0429743b5a07dd04aaf02939ab95d9ca830081794ad2181c3a1f2051a161b5f566f3833fedc0d17e3da4dc8c5c76199e7168506d0aa3ede88fc89c685d2d71d"
304
304
  }
305
305
  ]
306
306
  },
@@ -401,11 +401,11 @@
401
401
  "hashes": [
402
402
  {
403
403
  "alg": "SHA-256",
404
- "content": "b63fe398c3de068093871e8bbca11e16b6567fb15482648d0bbce06939c34104"
404
+ "content": "2f6147edef1cdec29ae755ec42021038145a702d908a1d5cf0a42e2484cbc786"
405
405
  },
406
406
  {
407
407
  "alg": "SHA3-512",
408
- "content": "e64c9e219f6e77fbb235ed875b1775ff6150bffc49fae5903600b15d3799f0d8a27dd553869646e3d0311c5b7fbe456686d9f7bf7e10c0c4cbc71079bcd943ff"
408
+ "content": "720db4c5e625812ac1f9724a17e7cee2b4bca508156570d4eff74bef216d305e9a0c903f24f0ccd3180f751d00f5cf57ef8c45acfa87f389c0691872e3260814"
409
409
  }
410
410
  ]
411
411
  },
@@ -1661,11 +1661,11 @@
1661
1661
  "hashes": [
1662
1662
  {
1663
1663
  "alg": "SHA-256",
1664
- "content": "a5c737f12027f2dbea6de6ea9e540a81a075ba49cf0d4d72bdb9b247732e3907"
1664
+ "content": "7bef48dc556daf70b02e3816e1be1392c249559ea08c2365946cd215126d1d65"
1665
1665
  },
1666
1666
  {
1667
1667
  "alg": "SHA3-512",
1668
- "content": "0585a67e2809ecd5de7f1d82d4328e7dac571acd2e0a3c63c9d0d912277bc9e433fe5413d3d4131be59f3a6568f883539ec342a2735b39a55d851fbafb9e5c5b"
1668
+ "content": "48b457fd2443722a838b1af9f29c4cbc813b8a0bcacbca43164b6483928fdead501d946df8ca671988a6148f8c7645ea7ca8411e8962d6f21813b1de3b187f2b"
1669
1669
  }
1670
1670
  ]
1671
1671
  },
@@ -1796,11 +1796,11 @@
1796
1796
  "hashes": [
1797
1797
  {
1798
1798
  "alg": "SHA-256",
1799
- "content": "9b92e14442f93b57ce7cd3cc4ac6f8eec8fca33670397fde07ddaf0ec7200428"
1799
+ "content": "94d280168dbf61199f0fb46175558db3da6e4df3fc68600c2ccd1638e9caa667"
1800
1800
  },
1801
1801
  {
1802
1802
  "alg": "SHA3-512",
1803
- "content": "6413dc8558a4d167889dce292f1fe88de8839afa78a0bbe5464414f5ccdf6d5062401c0a35d68200b32edbe2510c4ac42edecfc2411a60bb87107e9c12c48c7a"
1803
+ "content": "b51f7a6020f6ea435fb49a09598a1ed609c70d54d542f330385d9480aa3d93ec9b76c14d8d6907100157ef8af7df5b0b59232425ff18c365c677643d573f9b00"
1804
1804
  }
1805
1805
  ]
1806
1806
  },
@@ -1886,11 +1886,11 @@
1886
1886
  "hashes": [
1887
1887
  {
1888
1888
  "alg": "SHA-256",
1889
- "content": "bfa54dc9dd5eea4e9fe18db8f5d609634a1d04870c37b7ceadf38b1c70020b2e"
1889
+ "content": "48cbb215f1a89ee4474503a85aa1532554a3aea45666db9aebd066a05a3305d8"
1890
1890
  },
1891
1891
  {
1892
1892
  "alg": "SHA3-512",
1893
- "content": "4e2648f3db02eab2dc069ad26c04af7ebfe57fda54a1230691407c92f831a3f389bdfcd54b1cfce2e5e7a38f50df866d923947a2902b786b04fd97660050e0b0"
1893
+ "content": "cef6b4730a597b008322ea27f48ae4b98fe1b3c7cc3f5ee2f52d774b7fb922151007025b7f56b8aba9a003cf08272cea871466db9e7c321882dd31d78f0dab48"
1894
1894
  }
1895
1895
  ]
1896
1896
  },
@@ -2359,6 +2359,21 @@
2359
2359
  }
2360
2360
  ]
2361
2361
  },
2362
+ {
2363
+ "bom-ref": "file:scripts/sync-manifest-metadata.js",
2364
+ "type": "file",
2365
+ "name": "scripts/sync-manifest-metadata.js",
2366
+ "hashes": [
2367
+ {
2368
+ "alg": "SHA-256",
2369
+ "content": "fff6e7b8d8d50d30fa8839bf529fb7551f4b78541d7dddc2613064bff4a0cc8b"
2370
+ },
2371
+ {
2372
+ "alg": "SHA3-512",
2373
+ "content": "b1adf63200cf14cbd6757c963e3f4c67342ed3db9ee33ae73dcaf5e34a00c862d2d40f5be26af0acd274eb7855481c4ab6ee7638253b7e94af9c92572e1110d8"
2374
+ }
2375
+ ]
2376
+ },
2362
2377
  {
2363
2378
  "bom-ref": "file:scripts/validate-vendor-online.js",
2364
2379
  "type": "file",
@@ -2561,11 +2576,11 @@
2561
2576
  "hashes": [
2562
2577
  {
2563
2578
  "alg": "SHA-256",
2564
- "content": "331a0248dd8ed3b509b759c41a9a4d6d8d6dc67fb732ad31d1a4c2d9a0865054"
2579
+ "content": "dd89c729e7bbfa3c9455dec9b986455dec3c720249c559d2195179a5cbbb2933"
2565
2580
  },
2566
2581
  {
2567
2582
  "alg": "SHA3-512",
2568
- "content": "f73a601d687c506cd75c28b19f3a14ffa47b5267f1e4a558f2b12d9e89739f636fe7fedef901e3ffec4556f0e5b77ca979cfdca5a26a46d2dd56ae422638b4db"
2583
+ "content": "bf3fccad2e6e7b6027cd65c16336412e12b84fa388454b8d030ad610c3e56e17611eb815ab8288b76d3e29654b41be7db6162d868b4d6316a331fd7d1c039b29"
2569
2584
  }
2570
2585
  ]
2571
2586
  },
@@ -2831,11 +2846,11 @@
2831
2846
  "hashes": [
2832
2847
  {
2833
2848
  "alg": "SHA-256",
2834
- "content": "959aeba706eea43a69136561968d7942dcd981d0a6c3da7db47673c51943b6df"
2849
+ "content": "dc8ceab8f69af370abb1165ed14ead6f3e9d236a8f703165eba52014ebfd43ab"
2835
2850
  },
2836
2851
  {
2837
2852
  "alg": "SHA3-512",
2838
- "content": "541f0378a7369de146e0b71a57a98e29d634e3c716eddd114c9de391348566ebb1545c6625b08e5c79804934b3e45875108f511bf2d8112069b828a76a2c5d9f"
2853
+ "content": "b08fe447bf5cc57f967207ad2926b139446f3034cb5145bad83918531fd4bcf5b1ee3f97db538ab4932407face1b922ea399c266f35b56005c4d73fd82a24fe1"
2839
2854
  }
2840
2855
  ]
2841
2856
  },
@@ -228,7 +228,12 @@ if (badgeMatch && Number(badgeMatch[1]) !== skills.length) {
228
228
  const jurBadge = readme.match(/jurisdictions-(\d+)-/);
229
229
  const liveJurs = (() => {
230
230
  const g = JSON.parse(fs.readFileSync(ABS("data/global-frameworks.json"), "utf8"));
231
- return Object.keys(g).filter((k) => !k.startsWith("_") && k !== "GLOBAL").length;
231
+ // Canonical jurisdiction count: every non-metadata top-level entry in the
232
+ // registry. GLOBAL (the International / Multi-Jurisdiction standards scope:
233
+ // ISO, CSA, CIS) is a counted entry, matching the README badge and the
234
+ // catalog-summary index. Only `_`-prefixed keys (_meta, _notification_summary,
235
+ // _patch_sla_summary) are metadata and excluded.
236
+ return Object.keys(g).filter((k) => !k.startsWith("_")).length;
232
237
  })();
233
238
  if (jurBadge && Number(jurBadge[1]) !== liveJurs) {
234
239
  note(`README BADGE DRIFT: shows jurisdictions-${jurBadge[1]}- but live count is ${liveJurs}`);
@@ -18,10 +18,10 @@ const path = require("path");
18
18
  const CATALOG_PURPOSES = {
19
19
  "cve-catalog.json": "Per-CVE record (CVSS, EPSS, CISA KEV, RWEP, AI-discovery, vendor advisories, framework gaps, ATLAS/ATT&CK mappings). Cross-validated against NVD + CISA KEV + FIRST EPSS via validate-cves.",
20
20
  "cwe-catalog.json": "MITRE CWE entries used by the project (subset with skill citations), with severity hint and category. Pinned to a CWE catalog version.",
21
- "atlas-ttps.json": "MITRE ATLAS TTPs (AML.T0xxx) cited by skills, with tactic, name, description. Pinned to ATLAS v5.6.0 (February 2026).",
21
+ "atlas-ttps.json": "MITRE ATLAS TTPs (AML.T0xxx) cited by skills, with tactic, name, description. Pinned to ATLAS v5.6.0 (May 2026).",
22
22
  "d3fend-catalog.json": "MITRE D3FEND countermeasures (D3-xxx) keyed by id, with tactic + name. Pinned to D3FEND v1.0.0 release.",
23
23
  "framework-control-gaps.json": "Per-control framework gap declarations: SI-2, A.8.8, PCI 6.3.3, etc. Each entry names the control, the lag, the evidence CVE, and remediation guidance.",
24
- "global-frameworks.json": "Multi-jurisdiction framework registry: 35 jurisdictions × applicable frameworks × patch_sla / notification_sla / critical_controls / framework_gaps. Cross-cutting authority for jurisdiction-clocks index.",
24
+ "global-frameworks.json": "Multi-jurisdiction framework registry: per-jurisdiction applicable frameworks × patch_sla / notification_sla / critical_controls / framework_gaps (jurisdiction count is reported by entry_count, not duplicated here). Cross-cutting authority for jurisdiction-clocks index.",
25
25
  "exploit-availability.json": "Per-CVE exploit availability: PoC public status, weaponization signal, AI-assist status, blast-radius. Project-curated (B2 Admiralty confidence) with source citations.",
26
26
  "zeroday-lessons.json": "Distilled lessons from notable zero-days and campaigns (SesameOp, Copy Fail, Dirty Frag, Copilot RCE, Windsurf MCP). Each entry: technique, distinguishing characteristic, what it means for the framework lag.",
27
27
  "rfc-references.json": "IETF RFCs + active Internet-Drafts cited by skills (TLS, IPsec, PQ crypto migration, HTTP/3, CT). Cross-validated against IETF Datatracker via validate-rfcs.",
@@ -0,0 +1,88 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * scripts/sync-manifest-metadata.js
5
+ *
6
+ * The per-skill `forward_watch` and `last_threat_review` fields in
7
+ * manifest.json are a cache of the authoritative values in each skill's
8
+ * frontmatter. There was no step that refreshed that cache, so editing a
9
+ * skill's frontmatter (e.g. bumping last_threat_review on a threat-review
10
+ * pass, or rewording a forward_watch item) left the manifest copy stale.
11
+ * Over time the two diverged on dozens of skills.
12
+ *
13
+ * This script rewrites the manifest's `forward_watch` and
14
+ * `last_threat_review` for every skill from that skill's frontmatter, which
15
+ * is the single source of truth (the linter and the staleness gate both read
16
+ * frontmatter). Run it whenever skill frontmatter changes, then re-run the
17
+ * sign-all step so the refreshed manifest is signed.
18
+ *
19
+ * tests/manifest-frontmatter-sync.test.js fails the suite if the cache ever
20
+ * drifts again, so a missed run is caught before release rather than shipping
21
+ * a manifest that contradicts its own skill bodies.
22
+ *
23
+ * Exit codes: 0 = wrote (or already in sync), 1 = a skill file was missing or
24
+ * its frontmatter failed to parse.
25
+ */
26
+
27
+ const fs = require("fs");
28
+ const path = require("path");
29
+ const lint = require("../lib/lint-skills.js");
30
+
31
+ const ROOT = path.resolve(__dirname, "..");
32
+ const MANIFEST = path.join(ROOT, "manifest.json");
33
+
34
+ // The frontmatter fields the manifest caches and must mirror verbatim.
35
+ const MIRRORED_SCALAR = ["last_threat_review"];
36
+ const MIRRORED_ARRAY = ["forward_watch"];
37
+
38
+ function skillFrontmatter(id) {
39
+ const p = path.join(ROOT, "skills", id, "skill.md");
40
+ if (!fs.existsSync(p)) return null;
41
+ const { frontmatter } = lint.extractFrontmatterBlock(fs.readFileSync(p, "utf8"));
42
+ return lint.parseFrontmatter(frontmatter);
43
+ }
44
+
45
+ function sync() {
46
+ const manifest = JSON.parse(fs.readFileSync(MANIFEST, "utf8"));
47
+ let changed = 0;
48
+ const errors = [];
49
+ for (const entry of manifest.skills) {
50
+ const id = entry.id || entry.name;
51
+ let fm;
52
+ try {
53
+ fm = skillFrontmatter(id);
54
+ } catch (e) {
55
+ errors.push(`${id}: frontmatter parse failed — ${e.message}`);
56
+ continue;
57
+ }
58
+ if (!fm) {
59
+ errors.push(`${id}: skill.md not found`);
60
+ continue;
61
+ }
62
+ for (const key of MIRRORED_SCALAR) {
63
+ if (key in fm && entry[key] !== fm[key]) {
64
+ entry[key] = fm[key];
65
+ changed++;
66
+ }
67
+ }
68
+ for (const key of MIRRORED_ARRAY) {
69
+ const want = Array.isArray(fm[key]) ? fm[key] : [];
70
+ const have = Array.isArray(entry[key]) ? entry[key] : [];
71
+ if (JSON.stringify(have) !== JSON.stringify(want)) {
72
+ entry[key] = want;
73
+ changed++;
74
+ }
75
+ }
76
+ }
77
+ if (errors.length) {
78
+ for (const e of errors) process.stderr.write(`[sync-manifest-metadata] ${e}\n`);
79
+ process.exitCode = 1;
80
+ return;
81
+ }
82
+ if (changed > 0) {
83
+ fs.writeFileSync(MANIFEST, JSON.stringify(manifest, null, 2) + "\n");
84
+ }
85
+ process.stdout.write(`[sync-manifest-metadata] ${changed} field(s) synced from frontmatter\n`);
86
+ }
87
+
88
+ sync();
@@ -79,7 +79,7 @@ The skill exists because the inverse direction — given a CVE or TTP, produce t
79
79
 
80
80
  ## Framework Lag Declaration
81
81
 
82
- No major compliance framework requires technique-grained defensive mapping. Each requires controls; none require controls expressed in the D3FEND technique taxonomy that mirrors ATT&CK and ATLAS. The MITRE ATT&CK Mappings v17 project (the NIST 800-53 → ATT&CK and D3FEND → NIST 800-53 crosswalks) provides the bridge, but operator awareness is limited and no framework yet requires its use.
82
+ No major compliance framework requires technique-grained defensive mapping. Each requires controls; none require controls expressed in the D3FEND technique taxonomy that mirrors ATT&CK and ATLAS. The MITRE Center for Threat-Informed Defense ATT&CK Mappings project (the NIST 800-53 → ATT&CK and D3FEND → NIST 800-53 crosswalks) provides the bridge, but its latest published crosswalk targets ATT&CK Enterprise v16.1 — lagging the current v19.0 matrix — operator awareness is limited, and no framework yet requires its use.
83
83
 
84
84
  | Jurisdiction | Framework / Control | What It Requires | Why It Is Insufficient at D3FEND Grain |
85
85
  |---|---|---|---|
@@ -290,7 +290,7 @@ This skill is itself the canonical mapper. The section name doubles as the secti
290
290
 
291
291
  The cross-walks the skill maintains:
292
292
 
293
- - **ATT&CK → D3FEND.** Sourced from the MITRE ATT&CK Mappings v17 NIST 800-53 → ATT&CK and D3FEND → ATT&CK crosswalks, materialized locally in `data/d3fend-catalog.json` as the `counters_attack_techniques` array on every D3FEND entry. To map an ATT&CK T-number to D3FEND, scan every catalog entry and collect those whose `counters_attack_techniques` includes the T-number. This skill never invents a mapping not present in the catalog; if a T-number has no coverage, the absence is a finding routed to `zeroday-gap-learn`.
293
+ - **ATT&CK → D3FEND.** Sourced from the MITRE Center for Threat-Informed Defense ATT&CK Mappings NIST 800-53 → ATT&CK and D3FEND → ATT&CK crosswalks (latest crosswalk targets ATT&CK Enterprise v16.1; the live matrix is v19.0), materialized locally in `data/d3fend-catalog.json` as the `counters_attack_techniques` array on every D3FEND entry. To map an ATT&CK T-number to D3FEND, scan every catalog entry and collect those whose `counters_attack_techniques` includes the T-number. This skill never invents a mapping not present in the catalog; if a T-number has no coverage, the absence is a finding routed to `zeroday-gap-learn`.
294
294
 
295
295
  - **ATLAS → D3FEND.** Sourced from cross-references in `data/atlas-ttps.json` (each ATLAS entry's defensive references) and from `data/d3fend-catalog.json` (each D3FEND entry's `counters_attack_techniques` array, which carries AML.T-numbers in addition to T-numbers). To map an AML.T technique to D3FEND, scan the catalog the same way as for ATT&CK. The bidirectional consistency is enforced by `lib/lint-skills.js` and by the schemas declared in the catalog `_meta` blocks.
296
296
 
@@ -55,7 +55,7 @@ The researcher skill sits between raw input and the specialized analytical skill
55
55
  - **SesameOp campaign report.** Operator asks: "we are seeing strange Azure OpenAI calls from a finance host — is this anything?" Researcher recognizes the AI-as-C2 pattern from `data/zeroday-lessons.json`, maps to AML.T0096, routes to `ai-c2-detection`.
56
56
  - **NIST 800-53 Rev. 6 draft published.** Operator asks: "does our gap analysis change?" Researcher routes to `skill-update-loop` for currency review, then to `framework-gap-analysis` for the specific control deltas.
57
57
 
58
- Without this skill, the operator either has to know the full inventory of 37 specialized skills downstream of the researcher (researcher itself is the 38th) and pick the right one (cognitive load that does not scale) or default to a single catch-all skill (which produces shallow output). The researcher skill is the routing layer that makes the rest of the library usable under operational pressure.
58
+ Without this skill, the operator either has to know the full inventory of 41 specialized skills downstream of the researcher (researcher itself is the 42nd) and pick the right one (cognitive load that does not scale) or default to a single catch-all skill (which produces shallow output). The researcher skill is the routing layer that makes the rest of the library usable under operational pressure.
59
59
 
60
60
  ---
61
61
 
@@ -75,7 +75,7 @@ No compliance framework prescribes a research-and-route step between intake and
75
75
  | SOC 2 | CC7.3 (Incident detection) | Requires incident detection and response procedures. Generic; does not require routing logic against a specialized analytical inventory. |
76
76
  | CIS Controls v8 | 17 (Incident Response Management) | Plan, train, test. No structured triage layer specified. |
77
77
 
78
- The framework lag here is structural: every framework assumes a generic incident handling pipeline. None assume the org has a curated inventory of 37 specialized analytical procedures and needs a router. The researcher skill is the routing layer the frameworks do not describe.
78
+ The framework lag here is structural: every framework assumes a generic incident handling pipeline. None assume the org has a curated inventory of 41 specialized analytical procedures and needs a router. The researcher skill is the routing layer the frameworks do not describe.
79
79
 
80
80
  ---
81
81
 
@@ -222,11 +222,15 @@ Use this mapping. Pick one primary route and zero-or-more secondary routes.
222
222
  - Financial cyber / banking cyber / DORA TLPT / PSD2 SCA / SWIFT CSCF / NYDFS 23 NYCRR 500 / FFIEC / MAS TRM / APRA CPS 234 / TIBER-EU / CBEST question → `sector-financial`
223
223
  - Federal cyber / government cyber / FedRAMP / CMMC / EO 14028 / NIST 800-171 CUI / FISMA / M-22-09 Zero Trust / OMB M-24-04 AI / CISA BOD/ED question → `sector-federal-government`
224
224
  - Energy cyber / electric grid cyber / NERC CIP / TSA pipeline / AWWA water / EU NCCS-G / AESCSF / DER cyber / inverter security / smart meter cyber question → `sector-energy`
225
+ - Telecom / 5G core / Salt Typhoon / Volt Typhoon / SS7 / Diameter / GTP / lawful intercept / CALEA / FCC CPNI / O-RAN / GSMA NESAS / 3GPP TS 33.501 question → `sector-telecom`
225
226
  - API security / OWASP API Top 10 / BOLA / BFLA / mass assignment / GraphQL / gRPC / WebSocket / API gateway / rate limit policy question → `api-security`
226
227
  - Cloud security / CSPM / CWPP / CNAPP / CSA CCM / AWS / Azure / GCP / shared responsibility / workload identity / cloud IAM question → `cloud-security`
227
228
  - Container security / Kubernetes / CIS K8s Benchmark / Pod Security Standards / Kyverno / Gatekeeper / Falco / Tetragon / admission policy / NetworkPolicy question → `container-runtime-security`
228
229
  - MLOps security / training data integrity / model registry / model signing / drift detection / MLflow / Kubeflow / Vertex AI / SageMaker / Hugging Face question → `mlops-security`
229
230
  - Incident response / IR playbook / PICERL / NIST 800-61 / ISO 27035 / breach notification / BEC incident / AI-class incident handling question → `incident-response-playbook`
231
+ - Ransomware incident / encryption event / LockBit / ALPHV / Akira / RansomHub / Hunters International / ransom payment / OFAC sanctions screening / decryptor availability question → `ransomware-response`
232
+ - Cloud-IAM incident / AWS account takeover / GCP service-account compromise / Azure managed-identity replay / access-key leak / IAM role-assumption abuse / cross-account assume-role / IMDS SSRF / CloudTrail anomaly question → `cloud-iam-incident`
233
+ - IdP incident / Okta / Entra ID / Auth0 / Ping / OneLogin tenant compromise / federated-trust abuse / OAuth consent abuse / SAML-OIDC token forgery / Midnight Blizzard / Scattered Spider question → `idp-incident-response`
230
234
  - Email security / anti-phishing / SPF / DKIM / DMARC / BIMI / ARC / MTA-STS / BEC / vishing / deepfake / AI-augmented phishing question → `email-security-anti-phishing`
231
235
  - Age gate / age verification / age assurance / child online safety / COPPA / CIPA / California AADC / UK Children's Code / KOSA / GDPR Art. 8 / DSA Art. 28 / parental consent / CSAM detection question → `age-gates-child-safety`
232
236