diff --git a/07-framework-security/cms/directus/INDEX.md b/07-framework-security/cms/directus/INDEX.md index c14b23f4..274b9365 100644 --- a/07-framework-security/cms/directus/INDEX.md +++ b/07-framework-security/cms/directus/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `29` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:19+00:00` ## 目标约束 diff --git a/07-framework-security/cms/discourse/INDEX.md b/07-framework-security/cms/discourse/INDEX.md index 0ab13f0a..02001cbe 100644 --- a/07-framework-security/cms/discourse/INDEX.md +++ b/07-framework-security/cms/discourse/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `30` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:19+00:00` ## 目标约束 diff --git a/07-framework-security/cms/drupal/INDEX.md b/07-framework-security/cms/drupal/INDEX.md index 6f065cac..0c33200c 100644 --- a/07-framework-security/cms/drupal/INDEX.md +++ b/07-framework-security/cms/drupal/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `70` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:19+00:00` ## 目标约束 diff --git a/07-framework-security/cms/ghost/INDEX.md b/07-framework-security/cms/ghost/INDEX.md index c241cfe5..615c81c6 100644 --- a/07-framework-security/cms/ghost/INDEX.md +++ b/07-framework-security/cms/ghost/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `23` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:19+00:00` ## 目标约束 diff --git a/07-framework-security/cms/joomla/INDEX.md b/07-framework-security/cms/joomla/INDEX.md index cec928c7..7d478df1 100644 --- a/07-framework-security/cms/joomla/INDEX.md +++ b/07-framework-security/cms/joomla/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `100` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:19+00:00` ## 目标约束 diff --git a/07-framework-security/cms/mediawiki/INDEX.md b/07-framework-security/cms/mediawiki/INDEX.md index 54d2d430..6c8babed 100644 --- a/07-framework-security/cms/mediawiki/INDEX.md +++ b/07-framework-security/cms/mediawiki/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `70` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:19+00:00` ## 目标约束 diff --git a/07-framework-security/cms/moodle/INDEX.md b/07-framework-security/cms/moodle/INDEX.md index fccf429b..1e8be337 100644 --- a/07-framework-security/cms/moodle/INDEX.md +++ b/07-framework-security/cms/moodle/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `40` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:19+00:00` ## 目标约束 diff --git a/07-framework-security/cms/strapi/INDEX.md b/07-framework-security/cms/strapi/INDEX.md index 1f122e86..5ab223dd 100644 --- a/07-framework-security/cms/strapi/INDEX.md +++ b/07-framework-security/cms/strapi/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `26` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:19+00:00` ## 目标约束 diff --git a/07-framework-security/cms/wordpress/INDEX.md b/07-framework-security/cms/wordpress/INDEX.md index 4bb24869..dc20129c 100644 --- a/07-framework-security/cms/wordpress/INDEX.md +++ b/07-framework-security/cms/wordpress/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `140` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:19+00:00` ## 目标约束 diff --git a/07-framework-security/ecommerce/adobe-commerce/INDEX.md b/07-framework-security/ecommerce/adobe-commerce/INDEX.md index 0c7d3c9c..0d462f94 100644 --- a/07-framework-security/ecommerce/adobe-commerce/INDEX.md +++ b/07-framework-security/ecommerce/adobe-commerce/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `81` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:19+00:00` ## 目标约束 diff --git a/07-framework-security/ecommerce/magento-open-source/INDEX.md b/07-framework-security/ecommerce/magento-open-source/INDEX.md index 967886a7..2996ea38 100644 --- a/07-framework-security/ecommerce/magento-open-source/INDEX.md +++ b/07-framework-security/ecommerce/magento-open-source/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `89` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:19+00:00` ## 目标约束 diff --git a/07-framework-security/ecommerce/medusa/INDEX.md b/07-framework-security/ecommerce/medusa/INDEX.md index f8216930..089d7465 100644 --- a/07-framework-security/ecommerce/medusa/INDEX.md +++ b/07-framework-security/ecommerce/medusa/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `15` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:19+00:00` ## 目标约束 diff --git a/07-framework-security/ecommerce/opencart/INDEX.md b/07-framework-security/ecommerce/opencart/INDEX.md index fc68d364..fa16406c 100644 --- a/07-framework-security/ecommerce/opencart/INDEX.md +++ b/07-framework-security/ecommerce/opencart/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `100` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:19+00:00` ## 目标约束 diff --git a/07-framework-security/ecommerce/openmage/INDEX.md b/07-framework-security/ecommerce/openmage/INDEX.md index fde5c1b3..c7d022da 100644 --- a/07-framework-security/ecommerce/openmage/INDEX.md +++ b/07-framework-security/ecommerce/openmage/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `27` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:19+00:00` ## 目标约束 diff --git a/07-framework-security/ecommerce/prestashop/INDEX.md b/07-framework-security/ecommerce/prestashop/INDEX.md index 4781d7b0..95ba0579 100644 --- a/07-framework-security/ecommerce/prestashop/INDEX.md +++ b/07-framework-security/ecommerce/prestashop/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `112` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:19+00:00` ## 目标约束 diff --git a/07-framework-security/ecommerce/saleor/INDEX.md b/07-framework-security/ecommerce/saleor/INDEX.md index 7f1d9f40..7ec64769 100644 --- a/07-framework-security/ecommerce/saleor/INDEX.md +++ b/07-framework-security/ecommerce/saleor/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `24` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:19+00:00` ## 目标约束 diff --git a/07-framework-security/ecommerce/shopware/INDEX.md b/07-framework-security/ecommerce/shopware/INDEX.md index aa864531..26a8bf3e 100644 --- a/07-framework-security/ecommerce/shopware/INDEX.md +++ b/07-framework-security/ecommerce/shopware/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `71` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:19+00:00` ## 目标约束 diff --git a/07-framework-security/ecommerce/woocommerce/INDEX.md b/07-framework-security/ecommerce/woocommerce/INDEX.md index 7ff92663..f0070a94 100644 --- a/07-framework-security/ecommerce/woocommerce/INDEX.md +++ b/07-framework-security/ecommerce/woocommerce/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `111` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:19+00:00` ## 目标约束 diff --git a/07-framework-security/frameworks/angular/INDEX.md b/07-framework-security/frameworks/angular/INDEX.md index 7ca1ad40..b2ea8304 100644 --- a/07-framework-security/frameworks/angular/INDEX.md +++ b/07-framework-security/frameworks/angular/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `2` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:19+00:00` ## 目标约束 diff --git a/07-framework-security/frameworks/aspnet-core/INDEX.md b/07-framework-security/frameworks/aspnet-core/INDEX.md index 15b0d74b..a50ea42a 100644 --- a/07-framework-security/frameworks/aspnet-core/INDEX.md +++ b/07-framework-security/frameworks/aspnet-core/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `3` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:20+00:00` ## 目标约束 diff --git a/07-framework-security/frameworks/astro/INDEX.md b/07-framework-security/frameworks/astro/INDEX.md index 15254d2d..53fd26ed 100644 --- a/07-framework-security/frameworks/astro/INDEX.md +++ b/07-framework-security/frameworks/astro/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `14` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:19+00:00` ## 目标约束 diff --git a/07-framework-security/frameworks/django/INDEX.md b/07-framework-security/frameworks/django/INDEX.md index e54a71d6..aa0d91ec 100644 --- a/07-framework-security/frameworks/django/INDEX.md +++ b/07-framework-security/frameworks/django/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `82` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:20+00:00` ## 目标约束 diff --git a/07-framework-security/frameworks/echo/INDEX.md b/07-framework-security/frameworks/echo/INDEX.md index c31f2bb6..d27a2905 100644 --- a/07-framework-security/frameworks/echo/INDEX.md +++ b/07-framework-security/frameworks/echo/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `2` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:20+00:00` ## 目标约束 diff --git a/07-framework-security/frameworks/esbuild/INDEX.md b/07-framework-security/frameworks/esbuild/INDEX.md index e9670bf6..bb28a1e3 100644 --- a/07-framework-security/frameworks/esbuild/INDEX.md +++ b/07-framework-security/frameworks/esbuild/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `1` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:19+00:00` ## 目标约束 diff --git a/07-framework-security/frameworks/express/INDEX.md b/07-framework-security/frameworks/express/INDEX.md index 99ebda59..6ebdb0c4 100644 --- a/07-framework-security/frameworks/express/INDEX.md +++ b/07-framework-security/frameworks/express/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `1` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:19+00:00` ## 目标约束 diff --git a/07-framework-security/frameworks/fastify/INDEX.md b/07-framework-security/frameworks/fastify/INDEX.md index f0aac840..3d5e2ff2 100644 --- a/07-framework-security/frameworks/fastify/INDEX.md +++ b/07-framework-security/frameworks/fastify/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `1` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:19+00:00` ## 目标约束 diff --git a/07-framework-security/frameworks/flask/INDEX.md b/07-framework-security/frameworks/flask/INDEX.md index fbfe55a4..55854d37 100644 --- a/07-framework-security/frameworks/flask/INDEX.md +++ b/07-framework-security/frameworks/flask/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `1` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:20+00:00` ## 目标约束 diff --git a/07-framework-security/frameworks/gin/INDEX.md b/07-framework-security/frameworks/gin/INDEX.md index af9531d1..eb77e1b0 100644 --- a/07-framework-security/frameworks/gin/INDEX.md +++ b/07-framework-security/frameworks/gin/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `1` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:20+00:00` ## 目标约束 diff --git a/07-framework-security/frameworks/hapi/INDEX.md b/07-framework-security/frameworks/hapi/INDEX.md index 7f807199..baa46642 100644 --- a/07-framework-security/frameworks/hapi/INDEX.md +++ b/07-framework-security/frameworks/hapi/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `1` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:19+00:00` ## 目标约束 diff --git a/07-framework-security/frameworks/koa/INDEX.md b/07-framework-security/frameworks/koa/INDEX.md index 82c580cb..5f45e2b5 100644 --- a/07-framework-security/frameworks/koa/INDEX.md +++ b/07-framework-security/frameworks/koa/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `1` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:19+00:00` ## 目标约束 diff --git a/07-framework-security/frameworks/laravel/INDEX.md b/07-framework-security/frameworks/laravel/INDEX.md index cb25b354..c70b7f5e 100644 --- a/07-framework-security/frameworks/laravel/INDEX.md +++ b/07-framework-security/frameworks/laravel/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `2` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:19+00:00` ## 目标约束 diff --git a/07-framework-security/frameworks/nestjs/INDEX.md b/07-framework-security/frameworks/nestjs/INDEX.md index 740952d7..37faed1a 100644 --- a/07-framework-security/frameworks/nestjs/INDEX.md +++ b/07-framework-security/frameworks/nestjs/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `2` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:19+00:00` ## 目标约束 diff --git a/07-framework-security/frameworks/nextjs/INDEX.md b/07-framework-security/frameworks/nextjs/INDEX.md index 883ebafd..ec48d63d 100644 --- a/07-framework-security/frameworks/nextjs/INDEX.md +++ b/07-framework-security/frameworks/nextjs/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `40` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:19+00:00` ## 目标约束 diff --git a/07-framework-security/frameworks/nodejs/INDEX.md b/07-framework-security/frameworks/nodejs/INDEX.md index a36f5a63..13ac5c87 100644 --- a/07-framework-security/frameworks/nodejs/INDEX.md +++ b/07-framework-security/frameworks/nodejs/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `8` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:19+00:00` ## 目标约束 diff --git a/07-framework-security/frameworks/nuxt/INDEX.md b/07-framework-security/frameworks/nuxt/INDEX.md index afa88c8d..8a12e559 100644 --- a/07-framework-security/frameworks/nuxt/INDEX.md +++ b/07-framework-security/frameworks/nuxt/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `28` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:19+00:00` ## 目标约束 diff --git a/07-framework-security/frameworks/rails/INDEX.md b/07-framework-security/frameworks/rails/INDEX.md index 70365e63..68745755 100644 --- a/07-framework-security/frameworks/rails/INDEX.md +++ b/07-framework-security/frameworks/rails/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `42` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:20+00:00` ## 目标约束 diff --git a/07-framework-security/frameworks/react/INDEX.md b/07-framework-security/frameworks/react/INDEX.md index b81526e4..f667d21f 100644 --- a/07-framework-security/frameworks/react/INDEX.md +++ b/07-framework-security/frameworks/react/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `21` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:19+00:00` ## 目标约束 diff --git a/07-framework-security/frameworks/spring-boot/INDEX.md b/07-framework-security/frameworks/spring-boot/INDEX.md index 5418b25a..820f938c 100644 --- a/07-framework-security/frameworks/spring-boot/INDEX.md +++ b/07-framework-security/frameworks/spring-boot/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `2` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:19+00:00` ## 目标约束 diff --git a/07-framework-security/frameworks/spring-framework/INDEX.md b/07-framework-security/frameworks/spring-framework/INDEX.md index c6ea86ae..08cf1917 100644 --- a/07-framework-security/frameworks/spring-framework/INDEX.md +++ b/07-framework-security/frameworks/spring-framework/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `11` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:19+00:00` ## 目标约束 diff --git a/07-framework-security/frameworks/spring-security/INDEX.md b/07-framework-security/frameworks/spring-security/INDEX.md index 6a6465d6..620c6897 100644 --- a/07-framework-security/frameworks/spring-security/INDEX.md +++ b/07-framework-security/frameworks/spring-security/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `3` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:19+00:00` ## 目标约束 diff --git a/07-framework-security/frameworks/sveltekit/INDEX.md b/07-framework-security/frameworks/sveltekit/INDEX.md index b1dfcd6f..0800673f 100644 --- a/07-framework-security/frameworks/sveltekit/INDEX.md +++ b/07-framework-security/frameworks/sveltekit/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `3` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:19+00:00` ## 目标约束 diff --git a/07-framework-security/frameworks/symfony/INDEX.md b/07-framework-security/frameworks/symfony/INDEX.md index 575a3565..4b37fc6f 100644 --- a/07-framework-security/frameworks/symfony/INDEX.md +++ b/07-framework-security/frameworks/symfony/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `9` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:19+00:00` ## 目标约束 diff --git a/07-framework-security/frameworks/undici/INDEX.md b/07-framework-security/frameworks/undici/INDEX.md index b87ab8bd..ffd0deab 100644 --- a/07-framework-security/frameworks/undici/INDEX.md +++ b/07-framework-security/frameworks/undici/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `9` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:19+00:00` ## 目标约束 diff --git a/07-framework-security/frameworks/vite/INDEX.md b/07-framework-security/frameworks/vite/INDEX.md index c328c6fd..a31e40e3 100644 --- a/07-framework-security/frameworks/vite/INDEX.md +++ b/07-framework-security/frameworks/vite/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `30` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:19+00:00` ## 目标约束 diff --git a/07-framework-security/frameworks/vue/INDEX.md b/07-framework-security/frameworks/vue/INDEX.md index 02d106d7..7d9a7532 100644 --- a/07-framework-security/frameworks/vue/INDEX.md +++ b/07-framework-security/frameworks/vue/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `15` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:19+00:00` ## 目标约束 diff --git a/07-framework-security/frameworks/webpack/INDEX.md b/07-framework-security/frameworks/webpack/INDEX.md index 0a096dd6..bc78299d 100644 --- a/07-framework-security/frameworks/webpack/INDEX.md +++ b/07-framework-security/frameworks/webpack/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `1` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:19+00:00` ## 目标约束 diff --git a/07-framework-security/frameworks/werkzeug/INDEX.md b/07-framework-security/frameworks/werkzeug/INDEX.md index d2892734..86353321 100644 --- a/07-framework-security/frameworks/werkzeug/INDEX.md +++ b/07-framework-security/frameworks/werkzeug/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `1` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:20+00:00` ## 目标约束 diff --git a/07-framework-security/platforms/adminer/INDEX.md b/07-framework-security/platforms/adminer/INDEX.md index 90103f12..3f5154a8 100644 --- a/07-framework-security/platforms/adminer/INDEX.md +++ b/07-framework-security/platforms/adminer/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `2` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:20+00:00` ## 目标约束 diff --git a/07-framework-security/platforms/gitea/INDEX.md b/07-framework-security/platforms/gitea/INDEX.md index cb8a39ab..71f88614 100644 --- a/07-framework-security/platforms/gitea/INDEX.md +++ b/07-framework-security/platforms/gitea/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `13` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:20+00:00` ## 目标约束 diff --git a/07-framework-security/platforms/gitlab-ce/INDEX.md b/07-framework-security/platforms/gitlab-ce/INDEX.md index 35afdd63..868ebffd 100644 --- a/07-framework-security/platforms/gitlab-ce/INDEX.md +++ b/07-framework-security/platforms/gitlab-ce/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `55` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:20+00:00` ## 目标约束 diff --git a/07-framework-security/platforms/grafana/INDEX.md b/07-framework-security/platforms/grafana/INDEX.md index a93f4c50..5b386632 100644 --- a/07-framework-security/platforms/grafana/INDEX.md +++ b/07-framework-security/platforms/grafana/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `60` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:20+00:00` ## 目标约束 diff --git a/07-framework-security/platforms/jenkins/INDEX.md b/07-framework-security/platforms/jenkins/INDEX.md index 056dbf10..a7fdea15 100644 --- a/07-framework-security/platforms/jenkins/INDEX.md +++ b/07-framework-security/platforms/jenkins/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `60` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:20+00:00` ## 目标约束 diff --git a/07-framework-security/platforms/kibana/INDEX.md b/07-framework-security/platforms/kibana/INDEX.md index 6ff2e262..e032af83 100644 --- a/07-framework-security/platforms/kibana/INDEX.md +++ b/07-framework-security/platforms/kibana/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `41` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:20+00:00` ## 目标约束 diff --git a/07-framework-security/platforms/mattermost/INDEX.md b/07-framework-security/platforms/mattermost/INDEX.md index ce2ff836..7ecb2447 100644 --- a/07-framework-security/platforms/mattermost/INDEX.md +++ b/07-framework-security/platforms/mattermost/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `20` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:20+00:00` ## 目标约束 diff --git a/07-framework-security/platforms/phpmyadmin/INDEX.md b/07-framework-security/platforms/phpmyadmin/INDEX.md index c31955ba..d7db28af 100644 --- a/07-framework-security/platforms/phpmyadmin/INDEX.md +++ b/07-framework-security/platforms/phpmyadmin/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `50` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:20+00:00` ## 目标约束 diff --git a/07-framework-security/platforms/redmine/INDEX.md b/07-framework-security/platforms/redmine/INDEX.md index 730c12c5..c9c175f3 100644 --- a/07-framework-security/platforms/redmine/INDEX.md +++ b/07-framework-security/platforms/redmine/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `50` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:20+00:00` ## 目标约束 diff --git a/07-framework-security/servers/apache-httpd/INDEX.md b/07-framework-security/servers/apache-httpd/INDEX.md index 0f7aa82e..e95938b2 100644 --- a/07-framework-security/servers/apache-httpd/INDEX.md +++ b/07-framework-security/servers/apache-httpd/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `135` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:20+00:00` ## 目标约束 diff --git a/07-framework-security/servers/apache-tomcat/INDEX.md b/07-framework-security/servers/apache-tomcat/INDEX.md index 46b354dc..13441a9e 100644 --- a/07-framework-security/servers/apache-tomcat/INDEX.md +++ b/07-framework-security/servers/apache-tomcat/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `136` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:20+00:00` ## 目标约束 diff --git a/07-framework-security/servers/caddy/INDEX.md b/07-framework-security/servers/caddy/INDEX.md index 129ae2b0..dff42252 100644 --- a/07-framework-security/servers/caddy/INDEX.md +++ b/07-framework-security/servers/caddy/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `27` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:20+00:00` ## 目标约束 diff --git a/07-framework-security/servers/haproxy/INDEX.md b/07-framework-security/servers/haproxy/INDEX.md index f2f46836..e487dc7f 100644 --- a/07-framework-security/servers/haproxy/INDEX.md +++ b/07-framework-security/servers/haproxy/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `6` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:20+00:00` ## 目标约束 diff --git a/07-framework-security/servers/nginx/INDEX.md b/07-framework-security/servers/nginx/INDEX.md index d3db7279..a25a6280 100644 --- a/07-framework-security/servers/nginx/INDEX.md +++ b/07-framework-security/servers/nginx/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `110` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:20+00:00` ## 目标约束 diff --git a/07-framework-security/servers/traefik/INDEX.md b/07-framework-security/servers/traefik/INDEX.md index 0f738320..3c7820b9 100644 --- a/07-framework-security/servers/traefik/INDEX.md +++ b/07-framework-security/servers/traefik/INDEX.md @@ -12,7 +12,7 @@ - 已实证(synthetic): `0` - 阻塞数: `0` - 待人工/缺浏览器证据: `43` -- 最近渲染时间: `2026-03-19T02:23:04+00:00` +- 最近渲染时间: `2026-03-19T02:27:20+00:00` ## 目标约束 diff --git a/08-threat-intel/generated/alerts.json b/08-threat-intel/generated/alerts.json index fe51488c..2272ccb2 100644 --- a/08-threat-intel/generated/alerts.json +++ b/08-threat-intel/generated/alerts.json @@ -1 +1,110 @@ -[] +[ + { + "alert_id": "django::OSV Django", + "system_id": "django", + "display_name": "Django", + "source_name": "OSV Django", + "source_kind": "osv-batch", + "status": "resolved", + "opened_at": "2026-03-19T02:27:12+00:00", + "updated_at": "2026-03-19T02:27:12+00:00", + "resolved_at": "2026-03-19T02:27:12+00:00", + "failure_streak": 1, + "last_category": "tls", + "last_failure": { + "system_id": "django", + "display_name": "Django", + "source_name": "OSV Django", + "source_kind": "osv-batch", + "source_bucket": "official_sources", + "category": "tls", + "exception": "SSLError", + "message": "HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))", + "status_code": null, + "url": "", + "summary": "django::OSV Django::tls::HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))", + "elapsed_seconds": 25.112 + } + }, + { + "alert_id": "flask::OSV Flask", + "system_id": "flask", + "display_name": "Flask", + "source_name": "OSV Flask", + "source_kind": "osv-batch", + "status": "resolved", + "opened_at": "2026-03-19T02:27:12+00:00", + "updated_at": "2026-03-19T02:27:12+00:00", + "resolved_at": "2026-03-19T02:27:12+00:00", + "failure_streak": 1, + "last_category": "tls", + "last_failure": { + "system_id": "flask", + "display_name": "Flask", + "source_name": "OSV Flask", + "source_kind": "osv-batch", + "source_bucket": "official_sources", + "category": "tls", + "exception": "SSLError", + "message": "HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))", + "status_code": null, + "url": "", + "summary": "flask::OSV Flask::tls::HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))", + "elapsed_seconds": 25.129 + } + }, + { + "alert_id": "spring-security::OSV Spring Security", + "system_id": "spring-security", + "display_name": "Spring Security", + "source_name": "OSV Spring Security", + "source_kind": "osv-batch", + "status": "resolved", + "opened_at": "2026-03-19T02:27:12+00:00", + "updated_at": "2026-03-19T02:27:12+00:00", + "resolved_at": "2026-03-19T02:27:12+00:00", + "failure_streak": 1, + "last_category": "tls", + "last_failure": { + "system_id": "spring-security", + "display_name": "Spring Security", + "source_name": "OSV Spring Security", + "source_kind": "osv-batch", + "source_bucket": "ecosystem_sources", + "category": "tls", + "exception": "SSLError", + "message": "HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))", + "status_code": null, + "url": "", + "summary": "spring-security::OSV Spring Security::tls::HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))", + "elapsed_seconds": 25.247 + } + }, + { + "alert_id": "symfony::OSV Symfony", + "system_id": "symfony", + "display_name": "Symfony", + "source_name": "OSV Symfony", + "source_kind": "osv-batch", + "status": "resolved", + "opened_at": "2026-03-19T02:27:12+00:00", + "updated_at": "2026-03-19T02:27:12+00:00", + "resolved_at": "2026-03-19T02:27:12+00:00", + "failure_streak": 1, + "last_category": "tls", + "last_failure": { + "system_id": "symfony", + "display_name": "Symfony", + "source_name": "OSV Symfony", + "source_kind": "osv-batch", + "source_bucket": "official_sources", + "category": "tls", + "exception": "SSLError", + "message": "HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))", + "status_code": null, + "url": "", + "summary": "symfony::OSV Symfony::tls::HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))", + "elapsed_seconds": 25.232 + } + } +] diff --git a/08-threat-intel/generated/dashboard/architecture.json b/08-threat-intel/generated/dashboard/architecture.json index b3933a7d..a6d2ffc7 100644 --- a/08-threat-intel/generated/dashboard/architecture.json +++ b/08-threat-intel/generated/dashboard/architecture.json @@ -1,5 +1,5 @@ { - "generated_at": "2026-03-19T02:23:04+00:00", + "generated_at": "2026-03-19T02:27:20+00:00", "title": "\u5f53\u524d\u67b6\u6784\u5e93", "summary": "\u5de5\u4f5c\u53f0\u3001\u63a7\u5236\u9762\u3001\u6570\u636e\u5c42\u3001\u6388\u6743\u8fb9\u754c\u4e0e\u7cfb\u7edf\u8986\u76d6\u7684\u5f53\u524d\u771f\u503c\u89c6\u56fe\u3002", "sections": [ @@ -49,7 +49,7 @@ }, { "label": "\u751f\u6210\u65f6\u95f4", - "value": "2026-03-19T02:23:04+00:00" + "value": "2026-03-19T02:27:20+00:00" } ], "links": [ diff --git a/08-threat-intel/generated/dashboard/data/alerts.json b/08-threat-intel/generated/dashboard/data/alerts.json index fe51488c..2272ccb2 100644 --- a/08-threat-intel/generated/dashboard/data/alerts.json +++ b/08-threat-intel/generated/dashboard/data/alerts.json @@ -1 +1,110 @@ -[] +[ + { + "alert_id": "django::OSV Django", + "system_id": "django", + "display_name": "Django", + "source_name": "OSV Django", + "source_kind": "osv-batch", + "status": "resolved", + "opened_at": "2026-03-19T02:27:12+00:00", + "updated_at": "2026-03-19T02:27:12+00:00", + "resolved_at": "2026-03-19T02:27:12+00:00", + "failure_streak": 1, + "last_category": "tls", + "last_failure": { + "system_id": "django", + "display_name": "Django", + "source_name": "OSV Django", + "source_kind": "osv-batch", + "source_bucket": "official_sources", + "category": "tls", + "exception": "SSLError", + "message": "HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))", + "status_code": null, + "url": "", + "summary": "django::OSV Django::tls::HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))", + "elapsed_seconds": 25.112 + } + }, + { + "alert_id": "flask::OSV Flask", + "system_id": "flask", + "display_name": "Flask", + "source_name": "OSV Flask", + "source_kind": "osv-batch", + "status": "resolved", + "opened_at": "2026-03-19T02:27:12+00:00", + "updated_at": "2026-03-19T02:27:12+00:00", + "resolved_at": "2026-03-19T02:27:12+00:00", + "failure_streak": 1, + "last_category": "tls", + "last_failure": { + "system_id": "flask", + "display_name": "Flask", + "source_name": "OSV Flask", + "source_kind": "osv-batch", + "source_bucket": "official_sources", + "category": "tls", + "exception": "SSLError", + "message": "HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))", + "status_code": null, + "url": "", + "summary": "flask::OSV Flask::tls::HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))", + "elapsed_seconds": 25.129 + } + }, + { + "alert_id": "spring-security::OSV Spring Security", + "system_id": "spring-security", + "display_name": "Spring Security", + "source_name": "OSV Spring Security", + "source_kind": "osv-batch", + "status": "resolved", + "opened_at": "2026-03-19T02:27:12+00:00", + "updated_at": "2026-03-19T02:27:12+00:00", + "resolved_at": "2026-03-19T02:27:12+00:00", + "failure_streak": 1, + "last_category": "tls", + "last_failure": { + "system_id": "spring-security", + "display_name": "Spring Security", + "source_name": "OSV Spring Security", + "source_kind": "osv-batch", + "source_bucket": "ecosystem_sources", + "category": "tls", + "exception": "SSLError", + "message": "HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))", + "status_code": null, + "url": "", + "summary": "spring-security::OSV Spring Security::tls::HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))", + "elapsed_seconds": 25.247 + } + }, + { + "alert_id": "symfony::OSV Symfony", + "system_id": "symfony", + "display_name": "Symfony", + "source_name": "OSV Symfony", + "source_kind": "osv-batch", + "status": "resolved", + "opened_at": "2026-03-19T02:27:12+00:00", + "updated_at": "2026-03-19T02:27:12+00:00", + "resolved_at": "2026-03-19T02:27:12+00:00", + "failure_streak": 1, + "last_category": "tls", + "last_failure": { + "system_id": "symfony", + "display_name": "Symfony", + "source_name": "OSV Symfony", + "source_kind": "osv-batch", + "source_bucket": "official_sources", + "category": "tls", + "exception": "SSLError", + "message": "HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))", + "status_code": null, + "url": "", + "summary": "symfony::OSV Symfony::tls::HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))", + "elapsed_seconds": 25.232 + } + } +] diff --git a/08-threat-intel/generated/dashboard/data/completeness.json b/08-threat-intel/generated/dashboard/data/completeness.json index 332e59dd..706cd7eb 100644 --- a/08-threat-intel/generated/dashboard/data/completeness.json +++ b/08-threat-intel/generated/dashboard/data/completeness.json @@ -1,5 +1,5 @@ { - "generated_at": "2026-03-19T02:23:04+00:00", + "generated_at": "2026-03-19T02:27:20+00:00", "advisory_total": 89, "registry_advisory_total": 2392, "scope": "latest-run-backed-advisories", @@ -168,30 +168,25 @@ } ], "ingest_health": { - "failure_count": 4, - "failures": [ - "django::OSV Django::tls::HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))", - "flask::OSV Flask::tls::HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))", - "spring-security::OSV Spring Security::tls::HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))", - "symfony::OSV Symfony::tls::HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))" - ] + "failure_count": 0, + "failures": [] }, "source_health": { "active_source_count": 118, "green_source_count": 118, "failure_count": 0, - "last_fully_green_run": "2026-03-19T02:22:24+00:00", + "last_fully_green_run": "2026-03-19T02:27:12+00:00", "open_alert_count": 0, - "resolved_alert_count": 0 + "resolved_alert_count": 4 }, "monitor_summary": { - "generated_at": "2026-03-19T02:22:24+00:00", + "generated_at": "2026-03-19T02:27:12+00:00", "active_source_count": 118, "green_source_count": 118, "source_failure_count": 0, "open_alert_count": 0, - "resolved_alert_count": 0, - "last_fully_green_run": "2026-03-19T02:22:24+00:00", + "resolved_alert_count": 4, + "last_fully_green_run": "2026-03-19T02:27:12+00:00", "source_catalog": { "system_count": 62, "source_count": 173, @@ -200,7 +195,7 @@ "ingest": { "new_count": 0, "updated_count": 7, - "failure_count": 4, + "failure_count": 0, "systems_touched": [ "nextjs", "undici" diff --git a/08-threat-intel/generated/dashboard/data/monitor-summary.json b/08-threat-intel/generated/dashboard/data/monitor-summary.json index 8b61212a..bb0df3c1 100644 --- a/08-threat-intel/generated/dashboard/data/monitor-summary.json +++ b/08-threat-intel/generated/dashboard/data/monitor-summary.json @@ -1,11 +1,11 @@ { - "generated_at": "2026-03-19T02:22:24+00:00", + "generated_at": "2026-03-19T02:27:12+00:00", "active_source_count": 118, "green_source_count": 118, "source_failure_count": 0, "open_alert_count": 0, - "resolved_alert_count": 0, - "last_fully_green_run": "2026-03-19T02:22:24+00:00", + "resolved_alert_count": 4, + "last_fully_green_run": "2026-03-19T02:27:12+00:00", "source_catalog": { "system_count": 62, "source_count": 173, @@ -14,7 +14,7 @@ "ingest": { "new_count": 0, "updated_count": 7, - "failure_count": 4, + "failure_count": 0, "systems_touched": [ "nextjs", "undici" diff --git a/08-threat-intel/generated/dashboard/data/source-catalog-audit.json b/08-threat-intel/generated/dashboard/data/source-catalog-audit.json index 304c6247..a51bee6b 100644 --- a/08-threat-intel/generated/dashboard/data/source-catalog-audit.json +++ b/08-threat-intel/generated/dashboard/data/source-catalog-audit.json @@ -1,5 +1,5 @@ { - "generated_at": "2026-03-19T02:22:09+00:00", + "generated_at": "2026-03-19T02:26:48+00:00", "system_count": 62, "source_count": 173, "active_source_count": 118, diff --git a/08-threat-intel/generated/dashboard/data/source-health.json b/08-threat-intel/generated/dashboard/data/source-health.json index 169a92f8..9fbe92ca 100644 --- a/08-threat-intel/generated/dashboard/data/source-health.json +++ b/08-threat-intel/generated/dashboard/data/source-health.json @@ -1,17 +1,17 @@ { - "generated_at": "2026-03-19T02:22:24+00:00", + "generated_at": "2026-03-19T02:27:12+00:00", "active_source_count": 118, "green_source_count": 118, "failure_count": 0, "all_green": true, - "last_fully_green_run": "2026-03-19T02:22:24+00:00", + "last_fully_green_run": "2026-03-19T02:27:12+00:00", "retries_performed": 0, "probes": [ { "system_id": "adminer", "source_name": "NVD Adminer", "source_kind": "nvd-search", - "elapsed_seconds": 9.256, + "elapsed_seconds": 20.95, "kind": "nvd-search", "items_seen": 1 }, @@ -19,7 +19,7 @@ "system_id": "adobe-commerce", "source_name": "Adobe Magento Security Index", "source_kind": "vendor-index", - "elapsed_seconds": 1.643, + "elapsed_seconds": 3.401, "kind": "vendor-index", "items_seen": 46 }, @@ -27,7 +27,7 @@ "system_id": "adobe-commerce", "source_name": "NVD Adobe Commerce", "source_kind": "nvd-search", - "elapsed_seconds": 1.077, + "elapsed_seconds": 3.401, "kind": "nvd-search", "items_seen": 1 }, @@ -35,7 +35,7 @@ "system_id": "angular", "source_name": "OSV Angular", "source_kind": "osv-batch", - "elapsed_seconds": 6.906, + "elapsed_seconds": 17.777, "kind": "osv-batch", "items_seen": 1 }, @@ -43,7 +43,7 @@ "system_id": "apache-httpd", "source_name": "Apache HTTPD Security", "source_kind": "html-links", - "elapsed_seconds": 9.254, + "elapsed_seconds": 21.12, "kind": "html-links", "items_seen": 182 }, @@ -51,7 +51,7 @@ "system_id": "apache-httpd", "source_name": "CISA KEV Apache HTTPD", "source_kind": "kev-json", - "elapsed_seconds": 9.457, + "elapsed_seconds": 21.827, "kind": "kev-json", "items_seen": 1545 }, @@ -59,7 +59,7 @@ "system_id": "apache-httpd", "source_name": "NVD Apache HTTP Server", "source_kind": "nvd-search", - "elapsed_seconds": 6.867, + "elapsed_seconds": 20.771, "kind": "nvd-search", "items_seen": 1 }, @@ -67,7 +67,7 @@ "system_id": "apache-tomcat", "source_name": "Apache Tomcat Security", "source_kind": "html-links", - "elapsed_seconds": 9.243, + "elapsed_seconds": 21.41, "kind": "html-links", "items_seen": 270 }, @@ -75,7 +75,7 @@ "system_id": "apache-tomcat", "source_name": "CISA KEV Tomcat", "source_kind": "kev-json", - "elapsed_seconds": 9.362, + "elapsed_seconds": 21.558, "kind": "kev-json", "items_seen": 1545 }, @@ -83,7 +83,7 @@ "system_id": "apache-tomcat", "source_name": "NVD Tomcat", "source_kind": "nvd-search", - "elapsed_seconds": 6.892, + "elapsed_seconds": 20.786, "kind": "nvd-search", "items_seen": 1 }, @@ -91,7 +91,7 @@ "system_id": "aspnet-core", "source_name": "NVD ASP.NET Core", "source_kind": "nvd-search", - "elapsed_seconds": 6.778, + "elapsed_seconds": 20.279, "kind": "nvd-search", "items_seen": 1 }, @@ -99,7 +99,7 @@ "system_id": "astro", "source_name": "OSV Astro", "source_kind": "osv-batch", - "elapsed_seconds": 6.768, + "elapsed_seconds": 18.112, "kind": "osv-batch", "items_seen": 1 }, @@ -107,7 +107,7 @@ "system_id": "caddy", "source_name": "GitHub Caddy Advisories", "source_kind": "html-links", - "elapsed_seconds": 8.086, + "elapsed_seconds": 21.7, "kind": "html-links", "items_seen": 114 }, @@ -115,7 +115,7 @@ "system_id": "caddy", "source_name": "OSV Caddy", "source_kind": "osv-batch", - "elapsed_seconds": 9.689, + "elapsed_seconds": 21.687, "kind": "osv-batch", "items_seen": 1 }, @@ -123,7 +123,7 @@ "system_id": "directus", "source_name": "Directus GitHub Advisories", "source_kind": "html-links", - "elapsed_seconds": 1.285, + "elapsed_seconds": 6.119, "kind": "html-links", "items_seen": 127 }, @@ -131,7 +131,7 @@ "system_id": "directus", "source_name": "OSV Directus", "source_kind": "osv-batch", - "elapsed_seconds": 0.986, + "elapsed_seconds": 11.083, "kind": "osv-batch", "items_seen": 1 }, @@ -139,7 +139,7 @@ "system_id": "discourse", "source_name": "Discourse Release Notes RSS", "source_kind": "rss-feed", - "elapsed_seconds": 1.644, + "elapsed_seconds": 6.552, "kind": "rss-feed", "items_seen": 30 }, @@ -147,7 +147,7 @@ "system_id": "discourse", "source_name": "Discourse Security RSS", "source_kind": "rss-feed", - "elapsed_seconds": 1.137, + "elapsed_seconds": 6.112, "kind": "rss-feed", "items_seen": 3 }, @@ -155,7 +155,7 @@ "system_id": "discourse", "source_name": "OSV Discourse", "source_kind": "osv-batch", - "elapsed_seconds": 1.653, + "elapsed_seconds": 10.976, "kind": "osv-batch", "items_seen": 1 }, @@ -163,7 +163,7 @@ "system_id": "django", "source_name": "Django Security Releases Archive", "source_kind": "vendor-index", - "elapsed_seconds": 9.391, + "elapsed_seconds": 20.942, "kind": "vendor-index", "items_seen": 1276 }, @@ -171,7 +171,7 @@ "system_id": "django", "source_name": "Django Security Weblog", "source_kind": "vendor-index", - "elapsed_seconds": 10.127, + "elapsed_seconds": 20.949, "kind": "vendor-index", "items_seen": 332 }, @@ -179,7 +179,7 @@ "system_id": "django", "source_name": "OSV Django", "source_kind": "osv-batch", - "elapsed_seconds": 10.93, + "elapsed_seconds": 21.933, "kind": "osv-batch", "items_seen": 1 }, @@ -187,7 +187,7 @@ "system_id": "drupal", "source_name": "Drupal Security Advisories RSS", "source_kind": "rss-feed", - "elapsed_seconds": 0.86, + "elapsed_seconds": 14.472, "kind": "rss-feed", "items_seen": 20 }, @@ -195,7 +195,7 @@ "system_id": "drupal", "source_name": "OSV Drupal", "source_kind": "osv-batch", - "elapsed_seconds": 2.222, + "elapsed_seconds": 12.058, "kind": "osv-batch", "items_seen": 1 }, @@ -203,7 +203,7 @@ "system_id": "echo", "source_name": "OSV Echo", "source_kind": "osv-batch", - "elapsed_seconds": 9.669, + "elapsed_seconds": 21.163, "kind": "osv-batch", "items_seen": 1 }, @@ -211,7 +211,7 @@ "system_id": "esbuild", "source_name": "OSV esbuild", "source_kind": "osv-batch", - "elapsed_seconds": 6.768, + "elapsed_seconds": 20.783, "kind": "osv-batch", "items_seen": 1 }, @@ -219,7 +219,7 @@ "system_id": "express", "source_name": "OSV Express", "source_kind": "osv-batch", - "elapsed_seconds": 6.774, + "elapsed_seconds": 17.589, "kind": "osv-batch", "items_seen": 1 }, @@ -227,7 +227,7 @@ "system_id": "fastify", "source_name": "OSV Fastify", "source_kind": "osv-batch", - "elapsed_seconds": 6.768, + "elapsed_seconds": 20.645, "kind": "osv-batch", "items_seen": 1 }, @@ -235,7 +235,7 @@ "system_id": "flask", "source_name": "OSV Flask", "source_kind": "osv-batch", - "elapsed_seconds": 9.844, + "elapsed_seconds": 20.91, "kind": "osv-batch", "items_seen": 1 }, @@ -243,7 +243,7 @@ "system_id": "ghost", "source_name": "Ghost GitHub Advisories", "source_kind": "html-links", - "elapsed_seconds": 1.087, + "elapsed_seconds": 6.626, "kind": "html-links", "items_seen": 119 }, @@ -251,7 +251,7 @@ "system_id": "ghost", "source_name": "OSV Ghost", "source_kind": "osv-batch", - "elapsed_seconds": 1.277, + "elapsed_seconds": 11.21, "kind": "osv-batch", "items_seen": 1 }, @@ -259,7 +259,7 @@ "system_id": "gin", "source_name": "OSV Gin", "source_kind": "osv-batch", - "elapsed_seconds": 9.841, + "elapsed_seconds": 21.163, "kind": "osv-batch", "items_seen": 1 }, @@ -267,7 +267,7 @@ "system_id": "gitea", "source_name": "GitHub Gitea Advisories", "source_kind": "html-links", - "elapsed_seconds": 13.004, + "elapsed_seconds": 21.894, "kind": "html-links", "items_seen": 98 }, @@ -275,7 +275,7 @@ "system_id": "gitea", "source_name": "OSV Gitea", "source_kind": "osv-batch", - "elapsed_seconds": 13.025, + "elapsed_seconds": 21.89, "kind": "osv-batch", "items_seen": 1 }, @@ -283,7 +283,7 @@ "system_id": "gitlab-ce", "source_name": "GitLab Advisory Database", "source_kind": "html-links", - "elapsed_seconds": 12.998, + "elapsed_seconds": 22.731, "kind": "html-links", "items_seen": 5 }, @@ -291,7 +291,7 @@ "system_id": "gitlab-ce", "source_name": "GitLab Security Releases", "source_kind": "html-links", - "elapsed_seconds": 13.005, + "elapsed_seconds": 21.89, "kind": "html-links", "items_seen": 250 }, @@ -299,7 +299,7 @@ "system_id": "gitlab-ce", "source_name": "NVD GitLab", "source_kind": "nvd-search", - "elapsed_seconds": 9.384, + "elapsed_seconds": 21.121, "kind": "nvd-search", "items_seen": 1 }, @@ -307,7 +307,7 @@ "system_id": "grafana", "source_name": "CISA KEV Grafana", "source_kind": "kev-json", - "elapsed_seconds": 12.554, + "elapsed_seconds": 22.048, "kind": "kev-json", "items_seen": 1545 }, @@ -315,7 +315,7 @@ "system_id": "grafana", "source_name": "Grafana Security Advisories", "source_kind": "html-links", - "elapsed_seconds": 13.008, + "elapsed_seconds": 21.898, "kind": "html-links", "items_seen": 159 }, @@ -323,7 +323,7 @@ "system_id": "hapi", "source_name": "OSV Hapi", "source_kind": "osv-batch", - "elapsed_seconds": 6.891, + "elapsed_seconds": 20.785, "kind": "osv-batch", "items_seen": 1 }, @@ -331,7 +331,7 @@ "system_id": "haproxy", "source_name": "HAProxy Blog Feed", "source_kind": "rss-feed", - "elapsed_seconds": 13.686, + "elapsed_seconds": 23.785, "kind": "rss-feed", "items_seen": 10 }, @@ -339,7 +339,7 @@ "system_id": "haproxy", "source_name": "NVD HAProxy", "source_kind": "nvd-search", - "elapsed_seconds": 8.089, + "elapsed_seconds": 20.942, "kind": "nvd-search", "items_seen": 1 }, @@ -347,7 +347,7 @@ "system_id": "jenkins", "source_name": "Jenkins Security Advisories", "source_kind": "html-links", - "elapsed_seconds": 12.502, + "elapsed_seconds": 21.819, "kind": "html-links", "items_seen": 1194 }, @@ -355,7 +355,7 @@ "system_id": "jenkins", "source_name": "NVD Jenkins", "source_kind": "nvd-search", - "elapsed_seconds": 9.459, + "elapsed_seconds": 21.164, "kind": "nvd-search", "items_seen": 1 }, @@ -363,7 +363,7 @@ "system_id": "joomla", "source_name": "Joomla Security Centre", "source_kind": "html-links", - "elapsed_seconds": 1.606, + "elapsed_seconds": 15.112, "kind": "html-links", "items_seen": 139 }, @@ -371,7 +371,7 @@ "system_id": "joomla", "source_name": "OSV Joomla", "source_kind": "osv-batch", - "elapsed_seconds": 1.281, + "elapsed_seconds": 10.892, "kind": "osv-batch", "items_seen": 1 }, @@ -379,7 +379,7 @@ "system_id": "kibana", "source_name": "Elastic Security Announcements", "source_kind": "html-links", - "elapsed_seconds": 13.321, + "elapsed_seconds": 22.524, "kind": "html-links", "items_seen": 71 }, @@ -387,7 +387,7 @@ "system_id": "kibana", "source_name": "NVD Kibana", "source_kind": "nvd-search", - "elapsed_seconds": 9.748, + "elapsed_seconds": 21.561, "kind": "nvd-search", "items_seen": 1 }, @@ -395,7 +395,7 @@ "system_id": "koa", "source_name": "OSV Koa", "source_kind": "osv-batch", - "elapsed_seconds": 6.914, + "elapsed_seconds": 18.543, "kind": "osv-batch", "items_seen": 1 }, @@ -403,7 +403,7 @@ "system_id": "laravel", "source_name": "OSV Laravel", "source_kind": "osv-batch", - "elapsed_seconds": 6.864, + "elapsed_seconds": 20.95, "kind": "osv-batch", "items_seen": 1 }, @@ -411,7 +411,7 @@ "system_id": "magento-open-source", "source_name": "Magento GitHub Advisories", "source_kind": "html-links", - "elapsed_seconds": 3.968, + "elapsed_seconds": 6.082, "kind": "html-links", "items_seen": 99 }, @@ -419,7 +419,7 @@ "system_id": "magento-open-source", "source_name": "NVD Magento", "source_kind": "nvd-search", - "elapsed_seconds": 1.084, + "elapsed_seconds": 5.985, "kind": "nvd-search", "items_seen": 1 }, @@ -427,7 +427,7 @@ "system_id": "magento-open-source", "source_name": "Sansec Research", "source_kind": "html-links", - "elapsed_seconds": 3.855, + "elapsed_seconds": 14.904, "kind": "html-links", "items_seen": 134 }, @@ -435,7 +435,7 @@ "system_id": "mattermost", "source_name": "Mattermost Security Updates JSON", "source_kind": "json-feed", - "elapsed_seconds": 13.321, + "elapsed_seconds": 22.362, "kind": "json-feed", "items_seen": 594 }, @@ -443,7 +443,7 @@ "system_id": "mattermost", "source_name": "OSV Mattermost", "source_kind": "osv-batch", - "elapsed_seconds": 13.789, + "elapsed_seconds": 23.593, "kind": "osv-batch", "items_seen": 1 }, @@ -451,7 +451,7 @@ "system_id": "mediawiki", "source_name": "MediaWiki Announce RSS", "source_kind": "rss-feed", - "elapsed_seconds": 2.777, + "elapsed_seconds": 12.818, "kind": "rss-feed", "items_seen": 30 }, @@ -459,7 +459,7 @@ "system_id": "mediawiki", "source_name": "OSV MediaWiki", "source_kind": "osv-batch", - "elapsed_seconds": 1.19, + "elapsed_seconds": 11.096, "kind": "osv-batch", "items_seen": 1 }, @@ -467,7 +467,7 @@ "system_id": "medusa", "source_name": "GitHub Medusa Advisories", "source_kind": "html-links", - "elapsed_seconds": 3.973, + "elapsed_seconds": 17.699, "kind": "html-links", "items_seen": 102 }, @@ -475,7 +475,7 @@ "system_id": "medusa", "source_name": "OSV Medusa", "source_kind": "osv-batch", - "elapsed_seconds": 4.126, + "elapsed_seconds": 17.58, "kind": "osv-batch", "items_seen": 1 }, @@ -483,7 +483,7 @@ "system_id": "moodle", "source_name": "OSV Moodle", "source_kind": "osv-batch", - "elapsed_seconds": 4.366, + "elapsed_seconds": 14.494, "kind": "osv-batch", "items_seen": 1 }, @@ -491,7 +491,7 @@ "system_id": "nestjs", "source_name": "OSV NestJS", "source_kind": "osv-batch", - "elapsed_seconds": 6.876, + "elapsed_seconds": 17.777, "kind": "osv-batch", "items_seen": 1 }, @@ -499,7 +499,7 @@ "system_id": "nextjs", "source_name": "GitHub Next.js Advisories", "source_kind": "html-links", - "elapsed_seconds": 4.878, + "elapsed_seconds": 20.786, "kind": "html-links", "items_seen": 123 }, @@ -507,7 +507,7 @@ "system_id": "nextjs", "source_name": "OSV Next.js", "source_kind": "osv-batch", - "elapsed_seconds": 5.19, + "elapsed_seconds": 17.861, "kind": "osv-batch", "items_seen": 1 }, @@ -515,7 +515,7 @@ "system_id": "nginx", "source_name": "CISA KEV NGINX", "source_kind": "kev-json", - "elapsed_seconds": 9.35, + "elapsed_seconds": 21.713, "kind": "kev-json", "items_seen": 1545 }, @@ -523,7 +523,7 @@ "system_id": "nginx", "source_name": "NGINX Security Advisories", "source_kind": "html-links", - "elapsed_seconds": 10.287, + "elapsed_seconds": 22.082, "kind": "html-links", "items_seen": 138 }, @@ -531,7 +531,7 @@ "system_id": "nginx", "source_name": "NVD NGINX", "source_kind": "nvd-search", - "elapsed_seconds": 6.78, + "elapsed_seconds": 20.649, "kind": "nvd-search", "items_seen": 1 }, @@ -539,7 +539,7 @@ "system_id": "nodejs", "source_name": "CISA KEV Node.js", "source_kind": "kev-json", - "elapsed_seconds": 5.134, + "elapsed_seconds": 19.822, "kind": "kev-json", "items_seen": 1545 }, @@ -547,7 +547,7 @@ "system_id": "nodejs", "source_name": "Node.js Security Releases", "source_kind": "html-links", - "elapsed_seconds": 7.272, + "elapsed_seconds": 20.769, "kind": "html-links", "items_seen": 74 }, @@ -555,7 +555,7 @@ "system_id": "nuxt", "source_name": "Nuxt Security", "source_kind": "html-links", - "elapsed_seconds": 5.153, + "elapsed_seconds": 17.546, "kind": "html-links", "items_seen": 118 }, @@ -563,7 +563,7 @@ "system_id": "nuxt", "source_name": "OSV Nuxt", "source_kind": "osv-batch", - "elapsed_seconds": 4.668, + "elapsed_seconds": 17.779, "kind": "osv-batch", "items_seen": 1 }, @@ -571,7 +571,7 @@ "system_id": "opencart", "source_name": "OSV OpenCart", "source_kind": "osv-batch", - "elapsed_seconds": 4.23, + "elapsed_seconds": 14.725, "kind": "osv-batch", "items_seen": 1 }, @@ -579,7 +579,7 @@ "system_id": "opencart", "source_name": "OpenCart Releases", "source_kind": "html-links", - "elapsed_seconds": 4.351, + "elapsed_seconds": 15.89, "kind": "html-links", "items_seen": 1500 }, @@ -587,7 +587,7 @@ "system_id": "openmage", "source_name": "OSV OpenMage", "source_kind": "osv-batch", - "elapsed_seconds": 2.499, + "elapsed_seconds": 11.087, "kind": "osv-batch", "items_seen": 1 }, @@ -595,7 +595,7 @@ "system_id": "openmage", "source_name": "OpenMage GitHub Advisories", "source_kind": "html-links", - "elapsed_seconds": 3.796, + "elapsed_seconds": 14.651, "kind": "html-links", "items_seen": 125 }, @@ -603,7 +603,7 @@ "system_id": "phpmyadmin", "source_name": "OSV phpMyAdmin", "source_kind": "osv-batch", - "elapsed_seconds": 10.369, + "elapsed_seconds": 22.037, "kind": "osv-batch", "items_seen": 1 }, @@ -611,7 +611,7 @@ "system_id": "phpmyadmin", "source_name": "phpMyAdmin Security Page", "source_kind": "html-links", - "elapsed_seconds": 9.354, + "elapsed_seconds": 21.695, "kind": "html-links", "items_seen": 262 }, @@ -619,7 +619,7 @@ "system_id": "prestashop", "source_name": "Friends Of Presta Security", "source_kind": "html-links", - "elapsed_seconds": 4.217, + "elapsed_seconds": 14.625, "kind": "html-links", "items_seen": 38 }, @@ -627,7 +627,7 @@ "system_id": "prestashop", "source_name": "GitHub PrestaShop Advisories", "source_kind": "html-links", - "elapsed_seconds": 3.797, + "elapsed_seconds": 14.786, "kind": "html-links", "items_seen": 127 }, @@ -635,7 +635,7 @@ "system_id": "prestashop", "source_name": "OSV PrestaShop", "source_kind": "osv-batch", - "elapsed_seconds": 3.596, + "elapsed_seconds": 14.611, "kind": "osv-batch", "items_seen": 1 }, @@ -643,7 +643,7 @@ "system_id": "prestashop", "source_name": "PrestaShop Security Page", "source_kind": "html-links", - "elapsed_seconds": 3.27, + "elapsed_seconds": 14.158, "kind": "html-links", "items_seen": 60 }, @@ -651,7 +651,7 @@ "system_id": "rails", "source_name": "OSV Rails", "source_kind": "osv-batch", - "elapsed_seconds": 9.861, + "elapsed_seconds": 21.273, "kind": "osv-batch", "items_seen": 1 }, @@ -659,7 +659,7 @@ "system_id": "react", "source_name": "GitHub React Advisories", "source_kind": "html-links", - "elapsed_seconds": 5.062, + "elapsed_seconds": 17.595, "kind": "html-links", "items_seen": 110 }, @@ -667,7 +667,7 @@ "system_id": "react", "source_name": "OSV React", "source_kind": "osv-batch", - "elapsed_seconds": 5.091, + "elapsed_seconds": 17.604, "kind": "osv-batch", "items_seen": 1 }, @@ -675,7 +675,7 @@ "system_id": "redmine", "source_name": "OSV Redmine", "source_kind": "osv-batch", - "elapsed_seconds": 12.995, + "elapsed_seconds": 22.53, "kind": "osv-batch", "items_seen": 1 }, @@ -683,7 +683,7 @@ "system_id": "redmine", "source_name": "Redmine Security Advisories", "source_kind": "html-links", - "elapsed_seconds": 14.666, + "elapsed_seconds": 23.782, "kind": "html-links", "items_seen": 371 }, @@ -691,7 +691,7 @@ "system_id": "saleor", "source_name": "GitHub Saleor Advisories", "source_kind": "html-links", - "elapsed_seconds": 3.8, + "elapsed_seconds": 15.06, "kind": "html-links", "items_seen": 120 }, @@ -699,7 +699,7 @@ "system_id": "saleor", "source_name": "OSV Saleor", "source_kind": "osv-batch", - "elapsed_seconds": 4.128, + "elapsed_seconds": 17.631, "kind": "osv-batch", "items_seen": 1 }, @@ -707,7 +707,7 @@ "system_id": "shopware", "source_name": "OSV Shopware", "source_kind": "osv-batch", - "elapsed_seconds": 3.959, + "elapsed_seconds": 14.856, "kind": "osv-batch", "items_seen": 1 }, @@ -715,7 +715,7 @@ "system_id": "shopware", "source_name": "Shopware Security Advisories", "source_kind": "html-links", - "elapsed_seconds": 3.964, + "elapsed_seconds": 15.064, "kind": "html-links", "items_seen": 129 }, @@ -723,7 +723,7 @@ "system_id": "spring-boot", "source_name": "OSV Spring Boot", "source_kind": "osv-batch", - "elapsed_seconds": 6.772, + "elapsed_seconds": 20.771, "kind": "osv-batch", "items_seen": 1 }, @@ -731,7 +731,7 @@ "system_id": "spring-boot", "source_name": "Spring Security Advisories", "source_kind": "html-links", - "elapsed_seconds": 6.368, + "elapsed_seconds": 20.425, "kind": "html-links", "items_seen": 118 }, @@ -739,7 +739,7 @@ "system_id": "spring-framework", "source_name": "OSV Spring Framework", "source_kind": "osv-batch", - "elapsed_seconds": 6.689, + "elapsed_seconds": 20.267, "kind": "osv-batch", "items_seen": 1 }, @@ -747,7 +747,7 @@ "system_id": "spring-framework", "source_name": "Spring Security Advisories", "source_kind": "html-links", - "elapsed_seconds": 6.374, + "elapsed_seconds": 20.79, "kind": "html-links", "items_seen": 118 }, @@ -755,7 +755,7 @@ "system_id": "spring-security", "source_name": "OSV Spring Security", "source_kind": "osv-batch", - "elapsed_seconds": 6.768, + "elapsed_seconds": 20.31, "kind": "osv-batch", "items_seen": 1 }, @@ -763,7 +763,7 @@ "system_id": "spring-security", "source_name": "Spring Security Advisories", "source_kind": "html-links", - "elapsed_seconds": 6.497, + "elapsed_seconds": 20.651, "kind": "html-links", "items_seen": 118 }, @@ -771,7 +771,7 @@ "system_id": "strapi", "source_name": "OSV Strapi", "source_kind": "osv-batch", - "elapsed_seconds": 1.132, + "elapsed_seconds": 11.029, "kind": "osv-batch", "items_seen": 1 }, @@ -779,7 +779,7 @@ "system_id": "strapi", "source_name": "Strapi GitHub Advisories", "source_kind": "html-links", - "elapsed_seconds": 1.076, + "elapsed_seconds": 5.987, "kind": "html-links", "items_seen": 124 }, @@ -787,7 +787,7 @@ "system_id": "sveltekit", "source_name": "OSV SvelteKit", "source_kind": "osv-batch", - "elapsed_seconds": 6.768, + "elapsed_seconds": 17.604, "kind": "osv-batch", "items_seen": 1 }, @@ -795,7 +795,7 @@ "system_id": "symfony", "source_name": "OSV Symfony", "source_kind": "osv-batch", - "elapsed_seconds": 10.332, + "elapsed_seconds": 20.844, "kind": "osv-batch", "items_seen": 1 }, @@ -803,7 +803,7 @@ "system_id": "traefik", "source_name": "GitHub Traefik Advisories", "source_kind": "html-links", - "elapsed_seconds": 10.164, + "elapsed_seconds": 21.716, "kind": "html-links", "items_seen": 124 }, @@ -811,7 +811,7 @@ "system_id": "traefik", "source_name": "OSV Traefik", "source_kind": "osv-batch", - "elapsed_seconds": 9.746, + "elapsed_seconds": 21.717, "kind": "osv-batch", "items_seen": 1 }, @@ -819,7 +819,7 @@ "system_id": "undici", "source_name": "OSV Undici", "source_kind": "osv-batch", - "elapsed_seconds": 6.795, + "elapsed_seconds": 20.278, "kind": "osv-batch", "items_seen": 1 }, @@ -827,7 +827,7 @@ "system_id": "vite", "source_name": "OSV Vite", "source_kind": "osv-batch", - "elapsed_seconds": 6.799, + "elapsed_seconds": 17.824, "kind": "osv-batch", "items_seen": 1 }, @@ -835,7 +835,7 @@ "system_id": "vite", "source_name": "Vite Security", "source_kind": "html-links", - "elapsed_seconds": 5.125, + "elapsed_seconds": 18.678, "kind": "html-links", "items_seen": 124 }, @@ -843,7 +843,7 @@ "system_id": "vue", "source_name": "OSV Vue", "source_kind": "osv-batch", - "elapsed_seconds": 4.743, + "elapsed_seconds": 17.596, "kind": "osv-batch", "items_seen": 1 }, @@ -851,7 +851,7 @@ "system_id": "vue", "source_name": "Vue Security", "source_kind": "html-links", - "elapsed_seconds": 5.022, + "elapsed_seconds": 17.608, "kind": "html-links", "items_seen": 111 }, @@ -859,7 +859,7 @@ "system_id": "webpack", "source_name": "OSV webpack", "source_kind": "osv-batch", - "elapsed_seconds": 7.035, + "elapsed_seconds": 20.643, "kind": "osv-batch", "items_seen": 1 }, @@ -867,7 +867,7 @@ "system_id": "werkzeug", "source_name": "OSV Werkzeug", "source_kind": "osv-batch", - "elapsed_seconds": 10.051, + "elapsed_seconds": 21.0, "kind": "osv-batch", "items_seen": 1 }, @@ -875,7 +875,7 @@ "system_id": "woocommerce", "source_name": "GitHub WooCommerce Advisories", "source_kind": "html-links", - "elapsed_seconds": 3.803, + "elapsed_seconds": 14.511, "kind": "html-links", "items_seen": 107 }, @@ -883,7 +883,7 @@ "system_id": "woocommerce", "source_name": "OSV WooCommerce", "source_kind": "osv-batch", - "elapsed_seconds": 2.193, + "elapsed_seconds": 10.984, "kind": "osv-batch", "items_seen": 1 }, @@ -891,7 +891,7 @@ "system_id": "woocommerce", "source_name": "Patchstack Database", "source_kind": "html-links", - "elapsed_seconds": 3.694, + "elapsed_seconds": 15.775, "kind": "html-links", "items_seen": 193 }, @@ -899,7 +899,7 @@ "system_id": "woocommerce", "source_name": "Woo Developer Advisories", "source_kind": "html-links", - "elapsed_seconds": 4.393, + "elapsed_seconds": 14.66, "kind": "html-links", "items_seen": 121 }, @@ -907,7 +907,7 @@ "system_id": "woocommerce", "source_name": "Wordfence Vulnerability Database", "source_kind": "html-links", - "elapsed_seconds": 3.182, + "elapsed_seconds": 17.927, "kind": "html-links", "items_seen": 0 }, @@ -915,7 +915,7 @@ "system_id": "wordpress", "source_name": "Patchstack Database", "source_kind": "html-links", - "elapsed_seconds": 1.596, + "elapsed_seconds": 2.35, "kind": "html-links", "items_seen": 193 }, @@ -923,7 +923,7 @@ "system_id": "wordpress", "source_name": "PortSwigger Research", "source_kind": "html-links", - "elapsed_seconds": 1.802, + "elapsed_seconds": 15.425, "kind": "html-links", "items_seen": 99 }, @@ -931,7 +931,7 @@ "system_id": "wordpress", "source_name": "WPScan Vulnerability Database", "source_kind": "html-links", - "elapsed_seconds": 1.141, + "elapsed_seconds": 10.855, "kind": "html-links", "items_seen": 74 }, @@ -939,7 +939,7 @@ "system_id": "wordpress", "source_name": "WordPress Security News RSS", "source_kind": "rss-feed", - "elapsed_seconds": 1.599, + "elapsed_seconds": 1.559, "kind": "rss-feed", "items_seen": 10 }, @@ -947,81 +947,81 @@ "system_id": "wordpress", "source_name": "Wordfence Vulnerability Database", "source_kind": "html-links", - "elapsed_seconds": 1.282, + "elapsed_seconds": 17.336, "kind": "html-links", "items_seen": 0 } ], "failures": [], "slow_sources": [ + { + "system_id": "haproxy", + "source_name": "HAProxy Blog Feed", + "source_kind": "rss-feed", + "elapsed_seconds": 23.785, + "status": "ok" + }, { "system_id": "redmine", "source_name": "Redmine Security Advisories", "source_kind": "html-links", - "elapsed_seconds": 14.666, + "elapsed_seconds": 23.782, "status": "ok" }, { "system_id": "mattermost", "source_name": "OSV Mattermost", "source_kind": "osv-batch", - "elapsed_seconds": 13.789, - "status": "ok" - }, - { - "system_id": "haproxy", - "source_name": "HAProxy Blog Feed", - "source_kind": "rss-feed", - "elapsed_seconds": 13.686, - "status": "ok" - }, - { - "system_id": "kibana", - "source_name": "Elastic Security Announcements", - "source_kind": "html-links", - "elapsed_seconds": 13.321, - "status": "ok" - }, - { - "system_id": "mattermost", - "source_name": "Mattermost Security Updates JSON", - "source_kind": "json-feed", - "elapsed_seconds": 13.321, - "status": "ok" - }, - { - "system_id": "gitea", - "source_name": "OSV Gitea", - "source_kind": "osv-batch", - "elapsed_seconds": 13.025, - "status": "ok" - }, - { - "system_id": "grafana", - "source_name": "Grafana Security Advisories", - "source_kind": "html-links", - "elapsed_seconds": 13.008, - "status": "ok" - }, - { - "system_id": "gitlab-ce", - "source_name": "GitLab Security Releases", - "source_kind": "html-links", - "elapsed_seconds": 13.005, - "status": "ok" - }, - { - "system_id": "gitea", - "source_name": "GitHub Gitea Advisories", - "source_kind": "html-links", - "elapsed_seconds": 13.004, + "elapsed_seconds": 23.593, "status": "ok" }, { "system_id": "gitlab-ce", "source_name": "GitLab Advisory Database", "source_kind": "html-links", - "elapsed_seconds": 12.998, + "elapsed_seconds": 22.731, + "status": "ok" + }, + { + "system_id": "redmine", + "source_name": "OSV Redmine", + "source_kind": "osv-batch", + "elapsed_seconds": 22.53, + "status": "ok" + }, + { + "system_id": "kibana", + "source_name": "Elastic Security Announcements", + "source_kind": "html-links", + "elapsed_seconds": 22.524, + "status": "ok" + }, + { + "system_id": "mattermost", + "source_name": "Mattermost Security Updates JSON", + "source_kind": "json-feed", + "elapsed_seconds": 22.362, + "status": "ok" + }, + { + "system_id": "nginx", + "source_name": "NGINX Security Advisories", + "source_kind": "html-links", + "elapsed_seconds": 22.082, + "status": "ok" + }, + { + "system_id": "grafana", + "source_name": "CISA KEV Grafana", + "source_kind": "kev-json", + "elapsed_seconds": 22.048, + "status": "ok" + }, + { + "system_id": "phpmyadmin", + "source_name": "OSV phpMyAdmin", + "source_kind": "osv-batch", + "elapsed_seconds": 22.037, "status": "ok" } ], diff --git a/08-threat-intel/generated/dashboard/docs/architecture-library.html b/08-threat-intel/generated/dashboard/docs/architecture-library.html index c6ce14c0..9fdeea9b 100644 --- a/08-threat-intel/generated/dashboard/docs/architecture-library.html +++ b/08-threat-intel/generated/dashboard/docs/architecture-library.html @@ -87,7 +87,7 @@
{
- "generated_at": "2026-03-19T02:23:04+00:00",
+ "generated_at": "2026-03-19T02:27:20+00:00",
"title": "当前架构库",
"summary": "工作台、控制面、数据层、授权边界与系统覆盖的当前真值视图。",
"sections": [
@@ -137,7 +137,7 @@
},
{
"label": "生成时间",
- "value": "2026-03-19T02:23:04+00:00"
+ "value": "2026-03-19T02:27:20+00:00"
}
],
"links": [
diff --git a/08-threat-intel/generated/dashboard/docs/source-catalog-audit.html b/08-threat-intel/generated/dashboard/docs/source-catalog-audit.html
index 704998aa..59f582bd 100644
--- a/08-threat-intel/generated/dashboard/docs/source-catalog-audit.html
+++ b/08-threat-intel/generated/dashboard/docs/source-catalog-audit.html
@@ -88,7 +88,7 @@
# Source Catalog Audit
-- generated_at: `2026-03-19T02:22:09+00:00`
+- generated_at: `2026-03-19T02:26:48+00:00`
- systems: `62`
- sources: `173`
- active_sources: `118`
diff --git a/08-threat-intel/generated/dashboard/docs/testing-completeness-report.html b/08-threat-intel/generated/dashboard/docs/testing-completeness-report.html
index dd57f340..070539c0 100644
--- a/08-threat-intel/generated/dashboard/docs/testing-completeness-report.html
+++ b/08-threat-intel/generated/dashboard/docs/testing-completeness-report.html
@@ -88,7 +88,7 @@
# 全库 Advisory 完整度报告
-- 生成时间: `2026-03-19T02:23:04+00:00`
+- 生成时间: `2026-03-19T02:27:20+00:00`
- 最新 advisory 完整度: `89/89` `verified-real`
- 合成验证数量: `0`
- 阻塞数量: `0`
@@ -96,7 +96,7 @@
- 完整度百分比: `100.0%`
- active source 全绿: `118/118`
- source open alerts: `0`
-- 最近一次 source 全绿: `2026-03-19T02:22:24+00:00`
+- 最近一次 source 全绿: `2026-03-19T02:27:12+00:00`
## 系统覆盖矩阵
@@ -117,14 +117,10 @@
## Ingest / Source 健康度
-- source failures: `4`
+- source failures: `0`
- active sources: `118`
- green sources: `118`
- open alerts: `0`
-- django::OSV Django::tls::HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))
-- flask::OSV Flask::tls::HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))
-- spring-security::OSV Spring Security::tls::HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))
-- symfony::OSV Symfony::tls::HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))
## 剩余风险说明
diff --git a/08-threat-intel/generated/dashboard/summary.json b/08-threat-intel/generated/dashboard/summary.json
index 70dba3f4..94172e91 100644
--- a/08-threat-intel/generated/dashboard/summary.json
+++ b/08-threat-intel/generated/dashboard/summary.json
@@ -1,5 +1,5 @@
{
- "generated_at": "2026-03-19T02:23:04+00:00",
+ "generated_at": "2026-03-19T02:27:20+00:00",
"advisory_count": 2392,
"run_count": 140,
"statuses": {
@@ -158,7 +158,7 @@
"green_source_count": 118,
"source_failure_count": 0,
"open_alert_count": 0,
- "last_fully_green_run": "2026-03-19T02:22:24+00:00"
+ "last_fully_green_run": "2026-03-19T02:27:12+00:00"
},
"systems": [
{
diff --git a/08-threat-intel/generated/latest-ingest.md b/08-threat-intel/generated/latest-ingest.md
index 2c4c5199..1f7cf54e 100644
--- a/08-threat-intel/generated/latest-ingest.md
+++ b/08-threat-intel/generated/latest-ingest.md
@@ -1,6 +1,6 @@
# 最新同步摘要
-- 渲染时间: `2026-03-19T02:23:04+00:00`
+- 渲染时间: `2026-03-19T02:27:20+00:00`
- 系统数量: `62`
- Advisory 数量: `2348`
- 重点 Markdown 数量: `156`
@@ -8,11 +8,4 @@
- 新增记录: `0`
- 更新记录: `7`
- Triage 数量: `1169`
-- 失败的 source adapter: `4`
-
-## 失败列表
-
-- django::OSV Django::tls::HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))
-- flask::OSV Flask::tls::HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))
-- spring-security::OSV Spring Security::tls::HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))
-- symfony::OSV Symfony::tls::HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))
+- 失败的 source adapter: `0`
diff --git a/08-threat-intel/generated/monitor-summary.json b/08-threat-intel/generated/monitor-summary.json
index 8b61212a..bb0df3c1 100644
--- a/08-threat-intel/generated/monitor-summary.json
+++ b/08-threat-intel/generated/monitor-summary.json
@@ -1,11 +1,11 @@
{
- "generated_at": "2026-03-19T02:22:24+00:00",
+ "generated_at": "2026-03-19T02:27:12+00:00",
"active_source_count": 118,
"green_source_count": 118,
"source_failure_count": 0,
"open_alert_count": 0,
- "resolved_alert_count": 0,
- "last_fully_green_run": "2026-03-19T02:22:24+00:00",
+ "resolved_alert_count": 4,
+ "last_fully_green_run": "2026-03-19T02:27:12+00:00",
"source_catalog": {
"system_count": 62,
"source_count": 173,
@@ -14,7 +14,7 @@
"ingest": {
"new_count": 0,
"updated_count": 7,
- "failure_count": 4,
+ "failure_count": 0,
"systems_touched": [
"nextjs",
"undici"
diff --git a/08-threat-intel/generated/run-summary.json b/08-threat-intel/generated/run-summary.json
index f5578f23..c3791af1 100644
--- a/08-threat-intel/generated/run-summary.json
+++ b/08-threat-intel/generated/run-summary.json
@@ -1,5 +1,5 @@
{
- "generated_at": "2026-03-19T02:23:04+00:00",
+ "generated_at": "2026-03-19T02:27:20+00:00",
"system_count": 62,
"advisory_count": 2348,
"markdown_count": 156,
@@ -11,62 +11,5 @@
],
"triage_count": 1169,
"run_bundle_count": 89,
- "failures": [
- {
- "system_id": "django",
- "display_name": "Django",
- "source_name": "OSV Django",
- "source_kind": "osv-batch",
- "source_bucket": "official_sources",
- "category": "tls",
- "exception": "SSLError",
- "message": "HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))",
- "status_code": null,
- "url": "",
- "summary": "django::OSV Django::tls::HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))",
- "elapsed_seconds": 25.112
- },
- {
- "system_id": "flask",
- "display_name": "Flask",
- "source_name": "OSV Flask",
- "source_kind": "osv-batch",
- "source_bucket": "official_sources",
- "category": "tls",
- "exception": "SSLError",
- "message": "HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))",
- "status_code": null,
- "url": "",
- "summary": "flask::OSV Flask::tls::HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))",
- "elapsed_seconds": 25.129
- },
- {
- "system_id": "spring-security",
- "display_name": "Spring Security",
- "source_name": "OSV Spring Security",
- "source_kind": "osv-batch",
- "source_bucket": "ecosystem_sources",
- "category": "tls",
- "exception": "SSLError",
- "message": "HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))",
- "status_code": null,
- "url": "",
- "summary": "spring-security::OSV Spring Security::tls::HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))",
- "elapsed_seconds": 25.247
- },
- {
- "system_id": "symfony",
- "display_name": "Symfony",
- "source_name": "OSV Symfony",
- "source_kind": "osv-batch",
- "source_bucket": "official_sources",
- "category": "tls",
- "exception": "SSLError",
- "message": "HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))",
- "status_code": null,
- "url": "",
- "summary": "symfony::OSV Symfony::tls::HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))",
- "elapsed_seconds": 25.232
- }
- ]
+ "failures": []
}
diff --git a/08-threat-intel/generated/source-catalog-audit.json b/08-threat-intel/generated/source-catalog-audit.json
index 304c6247..a51bee6b 100644
--- a/08-threat-intel/generated/source-catalog-audit.json
+++ b/08-threat-intel/generated/source-catalog-audit.json
@@ -1,5 +1,5 @@
{
- "generated_at": "2026-03-19T02:22:09+00:00",
+ "generated_at": "2026-03-19T02:26:48+00:00",
"system_count": 62,
"source_count": 173,
"active_source_count": 118,
diff --git a/08-threat-intel/generated/source-catalog-audit.md b/08-threat-intel/generated/source-catalog-audit.md
index 8ff0402d..27d887d2 100644
--- a/08-threat-intel/generated/source-catalog-audit.md
+++ b/08-threat-intel/generated/source-catalog-audit.md
@@ -1,6 +1,6 @@
# Source Catalog Audit
-- generated_at: `2026-03-19T02:22:09+00:00`
+- generated_at: `2026-03-19T02:26:48+00:00`
- systems: `62`
- sources: `173`
- active_sources: `118`
diff --git a/08-threat-intel/generated/source-health.json b/08-threat-intel/generated/source-health.json
index 169a92f8..9fbe92ca 100644
--- a/08-threat-intel/generated/source-health.json
+++ b/08-threat-intel/generated/source-health.json
@@ -1,17 +1,17 @@
{
- "generated_at": "2026-03-19T02:22:24+00:00",
+ "generated_at": "2026-03-19T02:27:12+00:00",
"active_source_count": 118,
"green_source_count": 118,
"failure_count": 0,
"all_green": true,
- "last_fully_green_run": "2026-03-19T02:22:24+00:00",
+ "last_fully_green_run": "2026-03-19T02:27:12+00:00",
"retries_performed": 0,
"probes": [
{
"system_id": "adminer",
"source_name": "NVD Adminer",
"source_kind": "nvd-search",
- "elapsed_seconds": 9.256,
+ "elapsed_seconds": 20.95,
"kind": "nvd-search",
"items_seen": 1
},
@@ -19,7 +19,7 @@
"system_id": "adobe-commerce",
"source_name": "Adobe Magento Security Index",
"source_kind": "vendor-index",
- "elapsed_seconds": 1.643,
+ "elapsed_seconds": 3.401,
"kind": "vendor-index",
"items_seen": 46
},
@@ -27,7 +27,7 @@
"system_id": "adobe-commerce",
"source_name": "NVD Adobe Commerce",
"source_kind": "nvd-search",
- "elapsed_seconds": 1.077,
+ "elapsed_seconds": 3.401,
"kind": "nvd-search",
"items_seen": 1
},
@@ -35,7 +35,7 @@
"system_id": "angular",
"source_name": "OSV Angular",
"source_kind": "osv-batch",
- "elapsed_seconds": 6.906,
+ "elapsed_seconds": 17.777,
"kind": "osv-batch",
"items_seen": 1
},
@@ -43,7 +43,7 @@
"system_id": "apache-httpd",
"source_name": "Apache HTTPD Security",
"source_kind": "html-links",
- "elapsed_seconds": 9.254,
+ "elapsed_seconds": 21.12,
"kind": "html-links",
"items_seen": 182
},
@@ -51,7 +51,7 @@
"system_id": "apache-httpd",
"source_name": "CISA KEV Apache HTTPD",
"source_kind": "kev-json",
- "elapsed_seconds": 9.457,
+ "elapsed_seconds": 21.827,
"kind": "kev-json",
"items_seen": 1545
},
@@ -59,7 +59,7 @@
"system_id": "apache-httpd",
"source_name": "NVD Apache HTTP Server",
"source_kind": "nvd-search",
- "elapsed_seconds": 6.867,
+ "elapsed_seconds": 20.771,
"kind": "nvd-search",
"items_seen": 1
},
@@ -67,7 +67,7 @@
"system_id": "apache-tomcat",
"source_name": "Apache Tomcat Security",
"source_kind": "html-links",
- "elapsed_seconds": 9.243,
+ "elapsed_seconds": 21.41,
"kind": "html-links",
"items_seen": 270
},
@@ -75,7 +75,7 @@
"system_id": "apache-tomcat",
"source_name": "CISA KEV Tomcat",
"source_kind": "kev-json",
- "elapsed_seconds": 9.362,
+ "elapsed_seconds": 21.558,
"kind": "kev-json",
"items_seen": 1545
},
@@ -83,7 +83,7 @@
"system_id": "apache-tomcat",
"source_name": "NVD Tomcat",
"source_kind": "nvd-search",
- "elapsed_seconds": 6.892,
+ "elapsed_seconds": 20.786,
"kind": "nvd-search",
"items_seen": 1
},
@@ -91,7 +91,7 @@
"system_id": "aspnet-core",
"source_name": "NVD ASP.NET Core",
"source_kind": "nvd-search",
- "elapsed_seconds": 6.778,
+ "elapsed_seconds": 20.279,
"kind": "nvd-search",
"items_seen": 1
},
@@ -99,7 +99,7 @@
"system_id": "astro",
"source_name": "OSV Astro",
"source_kind": "osv-batch",
- "elapsed_seconds": 6.768,
+ "elapsed_seconds": 18.112,
"kind": "osv-batch",
"items_seen": 1
},
@@ -107,7 +107,7 @@
"system_id": "caddy",
"source_name": "GitHub Caddy Advisories",
"source_kind": "html-links",
- "elapsed_seconds": 8.086,
+ "elapsed_seconds": 21.7,
"kind": "html-links",
"items_seen": 114
},
@@ -115,7 +115,7 @@
"system_id": "caddy",
"source_name": "OSV Caddy",
"source_kind": "osv-batch",
- "elapsed_seconds": 9.689,
+ "elapsed_seconds": 21.687,
"kind": "osv-batch",
"items_seen": 1
},
@@ -123,7 +123,7 @@
"system_id": "directus",
"source_name": "Directus GitHub Advisories",
"source_kind": "html-links",
- "elapsed_seconds": 1.285,
+ "elapsed_seconds": 6.119,
"kind": "html-links",
"items_seen": 127
},
@@ -131,7 +131,7 @@
"system_id": "directus",
"source_name": "OSV Directus",
"source_kind": "osv-batch",
- "elapsed_seconds": 0.986,
+ "elapsed_seconds": 11.083,
"kind": "osv-batch",
"items_seen": 1
},
@@ -139,7 +139,7 @@
"system_id": "discourse",
"source_name": "Discourse Release Notes RSS",
"source_kind": "rss-feed",
- "elapsed_seconds": 1.644,
+ "elapsed_seconds": 6.552,
"kind": "rss-feed",
"items_seen": 30
},
@@ -147,7 +147,7 @@
"system_id": "discourse",
"source_name": "Discourse Security RSS",
"source_kind": "rss-feed",
- "elapsed_seconds": 1.137,
+ "elapsed_seconds": 6.112,
"kind": "rss-feed",
"items_seen": 3
},
@@ -155,7 +155,7 @@
"system_id": "discourse",
"source_name": "OSV Discourse",
"source_kind": "osv-batch",
- "elapsed_seconds": 1.653,
+ "elapsed_seconds": 10.976,
"kind": "osv-batch",
"items_seen": 1
},
@@ -163,7 +163,7 @@
"system_id": "django",
"source_name": "Django Security Releases Archive",
"source_kind": "vendor-index",
- "elapsed_seconds": 9.391,
+ "elapsed_seconds": 20.942,
"kind": "vendor-index",
"items_seen": 1276
},
@@ -171,7 +171,7 @@
"system_id": "django",
"source_name": "Django Security Weblog",
"source_kind": "vendor-index",
- "elapsed_seconds": 10.127,
+ "elapsed_seconds": 20.949,
"kind": "vendor-index",
"items_seen": 332
},
@@ -179,7 +179,7 @@
"system_id": "django",
"source_name": "OSV Django",
"source_kind": "osv-batch",
- "elapsed_seconds": 10.93,
+ "elapsed_seconds": 21.933,
"kind": "osv-batch",
"items_seen": 1
},
@@ -187,7 +187,7 @@
"system_id": "drupal",
"source_name": "Drupal Security Advisories RSS",
"source_kind": "rss-feed",
- "elapsed_seconds": 0.86,
+ "elapsed_seconds": 14.472,
"kind": "rss-feed",
"items_seen": 20
},
@@ -195,7 +195,7 @@
"system_id": "drupal",
"source_name": "OSV Drupal",
"source_kind": "osv-batch",
- "elapsed_seconds": 2.222,
+ "elapsed_seconds": 12.058,
"kind": "osv-batch",
"items_seen": 1
},
@@ -203,7 +203,7 @@
"system_id": "echo",
"source_name": "OSV Echo",
"source_kind": "osv-batch",
- "elapsed_seconds": 9.669,
+ "elapsed_seconds": 21.163,
"kind": "osv-batch",
"items_seen": 1
},
@@ -211,7 +211,7 @@
"system_id": "esbuild",
"source_name": "OSV esbuild",
"source_kind": "osv-batch",
- "elapsed_seconds": 6.768,
+ "elapsed_seconds": 20.783,
"kind": "osv-batch",
"items_seen": 1
},
@@ -219,7 +219,7 @@
"system_id": "express",
"source_name": "OSV Express",
"source_kind": "osv-batch",
- "elapsed_seconds": 6.774,
+ "elapsed_seconds": 17.589,
"kind": "osv-batch",
"items_seen": 1
},
@@ -227,7 +227,7 @@
"system_id": "fastify",
"source_name": "OSV Fastify",
"source_kind": "osv-batch",
- "elapsed_seconds": 6.768,
+ "elapsed_seconds": 20.645,
"kind": "osv-batch",
"items_seen": 1
},
@@ -235,7 +235,7 @@
"system_id": "flask",
"source_name": "OSV Flask",
"source_kind": "osv-batch",
- "elapsed_seconds": 9.844,
+ "elapsed_seconds": 20.91,
"kind": "osv-batch",
"items_seen": 1
},
@@ -243,7 +243,7 @@
"system_id": "ghost",
"source_name": "Ghost GitHub Advisories",
"source_kind": "html-links",
- "elapsed_seconds": 1.087,
+ "elapsed_seconds": 6.626,
"kind": "html-links",
"items_seen": 119
},
@@ -251,7 +251,7 @@
"system_id": "ghost",
"source_name": "OSV Ghost",
"source_kind": "osv-batch",
- "elapsed_seconds": 1.277,
+ "elapsed_seconds": 11.21,
"kind": "osv-batch",
"items_seen": 1
},
@@ -259,7 +259,7 @@
"system_id": "gin",
"source_name": "OSV Gin",
"source_kind": "osv-batch",
- "elapsed_seconds": 9.841,
+ "elapsed_seconds": 21.163,
"kind": "osv-batch",
"items_seen": 1
},
@@ -267,7 +267,7 @@
"system_id": "gitea",
"source_name": "GitHub Gitea Advisories",
"source_kind": "html-links",
- "elapsed_seconds": 13.004,
+ "elapsed_seconds": 21.894,
"kind": "html-links",
"items_seen": 98
},
@@ -275,7 +275,7 @@
"system_id": "gitea",
"source_name": "OSV Gitea",
"source_kind": "osv-batch",
- "elapsed_seconds": 13.025,
+ "elapsed_seconds": 21.89,
"kind": "osv-batch",
"items_seen": 1
},
@@ -283,7 +283,7 @@
"system_id": "gitlab-ce",
"source_name": "GitLab Advisory Database",
"source_kind": "html-links",
- "elapsed_seconds": 12.998,
+ "elapsed_seconds": 22.731,
"kind": "html-links",
"items_seen": 5
},
@@ -291,7 +291,7 @@
"system_id": "gitlab-ce",
"source_name": "GitLab Security Releases",
"source_kind": "html-links",
- "elapsed_seconds": 13.005,
+ "elapsed_seconds": 21.89,
"kind": "html-links",
"items_seen": 250
},
@@ -299,7 +299,7 @@
"system_id": "gitlab-ce",
"source_name": "NVD GitLab",
"source_kind": "nvd-search",
- "elapsed_seconds": 9.384,
+ "elapsed_seconds": 21.121,
"kind": "nvd-search",
"items_seen": 1
},
@@ -307,7 +307,7 @@
"system_id": "grafana",
"source_name": "CISA KEV Grafana",
"source_kind": "kev-json",
- "elapsed_seconds": 12.554,
+ "elapsed_seconds": 22.048,
"kind": "kev-json",
"items_seen": 1545
},
@@ -315,7 +315,7 @@
"system_id": "grafana",
"source_name": "Grafana Security Advisories",
"source_kind": "html-links",
- "elapsed_seconds": 13.008,
+ "elapsed_seconds": 21.898,
"kind": "html-links",
"items_seen": 159
},
@@ -323,7 +323,7 @@
"system_id": "hapi",
"source_name": "OSV Hapi",
"source_kind": "osv-batch",
- "elapsed_seconds": 6.891,
+ "elapsed_seconds": 20.785,
"kind": "osv-batch",
"items_seen": 1
},
@@ -331,7 +331,7 @@
"system_id": "haproxy",
"source_name": "HAProxy Blog Feed",
"source_kind": "rss-feed",
- "elapsed_seconds": 13.686,
+ "elapsed_seconds": 23.785,
"kind": "rss-feed",
"items_seen": 10
},
@@ -339,7 +339,7 @@
"system_id": "haproxy",
"source_name": "NVD HAProxy",
"source_kind": "nvd-search",
- "elapsed_seconds": 8.089,
+ "elapsed_seconds": 20.942,
"kind": "nvd-search",
"items_seen": 1
},
@@ -347,7 +347,7 @@
"system_id": "jenkins",
"source_name": "Jenkins Security Advisories",
"source_kind": "html-links",
- "elapsed_seconds": 12.502,
+ "elapsed_seconds": 21.819,
"kind": "html-links",
"items_seen": 1194
},
@@ -355,7 +355,7 @@
"system_id": "jenkins",
"source_name": "NVD Jenkins",
"source_kind": "nvd-search",
- "elapsed_seconds": 9.459,
+ "elapsed_seconds": 21.164,
"kind": "nvd-search",
"items_seen": 1
},
@@ -363,7 +363,7 @@
"system_id": "joomla",
"source_name": "Joomla Security Centre",
"source_kind": "html-links",
- "elapsed_seconds": 1.606,
+ "elapsed_seconds": 15.112,
"kind": "html-links",
"items_seen": 139
},
@@ -371,7 +371,7 @@
"system_id": "joomla",
"source_name": "OSV Joomla",
"source_kind": "osv-batch",
- "elapsed_seconds": 1.281,
+ "elapsed_seconds": 10.892,
"kind": "osv-batch",
"items_seen": 1
},
@@ -379,7 +379,7 @@
"system_id": "kibana",
"source_name": "Elastic Security Announcements",
"source_kind": "html-links",
- "elapsed_seconds": 13.321,
+ "elapsed_seconds": 22.524,
"kind": "html-links",
"items_seen": 71
},
@@ -387,7 +387,7 @@
"system_id": "kibana",
"source_name": "NVD Kibana",
"source_kind": "nvd-search",
- "elapsed_seconds": 9.748,
+ "elapsed_seconds": 21.561,
"kind": "nvd-search",
"items_seen": 1
},
@@ -395,7 +395,7 @@
"system_id": "koa",
"source_name": "OSV Koa",
"source_kind": "osv-batch",
- "elapsed_seconds": 6.914,
+ "elapsed_seconds": 18.543,
"kind": "osv-batch",
"items_seen": 1
},
@@ -403,7 +403,7 @@
"system_id": "laravel",
"source_name": "OSV Laravel",
"source_kind": "osv-batch",
- "elapsed_seconds": 6.864,
+ "elapsed_seconds": 20.95,
"kind": "osv-batch",
"items_seen": 1
},
@@ -411,7 +411,7 @@
"system_id": "magento-open-source",
"source_name": "Magento GitHub Advisories",
"source_kind": "html-links",
- "elapsed_seconds": 3.968,
+ "elapsed_seconds": 6.082,
"kind": "html-links",
"items_seen": 99
},
@@ -419,7 +419,7 @@
"system_id": "magento-open-source",
"source_name": "NVD Magento",
"source_kind": "nvd-search",
- "elapsed_seconds": 1.084,
+ "elapsed_seconds": 5.985,
"kind": "nvd-search",
"items_seen": 1
},
@@ -427,7 +427,7 @@
"system_id": "magento-open-source",
"source_name": "Sansec Research",
"source_kind": "html-links",
- "elapsed_seconds": 3.855,
+ "elapsed_seconds": 14.904,
"kind": "html-links",
"items_seen": 134
},
@@ -435,7 +435,7 @@
"system_id": "mattermost",
"source_name": "Mattermost Security Updates JSON",
"source_kind": "json-feed",
- "elapsed_seconds": 13.321,
+ "elapsed_seconds": 22.362,
"kind": "json-feed",
"items_seen": 594
},
@@ -443,7 +443,7 @@
"system_id": "mattermost",
"source_name": "OSV Mattermost",
"source_kind": "osv-batch",
- "elapsed_seconds": 13.789,
+ "elapsed_seconds": 23.593,
"kind": "osv-batch",
"items_seen": 1
},
@@ -451,7 +451,7 @@
"system_id": "mediawiki",
"source_name": "MediaWiki Announce RSS",
"source_kind": "rss-feed",
- "elapsed_seconds": 2.777,
+ "elapsed_seconds": 12.818,
"kind": "rss-feed",
"items_seen": 30
},
@@ -459,7 +459,7 @@
"system_id": "mediawiki",
"source_name": "OSV MediaWiki",
"source_kind": "osv-batch",
- "elapsed_seconds": 1.19,
+ "elapsed_seconds": 11.096,
"kind": "osv-batch",
"items_seen": 1
},
@@ -467,7 +467,7 @@
"system_id": "medusa",
"source_name": "GitHub Medusa Advisories",
"source_kind": "html-links",
- "elapsed_seconds": 3.973,
+ "elapsed_seconds": 17.699,
"kind": "html-links",
"items_seen": 102
},
@@ -475,7 +475,7 @@
"system_id": "medusa",
"source_name": "OSV Medusa",
"source_kind": "osv-batch",
- "elapsed_seconds": 4.126,
+ "elapsed_seconds": 17.58,
"kind": "osv-batch",
"items_seen": 1
},
@@ -483,7 +483,7 @@
"system_id": "moodle",
"source_name": "OSV Moodle",
"source_kind": "osv-batch",
- "elapsed_seconds": 4.366,
+ "elapsed_seconds": 14.494,
"kind": "osv-batch",
"items_seen": 1
},
@@ -491,7 +491,7 @@
"system_id": "nestjs",
"source_name": "OSV NestJS",
"source_kind": "osv-batch",
- "elapsed_seconds": 6.876,
+ "elapsed_seconds": 17.777,
"kind": "osv-batch",
"items_seen": 1
},
@@ -499,7 +499,7 @@
"system_id": "nextjs",
"source_name": "GitHub Next.js Advisories",
"source_kind": "html-links",
- "elapsed_seconds": 4.878,
+ "elapsed_seconds": 20.786,
"kind": "html-links",
"items_seen": 123
},
@@ -507,7 +507,7 @@
"system_id": "nextjs",
"source_name": "OSV Next.js",
"source_kind": "osv-batch",
- "elapsed_seconds": 5.19,
+ "elapsed_seconds": 17.861,
"kind": "osv-batch",
"items_seen": 1
},
@@ -515,7 +515,7 @@
"system_id": "nginx",
"source_name": "CISA KEV NGINX",
"source_kind": "kev-json",
- "elapsed_seconds": 9.35,
+ "elapsed_seconds": 21.713,
"kind": "kev-json",
"items_seen": 1545
},
@@ -523,7 +523,7 @@
"system_id": "nginx",
"source_name": "NGINX Security Advisories",
"source_kind": "html-links",
- "elapsed_seconds": 10.287,
+ "elapsed_seconds": 22.082,
"kind": "html-links",
"items_seen": 138
},
@@ -531,7 +531,7 @@
"system_id": "nginx",
"source_name": "NVD NGINX",
"source_kind": "nvd-search",
- "elapsed_seconds": 6.78,
+ "elapsed_seconds": 20.649,
"kind": "nvd-search",
"items_seen": 1
},
@@ -539,7 +539,7 @@
"system_id": "nodejs",
"source_name": "CISA KEV Node.js",
"source_kind": "kev-json",
- "elapsed_seconds": 5.134,
+ "elapsed_seconds": 19.822,
"kind": "kev-json",
"items_seen": 1545
},
@@ -547,7 +547,7 @@
"system_id": "nodejs",
"source_name": "Node.js Security Releases",
"source_kind": "html-links",
- "elapsed_seconds": 7.272,
+ "elapsed_seconds": 20.769,
"kind": "html-links",
"items_seen": 74
},
@@ -555,7 +555,7 @@
"system_id": "nuxt",
"source_name": "Nuxt Security",
"source_kind": "html-links",
- "elapsed_seconds": 5.153,
+ "elapsed_seconds": 17.546,
"kind": "html-links",
"items_seen": 118
},
@@ -563,7 +563,7 @@
"system_id": "nuxt",
"source_name": "OSV Nuxt",
"source_kind": "osv-batch",
- "elapsed_seconds": 4.668,
+ "elapsed_seconds": 17.779,
"kind": "osv-batch",
"items_seen": 1
},
@@ -571,7 +571,7 @@
"system_id": "opencart",
"source_name": "OSV OpenCart",
"source_kind": "osv-batch",
- "elapsed_seconds": 4.23,
+ "elapsed_seconds": 14.725,
"kind": "osv-batch",
"items_seen": 1
},
@@ -579,7 +579,7 @@
"system_id": "opencart",
"source_name": "OpenCart Releases",
"source_kind": "html-links",
- "elapsed_seconds": 4.351,
+ "elapsed_seconds": 15.89,
"kind": "html-links",
"items_seen": 1500
},
@@ -587,7 +587,7 @@
"system_id": "openmage",
"source_name": "OSV OpenMage",
"source_kind": "osv-batch",
- "elapsed_seconds": 2.499,
+ "elapsed_seconds": 11.087,
"kind": "osv-batch",
"items_seen": 1
},
@@ -595,7 +595,7 @@
"system_id": "openmage",
"source_name": "OpenMage GitHub Advisories",
"source_kind": "html-links",
- "elapsed_seconds": 3.796,
+ "elapsed_seconds": 14.651,
"kind": "html-links",
"items_seen": 125
},
@@ -603,7 +603,7 @@
"system_id": "phpmyadmin",
"source_name": "OSV phpMyAdmin",
"source_kind": "osv-batch",
- "elapsed_seconds": 10.369,
+ "elapsed_seconds": 22.037,
"kind": "osv-batch",
"items_seen": 1
},
@@ -611,7 +611,7 @@
"system_id": "phpmyadmin",
"source_name": "phpMyAdmin Security Page",
"source_kind": "html-links",
- "elapsed_seconds": 9.354,
+ "elapsed_seconds": 21.695,
"kind": "html-links",
"items_seen": 262
},
@@ -619,7 +619,7 @@
"system_id": "prestashop",
"source_name": "Friends Of Presta Security",
"source_kind": "html-links",
- "elapsed_seconds": 4.217,
+ "elapsed_seconds": 14.625,
"kind": "html-links",
"items_seen": 38
},
@@ -627,7 +627,7 @@
"system_id": "prestashop",
"source_name": "GitHub PrestaShop Advisories",
"source_kind": "html-links",
- "elapsed_seconds": 3.797,
+ "elapsed_seconds": 14.786,
"kind": "html-links",
"items_seen": 127
},
@@ -635,7 +635,7 @@
"system_id": "prestashop",
"source_name": "OSV PrestaShop",
"source_kind": "osv-batch",
- "elapsed_seconds": 3.596,
+ "elapsed_seconds": 14.611,
"kind": "osv-batch",
"items_seen": 1
},
@@ -643,7 +643,7 @@
"system_id": "prestashop",
"source_name": "PrestaShop Security Page",
"source_kind": "html-links",
- "elapsed_seconds": 3.27,
+ "elapsed_seconds": 14.158,
"kind": "html-links",
"items_seen": 60
},
@@ -651,7 +651,7 @@
"system_id": "rails",
"source_name": "OSV Rails",
"source_kind": "osv-batch",
- "elapsed_seconds": 9.861,
+ "elapsed_seconds": 21.273,
"kind": "osv-batch",
"items_seen": 1
},
@@ -659,7 +659,7 @@
"system_id": "react",
"source_name": "GitHub React Advisories",
"source_kind": "html-links",
- "elapsed_seconds": 5.062,
+ "elapsed_seconds": 17.595,
"kind": "html-links",
"items_seen": 110
},
@@ -667,7 +667,7 @@
"system_id": "react",
"source_name": "OSV React",
"source_kind": "osv-batch",
- "elapsed_seconds": 5.091,
+ "elapsed_seconds": 17.604,
"kind": "osv-batch",
"items_seen": 1
},
@@ -675,7 +675,7 @@
"system_id": "redmine",
"source_name": "OSV Redmine",
"source_kind": "osv-batch",
- "elapsed_seconds": 12.995,
+ "elapsed_seconds": 22.53,
"kind": "osv-batch",
"items_seen": 1
},
@@ -683,7 +683,7 @@
"system_id": "redmine",
"source_name": "Redmine Security Advisories",
"source_kind": "html-links",
- "elapsed_seconds": 14.666,
+ "elapsed_seconds": 23.782,
"kind": "html-links",
"items_seen": 371
},
@@ -691,7 +691,7 @@
"system_id": "saleor",
"source_name": "GitHub Saleor Advisories",
"source_kind": "html-links",
- "elapsed_seconds": 3.8,
+ "elapsed_seconds": 15.06,
"kind": "html-links",
"items_seen": 120
},
@@ -699,7 +699,7 @@
"system_id": "saleor",
"source_name": "OSV Saleor",
"source_kind": "osv-batch",
- "elapsed_seconds": 4.128,
+ "elapsed_seconds": 17.631,
"kind": "osv-batch",
"items_seen": 1
},
@@ -707,7 +707,7 @@
"system_id": "shopware",
"source_name": "OSV Shopware",
"source_kind": "osv-batch",
- "elapsed_seconds": 3.959,
+ "elapsed_seconds": 14.856,
"kind": "osv-batch",
"items_seen": 1
},
@@ -715,7 +715,7 @@
"system_id": "shopware",
"source_name": "Shopware Security Advisories",
"source_kind": "html-links",
- "elapsed_seconds": 3.964,
+ "elapsed_seconds": 15.064,
"kind": "html-links",
"items_seen": 129
},
@@ -723,7 +723,7 @@
"system_id": "spring-boot",
"source_name": "OSV Spring Boot",
"source_kind": "osv-batch",
- "elapsed_seconds": 6.772,
+ "elapsed_seconds": 20.771,
"kind": "osv-batch",
"items_seen": 1
},
@@ -731,7 +731,7 @@
"system_id": "spring-boot",
"source_name": "Spring Security Advisories",
"source_kind": "html-links",
- "elapsed_seconds": 6.368,
+ "elapsed_seconds": 20.425,
"kind": "html-links",
"items_seen": 118
},
@@ -739,7 +739,7 @@
"system_id": "spring-framework",
"source_name": "OSV Spring Framework",
"source_kind": "osv-batch",
- "elapsed_seconds": 6.689,
+ "elapsed_seconds": 20.267,
"kind": "osv-batch",
"items_seen": 1
},
@@ -747,7 +747,7 @@
"system_id": "spring-framework",
"source_name": "Spring Security Advisories",
"source_kind": "html-links",
- "elapsed_seconds": 6.374,
+ "elapsed_seconds": 20.79,
"kind": "html-links",
"items_seen": 118
},
@@ -755,7 +755,7 @@
"system_id": "spring-security",
"source_name": "OSV Spring Security",
"source_kind": "osv-batch",
- "elapsed_seconds": 6.768,
+ "elapsed_seconds": 20.31,
"kind": "osv-batch",
"items_seen": 1
},
@@ -763,7 +763,7 @@
"system_id": "spring-security",
"source_name": "Spring Security Advisories",
"source_kind": "html-links",
- "elapsed_seconds": 6.497,
+ "elapsed_seconds": 20.651,
"kind": "html-links",
"items_seen": 118
},
@@ -771,7 +771,7 @@
"system_id": "strapi",
"source_name": "OSV Strapi",
"source_kind": "osv-batch",
- "elapsed_seconds": 1.132,
+ "elapsed_seconds": 11.029,
"kind": "osv-batch",
"items_seen": 1
},
@@ -779,7 +779,7 @@
"system_id": "strapi",
"source_name": "Strapi GitHub Advisories",
"source_kind": "html-links",
- "elapsed_seconds": 1.076,
+ "elapsed_seconds": 5.987,
"kind": "html-links",
"items_seen": 124
},
@@ -787,7 +787,7 @@
"system_id": "sveltekit",
"source_name": "OSV SvelteKit",
"source_kind": "osv-batch",
- "elapsed_seconds": 6.768,
+ "elapsed_seconds": 17.604,
"kind": "osv-batch",
"items_seen": 1
},
@@ -795,7 +795,7 @@
"system_id": "symfony",
"source_name": "OSV Symfony",
"source_kind": "osv-batch",
- "elapsed_seconds": 10.332,
+ "elapsed_seconds": 20.844,
"kind": "osv-batch",
"items_seen": 1
},
@@ -803,7 +803,7 @@
"system_id": "traefik",
"source_name": "GitHub Traefik Advisories",
"source_kind": "html-links",
- "elapsed_seconds": 10.164,
+ "elapsed_seconds": 21.716,
"kind": "html-links",
"items_seen": 124
},
@@ -811,7 +811,7 @@
"system_id": "traefik",
"source_name": "OSV Traefik",
"source_kind": "osv-batch",
- "elapsed_seconds": 9.746,
+ "elapsed_seconds": 21.717,
"kind": "osv-batch",
"items_seen": 1
},
@@ -819,7 +819,7 @@
"system_id": "undici",
"source_name": "OSV Undici",
"source_kind": "osv-batch",
- "elapsed_seconds": 6.795,
+ "elapsed_seconds": 20.278,
"kind": "osv-batch",
"items_seen": 1
},
@@ -827,7 +827,7 @@
"system_id": "vite",
"source_name": "OSV Vite",
"source_kind": "osv-batch",
- "elapsed_seconds": 6.799,
+ "elapsed_seconds": 17.824,
"kind": "osv-batch",
"items_seen": 1
},
@@ -835,7 +835,7 @@
"system_id": "vite",
"source_name": "Vite Security",
"source_kind": "html-links",
- "elapsed_seconds": 5.125,
+ "elapsed_seconds": 18.678,
"kind": "html-links",
"items_seen": 124
},
@@ -843,7 +843,7 @@
"system_id": "vue",
"source_name": "OSV Vue",
"source_kind": "osv-batch",
- "elapsed_seconds": 4.743,
+ "elapsed_seconds": 17.596,
"kind": "osv-batch",
"items_seen": 1
},
@@ -851,7 +851,7 @@
"system_id": "vue",
"source_name": "Vue Security",
"source_kind": "html-links",
- "elapsed_seconds": 5.022,
+ "elapsed_seconds": 17.608,
"kind": "html-links",
"items_seen": 111
},
@@ -859,7 +859,7 @@
"system_id": "webpack",
"source_name": "OSV webpack",
"source_kind": "osv-batch",
- "elapsed_seconds": 7.035,
+ "elapsed_seconds": 20.643,
"kind": "osv-batch",
"items_seen": 1
},
@@ -867,7 +867,7 @@
"system_id": "werkzeug",
"source_name": "OSV Werkzeug",
"source_kind": "osv-batch",
- "elapsed_seconds": 10.051,
+ "elapsed_seconds": 21.0,
"kind": "osv-batch",
"items_seen": 1
},
@@ -875,7 +875,7 @@
"system_id": "woocommerce",
"source_name": "GitHub WooCommerce Advisories",
"source_kind": "html-links",
- "elapsed_seconds": 3.803,
+ "elapsed_seconds": 14.511,
"kind": "html-links",
"items_seen": 107
},
@@ -883,7 +883,7 @@
"system_id": "woocommerce",
"source_name": "OSV WooCommerce",
"source_kind": "osv-batch",
- "elapsed_seconds": 2.193,
+ "elapsed_seconds": 10.984,
"kind": "osv-batch",
"items_seen": 1
},
@@ -891,7 +891,7 @@
"system_id": "woocommerce",
"source_name": "Patchstack Database",
"source_kind": "html-links",
- "elapsed_seconds": 3.694,
+ "elapsed_seconds": 15.775,
"kind": "html-links",
"items_seen": 193
},
@@ -899,7 +899,7 @@
"system_id": "woocommerce",
"source_name": "Woo Developer Advisories",
"source_kind": "html-links",
- "elapsed_seconds": 4.393,
+ "elapsed_seconds": 14.66,
"kind": "html-links",
"items_seen": 121
},
@@ -907,7 +907,7 @@
"system_id": "woocommerce",
"source_name": "Wordfence Vulnerability Database",
"source_kind": "html-links",
- "elapsed_seconds": 3.182,
+ "elapsed_seconds": 17.927,
"kind": "html-links",
"items_seen": 0
},
@@ -915,7 +915,7 @@
"system_id": "wordpress",
"source_name": "Patchstack Database",
"source_kind": "html-links",
- "elapsed_seconds": 1.596,
+ "elapsed_seconds": 2.35,
"kind": "html-links",
"items_seen": 193
},
@@ -923,7 +923,7 @@
"system_id": "wordpress",
"source_name": "PortSwigger Research",
"source_kind": "html-links",
- "elapsed_seconds": 1.802,
+ "elapsed_seconds": 15.425,
"kind": "html-links",
"items_seen": 99
},
@@ -931,7 +931,7 @@
"system_id": "wordpress",
"source_name": "WPScan Vulnerability Database",
"source_kind": "html-links",
- "elapsed_seconds": 1.141,
+ "elapsed_seconds": 10.855,
"kind": "html-links",
"items_seen": 74
},
@@ -939,7 +939,7 @@
"system_id": "wordpress",
"source_name": "WordPress Security News RSS",
"source_kind": "rss-feed",
- "elapsed_seconds": 1.599,
+ "elapsed_seconds": 1.559,
"kind": "rss-feed",
"items_seen": 10
},
@@ -947,81 +947,81 @@
"system_id": "wordpress",
"source_name": "Wordfence Vulnerability Database",
"source_kind": "html-links",
- "elapsed_seconds": 1.282,
+ "elapsed_seconds": 17.336,
"kind": "html-links",
"items_seen": 0
}
],
"failures": [],
"slow_sources": [
+ {
+ "system_id": "haproxy",
+ "source_name": "HAProxy Blog Feed",
+ "source_kind": "rss-feed",
+ "elapsed_seconds": 23.785,
+ "status": "ok"
+ },
{
"system_id": "redmine",
"source_name": "Redmine Security Advisories",
"source_kind": "html-links",
- "elapsed_seconds": 14.666,
+ "elapsed_seconds": 23.782,
"status": "ok"
},
{
"system_id": "mattermost",
"source_name": "OSV Mattermost",
"source_kind": "osv-batch",
- "elapsed_seconds": 13.789,
- "status": "ok"
- },
- {
- "system_id": "haproxy",
- "source_name": "HAProxy Blog Feed",
- "source_kind": "rss-feed",
- "elapsed_seconds": 13.686,
- "status": "ok"
- },
- {
- "system_id": "kibana",
- "source_name": "Elastic Security Announcements",
- "source_kind": "html-links",
- "elapsed_seconds": 13.321,
- "status": "ok"
- },
- {
- "system_id": "mattermost",
- "source_name": "Mattermost Security Updates JSON",
- "source_kind": "json-feed",
- "elapsed_seconds": 13.321,
- "status": "ok"
- },
- {
- "system_id": "gitea",
- "source_name": "OSV Gitea",
- "source_kind": "osv-batch",
- "elapsed_seconds": 13.025,
- "status": "ok"
- },
- {
- "system_id": "grafana",
- "source_name": "Grafana Security Advisories",
- "source_kind": "html-links",
- "elapsed_seconds": 13.008,
- "status": "ok"
- },
- {
- "system_id": "gitlab-ce",
- "source_name": "GitLab Security Releases",
- "source_kind": "html-links",
- "elapsed_seconds": 13.005,
- "status": "ok"
- },
- {
- "system_id": "gitea",
- "source_name": "GitHub Gitea Advisories",
- "source_kind": "html-links",
- "elapsed_seconds": 13.004,
+ "elapsed_seconds": 23.593,
"status": "ok"
},
{
"system_id": "gitlab-ce",
"source_name": "GitLab Advisory Database",
"source_kind": "html-links",
- "elapsed_seconds": 12.998,
+ "elapsed_seconds": 22.731,
+ "status": "ok"
+ },
+ {
+ "system_id": "redmine",
+ "source_name": "OSV Redmine",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 22.53,
+ "status": "ok"
+ },
+ {
+ "system_id": "kibana",
+ "source_name": "Elastic Security Announcements",
+ "source_kind": "html-links",
+ "elapsed_seconds": 22.524,
+ "status": "ok"
+ },
+ {
+ "system_id": "mattermost",
+ "source_name": "Mattermost Security Updates JSON",
+ "source_kind": "json-feed",
+ "elapsed_seconds": 22.362,
+ "status": "ok"
+ },
+ {
+ "system_id": "nginx",
+ "source_name": "NGINX Security Advisories",
+ "source_kind": "html-links",
+ "elapsed_seconds": 22.082,
+ "status": "ok"
+ },
+ {
+ "system_id": "grafana",
+ "source_name": "CISA KEV Grafana",
+ "source_kind": "kev-json",
+ "elapsed_seconds": 22.048,
+ "status": "ok"
+ },
+ {
+ "system_id": "phpmyadmin",
+ "source_name": "OSV phpMyAdmin",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 22.037,
"status": "ok"
}
],
diff --git a/08-threat-intel/registry/monitoring/2026-03-19T02-27-12+00-00.json b/08-threat-intel/registry/monitoring/2026-03-19T02-27-12+00-00.json
new file mode 100644
index 00000000..6717315f
--- /dev/null
+++ b/08-threat-intel/registry/monitoring/2026-03-19T02-27-12+00-00.json
@@ -0,0 +1,3659 @@
+{
+ "generated_at": "2026-03-19T02:27:12+00:00",
+ "source_catalog_audit": {
+ "generated_at": "2026-03-19T02:26:48+00:00",
+ "system_count": 62,
+ "source_count": 173,
+ "active_source_count": 118,
+ "retired_source_count": 55,
+ "systems_with_active_official": 61,
+ "systems_with_machine_readable_source": 62,
+ "systems": [
+ {
+ "system_id": "adminer",
+ "display_name": "Adminer",
+ "category": "platforms",
+ "tier": "rolling-24m",
+ "source_total": 1,
+ "active_source_total": 1,
+ "retired_source_total": 0,
+ "official_active": 1,
+ "ecosystem_active": 0,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "adobe-commerce",
+ "display_name": "Adobe Commerce",
+ "category": "ecommerce",
+ "tier": "history-full",
+ "source_total": 5,
+ "active_source_total": 2,
+ "retired_source_total": 3,
+ "official_active": 2,
+ "ecosystem_active": 0,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "angular",
+ "display_name": "Angular",
+ "category": "frameworks",
+ "tier": "rolling-24m",
+ "source_total": 2,
+ "active_source_total": 1,
+ "retired_source_total": 1,
+ "official_active": 1,
+ "ecosystem_active": 0,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "apache-httpd",
+ "display_name": "Apache HTTP Server",
+ "category": "servers",
+ "tier": "history-full",
+ "source_total": 3,
+ "active_source_total": 3,
+ "retired_source_total": 0,
+ "official_active": 3,
+ "ecosystem_active": 0,
+ "research_active": 0,
+ "machine_readable_active": 2,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "apache-tomcat",
+ "display_name": "Apache Tomcat",
+ "category": "servers",
+ "tier": "history-full",
+ "source_total": 3,
+ "active_source_total": 3,
+ "retired_source_total": 0,
+ "official_active": 3,
+ "ecosystem_active": 0,
+ "research_active": 0,
+ "machine_readable_active": 2,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "aspnet-core",
+ "display_name": "ASP.NET Core",
+ "category": "frameworks",
+ "tier": "rolling-24m",
+ "source_total": 1,
+ "active_source_total": 1,
+ "retired_source_total": 0,
+ "official_active": 1,
+ "ecosystem_active": 0,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "astro",
+ "display_name": "Astro",
+ "category": "frameworks",
+ "tier": "rolling-24m",
+ "source_total": 2,
+ "active_source_total": 1,
+ "retired_source_total": 1,
+ "official_active": 1,
+ "ecosystem_active": 0,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "caddy",
+ "display_name": "Caddy",
+ "category": "servers",
+ "tier": "rolling-24m",
+ "source_total": 2,
+ "active_source_total": 2,
+ "retired_source_total": 0,
+ "official_active": 2,
+ "ecosystem_active": 0,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "directus",
+ "display_name": "Directus",
+ "category": "cms",
+ "tier": "rolling-24m",
+ "source_total": 2,
+ "active_source_total": 2,
+ "retired_source_total": 0,
+ "official_active": 2,
+ "ecosystem_active": 0,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "discourse",
+ "display_name": "Discourse",
+ "category": "cms",
+ "tier": "rolling-24m",
+ "source_total": 5,
+ "active_source_total": 3,
+ "retired_source_total": 2,
+ "official_active": 2,
+ "ecosystem_active": 1,
+ "research_active": 0,
+ "machine_readable_active": 3,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "django",
+ "display_name": "Django",
+ "category": "frameworks",
+ "tier": "rolling-24m",
+ "source_total": 4,
+ "active_source_total": 3,
+ "retired_source_total": 1,
+ "official_active": 3,
+ "ecosystem_active": 0,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "drupal",
+ "display_name": "Drupal",
+ "category": "cms",
+ "tier": "history-full",
+ "source_total": 3,
+ "active_source_total": 2,
+ "retired_source_total": 1,
+ "official_active": 1,
+ "ecosystem_active": 1,
+ "research_active": 0,
+ "machine_readable_active": 2,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "echo",
+ "display_name": "Echo",
+ "category": "frameworks",
+ "tier": "rolling-24m",
+ "source_total": 1,
+ "active_source_total": 1,
+ "retired_source_total": 0,
+ "official_active": 1,
+ "ecosystem_active": 0,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "esbuild",
+ "display_name": "esbuild",
+ "category": "frameworks",
+ "tier": "rolling-24m",
+ "source_total": 3,
+ "active_source_total": 1,
+ "retired_source_total": 2,
+ "official_active": 1,
+ "ecosystem_active": 0,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "express",
+ "display_name": "Express",
+ "category": "frameworks",
+ "tier": "rolling-24m",
+ "source_total": 3,
+ "active_source_total": 1,
+ "retired_source_total": 2,
+ "official_active": 1,
+ "ecosystem_active": 0,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "fastify",
+ "display_name": "Fastify",
+ "category": "frameworks",
+ "tier": "rolling-24m",
+ "source_total": 2,
+ "active_source_total": 1,
+ "retired_source_total": 1,
+ "official_active": 1,
+ "ecosystem_active": 0,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "flask",
+ "display_name": "Flask",
+ "category": "frameworks",
+ "tier": "rolling-24m",
+ "source_total": 2,
+ "active_source_total": 1,
+ "retired_source_total": 1,
+ "official_active": 1,
+ "ecosystem_active": 0,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "ghost",
+ "display_name": "Ghost",
+ "category": "cms",
+ "tier": "history-full",
+ "source_total": 3,
+ "active_source_total": 2,
+ "retired_source_total": 1,
+ "official_active": 1,
+ "ecosystem_active": 1,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "gin",
+ "display_name": "Gin",
+ "category": "frameworks",
+ "tier": "rolling-24m",
+ "source_total": 1,
+ "active_source_total": 1,
+ "retired_source_total": 0,
+ "official_active": 1,
+ "ecosystem_active": 0,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "gitea",
+ "display_name": "Gitea",
+ "category": "platforms",
+ "tier": "rolling-24m",
+ "source_total": 2,
+ "active_source_total": 2,
+ "retired_source_total": 0,
+ "official_active": 2,
+ "ecosystem_active": 0,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "gitlab-ce",
+ "display_name": "GitLab CE",
+ "category": "platforms",
+ "tier": "rolling-24m",
+ "source_total": 3,
+ "active_source_total": 3,
+ "retired_source_total": 0,
+ "official_active": 2,
+ "ecosystem_active": 1,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "grafana",
+ "display_name": "Grafana",
+ "category": "platforms",
+ "tier": "rolling-24m",
+ "source_total": 2,
+ "active_source_total": 2,
+ "retired_source_total": 0,
+ "official_active": 2,
+ "ecosystem_active": 0,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "hapi",
+ "display_name": "Hapi",
+ "category": "frameworks",
+ "tier": "history-full",
+ "source_total": 2,
+ "active_source_total": 1,
+ "retired_source_total": 1,
+ "official_active": 1,
+ "ecosystem_active": 0,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "haproxy",
+ "display_name": "HAProxy",
+ "category": "servers",
+ "tier": "rolling-24m",
+ "source_total": 3,
+ "active_source_total": 2,
+ "retired_source_total": 1,
+ "official_active": 2,
+ "ecosystem_active": 0,
+ "research_active": 0,
+ "machine_readable_active": 2,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "jenkins",
+ "display_name": "Jenkins",
+ "category": "platforms",
+ "tier": "rolling-24m",
+ "source_total": 2,
+ "active_source_total": 2,
+ "retired_source_total": 0,
+ "official_active": 2,
+ "ecosystem_active": 0,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "joomla",
+ "display_name": "Joomla",
+ "category": "cms",
+ "tier": "history-full",
+ "source_total": 3,
+ "active_source_total": 2,
+ "retired_source_total": 1,
+ "official_active": 1,
+ "ecosystem_active": 1,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "kibana",
+ "display_name": "Kibana",
+ "category": "platforms",
+ "tier": "rolling-24m",
+ "source_total": 2,
+ "active_source_total": 2,
+ "retired_source_total": 0,
+ "official_active": 2,
+ "ecosystem_active": 0,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "koa",
+ "display_name": "Koa",
+ "category": "frameworks",
+ "tier": "rolling-24m",
+ "source_total": 2,
+ "active_source_total": 1,
+ "retired_source_total": 1,
+ "official_active": 1,
+ "ecosystem_active": 0,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "laravel",
+ "display_name": "Laravel",
+ "category": "frameworks",
+ "tier": "rolling-24m",
+ "source_total": 2,
+ "active_source_total": 1,
+ "retired_source_total": 1,
+ "official_active": 1,
+ "ecosystem_active": 0,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "magento-open-source",
+ "display_name": "Magento Open Source",
+ "category": "ecommerce",
+ "tier": "history-full",
+ "source_total": 3,
+ "active_source_total": 3,
+ "retired_source_total": 0,
+ "official_active": 2,
+ "ecosystem_active": 1,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "mattermost",
+ "display_name": "Mattermost",
+ "category": "platforms",
+ "tier": "rolling-24m",
+ "source_total": 4,
+ "active_source_total": 2,
+ "retired_source_total": 2,
+ "official_active": 1,
+ "ecosystem_active": 1,
+ "research_active": 0,
+ "machine_readable_active": 2,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "mediawiki",
+ "display_name": "MediaWiki",
+ "category": "cms",
+ "tier": "rolling-24m",
+ "source_total": 4,
+ "active_source_total": 2,
+ "retired_source_total": 2,
+ "official_active": 1,
+ "ecosystem_active": 1,
+ "research_active": 0,
+ "machine_readable_active": 2,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "medusa",
+ "display_name": "Medusa",
+ "category": "ecommerce",
+ "tier": "rolling-24m",
+ "source_total": 2,
+ "active_source_total": 2,
+ "retired_source_total": 0,
+ "official_active": 2,
+ "ecosystem_active": 0,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "moodle",
+ "display_name": "Moodle",
+ "category": "cms",
+ "tier": "rolling-24m",
+ "source_total": 3,
+ "active_source_total": 1,
+ "retired_source_total": 2,
+ "official_active": 0,
+ "ecosystem_active": 1,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": false,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "nestjs",
+ "display_name": "NestJS",
+ "category": "frameworks",
+ "tier": "rolling-24m",
+ "source_total": 3,
+ "active_source_total": 1,
+ "retired_source_total": 2,
+ "official_active": 1,
+ "ecosystem_active": 0,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "nextjs",
+ "display_name": "Next.js",
+ "category": "frameworks",
+ "tier": "history-full",
+ "source_total": 3,
+ "active_source_total": 2,
+ "retired_source_total": 1,
+ "official_active": 2,
+ "ecosystem_active": 0,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "nginx",
+ "display_name": "Nginx",
+ "category": "servers",
+ "tier": "history-full",
+ "source_total": 3,
+ "active_source_total": 3,
+ "retired_source_total": 0,
+ "official_active": 3,
+ "ecosystem_active": 0,
+ "research_active": 0,
+ "machine_readable_active": 2,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "nodejs",
+ "display_name": "Node.js",
+ "category": "frameworks",
+ "tier": "history-full",
+ "source_total": 2,
+ "active_source_total": 2,
+ "retired_source_total": 0,
+ "official_active": 2,
+ "ecosystem_active": 0,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "nuxt",
+ "display_name": "Nuxt",
+ "category": "frameworks",
+ "tier": "history-full",
+ "source_total": 3,
+ "active_source_total": 2,
+ "retired_source_total": 1,
+ "official_active": 2,
+ "ecosystem_active": 0,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "opencart",
+ "display_name": "OpenCart",
+ "category": "ecommerce",
+ "tier": "history-full",
+ "source_total": 3,
+ "active_source_total": 2,
+ "retired_source_total": 1,
+ "official_active": 1,
+ "ecosystem_active": 1,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "openmage",
+ "display_name": "OpenMage / Mage-OS",
+ "category": "ecommerce",
+ "tier": "rolling-24m",
+ "source_total": 3,
+ "active_source_total": 2,
+ "retired_source_total": 1,
+ "official_active": 1,
+ "ecosystem_active": 1,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "phpmyadmin",
+ "display_name": "phpMyAdmin",
+ "category": "platforms",
+ "tier": "rolling-24m",
+ "source_total": 3,
+ "active_source_total": 2,
+ "retired_source_total": 1,
+ "official_active": 1,
+ "ecosystem_active": 1,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "prestashop",
+ "display_name": "PrestaShop",
+ "category": "ecommerce",
+ "tier": "history-full",
+ "source_total": 5,
+ "active_source_total": 4,
+ "retired_source_total": 1,
+ "official_active": 2,
+ "ecosystem_active": 2,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "rails",
+ "display_name": "Ruby on Rails",
+ "category": "frameworks",
+ "tier": "rolling-24m",
+ "source_total": 3,
+ "active_source_total": 1,
+ "retired_source_total": 2,
+ "official_active": 1,
+ "ecosystem_active": 0,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "react",
+ "display_name": "React",
+ "category": "frameworks",
+ "tier": "history-full",
+ "source_total": 3,
+ "active_source_total": 2,
+ "retired_source_total": 1,
+ "official_active": 2,
+ "ecosystem_active": 0,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "redmine",
+ "display_name": "Redmine",
+ "category": "platforms",
+ "tier": "rolling-24m",
+ "source_total": 3,
+ "active_source_total": 2,
+ "retired_source_total": 1,
+ "official_active": 1,
+ "ecosystem_active": 1,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "saleor",
+ "display_name": "Saleor",
+ "category": "ecommerce",
+ "tier": "rolling-24m",
+ "source_total": 3,
+ "active_source_total": 2,
+ "retired_source_total": 1,
+ "official_active": 1,
+ "ecosystem_active": 1,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "shopware",
+ "display_name": "Shopware",
+ "category": "ecommerce",
+ "tier": "history-full",
+ "source_total": 3,
+ "active_source_total": 2,
+ "retired_source_total": 1,
+ "official_active": 1,
+ "ecosystem_active": 1,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "spring-boot",
+ "display_name": "Spring Boot",
+ "category": "frameworks",
+ "tier": "rolling-24m",
+ "source_total": 3,
+ "active_source_total": 2,
+ "retired_source_total": 1,
+ "official_active": 1,
+ "ecosystem_active": 1,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "spring-framework",
+ "display_name": "Spring Framework",
+ "category": "frameworks",
+ "tier": "rolling-24m",
+ "source_total": 3,
+ "active_source_total": 2,
+ "retired_source_total": 1,
+ "official_active": 1,
+ "ecosystem_active": 1,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "spring-security",
+ "display_name": "Spring Security",
+ "category": "frameworks",
+ "tier": "rolling-24m",
+ "source_total": 3,
+ "active_source_total": 2,
+ "retired_source_total": 1,
+ "official_active": 1,
+ "ecosystem_active": 1,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "strapi",
+ "display_name": "Strapi",
+ "category": "cms",
+ "tier": "rolling-24m",
+ "source_total": 2,
+ "active_source_total": 2,
+ "retired_source_total": 0,
+ "official_active": 2,
+ "ecosystem_active": 0,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "sveltekit",
+ "display_name": "SvelteKit",
+ "category": "frameworks",
+ "tier": "rolling-24m",
+ "source_total": 2,
+ "active_source_total": 1,
+ "retired_source_total": 1,
+ "official_active": 1,
+ "ecosystem_active": 0,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "symfony",
+ "display_name": "Symfony",
+ "category": "frameworks",
+ "tier": "rolling-24m",
+ "source_total": 2,
+ "active_source_total": 1,
+ "retired_source_total": 1,
+ "official_active": 1,
+ "ecosystem_active": 0,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "traefik",
+ "display_name": "Traefik",
+ "category": "servers",
+ "tier": "rolling-24m",
+ "source_total": 2,
+ "active_source_total": 2,
+ "retired_source_total": 0,
+ "official_active": 2,
+ "ecosystem_active": 0,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "undici",
+ "display_name": "Undici",
+ "category": "frameworks",
+ "tier": "rolling-24m",
+ "source_total": 3,
+ "active_source_total": 1,
+ "retired_source_total": 2,
+ "official_active": 1,
+ "ecosystem_active": 0,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "vite",
+ "display_name": "Vite",
+ "category": "frameworks",
+ "tier": "history-full",
+ "source_total": 3,
+ "active_source_total": 2,
+ "retired_source_total": 1,
+ "official_active": 2,
+ "ecosystem_active": 0,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "vue",
+ "display_name": "Vue",
+ "category": "frameworks",
+ "tier": "history-full",
+ "source_total": 3,
+ "active_source_total": 2,
+ "retired_source_total": 1,
+ "official_active": 2,
+ "ecosystem_active": 0,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "webpack",
+ "display_name": "webpack",
+ "category": "frameworks",
+ "tier": "rolling-24m",
+ "source_total": 3,
+ "active_source_total": 1,
+ "retired_source_total": 2,
+ "official_active": 1,
+ "ecosystem_active": 0,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "werkzeug",
+ "display_name": "Werkzeug",
+ "category": "frameworks",
+ "tier": "rolling-24m",
+ "source_total": 2,
+ "active_source_total": 1,
+ "retired_source_total": 1,
+ "official_active": 1,
+ "ecosystem_active": 0,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "woocommerce",
+ "display_name": "WooCommerce",
+ "category": "ecommerce",
+ "tier": "history-full",
+ "source_total": 6,
+ "active_source_total": 5,
+ "retired_source_total": 1,
+ "official_active": 2,
+ "ecosystem_active": 3,
+ "research_active": 0,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ },
+ {
+ "system_id": "wordpress",
+ "display_name": "WordPress",
+ "category": "cms",
+ "tier": "history-full",
+ "source_total": 6,
+ "active_source_total": 5,
+ "retired_source_total": 1,
+ "official_active": 1,
+ "ecosystem_active": 3,
+ "research_active": 1,
+ "machine_readable_active": 1,
+ "has_active_official": true,
+ "has_machine_readable_source": true
+ }
+ ],
+ "retired_sources": [
+ {
+ "system_id": "adobe-commerce",
+ "display_name": "Adobe Commerce",
+ "source_name": "Adobe Security Bulletins",
+ "bucket": "official_sources",
+ "kind": "html-links",
+ "retired_reason": "Original bulletin index probe was unstable under the old transport path; vendor index replacement uses explicit request policy and parser hints.",
+ "replacement_sources": [
+ "Adobe Magento Security Index",
+ "NVD Adobe Commerce",
+ "GHSA Adobe Commerce"
+ ],
+ "url": "https://helpx.adobe.com/security/products/magento.html"
+ },
+ {
+ "system_id": "adobe-commerce",
+ "display_name": "Adobe Commerce",
+ "source_name": "GHSA Adobe Commerce",
+ "bucket": "ecosystem_sources",
+ "kind": "ghsa-global",
+ "retired_reason": "Unauthenticated GHSA API requests are rate-limited in daily monitoring; Adobe index and NVD remain active replacements.",
+ "replacement_sources": [
+ "Adobe Magento Security Index",
+ "NVD Adobe Commerce"
+ ],
+ "url": ""
+ },
+ {
+ "system_id": "adobe-commerce",
+ "display_name": "Adobe Commerce",
+ "source_name": "Sansec Research",
+ "bucket": "ecosystem_sources",
+ "kind": "vendor-index",
+ "retired_reason": "Research index is too slow for daily active monitoring; GHSA Adobe Commerce provides a stable machine-readable replacement.",
+ "replacement_sources": [
+ "GHSA Adobe Commerce",
+ "Adobe Magento Security Index"
+ ],
+ "url": "https://sansec.io/research"
+ },
+ {
+ "system_id": "angular",
+ "display_name": "Angular",
+ "source_name": "GitHub Global Advisories",
+ "bucket": "official_sources",
+ "kind": "ghsa-global",
+ "retired_reason": "Unauthenticated GHSA API requests are rate-limited in daily monitoring; OSV Angular remains the active replacement source.",
+ "replacement_sources": [
+ "OSV Angular"
+ ],
+ "url": ""
+ },
+ {
+ "system_id": "astro",
+ "display_name": "Astro",
+ "source_name": "GitHub Global Advisories",
+ "bucket": "official_sources",
+ "kind": "ghsa-global",
+ "retired_reason": "Unauthenticated GHSA API requests are rate-limited in daily monitoring; OSV Astro remains the active replacement source.",
+ "replacement_sources": [
+ "OSV Astro"
+ ],
+ "url": ""
+ },
+ {
+ "system_id": "discourse",
+ "display_name": "Discourse",
+ "source_name": "Discourse Meta Security",
+ "bucket": "official_sources",
+ "kind": "html-links",
+ "retired_reason": "Meta security category HTML changed and no longer provides stable scrape semantics for health checks.",
+ "replacement_sources": [
+ "Discourse Release Notes RSS",
+ "GitHub Discourse Advisories"
+ ],
+ "url": "https://meta.discourse.org/c/bug/security/40"
+ },
+ {
+ "system_id": "discourse",
+ "display_name": "Discourse",
+ "source_name": "GitHub Discourse Advisories",
+ "bucket": "official_sources",
+ "kind": "ghsa-global",
+ "retired_reason": "Unauthenticated GHSA API requests are rate-limited in daily monitoring; Discourse release feed remains the active official source.",
+ "replacement_sources": [
+ "Discourse Release Notes RSS",
+ "Discourse Security RSS"
+ ],
+ "url": ""
+ },
+ {
+ "system_id": "django",
+ "display_name": "Django",
+ "source_name": "Django Security RSS",
+ "bucket": "official_sources",
+ "kind": "rss-feed",
+ "retired_reason": "Official security tag feed became unstable; use official weblog index and release archive instead.",
+ "replacement_sources": [
+ "Django Security Weblog",
+ "Django Security Releases Archive"
+ ],
+ "url": "https://www.djangoproject.com/weblog/feeds/tags/security/"
+ },
+ {
+ "system_id": "drupal",
+ "display_name": "Drupal",
+ "source_name": "NVD Drupal",
+ "bucket": "official_sources",
+ "kind": "nvd-search",
+ "retired_reason": "OSV Drupal + Drupal official RSS now cover machine-readable collection with lower cold-start latency than NVD public search.",
+ "replacement_sources": [
+ "Drupal Security Advisories RSS",
+ "OSV Drupal"
+ ],
+ "url": ""
+ },
+ {
+ "system_id": "esbuild",
+ "display_name": "esbuild",
+ "source_name": "GitHub Global Advisories",
+ "bucket": "official_sources",
+ "kind": "ghsa-global",
+ "retired_reason": "Unauthenticated GHSA API requests are rate-limited in daily monitoring; OSV esbuild remains the active replacement source.",
+ "replacement_sources": [
+ "OSV esbuild"
+ ],
+ "url": ""
+ },
+ {
+ "system_id": "esbuild",
+ "display_name": "esbuild",
+ "source_name": "NVD esbuild",
+ "bucket": "ecosystem_sources",
+ "kind": "nvd-search",
+ "retired_reason": "OSV esbuild replaces NVD public search for lower-latency machine-readable collection.",
+ "replacement_sources": [
+ "OSV esbuild"
+ ],
+ "url": ""
+ },
+ {
+ "system_id": "express",
+ "display_name": "Express",
+ "source_name": "GitHub Global Advisories",
+ "bucket": "official_sources",
+ "kind": "ghsa-global",
+ "retired_reason": "Unauthenticated GHSA API requests are rate-limited in daily monitoring; OSV Express remains the active replacement source.",
+ "replacement_sources": [
+ "OSV Express"
+ ],
+ "url": ""
+ },
+ {
+ "system_id": "express",
+ "display_name": "Express",
+ "source_name": "NVD Express.js",
+ "bucket": "ecosystem_sources",
+ "kind": "nvd-search",
+ "retired_reason": "OSV Express replaces NVD public search for lower-latency machine-readable collection.",
+ "replacement_sources": [
+ "OSV Express"
+ ],
+ "url": ""
+ },
+ {
+ "system_id": "fastify",
+ "display_name": "Fastify",
+ "source_name": "GitHub Global Advisories",
+ "bucket": "official_sources",
+ "kind": "ghsa-global",
+ "retired_reason": "Unauthenticated GHSA API requests are rate-limited in daily monitoring; OSV Fastify remains the active replacement source.",
+ "replacement_sources": [
+ "OSV Fastify"
+ ],
+ "url": ""
+ },
+ {
+ "system_id": "flask",
+ "display_name": "Flask",
+ "source_name": "GitHub Global Advisories",
+ "bucket": "official_sources",
+ "kind": "ghsa-global",
+ "retired_reason": "Unauthenticated GitHub advisory API is quota-limited; OSV Flask remains the active machine-readable source.",
+ "replacement_sources": [
+ "OSV Flask"
+ ],
+ "url": ""
+ },
+ {
+ "system_id": "ghost",
+ "display_name": "Ghost",
+ "source_name": "NVD Ghost",
+ "bucket": "official_sources",
+ "kind": "nvd-search",
+ "retired_reason": "OSV Ghost replaces NVD for machine-readable collection and keeps npm package alignment.",
+ "replacement_sources": [
+ "Ghost GitHub Advisories",
+ "OSV Ghost"
+ ],
+ "url": ""
+ },
+ {
+ "system_id": "hapi",
+ "display_name": "Hapi",
+ "source_name": "GitHub Global Advisories",
+ "bucket": "official_sources",
+ "kind": "ghsa-global",
+ "retired_reason": "Unauthenticated GHSA API requests are rate-limited in daily monitoring; OSV Hapi remains the active replacement source.",
+ "replacement_sources": [
+ "OSV Hapi"
+ ],
+ "url": ""
+ },
+ {
+ "system_id": "haproxy",
+ "display_name": "HAProxy",
+ "source_name": "HAProxy Security Advisories",
+ "bucket": "official_sources",
+ "kind": "html-links",
+ "retired_reason": "Legacy haproxy.org security page no longer yields stable scrape results for monitoring.",
+ "replacement_sources": [
+ "HAProxy Blog Feed"
+ ],
+ "url": "https://www.haproxy.org/security/"
+ },
+ {
+ "system_id": "joomla",
+ "display_name": "Joomla",
+ "source_name": "NVD Joomla",
+ "bucket": "official_sources",
+ "kind": "nvd-search",
+ "retired_reason": "OSV Joomla CMS replaces NVD for machine-readable collection without public NVD throttling.",
+ "replacement_sources": [
+ "Joomla Security Centre",
+ "OSV Joomla"
+ ],
+ "url": ""
+ },
+ {
+ "system_id": "koa",
+ "display_name": "Koa",
+ "source_name": "GitHub Global Advisories",
+ "bucket": "official_sources",
+ "kind": "ghsa-global",
+ "retired_reason": "Unauthenticated GHSA API requests are rate-limited in daily monitoring; OSV Koa remains the active replacement source.",
+ "replacement_sources": [
+ "OSV Koa"
+ ],
+ "url": ""
+ },
+ {
+ "system_id": "laravel",
+ "display_name": "Laravel",
+ "source_name": "GitHub Global Advisories",
+ "bucket": "official_sources",
+ "kind": "ghsa-global",
+ "retired_reason": "Unauthenticated GitHub advisory API is quota-limited; OSV Laravel remains the active machine-readable source.",
+ "replacement_sources": [
+ "OSV Laravel"
+ ],
+ "url": ""
+ },
+ {
+ "system_id": "mattermost",
+ "display_name": "Mattermost",
+ "source_name": "Mattermost Security Updates",
+ "bucket": "official_sources",
+ "kind": "html-links",
+ "retired_reason": "Mattermost security updates page returned repeated 403 responses from the collector path; NVD replacement remains active.",
+ "replacement_sources": [
+ "NVD Mattermost"
+ ],
+ "url": "https://mattermost.com/security-updates/"
+ },
+ {
+ "system_id": "mattermost",
+ "display_name": "Mattermost",
+ "source_name": "NVD Mattermost",
+ "bucket": "official_sources",
+ "kind": "nvd-search",
+ "retired_reason": "Mattermost official JSON feed plus OSV Mattermost replace NVD for lower-latency machine-readable collection.",
+ "replacement_sources": [
+ "Mattermost Security Updates JSON",
+ "OSV Mattermost"
+ ],
+ "url": ""
+ },
+ {
+ "system_id": "mediawiki",
+ "display_name": "MediaWiki",
+ "source_name": "MediaWiki Security Releases",
+ "bucket": "official_sources",
+ "kind": "html-links",
+ "retired_reason": "MediaWiki security page is no longer reachable reliably from the collector path; NVD replacement remains active.",
+ "replacement_sources": [
+ "MediaWiki Announce RSS",
+ "NVD MediaWiki"
+ ],
+ "url": "https://www.mediawiki.org/wiki/Security"
+ },
+ {
+ "system_id": "mediawiki",
+ "display_name": "MediaWiki",
+ "source_name": "NVD MediaWiki",
+ "bucket": "official_sources",
+ "kind": "nvd-search",
+ "retired_reason": "MediaWiki announce RSS plus OSV MediaWiki now replace NVD for lower-latency machine-readable collection.",
+ "replacement_sources": [
+ "MediaWiki Announce RSS",
+ "OSV MediaWiki"
+ ],
+ "url": ""
+ },
+ {
+ "system_id": "moodle",
+ "display_name": "Moodle",
+ "source_name": "Moodle Security News",
+ "bucket": "official_sources",
+ "kind": "html-links",
+ "retired_reason": "Security page is reachable with a browser-style UA, but the current markup only exposes generic \"Discuss this topic\" anchors to the collector; NVD Moodle remains the active replacement source until a richer parser is added.",
+ "replacement_sources": [
+ "NVD Moodle"
+ ],
+ "url": "https://moodle.org/security/"
+ },
+ {
+ "system_id": "moodle",
+ "display_name": "Moodle",
+ "source_name": "NVD Moodle",
+ "bucket": "official_sources",
+ "kind": "nvd-search",
+ "retired_reason": "OSV Moodle replaces NVD for machine-readable collection while official Moodle sources remain for cross-checking.",
+ "replacement_sources": [
+ "OSV Moodle"
+ ],
+ "url": ""
+ },
+ {
+ "system_id": "nestjs",
+ "display_name": "NestJS",
+ "source_name": "GitHub Global Advisories",
+ "bucket": "official_sources",
+ "kind": "ghsa-global",
+ "retired_reason": "Unauthenticated GHSA API requests are rate-limited in daily monitoring; OSV NestJS remains the active replacement source.",
+ "replacement_sources": [
+ "OSV NestJS"
+ ],
+ "url": ""
+ },
+ {
+ "system_id": "nestjs",
+ "display_name": "NestJS",
+ "source_name": "NVD NestJS",
+ "bucket": "ecosystem_sources",
+ "kind": "nvd-search",
+ "retired_reason": "OSV NestJS replaces NVD public search for lower-latency machine-readable collection.",
+ "replacement_sources": [
+ "OSV NestJS"
+ ],
+ "url": ""
+ },
+ {
+ "system_id": "nextjs",
+ "display_name": "Next.js",
+ "source_name": "GitHub Global Advisories",
+ "bucket": "official_sources",
+ "kind": "ghsa-global",
+ "retired_reason": "Unauthenticated GHSA API requests are rate-limited in daily monitoring; GitHub Next.js Advisories and OSV Next.js remain active replacements.",
+ "replacement_sources": [
+ "GitHub Next.js Advisories",
+ "OSV Next.js"
+ ],
+ "url": ""
+ },
+ {
+ "system_id": "nuxt",
+ "display_name": "Nuxt",
+ "source_name": "GitHub Global Advisories",
+ "bucket": "official_sources",
+ "kind": "ghsa-global",
+ "retired_reason": "Unauthenticated GHSA API requests are rate-limited in daily monitoring; Nuxt Security and OSV Nuxt remain active replacements.",
+ "replacement_sources": [
+ "Nuxt Security",
+ "OSV Nuxt"
+ ],
+ "url": ""
+ },
+ {
+ "system_id": "opencart",
+ "display_name": "OpenCart",
+ "source_name": "NVD OpenCart",
+ "bucket": "official_sources",
+ "kind": "nvd-search",
+ "retired_reason": "OSV OpenCart replaces NVD for machine-readable collection while official release source remains active.",
+ "replacement_sources": [
+ "OpenCart Releases",
+ "OSV OpenCart"
+ ],
+ "url": ""
+ },
+ {
+ "system_id": "openmage",
+ "display_name": "OpenMage / Mage-OS",
+ "source_name": "NVD OpenMage",
+ "bucket": "official_sources",
+ "kind": "nvd-search",
+ "retired_reason": "OSV OpenMage replaces NVD for machine-readable composer-aligned collection.",
+ "replacement_sources": [
+ "OpenMage GitHub Advisories",
+ "OSV OpenMage"
+ ],
+ "url": ""
+ },
+ {
+ "system_id": "phpmyadmin",
+ "display_name": "phpMyAdmin",
+ "source_name": "NVD phpMyAdmin",
+ "bucket": "official_sources",
+ "kind": "nvd-search",
+ "retired_reason": "OSV phpMyAdmin replaces NVD for machine-readable collection while the official security page remains active.",
+ "replacement_sources": [
+ "phpMyAdmin Security Page",
+ "OSV phpMyAdmin"
+ ],
+ "url": ""
+ },
+ {
+ "system_id": "prestashop",
+ "display_name": "PrestaShop",
+ "source_name": "NVD PrestaShop",
+ "bucket": "official_sources",
+ "kind": "nvd-search",
+ "retired_reason": "OSV PrestaShop replaces NVD for machine-readable collection while official and ecosystem advisories remain active.",
+ "replacement_sources": [
+ "PrestaShop Security Page",
+ "GitHub PrestaShop Advisories",
+ "OSV PrestaShop"
+ ],
+ "url": ""
+ },
+ {
+ "system_id": "rails",
+ "display_name": "Ruby on Rails",
+ "source_name": "GitHub Global Advisories",
+ "bucket": "official_sources",
+ "kind": "ghsa-global",
+ "retired_reason": "Unauthenticated GitHub advisory API is quota-limited; OSV Rails remains the active machine-readable source.",
+ "replacement_sources": [
+ "OSV Rails"
+ ],
+ "url": ""
+ },
+ {
+ "system_id": "rails",
+ "display_name": "Ruby on Rails",
+ "source_name": "NVD Ruby on Rails",
+ "bucket": "ecosystem_sources",
+ "kind": "nvd-search",
+ "retired_reason": "OSV Rails replaces NVD public search for lower-latency machine-readable collection.",
+ "replacement_sources": [
+ "OSV Rails"
+ ],
+ "url": ""
+ },
+ {
+ "system_id": "react",
+ "display_name": "React",
+ "source_name": "GitHub Global Advisories",
+ "bucket": "official_sources",
+ "kind": "ghsa-global",
+ "retired_reason": "Unauthenticated GHSA API requests are rate-limited in daily monitoring; GitHub React Advisories and OSV React remain active replacements.",
+ "replacement_sources": [
+ "GitHub React Advisories",
+ "OSV React"
+ ],
+ "url": ""
+ },
+ {
+ "system_id": "redmine",
+ "display_name": "Redmine",
+ "source_name": "NVD Redmine",
+ "bucket": "official_sources",
+ "kind": "nvd-search",
+ "retired_reason": "Official Redmine advisories page remains active and NVD public search is retired to reduce cold-start latency.",
+ "replacement_sources": [
+ "Redmine Security Advisories"
+ ],
+ "url": ""
+ },
+ {
+ "system_id": "saleor",
+ "display_name": "Saleor",
+ "source_name": "NVD Saleor",
+ "bucket": "official_sources",
+ "kind": "nvd-search",
+ "retired_reason": "OSV Saleor replaces NVD for machine-readable collection and aligns with the published PyPI package.",
+ "replacement_sources": [
+ "GitHub Saleor Advisories",
+ "OSV Saleor"
+ ],
+ "url": ""
+ },
+ {
+ "system_id": "shopware",
+ "display_name": "Shopware",
+ "source_name": "NVD Shopware",
+ "bucket": "official_sources",
+ "kind": "nvd-search",
+ "retired_reason": "OSV Shopware replaces NVD for machine-readable collection with lower cold-start overhead.",
+ "replacement_sources": [
+ "Shopware Security Advisories",
+ "OSV Shopware"
+ ],
+ "url": ""
+ },
+ {
+ "system_id": "spring-boot",
+ "display_name": "Spring Boot",
+ "source_name": "GitHub Global Advisories",
+ "bucket": "official_sources",
+ "kind": "ghsa-global",
+ "retired_reason": "Unauthenticated GitHub advisory API is quota-limited; Spring official page and OSV remain the active replacements.",
+ "replacement_sources": [
+ "Spring Security Advisories",
+ "OSV Spring Boot"
+ ],
+ "url": ""
+ },
+ {
+ "system_id": "spring-framework",
+ "display_name": "Spring Framework",
+ "source_name": "GitHub Global Advisories",
+ "bucket": "official_sources",
+ "kind": "ghsa-global",
+ "retired_reason": "Unauthenticated GHSA API requests are rate-limited in daily monitoring; Spring official page and OSV remain the active replacements.",
+ "replacement_sources": [
+ "Spring Security Advisories",
+ "OSV Spring Framework"
+ ],
+ "url": ""
+ },
+ {
+ "system_id": "spring-security",
+ "display_name": "Spring Security",
+ "source_name": "GitHub Global Advisories",
+ "bucket": "official_sources",
+ "kind": "ghsa-global",
+ "retired_reason": "Unauthenticated GitHub advisory API is quota-limited; Spring official page and OSV remain the active replacements.",
+ "replacement_sources": [
+ "Spring Security Advisories",
+ "OSV Spring Security"
+ ],
+ "url": ""
+ },
+ {
+ "system_id": "sveltekit",
+ "display_name": "SvelteKit",
+ "source_name": "GitHub Global Advisories",
+ "bucket": "official_sources",
+ "kind": "ghsa-global",
+ "retired_reason": "Unauthenticated GHSA API requests are rate-limited in daily monitoring; OSV SvelteKit remains the active replacement source.",
+ "replacement_sources": [
+ "OSV SvelteKit"
+ ],
+ "url": ""
+ },
+ {
+ "system_id": "symfony",
+ "display_name": "Symfony",
+ "source_name": "GitHub Global Advisories",
+ "bucket": "official_sources",
+ "kind": "ghsa-global",
+ "retired_reason": "Unauthenticated GitHub advisory API is quota-limited; OSV Symfony remains the active machine-readable source.",
+ "replacement_sources": [
+ "OSV Symfony"
+ ],
+ "url": ""
+ },
+ {
+ "system_id": "undici",
+ "display_name": "Undici",
+ "source_name": "GitHub Global Advisories",
+ "bucket": "official_sources",
+ "kind": "ghsa-global",
+ "retired_reason": "Unauthenticated GHSA API requests are rate-limited in daily monitoring; OSV Undici remains the active replacement source.",
+ "replacement_sources": [
+ "OSV Undici"
+ ],
+ "url": ""
+ },
+ {
+ "system_id": "undici",
+ "display_name": "Undici",
+ "source_name": "NVD Undici",
+ "bucket": "ecosystem_sources",
+ "kind": "nvd-search",
+ "retired_reason": "OSV Undici replaces NVD public search for lower-latency machine-readable collection.",
+ "replacement_sources": [
+ "OSV Undici"
+ ],
+ "url": ""
+ },
+ {
+ "system_id": "vite",
+ "display_name": "Vite",
+ "source_name": "GitHub Global Advisories",
+ "bucket": "official_sources",
+ "kind": "ghsa-global",
+ "retired_reason": "Unauthenticated GHSA API requests are rate-limited in daily monitoring; Vite Security and OSV Vite remain active replacements.",
+ "replacement_sources": [
+ "Vite Security",
+ "OSV Vite"
+ ],
+ "url": ""
+ },
+ {
+ "system_id": "vue",
+ "display_name": "Vue",
+ "source_name": "GitHub Global Advisories",
+ "bucket": "official_sources",
+ "kind": "ghsa-global",
+ "retired_reason": "Unauthenticated GHSA API requests are rate-limited in daily monitoring; Vue Security and OSV Vue remain active replacements.",
+ "replacement_sources": [
+ "Vue Security",
+ "OSV Vue"
+ ],
+ "url": ""
+ },
+ {
+ "system_id": "webpack",
+ "display_name": "webpack",
+ "source_name": "GitHub Global Advisories",
+ "bucket": "official_sources",
+ "kind": "ghsa-global",
+ "retired_reason": "Unauthenticated GHSA API requests are rate-limited in daily monitoring; OSV webpack remains the active replacement source.",
+ "replacement_sources": [
+ "OSV webpack"
+ ],
+ "url": ""
+ },
+ {
+ "system_id": "webpack",
+ "display_name": "webpack",
+ "source_name": "NVD webpack",
+ "bucket": "ecosystem_sources",
+ "kind": "nvd-search",
+ "retired_reason": "OSV webpack replaces NVD public search for lower-latency machine-readable collection.",
+ "replacement_sources": [
+ "OSV webpack"
+ ],
+ "url": ""
+ },
+ {
+ "system_id": "werkzeug",
+ "display_name": "Werkzeug",
+ "source_name": "GitHub Global Advisories",
+ "bucket": "official_sources",
+ "kind": "ghsa-global",
+ "retired_reason": "Unauthenticated GitHub advisory API is quota-limited; OSV Werkzeug remains the active machine-readable source.",
+ "replacement_sources": [
+ "OSV Werkzeug"
+ ],
+ "url": ""
+ },
+ {
+ "system_id": "woocommerce",
+ "display_name": "WooCommerce",
+ "source_name": "NVD WooCommerce",
+ "bucket": "official_sources",
+ "kind": "nvd-search",
+ "retired_reason": "OSV WooCommerce replaces NVD for machine-readable collection while official and ecosystem advisory pages remain active.",
+ "replacement_sources": [
+ "Woo Developer Advisories",
+ "GitHub WooCommerce Advisories",
+ "OSV WooCommerce"
+ ],
+ "url": ""
+ },
+ {
+ "system_id": "wordpress",
+ "display_name": "WordPress",
+ "source_name": "NVD WordPress",
+ "bucket": "official_sources",
+ "kind": "nvd-search",
+ "retired_reason": "WordPress official RSS plus ecosystem plugin intelligence cover active collection with lower cold-start latency and lower public-search dependence than NVD.",
+ "replacement_sources": [
+ "WordPress Security News RSS",
+ "Wordfence Vulnerability Database",
+ "WPScan Vulnerability Database"
+ ],
+ "url": ""
+ }
+ ],
+ "replacement_map": [
+ {
+ "system_id": "adobe-commerce",
+ "retired_source": "Adobe Security Bulletins",
+ "replacement_sources": [
+ "Adobe Magento Security Index",
+ "NVD Adobe Commerce",
+ "GHSA Adobe Commerce"
+ ]
+ },
+ {
+ "system_id": "adobe-commerce",
+ "retired_source": "GHSA Adobe Commerce",
+ "replacement_sources": [
+ "Adobe Magento Security Index",
+ "NVD Adobe Commerce"
+ ]
+ },
+ {
+ "system_id": "adobe-commerce",
+ "retired_source": "Sansec Research",
+ "replacement_sources": [
+ "GHSA Adobe Commerce",
+ "Adobe Magento Security Index"
+ ]
+ },
+ {
+ "system_id": "angular",
+ "retired_source": "GitHub Global Advisories",
+ "replacement_sources": [
+ "OSV Angular"
+ ]
+ },
+ {
+ "system_id": "astro",
+ "retired_source": "GitHub Global Advisories",
+ "replacement_sources": [
+ "OSV Astro"
+ ]
+ },
+ {
+ "system_id": "discourse",
+ "retired_source": "Discourse Meta Security",
+ "replacement_sources": [
+ "Discourse Release Notes RSS",
+ "GitHub Discourse Advisories"
+ ]
+ },
+ {
+ "system_id": "discourse",
+ "retired_source": "GitHub Discourse Advisories",
+ "replacement_sources": [
+ "Discourse Release Notes RSS",
+ "Discourse Security RSS"
+ ]
+ },
+ {
+ "system_id": "django",
+ "retired_source": "Django Security RSS",
+ "replacement_sources": [
+ "Django Security Weblog",
+ "Django Security Releases Archive"
+ ]
+ },
+ {
+ "system_id": "drupal",
+ "retired_source": "NVD Drupal",
+ "replacement_sources": [
+ "Drupal Security Advisories RSS",
+ "OSV Drupal"
+ ]
+ },
+ {
+ "system_id": "esbuild",
+ "retired_source": "GitHub Global Advisories",
+ "replacement_sources": [
+ "OSV esbuild"
+ ]
+ },
+ {
+ "system_id": "esbuild",
+ "retired_source": "NVD esbuild",
+ "replacement_sources": [
+ "OSV esbuild"
+ ]
+ },
+ {
+ "system_id": "express",
+ "retired_source": "GitHub Global Advisories",
+ "replacement_sources": [
+ "OSV Express"
+ ]
+ },
+ {
+ "system_id": "express",
+ "retired_source": "NVD Express.js",
+ "replacement_sources": [
+ "OSV Express"
+ ]
+ },
+ {
+ "system_id": "fastify",
+ "retired_source": "GitHub Global Advisories",
+ "replacement_sources": [
+ "OSV Fastify"
+ ]
+ },
+ {
+ "system_id": "flask",
+ "retired_source": "GitHub Global Advisories",
+ "replacement_sources": [
+ "OSV Flask"
+ ]
+ },
+ {
+ "system_id": "ghost",
+ "retired_source": "NVD Ghost",
+ "replacement_sources": [
+ "Ghost GitHub Advisories",
+ "OSV Ghost"
+ ]
+ },
+ {
+ "system_id": "hapi",
+ "retired_source": "GitHub Global Advisories",
+ "replacement_sources": [
+ "OSV Hapi"
+ ]
+ },
+ {
+ "system_id": "haproxy",
+ "retired_source": "HAProxy Security Advisories",
+ "replacement_sources": [
+ "HAProxy Blog Feed"
+ ]
+ },
+ {
+ "system_id": "joomla",
+ "retired_source": "NVD Joomla",
+ "replacement_sources": [
+ "Joomla Security Centre",
+ "OSV Joomla"
+ ]
+ },
+ {
+ "system_id": "koa",
+ "retired_source": "GitHub Global Advisories",
+ "replacement_sources": [
+ "OSV Koa"
+ ]
+ },
+ {
+ "system_id": "laravel",
+ "retired_source": "GitHub Global Advisories",
+ "replacement_sources": [
+ "OSV Laravel"
+ ]
+ },
+ {
+ "system_id": "mattermost",
+ "retired_source": "Mattermost Security Updates",
+ "replacement_sources": [
+ "NVD Mattermost"
+ ]
+ },
+ {
+ "system_id": "mattermost",
+ "retired_source": "NVD Mattermost",
+ "replacement_sources": [
+ "Mattermost Security Updates JSON",
+ "OSV Mattermost"
+ ]
+ },
+ {
+ "system_id": "mediawiki",
+ "retired_source": "MediaWiki Security Releases",
+ "replacement_sources": [
+ "MediaWiki Announce RSS",
+ "NVD MediaWiki"
+ ]
+ },
+ {
+ "system_id": "mediawiki",
+ "retired_source": "NVD MediaWiki",
+ "replacement_sources": [
+ "MediaWiki Announce RSS",
+ "OSV MediaWiki"
+ ]
+ },
+ {
+ "system_id": "moodle",
+ "retired_source": "Moodle Security News",
+ "replacement_sources": [
+ "NVD Moodle"
+ ]
+ },
+ {
+ "system_id": "moodle",
+ "retired_source": "NVD Moodle",
+ "replacement_sources": [
+ "OSV Moodle"
+ ]
+ },
+ {
+ "system_id": "nestjs",
+ "retired_source": "GitHub Global Advisories",
+ "replacement_sources": [
+ "OSV NestJS"
+ ]
+ },
+ {
+ "system_id": "nestjs",
+ "retired_source": "NVD NestJS",
+ "replacement_sources": [
+ "OSV NestJS"
+ ]
+ },
+ {
+ "system_id": "nextjs",
+ "retired_source": "GitHub Global Advisories",
+ "replacement_sources": [
+ "GitHub Next.js Advisories",
+ "OSV Next.js"
+ ]
+ },
+ {
+ "system_id": "nuxt",
+ "retired_source": "GitHub Global Advisories",
+ "replacement_sources": [
+ "Nuxt Security",
+ "OSV Nuxt"
+ ]
+ },
+ {
+ "system_id": "opencart",
+ "retired_source": "NVD OpenCart",
+ "replacement_sources": [
+ "OpenCart Releases",
+ "OSV OpenCart"
+ ]
+ },
+ {
+ "system_id": "openmage",
+ "retired_source": "NVD OpenMage",
+ "replacement_sources": [
+ "OpenMage GitHub Advisories",
+ "OSV OpenMage"
+ ]
+ },
+ {
+ "system_id": "phpmyadmin",
+ "retired_source": "NVD phpMyAdmin",
+ "replacement_sources": [
+ "phpMyAdmin Security Page",
+ "OSV phpMyAdmin"
+ ]
+ },
+ {
+ "system_id": "prestashop",
+ "retired_source": "NVD PrestaShop",
+ "replacement_sources": [
+ "PrestaShop Security Page",
+ "GitHub PrestaShop Advisories",
+ "OSV PrestaShop"
+ ]
+ },
+ {
+ "system_id": "rails",
+ "retired_source": "GitHub Global Advisories",
+ "replacement_sources": [
+ "OSV Rails"
+ ]
+ },
+ {
+ "system_id": "rails",
+ "retired_source": "NVD Ruby on Rails",
+ "replacement_sources": [
+ "OSV Rails"
+ ]
+ },
+ {
+ "system_id": "react",
+ "retired_source": "GitHub Global Advisories",
+ "replacement_sources": [
+ "GitHub React Advisories",
+ "OSV React"
+ ]
+ },
+ {
+ "system_id": "redmine",
+ "retired_source": "NVD Redmine",
+ "replacement_sources": [
+ "Redmine Security Advisories"
+ ]
+ },
+ {
+ "system_id": "saleor",
+ "retired_source": "NVD Saleor",
+ "replacement_sources": [
+ "GitHub Saleor Advisories",
+ "OSV Saleor"
+ ]
+ },
+ {
+ "system_id": "shopware",
+ "retired_source": "NVD Shopware",
+ "replacement_sources": [
+ "Shopware Security Advisories",
+ "OSV Shopware"
+ ]
+ },
+ {
+ "system_id": "spring-boot",
+ "retired_source": "GitHub Global Advisories",
+ "replacement_sources": [
+ "Spring Security Advisories",
+ "OSV Spring Boot"
+ ]
+ },
+ {
+ "system_id": "spring-framework",
+ "retired_source": "GitHub Global Advisories",
+ "replacement_sources": [
+ "Spring Security Advisories",
+ "OSV Spring Framework"
+ ]
+ },
+ {
+ "system_id": "spring-security",
+ "retired_source": "GitHub Global Advisories",
+ "replacement_sources": [
+ "Spring Security Advisories",
+ "OSV Spring Security"
+ ]
+ },
+ {
+ "system_id": "sveltekit",
+ "retired_source": "GitHub Global Advisories",
+ "replacement_sources": [
+ "OSV SvelteKit"
+ ]
+ },
+ {
+ "system_id": "symfony",
+ "retired_source": "GitHub Global Advisories",
+ "replacement_sources": [
+ "OSV Symfony"
+ ]
+ },
+ {
+ "system_id": "undici",
+ "retired_source": "GitHub Global Advisories",
+ "replacement_sources": [
+ "OSV Undici"
+ ]
+ },
+ {
+ "system_id": "undici",
+ "retired_source": "NVD Undici",
+ "replacement_sources": [
+ "OSV Undici"
+ ]
+ },
+ {
+ "system_id": "vite",
+ "retired_source": "GitHub Global Advisories",
+ "replacement_sources": [
+ "Vite Security",
+ "OSV Vite"
+ ]
+ },
+ {
+ "system_id": "vue",
+ "retired_source": "GitHub Global Advisories",
+ "replacement_sources": [
+ "Vue Security",
+ "OSV Vue"
+ ]
+ },
+ {
+ "system_id": "webpack",
+ "retired_source": "GitHub Global Advisories",
+ "replacement_sources": [
+ "OSV webpack"
+ ]
+ },
+ {
+ "system_id": "webpack",
+ "retired_source": "NVD webpack",
+ "replacement_sources": [
+ "OSV webpack"
+ ]
+ },
+ {
+ "system_id": "werkzeug",
+ "retired_source": "GitHub Global Advisories",
+ "replacement_sources": [
+ "OSV Werkzeug"
+ ]
+ },
+ {
+ "system_id": "woocommerce",
+ "retired_source": "NVD WooCommerce",
+ "replacement_sources": [
+ "Woo Developer Advisories",
+ "GitHub WooCommerce Advisories",
+ "OSV WooCommerce"
+ ]
+ },
+ {
+ "system_id": "wordpress",
+ "retired_source": "NVD WordPress",
+ "replacement_sources": [
+ "WordPress Security News RSS",
+ "Wordfence Vulnerability Database",
+ "WPScan Vulnerability Database"
+ ]
+ }
+ ]
+ },
+ "source_health": {
+ "generated_at": "2026-03-19T02:27:12+00:00",
+ "active_source_count": 118,
+ "green_source_count": 118,
+ "failure_count": 0,
+ "all_green": true,
+ "last_fully_green_run": "2026-03-19T02:27:12+00:00",
+ "retries_performed": 0,
+ "probes": [
+ {
+ "system_id": "adminer",
+ "source_name": "NVD Adminer",
+ "source_kind": "nvd-search",
+ "elapsed_seconds": 20.95,
+ "kind": "nvd-search",
+ "items_seen": 1
+ },
+ {
+ "system_id": "adobe-commerce",
+ "source_name": "Adobe Magento Security Index",
+ "source_kind": "vendor-index",
+ "elapsed_seconds": 3.401,
+ "kind": "vendor-index",
+ "items_seen": 46
+ },
+ {
+ "system_id": "adobe-commerce",
+ "source_name": "NVD Adobe Commerce",
+ "source_kind": "nvd-search",
+ "elapsed_seconds": 3.401,
+ "kind": "nvd-search",
+ "items_seen": 1
+ },
+ {
+ "system_id": "angular",
+ "source_name": "OSV Angular",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 17.777,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "apache-httpd",
+ "source_name": "Apache HTTPD Security",
+ "source_kind": "html-links",
+ "elapsed_seconds": 21.12,
+ "kind": "html-links",
+ "items_seen": 182
+ },
+ {
+ "system_id": "apache-httpd",
+ "source_name": "CISA KEV Apache HTTPD",
+ "source_kind": "kev-json",
+ "elapsed_seconds": 21.827,
+ "kind": "kev-json",
+ "items_seen": 1545
+ },
+ {
+ "system_id": "apache-httpd",
+ "source_name": "NVD Apache HTTP Server",
+ "source_kind": "nvd-search",
+ "elapsed_seconds": 20.771,
+ "kind": "nvd-search",
+ "items_seen": 1
+ },
+ {
+ "system_id": "apache-tomcat",
+ "source_name": "Apache Tomcat Security",
+ "source_kind": "html-links",
+ "elapsed_seconds": 21.41,
+ "kind": "html-links",
+ "items_seen": 270
+ },
+ {
+ "system_id": "apache-tomcat",
+ "source_name": "CISA KEV Tomcat",
+ "source_kind": "kev-json",
+ "elapsed_seconds": 21.558,
+ "kind": "kev-json",
+ "items_seen": 1545
+ },
+ {
+ "system_id": "apache-tomcat",
+ "source_name": "NVD Tomcat",
+ "source_kind": "nvd-search",
+ "elapsed_seconds": 20.786,
+ "kind": "nvd-search",
+ "items_seen": 1
+ },
+ {
+ "system_id": "aspnet-core",
+ "source_name": "NVD ASP.NET Core",
+ "source_kind": "nvd-search",
+ "elapsed_seconds": 20.279,
+ "kind": "nvd-search",
+ "items_seen": 1
+ },
+ {
+ "system_id": "astro",
+ "source_name": "OSV Astro",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 18.112,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "caddy",
+ "source_name": "GitHub Caddy Advisories",
+ "source_kind": "html-links",
+ "elapsed_seconds": 21.7,
+ "kind": "html-links",
+ "items_seen": 114
+ },
+ {
+ "system_id": "caddy",
+ "source_name": "OSV Caddy",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 21.687,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "directus",
+ "source_name": "Directus GitHub Advisories",
+ "source_kind": "html-links",
+ "elapsed_seconds": 6.119,
+ "kind": "html-links",
+ "items_seen": 127
+ },
+ {
+ "system_id": "directus",
+ "source_name": "OSV Directus",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 11.083,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "discourse",
+ "source_name": "Discourse Release Notes RSS",
+ "source_kind": "rss-feed",
+ "elapsed_seconds": 6.552,
+ "kind": "rss-feed",
+ "items_seen": 30
+ },
+ {
+ "system_id": "discourse",
+ "source_name": "Discourse Security RSS",
+ "source_kind": "rss-feed",
+ "elapsed_seconds": 6.112,
+ "kind": "rss-feed",
+ "items_seen": 3
+ },
+ {
+ "system_id": "discourse",
+ "source_name": "OSV Discourse",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 10.976,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "django",
+ "source_name": "Django Security Releases Archive",
+ "source_kind": "vendor-index",
+ "elapsed_seconds": 20.942,
+ "kind": "vendor-index",
+ "items_seen": 1276
+ },
+ {
+ "system_id": "django",
+ "source_name": "Django Security Weblog",
+ "source_kind": "vendor-index",
+ "elapsed_seconds": 20.949,
+ "kind": "vendor-index",
+ "items_seen": 332
+ },
+ {
+ "system_id": "django",
+ "source_name": "OSV Django",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 21.933,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "drupal",
+ "source_name": "Drupal Security Advisories RSS",
+ "source_kind": "rss-feed",
+ "elapsed_seconds": 14.472,
+ "kind": "rss-feed",
+ "items_seen": 20
+ },
+ {
+ "system_id": "drupal",
+ "source_name": "OSV Drupal",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 12.058,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "echo",
+ "source_name": "OSV Echo",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 21.163,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "esbuild",
+ "source_name": "OSV esbuild",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 20.783,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "express",
+ "source_name": "OSV Express",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 17.589,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "fastify",
+ "source_name": "OSV Fastify",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 20.645,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "flask",
+ "source_name": "OSV Flask",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 20.91,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "ghost",
+ "source_name": "Ghost GitHub Advisories",
+ "source_kind": "html-links",
+ "elapsed_seconds": 6.626,
+ "kind": "html-links",
+ "items_seen": 119
+ },
+ {
+ "system_id": "ghost",
+ "source_name": "OSV Ghost",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 11.21,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "gin",
+ "source_name": "OSV Gin",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 21.163,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "gitea",
+ "source_name": "GitHub Gitea Advisories",
+ "source_kind": "html-links",
+ "elapsed_seconds": 21.894,
+ "kind": "html-links",
+ "items_seen": 98
+ },
+ {
+ "system_id": "gitea",
+ "source_name": "OSV Gitea",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 21.89,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "gitlab-ce",
+ "source_name": "GitLab Advisory Database",
+ "source_kind": "html-links",
+ "elapsed_seconds": 22.731,
+ "kind": "html-links",
+ "items_seen": 5
+ },
+ {
+ "system_id": "gitlab-ce",
+ "source_name": "GitLab Security Releases",
+ "source_kind": "html-links",
+ "elapsed_seconds": 21.89,
+ "kind": "html-links",
+ "items_seen": 250
+ },
+ {
+ "system_id": "gitlab-ce",
+ "source_name": "NVD GitLab",
+ "source_kind": "nvd-search",
+ "elapsed_seconds": 21.121,
+ "kind": "nvd-search",
+ "items_seen": 1
+ },
+ {
+ "system_id": "grafana",
+ "source_name": "CISA KEV Grafana",
+ "source_kind": "kev-json",
+ "elapsed_seconds": 22.048,
+ "kind": "kev-json",
+ "items_seen": 1545
+ },
+ {
+ "system_id": "grafana",
+ "source_name": "Grafana Security Advisories",
+ "source_kind": "html-links",
+ "elapsed_seconds": 21.898,
+ "kind": "html-links",
+ "items_seen": 159
+ },
+ {
+ "system_id": "hapi",
+ "source_name": "OSV Hapi",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 20.785,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "haproxy",
+ "source_name": "HAProxy Blog Feed",
+ "source_kind": "rss-feed",
+ "elapsed_seconds": 23.785,
+ "kind": "rss-feed",
+ "items_seen": 10
+ },
+ {
+ "system_id": "haproxy",
+ "source_name": "NVD HAProxy",
+ "source_kind": "nvd-search",
+ "elapsed_seconds": 20.942,
+ "kind": "nvd-search",
+ "items_seen": 1
+ },
+ {
+ "system_id": "jenkins",
+ "source_name": "Jenkins Security Advisories",
+ "source_kind": "html-links",
+ "elapsed_seconds": 21.819,
+ "kind": "html-links",
+ "items_seen": 1194
+ },
+ {
+ "system_id": "jenkins",
+ "source_name": "NVD Jenkins",
+ "source_kind": "nvd-search",
+ "elapsed_seconds": 21.164,
+ "kind": "nvd-search",
+ "items_seen": 1
+ },
+ {
+ "system_id": "joomla",
+ "source_name": "Joomla Security Centre",
+ "source_kind": "html-links",
+ "elapsed_seconds": 15.112,
+ "kind": "html-links",
+ "items_seen": 139
+ },
+ {
+ "system_id": "joomla",
+ "source_name": "OSV Joomla",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 10.892,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "kibana",
+ "source_name": "Elastic Security Announcements",
+ "source_kind": "html-links",
+ "elapsed_seconds": 22.524,
+ "kind": "html-links",
+ "items_seen": 71
+ },
+ {
+ "system_id": "kibana",
+ "source_name": "NVD Kibana",
+ "source_kind": "nvd-search",
+ "elapsed_seconds": 21.561,
+ "kind": "nvd-search",
+ "items_seen": 1
+ },
+ {
+ "system_id": "koa",
+ "source_name": "OSV Koa",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 18.543,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "laravel",
+ "source_name": "OSV Laravel",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 20.95,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "magento-open-source",
+ "source_name": "Magento GitHub Advisories",
+ "source_kind": "html-links",
+ "elapsed_seconds": 6.082,
+ "kind": "html-links",
+ "items_seen": 99
+ },
+ {
+ "system_id": "magento-open-source",
+ "source_name": "NVD Magento",
+ "source_kind": "nvd-search",
+ "elapsed_seconds": 5.985,
+ "kind": "nvd-search",
+ "items_seen": 1
+ },
+ {
+ "system_id": "magento-open-source",
+ "source_name": "Sansec Research",
+ "source_kind": "html-links",
+ "elapsed_seconds": 14.904,
+ "kind": "html-links",
+ "items_seen": 134
+ },
+ {
+ "system_id": "mattermost",
+ "source_name": "Mattermost Security Updates JSON",
+ "source_kind": "json-feed",
+ "elapsed_seconds": 22.362,
+ "kind": "json-feed",
+ "items_seen": 594
+ },
+ {
+ "system_id": "mattermost",
+ "source_name": "OSV Mattermost",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 23.593,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "mediawiki",
+ "source_name": "MediaWiki Announce RSS",
+ "source_kind": "rss-feed",
+ "elapsed_seconds": 12.818,
+ "kind": "rss-feed",
+ "items_seen": 30
+ },
+ {
+ "system_id": "mediawiki",
+ "source_name": "OSV MediaWiki",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 11.096,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "medusa",
+ "source_name": "GitHub Medusa Advisories",
+ "source_kind": "html-links",
+ "elapsed_seconds": 17.699,
+ "kind": "html-links",
+ "items_seen": 102
+ },
+ {
+ "system_id": "medusa",
+ "source_name": "OSV Medusa",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 17.58,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "moodle",
+ "source_name": "OSV Moodle",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 14.494,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "nestjs",
+ "source_name": "OSV NestJS",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 17.777,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "nextjs",
+ "source_name": "GitHub Next.js Advisories",
+ "source_kind": "html-links",
+ "elapsed_seconds": 20.786,
+ "kind": "html-links",
+ "items_seen": 123
+ },
+ {
+ "system_id": "nextjs",
+ "source_name": "OSV Next.js",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 17.861,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "nginx",
+ "source_name": "CISA KEV NGINX",
+ "source_kind": "kev-json",
+ "elapsed_seconds": 21.713,
+ "kind": "kev-json",
+ "items_seen": 1545
+ },
+ {
+ "system_id": "nginx",
+ "source_name": "NGINX Security Advisories",
+ "source_kind": "html-links",
+ "elapsed_seconds": 22.082,
+ "kind": "html-links",
+ "items_seen": 138
+ },
+ {
+ "system_id": "nginx",
+ "source_name": "NVD NGINX",
+ "source_kind": "nvd-search",
+ "elapsed_seconds": 20.649,
+ "kind": "nvd-search",
+ "items_seen": 1
+ },
+ {
+ "system_id": "nodejs",
+ "source_name": "CISA KEV Node.js",
+ "source_kind": "kev-json",
+ "elapsed_seconds": 19.822,
+ "kind": "kev-json",
+ "items_seen": 1545
+ },
+ {
+ "system_id": "nodejs",
+ "source_name": "Node.js Security Releases",
+ "source_kind": "html-links",
+ "elapsed_seconds": 20.769,
+ "kind": "html-links",
+ "items_seen": 74
+ },
+ {
+ "system_id": "nuxt",
+ "source_name": "Nuxt Security",
+ "source_kind": "html-links",
+ "elapsed_seconds": 17.546,
+ "kind": "html-links",
+ "items_seen": 118
+ },
+ {
+ "system_id": "nuxt",
+ "source_name": "OSV Nuxt",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 17.779,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "opencart",
+ "source_name": "OSV OpenCart",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 14.725,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "opencart",
+ "source_name": "OpenCart Releases",
+ "source_kind": "html-links",
+ "elapsed_seconds": 15.89,
+ "kind": "html-links",
+ "items_seen": 1500
+ },
+ {
+ "system_id": "openmage",
+ "source_name": "OSV OpenMage",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 11.087,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "openmage",
+ "source_name": "OpenMage GitHub Advisories",
+ "source_kind": "html-links",
+ "elapsed_seconds": 14.651,
+ "kind": "html-links",
+ "items_seen": 125
+ },
+ {
+ "system_id": "phpmyadmin",
+ "source_name": "OSV phpMyAdmin",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 22.037,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "phpmyadmin",
+ "source_name": "phpMyAdmin Security Page",
+ "source_kind": "html-links",
+ "elapsed_seconds": 21.695,
+ "kind": "html-links",
+ "items_seen": 262
+ },
+ {
+ "system_id": "prestashop",
+ "source_name": "Friends Of Presta Security",
+ "source_kind": "html-links",
+ "elapsed_seconds": 14.625,
+ "kind": "html-links",
+ "items_seen": 38
+ },
+ {
+ "system_id": "prestashop",
+ "source_name": "GitHub PrestaShop Advisories",
+ "source_kind": "html-links",
+ "elapsed_seconds": 14.786,
+ "kind": "html-links",
+ "items_seen": 127
+ },
+ {
+ "system_id": "prestashop",
+ "source_name": "OSV PrestaShop",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 14.611,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "prestashop",
+ "source_name": "PrestaShop Security Page",
+ "source_kind": "html-links",
+ "elapsed_seconds": 14.158,
+ "kind": "html-links",
+ "items_seen": 60
+ },
+ {
+ "system_id": "rails",
+ "source_name": "OSV Rails",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 21.273,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "react",
+ "source_name": "GitHub React Advisories",
+ "source_kind": "html-links",
+ "elapsed_seconds": 17.595,
+ "kind": "html-links",
+ "items_seen": 110
+ },
+ {
+ "system_id": "react",
+ "source_name": "OSV React",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 17.604,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "redmine",
+ "source_name": "OSV Redmine",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 22.53,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "redmine",
+ "source_name": "Redmine Security Advisories",
+ "source_kind": "html-links",
+ "elapsed_seconds": 23.782,
+ "kind": "html-links",
+ "items_seen": 371
+ },
+ {
+ "system_id": "saleor",
+ "source_name": "GitHub Saleor Advisories",
+ "source_kind": "html-links",
+ "elapsed_seconds": 15.06,
+ "kind": "html-links",
+ "items_seen": 120
+ },
+ {
+ "system_id": "saleor",
+ "source_name": "OSV Saleor",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 17.631,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "shopware",
+ "source_name": "OSV Shopware",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 14.856,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "shopware",
+ "source_name": "Shopware Security Advisories",
+ "source_kind": "html-links",
+ "elapsed_seconds": 15.064,
+ "kind": "html-links",
+ "items_seen": 129
+ },
+ {
+ "system_id": "spring-boot",
+ "source_name": "OSV Spring Boot",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 20.771,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "spring-boot",
+ "source_name": "Spring Security Advisories",
+ "source_kind": "html-links",
+ "elapsed_seconds": 20.425,
+ "kind": "html-links",
+ "items_seen": 118
+ },
+ {
+ "system_id": "spring-framework",
+ "source_name": "OSV Spring Framework",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 20.267,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "spring-framework",
+ "source_name": "Spring Security Advisories",
+ "source_kind": "html-links",
+ "elapsed_seconds": 20.79,
+ "kind": "html-links",
+ "items_seen": 118
+ },
+ {
+ "system_id": "spring-security",
+ "source_name": "OSV Spring Security",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 20.31,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "spring-security",
+ "source_name": "Spring Security Advisories",
+ "source_kind": "html-links",
+ "elapsed_seconds": 20.651,
+ "kind": "html-links",
+ "items_seen": 118
+ },
+ {
+ "system_id": "strapi",
+ "source_name": "OSV Strapi",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 11.029,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "strapi",
+ "source_name": "Strapi GitHub Advisories",
+ "source_kind": "html-links",
+ "elapsed_seconds": 5.987,
+ "kind": "html-links",
+ "items_seen": 124
+ },
+ {
+ "system_id": "sveltekit",
+ "source_name": "OSV SvelteKit",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 17.604,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "symfony",
+ "source_name": "OSV Symfony",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 20.844,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "traefik",
+ "source_name": "GitHub Traefik Advisories",
+ "source_kind": "html-links",
+ "elapsed_seconds": 21.716,
+ "kind": "html-links",
+ "items_seen": 124
+ },
+ {
+ "system_id": "traefik",
+ "source_name": "OSV Traefik",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 21.717,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "undici",
+ "source_name": "OSV Undici",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 20.278,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "vite",
+ "source_name": "OSV Vite",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 17.824,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "vite",
+ "source_name": "Vite Security",
+ "source_kind": "html-links",
+ "elapsed_seconds": 18.678,
+ "kind": "html-links",
+ "items_seen": 124
+ },
+ {
+ "system_id": "vue",
+ "source_name": "OSV Vue",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 17.596,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "vue",
+ "source_name": "Vue Security",
+ "source_kind": "html-links",
+ "elapsed_seconds": 17.608,
+ "kind": "html-links",
+ "items_seen": 111
+ },
+ {
+ "system_id": "webpack",
+ "source_name": "OSV webpack",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 20.643,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "werkzeug",
+ "source_name": "OSV Werkzeug",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 21.0,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "woocommerce",
+ "source_name": "GitHub WooCommerce Advisories",
+ "source_kind": "html-links",
+ "elapsed_seconds": 14.511,
+ "kind": "html-links",
+ "items_seen": 107
+ },
+ {
+ "system_id": "woocommerce",
+ "source_name": "OSV WooCommerce",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 10.984,
+ "kind": "osv-batch",
+ "items_seen": 1
+ },
+ {
+ "system_id": "woocommerce",
+ "source_name": "Patchstack Database",
+ "source_kind": "html-links",
+ "elapsed_seconds": 15.775,
+ "kind": "html-links",
+ "items_seen": 193
+ },
+ {
+ "system_id": "woocommerce",
+ "source_name": "Woo Developer Advisories",
+ "source_kind": "html-links",
+ "elapsed_seconds": 14.66,
+ "kind": "html-links",
+ "items_seen": 121
+ },
+ {
+ "system_id": "woocommerce",
+ "source_name": "Wordfence Vulnerability Database",
+ "source_kind": "html-links",
+ "elapsed_seconds": 17.927,
+ "kind": "html-links",
+ "items_seen": 0
+ },
+ {
+ "system_id": "wordpress",
+ "source_name": "Patchstack Database",
+ "source_kind": "html-links",
+ "elapsed_seconds": 2.35,
+ "kind": "html-links",
+ "items_seen": 193
+ },
+ {
+ "system_id": "wordpress",
+ "source_name": "PortSwigger Research",
+ "source_kind": "html-links",
+ "elapsed_seconds": 15.425,
+ "kind": "html-links",
+ "items_seen": 99
+ },
+ {
+ "system_id": "wordpress",
+ "source_name": "WPScan Vulnerability Database",
+ "source_kind": "html-links",
+ "elapsed_seconds": 10.855,
+ "kind": "html-links",
+ "items_seen": 74
+ },
+ {
+ "system_id": "wordpress",
+ "source_name": "WordPress Security News RSS",
+ "source_kind": "rss-feed",
+ "elapsed_seconds": 1.559,
+ "kind": "rss-feed",
+ "items_seen": 10
+ },
+ {
+ "system_id": "wordpress",
+ "source_name": "Wordfence Vulnerability Database",
+ "source_kind": "html-links",
+ "elapsed_seconds": 17.336,
+ "kind": "html-links",
+ "items_seen": 0
+ }
+ ],
+ "failures": [],
+ "slow_sources": [
+ {
+ "system_id": "haproxy",
+ "source_name": "HAProxy Blog Feed",
+ "source_kind": "rss-feed",
+ "elapsed_seconds": 23.785,
+ "status": "ok"
+ },
+ {
+ "system_id": "redmine",
+ "source_name": "Redmine Security Advisories",
+ "source_kind": "html-links",
+ "elapsed_seconds": 23.782,
+ "status": "ok"
+ },
+ {
+ "system_id": "mattermost",
+ "source_name": "OSV Mattermost",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 23.593,
+ "status": "ok"
+ },
+ {
+ "system_id": "gitlab-ce",
+ "source_name": "GitLab Advisory Database",
+ "source_kind": "html-links",
+ "elapsed_seconds": 22.731,
+ "status": "ok"
+ },
+ {
+ "system_id": "redmine",
+ "source_name": "OSV Redmine",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 22.53,
+ "status": "ok"
+ },
+ {
+ "system_id": "kibana",
+ "source_name": "Elastic Security Announcements",
+ "source_kind": "html-links",
+ "elapsed_seconds": 22.524,
+ "status": "ok"
+ },
+ {
+ "system_id": "mattermost",
+ "source_name": "Mattermost Security Updates JSON",
+ "source_kind": "json-feed",
+ "elapsed_seconds": 22.362,
+ "status": "ok"
+ },
+ {
+ "system_id": "nginx",
+ "source_name": "NGINX Security Advisories",
+ "source_kind": "html-links",
+ "elapsed_seconds": 22.082,
+ "status": "ok"
+ },
+ {
+ "system_id": "grafana",
+ "source_name": "CISA KEV Grafana",
+ "source_kind": "kev-json",
+ "elapsed_seconds": 22.048,
+ "status": "ok"
+ },
+ {
+ "system_id": "phpmyadmin",
+ "source_name": "OSV phpMyAdmin",
+ "source_kind": "osv-batch",
+ "elapsed_seconds": 22.037,
+ "status": "ok"
+ }
+ ],
+ "systems": [
+ {
+ "system_id": "adminer",
+ "display_name": "Adminer",
+ "active_source_total": 1,
+ "green_source_total": 1,
+ "failure_count": 0
+ },
+ {
+ "system_id": "adobe-commerce",
+ "display_name": "Adobe Commerce",
+ "active_source_total": 2,
+ "green_source_total": 2,
+ "failure_count": 0
+ },
+ {
+ "system_id": "angular",
+ "display_name": "Angular",
+ "active_source_total": 1,
+ "green_source_total": 1,
+ "failure_count": 0
+ },
+ {
+ "system_id": "apache-httpd",
+ "display_name": "Apache HTTP Server",
+ "active_source_total": 3,
+ "green_source_total": 3,
+ "failure_count": 0
+ },
+ {
+ "system_id": "apache-tomcat",
+ "display_name": "Apache Tomcat",
+ "active_source_total": 3,
+ "green_source_total": 3,
+ "failure_count": 0
+ },
+ {
+ "system_id": "aspnet-core",
+ "display_name": "ASP.NET Core",
+ "active_source_total": 1,
+ "green_source_total": 1,
+ "failure_count": 0
+ },
+ {
+ "system_id": "astro",
+ "display_name": "Astro",
+ "active_source_total": 1,
+ "green_source_total": 1,
+ "failure_count": 0
+ },
+ {
+ "system_id": "caddy",
+ "display_name": "Caddy",
+ "active_source_total": 2,
+ "green_source_total": 2,
+ "failure_count": 0
+ },
+ {
+ "system_id": "directus",
+ "display_name": "Directus",
+ "active_source_total": 2,
+ "green_source_total": 2,
+ "failure_count": 0
+ },
+ {
+ "system_id": "discourse",
+ "display_name": "Discourse",
+ "active_source_total": 3,
+ "green_source_total": 3,
+ "failure_count": 0
+ },
+ {
+ "system_id": "django",
+ "display_name": "Django",
+ "active_source_total": 3,
+ "green_source_total": 3,
+ "failure_count": 0
+ },
+ {
+ "system_id": "drupal",
+ "display_name": "Drupal",
+ "active_source_total": 2,
+ "green_source_total": 2,
+ "failure_count": 0
+ },
+ {
+ "system_id": "echo",
+ "display_name": "Echo",
+ "active_source_total": 1,
+ "green_source_total": 1,
+ "failure_count": 0
+ },
+ {
+ "system_id": "esbuild",
+ "display_name": "esbuild",
+ "active_source_total": 1,
+ "green_source_total": 1,
+ "failure_count": 0
+ },
+ {
+ "system_id": "express",
+ "display_name": "Express",
+ "active_source_total": 1,
+ "green_source_total": 1,
+ "failure_count": 0
+ },
+ {
+ "system_id": "fastify",
+ "display_name": "Fastify",
+ "active_source_total": 1,
+ "green_source_total": 1,
+ "failure_count": 0
+ },
+ {
+ "system_id": "flask",
+ "display_name": "Flask",
+ "active_source_total": 1,
+ "green_source_total": 1,
+ "failure_count": 0
+ },
+ {
+ "system_id": "ghost",
+ "display_name": "Ghost",
+ "active_source_total": 2,
+ "green_source_total": 2,
+ "failure_count": 0
+ },
+ {
+ "system_id": "gin",
+ "display_name": "Gin",
+ "active_source_total": 1,
+ "green_source_total": 1,
+ "failure_count": 0
+ },
+ {
+ "system_id": "gitea",
+ "display_name": "Gitea",
+ "active_source_total": 2,
+ "green_source_total": 2,
+ "failure_count": 0
+ },
+ {
+ "system_id": "gitlab-ce",
+ "display_name": "GitLab CE",
+ "active_source_total": 3,
+ "green_source_total": 3,
+ "failure_count": 0
+ },
+ {
+ "system_id": "grafana",
+ "display_name": "Grafana",
+ "active_source_total": 2,
+ "green_source_total": 2,
+ "failure_count": 0
+ },
+ {
+ "system_id": "hapi",
+ "display_name": "Hapi",
+ "active_source_total": 1,
+ "green_source_total": 1,
+ "failure_count": 0
+ },
+ {
+ "system_id": "haproxy",
+ "display_name": "HAProxy",
+ "active_source_total": 2,
+ "green_source_total": 2,
+ "failure_count": 0
+ },
+ {
+ "system_id": "jenkins",
+ "display_name": "Jenkins",
+ "active_source_total": 2,
+ "green_source_total": 2,
+ "failure_count": 0
+ },
+ {
+ "system_id": "joomla",
+ "display_name": "Joomla",
+ "active_source_total": 2,
+ "green_source_total": 2,
+ "failure_count": 0
+ },
+ {
+ "system_id": "kibana",
+ "display_name": "Kibana",
+ "active_source_total": 2,
+ "green_source_total": 2,
+ "failure_count": 0
+ },
+ {
+ "system_id": "koa",
+ "display_name": "Koa",
+ "active_source_total": 1,
+ "green_source_total": 1,
+ "failure_count": 0
+ },
+ {
+ "system_id": "laravel",
+ "display_name": "Laravel",
+ "active_source_total": 1,
+ "green_source_total": 1,
+ "failure_count": 0
+ },
+ {
+ "system_id": "magento-open-source",
+ "display_name": "Magento Open Source",
+ "active_source_total": 3,
+ "green_source_total": 3,
+ "failure_count": 0
+ },
+ {
+ "system_id": "mattermost",
+ "display_name": "Mattermost",
+ "active_source_total": 2,
+ "green_source_total": 2,
+ "failure_count": 0
+ },
+ {
+ "system_id": "mediawiki",
+ "display_name": "MediaWiki",
+ "active_source_total": 2,
+ "green_source_total": 2,
+ "failure_count": 0
+ },
+ {
+ "system_id": "medusa",
+ "display_name": "Medusa",
+ "active_source_total": 2,
+ "green_source_total": 2,
+ "failure_count": 0
+ },
+ {
+ "system_id": "moodle",
+ "display_name": "Moodle",
+ "active_source_total": 1,
+ "green_source_total": 1,
+ "failure_count": 0
+ },
+ {
+ "system_id": "nestjs",
+ "display_name": "NestJS",
+ "active_source_total": 1,
+ "green_source_total": 1,
+ "failure_count": 0
+ },
+ {
+ "system_id": "nextjs",
+ "display_name": "Next.js",
+ "active_source_total": 2,
+ "green_source_total": 2,
+ "failure_count": 0
+ },
+ {
+ "system_id": "nginx",
+ "display_name": "Nginx",
+ "active_source_total": 3,
+ "green_source_total": 3,
+ "failure_count": 0
+ },
+ {
+ "system_id": "nodejs",
+ "display_name": "Node.js",
+ "active_source_total": 2,
+ "green_source_total": 2,
+ "failure_count": 0
+ },
+ {
+ "system_id": "nuxt",
+ "display_name": "Nuxt",
+ "active_source_total": 2,
+ "green_source_total": 2,
+ "failure_count": 0
+ },
+ {
+ "system_id": "opencart",
+ "display_name": "OpenCart",
+ "active_source_total": 2,
+ "green_source_total": 2,
+ "failure_count": 0
+ },
+ {
+ "system_id": "openmage",
+ "display_name": "OpenMage / Mage-OS",
+ "active_source_total": 2,
+ "green_source_total": 2,
+ "failure_count": 0
+ },
+ {
+ "system_id": "phpmyadmin",
+ "display_name": "phpMyAdmin",
+ "active_source_total": 2,
+ "green_source_total": 2,
+ "failure_count": 0
+ },
+ {
+ "system_id": "prestashop",
+ "display_name": "PrestaShop",
+ "active_source_total": 4,
+ "green_source_total": 4,
+ "failure_count": 0
+ },
+ {
+ "system_id": "rails",
+ "display_name": "Ruby on Rails",
+ "active_source_total": 1,
+ "green_source_total": 1,
+ "failure_count": 0
+ },
+ {
+ "system_id": "react",
+ "display_name": "React",
+ "active_source_total": 2,
+ "green_source_total": 2,
+ "failure_count": 0
+ },
+ {
+ "system_id": "redmine",
+ "display_name": "Redmine",
+ "active_source_total": 2,
+ "green_source_total": 2,
+ "failure_count": 0
+ },
+ {
+ "system_id": "saleor",
+ "display_name": "Saleor",
+ "active_source_total": 2,
+ "green_source_total": 2,
+ "failure_count": 0
+ },
+ {
+ "system_id": "shopware",
+ "display_name": "Shopware",
+ "active_source_total": 2,
+ "green_source_total": 2,
+ "failure_count": 0
+ },
+ {
+ "system_id": "spring-boot",
+ "display_name": "Spring Boot",
+ "active_source_total": 2,
+ "green_source_total": 2,
+ "failure_count": 0
+ },
+ {
+ "system_id": "spring-framework",
+ "display_name": "Spring Framework",
+ "active_source_total": 2,
+ "green_source_total": 2,
+ "failure_count": 0
+ },
+ {
+ "system_id": "spring-security",
+ "display_name": "Spring Security",
+ "active_source_total": 2,
+ "green_source_total": 2,
+ "failure_count": 0
+ },
+ {
+ "system_id": "strapi",
+ "display_name": "Strapi",
+ "active_source_total": 2,
+ "green_source_total": 2,
+ "failure_count": 0
+ },
+ {
+ "system_id": "sveltekit",
+ "display_name": "SvelteKit",
+ "active_source_total": 1,
+ "green_source_total": 1,
+ "failure_count": 0
+ },
+ {
+ "system_id": "symfony",
+ "display_name": "Symfony",
+ "active_source_total": 1,
+ "green_source_total": 1,
+ "failure_count": 0
+ },
+ {
+ "system_id": "traefik",
+ "display_name": "Traefik",
+ "active_source_total": 2,
+ "green_source_total": 2,
+ "failure_count": 0
+ },
+ {
+ "system_id": "undici",
+ "display_name": "Undici",
+ "active_source_total": 1,
+ "green_source_total": 1,
+ "failure_count": 0
+ },
+ {
+ "system_id": "vite",
+ "display_name": "Vite",
+ "active_source_total": 2,
+ "green_source_total": 2,
+ "failure_count": 0
+ },
+ {
+ "system_id": "vue",
+ "display_name": "Vue",
+ "active_source_total": 2,
+ "green_source_total": 2,
+ "failure_count": 0
+ },
+ {
+ "system_id": "webpack",
+ "display_name": "webpack",
+ "active_source_total": 1,
+ "green_source_total": 1,
+ "failure_count": 0
+ },
+ {
+ "system_id": "werkzeug",
+ "display_name": "Werkzeug",
+ "active_source_total": 1,
+ "green_source_total": 1,
+ "failure_count": 0
+ },
+ {
+ "system_id": "woocommerce",
+ "display_name": "WooCommerce",
+ "active_source_total": 5,
+ "green_source_total": 5,
+ "failure_count": 0
+ },
+ {
+ "system_id": "wordpress",
+ "display_name": "WordPress",
+ "active_source_total": 5,
+ "green_source_total": 5,
+ "failure_count": 0
+ }
+ ]
+ },
+ "alerts": [
+ {
+ "alert_id": "django::OSV Django",
+ "system_id": "django",
+ "display_name": "Django",
+ "source_name": "OSV Django",
+ "source_kind": "osv-batch",
+ "status": "resolved",
+ "opened_at": "2026-03-19T02:27:12+00:00",
+ "updated_at": "2026-03-19T02:27:12+00:00",
+ "resolved_at": "2026-03-19T02:27:12+00:00",
+ "failure_streak": 1,
+ "last_category": "tls",
+ "last_failure": {
+ "system_id": "django",
+ "display_name": "Django",
+ "source_name": "OSV Django",
+ "source_kind": "osv-batch",
+ "source_bucket": "official_sources",
+ "category": "tls",
+ "exception": "SSLError",
+ "message": "HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))",
+ "status_code": null,
+ "url": "",
+ "summary": "django::OSV Django::tls::HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))",
+ "elapsed_seconds": 25.112
+ }
+ },
+ {
+ "alert_id": "flask::OSV Flask",
+ "system_id": "flask",
+ "display_name": "Flask",
+ "source_name": "OSV Flask",
+ "source_kind": "osv-batch",
+ "status": "resolved",
+ "opened_at": "2026-03-19T02:27:12+00:00",
+ "updated_at": "2026-03-19T02:27:12+00:00",
+ "resolved_at": "2026-03-19T02:27:12+00:00",
+ "failure_streak": 1,
+ "last_category": "tls",
+ "last_failure": {
+ "system_id": "flask",
+ "display_name": "Flask",
+ "source_name": "OSV Flask",
+ "source_kind": "osv-batch",
+ "source_bucket": "official_sources",
+ "category": "tls",
+ "exception": "SSLError",
+ "message": "HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))",
+ "status_code": null,
+ "url": "",
+ "summary": "flask::OSV Flask::tls::HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))",
+ "elapsed_seconds": 25.129
+ }
+ },
+ {
+ "alert_id": "spring-security::OSV Spring Security",
+ "system_id": "spring-security",
+ "display_name": "Spring Security",
+ "source_name": "OSV Spring Security",
+ "source_kind": "osv-batch",
+ "status": "resolved",
+ "opened_at": "2026-03-19T02:27:12+00:00",
+ "updated_at": "2026-03-19T02:27:12+00:00",
+ "resolved_at": "2026-03-19T02:27:12+00:00",
+ "failure_streak": 1,
+ "last_category": "tls",
+ "last_failure": {
+ "system_id": "spring-security",
+ "display_name": "Spring Security",
+ "source_name": "OSV Spring Security",
+ "source_kind": "osv-batch",
+ "source_bucket": "ecosystem_sources",
+ "category": "tls",
+ "exception": "SSLError",
+ "message": "HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))",
+ "status_code": null,
+ "url": "",
+ "summary": "spring-security::OSV Spring Security::tls::HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))",
+ "elapsed_seconds": 25.247
+ }
+ },
+ {
+ "alert_id": "symfony::OSV Symfony",
+ "system_id": "symfony",
+ "display_name": "Symfony",
+ "source_name": "OSV Symfony",
+ "source_kind": "osv-batch",
+ "status": "resolved",
+ "opened_at": "2026-03-19T02:27:12+00:00",
+ "updated_at": "2026-03-19T02:27:12+00:00",
+ "resolved_at": "2026-03-19T02:27:12+00:00",
+ "failure_streak": 1,
+ "last_category": "tls",
+ "last_failure": {
+ "system_id": "symfony",
+ "display_name": "Symfony",
+ "source_name": "OSV Symfony",
+ "source_kind": "osv-batch",
+ "source_bucket": "official_sources",
+ "category": "tls",
+ "exception": "SSLError",
+ "message": "HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))",
+ "status_code": null,
+ "url": "",
+ "summary": "symfony::OSV Symfony::tls::HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))",
+ "elapsed_seconds": 25.232
+ }
+ }
+ ],
+ "monitor_summary": {
+ "generated_at": "2026-03-19T02:27:12+00:00",
+ "active_source_count": 118,
+ "green_source_count": 118,
+ "source_failure_count": 0,
+ "open_alert_count": 0,
+ "resolved_alert_count": 4,
+ "last_fully_green_run": "2026-03-19T02:27:12+00:00",
+ "source_catalog": {
+ "system_count": 62,
+ "source_count": 173,
+ "retired_source_count": 55
+ },
+ "ingest": {
+ "new_count": 0,
+ "updated_count": 7,
+ "failure_count": 0,
+ "systems_touched": [
+ "nextjs",
+ "undici"
+ ]
+ },
+ "validation": {
+ "passed": true,
+ "error_count": 0,
+ "errors": []
+ }
+ }
+}
diff --git a/docs/testing-completeness-report.md b/docs/testing-completeness-report.md
index 889e79cb..dc91ad27 100644
--- a/docs/testing-completeness-report.md
+++ b/docs/testing-completeness-report.md
@@ -1,6 +1,6 @@
# 全库 Advisory 完整度报告
-- 生成时间: `2026-03-19T02:23:04+00:00`
+- 生成时间: `2026-03-19T02:27:20+00:00`
- 最新 advisory 完整度: `89/89` `verified-real`
- 合成验证数量: `0`
- 阻塞数量: `0`
@@ -8,7 +8,7 @@
- 完整度百分比: `100.0%`
- active source 全绿: `118/118`
- source open alerts: `0`
-- 最近一次 source 全绿: `2026-03-19T02:22:24+00:00`
+- 最近一次 source 全绿: `2026-03-19T02:27:12+00:00`
## 系统覆盖矩阵
@@ -29,14 +29,10 @@
## Ingest / Source 健康度
-- source failures: `4`
+- source failures: `0`
- active sources: `118`
- green sources: `118`
- open alerts: `0`
-- django::OSV Django::tls::HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))
-- flask::OSV Flask::tls::HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))
-- spring-security::OSV Spring Security::tls::HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))
-- symfony::OSV Symfony::tls::HTTPSConnectionPool(host='api.osv.dev', port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1129)')))
## 剩余风险说明
diff --git a/scripts/intel/sources/osv_api.py b/scripts/intel/sources/osv_api.py
index a910a7c3..805a2522 100644
--- a/scripts/intel/sources/osv_api.py
+++ b/scripts/intel/sources/osv_api.py
@@ -1,30 +1,135 @@
from __future__ import annotations
+import json
+import os
import re
+from hashlib import sha1
+from pathlib import Path
from typing import Any, Dict, List
import requests
+from intel.config import STATE_DIR
from intel.http_client import build_session, request
from intel.models import Candidate
-from intel.utils import parse_dt, unique
+from intel.utils import isoformat, now_utc, parse_dt, read_json, unique, write_json
QUERY_BATCH_URL = "https://api.osv.dev/v1/querybatch"
DETAIL_URL = "https://api.osv.dev/v1/vulns/{vuln_id}"
CVSS_SCORE_RE = re.compile(r"/CVSS:3\.[01]/AV:[A-Z]/AC:[A-Z]/PR:[A-Z]/UI:[A-Z]/S:[A-Z]/C:[A-Z]/I:[A-Z]/A:[A-Z]")
NUMERIC_SCORE_RE = re.compile(r"([0-9]+(?:\.[0-9]+)?)")
+DEFAULT_CACHE_TTL_SECONDS = 6 * 60 * 60
+_CACHE_DIR = STATE_DIR / "cache" / "osv"
-def _fetch_detail(session: requests.Session, vuln_id: str) -> Dict[str, Any]:
+def _cache_ttl_seconds() -> int:
+ configured = os.environ.get("WEBSAFE_OSV_CACHE_TTL_SECONDS")
+ if configured:
+ try:
+ return max(0, int(configured))
+ except ValueError:
+ return DEFAULT_CACHE_TTL_SECONDS
+ return DEFAULT_CACHE_TTL_SECONDS
+
+
+def _cache_key(value: str) -> str:
+ return sha1(value.encode("utf-8")).hexdigest()
+
+
+def _cache_path(namespace: str, value: str) -> Path:
+ return _CACHE_DIR / f"{namespace}-{_cache_key(value)}.json"
+
+
+def _load_cached_payload(namespace: str, value: str) -> Dict[str, Any] | None:
+ ttl_seconds = _cache_ttl_seconds()
+ if ttl_seconds <= 0:
+ return None
+ path = _cache_path(namespace, value)
+ cached = read_json(path, default=None)
+ if not isinstance(cached, dict):
+ return None
+ fetched_at = parse_dt(cached.get("fetched_at"))
+ if fetched_at is None:
+ return None
+ age = (now_utc() - fetched_at).total_seconds()
+ if age > ttl_seconds:
+ return None
+ payload = cached.get("payload")
+ return payload if isinstance(payload, dict) else None
+
+
+def _write_cached_payload(namespace: str, value: str, payload: Dict[str, Any]) -> None:
+ write_json(
+ _cache_path(namespace, value),
+ {
+ "fetched_at": isoformat(now_utc()),
+ "payload": payload,
+ },
+ )
+
+
+def _request_json(
+ method: str,
+ url: str,
+ *,
+ source: Dict[str, Any],
+ cache_namespace: str,
+ cache_key: str,
+ session: requests.Session | None = None,
+ json_body: Dict[str, Any] | None = None,
+) -> Dict[str, Any]:
+ cached = _load_cached_payload(cache_namespace, cache_key)
+ if cached is not None:
+ return cached
response = request(
- "GET",
- DETAIL_URL.format(vuln_id=vuln_id),
+ method,
+ url,
+ source=source,
session=session,
+ json=json_body,
headers={"User-Agent": "websafe-intel"},
)
response.raise_for_status()
- return response.json()
+ payload = response.json()
+ if not isinstance(payload, dict):
+ raise ValueError(f"OSV response payload was not an object for {url}")
+ _write_cached_payload(cache_namespace, cache_key, payload)
+ return payload
+
+
+def request_querybatch_json(
+ source: Dict[str, Any],
+ queries: List[Dict[str, Any]],
+ *,
+ session: requests.Session | None = None,
+) -> Dict[str, Any]:
+ body = {"queries": queries}
+ return _request_json(
+ "POST",
+ QUERY_BATCH_URL,
+ source=source,
+ cache_namespace="querybatch",
+ cache_key=json.dumps(body, sort_keys=True, separators=(",", ":")),
+ session=session,
+ json_body=body,
+ )
+
+
+def request_detail_json(
+ source: Dict[str, Any],
+ vuln_id: str,
+ *,
+ session: requests.Session | None = None,
+) -> Dict[str, Any]:
+ return _request_json(
+ "GET",
+ DETAIL_URL.format(vuln_id=vuln_id),
+ source=source,
+ cache_namespace="detail",
+ cache_key=vuln_id,
+ session=session,
+ )
def _fixed_versions(vuln: Dict[str, Any]) -> List[str]:
@@ -96,16 +201,7 @@ def fetch(system: Dict[str, Any], source: Dict[str, Any]) -> List[Candidate]:
queries = [{"package": {"name": pkg["name"], "ecosystem": pkg["ecosystem"]}} for pkg in packages]
session = build_session(source)
- response = request(
- "POST",
- QUERY_BATCH_URL,
- source=source,
- session=session,
- json={"queries": queries},
- headers={"User-Agent": "websafe-intel"},
- )
- response.raise_for_status()
- payload = response.json()
+ payload = request_querybatch_json(source, queries, session=session)
detail_cache: Dict[str, Dict[str, Any]] = {}
candidates: List[Candidate] = []
@@ -118,7 +214,7 @@ def fetch(system: Dict[str, Any], source: Dict[str, Any]) -> List[Candidate]:
if since_dt is not None and modified is not None and modified < since_dt:
continue
if vuln_id not in detail_cache:
- detail_cache[vuln_id] = _fetch_detail(session, vuln_id)
+ detail_cache[vuln_id] = request_detail_json(source, vuln_id, session=session)
vuln = detail_cache[vuln_id]
aliases = unique(vuln.get("aliases", []) + [vuln.get("id")])
diff --git a/scripts/intel/sources/runner.py b/scripts/intel/sources/runner.py
index 92e19f76..b8675f6a 100644
--- a/scripts/intel/sources/runner.py
+++ b/scripts/intel/sources/runner.py
@@ -177,15 +177,10 @@ def probe_source(system: Dict[str, Any], source: Dict[str, Any]) -> Dict[str, An
packages = system.get("package_names", [])
if not packages:
return {"kind": kind, "items_seen": 0}
- response = request(
- "POST",
- osv_api.QUERY_BATCH_URL,
- source=source,
- json={"queries": [{"package": {"name": packages[0]["name"], "ecosystem": packages[0]["ecosystem"]}}]},
- headers={"User-Agent": "websafe-intel"},
+ payload = osv_api.request_querybatch_json(
+ source,
+ [{"package": {"name": packages[0]["name"], "ecosystem": packages[0]["ecosystem"]}}],
)
- response.raise_for_status()
- payload = response.json()
if not isinstance(payload, dict):
raise ValueError("OSV probe returned non-object payload")
return {"kind": kind, "items_seen": len(payload.get("results", []))}