@blamejs/exceptd-skills 0.13.21 → 0.13.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.13.22 — 2026-05-19
4
+
5
+ `ci` is now usable at the terminal without piping through `jq`.
6
+
7
+ ### Features
8
+
9
+ - **Human-readable `ci` output by default.** Pre-0.13.22 the default `ci` output was 1000+ lines of indented JSON on every run. Now the default is a one-screen digest: verdict line, per-playbook table (id / verdict / rwep / evidence-completeness / top-finding), session-level warnings, scope-selection rules, framework gap rollup, and fail reasons. Pass `--json` or `--pretty` to get the structured body for automation.
10
+ - **Per-result hoisted summary fields.** Every `run()` result now carries `verdict`, `rwep_score`, `top_finding`, `summary_line`, and `evidence_completeness` (one of `complete` / `partial` / `missing` / `unknown` / `not-evaluated`) at the top level. Machine-readable consumers no longer walk `phases.analyze.rwep.adjusted` and `phases.detect.classification` separately to extract the headline numbers.
11
+ - **`indicators_evaluated` + `indicators_known` per result.** Surface how many of the playbook's known indicators were actually exercised by the operator's evidence, so a result that returns `verdict=inconclusive` with `indicators_evaluated=0` is distinguishable from one that evaluated every indicator and found no hits.
12
+ - **Session-level warning de-duplication.** `ci` runs that span N playbooks no longer emit the same `bundle_publisher_unclaimed` warning N times. The summary now carries `runtime_warnings` and `runtime_warnings_count` with one entry per unique (kind, reason) across the session.
13
+ - **Scope-inclusion transparency.** When `ci --scope <type>` is used, the summary now lists `scope_request` plus `scope_inclusion_rules` explaining that cross-cutting playbooks are always added and (for `--scope code`) that `sbom` is auto-included on repos with a lockfile.
14
+
15
+ ### Bugs
16
+
17
+ - **Blocked results now carry `playbook_id`.** Previously, a playbook that halted at preflight returned `{ ok:false, blocked_by, reason }` with no playbook identifier — operators iterating `results[]` for failure rows had to correlate by array index. Now every result, blocked or not, carries `playbook_id` at the top level.
18
+
3
19
  ## 0.13.21 — 2026-05-19
4
20
 
5
21
  Seven new catalog-gap detection classes wired into the predeploy gate. The v0.13.19 detector covered missing-context / dangling-ref / draft-debt; the v0.13.20 audit confirmed that left genuine gap classes unsurfaced. v0.13.21 adds the seven cross-cutting classes the prior detector missed and wires them into a budget gate that runs alongside the existing tests + predeploy gates.
package/bin/exceptd.js CHANGED
@@ -6814,6 +6814,46 @@ function cmdCi(runner, args, runOpts, pretty) {
6814
6814
  clock_started_reasons: clockStartedReasons,
6815
6815
  };
6816
6816
 
6817
+ // v0.13.22 B5: Each `run()` call independently surfaces session-level
6818
+ // runtime conditions (e.g. bundle_publisher_unclaimed) into its own
6819
+ // phases.analyze.runtime_errors. On a ci run that spans 9 playbooks, the
6820
+ // operator saw the same warning 9 times. Dedupe across results by
6821
+ // (kind, reason) so a session-level condition surfaces once at the ci
6822
+ // summary level — operators read one row, not N copies.
6823
+ const warningSeen = new Set();
6824
+ const runtimeWarningsDedup = [];
6825
+ for (const r of results) {
6826
+ const errs = r?.phases?.analyze?.runtime_errors || [];
6827
+ for (const e of errs) {
6828
+ const key = `${e.kind || ""}::${e.reason || ""}`;
6829
+ if (warningSeen.has(key)) continue;
6830
+ warningSeen.add(key);
6831
+ runtimeWarningsDedup.push({
6832
+ kind: e.kind || null,
6833
+ reason: e.reason || null,
6834
+ remediation: e.remediation || null,
6835
+ });
6836
+ }
6837
+ }
6838
+ summary.runtime_warnings = runtimeWarningsDedup;
6839
+ summary.runtime_warnings_count = runtimeWarningsDedup.length;
6840
+
6841
+ // v0.13.22 B8 (transparency): document why each playbook was selected.
6842
+ // --scope <s> always adds cross-cutting; --scope code on a repo with a
6843
+ // lockfile also adds sbom. The selection rule was buried in code; surface
6844
+ // it in the summary so operators reading the JSON / pretty trailer can
6845
+ // see what was scoped vs. auto-included.
6846
+ if (scope) {
6847
+ summary.scope_request = scope;
6848
+ summary.scope_inclusion_rules = [
6849
+ `--scope ${scope} selected playbooks with _meta.scope === "${scope}"`,
6850
+ `cross-cutting playbooks are always added (apply to every scope by design)`,
6851
+ ];
6852
+ if (scope === "code") {
6853
+ summary.scope_inclusion_rules.push("--scope code also adds sbom when the cwd is a git repo with a lockfile");
6854
+ }
6855
+ }
6856
+
6817
6857
  // v0.11.4 (#72): ci --format <fmt> previously emitted the full bundle
6818
6858
  // regardless of flag. Now honors the same shortcuts as `run --format`:
6819
6859
  // summary → one-line JSON of session + verdict + counts
