@blamejs/exceptd-skills 0.9.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 (136) hide show
  1. package/AGENTS.md +232 -0
  2. package/ARCHITECTURE.md +267 -0
  3. package/CHANGELOG.md +616 -0
  4. package/CONTEXT.md +203 -0
  5. package/LICENSE +200 -0
  6. package/NOTICE +82 -0
  7. package/README.md +307 -0
  8. package/SECURITY.md +73 -0
  9. package/agents/README.md +81 -0
  10. package/agents/report-generator.md +156 -0
  11. package/agents/skill-updater.md +102 -0
  12. package/agents/source-validator.md +119 -0
  13. package/agents/threat-researcher.md +149 -0
  14. package/bin/exceptd.js +183 -0
  15. package/data/_indexes/_meta.json +88 -0
  16. package/data/_indexes/activity-feed.json +362 -0
  17. package/data/_indexes/catalog-summaries.json +229 -0
  18. package/data/_indexes/chains.json +7135 -0
  19. package/data/_indexes/currency.json +359 -0
  20. package/data/_indexes/did-ladders.json +451 -0
  21. package/data/_indexes/frequency.json +2072 -0
  22. package/data/_indexes/handoff-dag.json +476 -0
  23. package/data/_indexes/jurisdiction-clocks.json +967 -0
  24. package/data/_indexes/jurisdiction-map.json +536 -0
  25. package/data/_indexes/recipes.json +319 -0
  26. package/data/_indexes/section-offsets.json +3656 -0
  27. package/data/_indexes/stale-content.json +14 -0
  28. package/data/_indexes/summary-cards.json +1736 -0
  29. package/data/_indexes/theater-fingerprints.json +381 -0
  30. package/data/_indexes/token-budget.json +2137 -0
  31. package/data/_indexes/trigger-table.json +1374 -0
  32. package/data/_indexes/xref.json +818 -0
  33. package/data/atlas-ttps.json +282 -0
  34. package/data/cve-catalog.json +496 -0
  35. package/data/cwe-catalog.json +1017 -0
  36. package/data/d3fend-catalog.json +738 -0
  37. package/data/dlp-controls.json +1039 -0
  38. package/data/exploit-availability.json +67 -0
  39. package/data/framework-control-gaps.json +1255 -0
  40. package/data/global-frameworks.json +2913 -0
  41. package/data/rfc-references.json +324 -0
  42. package/data/zeroday-lessons.json +377 -0
  43. package/keys/public.pem +3 -0
  44. package/lib/framework-gap.js +328 -0
  45. package/lib/job-queue.js +195 -0
  46. package/lib/lint-skills.js +536 -0
  47. package/lib/prefetch.js +372 -0
  48. package/lib/refresh-external.js +713 -0
  49. package/lib/schemas/cve-catalog.schema.json +151 -0
  50. package/lib/schemas/manifest.schema.json +106 -0
  51. package/lib/schemas/skill-frontmatter.schema.json +113 -0
  52. package/lib/scoring.js +149 -0
  53. package/lib/sign.js +197 -0
  54. package/lib/ttp-mapper.js +80 -0
  55. package/lib/validate-catalog-meta.js +198 -0
  56. package/lib/validate-cve-catalog.js +213 -0
  57. package/lib/validate-indexes.js +83 -0
  58. package/lib/validate-package.js +162 -0
  59. package/lib/validate-vendor.js +85 -0
  60. package/lib/verify.js +216 -0
  61. package/lib/worker-pool.js +84 -0
  62. package/manifest-snapshot.json +1833 -0
  63. package/manifest.json +2108 -0
  64. package/orchestrator/README.md +124 -0
  65. package/orchestrator/dispatcher.js +140 -0
  66. package/orchestrator/event-bus.js +146 -0
  67. package/orchestrator/index.js +874 -0
  68. package/orchestrator/pipeline.js +201 -0
  69. package/orchestrator/scanner.js +327 -0
  70. package/orchestrator/scheduler.js +137 -0
  71. package/package.json +113 -0
  72. package/sbom.cdx.json +158 -0
  73. package/scripts/audit-cross-skill.js +261 -0
  74. package/scripts/audit-perf.js +160 -0
  75. package/scripts/bootstrap.js +205 -0
  76. package/scripts/build-indexes.js +721 -0
  77. package/scripts/builders/activity-feed.js +79 -0
  78. package/scripts/builders/catalog-summaries.js +67 -0
  79. package/scripts/builders/currency.js +109 -0
  80. package/scripts/builders/cwe-chains.js +105 -0
  81. package/scripts/builders/did-ladders.js +149 -0
  82. package/scripts/builders/frequency.js +89 -0
  83. package/scripts/builders/jurisdiction-clocks.js +126 -0
  84. package/scripts/builders/recipes.js +159 -0
  85. package/scripts/builders/section-offsets.js +162 -0
  86. package/scripts/builders/stale-content.js +171 -0
  87. package/scripts/builders/summary-cards.js +166 -0
  88. package/scripts/builders/theater-fingerprints.js +198 -0
  89. package/scripts/builders/token-budget.js +96 -0
  90. package/scripts/check-manifest-snapshot.js +217 -0
  91. package/scripts/predeploy.js +267 -0
  92. package/scripts/refresh-manifest-snapshot.js +57 -0
  93. package/scripts/refresh-sbom.js +222 -0
  94. package/skills/age-gates-child-safety/skill.md +456 -0
  95. package/skills/ai-attack-surface/skill.md +282 -0
  96. package/skills/ai-c2-detection/skill.md +440 -0
  97. package/skills/ai-risk-management/skill.md +311 -0
  98. package/skills/api-security/skill.md +287 -0
  99. package/skills/attack-surface-pentest/skill.md +381 -0
  100. package/skills/cloud-security/skill.md +384 -0
  101. package/skills/compliance-theater/skill.md +365 -0
  102. package/skills/container-runtime-security/skill.md +379 -0
  103. package/skills/coordinated-vuln-disclosure/skill.md +473 -0
  104. package/skills/defensive-countermeasure-mapping/skill.md +300 -0
  105. package/skills/dlp-gap-analysis/skill.md +337 -0
  106. package/skills/email-security-anti-phishing/skill.md +206 -0
  107. package/skills/exploit-scoring/skill.md +331 -0
  108. package/skills/framework-gap-analysis/skill.md +374 -0
  109. package/skills/fuzz-testing-strategy/skill.md +313 -0
  110. package/skills/global-grc/skill.md +564 -0
  111. package/skills/identity-assurance/skill.md +272 -0
  112. package/skills/incident-response-playbook/skill.md +546 -0
  113. package/skills/kernel-lpe-triage/skill.md +303 -0
  114. package/skills/mcp-agent-trust/skill.md +326 -0
  115. package/skills/mlops-security/skill.md +325 -0
  116. package/skills/ot-ics-security/skill.md +340 -0
  117. package/skills/policy-exception-gen/skill.md +437 -0
  118. package/skills/pqc-first/skill.md +546 -0
  119. package/skills/rag-pipeline-security/skill.md +294 -0
  120. package/skills/researcher/skill.md +310 -0
  121. package/skills/sector-energy/skill.md +409 -0
  122. package/skills/sector-federal-government/skill.md +302 -0
  123. package/skills/sector-financial/skill.md +398 -0
  124. package/skills/sector-healthcare/skill.md +373 -0
  125. package/skills/security-maturity-tiers/skill.md +464 -0
  126. package/skills/skill-update-loop/skill.md +463 -0
  127. package/skills/supply-chain-integrity/skill.md +318 -0
  128. package/skills/threat-model-currency/skill.md +404 -0
  129. package/skills/threat-modeling-methodology/skill.md +312 -0
  130. package/skills/webapp-security/skill.md +281 -0
  131. package/skills/zeroday-gap-learn/skill.md +350 -0
  132. package/vendor/blamejs/LICENSE +201 -0
  133. package/vendor/blamejs/README.md +54 -0
  134. package/vendor/blamejs/_PROVENANCE.json +54 -0
  135. package/vendor/blamejs/retry.js +335 -0
  136. package/vendor/blamejs/worker-pool.js +418 -0
