@blamejs/exceptd-skills 0.12.25 → 0.12.27

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,87 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.12.27 — 2026-05-15
4
+
5
+ **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.**
6
+
7
+ ### New flags
8
+
9
+ - **`--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.
10
+ - **`--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.
11
+
12
+ Both flags wired for `run`, `ci`, `run-all`, `ai-run`, `ingest`. Per-verb help blocks document them.
13
+
14
+ ### Why
15
+
16
+ - **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.
17
+ - **Auditor evidence reuse**: ISO 27001 / SOC 2 audits expect re-emit against the same submission to produce byte-equal evidence.
18
+ - **SLSA / Sigstore alignment**: reproducible build evidence requires deterministic outputs the verifier can hash and compare.
19
+
20
+ 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.
21
+
22
+ ### Default-mode regression guard
23
+
24
+ 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.
25
+
26
+ ### Test coverage
27
+
28
+ `tests/bundle-determinism.test.js` (new, 7 exact-code tests):
29
+ 1. Two runs same inputs + same epoch → byte-identical CSAF/OpenVEX/summary
30
+ 2. Different `--bundle-epoch` → bundles differ only in timestamp fields
31
+ 3. Different evidence → bundles differ in `vulnerabilities[]` length; timestamps frozen
32
+ 4. Default mode → regression-guard timestamp drift
33
+ 5. `--bundle-epoch invalid-iso` → exit 1 + structured error
34
+ 6. `--bundle-deterministic` without `--bundle-epoch` falls back to `playbook._meta.last_threat_review`
35
+ 7. Array sort: random-order CVE evidence → `vulnerabilities[]` always ascending by `cve_id`
36
+
37
+ Existing CSAF + OpenVEX + CLI test suites pass unchanged (53/53 + 30/30; no default-mode regression).
38
+
39
+ Test count: 1058 pass (5 skipped). Predeploy gates: 14/14. Skills: 39/39 signed.
40
+
41
+ ## 0.12.26 — 2026-05-15
42
+
43
+ **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.**
44
+
45
+ ### New skill: `sector-telecom`
46
+
47
+ Telecom and 5G security skill covering Salt Typhoon and Volt Typhoon TTPs, CALEA / IPA-LI gateway compromise, signaling-protocol abuse (SS7, Diameter, GTP), 5G N6 / N9 isolation, gNB / DU / CU integrity attestation, OEM-equipment supply-chain compromise, and AI-RAN / O-RAN security.
48
+
49
+ The skill walks the seven-phase contract with telecom-specific jurisdictional clocks (FCC 47 CFR 64.2011 4-business-day rule, NIS2 Art. 23 24h initial, DORA Art. 19 4h for financial-touching incidents, UK TSA 2021 + Ofcom, AU SOCI / TSSR, JP MIC, IN CERT-In 6h, SG IMDA TCCSCoP, NZ TICSA, CA Bill C-26), evidence capture for LI provisioning audit logs / gNB firmware hashes / NMS access logs / signaling-flow statistics / cross-PLMN exchange patterns / eUICC SIM-swap events / 5GC slice-isolation tests / OEM remote-support tunnel inventory / NESAS deployment posture, and the standard analyze → validate → close phases against the new framework-gap entries.
50
+
51
+ Compliance Theater Check enumerates seven posture-vs-actual tests specific to telecom: CPNI annual certification, GSMA NESAS deployment vs runtime, OEM firmware verification chain, 3GPP TR 33.926 deployment posture, ITU-T X.805 validation, signaling firewall PLMN-list refresh cadence, and LI-gateway MFA scope.
52
+
53
+ Manifest skill count 38 → 39.
54
+
55
+ ### Catalog scaffolding to support the skill
56
+
57
+ Nine telecom-specific framework-gap entries added to `data/framework-control-gaps.json` (totals 78 → 87 entries):
58
+
59
+ - **FCC-CPNI-4.1** — 47 CFR 64.2009(e) CPNI annual certification + operational compliance, gap against Salt Typhoon LI-system vector
60
+ - **FCC-Cyber-Incident-Notification-2024** — 47 CFR 64.2011 4-business-day rule, gap against LI-only compromise (no PII exfil) + signaling abuse + slow-roll campaign timing
61
+ - **NIS2-Annex-I-Telecom** — telecom as essential entity, gap against LI-gateway access controls + OEM firmware attestation + AI-RAN coverage
62
+ - **DORA-Art-21-Telecom-ICT** — ICT third-party risk through telecom services, gap against telecom-financial cadence misalignment + slice-isolation
63
+ - **UK-CAF-B5** — resilient networks principle, gap against signaling-anomaly + gNB attestation + slice-isolation outcome tests
64
+ - **AU-ISM-1556** — privileged-user MFA, gap against telecom NMS service accounts + LI-gateway operator credentials + OEM remote-support tunnels
65
+ - **GSMA-NESAS-Deployment** — NESAS product-time vs operator-attested-runtime posture gap
66
+ - **3GPP-TR-33.926** — SCAS submission-time test gap against post-deployment adversary-modified firmware + cross-spec N6/N9 isolation testing gap
67
+ - **ITU-T-X.805** — 2003 reference architecture gap against modern Salt Typhoon / signaling abuse / slice-isolation threat models
68
+
69
+ One ATLAS technique added to `data/atlas-ttps.json`:
70
+
71
+ - **AML.T0040 Tool / Plugin Compromise** — anchors the AI-RAN xApp / rApp + MCP-class plugin attack class. Real-world instances: CVE-2026-30623 (Anthropic MCP SDK stdio command-injection), three Pwn2Own Berlin 2026 collisions (Viettel Claude Code, STARLabs LM Studio, Compass OpenAI Codex). `secure_ai_v2_layer: true`, `maturity: high`.
72
+
73
+ Total ATLAS entries: 29 → 30.
74
+
75
+ ### RFC reverse-reference
76
+
77
+ `data/rfc-references.json` RFC-9622 (TAPS Architecture) `skills_referencing` array gains `sector-telecom` (paired with the existing `webapp-security` reference) to satisfy the manifest forward-reference invariant.
78
+
79
+ ### AGENTS.md Quick Skill Reference
80
+
81
+ Adds the `sector-telecom` row to the skill trigger table.
82
+
83
+ Test count: 1051 pass (5 skipped). Predeploy gates: 14/14. Skills: 39/39 signed; manifest envelope signed.
84
+
3
85
  ## 0.12.25 — 2026-05-15