@@ -6856,7 +6896,106 @@ function cmdCi(runner, args, runOpts, pretty) {
6856
6896
  );
6857
6897
  return;
6858
6898
  } else {
6859
- emit({ verb: "ci", session_id: sessionId, playbooks_run: ids, summary, results }, pretty);
6899
+ // v0.13.22 B3+B4+B6: human renderer for `ci` default output. Pre-0.13.22
6900
+ // the only output was indented JSON (or compact JSON when not TTY) —
6901
+ // operators running `exceptd ci` at the terminal saw 1000+ lines of JSON
6902
+ // for a 9-playbook scan and had to grep for the verdict by hand.
6903
+ //
6904
+ // Renderer shape (one screen for a typical 9-playbook scope):
6905
+ // - one verdict line (PASS/FAIL/BLOCKED + counts)
6906
+ // - per-playbook row: id | verdict | rwep | evidence | top_finding
6907
+ // - deduped session-level runtime warnings (B5)
6908
+ // - scope inclusion rules (B8 transparency) when --scope was used
6909
+ // - footer pointing at --json / --format for the structured body
6910
+ emit({ verb: "ci", session_id: sessionId, playbooks_run: ids, summary, results }, pretty, (obj) => {
6911
+ const s = obj.summary;
6912
+ const lines = [];
6913
+ lines.push(`ci: ${obj.playbooks_run.length} playbook(s) session-id: ${obj.session_id}`);
6914
+ const verdictIcon = s.verdict === "PASS"
6915
+ ? "[ok]"
6916
+ : s.verdict === "BLOCKED"
6917
+ ? "[!! BLOCKED]"
6918
+ : s.verdict === "CLOCK_STARTED"
6919
+ ? "[!! CLOCK]"
6920
+ : s.verdict === "NO_EVIDENCE"
6921
+ ? "[i NO_EVIDENCE]"
6922
+ : "[!! FAIL]";
6923
+ lines.push(`\n${verdictIcon} verdict=${s.verdict} detected=${s.detected} inconclusive=${s.inconclusive} clean=${s.not_detected} blocked=${s.blocked} max_rwep=${s.max_rwep_observed}`);
6924
+
6925
+ // Per-playbook table.
6926
+ const rows = (obj.results || []).map(r => {
6927
+ if (r && r.ok === false) {
6928
+ return {
6929
+ id: r.playbook_id || "?",
6930
+ verdict: "blocked",
6931
+ rwep: "-",
6932
+ evidence: r.evidence_completeness || "not-evaluated",
6933
+ top: r.blocked_by || r.reason || r.error || "",
6934
+ };
6935
+ }
6936
+ const cls = r?.phases?.detect?.classification || r?.verdict || "?";
6937
+ return {
6938
+ id: r.playbook_id || "?",
6939
+ verdict: cls,
6940
+ rwep: (r?.rwep_score != null) ? String(r.rwep_score) : "-",
6941
+ evidence: r?.evidence_completeness || "unknown",
6942
+ top: r?.top_finding || "",
6943
+ };
6944
+ });
6945
+ const wId = Math.max(8, ...rows.map(r => r.id.length));
6946
+ const wV = Math.max(8, ...rows.map(r => r.verdict.length));
6947
+ const wR = Math.max(4, ...rows.map(r => r.rwep.length));
6948
+ const wE = Math.max(8, ...rows.map(r => r.evidence.length));
6949
+ const pad = (s, w) => (s + " ".repeat(w)).slice(0, w);
6950
+ lines.push("");
6951
+ lines.push(` ${pad("playbook", wId)} ${pad("verdict", wV)} ${pad("rwep", wR)} ${pad("evidence", wE)} finding`);
6952
+ lines.push(` ${"-".repeat(wId)} ${"-".repeat(wV)} ${"-".repeat(wR)} ${"-".repeat(wE)} -------`);
6953
+ for (const row of rows) {
6954
+ const finding = row.top.length > 80 ? row.top.slice(0, 77) + "..." : row.top;
6955
+ lines.push(` ${pad(row.id, wId)} ${pad(row.verdict, wV)} ${pad(row.rwep, wR)} ${pad(row.evidence, wE)} ${finding}`);
6956
+ }
6957
+
6958
+ // Session-level deduped runtime warnings (B5).
6959
+ if (s.runtime_warnings && s.runtime_warnings.length) {
6960
+ lines.push(`\nSession warnings (${s.runtime_warnings_count}):`);
6961
+ for (const w of s.runtime_warnings) {
6962
+ const reason = (w.reason || "").length > 200 ? (w.reason || "").slice(0, 197) + "..." : (w.reason || "");
6963
+ lines.push(` [${w.kind || "warning"}] ${reason}`);
6964
+ if (w.remediation) lines.push(` → ${w.remediation}`);
6965
+ }
6966
+ }
6967
+
6968
+ // Scope inclusion (B8 transparency).
6969
+ if (s.scope_inclusion_rules && s.scope_inclusion_rules.length) {
6970
+ lines.push(`\nScope selection (${s.scope_request}):`);
6971
+ for (const rule of s.scope_inclusion_rules) lines.push(` - ${rule}`);
6972
+ }
6973
+
6974
+ // Jurisdiction clocks.
6975
+ if (s.jurisdiction_clocks_started > 0) {
6976
+ lines.push(`\nJurisdiction clocks started: ${s.jurisdiction_clocks_started}`);
6977
+ for (const n of (s.jurisdiction_clock_rollup || []).slice(0, 5)) {
6978
+ lines.push(` ${n.jurisdiction || "?"}/${n.regulation || "?"} → deadline ${n.deadline || "?"}`);
6979
+ }
6980
+ }
6981
+
6982
+ // Framework gap rollup.
6983
+ if (s.framework_gap_count > 0) {
6984
+ lines.push(`\nFramework gaps (${s.framework_gap_count}):`);
6985
+ for (const g of (s.framework_gap_rollup || []).slice(0, 5)) {
6986
+ lines.push(` ${g.framework || "?"} :: ${g.claimed_control || "?"} (${g.playbooks.length} playbook(s))`);
6987
+ }
6988
+ }
6989
+
6990
+ // Fail reasons.
6991
+ if (s.fail_reasons && s.fail_reasons.length) {
6992
+ lines.push(`\nFail reasons:`);
6993
+ for (const r of s.fail_reasons) lines.push(` - ${r}`);
6994
+ }
6995
+
6996
+ lines.push(`\nFull structured result: --json (or --pretty for indented JSON).`);
6997
+ return lines.join("\n");
6998
+ });
6860
6999
  }
