@blamejs/exceptd-skills 0.12.26 → 0.12.28

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/AGENTS.md CHANGED
@@ -353,6 +353,9 @@ Maintainers convert approved requests into skill files. The contributor is credi
353
353
  | container security, kubernetes, cis k8s, pod security standards, kyverno, gatekeeper, falco, tetragon, admission policy | container-runtime-security |
354
354
  | mlops security, model registry, training data integrity, mlflow, kubeflow, vertex ai, sagemaker, hugging face, model signing, drift detection | mlops-security |
355
355
  | incident response, ir playbook, csirt, picerl, nist 800-61, iso 27035, breach notification, bec incident, ai incident | incident-response-playbook |
356
+ | ransomware response, decryptor, no more ransom, ofac sdn, cyber insurance, immutable backup, double extortion, phi exfil before encrypt, lockbit, alphv, akira | ransomware-response |
357
+ | idp incident, okta tenant compromise, entra id, auth0, saml token forgery, oauth consent abuse, federated trust modification, midnight blizzard, scattered spider | idp-incident-response |
358
+ | cloud iam incident, aws account takeover, gcp account takeover, azure account takeover, cross-account assume-role, imds, access key leak, snowflake breach, scim, workload identity | cloud-iam-incident |
356
359
  | email security, anti-phishing, dmarc, dkim, spf, bimi, arc, mta-sts, bec, vishing, deepfake phishing | email-security-anti-phishing |
357
360
  | age gate, age verification, coppa, cipa, california aadc, uk children's code, kosa, gdpr article 8, dsa article 28, parental consent, csam, child safety, children's online safety | age-gates-child-safety |
358
361
  | forward watch, watchlist, upcoming standards, horizon scan | `node orchestrator/index.js watchlist` (add `--by-skill` to invert) |