4
86
 
5
87
  **Data-refresh release: catalog freshness, Hard Rule #7 AI-discovery posture, ATLAS v5.4 + ATT&CK v19 standards bumps, Pwn2Own Berlin 2026 forward-watch, NGINX Rift, framework deltas (PCI 4.0.1 / HIPAA 2026 NPRM / EU AI Act ITS / DORA RTS).**
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-15T21:42:12.284Z",
3
+ "generated_at": "2026-05-15T22:38:59.213Z",
4
4
  "generator": "scripts/build-indexes.js",
5
- "source_count": 50,
5
+ "source_count": 51,
6
6
  "source_hashes": {
7
- "manifest.json": "f239465cd6c7d357bc185eef6457023de3433c8e9d07feb0008319915d142cd0",
8
- "data/atlas-ttps.json": "f3d3ecb459ef5fb0d2c8339cd37072e1367a08d5a2fdef3d92c892a4b52dab97",
7
+ "manifest.json": "9862095ee05729021d2dd51765c370ed24377e73c536b237817ef7ce4a7ba437",
8
+ "data/atlas-ttps.json": "db52a797f6ba7c9a61fd7b1225ebbc268ddf21abe29a106c4246c2ed2e617b86",
9
9
  "data/attack-techniques.json": "6b45448aa42cc6664376c93da73356624708e935c12589ee8c776a10215bce3a",
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": "8fb42b8a1503bda7d24bc48e34c5e26c425f5985767853ed1e1b8b3a5318369e",
15
+ "data/framework-control-gaps.json": "e87790cae8839dc5d73632d7d875d12cffa2ad741a9002ec7851e1ae04df54c4",
16
16
  "data/global-frameworks.json": "0168825497e03f079274c9da2e5529310a2ba5bd7c7da7c93acd0b66ed845b8a",
17
- "data/rfc-references.json": "e88c1517f0ffc45c27bc5805c01de87994b9e65b54071699b3d7cb5832b82c7a",
17
+ "data/rfc-references.json": "863f1ad7a36c020d11eb7bffea49ca1df89b10d43f3986118cdc5a5712308115",
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",
@@ -47,6 +47,7 @@
47
47
  "skills/sector-financial/skill.md": "eec3ce95f36a0f70532aac2f658ad6fb350233dd49c7d95da91144e6c4c4d16c",
48
48
  "skills/sector-federal-government/skill.md": "48c3c019502c8b758598331dbad8a9b121f8dd3dc6fc68bfaf506eba7e3843e5",
49
49
  "skills/sector-energy/skill.md": "875799aa2ad88744b646583fef0a3399abd42a979541dc99bf39825a5ef48ce9",
50
+ "skills/sector-telecom/skill.md": "3489410b0905cbf6b392ea7f7cde35ccd4b03de0d22d2d1b0c671e46d70962c9",
50
51
  "skills/api-security/skill.md": "302f7f6a071b856cc55a4cb5f0bc3f8566e31b5ebca58ca3bd78a91d4b6665ca",
51
52
  "skills/cloud-security/skill.md": "e0574c153aefbb0fc4581c78bc2d708ab7c49d6b5a45a985e51967b8ea740eb9",
52
53
  "skills/container-runtime-security/skill.md": "f06260f0c468d6a4f0409294899017edab45c98d71db1fedd7a630fe6a7bf53a",
@@ -55,35 +56,35 @@
55
56
  "skills/email-security-anti-phishing/skill.md": "b5a7693b3ddbd6cd83303d092bc5e324db431245d25c4945d9f65fcffa1995e7",
56
57
  "skills/age-gates-child-safety/skill.md": "c741d7dca9da0abb09bdebb8a02e803ce4ae9fb9a6904fb8df3ec19cae83917d"
57
58
  },
