@blamejs/exceptd-skills 0.19.27 → 0.19.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
@@ -1,6 +1,12 @@
1
1
  # exceptd Security — Development Standards
2
2
 
3
- > **This is the canonical development guide and the only project-rules file shipped in this repo.** It is AI-system-agnostic — internal citations throughout the repo all reference `AGENTS.md` (this file). The project does not ship per-vendor mirrors; tool users configure their tool to load `AGENTS.md`. Multiple tools auto-load `AGENTS.md` directly under the cross-vendor convention (OpenAI Codex CLI, Sourcegraph amp, Aider, Continue, Cline, Roo Code, Q Developer). Cursor (`.cursorrules`), GitHub Copilot (`.github/copilot-instructions.md`), and Windsurf (`.windsurfrules`) get small pointer stubs that reference this file. Claude Code / Gemini CLI / JetBrains AI / Replit Agent users should add `AGENTS.md` to their tool's context manually (Claude Code: `@AGENTS.md`, or symlink their own local `~/.claude/CLAUDE.md` to it).
3
+ > **This is the canonical development guide and the only project-rules file shipped in this repo.** It is AI-system-agnostic — internal citations throughout the repo all reference `AGENTS.md` (this file). The project does not ship per-vendor mirrors; tool users configure their tool to load `AGENTS.md`.
4
+
5
+ | How it loads | Tools | Mechanism |
6
+ |---|---|---|
7
+ | Automatically | OpenAI Codex CLI, Sourcegraph amp, Aider, Continue, Cline, Roo Code, Q Developer | auto-loads `AGENTS.md` directly under the cross-vendor convention |
8
+ | Via a pointer stub | Cursor (`.cursorrules`), GitHub Copilot (`.github/copilot-instructions.md`), Windsurf (`.windsurfrules`) | small pointer stub that references this file |
9
+ | Manually | Claude Code, Gemini CLI, JetBrains AI, Replit Agent | add `AGENTS.md` to the tool's context (Claude Code: `@AGENTS.md`, or symlink their own local `~/.claude/CLAUDE.md` to it) |
4
10
 
5
11
  Also read [CONTEXT.md](CONTEXT.md) for a complete orientation to the skill system.
6
12
 
@@ -41,7 +47,15 @@ Each rule below carries a **Forcing function** annotation declaring whether it i
41
47
  11. **No-MVP ban** — A half-implemented skill is worse than no skill. Every shipped skill has: complete frontmatter, all required body sections, real data deps populated, a compliance theater check, and a concrete output format. Partial skills are not merged — they are finished or removed.
42
48
  *Forcing function:* covered by `lib/lint-skills.js` (required-section list) plus Hard Rule #15 (diff coverage); predeploy gate.
43
49
 
44
- 12. **External data version pinning** — Every reference to external data (MITRE ATLAS, MITRE ATT&CK, NIST frameworks, CISA KEV, IETF RFCs and Internet-Drafts) must pin to a specific version. When a new version is released: (a) audit for breaking changes (renamed TTPs, tactic-split moves, replaced RFCs, deprecated controls), (b) bump `last_threat_review` in all affected skills, (c) update `_meta` version fields in the relevant `data/*.json` file, (d) update `last_verified` on affected `data/rfc-references.json` entries, (e) never silently inherit version changes. Frameworks lag RFCs; RFCs lag attacker innovation — skills must track lag at every layer.
50
+ 12. **External data version pinning** — Every reference to external data (MITRE ATLAS, MITRE ATT&CK, NIST frameworks, CISA KEV, IETF RFCs and Internet-Drafts) must pin to a specific version. When a new version is released:
51
+
52
+ (a) audit for breaking changes (renamed TTPs, tactic-split moves, replaced RFCs, deprecated controls),
53
+ (b) bump `last_threat_review` in all affected skills,
54
+ (c) update `_meta` version fields in the relevant `data/*.json` file,
55
+ (d) update `last_verified` on affected `data/rfc-references.json` entries,
56
+ (e) never silently inherit version changes.
57
+
58
+ Frameworks lag RFCs; RFCs lag attacker innovation — skills must track lag at every layer.
45
59
  *Forcing function:* `_meta` version fields are schema-required; reviewer-checked for cross-file version consistency.
46
60
 
47
61
  **Pinned ATLAS version: v2026.07 (released 2026-08-07), Secure AI v2 layer (May 2026). Audit cadence: monthly** (ATLAS now ships monthly per CTID; the Secure AI v2 layered set and per-technique maturity classification are tracked separately in `data/atlas-ttps.json` via the `secure_ai_v2_layer` and `maturity` fields).