package/CHANGELOG.md CHANGED
@@ -1,5 +1,65 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.12.28 — 2026-05-15
4
+
5
+ Incident-response cluster — three new playbooks and skills covering identity-provider tenant compromise, cloud-IAM account takeover, and ransomware response. The existing `incident-response-playbook` skill stays as the generic PICERL backbone; the new surface adds attack-class-specific depth for the three IR scenarios that dominate 2025-2026 breach reporting.
6
+
7
+ ### Features
8
+
9
+ **`idp-incident` playbook + `idp-incident-response` skill.** Tenant-compromise response for Okta / Entra ID / Auth0 / Ping / OneLogin. Covers federated-trust modification, OAuth consent abuse, SAML token forgery, cross-tenant relationship abuse, dormant service-account reactivation, and help-desk social engineering. Maps T1078.004, T1098.001, T1556.007, T1606.002, T1199. Eight jurisdiction clocks (GDPR Art.33/34, NIS2 Art.23, DORA Art.19, NYDFS 500.17, CCPA/CPRA, AU NDB, UK GDPR). Detects on unauthorized consent grants from non-corp tenants, anomalous federated-trust additions, MFA factor swaps without password reset, recent high-privilege role assignments, and cross-tenant assumption anomalies — each indicator carries explicit false-positive checks.
10
+
11
+ **`cloud-iam-incident` playbook + `cloud-iam-incident` skill.** Account-takeover response for AWS / GCP / Azure. Covers cross-account assume-role abuse, IMDS exposure, managed-identity token replay, access-key leakage to public repositories, federated-trust attacks against IAM Identity Center, and crypto-mining detection via GPU-instance creation. Maps T1078.004, T1098.001, T1098.003, T1136.003, T1538, T1552.005, T1562.008, T1580. Ten jurisdiction clocks including SG PDPA, JP APPI, and US-CA. Detects on root-login ASN anomalies, mass IAM-user creation outside IaC, unused-region resource creation, cross-account assume-role anomalies, IMDSv1 legacy access, KMS key-policy self-grants, and S3-bucket public-grant events.
12
+
13
+ **`ransomware` playbook + `ransomware-response` skill.** Ransomware-specific incident response — extends the generic `incident-response-playbook` with the four decision properties that don't appear in standard IR frameworks: OFAC SDN sanctions check (BLOCKING for payment posture; payment to a sanctioned threat actor is a federal-law violation in the US), decryptor availability (No More Ransom + vendor-specific decryptors), cyber-insurance carrier notification posture (most policies require 24-hour notification), and immutable-backup viability versus replication-only "backups." Sixteen jurisdiction obligations spanning OFAC (0-hour BLOCKING), insurance carrier (24h), NIS2 (24h), DORA (4h), GDPR (72h), SEC 8-K (4 business days), HIPAA, CCPA, NYDFS ransom-event notification, and CIRCIA. Detects on mass file-extension change events, shadow-copy deletion outside maintenance windows, encrypted-file-extension growth rate anomalies, BloodHound-class AD reconnaissance, and large outbound transfers 24-72 hours before encryption (exfil-before-encrypt as distinct breach class).
14
+
15
+ ### Internal
16
+
17
+ - Skill count 39 → 42 (Ed25519 manifest re-signed).
18
+ - Playbook count 13 → 16 (validator `tests/validate-playbooks.test.js` updated).
19
+ - RFC catalog: added RFC-7591 (OAuth 2.0 Dynamic Client Registration), RFC-8693 (OAuth 2.0 Token Exchange), RFC-9068 (JWT Profile for OAuth 2.0 Access Tokens).
20
+ - ATT&CK techniques added to resolution catalog: T1098.001, T1098.003, T1136.003, T1538, T1562.008, T1580, T1606.002.
21
+ - Framework-control-gaps catalog: 22 new entries covering federated-identity gaps (NIST 800-53 IA-5, ISO 27001 A.5.16-17, SOC 2 CC6, UK CAF B2, AU ISM-1559), cloud-IAM gaps (FedRAMP IL5, NIST AC-2 cross-account, ISO 27017, AWS Security Hub coverage, AU ISM-1546), and ransomware-specific gaps (OFAC SDN payment block, cyber-insurance 24h notification, EU Reg 2014/833 cyber sanctions, immutable-backup recovery, decryptor availability pre-decision, PHI-exfil-before-encrypt breach class).
22
+ - AGENTS.md Quick Skill Reference table extended with the three new skills.
23
+
24
+
25
+ ## 0.12.27 — 2026-05-15
26
+
27
+ **Patch: opt-in `--bundle-deterministic` mode for reproducible CSAF + OpenVEX + close-envelope bytes. Closes cycle 6 III P2-E + cycle 7 CCC bundle-non-determinism finding.**
28
+
29
+ ### New flags
30
+
31
+ - **`--bundle-deterministic`** (boolean, off by default) — when set, the bundle-emit path produces byte-stable output for the same inputs. CSAF `tracking.initial_release_date` / `current_release_date` / `generator.date` / `revision_history[0].date`, OpenVEX top-level `timestamp` + per-statement `timestamp`, close-envelope `acceptance_date` + `regression_schedule.next_run` + `generated_at` all freeze to a single epoch. Auto-generated session IDs derive deterministically from `sha256(playbook_id ∥ evidence_hash ∥ engine_version)` rather than `crypto.randomBytes`. CSAF `vulnerabilities[]` + OpenVEX `statements[]` arrays sort by primary id.
32
+ - **`--bundle-epoch <ISO-8601>`** (value-bearing, optional) — operator-supplied freeze epoch. When omitted, the deterministic mode falls back to `playbook._meta.last_threat_review` (the canonical "this catalog was last reviewed at" timestamp). Honored only when `--bundle-deterministic` is set.
33
+
34
+ Both flags wired for `run`, `ci`, `run-all`, `ai-run`, `ingest`. Per-verb help blocks document them.
35
+
36
+ ### Why
37
+
38
+ - **CI bundle diffing**: `git diff` over `evidence_package.bundle_body` against a baseline becomes signal-bearing only when drift is signal, not noise. Pre-v0.12.27 the same evidence produced ~640 bytes of timestamp drift across CSAF + OpenVEX + close-envelope per run.
39
+ - **Auditor evidence reuse**: ISO 27001 / SOC 2 audits expect re-emit against the same submission to produce byte-equal evidence.
40
+ - **SLSA / Sigstore alignment**: reproducible build evidence requires deterministic outputs the verifier can hash and compare.
41
+
42
+ CSAF 2.0 §3.1.11.2-5 permits identical `initial_release_date` / `current_release_date` for never-revised advisories; freezing to a catalog epoch is spec-compliant. The strict-validator pass (BSI CSAF Validator) accepts the deterministic-mode output unchanged.
43
+
44
+ ### Default-mode regression guard
45
+
46
+ When neither flag is set, bundle output is byte-identical to v0.12.26 — no existing operator sees a behavioral change. A regression test pins this: two consecutive runs in default mode produce different CSAF `tracking.initial_release_date` values, asserting the determinism is opt-in and cannot accidentally activate.
47
+
48
+ ### Test coverage
49
+
50
+ `tests/bundle-determinism.test.js` (new, 7 exact-code tests):
51
+ 1. Two runs same inputs + same epoch → byte-identical CSAF/OpenVEX/summary
52
+ 2. Different `--bundle-epoch` → bundles differ only in timestamp fields
53
+ 3. Different evidence → bundles differ in `vulnerabilities[]` length; timestamps frozen
54
+ 4. Default mode → regression-guard timestamp drift
55
+ 5. `--bundle-epoch invalid-iso` → exit 1 + structured error
56
+ 6. `--bundle-deterministic` without `--bundle-epoch` falls back to `playbook._meta.last_threat_review`
57
+ 7. Array sort: random-order CVE evidence → `vulnerabilities[]` always ascending by `cve_id`
58
+
59
+ Existing CSAF + OpenVEX + CLI test suites pass unchanged (53/53 + 30/30; no default-mode regression).
60
+
61
+ Test count: 1058 pass (5 skipped). Predeploy gates: 14/14. Skills: 39/39 signed.
62
+
3
63
  ## 0.12.26 — 2026-05-15
