@blamejs/exceptd-skills 0.12.28 → 0.12.29

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.
@@ -55,7 +55,7 @@
55
55
  },
56
56
  {
57
57
  "playbook_id": "secrets",
58
- "condition": "detect.indicators contains 'hardcoded-key-material'"
58
+ "condition": "analyze.classification == 'detected'"
59
59
  }
60
60
  ]
61
61
  },
@@ -59,9 +59,7 @@
59
59
  "published": "2011-09",
60
60
  "tracker": "https://www.rfc-editor.org/info/rfc6376",
61
61
  "relevance": "Cryptographic signing of email by the originating domain. DMARC verification relies on either SPF or DKIM aligning with the From-header domain. Operationally, DKIM is the load-bearing half of DMARC — SPF breaks on legitimate forwarding paths; DKIM survives them. Key-length lag is the recurring framework gap: many deployments still use 1024-bit RSA keys despite IETF guidance to rotate to ≥2048-bit.",
62
- "skills_referencing": [
63
- "email-security-anti-phishing"
64
- ],
62
+ "skills_referencing": [],
65
63
  "last_verified": "2026-05-13"
66
64
  },
67
65
  "RFC-6545": {
@@ -71,9 +69,7 @@
71
69
  "published": "2012-04",
72
70
  "tracker": "https://www.rfc-editor.org/info/rfc6545",
73
71
  "relevance": "Defines the RID schema for exchanging incident-response data between organizations and CSIRTs. Operator-facing relevance is via the IODEF (RFC 7970) payload that RID transports — the pair is the IETF-standardized cross-organizational incident-coordination protocol. Adoption lags; in practice many SOCs use ad-hoc CSV/JSON exchanges instead, leaving compliance with 'documented coordination channel' requirements weakly evidenced.",
74
- "skills_referencing": [
75
- "incident-response-playbook"
76
- ],
72
+ "skills_referencing": [],
77
73
  "last_verified": "2026-05-13"
78
74
  },
79
75
  "RFC-6546": {
@@ -83,9 +79,7 @@
83
79
  "published": "2012-04",
84
80
  "tracker": "https://www.rfc-editor.org/info/rfc6546",
85
81
  "relevance": "Specifies the HTTP-over-TLS transport for RID (RFC 6545) messages. Operator-facing: provides the wire-level protocol for IODEF/RID message exchange when an organization commits to standardized incident-data coordination. Pair this with RFC 6545 (schema) and RFC 7970 (IODEF v2 payload).",
86
- "skills_referencing": [
87
- "incident-response-playbook"
88
- ],
82
+ "skills_referencing": [],
89
83
  "last_verified": "2026-05-13"
90
84
  },
91
85
  "RFC-6749": {
@@ -110,9 +104,7 @@
110
104
  "published": "2014-04",
111
105
  "tracker": "https://www.rfc-editor.org/info/rfc7208",
112
106
  "relevance": "Authorizes which IPs may send mail on behalf of a domain. DMARC's path-based authentication half. Limits: a strict 10-DNS-lookup ceiling that operators routinely blow past through nested includes, leading to permerror DMARC outcomes; SPF breaks across legitimate forwarders, which is why DKIM (RFC 6376) is the load-bearing half operationally.",
113
- "skills_referencing": [
114
- "email-security-anti-phishing"
115
- ],
107
+ "skills_referencing": [],
116
108
  "last_verified": "2026-05-13"
117
109
  },
118
110
  "RFC-7296": {
@@ -136,9 +128,7 @@
136
128
  "published": "2015-03",
137
129
  "tracker": "https://www.rfc-editor.org/info/rfc7489",
138
130
  "relevance": "Defines DMARC — the email-authentication policy framework that binds SPF + DKIM results to a published domain-owner policy. Operator-facing email security depends on a published DMARC record with `p=reject` or `p=quarantine`; relaxed policies (`p=none`) are equivalent to no DMARC for spoofing-defense purposes. Cited alongside DKIM (RFC 6376) and SPF (RFC 7208) as the authoritative tri-RFC for anti-spoofing posture.",
139
- "skills_referencing": [
140
- "email-security-anti-phishing"
141
- ],
131
+ "skills_referencing": [],
142
132
  "last_verified": "2026-05-13"
143
133
  },