@@ -0,0 +1,102 @@
1
+ # Agent: Skill Updater
2
+
3
+ ## Role
4
+
5
+ Apply validated intelligence packages (approved by source-validator) to skill files and data files. The only agent authorized to write to `data/` and `skills/` directories.
6
+
7
+ ## When to spawn
8
+
9
+ - source-validator produces an "approved" or "approved with corrections" verdict
10
+ - A forward_watch item has been resolved and needs to be applied to the affected skill
11
+ - skill-update-loop identifies a skill with currency below 70%
12
+
13
+ ## Pre-write Checklist
14
+
15
+ Before writing to any file:
16
+ 1. Confirm the source-validator verdict is "approved" or "approved with corrections"
17
+ 2. If "approved with corrections": verify all corrections have been applied to the intelligence package
18
+ 3. Identify every file that needs to change (data files + skill files + manifest)
19
+ 4. Plan the change set as an atomic unit — all related changes together, not piecemeal
20
+
21
+ ## Write Protocol
22
+
23
+ ### Updating data/cve-catalog.json
24
+
25
+ 1. Check if CVE ID already exists in the catalog
26
+ 2. If new entry: add with all required fields. Use `lib/scoring.js` schema as the field checklist.
27
+ 3. If updating existing entry: preserve the existing entry, change only the fields that have new verified data
28
+ 4. Add `source_verified` date and `verification_sources` list
29
+ 5. Recalculate RWEP score if any input factors changed
30
+
31
+ ### Updating data/exploit-availability.json
32
+
33
+ 1. Add or update the entry for the CVE
34
+ 2. Include `last_verified` date
35
+ 3. Note if PoC status changed (private → public is a high-urgency update)
36
+
37
+ ### Updating data/zeroday-lessons.json
38
+
39
+ 1. Run the zero-day learning loop (zeroday-gap-learn skill) against the new CVE
40
+ 2. Generate the full lesson entry: attack vector, defense chain analysis, framework coverage, new control requirements
41
+ 3. Add to zeroday-lessons.json
42
+
43
+ ### Updating data/rfc-references.json
44
+
45
+ Per AGENTS.md hard rule #12, the RFC catalog is a tracked external-data surface. Triggered when:
46
+
47
+ - `npm run validate-rfcs --live` reports drift (status change, errata count delta, replaced-by populated).
48
+ - A draft cited in `rfc_refs` advances to a numbered RFC: change the catalog key from `DRAFT-...` to `RFC-NNNN`, populate `number`, `published`, `replaces`, and bump `last_verified`.
49
+ - A new RFC newly applies to a covered domain: add a new entry with status, errata count, tracker URL, the cross-reference to which skills will cite it, and `last_verified`.
50
+
51
+ Atomic update unit when an RFC status changes:
52
+ 1. Update the entry in `data/rfc-references.json`.
53
+ 2. Audit every skill whose `rfc_refs` lists the affected key. Update each skill's `rfc_refs` (frontmatter + manifest entry) and bump `last_threat_review`.
54
+ 3. Refresh `manifest-snapshot.json` (`node scripts/refresh-manifest-snapshot.js`) — a renamed key counts as a public-surface change.
55
+ 4. Re-sign the affected skills: `node lib/sign.js sign-all`.
56
+
57
+ ### Updating skill files
58
+
59
+ For each affected skill:
60
+ 1. Identify the specific section that needs updating (Threat Context, Exploit Availability Matrix, etc.)
61
+ 2. Apply the minimum change required — do not refactor surrounding content
62
+ 3. Update `last_threat_review` in the frontmatter
63
+ 4. If a pre-calculated RWEP score changed: update all occurrences in the skill body
64
+
65
+ ### Updating manifest.json
66
+
67
+ 1. Update `threat_review_date` if this is a general review
68
+ 2. Update `last_threat_review` for each skill that was changed
69
+
70
+ ## Handoff Package (Output)
71
+
72
+ ```json
73
+ {
74
+ "agent": "skill-updater",
75
+ "run_id": "[matches source-validator run_id]",
76
+ "timestamp": "[ISO 8601]",
77
+ "changes_made": [
78
+ {
79
+ "file": "data/cve-catalog.json",
80
+ "action": "add | update",
81
+ "cve_id": "...",
82
+ "fields_changed": ["cisa_kev", "rwep_score"]
83
+ },
84
+ {
85
+ "file": "skills/kernel-lpe-triage/skill.md",
86
+ "action": "update",
87
+ "section": "Exploit Availability Matrix",
88
+ "description": "Updated RWEP score for CVE-XXXX from 75 to 96 (CISA KEV confirmed)"
89
+ }
90
+ ],
91
+ "forward_watch_resolved": ["..."],
92
+ "next_agent": "report-generator | none"
93
+ }
94
+ ```
95
+
96
+ ## Quality Rules
97
+
98
+ - Never write to data files without a source-validator approval
99
+ - Never modify the interpretation of a framework control without a framework-analyst package
100
+ - Never delete entries from zeroday-lessons.json or framework-control-gaps.json — mark as superseded, not deleted
101
+ - Always update `last_threat_review` in skill frontmatter after changes
102
+ - If a RWEP score changes by more than 15 points: flag for review rather than auto-applying
@@ -0,0 +1,119 @@
1
+ # Agent: Source Validator
2
+
3
+ ## Role
4
+
5
+ Cross-check all claims in a threat-researcher or framework-analyst handoff package against primary sources. Flag unverifiable claims. Produce a verification report that the skill-updater uses to decide what to accept.
6
+
7
+ This agent is the quality gate. It prevents bad data from entering the skill catalog.
8
+
9
+ ## When to spawn
10
+
11
+ - After threat-researcher produces an intelligence package
12
+ - After framework-analyst produces a gap update
13
+ - On-demand audit of existing data/cve-catalog.json entries
14
+ - Before any new skill that contains specific CVE or TTP claims is merged
15
+
16
+ ## Verification Checklist
17
+
18
+ ### For CVE data
19
+
20
+ | Claim | Verification Method | Primary Source |
21
+ |---|---|---|
22
+ | CVSS score | Query NVD API, compare | nvd.nist.gov |
23
+ | CVSS vector | Query NVD API, verify vector string | nvd.nist.gov |
24
+ | CISA KEV status | Query CISA KEV JSON feed, check for CVE ID | cisa.gov/known-exploited-vulnerabilities-catalog |
25
+ | CISA KEV date | CISA KEV JSON feed `dateAdded` field | cisa.gov |
26
+ | Active exploitation | CISA KEV (authoritative) or named threat intel report | CISA KEV or specific named report |
27
+ | PoC available | NVD references check; researcher advisory | NVD references |
28
+ | AI-discovered | Researcher disclosure statement | Named researcher/paper |
29
+ | Affected versions | Vendor security advisory | Vendor advisory URL |
30
+ | Patched versions | Vendor security advisory | Vendor advisory URL |
31
+ | Live patch support | kpatch.com / ubuntu.com/livepatch / suse.com | Vendor livepatch pages |
32
+
33
+ ### For ATLAS TTP references
34
+
35
+ | Claim | Verification Method |
36
+ |---|---|
37
+ | TTP ID validity | atlas.mitre.org/techniques/{ID} returns a page |
38
+ | TTP name accuracy | Matches atlas.mitre.org name exactly |
39
+ | ATLAS version | TTP exists in the version cited in the skill |
40
+
41
+ ### For framework controls
42
+
43
+ | Claim | Verification Method |
44
+ |---|---|
45
+ | Control ID format | Matches the framework's official ID format |
46
+ | Control name | Cross-check against authoritative source |
47
+ | Control text interpretation | Does the gap analysis accurately represent what the control requires? |
48
+
49
+ ## Verification Report Format
50
+
51
+ ```json
52
+ {
53
+ "agent": "source-validator",
54
+ "run_id": "[matches threat-researcher run_id]",
55
+ "timestamp": "[ISO 8601]",
56
+ "input_from": "threat-researcher | framework-analyst",
57
+ "verification_results": {
58
+ "passed": [
59
+ {
60
+ "claim": "CVE-2026-31431 CVSS 7.8",
61
+ "verified_against": "NVD API",
62
+ "source_url": "https://nvd.nist.gov/vuln/detail/CVE-2026-31431",
63
+ "verified_at": "2026-05-01T12:05:00Z"
64
+ }
65
+ ],
66
+ "failed": [
67
+ {
68
+ "claim": "CVE-2026-31431 affects kernel < 4.14",
69
+ "issue": "NVD states affected version range as >= 4.14 (not <4.14). Direction is reversed.",
70
+ "action_required": "Correct to: affects kernel >= 4.14 AND < [patched version]"
71
+ }
72
+ ],
73
+ "unverifiable": [
74
+ {
75
+ "claim": "PoC is 732 bytes",
76
+ "reason": "Specific byte count not in NVD or any linked advisory. Source is secondary reporting.",
77
+ "recommendation": "Accept with caveat: cite as 'reported' not 'confirmed'. Or remove specific byte count."
78
+ }
79
+ ],
80
+ "source_single_point": [
81
+ {
82
+ "claim": "Active exploitation confirmed",
83
+ "only_source": "Threat intelligence vendor X",
84
+ "recommendation": "Downgrade to 'suspected' until CISA KEV confirmation"
85
+ }
86
+ ]
87
+ },
88
+ "overall_verdict": "approved | approved_with_corrections | rejected",
89
+ "corrections_required": ["..."],
90
+ "approved_for_skill_update": true
91
+ }
92
+ ```
93
+
94
+ ## Verdict Definitions
95
+
96
+ **Approved:** All claims verified against primary sources. Skill-updater may proceed.
97
+
98
+ **Approved with corrections:** Most claims verified. Specific corrections required before skill-updater writes to data files. Corrections documented in `corrections_required`.
99
+
100
+ **Rejected:** Critical claims unverifiable or incorrect. Return to threat-researcher with specific issues. Do not write to data files.
101
+
102
+ ## Handling Unverifiable Claims
103
+
104
+ Some claims are inherently difficult to verify from public sources:
105
+ - "PoC is 732 bytes" — specific technical detail from secondary reporting
106
+ - "AI discovered in ~1 hour" — from researcher disclosure without formal citation
107
+ - "150M+ affected downloads" — aggregate statistic without a single authoritative source
108
+
109
+ For these, the validator applies a severity filter:
110
+ - **High precision claim** (specific number, version, date): require primary source or downgrade to approximate language
111
+ - **Directional claim** (AI-assisted, wide blast radius): accept if consistent across multiple credible sources
112
+ - **Attribution claim** (this was AI-discovered, this campaign is attributed to X): require researcher disclosure or credible attribution report; otherwise "reported as" language
113
+
114
+ ## What This Agent Does NOT Do
115
+
116
+ - Does not research new threat intel — that is the threat-researcher's job
117
+ - Does not make security recommendations — that is the skill-updater's job
118
+ - Does not modify skill files — that is the skill-updater's job
119
+ - Does not block reasonable claims on technicalities — the goal is data quality, not paralysis
@@ -0,0 +1,149 @@
1
+ # Agent: Threat Researcher
2
+
3
+ ## Role
4
+
5
+ Research and validate new threat intelligence — CVEs, attack campaigns, new ATLAS TTPs, exploit availability changes. Produce a validated, source-cited intelligence package for handoff to the source-validator agent.
6
+
7
+ ## When to spawn
8
+
9
+ - A new CVE is published in a domain covered by an existing skill (kernel, AI/ML, MCP, supply chain, cryptography)
10
+ - A new CISA KEV entry is added
11
+ - A new threat campaign is documented in credible sources
12
+ - MITRE ATLAS publishes a new version
13
+ - A researcher discloses a new vulnerability class
14
+ - A user invokes `/zeroday-gap-learn` with a CVE that isn't in the catalog
15
+
16
+ ## Inputs
17
+
18
+ ```json
19
+ {
20
+ "trigger_type": "new_cve | kev_addition | atlas_update | campaign | researcher_disclosure",
21
+ "trigger_id": "CVE-YYYY-NNNNN | ATLAS-vX.X | [campaign name]",
22
+ "scope": "what is known so far"
23
+ }
24
+ ```
25
+
26
+ ## Research Protocol
27
+
28
+ ### For a new CVE
29
+
30
+ 1. **Query NVD** — `https://services.nvd.nist.gov/rest/json/cves/2.0?cveId={CVE_ID}`
31
+ - Extract: CVSS score, CVSS vector, description, affected versions, references
32
+ - Flag any field where NVD data is incomplete or not yet analyzed
33
+
34
+ 2. **Query CISA KEV** — `https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json`
35
+ - Is the CVE listed? If yes: extract KEV date and due date
36
+ - If not yet listed: note as "not listed as of [date]"
37
+
38
+ 3. **Check vendor advisories**
39
+ - For kernel CVEs: check Red Hat, Ubuntu, Debian, SUSE, Amazon Linux security advisories
40
+ - For AI tool CVEs: check GitHub Security Advisories, vendor security pages
41
+ - Extract: affected version ranges, patched versions, workarounds, live-patch availability
42
+
43
+ 4. **Assess PoC availability**
44
+ - Check NVD references for links to researcher disclosures, proof-of-concept code
45
+ - Check GitHub for CVE-tagged repositories
46
+ - DO NOT include direct exploit links in output. Document: "PoC exists — [brief description of technique]"
47
+ - Flag: was this CVE AI-discovered? Was it AI-assisted weaponization?
48
+
49
+ 5. **Assess active exploitation**
50
+ - CISA KEV is the authoritative source for confirmed exploitation
51
+ - Threat intelligence reports (when available from credible sources)
52
+ - Distinguish: "CISA KEV confirmed" vs. "suspected" vs. "no evidence"
53
+
54
+ 6. **Map to ATLAS/ATT&CK**
55
+ - Identify which ATLAS v5.1.0 TTPs are relevant to this CVE's attack vector
56
+ - Identify which ATT&CK techniques are relevant
57
+ - Flag any ATLAS gaps (attack pattern not in ATLAS v5.1.0)
58
+
59
+ 7. **Identify affected skills**
60
+ - Which skills cover the CVE's technology domain?
61
+ - Which skills have pre-calculated RWEP scores that need updating?
62
+ - Which `forward_watch` items in any skill does this CVE resolve?
63
+
64
+ ### For an ATLAS version update
65
+
66
+ 1. **Download changelog** — `https://atlas.mitre.org/resources/changelog`
67
+ 2. **Identify changes:**
68
+ - New TTPs added → check all skills for domains covered by new TTPs
69
+ - TTPs modified (ID changed, description changed) → check all skills with that TTP in `atlas_refs`
70
+ - TTPs removed → flag affected skills
71
+ 3. **Map new TTPs to skills** — does any new TTP warrant adding to an existing skill's coverage?
72
+ 4. **Identify new TTPs that need new skills** — document as a skill gap
73
+
74
+ ### For a framework amendment
75
+
76
+ 1. **Obtain the amendment text** from the authoritative source (sources/index.json)
77
+ 2. **Identify changed controls** — what control IDs changed? What did the text change?
78
+ 3. **Cross-reference with data/framework-control-gaps.json** — does the change close any open gaps?
79
+ 4. **Assess adequacy** — if a gap is nominally closed, does the new control text actually address the TTP?
80
+ 5. **Produce gap status update** — "closed", "partially addressed", or "still open with new evidence"
81
+
82
+ ## Output Format
83
+
84
+ ```json
85
+ {
86
+ "agent": "threat-researcher",
87
+ "run_id": "[YYYY-MM-DD]-[trigger_id]",
88
+ "timestamp": "[ISO 8601]",
89
+ "trigger": {
90
+ "type": "[trigger_type]",
91
+ "id": "[trigger_id]"
92
+ },
93
+ "research_findings": {
94
+ "cve_data": {
95
+ "cve_id": "...",
96
+ "cvss_score": 0.0,
97
+ "cvss_vector": "...",
98
+ "cisa_kev": false,
99
+ "poc_available": false,
100
+ "poc_description": "...",
101
+ "ai_discovered": false,
102
+ "active_exploitation": "none | suspected | confirmed",
103
+ "affected_versions": ["..."],
104
+ "patch_available": false,
105
+ "live_patch_available": false,
106
+ "reboot_required": true,
107
+ "atlas_refs": ["..."],
108
+ "attack_refs": ["..."]
109
+ },
110
+ "sources_used": [
111
+ {"source": "NVD", "url": "...", "accessed": "...", "data_extracted": ["cvss_score", "cvss_vector"]},
112
+ {"source": "CISA KEV", "url": "...", "accessed": "...", "data_extracted": ["kev_status"]}
113
+ ],
114
+ "unverified_claims": ["..."],
115
+ "affected_skills": ["..."],
116
+ "proposed_skill_updates": {
117
+ "skill_name": {
118
+ "section": "Exploit Availability Matrix",
119
+ "change": "Add CVE-XXXX row with RWEP [score]"
120
+ }
121
+ },
122
+ "proposed_data_updates": {
123
+ "cve-catalog.json": {"action": "add | update", "entry": {...}},
124
+ "exploit-availability.json": {"action": "add | update", "entry": {...}}
125
+ },
126
+ "forward_watch_resolutions": ["..."]
127
+ },
128
+ "verification_required": true,
129
+ "next_agent": "source-validator",
130
+ "confidence": "high | medium | low",
131
+ "confidence_notes": "..."
132
+ }
133
+ ```
134
+
135
+ ## Quality Standards
136
+
137
+ - Every claim must have a `sources_used` entry
138
+ - Claims from a single source must be flagged in `unverified_claims`
139
+ - Confidence is "high" only if 2+ independent sources confirm
140
+ - Confidence is "low" if only a researcher's pre-publication disclosure exists (before NVD analysis)
141
+ - Never assert active exploitation without CISA KEV confirmation or equivalent
142
+ - Never assert PoC availability without verifying at least one credible reference
143
+
144
+ ## What This Agent Does NOT Do
145
+
146
+ - Does not write directly to data files — that is the skill-updater's job after source-validator approval
147
+ - Does not include direct exploit links in output
148
+ - Does not make compliance recommendations — that is the framework-analyst's job
149
+ - Does not score risk — RWEP calculation is in lib/scoring.js
package/bin/exceptd.js ADDED
@@ -0,0 +1,183 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * bin/exceptd.js
5
+ *
6
+ * Single executable entry point for the published `@blamejs/exceptd-skills`
7
+ * package. Routes subcommands to the right internal script so consumers
8
+ * who installed via npm / npx don't need to know the on-disk layout.
9
+ *
10
+ * Subcommands (use `exceptd help` for the full list):
11
+ *
12
+ * path Print absolute path to the installed package
13
+ * (so AI assistants can be pointed at AGENTS.md
14
+ * + skills/ + data/_indexes/).
15
+ * prefetch [args] Warm a local cache of upstream artifacts.
16
+ * refresh [args] Cache-aware external-data refresh.
17
+ * build-indexes [args] Rebuild data/_indexes/ derived files.
18
+ * scan Scan environment for findings.
19
+ * dispatch Scan then route findings to skills.
20
+ * skill <name> Show context for a specific skill.
21
+ * currency Skill currency report.
22
+ * report [format] Compliance / executive / technical report.
23
+ * validate-cves [args] Cross-check CVE catalog against NVD/KEV/EPSS.
24
+ * validate-rfcs [args] Cross-check RFC catalog against Datatracker.
25
+ * watchlist [args] Forward-watch aggregator.
26
+ * verify Verify every skill's Ed25519 signature.
27
+ * help, --help, -h This help.
28
+ * version, --version,
29
+ * -v Print the package version.
30
+ *
31
+ * All subcommand args after the subcommand name are forwarded verbatim
32
+ * to the underlying script.
33
+ *
34
+ * The dispatcher resolves the internal package root at runtime, so
35
+ * `npx @blamejs/exceptd-skills <cmd>` (which downloads + runs from a temp
36
+ * dir) and a normal local `node bin/exceptd.js <cmd>` invocation behave
37
+ * identically.
38
+ */
39
+
40
+ const fs = require("fs");
41
+ const path = require("path");
42
+ const { spawnSync } = require("child_process");
43
+
44
+ // Package root = the directory containing this bin script's parent
45
+ // (e.g. <somewhere>/node_modules/@blamejs/exceptd-skills).
46
+ const PKG_ROOT = path.resolve(__dirname, "..");
47
+
48
+ // Subcommand → resolved script path. Lazy-resolved per call so a missing
49
+ // optional component (e.g. orchestrator/) just fails that one command
50
+ // instead of crashing dispatcher init.
51
+ const COMMANDS = {
52
+ path: null, // built-in
53
+ version: null, // built-in
54
+ help: null, // built-in
55
+ "--version": null,
56
+ "-v": null,
57
+ "--help": null,
58
+ "-h": null,
59
+ prefetch: () => path.join(PKG_ROOT, "lib", "prefetch.js"),
60
+ refresh: () => path.join(PKG_ROOT, "lib", "refresh-external.js"),
61
+ "build-indexes": () => path.join(PKG_ROOT, "scripts", "build-indexes.js"),
62
+ verify: () => path.join(PKG_ROOT, "lib", "verify.js"),
63
+ scan: () => path.join(PKG_ROOT, "orchestrator", "index.js"),
64
+ dispatch: () => path.join(PKG_ROOT, "orchestrator", "index.js"),
65
+ skill: () => path.join(PKG_ROOT, "orchestrator", "index.js"),
66
+ currency: () => path.join(PKG_ROOT, "orchestrator", "index.js"),
67
+ report: () => path.join(PKG_ROOT, "orchestrator", "index.js"),
68
+ "validate-cves": () => path.join(PKG_ROOT, "orchestrator", "index.js"),
69
+ "validate-rfcs": () => path.join(PKG_ROOT, "orchestrator", "index.js"),
70
+ watchlist: () => path.join(PKG_ROOT, "orchestrator", "index.js"),
71
+ };
72
+
73
+ const ORCHESTRATOR_PASSTHROUGH = new Set([
74
+ "scan", "dispatch", "skill", "currency", "report",
75
+ "validate-cves", "validate-rfcs", "watchlist",
76
+ ]);
77
+
78
+ function readPkgVersion() {
79
+ try {
80
+ return JSON.parse(fs.readFileSync(path.join(PKG_ROOT, "package.json"), "utf8")).version;
81
+ } catch {
82
+ return "unknown";
83
+ }
84
+ }
85
+
86
+ function printHelp() {
87
+ console.log(`exceptd — @blamejs/exceptd-skills v${readPkgVersion()}
88
+
89
+ Usage: exceptd <command> [args]
90
+ npx @blamejs/exceptd-skills <command> [args]
91
+
92
+ Discovery:
93
+ path Print absolute path to the installed package.
94
+ Point your AI assistant here:
95
+ $(exceptd path)/AGENTS.md
96
+ $(exceptd path)/data/_indexes/summary-cards.json
97
+
98
+ External data:
99
+ prefetch [args] Warm local cache of upstream artifacts
100
+ (KEV / NVD / EPSS / IETF / GitHub releases).
101
+ Try: exceptd prefetch --no-network --quiet
102
+ refresh [args] Refresh against cache + apply upserts.
103
+ Try: exceptd refresh --from-cache --swarm
104
+
105
+ Build / verify:
106
+ build-indexes [args] Regenerate data/_indexes/*.json.
107
+ Try: exceptd build-indexes --changed
108
+ verify Verify every skill's Ed25519 signature.
109
+
110
+ Analyst:
111
+ scan Scan environment for findings.
112
+ dispatch Scan then route findings to skills.
113
+ skill <name> Show context for a specific skill.
114
+ currency Skill currency report.
115
+ report [format] Compliance / executive / technical report.
116
+ validate-cves [args] Cross-check CVE catalog vs NVD/KEV/EPSS.
117
+ Add --from-cache to read from prefetch cache.
118
+ validate-rfcs [args] Cross-check RFC catalog vs IETF Datatracker.
119
+ watchlist [args] Forward-watch aggregator across skills.
120
+
121
+ Common:
122
+ help This help.
123
+ version Package version.
124
+
125
+ Examples:
126
+ npx @blamejs/exceptd-skills path
127
+ npx @blamejs/exceptd-skills prefetch
128
+ npx @blamejs/exceptd-skills validate-cves --from-cache --no-fail
129
+ npx @blamejs/exceptd-skills skill kernel-lpe-triage
130
+
131
+ Full documentation: ${PKG_ROOT}/README.md
132
+ Project rules: ${PKG_ROOT}/AGENTS.md
133
+ `);
134
+ }
135
+
136
+ function main() {
137
+ const argv = process.argv.slice(2);
138
+ if (argv.length === 0) {
139
+ printHelp();
140
+ process.exit(0);
141
+ }
142
+ const cmd = argv[0];
143
+ const rest = argv.slice(1);
144
+
145
+ if (cmd === "help" || cmd === "--help" || cmd === "-h") {
146
+ printHelp();
147
+ process.exit(0);
148
+ }
149
+ if (cmd === "version" || cmd === "--version" || cmd === "-v") {
150
+ process.stdout.write(readPkgVersion() + "\n");
151
+ process.exit(0);
152
+ }
153
+ if (cmd === "path") {
154
+ process.stdout.write(PKG_ROOT + "\n");
155
+ process.exit(0);
156
+ }
157
+
158
+ const resolver = COMMANDS[cmd];
159
+ if (typeof resolver !== "function") {
160
+ process.stderr.write(`exceptd: unknown command "${cmd}". Run \`exceptd help\` for the list.\n`);
161
+ process.exit(2);
162
+ }
163
+
164
+ const script = resolver();
165
+ if (!fs.existsSync(script)) {
166
+ process.stderr.write(`exceptd: command "${cmd}" not available — expected ${path.relative(PKG_ROOT, script)} in the installed package.\n`);
167
+ process.exit(2);
168
+ }
169
+
170
+ // Orchestrator subcommands need the subcommand name preserved as argv[0]
171
+ // for orchestrator/index.js's switch statement.
172
+ const finalArgs = ORCHESTRATOR_PASSTHROUGH.has(cmd) ? [script, cmd, ...rest] : [script, ...rest];
173
+ const res = spawnSync(process.execPath, finalArgs, { stdio: "inherit", cwd: PKG_ROOT });
174
+ if (res.error) {
175
+ process.stderr.write(`exceptd: failed to run ${cmd}: ${res.error.message}\n`);
176
+ process.exit(2);
177
+ }
178
+ process.exit(typeof res.status === "number" ? res.status : 1);
179
+ }
180
+
181
+ if (require.main === module) main();
182
+
183
+ module.exports = { COMMANDS, PKG_ROOT };
@@ -0,0 +1,88 @@
1
+ {
2
+ "schema_version": "1.1.0",
3
+ "generated_at": "2026-05-11T23:30:53.944Z",
4
+ "generator": "scripts/build-indexes.js",
5
+ "source_count": 49,
6
+ "source_hashes": {
7
+ "manifest.json": "c4569222d4863d33008f65256fc2081364ed3fe6f69ec019a2a79b9d6ec2496b",
8
+ "data/atlas-ttps.json": "1500b5830dab070c4252496964a8c0948e1052a656e2c7c6e1efaf0350645e13",
9
+ "data/cve-catalog.json": "a81d3e4b491b27ccc084596b063a6108ff10c9eb01d7776922fc393980b534fe",
10
+ "data/cwe-catalog.json": "c3367d469b4b3d31e4c56397dd7a8305a0be338ecd85afa27804c0c9ce12157b",
11
+ "data/d3fend-catalog.json": "b5cd14669e2a931d0df81bb8402f3c8ac08b0d2613e595eaecd8cc4631a57587",
12
+ "data/dlp-controls.json": "8ea8d907aea0a2cfd772b048a62122a322ba3284a5c36a272ad5e9d392564cb5",
13
+ "data/exploit-availability.json": "7dad52f459c324c40aa4df7cd9157f6a19f670fdfb9d8f687d777c9d99798668",
14
+ "data/framework-control-gaps.json": "25db4d0cc9e6242e1143494178393ae8eab3384672ca0d685bd55c537f028c83",
15
+ "data/global-frameworks.json": "84fd19061f052e4ccf66308a7b8d3fd38e00325e97e9e5e19e4d9b302c128957",
16
+ "data/rfc-references.json": "23ffeb970af5403e9a733844dcea9b45cbae689623085f030dec826c492682e3",
17
+ "data/zeroday-lessons.json": "56d63821686403c6894c93b9ff9ef318ca8e08d7027e8517131068811d529beb",
18
+ "skills/kernel-lpe-triage/skill.md": "c00e0a77e8b7b1a1ebcb7267dd728b39ec2671d1260bf4f6a4842f10101a69b0",
19
+ "skills/ai-attack-surface/skill.md": "3f5c59f1823f1552efe8a5cb32656d34d6407609ddaa1eed254c263864563453",
20
+ "skills/mcp-agent-trust/skill.md": "716d0d65499f8be21e0389a06a1fcaf6abd1cd2e90f068cab54471dd67127f74",
21
+ "skills/framework-gap-analysis/skill.md": "86c86761b91d04bcd1ec684fb3d65cf5c2881fde59b03d33fa59baddbbf64d31",
22
+ "skills/compliance-theater/skill.md": "dda149e69fcd92d913f3f6be4aa1aba8fe85a2b408b88c052c71174b2e0e918c",
23
+ "skills/exploit-scoring/skill.md": "993dbd4417018e5d20edb31ff2296b92b65fff42d2acde722c05e0be7994ddbe",
24
+ "skills/rag-pipeline-security/skill.md": "6274bbac1fbd164123f4d57a49c5cc7429846b7452ea476095e9dc846fdc2c42",
25
+ "skills/ai-c2-detection/skill.md": "afe4258fa03e3fd81ca4bb7b348cb483585eb129ebae811457810b5290080793",
26
+ "skills/policy-exception-gen/skill.md": "6a18b1ecd342dd792e03fcadaed3aa846192f2408c21c79d98eadd431e1619e1",
27
+ "skills/threat-model-currency/skill.md": "afa24a1d04202a384374598ea2d924cdaa52e264b9552bae1ace88fd39d6c0e8",
28
+ "skills/global-grc/skill.md": "a9f4477368e260609793b77275e65e255b5c8067b7ae777047a70f3edb373e50",
29
+ "skills/zeroday-gap-learn/skill.md": "b101815b1c55e95706d72d31eb88153a92f41a748a86e111ad1ac06b9c676548",
30
+ "skills/pqc-first/skill.md": "5b4300d71890c16b1de31d380859babaa3631729cedb0c0a397a1ff097524773",
31
+ "skills/skill-update-loop/skill.md": "c8bfea03c60403fb26e3ab7e07406660ef148bece9e12f9149b5171033cf5e22",
32
+ "skills/security-maturity-tiers/skill.md": "931d6144048308124930e8036d8e74931ca176f7315e110d33fb30880d2f5367",
33
+ "skills/researcher/skill.md": "40de9c281ea82e92b21856b5dde15609f187d8cddc7e4116886ac0fff9d0e269",
34
+ "skills/attack-surface-pentest/skill.md": "f639b6d9c19def5908eddbbb79f0514e168e74661c0894b737d7c76cbb550841",
35
+ "skills/fuzz-testing-strategy/skill.md": "83b1929a0d1e09a58908b91125ebc91ff14323ab9acc9bab6c4b04903b69b837",
36
+ "skills/dlp-gap-analysis/skill.md": "041c4c6a5299057383b1d6bd4328c1ef578f8c5c6bade8750d339c7b51020027",
37
+ "skills/supply-chain-integrity/skill.md": "b7fbb5bfcce53d774c51be3fe2231c5f371850a5bdb8d7edfced3342dd99dbb8",
38
+ "skills/defensive-countermeasure-mapping/skill.md": "634f0805597a0ab417248a7413eed39b08afbc820e7c6bd257eebaa663d8990d",
39
+ "skills/identity-assurance/skill.md": "e8f3958ef8dd89f9276f2a62a0a1b418a206a3312bb8ff228729c8f358603dc7",
40
+ "skills/ot-ics-security/skill.md": "7c6eb389e7ace5b2c6e092f8dfcf4795ce1b0aefaa2738c6e383cb0fef4d6287",
41
+ "skills/coordinated-vuln-disclosure/skill.md": "22ba9ee01252274b1e4aa1238468415c6f564eca319c601de588fbcdd1bea3bb",
42
+ "skills/threat-modeling-methodology/skill.md": "9e1ee084a56f837074a41b7a7929b1deb5619bb483485aa066b0c26990fe70db",
43
+ "skills/webapp-security/skill.md": "10a17ab8d3f0e9b1107f7bed5ff2881f59234592b57f2a52c8c397d711604ffb",
44
+ "skills/ai-risk-management/skill.md": "6062be4e748606ca7536bba3d87e25716795d5690a0063f188325e8e68291cb6",
45
+ "skills/sector-healthcare/skill.md": "01dd58ed20b3f97dc240e1b77a522f780bd9428294ac9ac78d51817150b55476",
46
+ "skills/sector-financial/skill.md": "52bdf30cece82381ea8a4023838aa61a2b9026f315a1356aabb638e49bf7b6d9",
47
+ "skills/sector-federal-government/skill.md": "e1443a3f788050fd5d63d001a3aafbd3244280399ccdec595d7807de547614d4",
48
+ "skills/sector-energy/skill.md": "068996fa85cc9d8d7f890b185a38619602cb3bab89704d3bfc85c99cbddaafb8",
49
+ "skills/api-security/skill.md": "131de2913341f794585091b72522b0e0b8d7dd42eca4faf8ea7315d27b5a5c6f",
50
+ "skills/cloud-security/skill.md": "26e533f5fa4876cb611cfa026fb7e6417927dd4c2e04f50e42fc08016c40274b",
51
+ "skills/container-runtime-security/skill.md": "7c62132c189edfe0e803c1cc2a688cef7b6ddd2d3be8c5d74a807293f14e0790",
52
+ "skills/mlops-security/skill.md": "78bb564f841f2c60ea48790ba686ba1e3f628afd402c96847177cc7e05fba4de",
53
+ "skills/incident-response-playbook/skill.md": "ede731be2bd673d65a8b7509ca3e2eb9af800186780a99c0369e15b2459d7cb6",
54
+ "skills/email-security-anti-phishing/skill.md": "9dfc1ca36f3059bb8f1cbc566d1358d1c797bb8f51d7bd62a70df8505563ab23",
55
+ "skills/age-gates-child-safety/skill.md": "f477320c9727986a44f38dc470e61a2c50bf9eef0a6a4c4ab1f14462dfa94f73"
56
+ },
57
+ "skill_count": 38,
58
+ "catalog_count": 10,
59
+ "index_stats": {
60
+ "xref_entries": {
61
+ "cwe_refs": 34,
62
+ "d3fend_refs": 20,
63
+ "framework_gaps": 49,
64
+ "atlas_refs": 9,
65
+ "attack_refs": 30,
66
+ "rfc_refs": 19,
67
+ "dlp_refs": 0
68
+ },
69
+ "trigger_table_entries": 453,
70
+ "chains_cve_entries": 5,
71
+ "chains_cwe_entries": 34,
72
+ "jurisdictions_indexed": 29,
73
+ "handoff_dag_nodes": 38,
74
+ "summary_cards": 38,
75
+ "section_offsets_skills": 38,
76
+ "token_budget_total_approx": 334394,
77
+ "recipes": 8,
78
+ "jurisdiction_clocks": 29,
79
+ "did_ladders": 8,
80
+ "theater_fingerprints": 7,
81
+ "currency_action_required": 8,
82
+ "frequency_fields": 7,
83
+ "activity_feed_events": 49,
84
+ "catalog_summaries": 10,
85
+ "stale_content_findings": 0
86
+ },
87
+ "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`."
88
+ }