@blamejs/exceptd-skills 0.13.1 → 0.13.2

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 (38) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/bin/exceptd.js +35 -6
  3. package/data/_indexes/_meta.json +25 -25
  4. package/data/_indexes/activity-feed.json +2 -2
  5. package/data/_indexes/catalog-summaries.json +2 -2
  6. package/data/_indexes/chains.json +1772 -88
  7. package/data/_indexes/frequency.json +8 -0
  8. package/data/_indexes/section-offsets.json +517 -517
  9. package/data/_indexes/token-budget.json +66 -66
  10. package/data/atlas-ttps.json +2 -0
  11. package/data/attack-techniques.json +22 -3
  12. package/data/cve-catalog.json +0 -28
  13. package/data/cwe-catalog.json +19 -3
  14. package/data/framework-control-gaps.json +291 -1
  15. package/data/zeroday-lessons.json +818 -0
  16. package/lib/lint-skills.js +50 -1
  17. package/manifest.json +60 -60
  18. package/orchestrator/index.js +8 -1
  19. package/package.json +1 -1
  20. package/sbom.cdx.json +47 -36
  21. package/scripts/check-test-count.js +146 -0
  22. package/scripts/predeploy.js +16 -0
  23. package/skills/age-gates-child-safety/skill.md +1 -0
  24. package/skills/ai-risk-management/skill.md +1 -0
  25. package/skills/defensive-countermeasure-mapping/skill.md +1 -0
  26. package/skills/email-security-anti-phishing/skill.md +1 -0
  27. package/skills/fuzz-testing-strategy/skill.md +1 -0
  28. package/skills/mlops-security/skill.md +1 -0
  29. package/skills/ot-ics-security/skill.md +1 -0
  30. package/skills/researcher/skill.md +1 -0
  31. package/skills/sector-energy/skill.md +1 -0
  32. package/skills/sector-federal-government/skill.md +1 -0
  33. package/skills/sector-telecom/skill.md +1 -0
  34. package/skills/skill-update-loop/skill.md +1 -0
  35. package/skills/threat-model-currency/skill.md +1 -0
  36. package/skills/threat-modeling-methodology/skill.md +1 -0
  37. package/skills/webapp-security/skill.md +1 -0
  38. package/skills/zeroday-gap-learn/skill.md +1 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,39 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.13.2 — 2026-05-18
