@blamejs/exceptd-skills 0.12.22 → 0.12.23

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.
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "schema_version": "1.1.0",
3
- "generated_at": "2026-05-15T06:49:36.722Z",
3
+ "generated_at": "2026-05-15T14:25:49.905Z",
4
4
  "generator": "scripts/build-indexes.js",
5
5
  "source_count": 50,
6
6
  "source_hashes": {
7
- "manifest.json": "2adf0e88322f3903ffd323dbcee69b406c7d801a1539cb1e79e569e47bbafc4c",
7
+ "manifest.json": "6fda2187c6d4dfbc333a711cea0991d59c459ded1ed5005126a8c555b9e77cf2",
8
8
  "data/atlas-ttps.json": "20339e0ae3cd89c06f1385be31c50f408f827edc2e8ab8aef026ade3bcf0a917",
9
9
  "data/attack-techniques.json": "6db08a8e8a4d03d9309b1d185112de7f3c9595d2cd3d24566b7ce0b3b8aa5d1a",
10
10
  "data/cve-catalog.json": "7936ba3c8f27156235bf327830e8f1a684658865e97f089aed98b2a7cdbb88ef",
@@ -83,7 +83,7 @@
83
83
  "frequency_fields": 7,
84
84
  "activity_feed_events": 50,
85
85
  "catalog_summaries": 11,
86
- "stale_content_findings": 0
86
+ "stale_content_findings": 1
87
87
  },
88
88
  "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
89
  }
@@ -3,12 +3,19 @@
3
3
  "schema_version": "1.0.0",
4
4
  "reference_date": "2026-05-01",
5
5
  "note": "Stale-content snapshot derived from audit-cross-skill checks. Re-runs of build-indexes against the same inputs produce byte-identical output (reference_date is manifest.threat_review_date, not 'now'). audit-cross-skill.js remains the canonical interactive audit.",
6
- "finding_count": 0,
6
+ "finding_count": 1,
7
7
  "by_severity": {
8
8
  "high": 0,
9
- "medium": 0,
9
+ "medium": 1,
10
10
  "low": 0
11
11
  }
12
12
  },
13
- "findings": []
13
+ "findings": [
14
+ {
15
+ "severity": "medium",
16
+ "category": "badge_drift",
17
+ "artifact": "README.md",
18
+ "detail": "jurisdictions badge shows 35, live count is 34"
19
+ }
20
+ ]
14
21
  }
@@ -297,7 +297,7 @@
297
297
  "monitor": 40,
298
298
  "close": 25
299
299
  },