144
134
  "RFC-7519": {
@@ -170,10 +160,7 @@
170
160
  "published": "2015-09",
171
161
  "tracker": "https://www.rfc-editor.org/info/rfc7644",
172
162
  "relevance": "SCIM 2.0 is the dominant standard for federated identity-store synchronisation between IdPs and downstream applications (Okta, Entra ID, Workday → SaaS). Operator-facing: SCIM endpoints are a recurring credential-store soft target — bearer-token misconfigurations expose full directory enumeration + write access. AI-agent contexts add a new class: agent-identity provisioning at scale via SCIM, where over-broad attribute filters expose human identity data to agent-tenants. Pair with RFC 7643 (SCIM Schema) when implementing.",
173
- "skills_referencing": [
174
- "identity-assurance",
175
- "cred-stores"
176
- ],
163
+ "skills_referencing": [],
177
164
  "last_verified": "2026-05-15"
178
165
  },
179
166
  "RFC-7970": {
@@ -183,9 +170,7 @@
183
170
  "published": "2016-11",
184
171
  "tracker": "https://www.rfc-editor.org/info/rfc7970",
185
172
  "relevance": "IODEF v2 — the structured-incident payload format carried by RID. Operator-facing: IODEF v2 is the canonical machine-readable incident record. Use cases include cross-CSIRT coordination, regulator submissions where structured data is requested, and SIEM-to-SIEM federation. Adoption is sector-uneven; healthcare and financial sectors have stronger uptake than general industry.",
186
- "skills_referencing": [
187
- "incident-response-playbook"
188
- ],
173
+ "skills_referencing": [],
189
174
  "last_verified": "2026-05-13"
190
175
  },
191
176
  "RFC-8032": {
@@ -239,9 +224,7 @@
239
224
  "published": "2018-09",
240
225
  "tracker": "https://www.rfc-editor.org/info/rfc8460",
241
226
  "relevance": "Defines a DNS-published TLSRPT policy and an aggregate-reporting mechanism (RUA endpoint) where receiving MTAs report success / failure of inbound TLS negotiation. Operator-facing: TLSRPT is the monitoring half of the MTA-STS pair (RFC 8461) — without it, an MTA-STS `enforce` policy silently degrades when downgrade attempts occur or receiver-side TLS configurations break. Phishing-defense relevance is indirect but load-bearing: visibility into STARTTLS-stripping attempts is otherwise absent.",
242
- "skills_referencing": [
243
- "email-security-anti-phishing"
244
- ],
227
+ "skills_referencing": [],
245
228
  "last_verified": "2026-05-15"
246
229
  },
247
230
  "RFC-8461": {
@@ -251,9 +234,7 @@
251
234
  "published": "2018-09",
252
235
  "tracker": "https://www.rfc-editor.org/info/rfc8461",
253
236
  "relevance": "Forces TLS on inbound SMTP between MTAs that publish a `_mta-sts` policy. Closes the historical 'opportunistic-TLS-downgrade' attack window where a network-positioned attacker stripped the STARTTLS handshake. Operator-facing: an MTA-STS policy in `enforce` mode plus monitoring via TLSRPT (RFC 8460) is the baseline for inbound email confidentiality. Phishing-defense relevance is indirect — STARTTLS stripping enables session-layer manipulation that downstream defenses (DMARC, content classifiers) cannot recover from.",
254
- "skills_referencing": [
255
- "email-security-anti-phishing"
256
- ],
237
+ "skills_referencing": [],
257
238
  "last_verified": "2026-05-13"
258
239
  },