4
+
5
+ Audit close-out: the remaining v0.13 deferrals from the original 6-domain audit + the v0.13.1 post-mortem follow-ups. Patch-class — additive across CI hardening, lint enforcement, CLI UX, predeploy gates, catalog data cleanup, and skill metadata.
6
+
7
+ ### Security
8
+
9
+ **`release.yml` publish job split: `publish-npm` (id-token:write only) + `publish-github-release` (contents:write only).** Pre-v0.13.2 a single `publish` job carried BOTH permissions at once — a compromise of any step in that job (leaked NODE_AUTH_TOKEN, malicious dependency in the runner image, third-party action with elevated trust) had access to the npm provenance signing identity AND repo-write simultaneously. The new shape isolates each permission to the minimum surface that needs it. `publish-github-release` depends on `publish-npm` so the GitHub Release only fires when npm publish succeeded — releases pointing at a tag whose npm publish failed are operator-confusing.
10
+
11
+ ### Features
12
+
13
+ **`exceptd watchlist --alerts` 5 patterns now stable.** No change in v0.13.2; documenting that the v0.13.1 patterns are now operationally proven against the post-mortem seeds (`CVE-2026-46333` ssh-keysign-pwn surfacing under `kernel_lpe_with_poc`; `MAL-2026-SHAI-HULUD-OSS` under `supply_chain_family`).
14
+
15
+ **Flag-value did-you-mean across 6 sites.** `run --mode`, `brief --phase`, `run --format`, `attest export --format`, `ci --format`, and orchestrator `report <format>` now surface a Levenshtein-≤2 typo suggestion in the structured error body alongside the accepted-set list. JSON shape: `{ok:false, error, provided, accepted, did_you_mean:["..."]}`. Example: `brief library-author --phase goven` → `did_you_mean: ["govern"]`.
16
+
17
+ **`lib/lint-skills.js` Hard Rule #1 body-scan.** Every `CVE-* / MAL-*` reference in skill prose is now resolved against the canonical catalog. Missing-from-catalog surfaces as a WARNING in v0.13.2 (will hard-fail in v0.14.0); `_draft:true` references surface as WARNING. The forcing function lands; pre-existing violations on `ransomware-response` (CVE-2024-21762) and `cloud-iam-incident` (CVE-2026-21370) don't block the release but are now visible in every lint run.
18
+
19
+ **`scripts/check-test-count.js` — new 15th predeploy gate.** Static-counts `test(` declarations across `tests/*.test.js` and refuses shrinkage beyond the configured tolerance (default 1). Baseline pinned in `tests/.test-count-baseline.json`. Catches accidentally-deleted test files / mass-skip mistakes that the lint + diff-coverage gates wouldn't surface. Initial baseline 924 declarations across 94 files; bump with `--update-baseline` on releases that legitimately add many tests.
20
+
21
+ **Skill `discovery_mode: standalone` frontmatter field.** 16 skills that are intentionally reached via `exceptd brief <name>` or `exceptd ask` rather than playbook `skill_chain` now carry the explicit marker. Closes the v0.12 audit gap that flagged these as "unreferenced" — operator intent now explicit. Affected: `age-gates-child-safety`, `ai-risk-management`, `defensive-countermeasure-mapping`, `email-security-anti-phishing`, `fuzz-testing-strategy`, `mlops-security`, `ot-ics-security`, `researcher`, `sector-energy`, `sector-federal-government`, `sector-telecom`, `skill-update-loop`, `threat-model-currency`, `threat-modeling-methodology`, `webapp-security`, `zeroday-gap-learn`.
22
+
23
+ ### Bugs
24
+
25
+ **14 still-draft CVEs flipped to verified.** Each got a matching `zeroday-lessons.json` entry (the AGENTS.md rule #6 requirement) and had `_draft` removed: `CVE-2024-3154` (CRI-O kernel-module load), `CVE-2023-43472` (MLflow path-traversal), `CVE-2020-10148` (SUNBURST), `CVE-2023-3519` (Citrix NetScaler unauth RCE), `CVE-2024-1709` (ConnectWise ScreenConnect), `CVE-2026-20182` (Cisco SD-WAN), `CVE-2024-40635` (containerd integer overflow), `CVE-2026-30623` (Anthropic MCP SDK stdio injection), `CVE-2025-12686` (Synology BeeStation Pwn2Own), `CVE-2025-62847` / `CVE-2025-62848` / `CVE-2025-62849` (QNAP QTS DEVCORE chain), `CVE-2025-59389` (QNAP Hyper Data Protector), `CVE-2025-11837` (QNAP Malware Remover). Three new control requirements introduced where the CVE surfaced a novel class: `NEW-CTRL-053` MCP-SERVER-CONFIG-ALLOWLIST, `NEW-CTRL-054` BACKUP-TIER-NETWORK-ISOLATION, `NEW-CTRL-055` SECURITY-TOOL-INTEGRITY-VERIFICATION. Catalog now 37/39 entries verified; 2 remaining drafts are quarantined / embargoed placeholders.
26
+
27
+ **8 framework-gap forward-orphan refs cleaned up.** The v0.13.0 Hard Rule #5 backfill surfaced 8 framework-control gap IDs cited by CVE entries' `framework_control_gaps` field but missing from `framework-control-gaps.json`. All 8 added with theater_test blocks per Hard Rule #6: `NIST-800-53-SC-39` (Process Isolation), `ISO-27001-2022-A.8.22` (Segregation of networks), `CIS-Kubernetes-Benchmark-5.7` (Network Policies), `NIST-800-218-SSDF-PW.4` (Reuse Existing, Well-Secured Software), `NIST-800-53-SR-3` (Supply Chain Controls), `SLSA-v1.0-Source-L3`, `NIST-AI-RMF-MAP-3.4`, `OWASP-Top-10-2021-A06`. Gap catalog 122 → 130 entries.
28
+
29
+ **`release.yml` CHANGELOG-extraction fallback now emits `::warning::`.** Surfaces the parse failure on the run page rather than silently shipping a generic body.
30
+
31
+ ### Internal
32
+
33
+ - 11 new tests in `tests/v0_13_2-fixes.test.js`. Test count baseline 924 (initial pin).
34
+ - Predeploy gate count 14 → 15.
35
+ - `refresh.yml` split-checkout pattern (persist-credentials hardening) deferred to v0.14 — needs peter-evans/create-pull-request auth-mode research first.
36
+
3
37
  ## 0.13.1 — 2026-05-17
4
38
 
5
39
  Threat-intake gap closure. Driven by the post-mortem on CVE-2026-46333 (ssh-keysign-pwn) — disclosed 2026-05-14 by Qualys, missed by the toolkit at T+0 through T+3 because the existing source set (KEV, EPSS, NVD, RFC, PINS, GHSA, OSV) sits at the END of the disclosure pipeline. Adds primary-source polling, CVE-class alert surfacing, and seeds two retroactive catalog entries for the disclosures the toolkit should have caught.
package/bin/exceptd.js CHANGED
@@ -1236,7 +1236,14 @@ function dispatchPlaybook(cmd, argv) {
1236
1236
  // `--mode garbage` was silently accepted.
1237
1237
  const VALID_MODES = ["self_service", "authorized_pentest", "ir_response", "ctf", "research", "compliance_audit"];
1238
1238
  if (!VALID_MODES.includes(args.mode)) {
1239
- return emitError(`run: --mode "${args.mode}" not in accepted set ${JSON.stringify(VALID_MODES)}.`, { provided: args.mode }, pretty);
1239
+ // v0.13.2: did-you-mean on flag-value typos (Levenshtein 2).
1240
+ const dym = suggestFlag(String(args.mode), VALID_MODES);
1241
+ const hint = dym ? ` Did you mean "${dym}"?` : '';
1242
+ return emitError(
1243
+ `run: --mode "${args.mode}" not in accepted set ${JSON.stringify(VALID_MODES)}.${hint}`,
1244
+ { provided: args.mode, accepted: VALID_MODES, did_you_mean: dym ? [dym] : [] },
1245
+ pretty,
1246
+ );
1240
1247
  }
1241
1248
  runOpts.mode = args.mode;
1242
1249
  }
@@ -2268,7 +2275,13 @@ function cmdBrief(runner, args, runOpts, pretty) {
2268
2275
  if (onlyPhase != null) {
2269
2276
  const ACCEPTED_PHASES = ["govern", "direct", "look"];
2270
2277
  if (!ACCEPTED_PHASES.includes(onlyPhase)) {
2271
- return emitError(`brief: --phase "${onlyPhase}" not in accepted set ${JSON.stringify(ACCEPTED_PHASES)}.`, { verb: "brief", provided: onlyPhase }, pretty);
2278
+ const dym = suggestFlag(String(onlyPhase), ACCEPTED_PHASES);
2279
+ const hint = dym ? ` Did you mean "${dym}"?` : '';
2280
+ return emitError(
2281
+ `brief: --phase "${onlyPhase}" not in accepted set ${JSON.stringify(ACCEPTED_PHASES)}.${hint}`,
2282
+ { verb: "brief", provided: onlyPhase, accepted: ACCEPTED_PHASES, did_you_mean: dym ? [dym] : [] },
2283
+ pretty,
2284
+ );
2272
2285
  }
2273
2286
  }
2274
2287
 
@@ -2998,7 +3011,13 @@ function cmdRun(runner, args, runOpts, pretty) {
2998
3011
  const requested = Array.isArray(args.format) ? args.format[0] : args.format;
2999
3012
  const VALID = ["summary", "markdown", "csaf-2.0", "csaf", "sarif", "openvex", "json"];
3000
3013
  if (!VALID.includes(requested)) {
3001
- return emitError(`run: --format "${requested}" not in accepted set ${JSON.stringify(VALID)}.`, null, pretty);
3014
+ const dym = suggestFlag(String(requested), VALID);
3015
+ const hint = dym ? ` Did you mean "${dym}"?` : '';
3016
+ return emitError(
3017
+ `run: --format "${requested}" not in accepted set ${JSON.stringify(VALID)}.${hint}`,
3018
+ { verb: "run", provided: requested, accepted: VALID, did_you_mean: dym ? [dym] : [] },
3019
+ pretty,
3020
+ );
3002
3021
  }
3003
3022
  if (requested === "summary") {
3004
3023
  const cls = result.phases?.detect?.classification;
@@ -4788,7 +4807,13 @@ function cmdAttest(runner, args, runOpts, pretty) {
4788
4807
  // accepting any value the operator passed.
4789
4808
  const VALID_EXPORT_FORMATS = ["json", "csaf", "csaf-2.0"];
4790
4809
  if (!VALID_EXPORT_FORMATS.includes(formatRaw)) {
4791
- return emitError(`attest export: --format "${formatRaw}" not in accepted set ${JSON.stringify(VALID_EXPORT_FORMATS)}.`, null, pretty);
4810
+ const dym = suggestFlag(String(formatRaw), VALID_EXPORT_FORMATS);
4811
+ const hint = dym ? ` Did you mean "${dym}"?` : '';
4812
+ return emitError(
4813
+ `attest export: --format "${formatRaw}" not in accepted set ${JSON.stringify(VALID_EXPORT_FORMATS)}.${hint}`,
4814
+ { verb: "attest export", provided: formatRaw, accepted: VALID_EXPORT_FORMATS, did_you_mean: dym ? [dym] : [] },
4815
+ pretty,
4816
+ );
4792
4817
  }
4793
4818
  const redacted = attestations.map(a => ({
4794
4819
  session_id: a.session_id,
@@ -6551,9 +6576,13 @@ function cmdCi(runner, args, runOpts, pretty) {
6551
6576
  // Route through emitError so the body propagates exit codes via the
6552
6577
  // emit() ok:false contract. ci-format-typo is operator-decision class
6553
6578
  // (GENERIC_FAILURE), not DETECTED_ESCALATE.
6579
+ // v0.13.2: did-you-mean on the unknown format value (Levenshtein ≤ 2).
6580
+ const CI_FORMATS = ["summary", "markdown", "csaf-2.0", "sarif", "openvex", "json"];
6581
+ const dym = suggestFlag(String(fmt), CI_FORMATS);
6582
+ const hint = dym ? ` Did you mean "${dym}"?` : '';
6554
6583
  emitError(
6555
- `ci: --format "${fmt}" not in accepted set ["summary","markdown","csaf-2.0","sarif","openvex","json"].`,
6556
- { verb: "ci" },
6584
+ `ci: --format "${fmt}" not in accepted set ${JSON.stringify(CI_FORMATS)}.${hint}`,
6585
+ { verb: "ci", provided: fmt, accepted: CI_FORMATS, did_you_mean: dym ? [dym] : [] },
6557
6586
  pretty
6558
6587
  );
6559
6588
  return;
@@ -1,21 +1,21 @@
1
1
  {
2
2
  "schema_version": "1.1.0",
3
- "generated_at": "2026-05-18T01:04:18.854Z",
3
+ "generated_at": "2026-05-18T02:23:54.488Z",
4
4
  "generator": "scripts/build-indexes.js",
5
5
  "source_count": 54,
6
6
  "source_hashes": {
7
- "manifest.json": "500446c009c4da12a8e33794fefaffea287d10ee6f3b4d1e5298fb87447ed09e",
8
- "data/atlas-ttps.json": "0ec427652a9e613f04675beb26dc4c08934ba291e47427972b2a008c151cca78",
9
- "data/attack-techniques.json": "0ca33f8b0cf55a43de1290e310096020c4e0d16305bd01bcbe6cb46e0278caa8",
10
- "data/cve-catalog.json": "7fae34cf0abbd09abbbbd6a61ea06e487ddbd57060d3af6a58528c684156cf60",
11
- "data/cwe-catalog.json": "832d096bd52081fe43c082fd6958f9054d6b6e136df5b3d4cef7efd0ea49a843",
7
+ "manifest.json": "fca4de497211754bbca0e04f91cbc13746bbf05a393b92062810ebf9d1a502a8",
8
+ "data/atlas-ttps.json": "2b021f47355365d1ba59078dfa582397c7a64c2b4ebea4657ea260a66b76daf6",
9
+ "data/attack-techniques.json": "5c992a3c2974e117ee38b62f7ead36043819880baf23863979b490f19fe5826b",
10
+ "data/cve-catalog.json": "8ddc5d3f9441334d544df5bc4e34846259f981d15a87dd7bed825e7f2d8b961d",
11
+ "data/cwe-catalog.json": "4baff0970c17224aef4606598b90d72e09da5e927ee4f46bdbf3e12b2e6247e3",
12
12
  "data/d3fend-catalog.json": "a1fc2827ceb344669e148d55197dbf1b0e5b20bcc618e90517639c17d67ee82d",
13
13
  "data/dlp-controls.json": "d2406c482dddd30e49203879999dc4b3a7fd4d0494d6a61d86b91ee76415df19",
14
14
  "data/exploit-availability.json": "003a400f5ae5b15527589571679ccdb9b3a62e60073627b5fbdeb2a9fe330a7a",
15
- "data/framework-control-gaps.json": "5e2baf1e435c5b61b183e3f603636eae4fab34ee800488919c679665882c4f62",
15
+ "data/framework-control-gaps.json": "c4b735cac63559b4dad4cccfc97dda57434de4d9bb61a712264131ec3aae8ae6",
16
16
  "data/global-frameworks.json": "9ba563a85f7f8d6c3c957de64945e20925a89d0ed6ea6fc561cf093811acf558",
17
17
  "data/rfc-references.json": "e253a548c8a829d178d5aea601e268724b85c936ccbfa51c2e5d80c5f8efe2b0",
18
- "data/zeroday-lessons.json": "40d666d0932da24b425b01ced0f9c9e5f2e6cfd2082f53861d982919dde56a4a",
18
+ "data/zeroday-lessons.json": "6e503b75e52c8baea7e3ffaa872a2f7faedc36ca1cf53c8aec07e610c4c4ce07",
19
19
  "skills/kernel-lpe-triage/skill.md": "ae4a0af924d0078ffc6cd051a3ef9fce75a6a3f9c0c15d1c07900ae5faf80502",
20
20
  "skills/ai-attack-surface/skill.md": "dcca7d92a1ab4d1e4c46356b614a138b1c1f79b65a6a290eccf2095d8d443993",
21
21
  "skills/mcp-agent-trust/skill.md": "6821f6d38f6e23bbed953f8f86a279597b0b95a2d0548b5383e851bca7442531",
@@ -25,37 +25,37 @@
25
25
  "skills/rag-pipeline-security/skill.md": "ff07e48918090247aef71def4150b0df372a24bcdaa34eb6e11d246b9e71e1ee",
26
26
  "skills/ai-c2-detection/skill.md": "3da9f549f5c62e6163cddd70c8edccbef7be622d5a45fa89c90c6550e68c6b2e",
27
27
  "skills/policy-exception-gen/skill.md": "a7d886f7fa99a150b040f158b09045ba45e107439315389aea785311b0013395",
28
- "skills/threat-model-currency/skill.md": "ecc6441cb47ef2bc24547e47be018098228c956a41d61ddb50de7e7b37114a37",
28
+ "skills/threat-model-currency/skill.md": "cf1cc27ae5ae68d336c56d9f3afd950641e1d8d5b9f90b64c2daf00abe92bab0",
29
29
  "skills/global-grc/skill.md": "1dca534cce7612c1d26a7b1bfd088a811081555ecfa25b1f68cff2ca2ba28c98",
30
- "skills/zeroday-gap-learn/skill.md": "59a0d7cd85b923b3f5633bdc15c1a88eef7dea6332480d93b0bb0ae93a4cd0fe",
30
+ "skills/zeroday-gap-learn/skill.md": "e26f194880cd6acf46abe31e9348d445e9222c7691e9b9b953662c4a472462f5",
31
31
  "skills/pqc-first/skill.md": "a7131b65d0ceee47887b16679ee4e4b065d32d8751fe59921762388703662913",
32
- "skills/skill-update-loop/skill.md": "cf2b996cb18a5146614c06e3a50f4734a07d02b5be36bbdf492583f9cdcfed4d",
32
+ "skills/skill-update-loop/skill.md": "b6f3bee321833dc18f5624a9be4d28673d22e22018254b0bd1f3690b945073af",
33
33
  "skills/security-maturity-tiers/skill.md": "ed962937c45f3d95f325f231b787d272fe45c4cb91d4c5a2d982493d722c2acf",
34
- "skills/researcher/skill.md": "b47daaa26fdac07aa23e7becaa18487c5302e65c654f99fecab3689f23ec1bd2",
34
+ "skills/researcher/skill.md": "fd441131484dc5af4cd785ded0bac039123e6205483543752cb16fa508460c00",
35
35
  "skills/attack-surface-pentest/skill.md": "0d301beb9fb8e247ec80256a7e647804b5f9a41c7156e5724555ca9f93ccb986",
36
- "skills/fuzz-testing-strategy/skill.md": "51acb746cd63366ca62567588c700a9eb3f37c43250bd9ae4e1477ccb71c5b6d",
36
+ "skills/fuzz-testing-strategy/skill.md": "fb8c261def9e3344b44fd219c209027029e1eddf0e6bee1ecffb2d2176e1585e",
37
37
  "skills/dlp-gap-analysis/skill.md": "1c4e1d7da2421b82f202eaf2c9e21876af34ab5c76ce1359166842ee473f02dd",
38
38
  "skills/supply-chain-integrity/skill.md": "ad69b72f5c5df095f8618b977fbc8f0fbff396eebd4a8448b44c3f93309f63f9",
39
- "skills/defensive-countermeasure-mapping/skill.md": "e62c71ba3be2b4d0f7dfa529fec007cba6bee3013f76b93756e3e6310f2d22ab",
39
+ "skills/defensive-countermeasure-mapping/skill.md": "3d0c7ca85f32ee1fe74598889361ef2be16d099fe6e9e8d8c8184b7004306b30",
40
40
  "skills/identity-assurance/skill.md": "4ee7096fd82997c66b0f9e825ea3c04c3aa84768b74e6f668c1a9104104138cf",
41
- "skills/ot-ics-security/skill.md": "9ece7b1fb7f24e37dbdd8618b94b2a4434e182e3426e15f17e26464c0a1fdfd1",
41
+ "skills/ot-ics-security/skill.md": "7423cca19aab1026c07de63279137441018345731d3ee895c474316d432adaa2",
42
42
  "skills/coordinated-vuln-disclosure/skill.md": "0e875953bb8a38a89c8ec5d2a9ef967b12e9a9f166dc9356723f10304fd0535e",
43
- "skills/threat-modeling-methodology/skill.md": "ac623f61585de66c9ef5ed63e9c6059faef77e525abc672ac6d435c616a7268f",
44
- "skills/webapp-security/skill.md": "fdb07324b69a3a724e3eaba17bf687d72d4bd9d5c4f440be816bc9b08b8aef04",
45
- "skills/ai-risk-management/skill.md": "67e62791f60231f2ff53408922fa7137a9060de72097769c630f838a1c227c45",
43
+ "skills/threat-modeling-methodology/skill.md": "cebeba3940320ebc5b44ad2bb7b4cdcda412257c1a6319a1b7379c875ebe8d6a",
44
+ "skills/webapp-security/skill.md": "f2063eaea3f5ddf0f3d37b41985bf522b682a41f104796b3f0dff611cefd043c",
45
+ "skills/ai-risk-management/skill.md": "2b611eb8fa4841fdfc3f1dd1ffd504a46c6ecdc654213a955efbabefb6b1db87",
46
46
  "skills/sector-healthcare/skill.md": "a18e11d25524cdbf40df3798f4c2aa3cb51a4db1b088242ea53fa2885e86b64c",
47
47
  "skills/sector-financial/skill.md": "023b5440d614e6b83ba7294219bcac3cdbffd28fdfdd5f0ec23abbeea71b8230",
48
- "skills/sector-federal-government/skill.md": "c63cf1c7c98e920f968cfe60f14e718ea71b120c1b01616af22f64a796963bbe",
49
- "skills/sector-energy/skill.md": "643fd951359c2602d9b029a244fe66c1e23f726e711141a06c09cc760a479534",
50
- "skills/sector-telecom/skill.md": "862f9482af88e5409e011a6981a5d719863deeb646e41cd4df63e5d6597c50b1",
48
+ "skills/sector-federal-government/skill.md": "a73c3f36f23c12750d369931b7e3f884edae4a8aef35fc8690d15ef4500c4dd0",
49
+ "skills/sector-energy/skill.md": "91f00e7a9be2608393ec8cb6d5f0c9828f81b954a12a7c9fd04bd642b9091e09",
50
+ "skills/sector-telecom/skill.md": "59193e39c2fd73fdd7fede38a956bc730bbe4b712d7d6020788bb4d85f001ad8",
51
51
  "skills/api-security/skill.md": "2bdfa3dbe534efa3df245e0da37998ad7ab2da4a3171d5000d3346513c10bceb",
52
52
  "skills/cloud-security/skill.md": "c9fad9ed3663cf2faec74ad8f06d62eb86e6636f79933560d8c8d50e0e82d1da",
53
53
  "skills/container-runtime-security/skill.md": "605a8e8eb1af09835b967ec7179456015ec116c6b9051af3a8d225866cc2f7af",
54
- "skills/mlops-security/skill.md": "ca3fd922b43fc57aeb5e65c2d5a2823e6bc438167d6afa3a767cee83e4af1f96",
54
+ "skills/mlops-security/skill.md": "72429f05010accbcb191cb1544f1b88493c2f5249362846e5713ec3226b83dc2",
55
55
  "skills/incident-response-playbook/skill.md": "2017515d899c1b2bcb878bc6731e4059623ac52345b2cebbd92204583657bf60",
56
56
  "skills/ransomware-response/skill.md": "2e4fc488f86ed1ba7791ab0e7021160d8ca5ad33a02cdf92a5b916c8afecaa54",
57
- "skills/email-security-anti-phishing/skill.md": "e4e9e5a820c0ed3fde9483282e7a0ecaf79284cd2e9923ce66f2b0fb1fc44626",
58
- "skills/age-gates-child-safety/skill.md": "66e7773d29c179ab62f409007c05e05993e04a19273225a1e520f2481fd9a90d",
57
+ "skills/email-security-anti-phishing/skill.md": "82af58b98bd808c0c6ec92554d89948378702465504db1113fc462a96366a601",
58
+ "skills/age-gates-child-safety/skill.md": "51295c849bcced965b6448eb6b4bbd5caef5ba0b0cea7ce48abbacf47d331621",
59
59
  "skills/cloud-iam-incident/skill.md": "6494ee3856edeb212e65fe5cdb208357c1a832eb8ac374b26055586bfc71f629",
60
60
  "skills/idp-incident-response/skill.md": "e67a2576e7f1c3bf89f499f5c977bc470ef29e8b3e3e45f4cb5bd45a82674282"
61
61
  },
@@ -78,7 +78,7 @@
78
78
  "handoff_dag_nodes": 42,
79
79
  "summary_cards": 42,
80
80
  "section_offsets_skills": 42,
81
- "token_budget_total_approx": 402643,
81
+ "token_budget_total_approx": 403351,
82
82
  "recipes": 8,
83
83
  "jurisdiction_clocks": 29,
84
84
  "did_ladders": 8,
@@ -63,7 +63,7 @@
63
63
  "artifact": "data/framework-control-gaps.json",
64
64
  "path": "data/framework-control-gaps.json",
65
65
  "schema_version": "1.0.0",
66
- "entry_count": 122
66
+ "entry_count": 130
67
67
  },
68
68
  {
69
69
  "date": "2026-05-15",
@@ -87,7 +87,7 @@
87
87
  "artifact": "data/zeroday-lessons.json",
88
88
  "path": "data/zeroday-lessons.json",
89
89
  "schema_version": "1.1.0",
90
- "entry_count": 24
90
+ "entry_count": 38
91
91
  },
92
92
  {
93
93
  "date": "2026-05-15",
@@ -172,7 +172,7 @@
172
172
  "rebuild_after_days": 365,
173
173
  "note": "Per-entry last_verified governs decay. Skills depending on this catalog must check entry freshness before high-stakes use."
174
174
  },
175
- "entry_count": 122,
175
+ "entry_count": 130,
176
176
  "sample_keys": [
177
177
  "ALL-AI-PIPELINE-INTEGRITY",
178
178
  "ALL-MCP-TOOL-TRUST",
@@ -238,7 +238,7 @@
238
238
  "rebuild_after_days": 365,
239
239
  "note": "Per-entry last_verified governs decay. Skills depending on this catalog must check entry freshness before high-stakes use."
240
240
  },
241
- "entry_count": 24,
241
+ "entry_count": 38,
242
242
  "sample_keys": [
243
243
  "CVE-2026-31431",
244
244
  "CVE-2025-53773",