4
64
 
5
65
  **Patch: sector-telecom skill ships, with supporting framework-gap and ATLAS catalog scaffolding. Closes the cycle 8 LLL P1 finding that the unmodeled RWEP signal from Salt Typhoon-class campaigns was the highest gap in the catalog.**
package/bin/exceptd.js CHANGED
@@ -909,6 +909,11 @@ function dispatchPlaybook(cmd, argv) {
909
909
  "force-overwrite", "no-stream", "block-on-jurisdiction-clock",
910
910
  "force-replay",
911
911
  "json-stdout-only", "fix", "human", "json", "strict-preconditions",
912
+ // v0.12.27: --bundle-deterministic opts the bundle build into
913
+ // byte-stable output (frozen timestamps, deterministic session_id
914
+ // fallback, sorted vulnerabilities[] / statements[]). Pairs with
915
+ // --bundle-epoch <ISO> for the frozen timestamp value.
916
+ "bundle-deterministic",
912
917
  // v0.12.9: doctor --shipped-tarball runs the verify-shipped-tarball
913
918
  // gate alongside --signatures. doctor --registry-check + --signatures
914
919
  // were already accepted; explicit registration removes the silent
@@ -1266,6 +1271,55 @@ function dispatchPlaybook(cmd, argv) {
1266
1271
  runOpts.csafStatus = cs;
1267
1272
  }
1268
1273
 
1274
+ // --bundle-deterministic + --bundle-epoch (v0.12.27): opt-in deterministic
1275
+ // bundle emit. When set, CSAF / OpenVEX / close-envelope timestamps freeze
1276
+ // to the supplied epoch (or the playbook's last_threat_review fallback),
1277
+ // the auto-generated session_id derives from sha256(playbook + evidence_hash
1278
+ // + engine_version) when the operator did not pass --session-id, and
1279
+ // vulnerabilities[] / statements[] sort deterministically. Opt-in so the
1280
+ // default emit path stays byte-identical to pre-v0.12.27 output.
1281
+ if (args["bundle-deterministic"] !== undefined && args["bundle-deterministic"] !== false) {
1282
+ if (!BUNDLE_FLAG_RELEVANT_VERBS.has(cmd)) {
1283
+ return emitError(
1284
+ `${cmd}: --bundle-deterministic is irrelevant on this verb (no bundle is assembled). --bundle-deterministic only applies to verbs that drive phases 5-7: ${[...BUNDLE_FLAG_RELEVANT_VERBS].sort().join(", ")}.`,
1285
+ { verb: cmd, flag: "bundle-deterministic", error_class: "irrelevant-flag", accepted_verbs: [...BUNDLE_FLAG_RELEVANT_VERBS].sort() },
1286
+ pretty
1287
+ );
1288
+ }
1289
+ runOpts.bundleDeterministic = true;
1290
+ }
1291
+ if (args["bundle-epoch"] !== undefined) {
1292
+ if (!BUNDLE_FLAG_RELEVANT_VERBS.has(cmd)) {
1293
+ return emitError(
1294
+ `${cmd}: --bundle-epoch is irrelevant on this verb (no bundle is assembled). --bundle-epoch only applies to verbs that drive phases 5-7: ${[...BUNDLE_FLAG_RELEVANT_VERBS].sort().join(", ")}.`,
1295
+ { verb: cmd, flag: "bundle-epoch", error_class: "irrelevant-flag", accepted_verbs: [...BUNDLE_FLAG_RELEVANT_VERBS].sort() },
1296
+ pretty
1297
+ );
1298
+ }
1299
+ const epoch = args["bundle-epoch"];
1300
+ if (typeof epoch !== "string") {
1301
+ return emitError(
1302
+ `${cmd}: --bundle-epoch must be a string ISO-8601 timestamp.`,
1303
+ { verb: cmd, flag: "bundle-epoch", provided: typeof epoch },
1304
+ pretty
1305
+ );
1306
+ }
1307
+ // Reuse validateIsoSince — the same calendar-shape gate used for --since.
1308
+ const isoErr = validateIsoSince(epoch);
1309
+ if (isoErr) {
1310
+ return emitError(
1311
+ `${cmd}: --bundle-epoch must be a parseable ISO-8601 calendar timestamp (e.g. 2026-01-01T00:00:00Z). Got: ${JSON.stringify(epoch).slice(0, 80)}`,
1312
+ { verb: cmd, flag: "bundle-epoch", provided: epoch.slice(0, 80) },
1313
+ pretty
1314
+ );
1315
+ }
1316
+ // Normalise to a full ISO timestamp so downstream consumers don't have
1317
+ // to handle the date-only shape. Date-only inputs render as
1318
+ // YYYY-MM-DDT00:00:00.000Z; full timestamps round-trip unchanged modulo
1319
+ // ms precision (Date.prototype.toISOString always emits ms).
1320
+ runOpts.bundleEpoch = new Date(epoch).toISOString();
1321
+ }
1322
+
1269
1323
  // --ack: operator acknowledges the jurisdiction obligations surfaced by
1270
1324
  // govern. Captured in attestation; downstream tooling can check whether
1271
1325
  // consent was explicit vs. implicit. AGENTS.md says the AI should surface
@@ -1512,6 +1566,16 @@ Flags:
1512
1566
  publisher trust anchor — i.e. the operator's
1513
1567
  organisation, NOT the tooling vendor. Must be an
1514
1568
  http://… or https://… URL, ≤256 chars.
1569
+ --bundle-deterministic Emit byte-stable CSAF / OpenVEX / close envelope.
1570
+ Freezes tracking + timestamp fields to a single
1571
+ epoch, derives session_id from evidence hash when
1572
+ not supplied via --session-id, and sorts
1573
+ vulnerabilities[] / statements[] ascending.
1574
+ Off by default; opt-in for reproducible-build
1575
+ pipelines + diff-friendly attestation review.
1576
+ --bundle-epoch <ISO> Frozen epoch for --bundle-deterministic. ISO-8601
1577
+ calendar timestamp (date or date+time). Falls back
1578
+ to the playbook's last_threat_review when omitted.
1515
1579
  --diff-from-latest Compare evidence_hash against the most recent prior
1516
1580
  attestation for the same playbook in
1517
1581
  .exceptd/attestations/. Emits status: unchanged | drifted.
@@ -1589,6 +1653,8 @@ Flags:
1589
1653
  CSAF document.publisher.namespace (§3.1.7.4). The
1590
1654
  operator's organisation URL, NOT the tooling vendor.
1591
1655
  Must be an http://… or https://… URL, ≤256 chars.
1656
+ --bundle-deterministic Emit byte-stable bundles (frozen timestamps).
1657
+ --bundle-epoch <ISO> Frozen epoch for --bundle-deterministic.
1592
1658
  --pretty Indented JSON output.
1593
1659
 
1594
1660
  Exit codes: 0 PASS, 1 framework, 4 blocked, 7 SESSION_ID_COLLISION,
@@ -1716,6 +1782,8 @@ Flags:
1716
1782
  CSAF document.publisher.namespace (§3.1.7.4). The
1717
1783
  operator's organisation URL, NOT the tooling vendor.
1718
1784
  Must be an http://… or https://… URL, ≤256 chars.
1785
+ --bundle-deterministic Emit byte-stable bundles for reproducible pipelines.
1786
+ --bundle-epoch <ISO> Frozen epoch for --bundle-deterministic.
1719
1787
  --evidence <file|-> Single-shot mode: pre-supplied submission JSON.
1720
1788
  --operator <name> Bind the attestation to a specific identity.
1721
1789
  --ack Mark explicit operator consent (jurisdiction clock).
@@ -1794,6 +1862,8 @@ Flags:
1794
1862
  --publisher-namespace <url>
1795
1863
  CSAF document.publisher.namespace (§3.1.7.4). The
1796
1864
  operator's organisation URL, NOT the tooling vendor.
1865
+ --bundle-deterministic Emit byte-stable bundles across per-playbook runs.
1866
+ --bundle-epoch <ISO> Frozen epoch for --bundle-deterministic.
1797
1867
  --json Force single-line JSON (overrides any TTY heuristics).
1798
1868
  --pretty Indented JSON output (implies --json).
1799
1869
 
@@ -1874,7 +1944,9 @@ Flags (selected — see \`exceptd run --help\` for the full list):
1874
1944
  --publisher-namespace <url>
1875
1945
  CSAF document.publisher.namespace (§3.1.7.4). The
1876
1946
  operator's organisation URL, NOT the tooling vendor.
1877
- Must be an http://… or https://… URL, ≤256 chars.`,
1947
+ Must be an http://… or https://… URL, ≤256 chars.
1948
+ --bundle-deterministic Emit byte-stable bundles across the multi-run set.
1949
+ --bundle-epoch <ISO> Frozen epoch for --bundle-deterministic.`,
1878
1950
  };
1879
1951
  process.stdout.write((cmds[verb] || `${verb} — no per-verb help available; see \`exceptd help\` for the full list.`) + "\n");