259
240
  "RFC-8616": {
@@ -263,9 +244,7 @@
263
244
  "published": "2019-06",
264
245
  "tracker": "https://www.rfc-editor.org/info/rfc8616",
265
246
  "relevance": "Updates DKIM / SPF / DMARC handling for internationalized domain names (IDN) and internationalized email-address local parts. Operator-facing: phishing campaigns increasingly leverage IDN homoglyphs (e.g. Cyrillic `а` for Latin `a`), and a DMARC implementation that doesn't honor RFC 8616 normalization rules can fail to align IDN-bearing From-headers correctly. Treat as a compatibility prerequisite for any anti-spoofing posture covering global mail flows.",
266
- "skills_referencing": [
267
- "email-security-anti-phishing"
268
- ],
247
+ "skills_referencing": [],
269
248
  "last_verified": "2026-05-13"
270
249
  },
271
250
  "RFC-8617": {
@@ -275,10 +254,7 @@
275
254
  "published": "2019-07",
276
255
  "tracker": "https://www.rfc-editor.org/info/rfc8617",
277
256
  "relevance": "ARC preserves authentication results across legitimate forwarding paths (mailing lists, alias services) where SPF + DKIM alignment would otherwise break, producing false DMARC failures. Operator-facing: ARC is the load-bearing complement to DMARC for organisations that receive mail via forwarders — anti-phishing programs that publish `p=reject` without an ARC strategy face increased false-positive bounce rates that pressure operators to relax DMARC. The skill-update-loop tracks ARC adoption signals as a forward-watch indicator for email-authentication posture changes.",
278
- "skills_referencing": [
279
- "email-security-anti-phishing",
280
- "skill-update-loop"
281
- ],
257
+ "skills_referencing": [],
282
258
  "last_verified": "2026-05-15"
283
259
  },
284
260
  "RFC-8705": {
@@ -288,9 +264,7 @@
288
264
  "published": "2020-02",
289
265
  "tracker": "https://www.rfc-editor.org/info/rfc8705",
290
266
  "relevance": "Defines two mechanisms: mTLS client authentication to OAuth authorisation servers, and certificate-bound access tokens that prevent token theft from being exploitable without the original mTLS client certificate. Operator-facing: mTLS-bound tokens are the canonical mitigation for bearer-token theft in high-assurance contexts (open-banking under PSD2 / UK FCA SCA-RTS, FAPI 2.0, government SSO). DPoP (RFC 9449) is the lighter-weight alternative for browser / mobile contexts where client TLS certificates are impractical.",
291
- "skills_referencing": [
292
- "identity-assurance"
293
- ],
267
+ "skills_referencing": [],
294
268
  "last_verified": "2026-05-15"
295
269
  },
296
270
  "RFC-8725": {
@@ -348,11 +322,7 @@
348
322
  "tracker": "https://www.rfc-editor.org/info/rfc9112",
349
323
  "relevance": "The current authoritative HTTP/1.1 specification, supersedes RFC 7230. Operator-facing: every HTTP/1.1 deployment — including MCP server transports, AI-API client libraries, and legacy webapp middle-tiers — should reference RFC 9112 rather than the older RFC 7230. Re-specification clarified request/response framing in ways that affect smuggling-class attack surfaces (CL.TE / TE.CL / CL.CL desync) which remain the dominant HTTP/1.1 vulnerability class.",
350
324
  "lag_notes": "Supersedes RFC 7230. Many security-tool rulesets still cite the obsolete number; check any control mapping that references 'RFC 7230' as the HTTP/1.1 authority and update to 9112.",
351
- "skills_referencing": [
352
- "api-security",
353
- "webapp-security",
354
- "mcp-agent-trust"
355
- ],
325
+ "skills_referencing": [],
356
326
  "last_verified": "2026-05-15"
357
327
  },
358
328
  "RFC-9114": {
@@ -379,9 +349,7 @@
379
349
  "published": "2022-04",
380
350
  "tracker": "https://www.rfc-editor.org/info/rfc9116",
381
351
  "relevance": "Defines the `/.well-known/security.txt` file format. Operator-facing CVD entry point: researchers reaching a domain consult `/.well-known/security.txt` for the disclosure contact + policy URL + preferred encryption + acknowledgments page. Absence is a recurring CVD-friction finding; presence with a stale `Expires` header is equivalent to absence. Pair with ISO 29147 receipt requirements.",
382
- "skills_referencing": [
383
- "coordinated-vuln-disclosure"
384
- ],
352
+ "skills_referencing": [],
385
353
  "last_verified": "2026-05-13"
386
354
  },