6861
7000
  // v0.11.14 (#134): exit-code matrix with BLOCKED before FAIL.
6862
7001
  // Pre-0.11.14 the `if (fail)` check fired first for blocked runs (because
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "schema_version": "1.1.0",
3
- "generated_at": "2026-05-19T20:58:49.735Z",
3
+ "generated_at": "2026-05-19T22:22:02.165Z",
4
4
  "generator": "scripts/build-indexes.js",
5
5
  "source_count": 54,
6
6
  "source_hashes": {
7
- "manifest.json": "b8676a67b642f623974dccf3ba0f1df95836541b7c1dcd0c63cef2b71fa1a88a",
7
+ "manifest.json": "068eb6c464d8999f41906bd3ea080b6b579d6dc15c3c1b05c1caf94adb72cd27",
8
8
  "data/atlas-ttps.json": "d296c1d3e71807c9279b731f047e57796e85137f186586743a8cdad214b408f9",
9
9
  "data/attack-techniques.json": "49b6010b317edd219def135171ea8f3b1bbf1e00e9c5a08bf7237215ff54e2c3",
10
10
  "data/cve-catalog.json": "a09c83af3f9679a7ea73935726a1ff9de2cab94b4ab6321fc017fc147747d7c3",
@@ -3058,7 +3058,28 @@ function run(playbookId, directiveId, agentSubmission = {}, runOpts = {}) {
3058
3058
  }
3059
3059
  const pre = preflight(playbook, { ...runOpts, precondition_checks: mergedPCs });
3060
3060
  if (!pre.ok) {
3061
- return { ok: false, phase: 'preflight', blocked_by: pre.blocked_by, reason: pre.reason, issues: pre.issues, precondition_check_source: pcSource };
3061
+ // v0.13.22 (B7 fix): blocked results MUST carry playbook_id +
3062
+ // directive_id at the result root. Pre-v0.13.22 a `ci --scope code`
3063
+ // run produced 9 results where the 3 blocked rows had no
3064
+ // playbook_id, so operators iterating results[] couldn't tell
3065
+ // which playbook produced which preflight failure without joining
3066
+ // against playbooks_run[] by index. Also include `verdict:"blocked"`
3067
+ // and a one-line `summary_line` for B2 + B6 flat-result-shape fixes.
3068
+ const summaryLine = `${playbookId}: blocked at preflight (${pre.blocked_by || 'unknown'}) — ${pre.reason || ''}`.slice(0, 240);
3069
+ return {
3070
+ ok: false,
3071
+ playbook_id: playbookId,
3072
+ directive_id: directiveId,
3073
+ verdict: 'blocked',
3074
+ summary_line: summaryLine,
3075
+ phase: 'preflight',
3076
+ blocked_by: pre.blocked_by,
3077
+ reason: pre.reason,
3078
+ remediation: pre.remediation,
3079
+ issues: pre.issues,
3080
+ precondition_check_source: pcSource,
3081
+ evidence_completeness: 'not-evaluated'
3082
+ };
3062
3083
  }
3063
3084
 
3064
3085
  _activeRuns.add(playbookId);
@@ -3205,11 +3226,66 @@ function run(playbookId, directiveId, agentSubmission = {}, runOpts = {}) {
3205
3226
  }))
3206
3227
  .digest('hex');
3207
3228
 