@@ -107,7 +121,17 @@ exceptd ships investigation playbooks under `data/playbooks/*.json` (schema: `li
107
121
 
108
122
  ### Worked example (kernel playbook)
109
123
 
110
- Operator asks: "is this host vulnerable to Copy Fail?" AI invokes `node lib/playbook-runner.js data/playbooks/kernel.json`. **govern** returns NIS2 24h incident notification + DORA 4h major-ICT-incident notification obligations and preloads `kernel-lpe-triage`, `exploit-scoring`, `global-grc`; AI surfaces both deadlines to the operator. **direct** emits threat_context anchored on real 2026 kernel CVEs and rwep_threshold bands 90 (live-patch) / 70 (urgent) / 30 (scheduled). **look** directs the AI to capture `uname -r` and `/etc/os-release`; AI uses Bash to read both and submits `artifacts: { kernel_version: { value: "5.15.0-101-generic", captured: true }, os_release: { value: "Ubuntu 22.04.4 LTS", captured: true } }`. **detect** evaluates the `kver-in-affected-range` indicator; AI confirms 5.15.0 falls in the affected range and submits `signal_overrides: { 'kver-in-affected-range': 'hit' }` after running its false-positive checks; the playbook classifies the host as "detected". **analyze** matches three catalogued CVEs (including CVE-2026-31431, KEV-listed, RWEP 90), computes `blast_radius_score=3`, runs the theater check and returns `verdict=theater` (paper SI-2 compliance does not address sub-hour live-patch reality). **validate** selects remediation path `live-patch-deploy` (priority 1) over `kernel-upgrade` (priority 2), returns validation_tests and a residual_risk_statement. **close** emits a signed CSAF-2.0 evidence_package, draft NIS2 (24h from operator-confirmed detection time) and DORA (4h from same anchor) notification text, and a learning_loop lesson queued for `data/zeroday-lessons.json`. AI shows the operator both notification drafts and asks whether to persist the evidence_package — does not auto-send either.
124
+ Operator asks: "is this host vulnerable to Copy Fail?" AI invokes `node lib/playbook-runner.js data/playbooks/kernel.json`.
125
+
126
+ 1. **govern** returns NIS2 24h incident notification + DORA 4h major-ICT-incident notification obligations and preloads `kernel-lpe-triage`, `exploit-scoring`, `global-grc`; AI surfaces both deadlines to the operator.
127
+ 2. **direct** emits threat_context anchored on real 2026 kernel CVEs and rwep_threshold bands 90 (live-patch) / 70 (urgent) / 30 (scheduled).
128
+ 3. **look** directs the AI to capture `uname -r` and `/etc/os-release`; AI uses Bash to read both and submits `artifacts: { kernel_version: { value: "5.15.0-101-generic", captured: true }, os_release: { value: "Ubuntu 22.04.4 LTS", captured: true } }`.
129
+ 4. **detect** evaluates the `kver-in-affected-range` indicator; AI confirms 5.15.0 falls in the affected range and submits `signal_overrides: { 'kver-in-affected-range': 'hit' }` after running its false-positive checks; the playbook classifies the host as "detected".
130
+ 5. **analyze** matches three catalogued CVEs (including CVE-2026-31431, KEV-listed, RWEP 90), computes `blast_radius_score=3`, runs the theater check and returns `verdict=theater` (paper SI-2 compliance does not address sub-hour live-patch reality).
131
+ 6. **validate** selects remediation path `live-patch-deploy` (priority 1) over `kernel-upgrade` (priority 2), returns validation_tests and a residual_risk_statement.
132
+ 7. **close** emits a signed CSAF-2.0 evidence_package, draft NIS2 (24h from operator-confirmed detection time) and DORA (4h from same anchor) notification text, and a learning_loop lesson queued for `data/zeroday-lessons.json`.
133
+
134
+ AI shows the operator both notification drafts and asks whether to persist the evidence_package — does not auto-send either.
111
135
 
112
136
  ### CLI invocation
113
137
 
@@ -220,38 +244,38 @@ When a zero-day surfaces a control class no existing framework covers, the learn
220
244
 
221
245
  Recently added (use the IDs in skill prose and operator briefings; full text in `data/zeroday-lessons.json`):
222
246
 
223
- | ID | Name | Surfacing zero-day | Coverage gap closed |
224
- |---|---|---|---|
225
- | `NEW-CTRL-048` | NPM-MAINTAINER-MFA-ENFORCEMENT | `MAL-2026-NODE-IPC-STEALER` | NIST-800-218 SSDF, NIST-800-53 IA-5, NIS2 Art.21 supply-chain |
226
- | `NEW-CTRL-049` | LOCKFILE-INTEGRITY-VERIFIED-AT-CI-BOOT | `MAL-2026-NODE-IPC-STEALER` | NIST-800-218 SSDF, EU CRA Art.13, SLSA Build L3 |
227
- | `NEW-CTRL-141` | KERNEL-EXIT-RACE-CVE-CLASS-MONITORING | `CVE-2026-46333` | NIST-800-53 AU-2/SI-4 |
228
- | `NEW-CTRL-142` | SUID-MINIMIZATION-FOR-KERNEL-LPE-CARRIER-BINARIES | `CVE-2026-46333` | NIST-800-53 CM-6/AC-3 |
229
- | `NEW-CTRL-050` | AI-ASSISTANT-CONFIG-FILE-PERMISSION-LOCKDOWN | `MAL-2026-SHAI-HULUD-OSS` | NIST-800-53 AC-3/CM-6. Enforced operationally by `exceptd doctor --ai-config`. |
230
- | `NEW-CTRL-051` | NPM-PUBLISH-TOKEN-WORKSTATION-ISOLATION | `MAL-2026-SHAI-HULUD-OSS` | NIST-800-53 IA-5, NIST-800-218 SSDF PW.4 |
231
- | `NEW-CTRL-052` | GITHUB-REPO-PATTERN-MONITORING-FOR-EXFIL-CHANNELS | `MAL-2026-SHAI-HULUD-OSS` | NIST-800-53 SI-4. Enforced operationally by `exceptd watchlist --org-scan`. |
232
- | `NEW-CTRL-053` | MCP-SERVER-CONFIG-ALLOWLIST | `CVE-2026-30623` (Anthropic MCP SDK stdio injection) | NIST AI RMF MEASURE 2.7, OWASP LLM Top 10 2025 LLM05 |
233
- | `NEW-CTRL-054` | BACKUP-TIER-NETWORK-ISOLATION | `CVE-2025-59389` (QNAP Hyper Data Protector preauth RCE) | ISO-27001-2022 A.8.13, NIS2 Art.21 business-continuity |
234
- | `NEW-CTRL-055` | SECURITY-TOOL-INTEGRITY-VERIFICATION | `CVE-2025-11837` (QNAP Malware Remover code-injection) | NIST-800-53 SI-3, ISO-27001-2022 A.8.7, PCI-DSS 4.0 §5.1 |
235
- | `NEW-CTRL-056` | MOBILE-ENDPOINT-MDM-ENFORCED-KEV-SLA | `CVE-2025-14174` / `CVE-2025-43529` / `CVE-2025-24201` / `CVE-2025-43300` | NIST-800-53 SI-2, ISO-27001-2022 A.8.8, CIS Benchmarks mobile-OS profiles |
236
- | `NEW-CTRL-057` | BROWSER-MANAGED-UPDATE-NO-DEFERRAL | `CVE-2025-10585` / `CVE-2025-14174` / `CVE-2025-43529` / `CVE-2025-4919` | NIST-800-53 SI-2, CISA KEV SLA, vendor-channel security-release contracts |
237
- | `NEW-CTRL-058` | CLOUD-CONTROL-PLANE-CROSS-TENANT-CLAIM-VALIDATION | `CVE-2025-55241` (Entra ID Actor-token impersonation) | NIST-800-53 AC-2/AU-2/AC-16, ISO-27001-2022 A.5.16, CIS Cloud Foundations |
238
- | `NEW-CTRL-059` | SENSITIVE-DATA-IN-LOGS-LINT | `CVE-2025-21085` (Cisco Duo credential leakage) | NIST-800-53 AU-9/SI-12, ISO-27001-2022 A.8.15, PCI-DSS 4.0 §10.5 |
239
- | `NEW-CTRL-060` | DATABASE-SERVER-SIDE-SCRIPTING-DEFAULT-DENY | `CVE-2025-49844` (Redis RediShell Lua UAF) | NIST-800-53 CM-6/CM-7, ISO-27001-2022 A.8.9, vendor secure-baseline profiles |
240
- | `NEW-CTRL-061` | IN-MEMORY-DATASTORE-MEMORY-DISCLOSURE-NETWORK-EXPOSURE-AUDIT | `CVE-2025-14847` (MongoBleed) | NIST-800-53 SC-7/SC-28, PCI-DSS 4.0 §1.4, ISO-27001-2022 A.8.20 |
241
- | `NEW-CTRL-062` | HTTP2-STREAM-RESET-ACCOUNTING | `CVE-2025-8671` (MadeYouReset) | NIST-800-53 SC-5, ISO-27001-2022 A.8.6, vendor HTTP/2 secure-default profiles |
242
- | `NEW-CTRL-063` | MULTIMODAL-INFERENCE-INPUT-DECODER-ISOLATION | `CVE-2026-22778` (vLLM heap-overflow RCE) | NIST AI RMF MANAGE 4.1, NIST-800-53 SC-39, OWASP LLM Top 10 2025 LLM10 |
243
- | `NEW-CTRL-064` | LLM-OUTPUT-DESERIALIZATION-TRUST-ZONE | `CVE-2025-68664` (LangChain LangGrinch) | NIST AI RMF MEASURE 2.7, OWASP LLM Top 10 2025 LLM03/LLM08, NIST-800-53 SI-10 |
244
- | `NEW-CTRL-065` | AI-MODEL-SERVER-DEFAULT-AUTHENTICATION | `CVE-2026-7482` (Ollama Bleeding Llama) | NIST-800-53 IA-2/AC-3, ISO-27001-2022 A.8.5, NIST AI RMF GOVERN 5.1 |
245
- | `NEW-CTRL-066` | AGENTIC-IDE-HOST-EXECUTION-SANDBOX | `CVE-2025-55319` (VSCode agentic-AI command-injection) | NIST AI RMF MANAGE 4.1, ISO/IEC 42001 §6.1.4, NIST-800-53 SC-39 |
246
- | `NEW-CTRL-067` | AI-PLATFORM-CONTROL-PLANE-RBAC-OVERLAY-AUDIT | `CVE-2025-10725` (OpenShift AI privilege escalation) | NIST-800-53 AC-2/AC-6, CIS Kubernetes Benchmark §5, NIST AI RMF GOVERN 1.5 |
247
- | `NEW-CTRL-068` | HYPERVISOR-VM-ESCAPE-TENANCY-ASSUMPTION | `CVE-2025-22224` / `CVE-2025-22225` / `CVE-2025-22226` (VMSA-2025-0004 ESXi chain) | NIST-800-53 SC-7/SI-2, ISO-27001-2022 A.8.20, CIS VMware ESXi Benchmark |
248
- | `NEW-CTRL-069` | ECOSYSTEM-PACKAGE-TEMPORAL-TRUST-DRIFT-DETECTION | `MAL-2026-RUBYGEMS-BUFFERZONECORP-SLEEPER` | NIST-800-218 SSDF PW.4, EU CRA Annex I §1(2)(b), SLSA Build L3 |
249
- | `NEW-CTRL-070` | TYPOSQUAT-INSTALL-TIME-NAME-CONFUSION-GUARD | `MAL-2025-PYPI-COLORAMA-SOLANA-STEALER` | NIST-800-218 SSDF PW.4, NIST-800-53 SI-7, EU CRA Annex I §1(2)(c) |
250
- | `NEW-CTRL-071` | AI-DISCOVERY-CREDIT-IN-COMPLIANCE-EVIDENCE | `MAL-2025-AI-FOUND-FFMPEG-BIGSLEEP` + `CVE-2025-6965` + `CVE-2025-0133` + ZeroPath quartet | NIST AI RMF MEASURE 2.7, ISO/IEC 42001 §6.1.4 (records of AI use), EU AI Act Art.12 (record-keeping) |
251
- | `NEW-CTRL-072` | PRIMARY-SOURCE-INTAKE-VENDOR-BLOG-COVERAGE | `CVE-2026-31635` (DirtyDecrypt) | NIST-800-53 SI-5 (security alerts / advisories), ISO-27001-2022 A.5.7 (threat intelligence), CIS Controls v8 7.1 |
252
- | `NEW-CTRL-073` | RESEARCHER-HANDLE-ACTIVITY-TRACKER | `CVE-2020-17103-REREGRESSION-2026` (MiniPlasma) + Nightmare-Eclipse cluster | NIST-800-53 SI-5, ISO-27001-2022 A.5.7, CIS Controls v8 7.1. Enforced operationally by `lib/source-advisories.js#FEEDS[nightmare-eclipse-gitlab]` (gitlab-activity kind). |
253
- | `NEW-CTRL-074` | CVE-REGRESSION-WATCHER | `CVE-2020-17103-REREGRESSION-2026` (MiniPlasma) | NIST-800-53 CM-3 (configuration-change control), NIST-800-53 SI-2, ISO-27001-2022 A.8.8 (vulnerability management). Enforced operationally by `lib/cve-regression-watcher.js` — surfaces historical-CVE references in poller diffs as candidate silent-regression cases. |
254
- | `NEW-CTRL-075` | AV-AGENT-CURRENCY-CROSS-VERIFICATION | `BUG-2026-NIGHTMARE-ECLIPSE-UNDEFEND` (UnDefend) | NIST-800-53 SI-3 + SI-4, ISO-27001-2022 A.8.7. Independent control-plane cross-check (Defender for Endpoint cloud telemetry / Intune compliance / SCCM inventory) for AV / EDR signature + platform currency; alert on drift > 7 days. |
247
+ | ID | Name | Surfacing zero-day | Coverage gap closed | Enforced operationally by |
248
+ |---|---|---|---|---|
249
+ | `NEW-CTRL-048` | NPM-MAINTAINER-MFA-ENFORCEMENT | `MAL-2026-NODE-IPC-STEALER` | NIST-800-218 SSDF, NIST-800-53 IA-5, NIS2 Art.21 supply-chain | |
250
+ | `NEW-CTRL-049` | LOCKFILE-INTEGRITY-VERIFIED-AT-CI-BOOT | `MAL-2026-NODE-IPC-STEALER` | NIST-800-218 SSDF, EU CRA Art.13, SLSA Build L3 | |
251
+ | `NEW-CTRL-050` | AI-ASSISTANT-CONFIG-FILE-PERMISSION-LOCKDOWN | `MAL-2026-SHAI-HULUD-OSS` | NIST-800-53 AC-3/CM-6. | Enforced operationally by `exceptd doctor --ai-config`. |
252
+ | `NEW-CTRL-051` | NPM-PUBLISH-TOKEN-WORKSTATION-ISOLATION | `MAL-2026-SHAI-HULUD-OSS` | NIST-800-53 IA-5, NIST-800-218 SSDF PW.4 | |
253
+ | `NEW-CTRL-052` | GITHUB-REPO-PATTERN-MONITORING-FOR-EXFIL-CHANNELS | `MAL-2026-SHAI-HULUD-OSS` | NIST-800-53 SI-4. | Enforced operationally by `exceptd watchlist --org-scan`. |
254
+ | `NEW-CTRL-053` | MCP-SERVER-CONFIG-ALLOWLIST | `CVE-2026-30623` (Anthropic MCP SDK stdio injection) | NIST AI RMF MEASURE 2.7, OWASP LLM Top 10 2025 LLM05 | |
255
+ | `NEW-CTRL-054` | BACKUP-TIER-NETWORK-ISOLATION | `CVE-2025-59389` (QNAP Hyper Data Protector preauth RCE) | ISO-27001-2022 A.8.13, NIS2 Art.21 business-continuity | |
256
+ | `NEW-CTRL-055` | SECURITY-TOOL-INTEGRITY-VERIFICATION | `CVE-2025-11837` (QNAP Malware Remover code-injection) | NIST-800-53 SI-3, ISO-27001-2022 A.8.7, PCI-DSS 4.0 §5.1 | |
257
+ | `NEW-CTRL-056` | MOBILE-ENDPOINT-MDM-ENFORCED-KEV-SLA | `CVE-2025-14174` / `CVE-2025-43529` / `CVE-2025-24201` / `CVE-2025-43300` | NIST-800-53 SI-2, ISO-27001-2022 A.8.8, CIS Benchmarks mobile-OS profiles | |
258
+ | `NEW-CTRL-057` | BROWSER-MANAGED-UPDATE-NO-DEFERRAL | `CVE-2025-10585` / `CVE-2025-14174` / `CVE-2025-43529` / `CVE-2025-4919` | NIST-800-53 SI-2, CISA KEV SLA, vendor-channel security-release contracts | |
259
+ | `NEW-CTRL-058` | CLOUD-CONTROL-PLANE-CROSS-TENANT-CLAIM-VALIDATION | `CVE-2025-55241` (Entra ID Actor-token impersonation) | NIST-800-53 AC-2/AU-2/AC-16, ISO-27001-2022 A.5.16, CIS Cloud Foundations | |
260
+ | `NEW-CTRL-059` | SENSITIVE-DATA-IN-LOGS-LINT | `CVE-2025-21085` (Cisco Duo credential leakage) | NIST-800-53 AU-9/SI-12, ISO-27001-2022 A.8.15, PCI-DSS 4.0 §10.5 | |
261
+ | `NEW-CTRL-060` | DATABASE-SERVER-SIDE-SCRIPTING-DEFAULT-DENY | `CVE-2025-49844` (Redis RediShell Lua UAF) | NIST-800-53 CM-6/CM-7, ISO-27001-2022 A.8.9, vendor secure-baseline profiles | |
262
+ | `NEW-CTRL-061` | IN-MEMORY-DATASTORE-MEMORY-DISCLOSURE-NETWORK-EXPOSURE-AUDIT | `CVE-2025-14847` (MongoBleed) | NIST-800-53 SC-7/SC-28, PCI-DSS 4.0 §1.4, ISO-27001-2022 A.8.20 | |
263
+ | `NEW-CTRL-062` | HTTP2-STREAM-RESET-ACCOUNTING | `CVE-2025-8671` (MadeYouReset) | NIST-800-53 SC-5, ISO-27001-2022 A.8.6, vendor HTTP/2 secure-default profiles | |
264
+ | `NEW-CTRL-063` | MULTIMODAL-INFERENCE-INPUT-DECODER-ISOLATION | `CVE-2026-22778` (vLLM heap-overflow RCE) | NIST AI RMF MANAGE 4.1, NIST-800-53 SC-39, OWASP LLM Top 10 2025 LLM10 | |
265
+ | `NEW-CTRL-064` | LLM-OUTPUT-DESERIALIZATION-TRUST-ZONE | `CVE-2025-68664` (LangChain LangGrinch) | NIST AI RMF MEASURE 2.7, OWASP LLM Top 10 2025 LLM03/LLM08, NIST-800-53 SI-10 | |
266
+ | `NEW-CTRL-065` | AI-MODEL-SERVER-DEFAULT-AUTHENTICATION | `CVE-2026-7482` (Ollama Bleeding Llama) | NIST-800-53 IA-2/AC-3, ISO-27001-2022 A.8.5, NIST AI RMF GOVERN 5.1 | |
267
+ | `NEW-CTRL-066` | AGENTIC-IDE-HOST-EXECUTION-SANDBOX | `CVE-2025-55319` (VSCode agentic-AI command-injection) | NIST AI RMF MANAGE 4.1, ISO/IEC 42001 §6.1.4, NIST-800-53 SC-39 | |
268
+ | `NEW-CTRL-067` | AI-PLATFORM-CONTROL-PLANE-RBAC-OVERLAY-AUDIT | `CVE-2025-10725` (OpenShift AI privilege escalation) | NIST-800-53 AC-2/AC-6, CIS Kubernetes Benchmark §5, NIST AI RMF GOVERN 1.5 | |
269
+ | `NEW-CTRL-068` | HYPERVISOR-VM-ESCAPE-TENANCY-ASSUMPTION | `CVE-2025-22224` / `CVE-2025-22225` / `CVE-2025-22226` (VMSA-2025-0004 ESXi chain) | NIST-800-53 SC-7/SI-2, ISO-27001-2022 A.8.20, CIS VMware ESXi Benchmark | |
270
+ | `NEW-CTRL-069` | ECOSYSTEM-PACKAGE-TEMPORAL-TRUST-DRIFT-DETECTION | `MAL-2026-RUBYGEMS-BUFFERZONECORP-SLEEPER` | NIST-800-218 SSDF PW.4, EU CRA Annex I §1(2)(b), SLSA Build L3 | |
271
+ | `NEW-CTRL-070` | TYPOSQUAT-INSTALL-TIME-NAME-CONFUSION-GUARD | `MAL-2025-PYPI-COLORAMA-SOLANA-STEALER` | NIST-800-218 SSDF PW.4, NIST-800-53 SI-7, EU CRA Annex I §1(2)(c) | |
272
+ | `NEW-CTRL-071` | AI-DISCOVERY-CREDIT-IN-COMPLIANCE-EVIDENCE | `MAL-2025-AI-FOUND-FFMPEG-BIGSLEEP` + `CVE-2025-6965` + `CVE-2025-0133` + ZeroPath quartet | NIST AI RMF MEASURE 2.7, ISO/IEC 42001 §6.1.4 (records of AI use), EU AI Act Art.12 (record-keeping) | |
273
+ | `NEW-CTRL-072` | PRIMARY-SOURCE-INTAKE-VENDOR-BLOG-COVERAGE | `CVE-2026-31635` (DirtyDecrypt) | NIST-800-53 SI-5 (security alerts / advisories), ISO-27001-2022 A.5.7 (threat intelligence), CIS Controls v8 7.1 | |
274
+ | `NEW-CTRL-073` | RESEARCHER-HANDLE-ACTIVITY-TRACKER | `CVE-2020-17103-REREGRESSION-2026` (MiniPlasma) + Nightmare-Eclipse cluster | NIST-800-53 SI-5, ISO-27001-2022 A.5.7, CIS Controls v8 7.1. | Enforced operationally by `lib/source-advisories.js#FEEDS[nightmare-eclipse-gitlab]` (gitlab-activity kind). |
275
+ | `NEW-CTRL-074` | CVE-REGRESSION-WATCHER | `CVE-2020-17103-REREGRESSION-2026` (MiniPlasma) | NIST-800-53 CM-3 (configuration-change control), NIST-800-53 SI-2, ISO-27001-2022 A.8.8 (vulnerability management). | Enforced operationally by `lib/cve-regression-watcher.js` — surfaces historical-CVE references in poller diffs as candidate silent-regression cases. |
276
+ | `NEW-CTRL-075` | AV-AGENT-CURRENCY-CROSS-VERIFICATION | `BUG-2026-NIGHTMARE-ECLIPSE-UNDEFEND` (UnDefend) | NIST-800-53 SI-3 + SI-4, ISO-27001-2022 A.8.7. | Independent control-plane cross-check (Defender for Endpoint cloud telemetry / Intune compliance / SCCM inventory) for AV / EDR signature + platform currency; alert on drift > 7 days. |
277
+ | `NEW-CTRL-141` | KERNEL-EXIT-RACE-CVE-CLASS-MONITORING | `CVE-2026-46333` | NIST-800-53 AU-2/SI-4 | |
278
+ | `NEW-CTRL-142` | SUID-MINIMIZATION-FOR-KERNEL-LPE-CARRIER-BINARIES | `CVE-2026-46333` | NIST-800-53 CM-6/AC-3 | |
255
279
 
256
280
  When you cite a `NEW-CTRL-*` ID in a skill body, the lint reads the upstream `zeroday-lessons.json` entry as the authoritative source for the requirement text — do not paraphrase the description in the skill body; link to the ID instead.
257
281
 
@@ -404,6 +428,8 @@ A new playbook **should not** ship a collector when:
404
428
 
405
429
  When in doubt, ship the playbook without a collector and open the gap as a follow-up.
406
430
 
431
+ ---
432
+
407
433
  ## Pre-Ship Checklist
408
434
 
409
435
  - [ ] All new CVEs have complete `data/cve-catalog.json` entries
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.19.28 — 2026-08-16
4
+
5
+ The project-rules file opens with a table instead of a seven-sentence paragraph. Which assistants load `AGENTS.md` on their own, which take a pointer stub, and which need it added by hand was written as running prose, so the reader had to parse three categories out of one block to find their own tool. The rows carry the same tool names and config paths as before.
6
+
7
+ Two more places in that file put a procedure where a reader can follow it. The external-data pinning rule listed its five steps inside a paragraph, which is the one rule in the file that has to be executed in order; the steps are now a list. The seven-phase worked example ran all seven phases together in a single block directly below a numbered list of those same phases; it is now seven numbered blocks, in the same order, with every artifact literal unchanged.
8
+
9
+ The control-requirements table sorts by its own key again — two rows sat out of sequence, so looking up an ID meant scanning past them. It also gained a column: five rows were appending how the requirement is enforced in this codebase to a column headed "Coverage gap closed", which promises framework references. The enforcement notes moved to a column of their own, and rows without one are blank rather than filled in.
10
+
11
+ `SECURITY.md` answers a reporter's first two questions first. Supported versions sat four sections below the reporting address, under the threat model; it now follows the response targets directly. The bug-report template no longer interrupts its general path with a threat-intelligence block a filer with an ordinary CLI bug cannot answer — that section moved to the end, next to the free-text prompts.
12
+
13
+ Comments that shipped in the tarball named internal work cycles — "Cycle 20 A P1", "cycle 15 security F2", "the cycle 20 audit B flagged" — which identify nothing a reader can look up. They describe why the current code is the way it is instead. One comment pointed at a test file under the wrong name, so anyone checking whether the manifest cache is guarded against drift would have found no such file and concluded it was unguarded; it names the real test, and says which fields that test does and does not cover.
14
+
3
15
  ## 0.19.27 — 2026-08-15
4
16
 
5
17
  `docs/REPO-SETTINGS.md` describes the repository it is applied to. It is the recovery path for the branch protection, tag protection and Actions allowlist, and it had drifted from all three, so re-applying it would have changed the repository rather than restored it.
package/CONTEXT.md CHANGED
@@ -232,7 +232,7 @@ The `researcher` **skill** (front-door dispatcher) and `threat-researcher` **age
232
232
  - Individual skill files — 15–40 KB each; load on match, not preemptively
233
233
  - Playbook JSON — load on demand via `exceptd brief <playbook>` (or `--phase look` for just the artifact spec); the engine handles phase orchestration
234
234
 
235
- ### What This Repo Does Not Contain
235
+ ### What This Repository Does Not Contain
236
236
 
237
237
  - No code that executes automatically in your environment
238
238
  - No outbound network calls; all data is local and static (the watchlist surface is read-only)
package/SECURITY.md CHANGED
@@ -25,6 +25,12 @@ Include:
25
25
  | Medium (incorrect framework gap mapping, wrong control ID) | 7d | 14d | 30d |
26
26
  | Low (missing data, incomplete entries) | 14d | 30d | next minor |
27
27
 
28
+ ## Supported Versions
29
+
30
+ Pre-1.0: Latest patch on the most recent minor receives data updates (CVE catalog, framework gap updates, new ATLAS TTPs). All versions receive critical accuracy corrections.
31
+
32
+ Once 1.0: 18-month data update support after each major version.
33
+
28
34
  ## Threat Model
29
35
 
30
36
  ### What This Repo Defends
@@ -54,12 +60,6 @@ CVE catalog entries and RWEP scores are not authoritative sources — they are a
54
60
 
55
61
  For critical security decisions, verify CISA KEV status directly. RWEP scores are a prioritization heuristic, not a compliance instrument.
56
62
 
57
- ## Supported Versions
58
-
59
- Pre-1.0: Latest patch on the most recent minor receives data updates (CVE catalog, framework gap updates, new ATLAS TTPs). All versions receive critical accuracy corrections.
60
-
61
- Once 1.0: 18-month data update support after each major version.
62
-
63
63
  ## Supply Chain
64
64
 
65
65
  This repository has no npm runtime dependencies. The library code in `lib/` is self-contained. Skills and data files are plain text/JSON.
package/bin/exceptd.js CHANGED
@@ -735,8 +735,10 @@ function main() {
735
735
  // piping through `jq` get one consistent shape across the CLI surface.
736
736
  // emitError() sets exitCode + returns rather than calling process.exit()
737
737
  // so the stderr JSON drains before teardown; promote the exit code to
738
- // UNKNOWN_COMMAND (10) afterwards. Cycle 9 split this away from
739
- // DETECTED_ESCALATE (2) — the two semantics had collided since v0.12.24.
738
+ // UNKNOWN_COMMAND (10) afterwards. This code is deliberately distinct
739
+ // from DETECTED_ESCALATE (2): an unknown verb and a detected finding are
740
+ // different outcomes, and sharing one code made them indistinguishable to
741
+ // a caller branching on the exit status.
740
742
  //
741
743
  // add a did-you-mean suggestion when the
742
744
  // unknown verb is within Levenshtein-1 of a real verb (catches the
@@ -1041,8 +1043,8 @@ function readEvidence(evidenceFlag, opts = {}) {
1041
1043
  // operator accidentally passing a multi-gigabyte file (binary, log, or
1042
1044
  // adversarial JSON bomb). 32 MB is well beyond any legitimate
1043
1045
  // submission and still drains in a single read on modern hardware.
1044
- // v0.12.35 (cycle 15 security F1): apply the SAME cap to the stdin
1045
- // branch. Pre-fix `--evidence -` was uncapped — an attacker piping
1046
+ // The SAME cap applies to the stdin branch. Previously `--evidence -`
1047
+ // was uncapped — an attacker piping
1046
1048
  // multi-GB JSON would OOM the runner. Read in 1 MB chunks and bail
1047
1049
  // at the limit rather than letting Node grow the heap unbounded.
1048
1050
  const MAX_EVIDENCE_BYTES = 32 * 1024 * 1024;
@@ -5673,8 +5675,9 @@ function cmdReattest(runner, args, runOpts, pretty) {
5673
5675
  const suffix = i === 0 ? "" : "-" + crypto.randomBytes(3).toString("hex");
5674
5676
  const candidate = path.join(dir, replayBaseName + suffix + ".json");
5675
5677
  try {
5676
- // v0.12.38 cycle 18 P1 F2: mode 0o600 + Windows ACL hardening
5677
- // (matches the primary attestation write site).
5678
+ // mode 0o600 + Windows ACL hardening, matching the primary
5679
+ // attestation write site — a replay file carries the same evidence
5680
+ // and must not be readable by other local accounts.
5678
5681
  fs.writeFileSync(candidate, JSON.stringify(replayBody, null, 2), { flag: "wx", mode: 0o600 });
5679
5682
  try {
5680
5683
  const { restrictWindowsAcl } = require(path.join(PKG_ROOT, "lib", "sign.js"));
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "schema_version": "1.1.0",
3
- "generated_at": "2026-08-16T02:12:57.741Z",
3
+ "generated_at": "2026-08-16T21:15:09.987Z",
4
4
  "generator": "scripts/build-indexes.js",
5
5
  "source_count": 64,
6
6
  "source_hashes": {
7
- "manifest.json": "1d3ee52ad114109f62c1c376711f1e90195fde813ae038e7f11b8cd87eba3807",
7
+ "manifest.json": "aaa50886a66d39bf792a0bbdc6dc8556040b1249b859294e5690121a5d23c89b",
8
8
  "README.md": "a757b8ed9923b7954518d00a768d338800460c9a90811094f050710fe9888615",
9
9
  "data/atlas-ttps.json": "a14089671efcb4f06dd0f82d688fe49276c1370e167e4483d76e9c0a40ef41eb",
10
10
  "data/attack-techniques.json": "81344e19dc49470631026a4a82c87ac17f5c2b6bdfd229e7bb5a7b0681e6fe3d",
@@ -254,7 +254,7 @@ function gapReport(frameworkIds, threatScenario, controlGaps, cveCatalog = {}, o
254
254
  scopedGaps = relevantGaps.filter(([key]) => seen.has(key));
255
255
  }
256
256
 
257
- // Cycle 20 A P1 (v0.12.40): pre-fix this filtered on `theater_pattern`
257
+ // Previously this filtered on `theater_pattern`
258
258
  // (a legacy field) but the v0.12.29 backfill added a structured
259
259
  // `theater_test` block on all 118 entries while leaving most without
260
260
  // `theater_pattern`. Result: the per-entry badge (line 188 above)
@@ -3393,7 +3393,7 @@ function buildEvidenceBundle(format, playbook, analyze, validate, agentSignals,
3393
3393
  }
3394
3394
  return stmt;
3395
3395
  });
3396
- // Cycle 9 C1: OpenVEX `author` identifies the entity attesting to the
3396
+ // OpenVEX `author` identifies the entity attesting to the
3397
3397
  // disposition — for an operator-run scan that is the operator, not the
3398
3398
  // tool vendor. Mirror the CSAF publisher.namespace fallback ladder so a
3399
3399
  // downstream supply-chain consumer keying on `author` resolves to the
@@ -3664,7 +3664,7 @@ function normalizeSubmission(submission, playbook) {
3664
3664
  // Carry over precondition_checks if the operator supplied them at the top
3665
3665
  // level even in the flat shape.
3666
3666
  //
3667
- // v0.12.35 (cycle 15 security F2): the prior `Object.assign(out.precondition_checks,
3667
+ // The prior `Object.assign(out.precondition_checks,
3668
3668
  // submission.precondition_checks)` form re-invoked the `__proto__` setter when
3669
3669
  // the operator submitted JSON containing a `__proto__` key. JSON.parse keeps
3670
3670
  // `__proto__` as an own data property (CreateDataProperty), but Object.assign
package/manifest.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "exceptd-security",
3
- "version": "0.19.27",
3
+ "version": "0.19.28",
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",
@@ -57,7 +57,7 @@
57
57
  ],
58
58
  "last_threat_review": "2026-05-15",
59
59
  "signature": "0H+JfyUVmo/pVFEi5rLENATHjlukPVUqnOWmNPEH77wm8svKGK0aNJ46k6QU5GdHb8c9X9pVJKiuhON6AxDjDw==",
60
- "signed_at": "2026-08-16T02:12:56.836Z",
60
+ "signed_at": "2026-08-16T21:15:08.869Z",
61
61
  "cwe_refs": [
62
62
  "CWE-125",
63
63
  "CWE-362",
@@ -133,7 +133,7 @@
133
133
  ],
134
134
  "last_threat_review": "2026-06-10",
135
135
  "signature": "hnKY1LYEKUurrzJIFcvwCZpclpk/XT8fMVJeCKqzrpOpfgov2d3AciuiEky85PhREzAmYGFfk2sLRC6ayJ6UDw==",
136
- "signed_at": "2026-08-16T02:12:56.837Z",
136
+ "signed_at": "2026-08-16T21:15:08.870Z",
137
137
  "cwe_refs": [
138
138
  "CWE-1039",
139
139
  "CWE-1426",
@@ -215,7 +215,7 @@
215
215
  ],
216
216
  "last_threat_review": "2026-06-10",
217
217
  "signature": "uiJt3Oj0lSLr7Nm0OoM2qI/z/oAIAiPwMfP12s97jVYeA7xfOlU21fc7zidT/9YulunfaSjBSAlgv6paWmosBg==",
218
- "signed_at": "2026-08-16T02:12:56.838Z",
218
+ "signed_at": "2026-08-16T21:15:08.871Z",
219
219
  "cwe_refs": [
220
220
  "CWE-22",
221
221
  "CWE-345",
@@ -269,7 +269,7 @@
269
269
  "framework_gaps": [],
270
270
  "last_threat_review": "2026-06-10",
271
271
  "signature": "80LN540R3z/gcIMCF/8H6nh2V6xdudctYKE74Ve7bqecyPUQf2NfCA/8T9L18tIz7BTyBkiI/V5JcG4ClgNyCQ==",
272
- "signed_at": "2026-08-16T02:12:56.838Z"
272
+ "signed_at": "2026-08-16T21:15:08.871Z"
273
273
  },
274
274
  {
275
275
  "name": "compliance-theater",
@@ -301,7 +301,7 @@
301
301
  ],
302
302
  "last_threat_review": "2026-06-10",
303
303
  "signature": "Tsat4OgtCJ6yGJQeIQnz+XTU11B8SLgbPe1zmb2UFOzxqlBnRoKeOzIVwFsv7wM0mP1bXQvQgFFpIOxN2VeTCQ==",
304
- "signed_at": "2026-08-16T02:12:56.838Z"
304
+ "signed_at": "2026-08-16T21:15:08.872Z"
305
305
  },
306
306
  {
307
307
  "name": "exploit-scoring",
@@ -332,7 +332,7 @@
332
332
  ],
333
333
  "last_threat_review": "2026-06-10",
334
334
  "signature": "zxsj3SExhBJ+A7UDZEI4uWl4OCbnn5+ddCRCalhlHKFyRML9fcB9qd1v9a+hDoeVJXGr/OBXHR3MdyD8XEhrDQ==",
335
- "signed_at": "2026-08-16T02:12:56.839Z"
335
+ "signed_at": "2026-08-16T21:15:08.872Z"
336
336
  },
337
337
  {
338
338
  "name": "rag-pipeline-security",
@@ -374,7 +374,7 @@
374
374
  ],
375
375
  "last_threat_review": "2026-06-10",
376
376
  "signature": "lrj8/nJWYzgeOYPF9Ax59A0mxCXWKKhH9QI+88KQNiKly0Hq+pA5wdtL0J9LY24YrVWmqEhpSHueGlj03UNOAA==",
377
- "signed_at": "2026-08-16T02:12:56.839Z",
377
+ "signed_at": "2026-08-16T21:15:08.872Z",
378
378
  "cwe_refs": [
379
379
  "CWE-1395",
380
380
  "CWE-1426"
@@ -441,7 +441,7 @@
441
441
  ],
442
442
  "last_threat_review": "2026-06-10",
443
443
  "signature": "nqqZUnu7ZocLNJKs3KJO6NnoC8MgmS1iGP9TGrv51e+trjqb4Gf2mAjCTe7pINFivWDK00A0ZHazaMAKKbaNCA==",
444
- "signed_at": "2026-08-16T02:12:56.839Z",
444
+ "signed_at": "2026-08-16T21:15:08.873Z",
445
445
  "cwe_refs": [
446
446
  "CWE-918"
447
447
  ],
@@ -482,7 +482,7 @@
482
482
  "framework_gaps": [],
483
483
  "last_threat_review": "2026-06-10",
484
484
  "signature": "ZfFXIDjwGDwlZA30TOMPmNr0IK/sydbsiox7LYU0pGkaRlQW18/oSjkHZRgiQpP5yzQhuFsKdztA7Ec6BDQLAA==",
485
- "signed_at": "2026-08-16T02:12:56.840Z",
485
+ "signed_at": "2026-08-16T21:15:08.873Z",
486
486
  "cwe_refs": [
487
487
  "CWE-1188"
488
488
  ],
@@ -517,7 +517,7 @@
517
517
  "framework_gaps": [],
518
518
  "last_threat_review": "2026-06-10",
519
519
  "signature": "CtiEhtzaqg/hCGX1wmgEGq0O6o+UNf9RAM3xxn0rQVEkFt/IEmyYqsWd1qjpqMdp8kbEXgAsd816AwFwLYMaAA==",
520
- "signed_at": "2026-08-16T02:12:56.840Z",
520
+ "signed_at": "2026-08-16T21:15:08.874Z",
521
521
  "forward_watch": [
522
522
  "New AI attack classes as ATLAS v6 publishes",
523
523
  "Post-quantum adversary capability timeline",
@@ -558,7 +558,7 @@
558
558
  "framework_gaps": [],
559
559
  "last_threat_review": "2026-08-05",
560
560
  "signature": "Eu2AnT4xyZH9n3OKjm5S9vaiHqUE+1N3oLAQbbt78OCp2HnAQMvqBkUn9rgl4Il7Il7yZW8N7c8hq3mkst+EAA==",
561
- "signed_at": "2026-08-16T02:12:56.840Z",
561
+ "signed_at": "2026-08-16T21:15:08.874Z",
562
562
  "d3fend_refs": [
563
563
  "D3-EAL",
564
564
  "D3-EFA",
@@ -600,7 +600,7 @@
600
600
  "framework_gaps": [],
601
601
  "last_threat_review": "2026-06-10",
602
602
  "signature": "tlvk8q1fa1scoDsJMZnigCoRNO3dqoK03Ve8tuYE2/nPwAMAGlofHpoE0mI0BX4pPODPgCfSjzgKEUn6HkcZDw==",
603
- "signed_at": "2026-08-16T02:12:56.841Z",
603
+ "signed_at": "2026-08-16T21:15:08.875Z",
604
604
  "forward_watch": [
605
605
  "New CISA KEV entries",
606
606
  "New ATLAS TTP additions in each ATLAS release",
@@ -669,7 +669,7 @@
669
669
  ],
670
670
  "last_threat_review": "2026-08-05",
671
671
  "signature": "DNXmzLVK71XI/b9mkIBw30KVdVV5Wc9/0o/pP35RkferqtvlsMHjj4WJpoGXpIu8/hJyuMJRQrV7pzfR68iIAg==",
672
- "signed_at": "2026-08-16T02:12:56.841Z",
672
+ "signed_at": "2026-08-16T21:15:08.875Z",
673
673
  "cwe_refs": [
674
674
  "CWE-327"
675
675
  ],
@@ -719,7 +719,7 @@
719
719
  ],
720
720
  "last_threat_review": "2026-06-10",
721
721
  "signature": "AzyfBZd5bxpQpaFb/S5ZJI2/NjeACLuq/u8GzKHehhlggWUqILIrS4aJ6eXn0I3UBhuXRcNBBx1mXriCSmhQAA==",
722
- "signed_at": "2026-08-16T02:12:56.842Z"
722
+ "signed_at": "2026-08-16T21:15:08.876Z"
723
723
  },
724
724
  {
725
725
  "name": "security-maturity-tiers",
@@ -759,7 +759,7 @@
759
759
  ],
760
760
  "last_threat_review": "2026-08-05",
761
761
  "signature": "8JHth6QjMcUuAD069/QvpMxgRMG+L/PVTE68/UdX9kG4SNA20ds7vHU15YzMNBmWWgiUvpLAE6hzctz1N7bWCg==",
762
- "signed_at": "2026-08-16T02:12:56.842Z",
762
+ "signed_at": "2026-08-16T21:15:08.876Z",
763
763
  "cwe_refs": [
764
764
  "CWE-1188"
765
765
  ],
@@ -813,7 +813,7 @@
813
813
  "framework_gaps": [],
814
814
  "last_threat_review": "2026-05-11",
815
815
  "signature": "iJWevUBurLvt2v8X+Ch2eHmZkPWpKeAtIpxTIP4MwbUHyco3igDeBywJCyaR2vURYRx8LkzzIMM8DxQM4LAXBQ==",
816
- "signed_at": "2026-08-16T02:12:56.843Z"
816
+ "signed_at": "2026-08-16T21:15:08.876Z"
817
817
  },
818
818
  {
819
819
  "name": "attack-surface-pentest",
@@ -889,7 +889,7 @@
889
889
  "Pwn2Own Berlin 2026 (disclosed 2026-05-14, embargo ends 2026-08-12) — Microsoft Edge 4-bug sandbox escape by Orange Tsai (DEVCORE); forward-watch only (browser sandbox, out of current playbook scope); track Microsoft Edge security advisory and KEV add"
890
890
  ],
891
891
  "signature": "GuHxmoEU97+lQfU11chYwXVQhSMpddU0OS1iLkYDmEJhBkHRWWaOa2emYJoVUBDB9v/PTKcFEuEraZwYg+8nCw==",
892
- "signed_at": "2026-08-16T02:12:56.843Z"
892
+ "signed_at": "2026-08-16T21:15:08.877Z"
893
893
  },
894
894
  {
895
895
  "name": "fuzz-testing-strategy",
@@ -950,7 +950,7 @@
950
950
  "OSS-Fuzz-Gen / AI-assisted harness generation becoming the default expectation for OSS maintainers"
951
951
  ],
952
952
  "signature": "R2jcBorSMWFuZKHUugWEni9q/W7Qk73Kg0SztXlySYu9+D2Ee43gyYsUy0nSa0oCTS8pyuhFiFv2XN0EaweTBQ==",
953
- "signed_at": "2026-08-16T02:12:56.843Z"
953
+ "signed_at": "2026-08-16T21:15:08.877Z"
954
954
  },