387
355
  "RFC-9180": {
@@ -439,10 +407,7 @@
439
407
  "published": "2023-09",
440
408
  "tracker": "https://www.rfc-editor.org/info/rfc9449",
441
409
  "relevance": "DPoP binds OAuth access + refresh tokens to a client-held key pair via per-request JWTs, defending against bearer-token theft in contexts where mTLS (RFC 8705) is impractical (single-page apps, mobile apps, AI-agent runtimes lacking client-certificate infrastructure). Operator-facing: DPoP is the recommended sender-constraint for FAPI 2.0 + MCP server-to-client OAuth flows where the client cannot present a TLS client certificate. Pairs with RFC 9700 (OAuth 2.0 Security BCP) recommendations.",
442
- "skills_referencing": [
443
- "identity-assurance",
444
- "api-security"
445
- ],
410
+ "skills_referencing": [],
446
411
  "last_verified": "2026-05-15"
447
412
  },
448
413
  "RFC-9458": {
@@ -468,7 +433,6 @@
468
433
  "relevance": "Transport Services (TAPS) architecture — abstracts the choice of underlying transport (TCP, QUIC, SCTP) behind a unified API that selects the protocol at runtime based on path conditions. Forward-watch relevance: webapp / AI-API client libraries that adopt TAPS may transparently shift between TCP-HTTP/2 and QUIC-HTTP/3 mid-session, complicating boundary inspection assumptions that pin to a single transport. Currently tracked as a deployment-watch item rather than an operational control point.",
469
434
  "lag_notes": "Architecture document; companion documents (TAPS implementation, TAPS programming interface) are still in progress at IETF TAPS WG. Enterprise tooling impact is forward-looking.",
470
435
  "skills_referencing": [
471
- "webapp-security",
472
436
  "sector-telecom"
473
437
  ],
474
438
  "last_verified": "2026-05-15"
@@ -507,9 +471,7 @@
507
471
  "published": "2022-11",
508
472
  "tracker": "https://docs.oasis-open.org/csaf/csaf/v2.0/csaf-v2.0.html",
509
473
  "relevance": "Machine-readable security advisory format adopted by EU CRA, CISA, and major vendor PSIRTs. Replaces the CVRF-1.2 format. Operator-facing: CSAF 2.0 documents carry the same advisory content traditionally found in vendor PDFs but in a parseable JSON form that consumers can ingest for fleet-wide impact assessment. exceptd emits CSAF-2.0 close.evidence_package bundles from `exceptd run --format csaf-2.0` for downstream auditor consumption.",
510
- "skills_referencing": [
511
- "coordinated-vuln-disclosure"
512
- ],
474
+ "skills_referencing": [],
513
475
  "last_verified": "2026-05-13"
514
476
  },
515
477
  "DRAFT-IETF-TLS-ECDHE-MLKEM": {
@@ -546,9 +508,7 @@
546
508
  "published": "2018-10",
547
509
  "tracker": "https://www.iso.org/standard/72311.html",
548
510
  "relevance": "Internationally-recognized vulnerability-disclosure procedure standard. Operator-facing: an org claiming a CVD program must demonstrate the documented procedures cover receipt, triage, advisory drafting, notification, and post-disclosure review. Twin to ISO 30111 (handling); together they form the disclosure ↔ handling pair. The RFC 9116 (security.txt) artifact is the operator-facing surface that operationalizes ISO 29147 receipt requirements.",
549
- "skills_referencing": [
550
- "coordinated-vuln-disclosure"
551
- ],
511
+ "skills_referencing": [],
552
512
  "last_verified": "2026-05-13"
553
513
  },