3229
+ // v0.13.22 — hoist the operator-facing summary to the result root
3230
+ // (B2). Pre-v0.13.22 a `ci` consumer had to spelunk into
3231
+ // phases.detect.classification + phases.analyze.rwep.adjusted to
3232
+ // find the answer; the most common ops question ("did this
3233
+ // playbook detect anything?") needs a one-line answer at the top.
3234
+ //
3235
+ // Verdict source: phases.detect.classification is the canonical
3236
+ // verdict signal — one of detected / not_detected / inconclusive /
3237
+ // pending / skipped. validate() does NOT carry a `verdict` field;
3238
+ // an earlier draft of this hoist read phases.validate.verdict and
3239
+ // therefore degraded every non-blocked result to "inconclusive"
3240
+ // (codex P1 on PR #62).
3241
+ const verdict = (phases.detect && phases.detect.classification) || 'inconclusive';
3242
+ const rwepScore = phases.analyze && phases.analyze.rwep && typeof phases.analyze.rwep.adjusted === 'number'
3243
+ ? phases.analyze.rwep.adjusted : null;
3244
+ // Top finding = first matched CVE-id when present; otherwise the
3245
+ // dominant indicator classification. The full set lives in phases.
3246
+ let topFinding = null;
3247
+ if (phases.analyze && Array.isArray(phases.analyze.matched_cves) && phases.analyze.matched_cves.length) {
3248
+ topFinding = phases.analyze.matched_cves[0].cve_id;
3249
+ } else if (phases.detect && phases.detect.classification
3250
+ && phases.detect.classification !== 'not-detected'
3251
+ && phases.detect.classification !== 'not_detected'
3252
+ && phases.detect.classification !== 'inconclusive'
3253
+ && phases.detect.classification !== 'pending') {
3254
+ topFinding = phases.detect.classification;
3255
+ }
3256
+ // Evidence completeness (B9): the indicators-evaluated count vs
3257
+ // the indicators-known count distinguishes "ran fully and found
3258
+ // nothing" from "couldn't actually evaluate". Pre-v0.13.22 the two
3259
+ // states looked identical at the result-root level.
3260
+ const indicatorsKnown = (playbook.phases && playbook.phases.detect && playbook.phases.detect.indicators)
3261
+ ? playbook.phases.detect.indicators.length : null;
3262
+ const indicatorsEvaluated = phases.detect && typeof phases.detect.indicators_evaluated_count === 'number'
3263
+ ? phases.detect.indicators_evaluated_count : null;
3264
+ let evidenceCompleteness;
3265
+ if (indicatorsKnown == null) evidenceCompleteness = 'unknown';
3266
+ else if (indicatorsEvaluated == null) evidenceCompleteness = 'not-evaluated';
3267
+ else if (indicatorsEvaluated === 0) evidenceCompleteness = 'missing';
3268
+ else if (indicatorsEvaluated < indicatorsKnown) evidenceCompleteness = 'partial';
3269
+ else evidenceCompleteness = 'complete';
3270
+ const summaryLine = (rwepScore != null && rwepScore > 0)
3271
+ ? `${playbookId}: ${verdict} (rwep=${rwepScore}${topFinding ? `, ${topFinding}` : ''}, evidence=${evidenceCompleteness})`
3272
+ : `${playbookId}: ${verdict} (evidence=${evidenceCompleteness}${topFinding ? `, ${topFinding}` : ''})`;
3208
3273
  return {
3209
3274
  ok: true,
3210
3275
  playbook_id: playbookId,
3211
3276
  directive_id: directiveId,
3212
3277
  session_id: sessionId,
3278
+ // Flat top-level fields (B2 + B6 + B9). Operators no longer need
3279
+ // to spelunk through phases.* to get the answer to the most
3280
+ // common question. The phases tree is still present below for
3281
+ // anyone who needs the full CSAF / analyze / detect dumps.
3282
+ verdict,
3283
+ rwep_score: rwepScore,
3284
+ top_finding: topFinding,
3285
+ summary_line: summaryLine,
3286
+ evidence_completeness: evidenceCompleteness,
3287
+ indicators_evaluated: indicatorsEvaluated,
3288
+ indicators_known: indicatorsKnown,
3213
3289
  evidence_hash: evidenceHash,
3214
3290
  submission_digest: submissionDigest,
3215
3291
  preflight_issues: pre.issues,
package/manifest.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "exceptd-security",
3
- "version": "0.13.21",
3
+ "version": "0.13.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",
@@ -53,7 +53,7 @@
53
53
  ],
54
54
  "last_threat_review": "2026-05-01",
55
55
  "signature": "lXhZgoIrrVloO3XaTvo/43AxZn4mwErstd7DR0O/oVhD3AOGODM4HqrageYEou9WKOdMEGP5mJNTjJsXdP5NDA==",
