@blamejs/exceptd-skills 0.14.28 → 0.15.1

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.
Files changed (61) hide show
  1. package/ARCHITECTURE.md +2 -2
  2. package/CHANGELOG.md +22 -0
  3. package/README.md +5 -1
  4. package/bin/exceptd.js +0 -147
  5. package/data/_indexes/_meta.json +45 -45
  6. package/data/_indexes/section-offsets.json +804 -795
  7. package/data/_indexes/summary-cards.json +3 -3
  8. package/data/_indexes/token-budget.json +506 -501
  9. package/data/cve-catalog.json +154 -7
  10. package/data/zeroday-lessons.json +1 -1
  11. package/lib/gap-detectors.js +8 -2
  12. package/lib/lint-skills.js +13 -2
  13. package/lib/playbook-runner.js +0 -2
  14. package/lib/validate-cve-catalog.js +35 -12
  15. package/manifest.json +84 -84
  16. package/orchestrator/index.js +49 -5
  17. package/package.json +2 -2
  18. package/sbom.cdx.json +119 -119
  19. package/scripts/check-catalog-gap-budget.js +5 -1
  20. package/scripts/check-test-coverage.js +9 -0
  21. package/scripts/predeploy.js +8 -4
  22. package/skills/age-gates-child-safety/skill.md +7 -7
  23. package/skills/ai-attack-surface/skill.md +1 -1
  24. package/skills/ai-c2-detection/skill.md +3 -3
  25. package/skills/ai-risk-management/skill.md +9 -9
  26. package/skills/api-security/skill.md +4 -4
  27. package/skills/cloud-security/skill.md +7 -7
  28. package/skills/compliance-theater/skill.md +4 -4
  29. package/skills/container-runtime-security/skill.md +6 -6
  30. package/skills/coordinated-vuln-disclosure/skill.md +12 -12
  31. package/skills/defensive-countermeasure-mapping/skill.md +14 -10
  32. package/skills/dlp-gap-analysis/skill.md +3 -3
  33. package/skills/email-security-anti-phishing/skill.md +6 -6
  34. package/skills/exploit-scoring/skill.md +2 -2
  35. package/skills/framework-gap-analysis/skill.md +6 -6
  36. package/skills/fuzz-testing-strategy/skill.md +1 -1
  37. package/skills/global-grc/skill.md +2 -2
  38. package/skills/identity-assurance/skill.md +5 -5
  39. package/skills/idp-incident-response/skill.md +5 -5
  40. package/skills/incident-response-playbook/skill.md +8 -8
  41. package/skills/kernel-lpe-triage/skill.md +4 -4
  42. package/skills/mcp-agent-trust/skill.md +3 -3
  43. package/skills/mlops-security/skill.md +5 -5
  44. package/skills/ot-ics-security/skill.md +7 -7
  45. package/skills/policy-exception-gen/skill.md +2 -2
  46. package/skills/pqc-first/skill.md +2 -2
  47. package/skills/rag-pipeline-security/skill.md +2 -2
  48. package/skills/ransomware-response/skill.md +9 -9
  49. package/skills/researcher/skill.md +11 -11
  50. package/skills/sector-energy/skill.md +6 -6
  51. package/skills/sector-federal-government/skill.md +2 -2
  52. package/skills/sector-financial/skill.md +4 -4
  53. package/skills/sector-healthcare/skill.md +6 -6
  54. package/skills/sector-telecom/skill.md +1 -1
  55. package/skills/security-maturity-tiers/skill.md +4 -4
  56. package/skills/skill-update-loop/skill.md +6 -6
  57. package/skills/supply-chain-integrity/skill.md +1 -1
  58. package/skills/threat-model-currency/skill.md +3 -3
  59. package/skills/threat-modeling-methodology/skill.md +9 -9
  60. package/skills/webapp-security/skill.md +7 -7
  61. package/skills/zeroday-gap-learn/skill.md +8 -8
package/ARCHITECTURE.md CHANGED
@@ -176,7 +176,7 @@ Tracks PoC status, weaponization stage, and AI-assist factor per CVE. Updated wh
176
176
 
177
177
  ### `data/cwe-catalog.json`
178
178
 
179
- 171 CWE entries pinned to **CWE v4.20**. Covers the Top 25 Most Dangerous Software Weaknesses (2024 release) plus AI- and supply-chain-relevant weakness classes (prompt-injection-as-trust-boundary failure, training data integrity, dependency confusion, untrusted artifact ingestion). Each entry records root-cause description, common consequences, mitigation patterns, and the CVEs in `cve-catalog.json` that instantiate the weakness. Skills cite CWE IDs in `cwe_refs` to anchor a finding to a stable weakness taxonomy rather than to a single CVE; the CWE provides the durable root-cause lens that survives across exploit generations.
179
+ 173 CWE entries pinned to **CWE v4.20**. Covers the Top 25 Most Dangerous Software Weaknesses (2024 release) plus AI- and supply-chain-relevant weakness classes (prompt-injection-as-trust-boundary failure, training data integrity, dependency confusion, untrusted artifact ingestion). Each entry records root-cause description, common consequences, mitigation patterns, and the CVEs in `cve-catalog.json` that instantiate the weakness. Skills cite CWE IDs in `cwe_refs` to anchor a finding to a stable weakness taxonomy rather than to a single CVE; the CWE provides the durable root-cause lens that survives across exploit generations.
180
180
 
181
181
  `_meta.cwe_version` pins the version; on a CWE release, audit IDs for renames or deprecations, bump `last_threat_review` on affected skills, and update `_meta`.