554
514
  "ISO-30111": {
@@ -558,9 +518,7 @@
558
518
  "published": "2019-10",
559
519
  "tracker": "https://www.iso.org/standard/69725.html",
560
520
  "relevance": "Internal handling counterpart to ISO 29147. Defines the internal processes (investigation, resolution, release) that follow a disclosed vulnerability through to fix. Operator-facing: paired with ISO 29147 it supplies the end-to-end CVD lifecycle. Many compliance frameworks (NIS2, EU CRA) reference 'a documented vulnerability handling process'; ISO 30111 is the canonical artifact that satisfies the wording.",
561
- "skills_referencing": [
562
- "coordinated-vuln-disclosure"
563
- ],
521
+ "skills_referencing": [],
564
522
  "last_verified": "2026-05-13"
565
523
  },
566
524
  "RFC-7591": {
@@ -571,8 +529,7 @@
571
529
  "tracker": "https://www.rfc-editor.org/info/rfc7591",
572
530
  "relevance": "Dynamic Client Registration is the legitimate OAuth flow for self-service app onboarding into an IdP. Operator-facing: when DCR is enabled without strong attestation, a compromised tenant or compromised admin can register a malicious app whose redirect_uri exfiltrates auth codes — the 2023-2024 Microsoft Storm-0558 / Midnight Blizzard incidents exercised this surface via consent abuse on tenant-published apps. Pair with RFC 7592 (DCR Management Protocol) for full lifecycle controls.",
573
531
  "skills_referencing": [
574
- "idp-incident-response",
575
- "identity-assurance"
532
+ "idp-incident-response"
576
533
  ],
577
534
  "last_verified": "2026-05-15"
578
535
  },
@@ -584,8 +541,7 @@
584
541
  "tracker": "https://www.rfc-editor.org/info/rfc8693",
585
542
  "relevance": "Token exchange is the canonical mechanism for cloud IAM impersonation and service-account delegation chains (AWS STS AssumeRoleWithWebIdentity, GCP Workload Identity Federation, Azure Workload Identity). Operator-facing: token-exchange chains are the modern equivalent of pass-the-token — a compromised upstream token mints downstream tokens with widened audience claims. Audit chain depth + audience expansion + lifetime ladder.",
586
543
  "skills_referencing": [
587
- "cloud-iam-incident",
588
- "identity-assurance"
544
+ "cloud-iam-incident"
589
545
  ],
590
546
  "last_verified": "2026-05-15"
591
547
  },
@@ -597,8 +553,7 @@
597
553
  "tracker": "https://www.rfc-editor.org/info/rfc9068",
598
554
  "relevance": "Standardises the JWT claim set for OAuth access tokens (typ, scope, client_id, etc.) that cloud IAM and SaaS APIs accept as bearer credentials. Operator-facing: when tokens omit the audience claim or accept loose typ values, replay across services becomes trivial — most cloud-IAM token-forgery incidents (Azure storm-0558 key-leak class) reduce to insufficient claim validation. Pair with RFC 8725 (JWT BCP) for hardening.",
599
555
  "skills_referencing": [
600
- "cloud-iam-incident",
601
- "identity-assurance"
556
+ "cloud-iam-incident"
602
557
  ],
603
558
  "last_verified": "2026-05-15"
604
559
  }
package/lib/exit-codes.js CHANGED
@@ -26,6 +26,7 @@ const EXIT_CODES = Object.freeze({
26
26
  SESSION_ID_COLLISION: 7,
27
27
  LOCK_CONTENTION: 8,
28
28
  STORAGE_EXHAUSTED: 9,
29
+ UNKNOWN_COMMAND: 10,
29
30
  });
30
31
 