955
955
  {
956
956
  "name": "dlp-gap-analysis",
@@ -1028,7 +1028,7 @@
1028
1028
  "Quebec Law 25, India DPDPA, KSA PDPL enforcement actions naming AI-tool prompt data as in-scope personal information"
1029
1029
  ],
1030
1030
  "signature": "uIQdYlbKIQw8qQRDeGnXv4D/wuPAvYFRzos3kqkyELx+v9rGmfmT7w5s1608lpJxXzGLIA7BSN2/wLJJAZmXCg==",
1031
- "signed_at": "2026-08-16T02:12:56.844Z"
1031
+ "signed_at": "2026-08-16T21:15:08.877Z"
1032
1032
  },
1033
1033
  {
1034
1034
  "name": "supply-chain-integrity",
@@ -1112,7 +1112,7 @@
1112
1112
  "Pwn2Own Berlin 2026 (disclosed 2026-05-14, embargo ends 2026-08-12) — NVIDIA Megatron Bridge path traversal by haehae; AI training-stack file-system trust boundary; track patch and SBOM-attestation impact"
1113
1113
  ],
1114
1114
  "signature": "4EMvqqcYHnM+9fmlS156Utl3T248EqHdiB89zVyW8+wUYHAU/VLUOr27JiiSmj5iZrdY5Prq7t9Hsk3LuVx5Aw==",