300
- "framework_lag_declaration": "NIST 800-53 SI-3/SC-7/AC-2, ISO 27001:2022 A.8.16, SOC 2 CC6/CC7, EU AI Act Art.15 are all structurally insufficient for AI-API C2. The shared failure: each control treats the AI API endpoint as a legitimate authorized SaaS, the service account using it as authorized, and the traffic over it as business-as-usual. The SesameOp pattern operates entirely inside that authorized envelope. Until frameworks add 'AI-API egress baseline + content inspection + bearer-token-to-process attribution' controls, anomaly-detection audit opinions provide zero signal about AI-as-C2 exposure. Companion gap: secrets-management controls (IA-5, A.8.5) focus on repository-committed keys and ignore the dotfile credential surface where most developer keys actually live. Lag = ~190 days behind the SesameOp pattern's first documentation; no framework body has issued draft language as of 2026-05-11.",
300
+ "framework_lag_declaration": "NIST 800-53 SI-3/SC-7/AC-2, ISO 27001:2022 A.8.16, SOC 2 CC6/CC7, EU AI Act Art.15 are all structurally insufficient for AI-API C2. The shared failure: each control treats the AI API endpoint as a legitimate authorized SaaS, the service account using it as authorized, and the traffic over it as business-as-usual. The SesameOp pattern operates entirely inside that authorized envelope. Until frameworks add 'AI-API egress baseline + content inspection + bearer-token-to-process attribution' controls, anomaly-detection audit opinions provide zero signal about AI-as-C2 exposure. Companion gap: secrets-management controls (IA-5, A.8.5) focus on repository-committed keys and ignore the dotfile credential surface where most developer keys actually live. Lag = ~190 days behind the SesameOp pattern's first documentation; no framework body has issued draft language as of 2026-05-11. UK CAF Principles B3 (Data Security) and B4 (System Security) treat egress monitoring and trust-boundary enforcement as outcomes without naming AI-API endpoints as a distinct exfiltration channel — B3/B4 evidence passes while authorized-SaaS C2 channels stay invisible. AU Essential 8 ML2 Application Control (E8 M.1) + Restrict Admin Privileges (E8 M.5) and ACSC ISM-1546 cover process-lineage and admin-privilege restriction, but Essential 8 does not yet enumerate AI-API endpoints in its allowlist guidance — operators who allow AI SaaS at the proxy retain no per-token attribution.",
301
301
  "skill_chain": [
302
302
  {
303
303
  "skill": "ai-c2-detection",
@@ -257,7 +257,7 @@
257
257
  "monitor": 65,
258
258
  "close": 35
259
259
  },
260
- "framework_lag_declaration": "NIST 800-190 + CIS K8s Benchmark + NIST 800-53 CM-7 + ISO A.8.9 + PCI Req.2.2 collectively cover container hardening but accept cluster-wide attestation as evidence. None require per-manifest analysis as a control. Manifest drift in GitOps repos can introduce privileged: true / hostPID / unscoped capabilities faster than any attestation cadence. EU CRA + NIST SSDF + SLSA cover supply-chain posture but most orgs are at SLSA L1-L2 without digest pinning. Gap = ~21 days between manifest drift and review cadence; per-CVE gap (e.g. Leaky Vessels) is hours from public PoC to weaponization vs. weeks of node-staging windows.",
260
+ "framework_lag_declaration": "NIST 800-190 + CIS K8s Benchmark + NIST 800-53 CM-7 + ISO A.8.9 + PCI Req.2.2 collectively cover container hardening but accept cluster-wide attestation as evidence. None require per-manifest analysis as a control. Manifest drift in GitOps repos can introduce privileged: true / hostPID / unscoped capabilities faster than any attestation cadence. EU CRA + NIST SSDF + SLSA cover supply-chain posture but most orgs are at SLSA L1-L2 without digest pinning. Gap = ~21 days between manifest drift and review cadence; per-CVE gap (e.g. Leaky Vessels) is hours from public PoC to weaponization vs. weeks of node-staging windows. UK CAF Principles B4 (System Security) and B5 (Resilient Networks & Systems) treat container-runtime hardening as an outcome assessable via attestation, without binding evidence to per-manifest privileged-flag or host-namespace exposure. AU Essential 8 ML2 Application Control (E8 M.1) + Configure Microsoft Office Macro Settings (E8 M.2 — by analogy, application-execution policy) plus ACSC ISM-1546 and ISM-1683 (workload isolation) cover application execution and workload separation, but Essential 8 has no maturity-level requirement that bans privileged + hostPID + hostNetwork in cluster manifests.",
261
261
  "skill_chain": [
262
262
  {
263
263
  "skill": "container-runtime-security",
@@ -236,7 +236,7 @@
236
236
  "monitor": 60,
237
237
  "close": 30
238
238
  },
239
- "framework_lag_declaration": "NIST 800-63b AAL specs, NIST 800-53 IA-2/IA-5, ISO A.5.16/A.5.17, NIS2 Art.21(2)(j), PCI-DSS Req.8 collectively specify target authenticator properties (phishing-resistant, short-lived, MFA-gated). They do not require enumeration of credentials actually present on developer endpoints. SSO + MFA attestation is accepted as evidence even when local credential stores hold long-lived bearer tokens that bypass SSO. Gap = ~25 days between credential-store drift (new PAT issued, new long-lived AWS key created) and any framework's review cadence.",
239
+ "framework_lag_declaration": "NIST 800-63b AAL specs, NIST 800-53 IA-2/IA-5, ISO A.5.16/A.5.17, NIS2 Art.21(2)(j), PCI-DSS Req.8 collectively specify target authenticator properties (phishing-resistant, short-lived, MFA-gated). They do not require enumeration of credentials actually present on developer endpoints. SSO + MFA attestation is accepted as evidence even when local credential stores hold long-lived bearer tokens that bypass SSO. Gap = ~25 days between credential-store drift (new PAT issued, new long-lived AWS key created) and any framework's review cadence. UK CAF Principle B2 (Identity and Access Control) defines authentication outcomes and credential-management practice, but does not require enumeration of credentials persisted in local credential stores outside the SSO/IdP envelope. AU Essential 8 ML2 MFA (E8 M.4) + Restrict Admin Privileges (E8 M.5) and ACSC ISM-1546 cover authenticator strength and admin-privilege scope but treat long-lived bearer tokens stored in dotfiles / OS keychains as out of frame — Essential 8 evidence passes while landed-attacker credential harvest stays trivial.",
240
240
  "skill_chain": [
241
241
  {
242
242
  "skill": "identity-assurance",
@@ -322,7 +322,7 @@
322
322
  "monitor": 45,
323
323
  "close": 25
324
324
  },
325
- "framework_lag_declaration": "Frameworks structurally bind the OPERATING organization, not the library author. NIST 800-53 SC-13, ISO 27001:2022 A.8.24/A.8.28, PCI DSS 4.0 §3.6/§8.3.2 all push obligations downstream to consumers who inherit the shipped defaults. EU CRA Annex I §1 is the first framework with direct upstream obligations on manufacturers of products with digital elements, but its binding date for vulnerability-handling and SBOM provisions is 2026-09-11 (four months from now) with full compliance 2027-12-11. NIS2 Art.21(2)(g) exerts indirect pressure via essential-entity consumers. UK CAF C.5 + UK PSTI covers connected products only. ISO 27001:2022 A.8.28 'secure coding' is silent on PQC, KDF iteration minimums, RNG-source requirements, constant-time-implementation requirements — the longest structural laggard. NIST IR 8547 + OMB M-23-02 + CNSA 2.0 push federal-system PQC migration through 2030 but rely on procurement pressure to flow upstream. Gap = ~365 days from operational PQC readiness (2024-08-13 FIPS finalization) to binding library-author obligations (2026-09-11 EU CRA partial bind). Compensating controls (downstream-consumer adoption pressure, supply-chain auditing tools, voluntary SECURITY.md disclosure of cryptographic provenance) must close this gap pending EU CRA enforcement.",
325
+ "framework_lag_declaration": "Frameworks structurally bind the OPERATING organization, not the library author. NIST 800-53 SC-13, ISO 27001:2022 A.8.24/A.8.28, PCI DSS 4.0 §3.6/§8.3.2 all push obligations downstream to consumers who inherit the shipped defaults. EU CRA Annex I §1 is the first framework with direct upstream obligations on manufacturers of products with digital elements, but its binding date for vulnerability-handling and SBOM provisions is 2026-09-11 (four months from now) with full compliance 2027-12-11. NIS2 Art.21(2)(g) exerts indirect pressure via essential-entity consumers. UK CAF C.5 + UK PSTI covers connected products only. ISO 27001:2022 A.8.28 'secure coding' is silent on PQC, KDF iteration minimums, RNG-source requirements, constant-time-implementation requirements — the longest structural laggard. NIST IR 8547 + OMB M-23-02 + CNSA 2.0 push federal-system PQC migration through 2030 but rely on procurement pressure to flow upstream. Gap = ~365 days from operational PQC readiness (2024-08-13 FIPS finalization) to binding library-author obligations (2026-09-11 EU CRA partial bind). Compensating controls (downstream-consumer adoption pressure, supply-chain auditing tools, voluntary SECURITY.md disclosure of cryptographic provenance) must close this gap pending EU CRA enforcement. AU Essential 8 ML2 Patch Applications (E8 M.2) plus ACSC ISM-1138 (cryptographic-algorithm transition), ISM-0467 (approved cryptographic algorithms), and ISM-0471 (cryptographic protocol selection) reference downstream consumer migration but place no obligation on upstream library authors to ship PQC-by-default, KDF iteration minima, or constant-time implementations — Essential 8 evidence flows from operating-org posture, not from library-publisher posture.",
326
326
  "skill_chain": [
327
327
  {
328
328
  "skill": "pqc-first",
@@ -288,7 +288,7 @@
288
288
  "monitor": 45,
289
289
  "close": 25
290
290
  },
291
- "framework_lag_declaration": "Every framework in scope is structurally insufficient for HNDL. NIST 800-53 SC-8/SC-13, ISO 27001:2022 A.8.24/A.8.25, PCI DSS 4.0 §3.6/§4.2.1, NIS2 Art.21(2)(h), DORA Art.9, EU CRA Annex I all permit fully-classical cryptographic posture as 'strong cryptography'. NIST itself is the exception: FIPS 203/204/205 are finalized, NIST IR 8547 is a published migration roadmap, OMB M-23-02 mandates federal PQC inventory — but the 800-53 control catalog is unchanged. ISO 27001:2022 was published before PQC finalization and has no scheduled amendment. PCI Council and EU regulators are publicly aware but have not amended binding controls. Lag = ~180 days behind operational readiness (PQC has been production-ready since 2024-08-13) and 4-8+ years behind the CRQC horizon that drives the harvest-now-decrypt-later attack. Compensating controls (crypto-agility, hybrid algorithms, layered encryption envelopes) must close this gap before SLA-only compliance can be accepted.",
291
+ "framework_lag_declaration": "Every framework in scope is structurally insufficient for HNDL. NIST 800-53 SC-8/SC-13, ISO 27001:2022 A.8.24/A.8.25, PCI DSS 4.0 §3.6/§4.2.1, NIS2 Art.21(2)(h), DORA Art.9, EU CRA Annex I all permit fully-classical cryptographic posture as 'strong cryptography'. NIST itself is the exception: FIPS 203/204/205 are finalized, NIST IR 8547 is a published migration roadmap, OMB M-23-02 mandates federal PQC inventory — but the 800-53 control catalog is unchanged. ISO 27001:2022 was published before PQC finalization and has no scheduled amendment. PCI Council and EU regulators are publicly aware but have not amended binding controls. Lag = ~180 days behind operational readiness (PQC has been production-ready since 2024-08-13) and 4-8+ years behind the CRQC horizon that drives the harvest-now-decrypt-later attack. Compensating controls (crypto-agility, hybrid algorithms, layered encryption envelopes) must close this gap before SLA-only compliance can be accepted. UK CAF Principles B3 (Data Security) and B4 (System Security) treat cryptography as an outcome (data-in-transit + data-at-rest protection) without naming PQC migration or HNDL exposure as a B3/B4 requirement — CAF evidence passes against fully-classical posture. AU Essential 8 ML2 Patch Applications + Patch Operating Systems (E8 M.2) plus ACSC ISM-1138 (cryptographic-algorithm transition) and ISM-0467 (approved cryptographic algorithms) reference algorithm-suite policy, but ISM transition guidance remains advisory in 2026-05 and Essential 8 maturity levels do not bind PQC inventory + migration deadlines.",
292
292
  "skill_chain": [
293
293
  {
294
294
  "skill": "pqc-first",
@@ -226,7 +226,7 @@
226
226
  "monitor": 65,
227
227
  "close": 30
228
228
  },
229
- "framework_lag_declaration": "NIST CM-6, ISO A.8.9, Essential 8 OS Hardening, CMMC CM.L2-3.4.1/2 all permit baseline + change-management evidence without requiring continuous attestation of the specific kernel hardening flags (kptr_restrict, unprivileged_userns_clone, unprivileged_bpf_disabled, yama.ptrace_scope, dmesg_restrict, kernel.lockdown, MAC enforcement mode) that determine whether a vulnerable kernel is actually exploitable. Gap = ~21 days at typical orgs between drift event and review. For environments using GitOps-deployed kernel parameters, drift can occur faster than monitoring catches.",
229
+ "framework_lag_declaration": "NIST CM-6, ISO A.8.9, Essential 8 OS Hardening, CMMC CM.L2-3.4.1/2 all permit baseline + change-management evidence without requiring continuous attestation of the specific kernel hardening flags (kptr_restrict, unprivileged_userns_clone, unprivileged_bpf_disabled, yama.ptrace_scope, dmesg_restrict, kernel.lockdown, MAC enforcement mode) that determine whether a vulnerable kernel is actually exploitable. Gap = ~21 days at typical orgs between drift event and review. For environments using GitOps-deployed kernel parameters, drift can occur faster than monitoring catches. UK CAF Principles B4 (System Security) and B5 (Resilient Networks & Systems) treat OS hardening as a system-security outcome assessable via baseline-and-change-management evidence, without binding to continuous attestation of specific kernel hardening flags (kptr_restrict, unprivileged_userns_clone, unprivileged_bpf_disabled, yama.ptrace_scope, dmesg_restrict, kernel.lockdown, MAC enforcement) — CAF evidence passes against a host whose flags drifted hours after the last review. AU Essential 8 ML2 Patch Operating Systems (E8 M.2) + Restrict Admin Privileges (E8 M.5) and ACSC ISM-1144 / ISM-1493 (vulnerability management) reference OS-hardening posture but do not enumerate the per-sysctl flag set whose state determines whether a vulnerable kernel is actually exploitable.",
230
230
  "skill_chain": [
231
231
  {
232
232
  "skill": "kernel-lpe-triage",
@@ -224,7 +224,7 @@
224
224
  "monitor": 70,
225
225
  "close": 30
226
226
  },
227
- "framework_lag_declaration": "NIST SI-2 + ISO A.8.8 + NIS2 Art.21(2)(c) permit 30-day patch SLAs that are inadequate for KEV-listed kernel LPEs with confirmed exploitation. NIST 800-53 Rev. 5.1.1 does not require KEV-aware prioritization, only risk-based — leaving it to implementer interpretation. Real-world tempo: weaponization in hours, patch SLA in weeks. Gap = ~28 days. Compensating controls (live-patch, MAC, kernel hardening) MUST close this gap before SLA-only compliance can be accepted.",
227
+ "framework_lag_declaration": "NIST SI-2 + ISO A.8.8 + NIS2 Art.21(2)(c) permit 30-day patch SLAs that are inadequate for KEV-listed kernel LPEs with confirmed exploitation. NIST 800-53 Rev. 5.1.1 does not require KEV-aware prioritization, only risk-based — leaving it to implementer interpretation. Real-world tempo: weaponization in hours, patch SLA in weeks. Gap = ~28 days. Compensating controls (live-patch, MAC, kernel hardening) MUST close this gap before SLA-only compliance can be accepted. UK CAF Principles B4 (System Security) and B5 (Resilient Networks & Systems) treat patching as an outcome without binding to KEV-aware tempo; CAF evidence passes against the 30-day SLA that real-world weaponization beats. AU Essential 8 ML2 / ML3 Patch Operating Systems (E8 M.2) sets a 48-hour patch target for internet-facing services with known exploitation, and ACSC ISM-1144 / ISM-1493 (vulnerability management + critical patching) name kernel patching specifically — but Essential 8 maturity adoption surveys show ML3 attainment <15% across regulated AU entities, leaving the structural gap operational even where the framework anticipates it.",
228
228
  "skill_chain": [
229
229
  {
230
230
  "skill": "kernel-lpe-triage",
@@ -326,7 +326,7 @@
326
326
  "monitor": 50,
327
327
  "close": 25
328
328
  },
329
- "framework_lag_declaration": "Every framework in scope (NIST 800-53 SA-12/CM-7, ISO 27001:2022 A.5.19/A.5.20/A.8.30, SOC 2 CC9, NIS2 Art.21(2)(d), EU AI Act Art.15, EU CRA Art.13) is structurally insufficient. The shared structural failure: every control treats third-party software risk as a procurement event with a discrete vendor list, while MCP servers are continuously sideloaded by developers from package registries with no procurement signal, no enforced signing, and no allowlist that survives version drift. Until frameworks add a 'developer-installed AI tool plugin' control category with mandatory manifest signature verification + version pinning with integrity hash + provenance attestation, vendor-management audit opinions provide zero signal about MCP exposure. Gap = ~210 days behind operational reality; no framework body has issued draft language as of 2026-05-11.",
329
+ "framework_lag_declaration": "Every framework in scope (NIST 800-53 SA-12/CM-7, ISO 27001:2022 A.5.19/A.5.20/A.8.30, SOC 2 CC9, NIS2 Art.21(2)(d), EU AI Act Art.15, EU CRA Art.13) is structurally insufficient. The shared structural failure: every control treats third-party software risk as a procurement event with a discrete vendor list, while MCP servers are continuously sideloaded by developers from package registries with no procurement signal, no enforced signing, and no allowlist that survives version drift. Until frameworks add a 'developer-installed AI tool plugin' control category with mandatory manifest signature verification + version pinning with integrity hash + provenance attestation, vendor-management audit opinions provide zero signal about MCP exposure. Gap = ~210 days behind operational reality; no framework body has issued draft language as of 2026-05-11. UK CAF Principles B3 (Data Security) and B4 (System Security) treat third-party tooling as a procurement-and-supply-chain assurance outcome, with no Principle that names developer-installed AI tool plugins as a distinct surface — CAF B3/B4 evidence remains silent on MCP-server sideload. AU Essential 8 ML2 Application Control (E8 M.1) + Restrict Admin Privileges (E8 M.5) plus ACSC ISM-1490 (application control) and ISM-1657 (supply chain) cover application-execution allowlisting in principle, but Essential 8 maturity guidance assumes a discrete vendor list and does not enumerate registry-pulled MCP servers as application-control scope.",
330
330
  "skill_chain": [
331
331
  {
332
332
  "skill": "mcp-agent-trust",
@@ -230,7 +230,7 @@
230
230
  "monitor": 65,
231
231
  "close": 35
232
232
  },
233
- "framework_lag_declaration": "NIST CM-7 + AC-6, ISO A.8.2 + A.8.18, and NIS2 Art.21(2)(i) treat least-privilege and least-functionality as policy outcomes reviewable annually. They do not require programmatic enumeration of the specific primitives (sudoers NOPASSWD, non-baseline SUID, world-writable cron, host-mounted systemd services, listening sockets on non-loopback) that attackers use to convert foothold into root. A host can be CM-7/AC-6 compliant on paper while presenting dozens of LPE primitives to a landed attacker. Gap = ~21 days between drift and policy review at typical orgs; for fast-moving environments (containerized + GitOps-deployed), drift accumulates faster than annual review can catch.",
233
+ "framework_lag_declaration": "NIST CM-7 + AC-6, ISO A.8.2 + A.8.18, and NIS2 Art.21(2)(i) treat least-privilege and least-functionality as policy outcomes reviewable annually. They do not require programmatic enumeration of the specific primitives (sudoers NOPASSWD, non-baseline SUID, world-writable cron, host-mounted systemd services, listening sockets on non-loopback) that attackers use to convert foothold into root. A host can be CM-7/AC-6 compliant on paper while presenting dozens of LPE primitives to a landed attacker. Gap = ~21 days between drift and policy review at typical orgs; for fast-moving environments (containerized + GitOps-deployed), drift accumulates faster than annual review can catch. UK CAF Principles B4 (System Security) and B5 (Resilient Networks & Systems) treat least-privilege as a system-security outcome assessable through control-design evidence, without binding to per-host enumeration of LPE primitives (sudoers NOPASSWD, non-baseline SUID, writable cron, host-mount services). AU Essential 8 ML2 Restrict Admin Privileges (E8 M.5) + Patch Operating Systems (E8 M.2) plus ACSC ISM-1175 (privilege management) and ISM-1490 (application control) cover admin-account and application-execution policy, but Essential 8 maturity evidence does not enumerate the specific runtime primitives that convert foothold into root.",
234
234
  "skill_chain": [
235
235
  {
236
236
  "skill": "attack-surface-pentest",
@@ -390,7 +390,7 @@
390
390
  "monitor": 50,
391
391
  "close": 30
392
392
  },
393
- "framework_lag_declaration": "Supply-chain frameworks have advanced fastest of any class in this exceptd release, but implementation gaps are pervasive. NIST 800-53 SA-12, NIST 800-218 SSDF, ISO 27001:2022 A.8.30/A.5.20, SOC 2 CC9.2, PCI DSS 4.0 sect.6.3, NIS2 Art.21(2)(d), DORA Art.28, EU CRA Art.13/14 all permit (a) SBOM as deliverable without continuous correlation, (b) lockfile-pinning without integrity hash, (c) direct-deps-only SBOM, (d) absence of VEX statements, (e) absence of AI-generated-code provenance, (f) model weights treated as content blobs. Lag = ~90 days behind operational tooling (SLSA / Sigstore / in-toto / VEX-CSAF) and ~210 days behind AI-coding-assistant adoption tempo. Compensating controls (continuous CVE correlation, integrity-pinned lockfiles, transitive SBOM completeness, VEX maintenance, AI-code provenance, model weight signature verification + safetensors-only loading) MUST close the gap before SBOM-as-deliverable compliance can be accepted.",
393
+ "framework_lag_declaration": "Supply-chain frameworks have advanced fastest of any class in this exceptd release, but implementation gaps are pervasive. NIST 800-53 SA-12, NIST 800-218 SSDF, ISO 27001:2022 A.8.30/A.5.20, SOC 2 CC9.2, PCI DSS 4.0 sect.6.3, NIS2 Art.21(2)(d), DORA Art.28, EU CRA Art.13/14 all permit (a) SBOM as deliverable without continuous correlation, (b) lockfile-pinning without integrity hash, (c) direct-deps-only SBOM, (d) absence of VEX statements, (e) absence of AI-generated-code provenance, (f) model weights treated as content blobs. Lag = ~90 days behind operational tooling (SLSA / Sigstore / in-toto / VEX-CSAF) and ~210 days behind AI-coding-assistant adoption tempo. Compensating controls (continuous CVE correlation, integrity-pinned lockfiles, transitive SBOM completeness, VEX maintenance, AI-code provenance, model weight signature verification + safetensors-only loading) MUST close the gap before SBOM-as-deliverable compliance can be accepted. UK CAF Principles B5 (Resilient Networks & Systems) and D1 (Response and Recovery Planning) treat supply-chain assurance and recovery readiness as outcomes, with no Principle binding continuous CVE correlation against the shipped SBOM or VEX maintenance as evidence. AU Essential 8 ML2 Patch Applications (E8 M.2) plus ACSC ISM-0717 (supply-chain risk management) and ISM-1657 (vendor assessment) cover supply-chain due diligence, but Essential 8 patch-tempo evidence accepts vendor advisories without requiring SBOM-driven transitive-CVE correlation or AI-generated-code provenance.",
394
394
  "skill_chain": [
395
395
  {
396
396
  "skill": "supply-chain-integrity",
@@ -76,6 +76,8 @@
76
76
  "nis2",
77
77
  "dora",
78
78
  "uk-caf",
79
+ "au-ism",
80
+ "au-essential-8",
79
81
  "hipaa"
80
82
  ]
81
83
  },
@@ -138,6 +140,18 @@
138
140
  "california_resident_records_affected",
139
141
  "containment_record"
140
142
  ]
143
+ },
144
+ {
145
+ "jurisdiction": "AU",
146
+ "regulation": "Privacy Act 1988 — Notifiable Data Breaches scheme (s26WK)",
147
+ "obligation": "notify_regulator",
148
+ "window_hours": 720,
149
+ "clock_starts": "analyze_complete",
150
+ "evidence_required": [
151
+ "secret_inventory",
152
+ "australian_resident_records_affected",
153
+ "remediation_completed_evidence"
154
+ ]
141
155
  }
142
156
  ],
143
157
  "theater_fingerprints": [
@@ -227,7 +241,7 @@
227
241
  "monitor": 60,
228
242
  "close": 30
229
243
  },
230
- "framework_lag_declaration": "GDPR Art.32, ISO A.8.24, PCI-DSS Req.3, SOC 2 CC6.1 collectively cover encryption + key management + access control in production storage backends. None of them name 'secret in source artifact' as a distinct exposure category, despite this being the dominant 2025-2026 cloud-compromise vector. NIS2 Art.21(2)(j) names cryptography but not development-workflow exposure. Gap = ~30 days between developer commit and framework's quarterly access-review cadence; in practice, scraper bots exploit faster than any framework cadence.",
244
+ "framework_lag_declaration": "GDPR Art.32, ISO A.8.24, PCI-DSS Req.3, SOC 2 CC6.1 collectively cover encryption + key management + access control in production storage backends. None of them name 'secret in source artifact' as a distinct exposure category, despite this being the dominant 2025-2026 cloud-compromise vector. NIS2 Art.21(2)(j) names cryptography but not development-workflow exposure. Gap = ~30 days between developer commit and framework's quarterly access-review cadence; in practice, scraper bots exploit faster than any framework cadence. UK CAF Principle B2 (Identity and Access Control) treats credential lifecycle as an outcome reviewable on cycle, not as a per-commit scanning obligation — secrets embedded in source artifacts do not register against B2 evidence. AU Essential 8 ML2 MFA (E8 M.4) + Restrict Admin Privileges (E8 M.5) and ISM-1546 cover MFA + admin-account hygiene but provide no signal on long-lived bearer-token exposure inside developer repositories.",
231
245
  "skill_chain": [
232
246
  {
233
247
  "skill": "dlp-gap-analysis",
@@ -31,7 +31,7 @@ const fs = require("fs");
31
31
  const path = require("path");
32
32
  const { scoreCustom, RWEP_WEIGHTS, ACTIVE_EXPLOITATION_LADDER } = require("./scoring");
33
33
 
34
- // C: stored rwep_factors must reproduce the stored rwep_score.
34
+ // Stored rwep_factors must reproduce the stored rwep_score.
35
35
  // `buildScoringInputs` is the single source of truth for both — it captures
36
36
  // the conservative defaults applied to a freshly-imported KEV draft (CISA
37
37
  // only lists vulnerabilities with documented exploitation, so we assume a
@@ -199,7 +199,7 @@ function buildKevDraftEntry(kevEntry, nvdPayload, epssPayload) {
199
199
  const knownRansomware =
200
200
  String(kevEntry.knownRansomwareCampaignUse || "").toLowerCase() === "known";
201
201
 
202
- // C: stored rwep_factors and computed rwep_score MUST agree.
202
+ // Stored rwep_factors and computed rwep_score MUST agree.
203
203
  // Previously rwep_factors held nulls (for unknown poc/ai/reboot) but
204
204
  // rwep_score was computed from concrete defaults (poc=true, reboot=true).
205
205
  // `scoring.validate()` then flagged every auto-imported draft for
@@ -19,12 +19,12 @@ const ROOT = path.join(__dirname, '..');
19
19
  const DATA_DIR = process.env.EXCEPTD_DATA_DIR || path.join(ROOT, 'data');
20
20
  const INDEX_DIR = path.join(DATA_DIR, '_indexes');
21
21
 
22
- // DD P1-1: cache entries store the parsed payload AND the mtimeMs of the
23
- // source file at parse-time. Each load call re-stats the file; if mtime
24
- // matches, the cached value is returned (one syscall, no parse). If mtime
25
- // changed, re-parse + repopulate. If stat fails (file vanished mid-run,
26
- // permission glitch), fall back to the cached value. Pre-fix the cache was
27
- // process-lifetime long-running `orchestrator watch` processes never saw
22
+ // Cache entries store the parsed payload AND the mtimeMs of the source
23
+ // file at parse-time. Each load call re-stats the file; if mtime matches,
24
+ // the cached value is returned (one syscall, no parse). If mtime changed,
25
+ // re-parse + repopulate. If stat fails (file vanished mid-run, permission
26
+ // glitch), fall back to the cached value. Without mtime-keyed
27
+ // invalidation, long-running `orchestrator watch` processes never see
28
28
  // `data/cve-catalog.json` mutations driven by `exceptd refresh --apply`.
29
29
  const _cache = new Map();
30
30
 
@@ -106,13 +106,14 @@ function entries(catalog) {
106
106
  * that references it across skills, framework gaps, theater fingerprints,
107
107
  * recipes, and zero-day lessons.
108
108
  *
109
- * FF P1-4: auto-imported drafts (entries with `_auto_imported === true`) are
109
+ * Auto-imported drafts (entries with `_auto_imported === true`) are
110
110
  * EXCLUDED by default. Drafts carry conservative-default mechanical fields
111
111
  * and null analytical fields pending curation; downstream analyze / bundle
112
- * emitters that assume `byCve()` returns curated data would treat the draft's
113
- * placeholders as authoritative. The cve-curation flow (which surfaces the
114
- * editorial questionnaire) opts in via `byCve(id, { include_drafts: true })`.
115
- * Every other caller stays on the default exclude path.
112
+ * emitters that assume `byCve()` returns curated data would treat the
113
+ * draft's placeholders as authoritative. The cve-curation flow (which
114
+ * surfaces the editorial questionnaire) opts in via
115
+ * `byCve(id, { include_drafts: true })`; every other caller stays on the
116
+ * default exclude path.
116
117
  */
117
118
  function byCve(cveId, opts) {
118
119
  const includeDrafts = !!(opts && opts.include_drafts);
@@ -76,7 +76,7 @@ function loadCveEntrySchema() {
76
76
  }
77
77
  }
78
78
 
79
- // J7: lazy-loaded module-level catalog cache. The ATLAS / ATT&CK / CWE /
79
+ // Lazy-loaded module-level catalog cache. The ATLAS / ATT&CK / CWE /
80
80
  // framework-control-gaps catalogs don't change inside a single CLI process,
81
81
  // so re-reading them per `curate()` call is wasted I/O. Cache once per
82
82
  // process; batch-curate paths (future) get the speedup for free.
@@ -87,7 +87,7 @@ function loadJsonRaw(absPath) {
87
87
  catch { return null; }
88
88
  }
89
89
 
90
- // J4: resolve a catalog path that may be absolute (operator passed
90
+ // Resolve a catalog path that may be absolute (operator passed
91
91
  // `--catalog C:\tmp\cat.json` or `/tmp/cat.json`) or repo-relative. Plain
92
92
  // `path.join(ROOT, abs)` mishandles absolute paths on Windows.
93
93
  function resolveCatalogPath(p) {
@@ -141,11 +141,10 @@ function pickCandidates(draftDigest, catalog, idField, descriptionField) {
141
141
  return candidates.slice(0, 5);
142
142
  }
143
143
 
144
- // J5: report the actual upstream source on a draft. The previous check
145
- // only knew about `_source_ghsa_id`; OSV-imported drafts (MAL-*, SNYK-*,
146
- // RUSTSEC-*, etc. that land via lib/source-osv.js) carry `_source_osv_id`
147
- // and were always tagged "unknown". Add a registry so future sources are
148
- // a one-line addition.
144
+ // Report the actual upstream source on a draft. A check that only knows
145
+ // about `_source_ghsa_id` would tag every OSV-imported draft (MAL-*,
146
+ // SNYK-*, RUSTSEC-*, etc. that land via lib/source-osv.js) as "unknown".
147
+ // The registry makes future sources a one-line addition.
149
148
  const SOURCE_FIELDS = [
150
149
  { field: "_source_ghsa_id", label: "GHSA" },
151
150
  { field: "_source_osv_id", label: "OSV" },
@@ -161,9 +160,9 @@ function autoImportedFrom(draft) {
161
160
  return "unknown";
162
161
  }
163
162
 
164
- // J3: severity word. cvss_score: null no longer collapses to "low" (which
165
- // is wrong + misleading on a draft that has not been scored yet). Use
166
- // "unrated" so operators can grep for unsevered drafts and the curate
163
+ // Severity word. cvss_score: null returns "unrated" collapsing it to
164
+ // "low" would be wrong + misleading on a draft that has not been scored
165
+ // yet. "unrated" lets operators grep for unscored drafts and the curate
167
166
  // summary reflects the actual state.
168
167
  function severityWord(score) {
169
168
  if (typeof score !== "number" || Number.isNaN(score)) return "unrated";
@@ -173,7 +172,7 @@ function severityWord(score) {
173
172
  return "low";
174
173
  }
175
174
 
176
- // J2: the fields the strict CVE schema requires. Used to (a) extend the
175
+ // The fields the strict CVE schema requires. Used to (a) extend the
177
176
  // questionnaire so the operator is prompted for every blocking gap, and
178
177
  // (b) compute `residual_warnings` after an apply.
179
178
  const REQUIRED_SCHEMA_FIELDS = [
@@ -300,10 +299,10 @@ function buildQuestionnaire(cveId, draft) {
300
299
  // specific ASK to surface what the reviewer needs to decide.
301
300
  const questions = [];
302
301
 
303
- // J6: pre-filled empty containers (`iocs: {}`, `atlas_refs: []`) used to
304
- // be treated as "answered" because `if (!draft.iocs)` is truthy for {}.
305
- // Use explicit emptiness checks so drafts seeded with empty objects /
306
- // arrays still get the prompt.
302
+ // Pre-filled empty containers (`iocs: {}`, `atlas_refs: []`) must NOT
303
+ // be treated as "answered". `if (!draft.iocs)` is truthy for {}, which
304
+ // would skip the prompt. Use explicit emptiness checks so drafts
305
+ // seeded with empty objects / arrays still get the prompt.
307
306
  const arrEmpty = (a) => !Array.isArray(a) || a.length === 0;
308
307
  const objEmpty = (o) => !o || typeof o !== "object" || Object.keys(o).length === 0;
309
308
 
@@ -380,9 +379,9 @@ function buildQuestionnaire(cveId, draft) {
380
379
  });
381
380
  }
382
381
 
383
- // J2: schema-required field prompts. Without these populated, the apply
384
- // path cannot produce a schema-passing entry — i.e. the entry stays a
385
- // draft even after curate --apply. Prompt for them explicitly so the
382
+ // Schema-required field prompts. Without these populated, the apply
383
+ // path cannot produce a schema-passing entry — the entry stays a draft
384
+ // even after curate --apply. Prompt for them explicitly so the
386
385
  // operator sees what's actually blocking promotion.
387
386
  if (draft.cvss_score === null || draft.cvss_score === undefined
388
387
  || draft.cvss_vector === null || draft.cvss_vector === undefined
@@ -460,7 +459,7 @@ function buildQuestionnaire(cveId, draft) {
460
459
  }
461
460
 
462
461
  /**
463
- * J1: apply operator-supplied answers to a draft and write back atomically.
462
+ * Apply operator-supplied answers to a draft and write back atomically.
464
463
  *
465
464
  * Answers shape (each key optional; missing keys leave the draft unchanged
466
465
  * for that field):
@@ -162,11 +162,11 @@ function readJson(p) {
162
162
  function parseFrontmatter(text) {
163
163
  const lines = text.split(/\r?\n/);
164
164
  const result = {};
165
- // S4: track every top-level key we've already assigned. YAML's
166
- // last-wins semantics would let a tampered skill set name twice
167
- // ("name: real-skill\nname: evil-skill") and silently take the
168
- // second value — a skill-identity spoofing primitive. Refuse
169
- // duplicates outright; an honest skill never has them.
165
+ // Track every top-level key we've already assigned. YAML's last-wins
166
+ // semantics would let a tampered skill set name twice
167
+ // ("name: real-skill\nname: evil-skill") and silently take the second
168
+ // value — a skill-identity spoofing primitive. Refuse duplicates
169
+ // outright; an honest skill never has them.
170
170
  const seenKeys = new Set();
171
171
  let i = 0;
172
172
  while (i < lines.length) {