31
32
  /**
@@ -43,6 +44,7 @@ const EXIT_CODE_DESCRIPTIONS = Object.freeze({
43
44
  7: { name: 'SESSION_ID_COLLISION', summary: 'Persisting attestation would overwrite an existing session; pass --force-overwrite to replace or supply a fresh --session-id.' },
44
45
  8: { name: 'LOCK_CONTENTION', summary: 'Concurrent invocation holds the per-playbook attestation lock; retry after the busy run releases.' },
45
46
  9: { name: 'STORAGE_EXHAUSTED', summary: 'Disk full, quota exceeded, or read-only filesystem prevented attestation write (ENOSPC, EDQUOT, EROFS).' },
47
+ 10: { name: 'UNKNOWN_COMMAND', summary: 'Unknown verb / dispatcher refused the requested command. Distinct from DETECTED_ESCALATE (2) which means a verb ran and detected an escalation-worthy finding.' },
46
48
  });
47
49
 
48
50
  /**
@@ -2708,6 +2708,30 @@ function buildEvidenceBundle(format, playbook, analyze, validate, agentSignals,
2708
2708
  }
2709
2709
  return stmt;
2710
2710
  });
2711
+ // Cycle 9 C1: OpenVEX `author` identifies the entity attesting to the
2712
+ // disposition — for an operator-run scan that is the operator, not the
2713
+ // tool vendor. Mirror the CSAF publisher.namespace fallback ladder so a
2714
+ // downstream supply-chain consumer keying on `author` resolves to the
2715
+ // operator URN. Pre-fix every OpenVEX document falsely attributed
2716
+ // dispositions to the tooling provider. Falls back to
2717
+ // urn:exceptd:operator:unknown + bundle_publisher_unclaimed runtime
2718
+ // warning if neither runOpts.operator nor runOpts.publisherNamespace
2719
+ // is supplied.
2720
+ const vexOperatorClean = sanitizeOperatorText(runOpts.operator);
2721
+ const vexExplicitNs = sanitizeOperatorText(runOpts.publisherNamespace);
2722
+ let vexAuthor;
2723
+ if (vexExplicitNs) {
2724
+ vexAuthor = vexExplicitNs;
2725
+ } else if (vexOperatorClean) {
2726
+ vexAuthor = vexOperatorClean;
2727
+ } else {
2728
+ vexAuthor = 'urn:exceptd:operator:unknown';
2729
+ pushRunError(runOpts._runErrors, {
2730
+ kind: 'bundle_publisher_unclaimed',
2731
+ format: 'openvex',
2732
+ message: 'OpenVEX author falls back to urn:exceptd:operator:unknown — supply runOpts.operator or runOpts.publisherNamespace to claim disposition attribution.',
2733
+ });
2734
+ }
2711
2735
  return {
2712
2736
  '@context': 'https://openvex.dev/ns/v0.2.0',
2713
2737
  // F2/F9: OpenVEX @id baked from session_id (not Date.now()) so the
@@ -2715,7 +2739,7 @@ function buildEvidenceBundle(format, playbook, analyze, validate, agentSignals,
2715
2739
  // attestation file name. Falls back to a urnSlug if sessionId
2716
2740
  // somehow arrived empty.
2717
2741
  '@id': `https://exceptd.com/vex/${playbookSlug}/${urnSlug(sessionId || 'session')}`,
2718
- author: 'exceptd',
2742
+ author: vexAuthor,
2719
2743
  timestamp: issued,
2720
2744
  version: 1,
2721
2745
  statements: (function () {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "_comment": "Auto-generated by scripts/refresh-manifest-snapshot.js — do not hand-edit. Public skill surface used by check-manifest-snapshot.js to detect breaking removals.",
3
- "_generated_at": "2026-05-15T23:28:24.427Z",
4
- "atlas_version": "5.1.0",
3
+ "_generated_at": "2026-05-16T01:08:44.785Z",
4
+ "atlas_version": "5.4.0",
5
5
  "skill_count": 42,
6
6
  "skills": [
7
7
  {
@@ -1 +1 @@
1
- ac16c35fbc0c164c00294ca821b6e44c12908800b5e6cfb339ea472c9a9ed5e0 manifest-snapshot.json
1
+ 2b2fe8086b9dd8ff974651b9ee0a00df002209856fd3e6cbacd4cd9b0029b530 manifest-snapshot.json