56
- "signed_at": "2026-05-19T20:58:00.287Z",
56
+ "signed_at": "2026-05-19T22:21:07.815Z",
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": "vSVqu4wBm+d68ujZmM6Rto/HzViCkE0gPUcv/MYE/bjFiqamf/s0On4kTOo1KIveV9cOwYNxiItaGEWlVkRFDg==",
120
- "signed_at": "2026-05-19T20:58:00.289Z",
120
+ "signed_at": "2026-05-19T22:21:07.817Z",
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": "RIgXKvolQjgJdnlrDnVOd90IOY1B7VHHZD/YJQRzouL+wUeOLclPrdK/EgEuFyiu7lR4bi+Pl6aGB9G9tOxYCQ==",
183
- "signed_at": "2026-05-19T20:58:00.289Z",
183
+ "signed_at": "2026-05-19T22:21:07.817Z",
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": "RYOxeq/o3uTwTWq4H7RcdH2Aclg9UyCERfUH9Frwkzncsowg7LgxpaEDc3swTCv73HMEGbU8wVbXguZ4JxHUCQ==",
229
- "signed_at": "2026-05-19T20:58:00.290Z"
229
+ "signed_at": "2026-05-19T22:21:07.818Z"
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": "DneJCPKCPcoe6nQ82XptqSqNfSRdt1orKaO+o7K36YCciDrzwJb+1BuBLusPDtpcdDaGY0y0e+AqiTYJklhBAQ==",
260
- "signed_at": "2026-05-19T20:58:00.290Z"
260
+ "signed_at": "2026-05-19T22:21:07.818Z"
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": "NA1hoQycvQhSUoG5rwlXX0mOVmGxoXRVezkELGEA2nZOdGis4gXkHT3O6Sfw7zxE4JuMrsCb65TEeOWk9WEPDg==",
289
- "signed_at": "2026-05-19T20:58:00.291Z"
289
+ "signed_at": "2026-05-19T22:21:07.819Z"
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": "XgrzcA2brPhXrSTxrcLnJec0OpgGYJBoSTUlJ10UdePHffxqb9LTVGnfbmEk1ykQifXREZexui2bG7X/+eFfCQ==",
326
- "signed_at": "2026-05-19T20:58:00.291Z",
326
+ "signed_at": "2026-05-19T22:21:07.819Z",
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": "9+hZlZOqZdeACUmamQk66L5levZhhwnFXuYRhdT6Mce99eQaKT7wNfWq12hXQztkRcVRKaFH+a01zwJQwsRQCA==",
383
- "signed_at": "2026-05-19T20:58:00.291Z",
383
+ "signed_at": "2026-05-19T22:21:07.819Z",
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": "ciqhVloMWWXEigPZvvwoV2c54tEqsDqsoc+sS/mNTFFJk2H+tz2+XUrgfEPRuYw0FeyNB6/+27pL2NpKHzUqAg==",
418
- "signed_at": "2026-05-19T20:58:00.292Z",
418
+ "signed_at": "2026-05-19T22:21:07.819Z",
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": "xiHAhhdufm9hCKU8PLiPE0MX65ej2F4OZwtlWLGLCiie9/km+Kiqbt192LcMvr94v83C98pb9wIaqFsFWft6AQ==",
446
- "signed_at": "2026-05-19T20:58:00.292Z"
446
+ "signed_at": "2026-05-19T22:21:07.820Z"
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": "oYsSk35N2Uzq7MRofACykylcVwkgPhI4luWZ14vmQT+gUKLyZiKVOUJbe1+7lGl6BYPRN0sUDQ0f7S5Eu5w2Ag==",
478
- "signed_at": "2026-05-19T20:58:00.292Z"
478
+ "signed_at": "2026-05-19T22:21:07.820Z"
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": "igRqYyU1unRFH40BsPyAR62SPrk8QZv8dPGb8S9O9EvLCNOZAzm3t+HdT/NKqzWHwrpomOzkkkyLfYI/0qTUDA==",
505
- "signed_at": "2026-05-19T20:58:00.293Z"
505
+ "signed_at": "2026-05-19T22:21:07.820Z"
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": "vhc3wuQEro/86s1ro2b/KakUXg8QVnySYTBqA7ebzv9oeR2HYO5bvGEJp3oOHWtL37JDqcCAHYadSN/qxIyCCA==",
557
- "signed_at": "2026-05-19T20:58:00.293Z",
557
+ "signed_at": "2026-05-19T22:21:07.821Z",
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": "MS35nWm8djfJGn4OOoT0JKJ2aO+Dkbb6wOOWJYvNZlRKT3UGA59o2gxg1JOnD20hb/RwxtkmCujhl2tuYSR+AQ==",
604
- "signed_at": "2026-05-19T20:58:00.293Z"
604
+ "signed_at": "2026-05-19T22:21:07.821Z"
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": "8Px1s2lDj10/Q6erwEQlXgUHM1+OTruUR8qAHPX7Oo3k/l69N6P9sm0PsafS9wDFtj9l5C/OiLiFgzMlMt6vBw==",
641
- "signed_at": "2026-05-19T20:58:00.294Z",
641
+ "signed_at": "2026-05-19T22:21:07.821Z",
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": "WAu5fRirzSOcnnZsTx2d/JJZwa/LPpXCi+31qATTGLmoNuhyy81k3ooPe9kCM3E0CLMtvTePg9DagYqBninZDQ==",
676
- "signed_at": "2026-05-19T20:58:00.294Z"
676
+ "signed_at": "2026-05-19T22:21:07.822Z"
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": "7eEwCXFd9pDKUw7yCUbRJSjfzozE44dwwwemCQUPm8JBPztLltibD9bL/RszSbYyCrYJmVb5Drncz2cGe62gCw==",
747
- "signed_at": "2026-05-19T20:58:00.294Z"
747
+ "signed_at": "2026-05-19T22:21:07.822Z"
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": "Z7ypCUnXx8JpLtgxxB6RHNi39w74AmrGY1N4ofAGCXhkuM2EaFVm1AU0dvl9UQ1bVLfHKEDGqMO/TwlIY7RABg==",
807
- "signed_at": "2026-05-19T20:58:00.295Z"
807
+ "signed_at": "2026-05-19T22:21:07.822Z"
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": "fgxG344JGYBWWWwFXZ1IzGipWKP7EyBhrsvsbsb0CCGXfv/MvNHVNI6G0zQddCsWX1JeQbhZT3Vk8v1uJKDTDA==",
882
- "signed_at": "2026-05-19T20:58:00.295Z"
882
+ "signed_at": "2026-05-19T22:21:07.822Z"
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": "pcLrM98A3vUSZRjwNAk0aZ9umvOwB41XCLLsCOy/IebB2F/06oIrGUKkMHtHwm4pTVPShMMcKdZQQ3jz30FnCg==",
959
- "signed_at": "2026-05-19T20:58:00.295Z"
959
+ "signed_at": "2026-05-19T22:21:07.823Z"
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": "gqF8eU3VBrZhO2WnlcqKa7wm1d2mmWtvpbmx0kNCgHojNV+qEt+Ij84RO6bZvaUqhfYPWizWL79Fa4DL0curAQ==",
1016
- "signed_at": "2026-05-19T20:58:00.295Z"
1016
+ "signed_at": "2026-05-19T22:21:07.823Z"
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": "Wv5hGMeHjlaQK1zwicVCA7AvdKgJBgvcjdpGM9Ywahh9tagAKhbkOjybowDQZzu7OZ3bDkbh6pBYc1Sdwr6NAA==",
1083
- "signed_at": "2026-05-19T20:58:00.296Z"
1083
+ "signed_at": "2026-05-19T22:21:07.823Z"
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": "8t5qKHd3yWi57dvG36YQkLN/X9bQWqtEiYjay4IfSmqhJpM/xXPaQVKNGz3wscrO8OLKUZ0OaX7Mj5kzpgBKBQ==",
1139
- "signed_at": "2026-05-19T20:58:00.296Z"
1139
+ "signed_at": "2026-05-19T22:21:07.824Z"
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": "GDGt4UPqBa04PjlpSmpyihGzd3OgfBN7jaAK5tfwp+LRSs3ygKOdbeivUCCHNagTY1hE6hG2Ou40ADfBFuXeAg==",
1191
- "signed_at": "2026-05-19T20:58:00.296Z"
1191
+ "signed_at": "2026-05-19T22:21:07.824Z"
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": "rFBpOQEJUPpl+v88Lw/WqVJRhTl80vy0VbPAbzQj3Q0suJRRrJg368I9uKu5LXIBKFDvKxnGIcIzbGg9NUtaCA==",
1241
- "signed_at": "2026-05-19T20:58:00.297Z"
1241
+ "signed_at": "2026-05-19T22:21:07.824Z"
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": "ux85YI4t2mVHOyt744Yin1HHy+z11JIFygjKfFfQOBBl5QVV3A267jeIy7utix85irMcpZm/T3yx/ooqiK2tBA==",
1315
- "signed_at": "2026-05-19T20:58:00.297Z"
1315
+ "signed_at": "2026-05-19T22:21:07.825Z"
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": "IIXnkZ5ZNqFwOto5KfytADTLLZLoyXNZACD1ORZ40P1HUAQxe6u2uyXFzzsfuob4Uy06jNkRGr2FFgCphUH1Cw==",
1365
- "signed_at": "2026-05-19T20:58:00.297Z"
1365
+ "signed_at": "2026-05-19T22:21:07.825Z"
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": "AhF9KF8ZBlDteciV+F8IBSmFVYCvQOn44GmD4rZjgLoPxfIv/QE1/vSkK32zyqDKtHWkLSXExbkkPkxA/V6dDw==",
1425
- "signed_at": "2026-05-19T20:58:00.298Z"
1425
+ "signed_at": "2026-05-19T22:21:07.825Z"
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": "HQgZvb4ReziEz5rNFr8i/O8/rJEZR+iHRROT7m/D2QUqhrcNISPkYXENsUZlG8xapzy/Ik92ehkseyj4hdmhCQ==",
1506
- "signed_at": "2026-05-19T20:58:00.298Z"
1506
+ "signed_at": "2026-05-19T22:21:07.826Z"
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": "linxmsXZiOYtcs71sSWgGCrvb8xQfmxmtTY5PRvZJ0/8FgJulo0tQtejzexYG775s7XhjAmGsDP238BQTQ8ADA==",
1575
- "signed_at": "2026-05-19T20:58:00.299Z"
1575
+ "signed_at": "2026-05-19T22:21:07.826Z"
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": "JjBfc0ovta560Clk0x3QGRM5osFJDwcvpy3rT7QEGdCIL827jzE8QCow1C8deXq+4JhY2sA/d7/8IsxikdlkCg==",
1640
- "signed_at": "2026-05-19T20:58:00.299Z"
1640
+ "signed_at": "2026-05-19T22:21:07.827Z"
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": "JWVxKFoKrbX4d+Tko1d4OBdwyg25MfFFKn4CT6E/CzH+YwnU3T6Y76uBQIKg3+gIGTvPduqyvQwQQ5FxKDuPBw==",
1726
- "signed_at": "2026-05-19T20:58:00.299Z"
1726
+ "signed_at": "2026-05-19T22:21:07.827Z"
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": "BmCRCestWqr55+fCynEhtAl5NWLT+xLTkpwS0Icp3SaoZOw/ce3Y6TtqjHRSKn4CBJq7YDiLRWxmhO3MStvOAA==",
1795
- "signed_at": "2026-05-19T20:58:00.299Z"
1795
+ "signed_at": "2026-05-19T22:21:07.827Z"
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": "/DV3pmZwrRySrk1OCbyI+0BQESacjupJfUX3eC2NGtXuYOBro0vndIP+z27heFxumnjU3a9sfla7/U9X+pqnDw==",
1876
- "signed_at": "2026-05-19T20:58:00.300Z"
1876
+ "signed_at": "2026-05-19T22:21:07.827Z"
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": "E2UGSf9ATyYgzBr8uM/0ubOUmDqo1jVA7f9mVxv6LHfWGCNuQNXDyuNou9VAmUCeeXEeUYIi3AFjXkJqpOkxDA==",
1938
- "signed_at": "2026-05-19T20:58:00.300Z"
1938
+ "signed_at": "2026-05-19T22:21:07.828Z"
1939
1939
  },