1115
- "signed_at": "2026-08-16T02:12:56.844Z"
1115
+ "signed_at": "2026-08-16T21:15:08.878Z"
1116
1116
  },
1117
1117
  {
1118
1118
  "name": "defensive-countermeasure-mapping",
@@ -1169,7 +1169,7 @@
1169
1169
  ],
1170
1170
  "last_threat_review": "2026-06-10",
1171
1171
  "signature": "W8kg2Okd/VF521VmeVFGK2TmXkFPycuwgYdyNxLU2fMN+sR9Aals/X+Xqr/prrGEsqWnZsCInSq1TYzFr0wiDg==",
1172
- "signed_at": "2026-08-16T02:12:56.844Z"
1172
+ "signed_at": "2026-08-16T21:15:08.878Z"
1173
1173
  },
1174
1174
  {
1175
1175
  "name": "identity-assurance",
@@ -1243,7 +1243,7 @@
1243
1243
  ],
1244
1244
  "last_threat_review": "2026-05-11",
1245
1245
  "signature": "UV3458QXSkEpenzrOmdlTTfPHUD4hNyKMDHoeZDq/kiFb4mAG0ghQGTTgI9Ru8cJbSmYM1++m9N5TFIJ6JJPBg==",
1246
- "signed_at": "2026-08-16T02:12:56.845Z"
1246
+ "signed_at": "2026-08-16T21:15:08.878Z"
1247
1247
  },