1880
1952
  }
@@ -1,20 +1,20 @@
1
1
  {
2
2
  "schema_version": "1.1.0",
3
- "generated_at": "2026-05-15T22:17:17.497Z",
3
+ "generated_at": "2026-05-15T23:31:25.676Z",
4
4
  "generator": "scripts/build-indexes.js",
5
- "source_count": 51,
5
+ "source_count": 54,
6
6
  "source_hashes": {
7
- "manifest.json": "492f8548ab8dc7d8edba1666d07c401d77e9459e356e3c30283888c73be6f005",
7
+ "manifest.json": "41d91731d616c0e2514783212f7eb32761298ab40cde66aa6076724aff729190",
8
8
  "data/atlas-ttps.json": "db52a797f6ba7c9a61fd7b1225ebbc268ddf21abe29a106c4246c2ed2e617b86",
9
- "data/attack-techniques.json": "6b45448aa42cc6664376c93da73356624708e935c12589ee8c776a10215bce3a",
9
+ "data/attack-techniques.json": "51f60819aef36e960fd768e44dcc725e137781534fbbb028e5ef6baa21defa1d",
10
10
  "data/cve-catalog.json": "a2acad16f5e3856b07019fa00110e9dcb38ec5cc71b318d0e164bfcba7f4f644",
11
11
  "data/cwe-catalog.json": "19893d2a7139d86ff3fcf296b0e6cda10e357727a1d1ffb56af282104e99157a",
12
12
  "data/d3fend-catalog.json": "d219520c8d3eb61a270b25ea60f64721035e98a8d5d51d1a4e1f1140d9a586f9",
13
13
  "data/dlp-controls.json": "8ea8d907aea0a2cfd772b048a62122a322ba3284a5c36a272ad5e9d392564cb5",
14
14
  "data/exploit-availability.json": "a9eeda95d24b56c28a0d0178fc601b531653e2ba7dc857160b35ad23ad6c7471",
15
- "data/framework-control-gaps.json": "e87790cae8839dc5d73632d7d875d12cffa2ad741a9002ec7851e1ae04df54c4",
15
+ "data/framework-control-gaps.json": "8d6cbf6c8fc38060c5cea9f300a61b4d0cbbda5e490983bd6780d0b0ae841e5a",
16
16
  "data/global-frameworks.json": "0168825497e03f079274c9da2e5529310a2ba5bd7c7da7c93acd0b66ed845b8a",
17
- "data/rfc-references.json": "863f1ad7a36c020d11eb7bffea49ca1df89b10d43f3986118cdc5a5712308115",
17
+ "data/rfc-references.json": "a11de1bcff62b8f5e0bb8ce47a9b3fa26cf733ba283a8f1c9c4185d74efaad3e",
18
18
  "data/zeroday-lessons.json": "d960e5f8ca7a83c10194cd60207e13046a7eee1b8793e2f3de79475db283f800",
19
19
  "skills/kernel-lpe-triage/skill.md": "8e94bfd38d6db47342fbbe95a0c8df8f7c38743982c13e9de6a1c59cd3783d33",
20
20
  "skills/ai-attack-surface/skill.md": "13e543fc92b9b27cdb647dce96a9eeb44919e0fa92ec41e8265a9981a23e7b79",
@@ -53,36 +53,39 @@
53
53
  "skills/container-runtime-security/skill.md": "f06260f0c468d6a4f0409294899017edab45c98d71db1fedd7a630fe6a7bf53a",
54
54
  "skills/mlops-security/skill.md": "e6a296fc67724aa3b026c0039f44867b44cf0926eade4fe616bfd0a4c77310bf",
55
55
  "skills/incident-response-playbook/skill.md": "8ef7ce1246dc1329b6df3cc9de8d79d35e2c02c703dcef20f35b312b1c24fd52",
56
+ "skills/ransomware-response/skill.md": "ffe07ba8c196aabceb69b07dafa7a9c3ca2ec8e5ce079107f4eec82512a01be1",
56
57
  "skills/email-security-anti-phishing/skill.md": "b5a7693b3ddbd6cd83303d092bc5e324db431245d25c4945d9f65fcffa1995e7",
57
- "skills/age-gates-child-safety/skill.md": "c741d7dca9da0abb09bdebb8a02e803ce4ae9fb9a6904fb8df3ec19cae83917d"
58
+ "skills/age-gates-child-safety/skill.md": "c741d7dca9da0abb09bdebb8a02e803ce4ae9fb9a6904fb8df3ec19cae83917d",
59
+ "skills/cloud-iam-incident/skill.md": "35a9dd108679103c0eca54ea0c5b8f3db0a199975f87e20660b2c3a11440f40b",
60
+ "skills/idp-incident-response/skill.md": "39b5b492914e9092fe1c0b2be5af83d4ed869939996b6a201f2d0cd8142ab8f3"
58
61
  },
59
- "skill_count": 39,
62
+ "skill_count": 42,
60
63
  "catalog_count": 11,
61
64
  "index_stats": {
62
65
  "xref_entries": {
63
- "cwe_refs": 34,
64
- "d3fend_refs": 20,
65
- "framework_gaps": 58,
66
+ "cwe_refs": 36,
67
+ "d3fend_refs": 21,
68
+ "framework_gaps": 80,
66
69
  "atlas_refs": 10,
67
- "attack_refs": 32,
68
- "rfc_refs": 20,
70
+ "attack_refs": 39,
71
+ "rfc_refs": 23,
69
72
  "dlp_refs": 0
70
73
  },
71
- "trigger_table_entries": 475,
74
+ "trigger_table_entries": 538,
72
75
  "chains_cve_entries": 27,
73
76
  "chains_cwe_entries": 55,
74
77
  "jurisdictions_indexed": 29,
75
- "handoff_dag_nodes": 39,
76
- "summary_cards": 39,
77
- "section_offsets_skills": 39,
78
- "token_budget_total_approx": 362735,
78
+ "handoff_dag_nodes": 42,
79
+ "summary_cards": 42,
80
+ "section_offsets_skills": 42,
81
+ "token_budget_total_approx": 397336,
79
82
  "recipes": 8,
80
83
  "jurisdiction_clocks": 29,
81
84
  "did_ladders": 8,
82
85
  "theater_fingerprints": 7,
83
86
  "currency_action_required": 0,
84
87
  "frequency_fields": 7,
85
- "activity_feed_events": 51,
88
+ "activity_feed_events": 54,
86
89
  "catalog_summaries": 11,
87
90
  "stale_content_findings": 3
88
91
  },
@@ -2,7 +2,7 @@
2
2
  "_meta": {
3
3
  "schema_version": "1.0.0",
4
4
  "note": "Per-artifact 'last changed' feed sorted descending by date. Skill events from manifest.last_threat_review; catalog events from data/<catalog>.json _meta.last_updated.",
5
- "event_count": 51
5
+ "event_count": 54
6
6
  },
7
7
  "events": [
8
8
  {
@@ -12,6 +12,27 @@
12
12
  "path": "skills/sector-telecom/skill.md",
13
13
  "note": "Telecom and 5G security for mid-2026 — Salt Typhoon, Volt Typhoon, CALEA / IPA-LI gateway compromise, signaling-protocol abuse (SS7 / Diameter / GTP), 5G N6 / N9 isolation, gNB / DU / CU integrity, OEM-equipment supply-chain compromise, AI-RAN / O-RAN security"
14
14
  },
15
+ {
16
+ "date": "2026-05-15",
17
+ "type": "skill_review",
18
+ "artifact": "ransomware-response",
19
+ "path": "skills/ransomware-response/skill.md",
20
+ "note": "Ransomware-specific incident response — OFAC SDN sanctions screening as payment-posture blocker, EU Reg 2014/833 + UK OFSI + AU DFAT + JP MOF cross-jurisdiction sanctions lookups, decryptor availability via No More Ransom + vendor-specific catalogs, cyber-insurance carrier 24h notification, negotiator-engagement legal posture, immutable-backup viability test, PHI exfil-before-encrypt as distinct breach class, parallel jurisdiction clocks"
21
+ },
22
+ {
23
+ "date": "2026-05-15",
24
+ "type": "skill_review",
25
+ "artifact": "cloud-iam-incident",
26
+ "path": "skills/cloud-iam-incident/skill.md",
27
+ "note": "Cloud-IAM incident response for AWS / GCP / Azure — account takeover, IAM role assumption abuse, access-key compromise, cross-account assume-role chains, federated-trust attacks, IMDS metadata exfiltration, and Snowflake-AA24-class IdP-to-cloud credential reuse"
28
+ },
29
+ {
30
+ "date": "2026-05-15",
31
+ "type": "skill_review",
32
+ "artifact": "idp-incident-response",
33
+ "path": "skills/idp-incident-response/skill.md",
34
+ "note": "Identity-provider incident response for mid-2026 — Okta, Entra ID, Auth0, Ping, OneLogin tenant compromise, federated-trust abuse, OAuth app consent abuse, Midnight Blizzard and Scattered Spider TTPs against the IdP control plane"
35
+ },
15
36
  {
16
37
  "date": "2026-05-15",
17
38
  "type": "catalog_update",
@@ -26,7 +47,7 @@
26
47
  "artifact": "data/attack-techniques.json",
27
48
  "path": "data/attack-techniques.json",
28
49
  "schema_version": "1.0.0",
29
- "entry_count": 91
50
+ "entry_count": 98
30
51
  },
31
52
  {
32
53
  "date": "2026-05-15",
@@ -42,7 +63,7 @@
42
63
  "artifact": "data/framework-control-gaps.json",
43
64
  "path": "data/framework-control-gaps.json",
44
65
  "schema_version": "1.0.0",
45
- "entry_count": 87
66
+ "entry_count": 109
46
67
  },
47
68
  {
48
69
  "date": "2026-05-15",
@@ -58,7 +79,7 @@
58
79
  "artifact": "data/rfc-references.json",
59
80
  "path": "data/rfc-references.json",
60
81
  "schema_version": "1.0.0",
61
- "entry_count": 38
82
+ "entry_count": 41
62
83
  },
63
84
  {
64
85
  "date": "2026-05-15",
@@ -371,7 +392,7 @@
371
392
  "type": "manifest_review",
372
393
  "artifact": "manifest.json",
373
394
  "path": "manifest.json",
374
- "note": "manifest threat_review_date — 39 skills, 11 catalogs"
395
+ "note": "manifest threat_review_date — 42 skills, 11 catalogs"
375
396
  }
376
397
  ]
377
398
  }
@@ -40,7 +40,7 @@
40
40
  "rebuild_after_days": 365,
41
41
  "note": "Catalog must be rebuilt against the upstream ATT&CK release whenever MITRE publishes a new version. AGENTS.md external-data version-pinning rule requires the bump to be intentional, not silent. ATT&CK ships semi-annually (April + October); audit on each release for tactic moves, technique splits, and new Detection Strategies."
42
42
  },
43
- "entry_count": 91,
43
+ "entry_count": 98,
44
44
  "sample_keys": [
45
45
  "T0001",
46
46
  "T0017",
@@ -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": 87,
175
+ "entry_count": 109,
176
176
  "sample_keys": [
177
177
  "ALL-AI-PIPELINE-INTEGRITY",
178
178
  "ALL-MCP-TOOL-TRUST",
@@ -216,7 +216,7 @@
216
216
  "rebuild_after_days": 365,
217
217
  "note": "Per-entry last_verified governs decay. Skills depending on this catalog must check entry freshness before high-stakes use."
218
218
  },
219
- "entry_count": 38,
219
+ "entry_count": 41,
220
220
  "sample_keys": [
221
221
  "RFC-4301",
222
222
  "RFC-4303",