1940
1940
  {
1941
1941
  "name": "mlops-security",
@@ -2006,7 +2006,7 @@
2006
2006
  "MITRE ATLAS v5.6.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
2008
  "signature": "BGNE6ZQWBA1LmsUFe8tU0L67iGDSrFqiuqaZD2f1KqfcyqqzQfMs9PWNHFzxxaJmXeKlm87eU8lgELF0bX+RBA==",
2009
- "signed_at": "2026-05-19T20:58:00.300Z"
2009
+ "signed_at": "2026-05-19T22:21:07.828Z"
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": "FkZQerh3VHVJAwIcCktDyMRh5KE2+Em/i0ek8zEz7JG/PXtQx8ujHWTh3VjZbOLhPNtdB2qxgXOIAYIofaVOAQ==",
2071
- "signed_at": "2026-05-19T20:58:00.301Z"
2071
+ "signed_at": "2026-05-19T22:21:07.829Z"
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": "n3UToNuN3A1HgLvcuqmIx8vrZY71+r/79waK92jG+rSX4uYOzkmxMUpROrE5K9bDwMezNBHdjWv8Uul6zugyDQ==",
2151
- "signed_at": "2026-05-19T20:58:00.301Z"
2151
+ "signed_at": "2026-05-19T22:21:07.829Z"
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": "rK+WnuS+9tqEABmwc0jO/PEmxcLjG1/tmUb897HsClQeKzf+TQOlwBE+OsbtuKxpjYNwur62Xxs3TxObkwm8Cw==",
2204
- "signed_at": "2026-05-19T20:58:00.301Z"
2204
+ "signed_at": "2026-05-19T22:21:07.829Z"
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": "+OO0RhQ303RJV7kaH38IuZpLeQbapep6Ds4Re/WEZu0FHBwKSlwvF7jbtP7KQ57xldJYn/xZm2jaszyOacMfDg==",
2272
- "signed_at": "2026-05-19T20:58:00.302Z"
2272
+ "signed_at": "2026-05-19T22:21:07.830Z"
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": "e/kij7GtKaytROyIj7V5RH+FC9WtmVFzrmG2kIlNDNn29ep/CRNlIQKwXLpzo/81AIf634pmdr1qy/+vwIuUDA==",
2352
- "signed_at": "2026-05-19T20:58:00.302Z"
2352
+ "signed_at": "2026-05-19T22:21:07.830Z"
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": "ew9Kglc9fAZzbn0ZIfGP7WSK/j4eV2VhSvpy+s5bEfNEVYIMa2kZjnGBapgUsyGDLes9H9K2ovjQyX17+GKiBw==",
2433
- "signed_at": "2026-05-19T20:58:00.302Z"
2433
+ "signed_at": "2026-05-19T22:21:07.830Z"
2434
2434
  }