1248
1248
  {
1249
1249
  "name": "ot-ics-security",
@@ -1302,7 +1302,7 @@
1302
1302
  "d3fend_refs": [],
1303
1303
  "last_threat_review": "2026-06-10",
1304
1304
  "signature": "1PFZXMfQwM0dHsZQfo+rg5hJB00dfeOL41VA3J8gNF6cCUpplw9vQuZfODX/SwXI/WmDQwM9G2sd1X/i7LG9DA==",
1305
- "signed_at": "2026-08-16T02:12:56.845Z"
1305
+ "signed_at": "2026-08-16T21:15:08.878Z"
1306
1306
  },
1307
1307
  {
1308
1308
  "name": "coordinated-vuln-disclosure",
@@ -1362,7 +1362,7 @@
1362
1362
  "NYDFS 23 NYCRR 500 amendments potentially adding explicit CVD program requirements"
1363
1363
  ],
1364
1364
  "signature": "5b3J9mk/iEi6OzeC0O2hw/K/ofTrH8519l+ZUpK8gqB/v0XbDFceIIBPB8TQM8wCct5iG0Krb7OCDSIbU0jVBw==",
1365
- "signed_at": "2026-08-16T02:12:56.845Z"
1365
+ "signed_at": "2026-08-16T21:15:08.879Z"
1366
1366
  },
1367
1367
  {
1368
1368
  "name": "threat-modeling-methodology",
@@ -1416,7 +1416,7 @@
1416
1416
  "PASTA v2 updates incorporating AI/ML application threats"
1417
1417
  ],
1418
1418
  "signature": "fibgNRd+STEyN3ZlnIxJddfaOXISYosdjoxkQ/oNVTP3GKhN1A4c3Jh0HZPbhTdjhrbJM/mE5ufiIOs7+RCMCQ==",
1419
- "signed_at": "2026-08-16T02:12:56.846Z"
1419
+ "signed_at": "2026-08-16T21:15:08.879Z"
1420
1420
  },
1421
1421
  {
1422
1422
  "name": "webapp-security",
@@ -1499,7 +1499,7 @@
1499
1499
  ],
1500
1500
  "last_threat_review": "2026-06-10",
1501
1501
  "signature": "3qtC0X8QR9YufDfeL/AUiw3EeJwvSfSrUWojndEZVmeJ3MtM12I94OJmaQT1AWaTRWVa9f91owgLl6AgoTNVAA==",
1502
- "signed_at": "2026-08-16T02:12:56.846Z",
1502
+ "signed_at": "2026-08-16T21:15:08.880Z",
1503
1503
  "forward_watch": [
1504
1504
  "NGINX Rift CVE-2026-42945 (disclosed 2026-05-13, source depthfirst) — KEV-watch predicted CISA KEV listing by 2026-05-29; AI-assisted discovery angle; track for active-exploitation confirmation and patch advisory affecting front-door web app deployments"
1505
1505
  ]
