@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 +82 -0
- package/bin/exceptd.js +73 -1
- package/data/_indexes/_meta.json +19 -18
- package/data/_indexes/activity-feed.json +11 -4
- package/data/_indexes/catalog-summaries.json +4 -4
- package/data/_indexes/chains.json +241 -6
- package/data/_indexes/currency.json +10 -1
- package/data/_indexes/frequency.json +170 -55
- package/data/_indexes/handoff-dag.json +4 -0
- package/data/_indexes/jurisdiction-map.json +23 -12
- package/data/_indexes/section-offsets.json +94 -0
- package/data/_indexes/stale-content.json +14 -2
- package/data/_indexes/summary-cards.json +54 -0
- package/data/_indexes/token-budget.json +58 -3
- package/data/_indexes/trigger-table.json +66 -0
- package/data/_indexes/xref.json +58 -8
- package/data/atlas-ttps.json +37 -0
- package/data/framework-control-gaps.json +162 -0
- package/data/rfc-references.json +2 -1
- package/lib/flag-suggest.js +4 -0
- package/lib/playbook-runner.js +117 -10
- package/manifest-snapshot.json +75 -2
- package/manifest-snapshot.sha256 +1 -1
- package/manifest.json +126 -40
- package/package.json +1 -1
- package/sbom.cdx.json +7 -7
- package/skills/sector-telecom/skill.md +259 -0
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
|
}
|
package/data/_indexes/_meta.json
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema_version": "1.1.0",
|
|
3
|
-
"generated_at": "2026-05-
|
|
3
|
+
"generated_at": "2026-05-15T22:38:59.213Z",
|
|
4
4
|
"generator": "scripts/build-indexes.js",
|
|
5
|
-
"source_count":
|
|
5
|
+
"source_count": 51,
|
|
6
6
|
"source_hashes": {
|
|
7
|
-
"manifest.json": "
|
|
8
|
-
"data/atlas-ttps.json": "
|
|
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": "
|
|
15
|
+
"data/framework-control-gaps.json": "e87790cae8839dc5d73632d7d875d12cffa2ad741a9002ec7851e1ae04df54c4",
|
|
16
16
|
"data/global-frameworks.json": "0168825497e03f079274c9da2e5529310a2ba5bd7c7da7c93acd0b66ed845b8a",
|
|
17
|
-
"data/rfc-references.json": "
|
|
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":
|
|
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":
|
|
65
|
-
"atlas_refs":
|
|
66
|
-
"attack_refs":
|
|
67
|
-
"rfc_refs":
|
|
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":
|
|
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":
|
|
75
|
-
"summary_cards":
|
|
76
|
-
"section_offsets_skills":
|
|
77
|
-
"token_budget_total_approx":
|
|
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":
|
|
85
|
+
"activity_feed_events": 51,
|
|
85
86
|
"catalog_summaries": 11,
|
|
86
|
-
"stale_content_findings":
|
|
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":
|
|
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":
|
|
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":
|
|
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 —
|
|
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":
|
|
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":
|
|
175
|
+
"entry_count": 87,
|
|
176
176
|
"sample_keys": [
|
|
177
177
|
"ALL-AI-PIPELINE-INTEGRITY",
|
|
178
178
|
"ALL-MCP-TOOL-TRUST",
|