2435
2435
  ],
2436
2436
  "manifest_signature": {
2437
2437
  "algorithm": "Ed25519",
2438
- "signature_base64": "EF8rdCmuUPJcyaBWGybS3mVEFH5OfQIz9PwmoySOh9OQtSKk3s23EnUcJlVZ9hU1kpdUM2Duv1at/PbwZprOCg=="
2438
+ "signature_base64": "6RWl1bUtDhlyizAkvu6GBBmMFW7EvtD68X552wCliURN1GsvyvercoB2JDdXJFwR2rNZdlFuhxpWa7UR+4vGAg=="
2439
2439
  }
2440
2440
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blamejs/exceptd-skills",
3
- "version": "0.13.21",
3
+ "version": "0.13.22",
4
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), 34 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",
package/sbom.cdx.json CHANGED
@@ -1,22 +1,22 @@
1
1
  {
2
2
  "bomFormat": "CycloneDX",
3
3
  "specVersion": "1.6",
4
- "serialNumber": "urn:uuid:e9cd326f-3ca4-4e4f-987e-2d0206d0d1ac",
4
+ "serialNumber": "urn:uuid:7f62a713-9c4b-42e1-bfdf-a445644dcc1a",
5
5
  "version": 1,
6
6
  "metadata": {
7
- "timestamp": "2150-04-20T18:11:59.000Z",
7
+ "timestamp": "2093-09-21T18:48:51.000Z",
8
8
  "tools": [
9
9
  {
10
10
  "vendor": "blamejs",
11
11
  "name": "scripts/refresh-sbom.js",
12
- "version": "0.13.21"
12
+ "version": "0.13.22"
13
13
  }
14
14
  ],
15
15
  "component": {
16
- "bom-ref": "pkg:npm/@blamejs/exceptd-skills@0.13.21",
16
+ "bom-ref": "pkg:npm/@blamejs/exceptd-skills@0.13.22",
17
17
  "type": "application",
18
18
  "name": "@blamejs/exceptd-skills",
19
- "version": "0.13.21",
19
+ "version": "0.13.22",
20
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), 34 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
  {
@@ -25,17 +25,17 @@
25
25
  }
26
26
  }
27
27
  ],
