@blamejs/exceptd-skills 0.12.31 → 0.12.33
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +56 -0
- package/bin/exceptd.js +68 -12
- package/data/_indexes/_meta.json +11 -11
- package/data/_indexes/activity-feed.json +4 -4
- package/data/_indexes/catalog-summaries.json +4 -4
- package/data/_indexes/chains.json +883 -44
- package/data/_indexes/frequency.json +10 -0
- package/data/_indexes/section-offsets.json +9 -9
- package/data/_indexes/token-budget.json +20 -20
- package/data/cve-catalog.json +147 -19
- package/data/cwe-catalog.json +39 -25
- package/data/d3fend-catalog.json +46 -0
- package/data/framework-control-gaps.json +331 -6
- package/data/playbooks/cloud-iam-incident.json +0 -6
- package/data/playbooks/idp-incident.json +1 -7
- package/data/zeroday-lessons.json +688 -0
- package/manifest-snapshot.json +1 -1
- package/manifest-snapshot.sha256 +1 -1
- package/manifest.json +47 -47
- package/package.json +1 -1
- package/sbom.cdx.json +24 -24
- package/scripts/refresh-reverse-refs.js +63 -6
- package/skills/cloud-iam-incident/skill.md +1 -1
- package/skills/idp-incident-response/skill.md +1 -1
- package/skills/ransomware-response/skill.md +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,61 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.12.33 — 2026-05-15
|
|
4
|
+
|
|
5
|
+
Same-day CVE intake (node-ipc supply-chain compromise) + cycle 13 audit fixes. Closes the long-standing `cred-stores` skill-vs-playbook semantic confusion that's surfaced in every audit since cycle 9.
|
|
6
|
+
|
|
7
|
+
### Features
|
|
8
|
+
|
|
9
|
+
**`MAL-2026-NODE-IPC-STEALER` — npm node-ipc supply-chain compromise (2026-05-14).** Three malicious versions (`9.1.6`, `9.2.3`, `12.0.1`) published by `atiertant`. Novel attack class: not credential theft, not typosquat, not lifecycle-hook worm — the attacker re-registered the maintainer's expired email domain (`atlantis-software.net`, expired and grabbed via Namecheap PrivateEmail on 2026-05-07) and abused npm's email-based password-reset flow to gain publish rights. 80 KB obfuscated IIFE in `node-ipc.cjs` fires on every `require()` (no hooks needed) and exfiltrates AWS / GCP / Azure / SSH / Kubernetes / Vault / Claude AI / Kiro IDE credentials via DNS TXT queries to an Azure-lookalike spoofed domain. 3.35M monthly downloads. Carries `kev_scope_note` per the cycle 11 ecosystem-package CISA-KEV-scope precedent. RWEP 43.
|
|
10
|
+
|
|
11
|
+
**Three new control requirements in `zeroday-lessons`** capture the structural lesson: **NEW-CTRL-047 PACKAGE-MAINTAINER-DOMAIN-EXPIRY-MONITORING** (continuous WHOIS expiry monitoring on every critical-path maintainer email domain + dual-factor account recovery); **NEW-CTRL-048 NPM-MAINTAINER-MFA-ENFORCEMENT** (registry-side mandatory MFA on publish-enabled accounts); **NEW-CTRL-049 LOCKFILE-INTEGRITY-VERIFIED-AT-CI-BOOT** (`npm ci` / `--frozen-lockfile` / `--immutable` catches the swap even after a successful publish — `--ignore-scripts` does NOT mitigate because the payload ships in the main module, not a postinstall hook).
|
|
12
|
+
|
|
13
|
+
**`D3-EFA` (Executable File Analysis) added to D3FEND catalog.** `sector-telecom` skill cited it but the entry didn't exist — cycle 13 finding. Distinct from `D3-EAL` (Executable Allowlisting): EAL blocks at execute-time; EFA inspects bytes at file-write / image-pull / artifact-fetch time and gates the allowlist decision itself.
|
|
14
|
+
|
|
15
|
+
**CLI envelope-shape contract tests.** `tests/cli-output-envelope-shape.test.js` pins the EXACT top-level key set on `attest list --json`, `attest verify --json` (error path), and `version`. A contributor adding a new top-level field to these verbs now gets a forcing-function test failure that requires updating the contract. Expanded coverage to `run` / `ci` / `discover` / `brief` / `doctor` / `watchlist` deferred to future cycles as their shapes stabilize.
|
|
16
|
+
|
|
17
|
+
### Bugs
|
|
18
|
+
|
|
19
|
+
**`cred-stores` skill-vs-playbook semantic finally cleaned up.** Cycles 9, 12, and 13 all flagged that the 3 IR playbooks and 3 IR skills referenced `cred-stores` in `skill_preload` / `skill_chain` / Hand-Off sections as if it were a skill — but it's actually a playbook. Operators (and any tooling resolving these refs against `manifest.json.skills`) failed. Fixes: removed `cred-stores` from `data/playbooks/{idp-incident,cloud-iam-incident}.json` `skill_preload` + `skill_chain` (hand-off is via `_meta.feeds_into`, which was already present); annotated `cred-stores` / `framework` references in `skills/{idp-incident-response,cloud-iam-incident,ransomware-response}/skill.md` Hand-Off sections as *(playbook chain, not a skill)* with the explicit note that hand-off is via the playbook chain, not a skill load. Predeploy playbook validator now warning-free (was 6 warnings every release).
|
|
20
|
+
|
|
21
|
+
### Internal
|
|
22
|
+
|
|
23
|
+
- CVE catalog 36 → 37 entries; zeroday-lessons 21 → 22 entries.
|
|
24
|
+
- AI-discovery rate stays at 16.2% (one more vendor/ecosystem-discovered entry dilutes the observed rate; floor remains 0.15).
|
|
25
|
+
- D3FEND catalog 28 → 29 entries.
|
|
26
|
+
- `tests/v0_12_33-node-ipc-coverage.test.js` pins MAL-2026-NODE-IPC-STEALER entry shape (iocs object with ≥1 category, kev_scope_note presence, NEW-CTRL-047 in lessons).
|
|
27
|
+
- Reverse-ref regen: 3 CWE entries updated with the new MAL-* CVE evidence; 1 D3FEND skill_referencing prune (sector-telecom now correctly anchored against D3-EFA).
|
|
28
|
+
- Test count 1109 → 1119.
|
|
29
|
+
- 14/14 predeploy gates green.
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
## 0.12.32 — 2026-05-15
|
|
33
|
+
|
|
34
|
+
Cycle 11 CLI polish + cycle 12 catalog hardening. The headline closes a silent regression where the 6 CVEs advertised by v0.12.31 were shipped as `_draft: true` and therefore invisible to default `cross-ref-api` queries — operators running `exceptd` against Exchange would have gotten a clean bill on CVE-2026-42897.
|
|
35
|
+
|
|
36
|
+
### Bugs
|
|
37
|
+
|
|
38
|
+
**6 CVEs from v0.12.31 promoted from draft to non-draft.** Cycle 12 audit caught the regression: every CVE in cycle 11's intake shipped as `_draft: true`, which `lib/cross-ref-api.js` skips by default. v0.12.31 CHANGELOG advertised "6 new CISA-KEV CVEs" but operators couldn't actually query them. All 6 promoted with `_editorial_promoted: 2026-05-15` provenance; full required fields validated (iocs, vendor_advisories, verification_sources, complexity, affected_versions, RWEP Shape B invariant).
|
|
39
|
+
|
|
40
|
+
**9 unmatched `framework_control_gaps` keys on the new CVEs now resolve.** `NIS2-Art21-vulnerability-management`, `DORA-Art-9`, `NIST-800-53-AC-3`, `OWASP-LLM-Top-10-2025-LLM05`, `NIST-800-53-AC-6`, `NIS2-Art21-identity-management`, `ISO-27001-2022-A.8.7`, `NIST-800-53-SC-44`, `CIS-Controls-v8-10.1` — referenced by the new CVEs but absent from the framework-gap catalog. All 9 now present with `theater_test` blocks (catalog 109 → 118 entries). Reverse `evidence_cves` links also added on the 6 existing entries (NIST-800-53-SI-2 / SI-3 / etc.) that the new CVEs reference.
|
|
41
|
+
|
|
42
|
+
**CVE → CWE reverse-references auto-regenerated.** Cycle 9 introduced `npm run refresh-reverse-refs` for the skill direction (manifest → atlas/cwe/d3fend/rfc), but the CWE catalog's `evidence_cves` field — the operator-facing "which CVEs map to this CWE" index — was still hand-maintained and drifted with every CVE intake. The script now also walks `cve.cwe_refs` → `cwe.evidence_cves`. Drafts excluded (they're invisible to default consumers; the reverse direction tracks operator-queryable truth). 14 CWE entries updated on first run. New `tests/reverse-ref-drift.test.js` test pins the contract.
|
|
43
|
+
|
|
44
|
+
### Features
|
|
45
|
+
|
|
46
|
+
**`exceptd help <verb>`** now routes to the per-verb help text (`exceptd help run` returns the run-verb help, not the top-level banner). Pre-fix the verb arg was silently dropped. Unknown verbs fall through to top-level help with a stderr note. New `tests/help-verb-attest-list-deprecation.test.js` pins the contract.
|
|
47
|
+
|
|
48
|
+
**`exceptd attest list` empty-state now names every candidate root.** Pre-fix the human output said "(no attestations under )" with an empty path list when no `.exceptd/` directory existed. New `roots_evaluated[]` field on the JSON output + `[scanned-empty]` / `[not-present]` markers in the human renderer.
|
|
49
|
+
|
|
50
|
+
**Legacy-verb deprecation banner auto-suppresses across invocations.** Pre-fix the per-process env-var guard reset on every fresh node process, so operators saw the banner on every `exceptd plan` invocation. Now persists suppression via an OS-tempdir marker keyed by exceptd version — banner shows once per version per host, re-shows on upgrade. Explicit `EXCEPTD_DEPRECATION_SHOWN=1` still suppresses even the first display.
|
|
51
|
+
|
|
52
|
+
### Internal
|
|
53
|
+
|
|
54
|
+
- 6 matching `data/zeroday-lessons.json` entries authored for the promoted CVEs (rule #6 enforcement: zero-day learning is live for every non-draft catalog entry).
|
|
55
|
+
- Test count 1099 → 1109 (10 new tests across F4/F5/F7 + reverse-ref drift extension + Shape B canonicalization staying green).
|
|
56
|
+
- 14/14 predeploy gates green.
|
|
57
|
+
|
|
58
|
+
|
|
3
59
|
## 0.12.31 — 2026-05-15
|
|
4
60
|
|
|
5
61
|
CLI ergonomics + 30-day CVE intake from the cycle 11 audit. Closes a silent-misrouting bug in the CI gate and adds six high-impact CVEs that landed on CISA KEV between 2026-04-15 and 2026-05-15.
|
package/bin/exceptd.js
CHANGED
|
@@ -400,6 +400,20 @@ function main() {
|
|
|
400
400
|
const rest = argv.slice(1);
|
|
401
401
|
|
|
402
402
|
if (cmd === "help" || cmd === "--help" || cmd === "-h") {
|
|
403
|
+
// Cycle 11 F4 (v0.12.32): `exceptd help <verb>` previously dropped the
|
|
404
|
+
// verb argument and printed the top-level help. Route through the same
|
|
405
|
+
// printPlaybookVerbHelp() that `exceptd <verb> --help` already uses so
|
|
406
|
+
// operators get a consistent verb-specific help surface regardless of
|
|
407
|
+
// which way they reached it.
|
|
408
|
+
if (rest.length > 0 && typeof rest[0] === 'string' && rest[0].length > 0) {
|
|
409
|
+
const verb = rest[0];
|
|
410
|
+
if (printPlaybookVerbHelp(verb)) {
|
|
411
|
+
process.exit(0);
|
|
412
|
+
}
|
|
413
|
+
// Verb not found — emit a one-line note pointing at the top-level
|
|
414
|
+
// help so operators don't silently see the wrong content.
|
|
415
|
+
process.stderr.write(`[exceptd help] no verb-specific help for "${verb}" — falling through to top-level help. Run \`exceptd help\` for the full verb list.\n`);
|
|
416
|
+
}
|
|
403
417
|
printHelp();
|
|
404
418
|
process.exit(0);
|
|
405
419
|
}
|
|
@@ -449,15 +463,31 @@ function main() {
|
|
|
449
463
|
// (plan, govern, direct, look, ingest, reattest, list-attestations).
|
|
450
464
|
if (LEGACY_VERB_REPLACEMENTS[cmd] && !process.env.EXCEPTD_DEPRECATION_SHOWN) {
|
|
451
465
|
const ver = readPkgVersion();
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
);
|
|
466
|
+
// Cycle 11 F7 (v0.12.32): persist the suppression across invocations via
|
|
467
|
+
// an OS-tempdir marker keyed by exceptd version. Pre-fix the env-var
|
|
468
|
+
// guard reset every fresh node process so operators saw the same banner
|
|
469
|
+
// on every `exceptd plan` invocation, even after they'd already read it.
|
|
470
|
+
// Per-version key means a new version (legitimate new content) shows the
|
|
471
|
+
// banner once; subsequent runs within the same version stay quiet. The
|
|
472
|
+
// explicit EXCEPTD_DEPRECATION_SHOWN=1 env-var opt-out still suppresses
|
|
473
|
+
// even the first display, matching the documented contract.
|
|
474
|
+
const markerDir = require("os").tmpdir();
|
|
475
|
+
const markerFile = path.join(markerDir, `exceptd-deprecation-shown-v${ver}`);
|
|
476
|
+
let alreadyShown = false;
|
|
477
|
+
try { alreadyShown = fs.existsSync(markerFile); } catch { /* tmpdir unwritable; degrade to per-process */ }
|
|
478
|
+
if (!alreadyShown) {
|
|
479
|
+
const haveBrief = ver !== "unknown" && ver.match(/^(\d+)\.(\d+)/) && (parseInt(RegExp.$1, 10) > 0 || parseInt(RegExp.$2, 10) >= 11);
|
|
480
|
+
process.stderr.write(
|
|
481
|
+
`[exceptd] DEPRECATION: \`${cmd}\` is a v0.10.x verb. ` +
|
|
482
|
+
(haveBrief
|
|
483
|
+
? `Prefer \`${LEGACY_VERB_REPLACEMENTS[cmd]}\` (available in this install, v${ver}). `
|
|
484
|
+
: `Upgrade to v0.11.0+ then use \`${LEGACY_VERB_REPLACEMENTS[cmd]}\` (currently installed: v${ver}). `) +
|
|
485
|
+
`Legacy verbs remain functional through this release; they will be removed in v0.13. ` +
|
|
486
|
+
`This banner shows once per exceptd version per host (re-shown on upgrade). Permanent suppress: export EXCEPTD_DEPRECATION_SHOWN=1.\n`
|
|
487
|
+
);
|
|
488
|
+
try { fs.writeFileSync(markerFile, `shown_at=${new Date().toISOString()}\nversion=${ver}\n`); }
|
|
489
|
+
catch { /* tmpdir unwritable; the env-var guard below keeps the per-process suppression intact */ }
|
|
490
|
+
}
|
|
461
491
|
process.env.EXCEPTD_DEPRECATION_SHOWN = "1";
|
|
462
492
|
}
|
|
463
493
|
|
|
@@ -1949,7 +1979,15 @@ Flags (selected — see \`exceptd run --help\` for the full list):
|
|
|
1949
1979
|
--bundle-deterministic Emit byte-stable bundles across the multi-run set.
|
|
1950
1980
|
--bundle-epoch <ISO> Frozen epoch for --bundle-deterministic.`,
|
|
1951
1981
|
};
|
|
1952
|
-
|
|
1982
|
+
// Cycle 11 F4 (v0.12.32): return whether a verb-specific help block was
|
|
1983
|
+
// found so the `exceptd help <verb>` caller can decide whether to fall
|
|
1984
|
+
// through to the top-level help (verb unknown) or stop here (verb known).
|
|
1985
|
+
if (cmds[verb]) {
|
|
1986
|
+
process.stdout.write(cmds[verb] + "\n");
|
|
1987
|
+
return true;
|
|
1988
|
+
}
|
|
1989
|
+
process.stdout.write(`${verb} — no per-verb help available; see \`exceptd help\` for the full list.\n`);
|
|
1990
|
+
return false;
|
|
1953
1991
|
}
|
|
1954
1992
|
|
|
1955
1993
|
/**
|
|
@@ -5399,9 +5437,14 @@ function cmdListAttestations(runner, args, runOpts, pretty) {
|
|
|
5399
5437
|
}
|
|
5400
5438
|
// Enumerate sessions across both v0.11.0 default root and legacy cwd-
|
|
5401
5439
|
// relative root, so operators with prior attestations still see them.
|
|
5402
|
-
|
|
5440
|
+
// Cycle 11 F5 (v0.12.32): also track candidate roots that didn't exist
|
|
5441
|
+
// so operators can tell whether the directory was scanned-and-empty or
|
|
5442
|
+
// simply never created. Pre-fix the human output said "(no attestations
|
|
5443
|
+
// under )" with no path — operators couldn't see where the verb looked.
|
|
5444
|
+
const roots = [...new Set([resolveAttestationRoot(runOpts), path.join(process.cwd(), ".exceptd", "attestations")])];
|
|
5403
5445
|
const entries = [];
|
|
5404
5446
|
const seenRoots = new Set();
|
|
5447
|
+
const rootsEvaluated = roots.map(r => ({ root: r, exists: fs.existsSync(r) }));
|
|
5405
5448
|
for (const root of roots) {
|
|
5406
5449
|
if (seenRoots.has(root) || !fs.existsSync(root)) continue;
|
|
5407
5450
|
seenRoots.add(root);
|
|
@@ -5442,11 +5485,24 @@ function cmdListAttestations(runner, args, runOpts, pretty) {
|
|
|
5442
5485
|
count: entries.length,
|
|
5443
5486
|
filter: { playbook: playbookFilter ? [...playbookFilter] : null, since: args.since || null },
|
|
5444
5487
|
roots_searched: [...seenRoots],
|
|
5488
|
+
// Cycle 11 F5 (v0.12.32): every candidate root + whether it existed,
|
|
5489
|
+
// so JSON consumers can distinguish scanned-and-empty from never-created.
|
|
5490
|
+
// The human renderer below also surfaces this rather than printing
|
|
5491
|
+
// "(no attestations under )" with an empty path list.
|
|
5492
|
+
roots_evaluated: rootsEvaluated,
|
|
5445
5493
|
}, pretty, (obj) => {
|
|
5446
5494
|
// v0.11.6 (#95) human renderer for attest list: one row per session.
|
|
5447
5495
|
const lines = [`attest list — ${obj.count} attestation(s)`];
|
|
5448
5496
|
if (obj.count === 0) {
|
|
5449
|
-
|
|
5497
|
+
const evald = obj.roots_evaluated || [];
|
|
5498
|
+
if (evald.length === 0) {
|
|
5499
|
+
lines.push(` (no attestation root resolved; set EXCEPTD_HOME or run from a project with .exceptd/)`);
|
|
5500
|
+
} else {
|
|
5501
|
+
lines.push(` candidate roots evaluated:`);
|
|
5502
|
+
for (const r of evald) {
|
|
5503
|
+
lines.push(` ${r.exists ? '[scanned-empty]' : '[not-present]'} ${r.root}`);
|
|
5504
|
+
}
|
|
5505
|
+
}
|
|
5450
5506
|
return lines.join("\n");
|
|
5451
5507
|
}
|
|
5452
5508
|
lines.push(` ${"session-id".padEnd(20)} ${"playbook".padEnd(16)} ${"captured-at".padEnd(20)} evidence-hash`);
|
package/data/_indexes/_meta.json
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema_version": "1.1.0",
|
|
3
|
-
"generated_at": "2026-05-
|
|
3
|
+
"generated_at": "2026-05-16T04:40:25.150Z",
|
|
4
4
|
"generator": "scripts/build-indexes.js",
|
|
5
5
|
"source_count": 54,
|
|
6
6
|
"source_hashes": {
|
|
7
|
-
"manifest.json": "
|
|
7
|
+
"manifest.json": "e7956bcec2b7aee7f469013be4aff46698c0cb269786775ad54a5096fd348920",
|
|
8
8
|
"data/atlas-ttps.json": "259e76e4252c7a56c17bbe96982a5e37ac89131c2d37a547fe38d64dcacfd763",
|
|
9
9
|
"data/attack-techniques.json": "51f60819aef36e960fd768e44dcc725e137781534fbbb028e5ef6baa21defa1d",
|
|
10
|
-
"data/cve-catalog.json": "
|
|
11
|
-
"data/cwe-catalog.json": "
|
|
12
|
-
"data/d3fend-catalog.json": "
|
|
10
|
+
"data/cve-catalog.json": "55aa571423fd254e6581b22a189a1c0eeb76d467b0ef645d1dfa39f74b28c569",
|
|
11
|
+
"data/cwe-catalog.json": "6e7349a0fac39bdf9c4cb4598e101e51400f67d64c5d653bbca462f28bc1a0cb",
|
|
12
|
+
"data/d3fend-catalog.json": "a1fc2827ceb344669e148d55197dbf1b0e5b20bcc618e90517639c17d67ee82d",
|
|
13
13
|
"data/dlp-controls.json": "d2406c482dddd30e49203879999dc4b3a7fd4d0494d6a61d86b91ee76415df19",
|
|
14
14
|
"data/exploit-availability.json": "a9eeda95d24b56c28a0d0178fc601b531653e2ba7dc857160b35ad23ad6c7471",
|
|
15
|
-
"data/framework-control-gaps.json": "
|
|
15
|
+
"data/framework-control-gaps.json": "f88c5757553e3626981546ad1772189c6d40f9ddc24f730def949414cbab9cd0",
|
|
16
16
|
"data/global-frameworks.json": "0168825497e03f079274c9da2e5529310a2ba5bd7c7da7c93acd0b66ed845b8a",
|
|
17
17
|
"data/rfc-references.json": "e253a548c8a829d178d5aea601e268724b85c936ccbfa51c2e5d80c5f8efe2b0",
|
|
18
|
-
"data/zeroday-lessons.json": "
|
|
18
|
+
"data/zeroday-lessons.json": "c927653e6d9d86d1a36c23a3d782b099a49675ccd928cdc204887c79b0cfbbf1",
|
|
19
19
|
"skills/kernel-lpe-triage/skill.md": "8e94bfd38d6db47342fbbe95a0c8df8f7c38743982c13e9de6a1c59cd3783d33",
|
|
20
20
|
"skills/ai-attack-surface/skill.md": "13e543fc92b9b27cdb647dce96a9eeb44919e0fa92ec41e8265a9981a23e7b79",
|
|
21
21
|
"skills/mcp-agent-trust/skill.md": "3cec1dce668deec44cb7330e165e89cee8379dd90833519004d566baf72c038c",
|
|
@@ -53,11 +53,11 @@
|
|
|
53
53
|
"skills/container-runtime-security/skill.md": "f06260f0c468d6a4f0409294899017edab45c98d71db1fedd7a630fe6a7bf53a",
|
|
54
54
|
"skills/mlops-security/skill.md": "e6a296fc67724aa3b026c0039f44867b44cf0926eade4fe616bfd0a4c77310bf",
|
|
55
55
|
"skills/incident-response-playbook/skill.md": "8ef7ce1246dc1329b6df3cc9de8d79d35e2c02c703dcef20f35b312b1c24fd52",
|
|
56
|
-
"skills/ransomware-response/skill.md": "
|
|
56
|
+
"skills/ransomware-response/skill.md": "603126d81f6c3619f0b2f6d81ea1d6b64f9c8c1296f877ad2e6d802ddab09165",
|
|
57
57
|
"skills/email-security-anti-phishing/skill.md": "b5a7693b3ddbd6cd83303d092bc5e324db431245d25c4945d9f65fcffa1995e7",
|
|
58
58
|
"skills/age-gates-child-safety/skill.md": "c741d7dca9da0abb09bdebb8a02e803ce4ae9fb9a6904fb8df3ec19cae83917d",
|
|
59
|
-
"skills/cloud-iam-incident/skill.md": "
|
|
60
|
-
"skills/idp-incident-response/skill.md": "
|
|
59
|
+
"skills/cloud-iam-incident/skill.md": "10e2af2cf8292f457cd3877bcee37f6ee30c80037a3ef5b367fba25195c7a791",
|
|
60
|
+
"skills/idp-incident-response/skill.md": "3d75d7a0fc5b9a3c584ac5c6510f8b6bd63b7b780488541eb193250ae795b4e2"
|
|
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":
|
|
81
|
+
"token_budget_total_approx": 397485,
|
|
82
82
|
"recipes": 8,
|
|
83
83
|
"jurisdiction_clocks": 29,
|
|
84
84
|
"did_ladders": 8,
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
"artifact": "data/framework-control-gaps.json",
|
|
64
64
|
"path": "data/framework-control-gaps.json",
|
|
65
65
|
"schema_version": "1.0.0",
|
|
66
|
-
"entry_count":
|
|
66
|
+
"entry_count": 118
|
|
67
67
|
},
|
|
68
68
|
{
|
|
69
69
|
"date": "2026-05-15",
|
|
@@ -87,7 +87,7 @@
|
|
|
87
87
|
"artifact": "data/zeroday-lessons.json",
|
|
88
88
|
"path": "data/zeroday-lessons.json",
|
|
89
89
|
"schema_version": "1.1.0",
|
|
90
|
-
"entry_count":
|
|
90
|
+
"entry_count": 22
|
|
91
91
|
},
|
|
92
92
|
{
|
|
93
93
|
"date": "2026-05-15",
|
|
@@ -102,7 +102,7 @@
|
|
|
102
102
|
"artifact": "data/cve-catalog.json",
|
|
103
103
|
"path": "data/cve-catalog.json",
|
|
104
104
|
"schema_version": "1.0.0",
|
|
105
|
-
"entry_count":
|
|
105
|
+
"entry_count": 37
|
|
106
106
|
},
|
|
107
107
|
{
|
|
108
108
|
"date": "2026-05-13",
|
|
@@ -118,7 +118,7 @@
|
|
|
118
118
|
"artifact": "data/d3fend-catalog.json",
|
|
119
119
|
"path": "data/d3fend-catalog.json",
|
|
120
120
|
"schema_version": "1.0.0",
|
|
121
|
-
"entry_count":
|
|
121
|
+
"entry_count": 29
|
|
122
122
|
},
|
|
123
123
|
{
|
|
124
124
|
"date": "2026-05-11",
|
|
@@ -62,7 +62,7 @@
|
|
|
62
62
|
"rebuild_after_days": 365,
|
|
63
63
|
"note": "Per-entry last_verified governs decay. Skills depending on this catalog must check entry freshness before high-stakes use."
|
|
64
64
|
},
|
|
65
|
-
"entry_count":
|
|
65
|
+
"entry_count": 37,
|
|
66
66
|
"sample_keys": [
|
|
67
67
|
"CVE-2025-53773",
|
|
68
68
|
"CVE-2026-30615",
|
|
@@ -106,7 +106,7 @@
|
|
|
106
106
|
"rebuild_after_days": 365,
|
|
107
107
|
"note": "Per-entry last_verified governs decay. Skills depending on this catalog must check entry freshness before high-stakes use."
|
|
108
108
|
},
|
|
109
|
-
"entry_count":
|
|
109
|
+
"entry_count": 29,
|
|
110
110
|
"sample_keys": [
|
|
111
111
|
"D3-EAL",
|
|
112
112
|
"D3-EHB",
|
|
@@ -172,7 +172,7 @@
|
|
|
172
172
|
"rebuild_after_days": 365,
|
|
173
173
|
"note": "Per-entry last_verified governs decay. Skills depending on this catalog must check entry freshness before high-stakes use."
|
|
174
174
|
},
|
|
175
|
-
"entry_count":
|
|
175
|
+
"entry_count": 118,
|
|
176
176
|
"sample_keys": [
|
|
177
177
|
"ALL-AI-PIPELINE-INTEGRITY",
|
|
178
178
|
"ALL-MCP-TOOL-TRUST",
|
|
@@ -238,7 +238,7 @@
|
|
|
238
238
|
"rebuild_after_days": 365,
|
|
239
239
|
"note": "Per-entry last_verified governs decay. Skills depending on this catalog must check entry freshness before high-stakes use."
|
|
240
240
|
},
|
|
241
|
-
"entry_count":
|
|
241
|
+
"entry_count": 22,
|
|
242
242
|
"sample_keys": [
|
|
243
243
|
"CVE-2026-31431",
|
|
244
244
|
"CVE-2025-53773",
|