@@ -1559,7 +1559,7 @@
1559
1559
  ],
1560
1560
  "last_threat_review": "2026-05-15",
1561
1561
  "signature": "SBB7c3wNYfIdkyOp4g4nW0WP7xS+YokMzg32aaeJdbf14LTGQRzQUvSqb2TCj2HFUSHESOyKT1JpkAfyHLSQBQ==",
1562
- "signed_at": "2026-08-16T02:12:56.846Z"
1562
+ "signed_at": "2026-08-16T21:15:08.880Z"
1563
1563
  },
1564
1564
  {
1565
1565
  "name": "sector-healthcare",
@@ -1626,7 +1626,7 @@
1626
1626
  ],
1627
1627
  "last_threat_review": "2026-06-10",
1628
1628
  "signature": "Z/lPfIH5ARAOoeR81ATj6lQlekZP/8tzg23Pr1H9BxxdQedRsLGDNVIHu81qNuoA7GNRRMtxXpwrS7fXbMh5Cw==",
1629
- "signed_at": "2026-08-16T02:12:56.847Z"
1629
+ "signed_at": "2026-08-16T21:15:08.880Z"
1630
1630
  },
1631
1631
  {
1632
1632
  "name": "sector-financial",
@@ -1715,7 +1715,7 @@
1715
1715
  "TIBER-EU framework v2.0 alignment with DORA TLPT RTS (JC 2024/40); cross-recognition with CBEST and iCAST"
1716
1716
  ],
1717
1717
  "signature": "kPV8cEpIUAMKY2USvFxAn6JkkRMlBAM2mGLy6ViS9O3rv+3dsAgBqKgcBTBbuSoMZgY2KKruoG+SkrR3aoViAg==",
1718
- "signed_at": "2026-08-16T02:12:56.847Z"
1718
+ "signed_at": "2026-08-16T21:15:08.881Z"
1719
1719
  },
1720
1720
  {
1721
1721
  "name": "sector-federal-government",
@@ -1792,7 +1792,7 @@
1792
1792
  "Australia PSPF 2024 revision and ISM quarterly updates — track for Essential Eight Maturity Level requirements for federal entities"
1793
1793
  ],
1794
1794
  "signature": "CbxW5qhlaiqf+P3xIemSHlMz9OoWat2srh7F3+nAIsa0Y4nBr6WCXZXZlUUjrjptZ3Ny+Cw485HMLWRO9qbcBw==",
1795
- "signed_at": "2026-08-16T02:12:56.847Z"
1795
+ "signed_at": "2026-08-16T21:15:08.881Z"
1796
1796
  },
1797
1797
  {
1798
1798
  "name": "sector-energy",
@@ -1866,7 +1866,7 @@
1866
1866
  "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"
1867
1867
  ],
1868
1868
  "signature": "lVHORFJzvkxNqJfT34inW28BzlA8dCWDfo0JS9tsiNW3PUxdijZS22g4GMbQJgaSKGv7F3ag5rWk75O+IChUAw==",
1869
- "signed_at": "2026-08-16T02:12:56.848Z"
1869
+ "signed_at": "2026-08-16T21:15:08.881Z"
1870
1870
  },
1871
1871
  {
1872
1872
  "name": "sector-telecom",
@@ -1952,7 +1952,7 @@
1952
1952
  "O-RAN SFG / WG11 security specifications"
1953
1953
  ],
1954
1954
  "signature": "NAtyzfLPXlUuB78Snb9nWmbZalC1CNlIYN9rYhdEmtB/xQGC6vVnThgrEAHlm7v/jMCFuknvEpUHKdscUnUADw==",
1955
- "signed_at": "2026-08-16T02:12:56.848Z"
1955
+ "signed_at": "2026-08-16T21:15:08.882Z"
1956
1956
  },
1957
1957
  {
1958
1958
  "name": "api-security",
@@ -2031,7 +2031,7 @@
2031
2031
  ],
2032
2032
  "last_threat_review": "2026-06-10",
2033
2033
  "signature": "hyLAsPCAkUkhNeaaFtgSg5XsKs2L8HuFoPka/Urzel54XPMQ0F3MwRD7j/ZURzIHQxvrAxmS3OCXEsBrgcFxAw==",
2034
- "signed_at": "2026-08-16T02:12:56.848Z",
2034
+ "signed_at": "2026-08-16T21:15:08.882Z",
2035
2035
  "forward_watch": [
2036
2036
  "NGINX Rift CVE-2026-42945 (disclosed 2026-05-13, source depthfirst) — KEV-watch predicted CISA KEV listing by 2026-05-29; track for active-exploitation confirmation and patch advisory affecting API gateway / reverse-proxy deployments",
2037
2037
  "Pwn2Own Berlin 2026 (disclosed 2026-05-14, embargo ends 2026-08-12) — LiteLLM 3-bug SSRF + Code Injection chain by k3vg3n; LLM-proxy API surface; track upstream patch and CVE assignments",
@@ -2126,7 +2126,7 @@
2126
2126
  "CISA KEV additions for cloud-control-plane CVEs (IMDSv1 abuses, federation token mishandling, cross-tenant boundary failures); CISA Cybersecurity Advisories for cross-cloud advisories"
2127
2127
  ],
2128
2128
  "signature": "MfijBq1nzlyPQWf5/EcTn5Xx7ThdZ9BT8/W/+daxhATfMSoSTrMn9pYh1R83Chr9n2ahQeMoPUkSxL7Cr9V3Dw==",
2129
- "signed_at": "2026-08-16T02:12:56.849Z"
2129
+ "signed_at": "2026-08-16T21:15:08.883Z"
2130
2130
  },
2131
2131
  {
2132
2132
  "name": "container-runtime-security",
@@ -2198,7 +2198,7 @@
2198
2198
  ],
2199
2199
  "last_threat_review": "2026-06-10",
2200
2200
  "signature": "QJ8RF3ifPFc0mr3gYkloHqg5nuYe1GS4h+xbKYDCkM+HbA3iTd5keJ59P2P3z8TwVdOt8XM8WOsx6aRUrFL0Cw==",
2201
- "signed_at": "2026-08-16T02:12:56.849Z",
2201
+ "signed_at": "2026-08-16T21:15:08.883Z",
2202
2202
  "forward_watch": [
2203
2203
  "Pwn2Own Berlin 2026 (disclosed 2026-05-14, embargo ends 2026-08-12) — NVIDIA Container Toolkit container escape ($50K award) by chompie / IBM X-Force XOR; high-severity container/hypervisor boundary break; track patch and KEV add post-embargo"
2204
2204
  ]
@@ -2279,7 +2279,7 @@
2279
2279
  "MITRE ATLAS v2026.07 (released June 2026) is additive over v2026.05 — it adds AML.T0113 (Steal Web Session Cookie), AML.T0091.001 (Use Alternate Authentication Material: Web Session Cookie), and AML.T0114 (AI Service Web Interface) and refreshes AML.T0054 (LLM Jailbreak), with no technique-ID removals. Earlier releases shipped the AML.T0010 sub-technique expansion and agentic-AI techniques (\"Publish Poisoned AI Agent Tool\", \"Escape to Host\") this forecast tracked. Forward watch: subsequent monthly ATLAS releases — track next-cadence updates to agentic-AI TTPs and MLOps-pipeline-specific techniques"
2280
2280
  ],
2281
2281
  "signature": "e4uV8JvtEbC/lKGqJ6Y3ugEetF6aEv7R7CwJ/Y9N4thWNg8fconRcOPDS+045PW8xmcAqAbkSi+I4N1E6EPTAA==",
2282
- "signed_at": "2026-08-16T02:12:56.850Z"
2282
+ "signed_at": "2026-08-16T21:15:08.884Z"
2283
2283
  },
2284
2284
  {
2285
2285
  "name": "incident-response-playbook",
@@ -2353,7 +2353,7 @@
2353
2353
  "NYDFS 23 NYCRR 500.17 amendments tightening ransom-payment 24h disclosure operationalization"
2354
2354
  ],
2355
2355
  "signature": "asDHEy7Y2Bj4ikCkpP5MHRe33TIY8aQ1a+KN1UZgl89g9LyLcXzSg/weACafxJNzhOUkXnKBAtBrQIKW6p6nDQ==",
2356
- "signed_at": "2026-08-16T02:12:56.850Z"
2356
+ "signed_at": "2026-08-16T21:15:08.884Z"
2357
2357
  },
2358
2358
  {
2359
2359
  "name": "ransomware-response",
@@ -2433,7 +2433,7 @@
2433
2433
  ],
2434
2434
  "last_threat_review": "2026-06-10",
2435
2435
  "signature": "UTDsSMDvW5cpuSDBgZO5AzKowXWAR3WqeUeqyHXaikxslC6YBDL/gIojm9Km3/mgOS6pD5JKb/LLcfb4T/r4BQ==",
2436
- "signed_at": "2026-08-16T02:12:56.851Z"
2436
+ "signed_at": "2026-08-16T21:15:08.884Z"
2437
2437
  },
2438
2438
  {
2439
2439
  "name": "email-security-anti-phishing",
@@ -2501,7 +2501,7 @@
2501
2501
  ],
2502
2502
  "last_threat_review": "2026-05-18",
2503
2503
  "signature": "FVBn4ex2qPIo9SHMVJ6tntoz4tVwjbIq3m6wDjjZyv2JODlS+90GBYCOkNamxxkmw/6de6SMs0YHQiF/xjo/DQ==",
2504
- "signed_at": "2026-08-16T02:12:56.851Z"
2504
+ "signed_at": "2026-08-16T21:15:08.885Z"
2505
2505
  },
2506
2506
  {
2507
2507
  "name": "age-gates-child-safety",
@@ -2576,7 +2576,7 @@
2576
2576
  "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"
2577
2577
  ],
2578
2578
  "signature": "l/jeAAnb7H2GQzp1x05bsdZwzC0NNTBi3ZuiwgDly5EVSoikbnVWpx921bT5G3OPkx4dqs2PohlvTG0gLxCrAA==",
2579
- "signed_at": "2026-08-16T02:12:56.851Z"
2579
+ "signed_at": "2026-08-16T21:15:08.885Z"
2580
2580
  },
2581
2581
  {
2582
2582
  "name": "cloud-iam-incident",
@@ -2656,7 +2656,7 @@
2656
2656
  ],
2657
2657
  "last_threat_review": "2026-05-15",
2658
2658
  "signature": "vrMvYLdYJLlEAC8YvOb/g3LJ8gU1YmYewZ94J5AFgxxh2EiDyszqo3D/WVpt5NTrDSS/N5OgOf5Vwom/KGlMCA==",
2659
- "signed_at": "2026-08-16T02:12:56.852Z",
2659
+ "signed_at": "2026-08-16T21:15:08.886Z",
2660
2660
  "forward_watch": [
2661
2661
  "AWS IAM Identity Center session-policy refresh and step-up-on-admin enforcement (anticipated 2026-H2 release)",
2662
2662
  "GCP Workload Identity Federation principal-set attribute mapping tightening (post-2026 Q3 Federation hardening guide)",
@@ -2750,7 +2750,7 @@
2750
2750
  ],
