◎

CVE Enrichment Observatory

A longitudinal observatory of how CVE metadata gets enriched after publication
日本語
Primary data on how long after a CVE is published each piece of metadata arrives (CVSS by issuing party / CPE / each SSVC decision point / EPSS / KEV / vendor advisories / PoC). Time-to-enrichment statistics use only CVEs we started observing right after publication (older CVEs that already carried metadata before this system began observing cannot be timed correctly and are excluded).

The Day-0 information vacuum (what is still missing 24 / 72 / 168 hours after publication)

Share of freshly published CVEs for which decision-relevant information is still missing at that point. Population: CVEs first observed within 24 hours of publication (a value already present at first observation counts as present by that time; the upper-bound error is at most 24 hours). Shows which inputs are missing when a decision framework such as SSVC is run on Day 0.

Key findings (generated from this run's numbers)

Read this first. The sentences are assembled mechanically from the figures in the sections below, with no hand-written interpretation. They update with every run.

Fetch health (observed / absent / fetch failed)

Per-source fetch status. observed = a value was retrieved, absent = the fetch succeeded but no value is attached yet, fetch failed = the fetch errored (value unknown). Keeping these three apart is the core of an observational study. Failure rate and status are monitored per source here.

Observation run cadence (last 7 days)

Actual intervals of the 3-hourly observation runs. GitHub scheduled workflows have been throttled since late August 2026; the fix is dispatch from a Cloudflare Worker (design 8.1). Values from skipped hours cannot be recovered, so the gaps are made visible here.

Daily jobs (NVD snapshot / EUVD / JVN / detection-signature indexes)

Status of the once-a-day workflows. Healthy: last success within 36 h and no consecutive failures. Degraded: 1 to 2 consecutive failures or 36 to 72 h. Down: 3 or more failures or over 72 h. Indexes use the index date as the success date (+24 h grace).

How much is in place 0 / 1 / 3 / 7 days after publication

Share of CVEs with each signal attached within N days of publication (CVEs observed from right after publication; Kaplan-Meier estimate, so CVEs too young to reach N days and CVEs whose follow-up ended at graduation are treated as censored). Shows how many SSVC inputs (Exploitation / Automatable / Technical Impact) are in place on Day 0 and where CVSS comes from. Daily external databases (Red Hat VEX, Debian, GHSA, EUVD) are observed once a day: arrival is bounded by the end of that day, and CVEs already listed when observation began do not count as arrivals (reach reads lower than actual presence; it converges within 90 days of observation start).

Cumulative share enriched versus time since publication

X axis: time since CVE publication. Y axis: share of CVEs with the signal attached by then (CVEs observed from right after publication). Click the legend to toggle lines. The earlier a line rises, the sooner that signal arrives. The line counts arrivals at the first observation that showed the value (lower side); the light band extends to the value counted at the previous observation (lower end of the arrival interval). The true curve lies inside the band. The band is wide for CVEs registered before 2026-11-02 (their lower end is the registration time).

Waiting strategy (how long after publication until what is in place)

The direct answer to the research question. For each waiting time: the share of CVEs that had the signal by then (Kaplan-Meier) and the gain over the previous column, the time at which 50 / 80 / 90% are reached, and the point after which waiting longer adds little. Arrival uses the time of the first observation that showed the value, so shares are lower bounds and times are upper bounds. Waits shorter than 6 hours are below the resolution of the observation cadence (3 h by design, 6 to 8 h measured) and are not shown. Population: CVEs whose observation started within 24 hours of publication.

When a CVE is published changes the wait (by hour and weekday of publication)

For the same signal, the time to arrival depends on the hour (UTC) and weekday the CVE was published. EPSS is a once-a-day model update, so a CVE published just after that boundary waits almost a full day for the next one. CISA-ADP enrichment may follow working hours, but the mix of CNAs also differs by hour and weekday (scheduled bulk publications), so this is not causal on its own. The observation cadence (6 to 8 hours measured) blurs hour-level differences. Population: CVEs whose observation started within 24 hours of publication.

Arrival order (which signal comes first)

For CVEs that received both of two signals: which came first, and by how many hours. A guide to "which signal is worth waiting for": CISA-ADP CVSS and SSVC land together in the same vulnrichment update, EPSS trails CNA CVSS by about a day because the model runs daily. A difference of 0 means both were first seen in the same observation run (simultaneous within the observation resolution). Population: CVEs first observed within 24 hours of publication.

Monthly cohort trend (read against policy changes)

By CVE publication month: share enriched at 24 hours / 7 days / 30 days (Kaplan-Meier). Lets you read how enrichment speed moved around policy changes (the NIST risk-based triage shift, CISA BOD 26-04, and so on). Population: CVEs first observed within 24 hours of publication; months with at least 200 CVEs. Recent months have many CVEs that have not yet reached 30 days; they are treated as censored (the number still at risk is shown).

Completeness at publication by CNA (who ships complete records from the start)

By assigning CNA: share of CVEs with CVSS or SSVC attached at 24 hours / 7 days after publication. Whether the CNA ships CVSS itself, CISA-ADP fills the gap, or nothing arrives differs sharply by CNA. Population: CVEs first observed within 24 hours of publication whose assigner is recorded (assigner recorded since October 2026). CISA-ADP CVSS mostly lands on CVEs without CNA CVSS, so read that column as "filled by ADP".

Where CVSS comes from (by issuing party)

After the triage shift: how much CVSS comes from the CNA, CISA-ADP, and NVD. NVD is currently withheld because this system queried only a narrow subset (see the note).

Per-CVE enrichment (time since publication)

For each CVE, how long after publication each signal arrived (hours/days). Old CVEs marked "published before start" (2022 to 2025 and so on) appear because their records were recently updated and entered the change feed; they were published long ago and are excluded from the timing statistics.

Signal catalog (source, cadence, basis of the arrival time, population)

Where each signal on this page comes from, how often it is fetched, and what its arrival time is measured by. The full catalog is section 4.11 of the design document.

SignalSource and cadenceBasis of the arrival timePopulation
CVSS (CNA)hourly cvelistV5 delta (runs every 3 h)time of the first observation that showed it (upper bound); present at publication for most, so only presence is shownall CVEs
CVSS (CISA-ADP), the 3 SSVC pointssame (ADP container)first observation that showed it (upper bound) and the previous observation (lower end)all CVEs
CVSS (NVD), NVD analysis statusNVD cvehistory deltas (every 3 h) and the daily vulnStatus snapshotNVD eventDate (claimed)all CVEs (reach withheld, see the notes)
CPEcvelistV5 (CNA and ADP)first observation that showed it; presence onlyall CVEs
EPSSFIRST daily CSV (date-gated per run)first observation that showed it (upper bound); one model update per dayall CVEs
KEV listingCISA KEV catalog (every 3 h) and the kev-data git historydateAdded (claimed) and first time seenall CVEs
Red Hat VEX listingVEX index changes.csv (daily)end of the day the listing was observed (upper bound)CVEs published from the ledger start (2026-11-02)
Debian tracker listingsecurity tracker JSON (daily)samepublished from 2026-11-02
GitHub advisory (GHSA)Advisory Database REST (daily, publication-date window)GitHub published_at (claimed; 0 h if before CVE publication)CVEs with a reviewed advisory (about 5% of all)
ENISA EUVD listingCVE mapping dump (daily)end of the day the listing was observed (upper bound)published from 2026-10-19
PSIRT (Red Hat), PoC (PoC-in-GitHub)per-CVE queries with a budgetfirst observation that showed itqueried subset only; reach withheld (see the notes)
Detection signatures (TTODS: Greenbone, Notus, ET Open, nuclei, Metasploit, PoC-in-GitHub)daily index fetch or git-history reconstruction (daily)first day seen in the index, or the first-add commit timeall CVEs; derived tables distributed separately, not on this page

Methods and caveats (for evaluators)

  1. What is measured. Not the vulnerabilities themselves but the metadata around each CVE (CVSS, CPE, SSVC, EPSS, KEV, advisories, PoC and so on) and the time scale on which it arrives after publication. The origin t0 is datePublished in cvelistV5 (the issuer's claimed time).
  2. Population. CVEs that first appear in the hourly cvelistV5 delta are registered as a cohort and followed for 90 days. Time-to-event aggregates use CVEs whose observation started within 72 hours of t0 (fresh cohorts). The Day-0 headline, waiting strategy and arrival order narrow this to 24 hours. Old CVEs that surface through an update are excluded.
  3. Three states. The raw log distinguishes observed (a value existed), absent (fetched, no value yet) and fetch_failed (the fetch failed, presence unknown). absent is censoring, fetch_failed is missing data; they are never mixed.
  4. Arrival time and its interval. Arrival is the time of the first observation that showed the value (upper end of the interval). The true arrival lies between that and the previous observation, when the value was absent (lower end). Solid lines and table values count at the upper end (lower-side estimate); the light band and the right side of a range count at the lower end. Signals with an issuer-claimed time (GHSA published_at, KEV dateAdded) use it, and a claimed time before CVE publication counts as present at publication (rule R-12).
  5. Estimator. "Share with the signal by N hours" is the Kaplan-Meier cumulative incidence 1 − S(t). Censoring is the end of follow-up (graduation, else the aggregation time), so CVEs too young to have reached N hours leave the denominator correctly (rule R-11).
  6. Confidence intervals. The KM values in the Day 0 headline, the waiting strategy and the per-CNA table carry 95% confidence intervals from Greenwood's variance (normal approximation, clipped to 0–1). These cover sampling error only, not the width of the arrival interval (upper and lower end) nor the systematic effect of throttled observation runs. For the whole population the width is under 1 point; for CNAs with n around 100 it is several points.
  7. Resolution. The design cadence is every 3 hours; GitHub schedule throttling makes the measured gap 6 to 8 hours (see "Observation run cadence"). Time differences finer than that cannot be read. The waiting-strategy table does not show waits shorter than 6 hours.
  8. Withheld metrics. Arrival times for CNA-issued CVSS and CPE (present at first observation for most CVEs), and the reach of NVD CVSS, PSIRT and PoC (narrow query scope) are withheld; the reasons are in the notes section.
  9. Sources and licenses. cvelistV5, NVD, CISA KEV, FIRST EPSS, ENISA EUVD, JVN iPedia, Red Hat VEX, the Debian security tracker, the GitHub Advisory Database, and the Greenbone / ET Open / nuclei / Metasploit / PoC-in-GitHub indexes. All public information. The license of derived data is in DATA_LICENSE in the repository.
Details: design document (docs/design_latest.md, chapters 6 and 13, in Japanese) and known limitations (docs/limitations.md). Source data for this page: data/dashboard.json (updated every run).
Aggregated from immutable raw observation logs (append-only Parquet). Observed / absent / fetch-failed are kept strictly apart, and both the issuer-declared time and this system's fetch time are retained. ·  Sources: cvelistV5 / NVD / CISA KEV / FIRST EPSS / vendor CSAF / public PoC indexes (all public information).