58
- "skill_count": 38,
59
+ "skill_count": 39,
59
60
  "catalog_count": 11,
60
61
  "index_stats": {
61
62
  "xref_entries": {
62
63
  "cwe_refs": 34,
63
64
  "d3fend_refs": 20,
64
- "framework_gaps": 49,
65
- "atlas_refs": 9,
66
- "attack_refs": 30,
67
- "rfc_refs": 19,
65
+ "framework_gaps": 58,
66
+ "atlas_refs": 10,
67
+ "attack_refs": 32,
68
+ "rfc_refs": 20,
68
69
  "dlp_refs": 0
69
70
  },
70
- "trigger_table_entries": 453,
71
+ "trigger_table_entries": 475,
71
72
  "chains_cve_entries": 27,
72
73
  "chains_cwe_entries": 55,
73
74
  "jurisdictions_indexed": 29,
74
- "handoff_dag_nodes": 38,
75
- "summary_cards": 38,
76
- "section_offsets_skills": 38,
77
- "token_budget_total_approx": 357564,
75
+ "handoff_dag_nodes": 39,
76
+ "summary_cards": 39,
77
+ "section_offsets_skills": 39,
78
+ "token_budget_total_approx": 362735,
78
79
  "recipes": 8,
79
80
  "jurisdiction_clocks": 29,
80
81
  "did_ladders": 8,
81
82
  "theater_fingerprints": 7,
82
83
  "currency_action_required": 0,
83
84
  "frequency_fields": 7,
84
- "activity_feed_events": 50,
85
+ "activity_feed_events": 51,
85
86
  "catalog_summaries": 11,
86
- "stale_content_findings": 1
87
+ "stale_content_findings": 3
87
88
  },
88
89
  "invalidation_note": "If any source file in source_hashes has a different SHA-256 than recorded here, the indexes are stale. Re-run `npm run build-indexes`."
89
90
  }
@@ -2,16 +2,23 @@
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": 50
5
+ "event_count": 51
6
6
  },
7
7
  "events": [
8
+ {
9
+ "date": "2026-05-15",
10
+ "type": "skill_review",
11
+ "artifact": "sector-telecom",
12
+ "path": "skills/sector-telecom/skill.md",
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
+ },
8
15
  {
9
16
  "date": "2026-05-15",
10
17
  "type": "catalog_update",
11
18
  "artifact": "data/atlas-ttps.json",
12
19
  "path": "data/atlas-ttps.json",
13
20
  "schema_version": "1.0.0",
14
- "entry_count": 29
21
+ "entry_count": 30
15
22
  },
16
23
  {
17
24
  "date": "2026-05-15",
@@ -35,7 +42,7 @@
35
42
  "artifact": "data/framework-control-gaps.json",
36
43
  "path": "data/framework-control-gaps.json",
37
44
  "schema_version": "1.0.0",
38
- "entry_count": 78
45
+ "entry_count": 87
39
46
  },
40
47
  {
41
48
  "date": "2026-05-15",
@@ -364,7 +371,7 @@
364
371
  "type": "manifest_review",
365
372
  "artifact": "manifest.json",
366
373
  "path": "manifest.json",
367
- "note": "manifest threat_review_date — 38 skills, 11 catalogs"
374
+ "note": "manifest threat_review_date — 39 skills, 11 catalogs"
368
375
  }
369
376
  ]
370
377
  }
@@ -18,13 +18,13 @@
18
18
  "rebuild_after_days": 365,
19
19
  "note": "Per-entry last_verified governs decay. Skills depending on this catalog must check entry freshness before high-stakes use."
20
20
  },
21
- "entry_count": 29,
21
+ "entry_count": 30,
22
22
  "sample_keys": [
23
23
  "AML.T0001",
24
+ "AML.T0040",
24
25
  "AML.T0010",
25
26
  "AML.T0016",
26
- "AML.T0017",
27
- "AML.T0018"
27
+ "AML.T0017"
28
28
  ]
29
29
  },
30
30
  "attack-techniques.json": {
@@ -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": 78,
175
+ "entry_count": 87,
176
176
  "sample_keys": [
177
177
  "ALL-AI-PIPELINE-INTEGRITY",
178
178
  "ALL-MCP-TOOL-TRUST",