182
182
 
@@ -188,7 +188,7 @@ Tracks PoC status, weaponization stage, and AI-assist factor per CVE. Updated wh
188
188
 
189
189
  ### `data/rfc-references.json`
190
190
 
191
- 31 IETF RFC / Internet-Draft references covering authentication and authorization (OAuth 2.0 Security BCP RFC 9700, JWT BCP, FIDO/WebAuthn-related drafts), cryptography (TLS 1.3 RFC 8446, hybrid PQC drafts), disclosure (security.txt RFC 9116), and adjacent IETF standards skills depend on. Each entry tracks: title, status (Proposed Standard / Best Current Practice / Internet-Draft / Historic), errata count, replaces / replaced-by chains, IESG / IRTF stream, and a `last_verified` date. Skills cite RFC IDs in `rfc_refs`. Per Hard Rule #12, RFC references are version-pinned: when an RFC is obsoleted or a draft is published as an RFC, the catalog entry's `replaced_by` field is updated, `last_verified` is refreshed, and affected skills bump `last_threat_review`. Frameworks lag RFCs; RFCs lag attacker innovation — this catalog makes that middle layer auditable.
191
+ 8888 IETF RFC / Internet-Draft references the full RFC index, including obsoleted and Historic entries so that a superseded RFC still resolves offline. Coverage spans the security-relevant standards skills depend on — authentication and authorization (OAuth 2.0 Security BCP RFC 9700, JWT BCP, FIDO/WebAuthn-related drafts), cryptography (TLS 1.3 RFC 8446, hybrid PQC drafts), disclosure (security.txt RFC 9116) alongside the rest of the published RFC series. Each entry tracks: title, status (Internet Standard / Proposed Standard / Best Current Practice / Internet-Draft / Historic), errata count, replaces / replaced-by chains, IESG / IRTF stream, and a `last_verified` date. Skills cite RFC IDs in `rfc_refs`. Per Hard Rule #12, RFC references are version-pinned: when an RFC is obsoleted or a draft is published as an RFC, the catalog entry's `replaced_by` field is updated, `last_verified` is refreshed, and affected skills bump `last_threat_review`. Frameworks lag RFCs; RFCs lag attacker innovation — this catalog makes that middle layer auditable.
192
192
 
193
193
  ### `data/dlp-controls.json`
194
194
 