2751
2751
  "last_threat_review": "2026-05-15",
2752
2752
  "signature": "9mfDtMApMAg9V/lmwpniNxo/6gNZoOEoYDfyFvyWvKrPMtc7H9F8uz06FVoARe/J49saAKTVXOurNE1D/KtpCQ==",
2753
- "signed_at": "2026-08-16T02:12:56.852Z",
2753
+ "signed_at": "2026-08-16T21:15:08.886Z",
2754
2754
  "forward_watch": [
2755
2755
  "Entra ID conditional access evolution post-Midnight Blizzard — Microsoft's 2025-2026 commitments on legacy-tenant MFA enforcement and OAuth-app consent gating",
2756
2756
  "Okta IPSIE (Interoperability Profile for Secure Identity in the Enterprise) OpenID Foundation working-group output and adoption timeline",
@@ -2822,7 +2822,7 @@
2822
2822
  "d3fend_refs": [],
2823
2823
  "last_threat_review": "2026-06-02",
2824
2824
  "signature": "dOFgANMtHm64uSFRjMfeA0fWZS9ISwMTt59I2CbjaF1PgTtbtb8yg/f+3pC4eXcXIET0KPGxRRmENycfIz3rAw==",
2825
- "signed_at": "2026-08-16T02:12:56.852Z"
2825
+ "signed_at": "2026-08-16T21:15:08.886Z"
2826
2826
  },
2827
2827
  {
2828
2828
  "name": "mail-server-hardening",
@@ -2881,7 +2881,7 @@
2881
2881
  "d3fend_refs": [],
2882
2882
  "last_threat_review": "2026-06-02",
2883
2883
  "signature": "5x8RGzKo/T2IbYnFkYMZs16ThD9a5FEdrKHsnwvtMuGxdyyfZsKNIJVWw2I8O0um0UOXwwkl17Z3zhch26ymCQ==",
2884
- "signed_at": "2026-08-16T02:12:56.852Z"
2884
+ "signed_at": "2026-08-16T21:15:08.886Z"
2885
2885
  },
2886
2886
  {
2887
2887
  "name": "network-trust",
@@ -2937,7 +2937,7 @@
2937
2937
  "d3fend_refs": [],
2938
2938
  "last_threat_review": "2026-06-02",
2939
2939
  "signature": "C/RdmnGjXKreKiGkwJfUESIxUwQzisGJ9A7KBdE9cBRBHBYHkAcScV89L+Z3kOG032Qax6LeIQai7Lr3nrQBCA==",
2940
- "signed_at": "2026-08-16T02:12:56.853Z"
2940
+ "signed_at": "2026-08-16T21:15:08.887Z"
2941
2941
  },
2942
2942
  {
2943
2943
  "name": "audit-log-integrity",
@@ -2992,7 +2992,7 @@
2992
2992
  "d3fend_refs": [],
2993
2993
  "last_threat_review": "2026-06-02",
2994
2994
  "signature": "T7sFREX7P2QYrau+eTNXKkrU2aJ91dsX6GQWVJeexJ9SqbyFHtAnIKo4r6F6VdELADyVjaRXKk/fLuyUaCkGBA==",
2995
- "signed_at": "2026-08-16T02:12:56.853Z"
2995
+ "signed_at": "2026-08-16T21:15:08.887Z"
2996
2996
  },
2997
2997
  {
2998
2998
  "name": "self-update-integrity",
@@ -3046,7 +3046,7 @@
3046
3046
  "d3fend_refs": [],
3047
3047
  "last_threat_review": "2026-06-02",
3048
3048
  "signature": "BOQZ8G9LdyG/tfpz6rCU4THz5Dq2HGJkUV7uCqSTCMrqnXH6seNXKM41FWawYo0s2VUlXtRgaO7ETp5qgxw+CQ==",
3049
- "signed_at": "2026-08-16T02:12:56.853Z"
3049
+ "signed_at": "2026-08-16T21:15:08.887Z"
3050
3050
  },
3051
3051
  {
3052
3052
  "name": "multitenancy-isolation",
@@ -3104,7 +3104,7 @@
3104
3104
  "d3fend_refs": [],
3105
3105
  "last_threat_review": "2026-06-02",
3106
3106
  "signature": "bncN0VE4ns0lxtPe48xDR33lerw54BPVkSwX7XlrLQcMHTrV94lmjO8z4ZP4Ko61n+KpuP2SNU8v9JT0bGMmAA==",
3107
- "signed_at": "2026-08-16T02:12:56.853Z"
3107
+ "signed_at": "2026-08-16T21:15:08.887Z"
3108
3108
  },
3109
3109
  {
3110
3110
  "name": "decompression-dos",
@@ -3162,7 +3162,7 @@
3162
3162
  "d3fend_refs": [],
3163
3163
  "last_threat_review": "2026-06-02",
3164
3164
  "signature": "03i0ZO5ScHIOjGvDKUEsws6m+20fnlJrEhSBtMU7PJzQutrPpmW9gULE0wbayTD5H9URh5nSKZuuVjvjVhZNCg==",
3165
- "signed_at": "2026-08-16T02:12:56.853Z"
3165
+ "signed_at": "2026-08-16T21:15:08.887Z"
3166
3166
  },
3167
3167
  {
3168
3168
  "name": "log-injection-telemetry",
@@ -3217,7 +3217,7 @@
3217
3217
  "d3fend_refs": [],
3218
3218
  "last_threat_review": "2026-06-02",
3219
3219
  "signature": "twTmA2l+Am2k2PCzB2DNxDQwoYlGopJp/3QgQwBsP7h2LF+uNudisqfuOVV/bYnWfrUhuYZUWbsR3mhzbJCUBw==",
3220
- "signed_at": "2026-08-16T02:12:56.854Z"
3220
+ "signed_at": "2026-08-16T21:15:08.888Z"
3221
3221
  },
3222
3222
  {
3223
3223
  "name": "privacy-consent-ops",
@@ -3272,11 +3272,11 @@
3272
3272
  "d3fend_refs": [],
3273
3273
  "last_threat_review": "2026-06-02",
3274
3274
  "signature": "0sfKSVrIf555c9bDGkXB96fUClN52fMAMYoQsNQ9eUUSzDiWUwdou+q0gYt43nObtj3m9Yb9X6q3oCXDVMgUDg==",
3275
- "signed_at": "2026-08-16T02:12:56.854Z"
3275
+ "signed_at": "2026-08-16T21:15:08.888Z"
3276
3276
  }
3277
3277
  ],
3278
3278
  "manifest_signature": {
3279
3279
  "algorithm": "Ed25519",
3280
- "signature_base64": "wQAVFnorNZLhyOYW0gZO6J7V4RTWC8ZLJ2IWQxUTIjL70KLEK1s7OlJ4zvPSVr5JXM+iNG/gCpC+VVaXNq8kCg=="
3280
+ "signature_base64": "7T8Dtq1eI/nMVjfbUop67RiioooLvyo5BS/BOQyWiwf1tRhhITr/a+Qy9QxvPGUo+J+wOSWnd/D5Yo7gPt45Dg=="
3281
3281
  }
3282
3282
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blamejs/exceptd-skills",
3
- "version": "0.19.27",
3
+ "version": "0.19.28",
4
4
  "description": "AI security skills grounded in mid-2026 threat reality, not stale framework documentation. 51 skills, 11 catalogs (1125 CVEs / 233 CWEs / 794 ATT&CK + ICS / 174 ATLAS / 468 D3FEND / 8889 RFCs), 35 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:f798c3cb-78bd-40a1-8b24-fadf4cf25307",
4
+ "serialNumber": "urn:uuid:246fe3e2-ee06-4c6a-8154-c39c10eabe42",
5
5
  "version": 1,
6
6
  "metadata": {
7
- "timestamp": "2026-08-15T00:00:00.000Z",
7
+ "timestamp": "2026-08-16T00:00:00.000Z",
8
8
  "tools": [
9
9
  {
10
10
  "vendor": "blamejs",
11
11
  "name": "scripts/refresh-sbom.js",
12
- "version": "0.19.27"
12
+ "version": "0.19.28"
13
13
  }
14
14
  ],
15
15
  "component": {
16
- "bom-ref": "pkg:npm/@blamejs/exceptd-skills@0.19.27",
16
+ "bom-ref": "pkg:npm/@blamejs/exceptd-skills@0.19.28",
17
17
  "type": "application",
18
18
  "name": "@blamejs/exceptd-skills",
19
- "version": "0.19.27",
19
+ "version": "0.19.28",
20
20
  "description": "AI security skills grounded in mid-2026 threat reality, not stale framework documentation. 51 skills, 11 catalogs (1125 CVEs / 233 CWEs / 794 ATT&CK + ICS / 174 ATLAS / 468 D3FEND / 8889 RFCs), 35 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.19.27",
28
+ "purl": "pkg:npm/%40blamejs/exceptd-skills@0.19.28",
29
29
  "hashes": [
30
30
  {
31
31
  "alg": "SHA-256",
32
- "content": "4058468c36cdc4ce1cb8fc0ee3e5cf6a2142ce9324d6ad41453715aa055e00ab"
32
+ "content": "4d1fb8258b0e421767d0badad6c4f67c20f3fff41be2eb20612c98e246c38b73"
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.19.27"
38
+ "url": "https://www.npmjs.com/package/@blamejs/exceptd-skills/v/0.19.28"
39
39
  },
40
40
  {
41
41
  "type": "vcs",
@@ -94,11 +94,11 @@
94
94
  "hashes": [
95
95
  {
96
96
  "alg": "SHA-256",
97
- "content": "77d13f8745a1ad9e7fe979efe343837b7a175c6a649c77237aedea1d45580a17"
97
+ "content": "82ba7ed2942caabf724c78c549ebbbdedae3272fe28b3c6a0046a352f36ed89a"
98
98
  },
99
99
  {
100
100
  "alg": "SHA3-512",
101
- "content": "9d294f4a6608f7f4dba60b8c3dc3978f105a556396a47da9bbc4efea99fef5312cfeb94e6bea0d3d66ae90316f5f6026ffb5248b63abcee53eef9510dea98f60"
101
+ "content": "5461086431c8705c8b57cdbb32f866c09bdaa4510effc938f21a9af5fe733be59e9fabf080377987de09d6201bfe43e7e195152afed9f4c872cb862bb0d145d6"
102
102
  }
103
103
  ]
104
104
  },
@@ -124,11 +124,11 @@
124
124
  "hashes": [
125
125
  {
126
126
  "alg": "SHA-256",
127
- "content": "8ef2f22d9f857edf03851fa422e83deaef1d70ec3eea39230b4b07a6fe20f9d3"
127
+ "content": "c5a55fe46fdd6e6776fc0898751ebc1c07d9ca49067e566dff97e27efd2b656b"
128
128
  },
129
129
  {
130
130
  "alg": "SHA3-512",
131
- "content": "eaef9163b285ea49ea3ddbd3dc2ff98bf7d453c1139f878037f2f6752ae8173431e6cbcd8658e719f9b2f69ed5c0ca2a19419f159aa8481ab6b7db47a95056e4"
131
+ "content": "8e15bf0181107214624b2ee38756b4398cfaecf8bf1f8bee256729ac68895ae1a4aff59f8dafe8886644ee6971c0d2fcaf5dea6677f484fb75b419c244b0b5db"
132
132
  }
133
133
  ]
134
134
  },
@@ -139,11 +139,11 @@
139
139
  "hashes": [
140
140
  {
141
141
  "alg": "SHA-256",
142
- "content": "fa6db504bafd4c65696f3c57ea92ff40af5f9014781d32c080371170c83fe3b0"
142
+ "content": "bf44113b9957ba919738943d0a70479873a6047c7b903b783a9b72d2897c114d"
143
143
  },
144
144
  {
145
145
  "alg": "SHA3-512",
146
- "content": "ba2f916a16bcc9f3c2833f7a56a0fb111a83f87369f1e921216ff6a5a9749898abfaff9009024ffe6d924ab54ad6db41935a3f4904381d67db0113a60a55ff18"
146
+ "content": "041431e72b797bc297649a3427d4a272c678de98ccb7f2d1f205a85f6ad9c3595a573bc85edc84de052c85ae48896c13e06282771affbf03408f7f817a7347ff"
147
147
  }
148
148
  ]
149
149
  },
@@ -199,11 +199,11 @@
199
199
  "hashes": [
200
200
  {
201
201
  "alg": "SHA-256",
202
- "content": "33ca5a914e7f0fd5357d4382a1f5a6ef615a7c399cad5bbaa5b54da70364f1b5"
202
+ "content": "597777d5f9efcce1f7e5d93d60618fbb7c3fec23becc4b6457744881167bd8a7"
203
203
  },
204
204
  {
205
205
  "alg": "SHA3-512",
206
- "content": "377cf1c335d73d70672be5a5ab194ba05c256baa737c77f01a864fc5871bf340c16699dc8fafd913a61a2a772091db4251b0bf941ac9e369007d127a381b2d28"
206
+ "content": "f308b0f2555289d1c35c27307e3c2885426e2a239f86077937a4d14585d57745c297b854ac1b26a4d7ee25b24f90f2e407560ca3d8d06f22f354c292ccda755a"
207
207
  }
208
208
  ]
209
209
  },