28
- "purl": "pkg:npm/%40blamejs/exceptd-skills@0.13.21",
28
+ "purl": "pkg:npm/%40blamejs/exceptd-skills@0.13.22",
29
29
  "hashes": [
30
30
  {
31
31
  "alg": "SHA-256",
32
- "content": "0008dc2b26d4e59fc6986791da6277d43639c811ac5af5aa10f9b234a155921e"
32
+ "content": "dfcb0e018fbcbd75bfe5b68c68f21a46b30eb98e9663a6ca8a2b3318a447abbd"
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.21"
38
+ "url": "https://www.npmjs.com/package/@blamejs/exceptd-skills/v/0.13.22"
39
39
  },
40
40
  {
41
41
  "type": "vcs",
@@ -116,11 +116,11 @@
116
116
  "hashes": [
117
117
  {
118
118
  "alg": "SHA-256",
119
- "content": "c06c6600a1d4cbf20f87d080d9441658f0b4444023a565e1c3fe478fa35edab4"
119
+ "content": "f8f20d7d8a9c4a826dfe21240752016c9ddaa6e02c16b0c37fa04461dbb78c2b"
120
120
  },
121
121
  {
122
122
  "alg": "SHA3-512",
123
- "content": "7b16e8b3b6d2a68892f336bd7b07159c2750e9fca29539cba437bdcae3be48e10c66c1c529c7f9a4fe71f0eab9a79d0a596f740ab5bc9f9d20fb6e51d555f17e"
123
+ "content": "fd4d4db63a2eae9d1cac3e745d53e3ec0af66bf7847cdba8922a9044d9c7658d348e0f82334e4642e06409c766493dd69ae16e78593e3e1fe2882a1025d1a33a"
124
124
  }
125
125
  ]
126
126
  },
@@ -281,11 +281,11 @@
281
281
  "hashes": [
282
282
  {
283
283
  "alg": "SHA-256",
284
- "content": "1b86a9695a7438b4b87d90b1a0240daf0a2dc3e780761c0d73e53e3bbdc58cd9"
284
+ "content": "41c11c8960c05923ed4650f2a451029bd41f4149f24baf9f8d77dc5a5974bd12"
285
285
  },
286
286
  {
287
287
  "alg": "SHA3-512",
288
- "content": "d79eabbafc3bce52e718c0f13603a133ac90107303a2266d02ad4041256e7d591c93389b1cbdffff1cbd80c73d178f6c5903d9e4064cdd1a1803c9979c00bb03"
288
+ "content": "27d6e17884c3a8e18a42a424086ebaaf48f1cfb9f8da0b83f91b16af7fb36cc3e1de9f05b39176310ecdbd8b84eb6e627134f64a4c37df9d32fededd72c14d80"
289
289
  }
290
290
  ]
291
291
  },
@@ -1031,11 +1031,11 @@
1031
1031
  "hashes": [
1032
1032
  {
1033
1033
  "alg": "SHA-256",
1034
- "content": "f5395b0e858ba67d5c78fe61dcb50ebbe8cff01ce38d7fdbf3cab6b30aa84afd"
1034
+ "content": "34b9a8ed6d468fe83422e7fa1aae30d205ccd01e8f9e9e3f4a2273ab10f5cfc5"
1035
1035
  },
1036
1036
  {
1037
1037
  "alg": "SHA3-512",
1038
- "content": "1158047605ad81345d4899a29341be469f0f643bf16e7fd4455750d9934902ec6e1313968aca0cbba77224c35c37283b1683822760bf1042bc754d3940ea81b0"
1038
+ "content": "fa5b647c27f0252d9ae1eae179a1b9e10c3186a87328f428c716c7adc74eac347aea5c6094fb7997295d32b3bfd18536709e1dba9659a4b807a274a233d227d8"
1039
1039
  }
1040
1040
  ]
1041
1041
  },
@@ -1451,11 +1451,11 @@
1451
1451
  "hashes": [
1452
1452
  {
1453
1453
  "alg": "SHA-256",
1454
- "content": "b8676a67b642f623974dccf3ba0f1df95836541b7c1dcd0c63cef2b71fa1a88a"
1454
+ "content": "068eb6c464d8999f41906bd3ea080b6b579d6dc15c3c1b05c1caf94adb72cd27"
1455
1455
  },
1456
1456
  {
1457
1457
  "alg": "SHA3-512",
1458
- "content": "fc5556bf27093bda786f564caaba523dec5d39f92e1b09ce9e5011f8411cf3add4892cd28330ec4f0b08e8bb6ba61c7a1849cc4ecdad64bd8df7b03afc58650d"
1458
+ "content": "258f9d6343d5b9a2d983ed483e8038d2442d7830fe1d5a8b84541bd8fbae9a2dbd23a682c7e34cc769fea48ca22bd7cfc49ed21ba8f3dab7bac384f77ea24490"
1459
1459
  }
1460
1460
  ]
1461
1461
  },