package/CHANGELOG.md CHANGED
@@ -1,5 +1,27 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.15.1 — 2026-05-29
4
+
5
+ Skill content and catalog hygiene.
6
+
7
+ Every skill now describes its requirements in its own terms. References that pointed at the project's internal contributor guide by name or number — "per AGENTS.md", "Hard Rule #N", "DR-N" — have been replaced with the substance of the rule, since an operator reading a shipped skill cannot resolve those pointers. The behavior each rule mandates is unchanged and stated inline (CVSS reported alongside RWEP, global-first jurisdiction coverage, the zero-day learning loop, no orphaned controls, and so on). Version stamps left in skill frontmatter comments were removed.
8
+
9
+ Seven flagship actively-exploited catalog entries — runc "Leaky Vessels" (CVE-2024-21626), the xz-utils backdoor (CVE-2024-3094), SolarWinds Orion (CVE-2020-10148), Citrix NetScaler (CVE-2023-3519), ConnectWise ScreenConnect (CVE-2024-1709), Cisco SD-WAN (CVE-2026-20182), and Fortinet FortiOS (CVE-2024-21762) — now carry structured `vendor_advisories` (vendor, advisory id, URL, published date) drawn from their verified public advisories.
10
+
11
+ ## 0.15.0 — 2026-05-28
12
+
13
+ Validation and gate hardening. Several catalog and skill integrity checks that had been deferred as non-blocking warnings now hard-fail the predeploy gate, and two latent gate weaknesses are closed.
14
+
15
+ Catalog, skill, and playbook validation now runs in strict mode in the release gate: an unresolved cross-catalog reference (a CVE citing a CWE / ATT&CK / ATLAS / D3FEND id or framework control that doesn't exist), a CVSS vector that doesn't match a known `CVSS:(2.0|3.0|3.1|4.0)/` prefix, a `cisa_kev: true` entry missing its listing date, a public-PoC entry missing IOCs (Hard Rule #14), an incomplete skill body, or playbook enum/symmetry drift now block a release instead of scrolling past as warnings. Auto-imported drafts remain exempt.
16
+
17
+ The `_meta.entry_count` drift guard now covers every catalog that declares the field, not only framework-control-gaps — closing the hole that had let the zero-day-lessons counter drift to 68 while the file held 422 (now corrected). The RWEP scoring invariants (Shape A/B/mixed factor detection and recomputed-vs-stored divergence) are now enforced against the shipped catalog by a test gate, where previously they ran only against synthetic fixtures.
18
+
19
+ The `temporal-staleness` catalog-gap class now counts curated entries only. A CISA KEV due-date passing by calendar drift on the un-curated bulk-import backlog is expected and no longer accrues against the budget — which had crept to one slot of headroom and would have failed a future release with no code change. The budget is retightened to reflect the curated-only count.
20
+
21
+ CLI surface cleanup. The dead handlers behind the verbs removed in 0.13.0 (`govern`, `direct`, `look`, `ingest`) are gone, and those verbs are no longer surfaced as "did you mean" suggestions. Unknown-flag rejection now covers `report`, `watch`, `framework-gap`, and `skill` (an unrecognized flag on these hard-fails with a structured envelope, matching the rest of the surface). The local-only `scan`, `dispatch`, and `currency` verbs now accept `--air-gap` / `--offline` / `--no-network` instead of rejecting the tool's own global flags. The `--format summary` evidence bundle no longer carries always-null `feeds_into` / `jurisdiction_clocks_active` keys (the populated values come from the close phase).
22
+
23
+ Documentation: corrected catalog counts (427 CVEs, 173 CWEs, the full 8888-entry RFC index) and documented the `report` verb in the CLI reference.
24
+
3
25
  ## 0.14.28 — 2026-05-28
4
26
 
5
27
  Catalog expansion — 2025 actively-exploited perimeter and file-transfer RCE cluster. Four CISA KEV-listed, ransomware-associated entries are now fully curated with RWEP scoring, IOCs, zero-day lessons, and reverse-referenced CWE/ATT&CK/framework mappings:
package/README.md CHANGED
@@ -30,7 +30,7 @@ This platform surfaces what is actually happening right now. Every skill explici
30
30
 
31
31
  ## Status
32
32
 
33
- Pre-1.0. Latest release lives on [GitHub Releases](https://github.com/blamejs/exceptd-skills/releases) and on npm as [`@blamejs/exceptd-skills`](https://www.npmjs.com/package/@blamejs/exceptd-skills) with signed npm provenance attestation and Ed25519-signed skill bodies. The package ships 42 skills across kernel LPE, MCP supply chain, AI-as-C2, prompt injection, post-quantum crypto, SBOM integrity, identity-incident response, and 35 other AI/security domains, plus 10 intelligence catalogs (CVE / ATLAS / ATT&CK / CWE / D3FEND / DLP / RFC / framework gaps / global frameworks / zero-day lessons) covering 35 jurisdictions — the CVE catalog has grown past 400 entries, its size anchored by a v0.13.17 CISA KEV bulk-intake of `dateAdded >= 2024-01-01` actively-exploited vulnerabilities that took it from 68 to 312 in a single pass. 24 investigation playbooks (kernel, MCP, AI-API, framework, SBOM, runtime, hardening, secrets, cred-stores, containers, crypto, plus `webhook-callback-abuse`, `cicd-pipeline-compromise`, `identity-sso-compromise`, `llm-tool-use-exfil`, `post-quantum-migration`, `ai-discovered-cve-triage`, `supply-chain-recovery`, `citation-hygiene`, and more), a CLI for discovery and seven-phase investigation runs (`govern → direct → look → detect → analyze → validate → close`), and a nightly auto-refresh job that pulls KEV / NVD / EPSS / GHSA / OSV / IETF deltas plus 15 primary-source advisory + research-blog + tech-press feeds (Qualys TRU, Red Hat RHSA, Ubuntu USN, ZDI, kernel.org, oss-security, JFrog, CISA, Microsoft Security Blog, Sysdig, Trail of Bits, Embrace the Red, BleepingComputer security, The Hacker News, and a GitLab activity-feed tracker for the Nightmare-Eclipse researcher handle that anchors NEW-CTRL-073) into auto-PRs for editorial review. v0.13.17 also ships `lib/cve-regression-watcher.js` (NEW-CTRL-074) — a complementary detection method that surfaces poller-diff historical-CVE references as candidate silent-regression cases, the class anchored by MiniPlasma (a 2026 PoC drop that re-broke CVE-2020-17103 without any new ID being assigned).
33
+ Pre-1.0. Latest release lives on [GitHub Releases](https://github.com/blamejs/exceptd-skills/releases) and on npm as [`@blamejs/exceptd-skills`](https://www.npmjs.com/package/@blamejs/exceptd-skills) with signed npm provenance attestation and Ed25519-signed skill bodies. The package ships 42 skills across kernel LPE, MCP supply chain, AI-as-C2, prompt injection, post-quantum crypto, SBOM integrity, identity-incident response, and 35 other AI/security domains, plus 11 intelligence catalogs (CVE / ATLAS / ATT&CK / CWE / D3FEND / DLP / RFC / framework gaps / global frameworks / zero-day lessons / exploit availability) covering 35 jurisdictions — the CVE catalog has grown past 400 entries, its size anchored by a v0.13.17 CISA KEV bulk-intake of `dateAdded >= 2024-01-01` actively-exploited vulnerabilities that took it from 68 to 312 in a single pass. 24 investigation playbooks (kernel, MCP, AI-API, framework, SBOM, runtime, hardening, secrets, cred-stores, containers, crypto, plus `webhook-callback-abuse`, `cicd-pipeline-compromise`, `identity-sso-compromise`, `llm-tool-use-exfil`, `post-quantum-migration`, `ai-discovered-cve-triage`, `supply-chain-recovery`, `citation-hygiene`, and more), a CLI for discovery and seven-phase investigation runs (`govern → direct → look → detect → analyze → validate → close`), and a nightly auto-refresh job that pulls KEV / NVD / EPSS / GHSA / OSV / IETF deltas plus 15 primary-source advisory + research-blog + tech-press feeds (Qualys TRU, Red Hat RHSA, Ubuntu USN, ZDI, kernel.org, oss-security, JFrog, CISA, Microsoft Security Blog, Sysdig, Trail of Bits, Embrace the Red, BleepingComputer security, The Hacker News, and a GitLab activity-feed tracker for the Nightmare-Eclipse researcher handle that anchors NEW-CTRL-073) into auto-PRs for editorial review. v0.13.17 also ships `lib/cve-regression-watcher.js` (NEW-CTRL-074) — a complementary detection method that surfaces poller-diff historical-CVE references as candidate silent-regression cases, the class anchored by MiniPlasma (a 2026 PoC drop that re-broke CVE-2020-17103 without any new ID being assigned).
34
34
 
35
35
  ---
36
36
 
@@ -488,6 +488,10 @@ exceptd skill <name> Show context for one skill.
488
488
  exceptd framework-gap <FW> <ref> One framework + one CVE/scenario, JSON
489
489
  or human. (Operates outside the seven-
490
490
  phase contract for ad-hoc gap analysis.)
491
+ exceptd report [executive] Structured posture report. Bare `report`
492
+ emits the full posture; the optional
493
+ `executive` argument emits the
494
+ executive-summary view.
491
495
  exceptd path Absolute path to the installed package.
492
496
  exceptd version Package version.
493
497
  exceptd help This help.
package/bin/exceptd.js CHANGED
@@ -159,12 +159,7 @@ const COMMANDS = {
159
159
  cve: () => path.join(PKG_ROOT, "lib", "cve-cli.js"),
160
160
  rfc: () => path.join(PKG_ROOT, "lib", "rfc-cli.js"),
161
161
  // Seven-phase playbook verbs — handled in-process via lib/playbook-runner.js.
162
- plan: null,
163
- govern: null,
164
- direct: null,
165
- look: null,
166
162
  run: null,
167
- ingest: null,
168
163
  reattest: null,
169
164
  };
170
165
 
@@ -1724,12 +1719,7 @@ function dispatchPlaybook(cmd, argv) {
1724
1719
 
1725
1720
  try {
1726
1721
  switch (cmd) {
1727
- case "plan": return cmdPlan(runner, args, runOpts, pretty);
1728
- case "govern": return cmdGovern(runner, args, runOpts, pretty);
1729
- case "direct": return cmdDirect(runner, args, pretty);
1730
- case "look": return cmdLook(runner, args, runOpts, pretty);
1731
1722
  case "run": return cmdRun(runner, args, runOpts, pretty);
1732
- case "ingest": return cmdIngest(runner, args, runOpts, pretty);
1733
1723
  case "reattest": return cmdReattest(runner, args, runOpts, pretty);
1734
1724
  case "list-attestations": return cmdListAttestations(runner, args, runOpts, pretty);
1735
1725
  case "attest": return cmdAttest(runner, args, runOpts, pretty);
@@ -3179,36 +3169,6 @@ function detectScopes() {
3179
3169
  return detected.length ? detected : ["cross-cutting"];
3180
3170
  }
3181
3171
 
3182
- function cmdGovern(runner, args, runOpts, pretty) {
3183
- const playbookId = args._[0];
3184
- if (!playbookId) return emitError("govern: missing <playbookId> positional argument.", null, pretty);
3185
- if (refuseInvalidPlaybookId("govern", playbookId, pretty)) return;
3186
- const pb = runner.loadPlaybook(playbookId);
3187
- const directiveId = args.directive || (pb.directives[0] && pb.directives[0].id);
3188
- if (!directiveId) return refuseNoDirectives("govern", playbookId, pretty);
3189
- emit(runner.govern(playbookId, directiveId, runOpts), pretty);
3190
- }
3191
-
3192
- function cmdDirect(runner, args, pretty) {
3193
- const playbookId = args._[0];
3194
- if (!playbookId) return emitError("direct: missing <playbookId> positional argument.", null, pretty);
3195
- if (refuseInvalidPlaybookId("direct", playbookId, pretty)) return;
3196
- const pb = runner.loadPlaybook(playbookId);
3197
- const directiveId = args.directive || (pb.directives[0] && pb.directives[0].id);
3198
- if (!directiveId) return refuseNoDirectives("direct", playbookId, pretty);
3199
- emit(runner.direct(playbookId, directiveId), pretty);
3200
- }
3201
-
3202
- function cmdLook(runner, args, runOpts, pretty) {
3203
- const playbookId = args._[0];
3204
- if (!playbookId) return emitError("look: missing <playbookId> positional argument.", null, pretty);
3205
- if (refuseInvalidPlaybookId("look", playbookId, pretty)) return;
3206
- const pb = runner.loadPlaybook(playbookId);
3207
- const directiveId = args.directive || (pb.directives[0] && pb.directives[0].id);
3208
- if (!directiveId) return refuseNoDirectives("look", playbookId, pretty);
3209
- emit(runner.look(playbookId, directiveId, runOpts), pretty);
3210
- }
3211
-
3212
3172
  function cmdRun(runner, args, runOpts, pretty) {
3213
3173
  const positional = args._[0];
3214
3174
 
@@ -4351,113 +4311,6 @@ function cmdRunMulti(runner, ids, args, runOpts, pretty, meta) {
4351
4311
  if (anyBlocked) { process.exitCode = EXIT_CODES.GENERIC_FAILURE; return; }
4352
4312
  }
4353
4313
 
4354
- function cmdIngest(runner, args, runOpts, pretty) {
4355
- // `ingest` matches the AGENTS.md ingest contract. The submission JSON may
4356
- // carry playbook_id + directive_id; --domain/--directive flags override.
4357
- let submission = {};
4358
- // Auto-detect piped stdin (parity with cmdRun) so
4359
- // `echo '{...}' | exceptd ingest` reads the routing JSON instead of
4360
- // failing with "no playbook resolved" because args.evidence stays
4361
- // undefined.
4362
- // Route stdin auto-detection through hasReadableStdin() (see cmdRun for
4363
- // rationale). Wrapped-stdin test harnesses (Mocha/Jest, Docker
4364
- // stdin-passthrough) would otherwise block here forever on the
4365
- // readFileSync(0) call when isTTY === undefined.
4366
- if (!args.evidence && hasReadableStdin()) {
4367
- args.evidence = "-";
4368
- }
4369
- if (args.evidence) {
4370
- try {
4371
- submission = readEvidence(args.evidence);
4372
- } catch (e) {
4373
- return emitError(`ingest: failed to read evidence: ${e.message}`, { evidence: args.evidence }, pretty);
4374
- }
4375
- }
4376
- const playbookId = args.domain || submission.playbook_id || submission.domain;
4377
- if (!playbookId) return emitError("ingest: no playbook resolved — pass --domain <id> or include playbook_id in evidence JSON.", null, pretty);
4378
- if (refuseInvalidPlaybookId("ingest", playbookId, pretty)) return;
4379
- const pb = runner.loadPlaybook(playbookId);
4380
- const directiveId = args.directive
4381
- || submission.directive_id
4382
- || (pb.directives[0] && pb.directives[0].id);
4383
- if (!directiveId) return refuseNoDirectives("ingest", playbookId, pretty);
4384
-
4385
- // Strip the routing keys so the runner only sees the contract shape it
4386
- // expects. precondition_checks travel on the submission (not lifted into
4387
- // runOpts) so run()'s mergedPCs derives them with correct "submission"
4388
- // provenance — the same path cmdRun uses.
4389
- const cleanedSubmission = {
4390
- artifacts: submission.artifacts || {},
4391
- signal_overrides: submission.signal_overrides || {},
4392
- signals: submission.signals || {},
4393
- ...(submission.precondition_checks ? { precondition_checks: submission.precondition_checks } : {}),
4394
- };
4395
-
4396
- const result = runner.run(playbookId, directiveId, cleanedSubmission, runOpts);
4397
-
4398
- // v0.12.8: route ingest's attestation persistence through persistAttestation
4399
- // — the same path cmdRun + cmdRunMulti use — so the session-id collision
4400
- // refusal AND the Ed25519 sidecar signing both apply. Pre-v0.12.8 ingest
4401
- // had its own inline writeFileSync with neither check, meaning two ingest
4402
- // calls with the same session-id silently clobbered the audit trail and no
4403
- // .sig sidecar was written.
4404
- if (result && result.ok && result.session_id) {
4405
- // Mirror cmdRun / cmdRunMulti: gate operator_consent persistence on
4406
- // classification === 'detected'. --ack is meaningful only when a
4407
- // jurisdiction clock is at stake; persisting consent on a
4408
- // not-detected ingest forges audit-trail consent for a clock that
4409
- // never started.
4410
- const ingestClassification = result.phases && result.phases.detect ? result.phases.detect.classification : null;
4411
- const ingestConsentApplies = ingestClassification === "detected";
4412
- if (runOpts.operator_consent && !ingestConsentApplies) {
4413
- result.ack = true;
4414
- result.ack_applied = false;
4415
- result.ack_skipped_reason = `classification=${ingestClassification || "unknown"}; consent only persisted when classification=detected (jurisdiction clock at stake).`;
4416
- }
4417
- const persisted = persistAttestation({
4418
- sessionId: result.session_id,
4419
- playbookId: result.playbook_id,
4420
- directiveId: result.directive_id,
4421
- evidenceHash: result.evidence_hash,
4422
- operator: runOpts.operator,
4423
- operatorConsent: ingestConsentApplies ? runOpts.operator_consent : null,
4424
- submission: cleanedSubmission,
4425
- runOpts,
4426
- forceOverwrite: !!args["force-overwrite"],
4427
- filename: "attestation.json",
4428
- });
4429
- if (!persisted.ok) {
4430
- // Route every persist-failure shape through emitError so the
4431
- // emit() ok:false → exitCode contract applies uniformly. Three
4432
- // exit classes: LOCK_CONTENTION (transient), STORAGE_EXHAUSTED
4433
- // (infra), SESSION_ID_COLLISION (operator decision).
4434
- const ctx = { session_id: result.session_id, existing_path: persisted.existingPath };
4435
- if (persisted.lock_contention) {
4436
- ctx.lock_contention = true;
4437
- ctx.exit_code = EXIT_CODES.LOCK_CONTENTION;
4438
- }
4439
- if (persisted.storage_exhausted) {
4440
- ctx.storage_exhausted = true;
4441
- ctx.exit_code = EXIT_CODES.STORAGE_EXHAUSTED;
4442
- }
4443
- emitError(persisted.error, ctx, pretty);
4444
- if (persisted.lock_contention) process.exitCode = EXIT_CODES.LOCK_CONTENTION;
4445
- else if (persisted.storage_exhausted) process.exitCode = EXIT_CODES.STORAGE_EXHAUSTED;
4446
- else process.exitCode = EXIT_CODES.SESSION_ID_COLLISION;
4447
- return;
4448
- }
4449
- if (persisted.prior_session_id) {
4450
- result.attestation_persist = { ok: true, prior_session_id: persisted.prior_session_id, overwrote_at: persisted.overwrote_at };
4451
- }
4452
- }
4453
-
4454
- if (result && result.ok === false) {
4455
- emit(result, pretty);
4456
- return;
4457
- }
4458
- emit(result, pretty);
4459
- }
4460
-
4461
4314
  /**
4462
4315
  * Resolve the attestation root for a given run. Resolution order (most-specific
4463
4316
  * first):
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "schema_version": "1.1.0",
3
- "generated_at": "2026-05-28T22:39:58.047Z",
3
+ "generated_at": "2026-05-29T11:22:26.578Z",
4
4
  "generator": "scripts/build-indexes.js",
5
5
  "source_count": 54,
6
6
  "source_hashes": {
7
- "manifest.json": "1497a0bf6249faeabaa1e797ff2e7cec028351ddd4c27bda6721c95ff1e57d9c",
7
+ "manifest.json": "15c1fb4f9f54e1d2f724d9a9d501cfb4dc947916213ce45c67f7094e92de700b",
8
8
  "data/atlas-ttps.json": "878b4a08bb73c8d20396d85cf433a88f2bc5e7a8cbf7f6ab773ce7ede0a11251",
9
9
  "data/attack-techniques.json": "57b8a1b4e1c3f524a76b4bded09b3082b36b783db3df116f863892072e0f65e9",
10
- "data/cve-catalog.json": "5849b48dd5489ba6d10cbd3b0b25c9d8412e3932e0ae2304364ec95cf254ec97",
10
+ "data/cve-catalog.json": "de450425a3e953224ad79c4eaf85978faadde97c1d015afc3459295db8e60515",
11
11
  "data/cwe-catalog.json": "0fd275c2a61754958d68cea03a92794a67cf1c1d4d609f81a5728334df013ee3",
12
12
  "data/d3fend-catalog.json": "9a54bccb9f24f84b32024216cc3f53819a053721ac8ab43c326859e68fc0ffaf",
13
13
  "data/dlp-controls.json": "d2406c482dddd30e49203879999dc4b3a7fd4d0494d6a61d86b91ee76415df19",
@@ -15,49 +15,49 @@
15
15
  "data/framework-control-gaps.json": "29e7b6aa841ddf2530ca5971bdb60d7a715684b2f6264141ad49f0de9a039d78",
16
16
  "data/global-frameworks.json": "9ba563a85f7f8d6c3c957de64945e20925a89d0ed6ea6fc561cf093811acf558",
17
17
  "data/rfc-references.json": "b21d03b948c41bc8a854e2f057948ecf844bd8c105848aeb141d1eadf8192c31",
18
- "data/zeroday-lessons.json": "f12a823e8546785833a06ae69089d87640480f6d28dcff1265ed43d38ebec0ed",
19
- "skills/kernel-lpe-triage/skill.md": "08b3e9815ba481c57c80f5fc0ccbf5bb7cbb41f570c235ba6ff9596b8c07354d",
20
- "skills/ai-attack-surface/skill.md": "c4c1eb22a38ca7a959b5725222bab8fbd4f4044a548a93f3e288e6f698334b72",
21
- "skills/mcp-agent-trust/skill.md": "89ac89084391d2341b6513fefb1be2d36b93de1c130f057696219c1c59440f13",
22
- "skills/framework-gap-analysis/skill.md": "f7092b8d3efbcbf0b7af9a712a6705ad07ce4dd1abbd92762b5b395d6cbe6cca",
23
- "skills/compliance-theater/skill.md": "d656444bb1987f43ae61374f210977d0c1f247f54d7318fdd639dd0cfdbef392",
24
- "skills/exploit-scoring/skill.md": "f55e9aa4985ebad8a2a12092c937deb6939a639dc1e16e2214ecfa1c9b9402c4",
25
- "skills/rag-pipeline-security/skill.md": "792c6f48a7ff06785c24258cac1714068feafefb3f8f05e6c62ddce2f2f9128d",
26
- "skills/ai-c2-detection/skill.md": "de83dc284dc4f85a8a383c0b715ec7b9ea127ec49c3227bf4c72344bad4008ed",
27
- "skills/policy-exception-gen/skill.md": "238074319b57399c75d76439ef1ff67153b5a3207adf1556f3ca1e68cfe7cfaa",
28
- "skills/threat-model-currency/skill.md": "637861b4dcd2cb608c08c5aa62a8ef73efc976584f901e612c73cf53b3559422",
29
- "skills/global-grc/skill.md": "6d9722b7a85b8ad1150a61188b578f380e9c9685118028e134a0ba5804dae708",
30
- "skills/zeroday-gap-learn/skill.md": "d8872a4f5e5e927ae087e8319996ec3b9e010aa23fca32248c0909051032db48",
31
- "skills/pqc-first/skill.md": "8b77569100d10201044d63a69cbc83c9cfe6d2c3568884aa900ef0eb72ba99c3",
32
- "skills/skill-update-loop/skill.md": "f7cd18df293b90c0d2afb6ba8b87664419becea6b63221f03efaf09c69586025",
33
- "skills/security-maturity-tiers/skill.md": "2e46c9332a5a6190d4605ba7bc653410659be19fab50c78c0a6732f84ebdb300",
34
- "skills/researcher/skill.md": "dc8ceab8f69af370abb1165ed14ead6f3e9d236a8f703165eba52014ebfd43ab",
18
+ "data/zeroday-lessons.json": "e8202ffa99ed7c7d40b89ee5eedbea33839048cbff482e09329292e6700a5157",
19
+ "skills/kernel-lpe-triage/skill.md": "0f79c641cef6e5f4a942eb94f43c460562bf83dfb67ae112d146c39c6b320fb0",
20
+ "skills/ai-attack-surface/skill.md": "2880499993e0e69e3897a9d02b5e83aa0462c86a4dd2c1988b9968e375704a1f",
21
+ "skills/mcp-agent-trust/skill.md": "0752834acde0303d6d1e36be4b320eac3d34fde715bb8d71f3ad9e801d701482",
22
+ "skills/framework-gap-analysis/skill.md": "c2da8cc184ac4277309896bf4fe6afe23c419575b297734a8fc168f42d1805e9",
23
+ "skills/compliance-theater/skill.md": "02b51b932ded4b9b74844ecf842ee3f4d6b09699ebe9cdba457e2c9b7da10ebd",
24
+ "skills/exploit-scoring/skill.md": "2bb77e1f667bc47c6ab1c7715071d9fe8da2697f9bbbf7914c7e9fd231ad67f1",
25
+ "skills/rag-pipeline-security/skill.md": "49b1910e996f01df1382714f9307ead98028fb5b6911bb9022cb8e5c0edf0723",
26
+ "skills/ai-c2-detection/skill.md": "08fee5607e4972a3c0e1e31d58d4ddfeffeae1302df22416f3e24c20229fb782",
27
+ "skills/policy-exception-gen/skill.md": "c549f48c2e44759a74c2c6306f0eb34ea26152fb2a3b0e7e96505d5b174f1bd4",
28
+ "skills/threat-model-currency/skill.md": "30fbe6f6d589331c0640d3238d1681905e37307171c8d78df1f753bc36259356",
29
+ "skills/global-grc/skill.md": "8d1dfbae79153d403d543b3481f463260a89a35d068db0fa9eeda21c01c78e09",
30
+ "skills/zeroday-gap-learn/skill.md": "158aebcff94cb30a4503bc0fb1b867fff0b42bb0e5f4b8c2e43bee86b8178317",
31
+ "skills/pqc-first/skill.md": "c48ee7dbaebb748211aac7364b81bb853a9f99059c860557b203d424407d218a",
32
+ "skills/skill-update-loop/skill.md": "16cd5a61ccd87c61901e9b209fff0e26ca6540c0cfcb8e231ac17917c50d56bb",
33
+ "skills/security-maturity-tiers/skill.md": "de7a67b1f6ae79be490656939ac59b5772aa648dae4759733d80d6bf4595c278",
34
+ "skills/researcher/skill.md": "9f1211d177c64e4c465407a45ad9e2901c5c6c0af410a0d0a51cc8fb780420d4",
35
35
  "skills/attack-surface-pentest/skill.md": "6174a20b777a82c83941ef64d27e8c7e4091649358930ac1ba564a0ad4d9399f",
36
- "skills/fuzz-testing-strategy/skill.md": "86e7bf537e4313b932acaba6282a4514336066a740bdbee4e7cbea2d2ef05b54",
37
- "skills/dlp-gap-analysis/skill.md": "d59a136aa6478b069975b2406c4e3be4b227273641b054852ebc6eedeebd3754",
38
- "skills/supply-chain-integrity/skill.md": "90e930ef5d4cc5a54653844098d3549c3760b1a4aba5c48db1bd4eb24bea8d1b",
39
- "skills/defensive-countermeasure-mapping/skill.md": "dd89c729e7bbfa3c9455dec9b986455dec3c720249c559d2195179a5cbbb2933",
40
- "skills/identity-assurance/skill.md": "f3c29ce17aaa426b65b58238e5bc9ccabcda23a8d350e597840e5d6d664aa102",
41
- "skills/ot-ics-security/skill.md": "0acb7c105c87c523720bc19fdb4b6922cbf4f63054396e38b498528cfde02d76",
42
- "skills/coordinated-vuln-disclosure/skill.md": "dc7a29a0d503d7e3a55ba9afd963630329397577ca4e6be124c0263c315acca3",
43
- "skills/threat-modeling-methodology/skill.md": "964e90dd9ba632926414987ab7c26cac881ff1b36ff161172271ad8c94bcc49d",
44
- "skills/webapp-security/skill.md": "6d29b944d841b8d21d19edce6b98be20dc2c2b1360ccb946cb2be5a58a0b3e7b",
45
- "skills/ai-risk-management/skill.md": "686f53c2aee3a44108d1fa3e5f52fc7d971edc00946cfc1f082e4658af25fddc",
46
- "skills/sector-healthcare/skill.md": "c27672afe6abc2b293e213d8482e5e0d1e16a9ed4986d2637d1d586a14598238",
47
- "skills/sector-financial/skill.md": "ad8f207a6ce255aad9c33ea9a3009fb707c0f59be9df565fe68679654488bb6e",
48
- "skills/sector-federal-government/skill.md": "7b513d2365390fdb546c0f266139a21ae247339f0e346695fcbc92ba3d7fa69a",
49
- "skills/sector-energy/skill.md": "9aed96c78e8aaeafd3b7564d26311d625b4466a1e3822281721bdbfcfca058ec",
50
- "skills/sector-telecom/skill.md": "2f336a0b79cd28a3353ec0a72ce0469ac57305345d652247e7cb368f79ec8d4f",
51
- "skills/api-security/skill.md": "120ed75df17db4dfc4746b9d5bd6efd33786bbf68cb840670aeed0be505866f9",
52
- "skills/cloud-security/skill.md": "425be2c6e3563f011d0280bf03268425bf60923ae3d02eafbf1b56d04f0b7ffe",
53
- "skills/container-runtime-security/skill.md": "f22bf5a305f8a33884d49d9bfb25fa2bd00c4b3d0dc490bd12f20a7721683b4a",
54
- "skills/mlops-security/skill.md": "498549ddc9d870cb8d6a28a4d79b8d7058d5eed832d7c266c281084f4371ce46",
55
- "skills/incident-response-playbook/skill.md": "9c219de36c7d702dff8504a25e2f1b07459716ea2ed02f49d751f91dbeca1b01",
56
- "skills/ransomware-response/skill.md": "471b714c42717d43f81b2b582cd8e89ca8d3140de2ddc06cce15f012a0e19be1",
57
- "skills/email-security-anti-phishing/skill.md": "da0b937350e538b55db8daa1f50047d9f4e889e6b89b040dcecfb71feecd63d7",
58
- "skills/age-gates-child-safety/skill.md": "639b79a2724415afe9e4469202f806e5bec022c0946c9496d4e17ed73aabbe21",
36
+ "skills/fuzz-testing-strategy/skill.md": "07e2ee5f773a3f0e82bd21b8a7e8cf6d5b1a8bf3ac6f71602f16550561ade553",
37
+ "skills/dlp-gap-analysis/skill.md": "89dedc6c062fa2afd2284e608f4a51effda819e9288fbf38ab16a7891ccd8a10",
38
+ "skills/supply-chain-integrity/skill.md": "7c568ee9805f4c822c16c266348e35fa6f2d7a3c76135fa34b0cfa77f003a878",
39
+ "skills/defensive-countermeasure-mapping/skill.md": "212c0c31dcdaf30dfc68d870e43015dc1420674563e47e6cfb7036067a1b8713",
40
+ "skills/identity-assurance/skill.md": "86649aa573bde5b2ef2456a77d2fbfa9d1b623a4ef1326dd7a7ab384d0419307",
41
+ "skills/ot-ics-security/skill.md": "583f758ace33e638ddbbc985eda1ffc711bb040ce24f528d502fc13e5f7bb46e",
42
+ "skills/coordinated-vuln-disclosure/skill.md": "5c089e27e06e16201d1035038ef3c6ecbb7121f18ebb296eb8bb6022cbf522ec",
43
+ "skills/threat-modeling-methodology/skill.md": "4e77ce72fbeff93fa1c6674528dcfc4a8411caac230d0f0c0d28780b56cc0452",
44
+ "skills/webapp-security/skill.md": "9dc8c0e51c78ad93ef9de91dd9054370dfebeea2161a87f909202ecacfad1504",
45
+ "skills/ai-risk-management/skill.md": "3e116dc6f03f31e32f1ee885516d72d9c11d3ff67d2184108b13dcbdf5f417bf",
46
+ "skills/sector-healthcare/skill.md": "148520af64959a60018a24f4368670925980db3e73aa09af73194f8ea61f1fcc",
47
+ "skills/sector-financial/skill.md": "eb526fdd9fff84943fff951ca7762de4304adbf3212eb26c73521a8979bb776d",
48
+ "skills/sector-federal-government/skill.md": "870dead2eae1b2664b1e151dd73d8fa240a62a297bdbcddee37bd1cb60e5e5f4",
49
+ "skills/sector-energy/skill.md": "432213dfc9ee271631ce3171daf62a103a010b27a51911dd1112bd5d8bc6c152",
50
+ "skills/sector-telecom/skill.md": "4b80771e78a474e3f43227ecc730ddda1684bff98d7e6e53f5ec373e1e886f34",
51
+ "skills/api-security/skill.md": "bdd29ba72fd40b9a81228e41b3e27e62dde6de6290b678d5ba282c6436844fb9",
52
+ "skills/cloud-security/skill.md": "4ca2792b199ea5d3f0ce61ad7dccd31cacd345acb295b872089a4a2ebca973cc",
53
+ "skills/container-runtime-security/skill.md": "a34221dfd923f8f0d7d03a325cbe5d30de6163e19174f0070b94b4a22b3cd50c",
54
+ "skills/mlops-security/skill.md": "6ec745030723e1dbc174315ce462a9402641febaf4871960b562827c9801b627",
55
+ "skills/incident-response-playbook/skill.md": "5a048322fe19833326d2d35ead53c02c2bcada63d64947c6daf0550e7862365a",
56
+ "skills/ransomware-response/skill.md": "d0f456f1c31ec2968bb4c2cea67eb628d5baf857f17650ab204cf7931b3317ef",
57
+ "skills/email-security-anti-phishing/skill.md": "0965eca982e8fc633b85e70c0ba6becb8c0f5ee7bdd0be96ad73a9a222bb8816",
58
+ "skills/age-gates-child-safety/skill.md": "6d4d29e54a115314c3c0ea9f5df47bdc2828f3b226fff4b5974d898b56c0cd73",
59
59
  "skills/cloud-iam-incident/skill.md": "5ec3800a0049b2123aff67bfab4ff28491a86d2daeb712283e5e88b10c3d5d7b",
60
- "skills/idp-incident-response/skill.md": "e67a2576e7f1c3bf89f499f5c977bc470ef29e8b3e3e45f4cb5bd45a82674282"
60
+ "skills/idp-incident-response/skill.md": "cb2f2c5b90de4592bfd66dcd55f9bf2004f370746d519cad577fcbaf36125878"
61
61
  },
62
62
  "skill_count": 42,
63
63
  "catalog_count": 11,
@@ -78,7 +78,7 @@
78
78
  "handoff_dag_nodes": 42,
79
79
  "summary_cards": 42,
80
80
  "section_offsets_skills": 42,
81
- "token_budget_total_approx": 418611,
81
+ "token_budget_total_approx": 418479,
82
82
  "recipes": 8,
83
83
  "jurisdiction_clocks": 29,
84
84
  "did_ladders": 8,