@@ -289,11 +289,11 @@
289
289
  "hashes": [
290
290
  {
291
291
  "alg": "SHA-256",
292
- "content": "6883befd805e9af371b147672c754aaa11b639e50fba0f7d025064ce2039126a"
292
+ "content": "1f3aac977b350fe70a23f564cf3fb01fd7b6a62badfa6b15181ad78c1fe8e4e0"
293
293
  },
294
294
  {
295
295
  "alg": "SHA3-512",
296
- "content": "115fc6de47b61b3efd9ea3fb3bc0679edfaf82644a279d0baa888610d22af88ed062572b4caa5dbd4defb441bf1910d0b0c5f341cdfc96fb807641535f1fe703"
296
+ "content": "c3690fde8c3794fe835f96e85cf5963eca160a61a3e456fe199771b2d6786a49b81eaccaddecab5d694e0f572f8b387ac1a3ec8b7f4b7fc9e4d48c04c4fc8b66"
297
297
  }
298
298
  ]
299
299
  },
@@ -1444,11 +1444,11 @@
1444
1444
  "hashes": [
1445
1445
  {
1446
1446
  "alg": "SHA-256",
1447
- "content": "a26461c4cb01e8c0863a1d87c530c88378fc31022fdfc2c0eae91abc948d3d5e"
1447
+ "content": "e5cbac764f0447e51db5ddf5561a9977d9358d8e8fc4f183442d5a7290952354"
1448
1448
  },
1449
1449
  {
1450
1450
  "alg": "SHA3-512",
1451
- "content": "bd1bc3d4efd586d31bf7b2828ea04ad6a9eebde8e5e8c40b98b9ddf428d3e1a00b9aaf56e01fa118e6e5ddf88b49e1f89498c6ba33879fc2e702f60111a0aa85"
1451
+ "content": "73fffa1d931a99073386f86adfb86f4bc68974da660cbe793dd24b9555a22ffdda625a4592e69c045d086fd6f2d3fe2cf2773795dd7e13ee2f5a666215dd8ea9"
1452
1452
  }
1453
1453
  ]
1454
1454
  },
@@ -1519,11 +1519,11 @@
1519
1519
  "hashes": [
1520
1520
  {
1521
1521
  "alg": "SHA-256",
1522
- "content": "1831ac95db126ce8c7484fd00e72af15d9dadbde2760df1bd464b999155fe835"
1522
+ "content": "3253e1dcb715266a8d019390884bcff3cb53b96ea7ae1f0b98c8cee0bc6681bb"
1523
1523
  },
1524
1524
  {
1525
1525
  "alg": "SHA3-512",
1526
- "content": "6ff829a0527ced16b0dab613cead773929bcb7bda298a9533d0d8e97330ea71a97d3ee9893c4d23a86c3b2cd858174ac42cdbcb02e5edc5b5b604bc05b1b4b0c"
1526
+ "content": "11e880a7678de02d1ae97eb002ef4484fbc89196eec576d93e677335126897a5c2304cfa4c0bbb25a18b1e638d64d1dbb6c870355d0406445498f9d610bf9f12"
1527
1527
  }
1528
1528
  ]
1529
1529
  },
@@ -1954,11 +1954,11 @@
1954
1954
  "hashes": [
1955
1955
  {
1956
1956
  "alg": "SHA-256",
1957
- "content": "1d3ee52ad114109f62c1c376711f1e90195fde813ae038e7f11b8cd87eba3807"
1957
+ "content": "aaa50886a66d39bf792a0bbdc6dc8556040b1249b859294e5690121a5d23c89b"
1958
1958
  },
1959
1959
  {
1960
1960
  "alg": "SHA3-512",
1961
- "content": "c5d1a2e65513a63a6debdf342262fc8b4b6462ac6fb7484cfff8416ee722c2923595f3f027775b726fdea353020596ef2a92e924ba7f05fdd002a14fdefc3e62"
1961
+ "content": "14108495989cecb6e88658dbd36975cb89c95eac918401a492a3c85552563046b2a2ba827d72b3b0571c18878bef9929ed53436344c2ebd179bdf611e8f44ce3"
1962
1962
  }
1963
1963
  ]
1964
1964
  },
@@ -2074,11 +2074,11 @@
2074
2074
  "hashes": [
2075
2075
  {
2076
2076
  "alg": "SHA-256",
2077
- "content": "2e8620d2d60cb54256ac74513d206d7aae8ef20e0cfb3e9f223ecbe290a09576"
2077
+ "content": "825407024d9b98e8ab0ae1ef61363f04c1733ee7e1b53f895f6474ad0de4e2e6"
2078
2078
  },
2079
2079
  {
2080
2080
  "alg": "SHA3-512",
2081
- "content": "5782993f86dd1ac3700a719efb02af1876711b1a7d04aa551eca51c8af06d242c72080bf194793d016b9a3ee247ae876a015c34e433953170ac1d89136f680a9"
2081
+ "content": "662bc62ce835221b2bd59f249f68d32227367a1b5df9b42e8f34702e097f057fb91638ff93dff990e5ab061a7b1d5db98c9af45c0230e03bfdd57e62ab5d802b"
2082
2082
  }
2083
2083
  ]
2084
2084
  },
@@ -2734,11 +2734,11 @@
2734
2734
  "hashes": [
2735
2735
  {
2736
2736
  "alg": "SHA-256",
2737
- "content": "cda8569b99f9177dd68d0ea17b5aa0b721425f27a8e650edfc0bc2fcffbe8a99"
2737
+ "content": "1b6aca4178212f80dd5afa7595bd6fbfbadb5d6ab59b3ebb76ca8e3f74e2a778"
2738
2738
  },
2739
2739
  {
2740
2740
  "alg": "SHA3-512",
2741
- "content": "fc734bef8a1863983201f58ad1b0e0aa3f2545de0d65926dc475e0ae03d8d7b016fd6def7f1e4587ef0e2e8f32633e02357b91889d190a8d5e1ee6e3a067c9f2"
2741
+ "content": "2daf3079aab08af9e9a60d2253ba4e1b6b56d0611e70b6d44786a0f5950f50c84b633610175f5e8bbbabcb5c85b947dcb7ab14eb4ae6e3c1d1fe6d11547e5547"
2742
2742
  }
2743
2743
  ]
2744
2744
  },
@@ -2824,11 +2824,11 @@
2824
2824
  "hashes": [
2825
2825
  {
2826
2826
  "alg": "SHA-256",
2827
- "content": "06d9c0b3b342b3b96d5c17675ec060cc0273e793b19d004af0fde2b3669ce1b0"
2827
+ "content": "116c70bd27f6ac05480b69112ef481382ba86292cb8d2fb64983c7e511487f74"
2828
2828
  },
2829
2829
  {
2830
2830
  "alg": "SHA3-512",
2831
- "content": "12fdee49bc8fa5f90a503439b778c6203f75a8fee4ef6a7e6df9690a4216070cea5ee25979ba75b522a0f4b00df3ece0b77bc627db6ce59c23b5282b047a877e"
2831
+ "content": "6293ee367f409dce000069fa7810096aea96cc0bf3f2e32b9c148bab41dc1b6e3831df92d0b7a182fedb43667f6571a6aff9e90eecae35c344609f2b1f464a13"
2832
2832
  }
2833
2833
  ]
2834
2834
  },
@@ -117,8 +117,8 @@ const CATALOGS = [
117
117
  // technique gets a `cve_refs` array carrying the CVE ids that cite it.
118
118
  // Pre-v0.13 these catalogs had only forward refs (CVE → TTP); operators
119
119
  // reading an ATLAS / ATT&CK entry could not see which CVEs cite it
120
- // without grepping the whole catalog. New back-edges close the
121
- // asymmetric-edges cluster the cycle 20 audit B flagged.
120
+ // without grepping the whole catalog. These back-edges make the
121
+ // relationship symmetric: a citation is readable from either end.
122
122
  {
123
123
  file: 'atlas-ttps.json',
124
124
  forwardField: 'atlas_refs',
@@ -27,9 +27,11 @@
27
27
  * cross-ref arrays changed, refresh-reverse-refs + build-indexes) so the
28
28
  * refreshed manifest is signed and the derived surfaces pick up the refs.
29
29
  *
30
- * tests/manifest-frontmatter-sync.test.js fails the suite if the cache ever
30
+ * tests/sync-manifest-metadata.test.js fails the suite if the cache ever
31
31
  * drifts again, so a missed run is caught before release rather than shipping
32
- * a manifest that contradicts its own skill bodies.
32
+ * a manifest that contradicts its own skill bodies. It covers the fields named
33
+ * above; `description` is cached in the manifest but is NOT one of them, so a
34
+ * frontmatter description edit does not propagate and is not caught here.
33
35
  *
34
36
  * Exit codes: 0 = wrote (or already in sync), 1 = a skill file was missing or
35
37
  * its frontmatter failed to parse.