Stabilize source health monitoring
这个提交包含在:
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `29`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:19+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `30`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:19+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `70`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:19+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `23`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:19+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `100`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:19+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `70`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:19+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `40`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:19+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `26`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:19+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `140`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:19+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `81`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:19+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `89`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:19+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `15`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:19+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `100`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:19+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `27`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:19+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `112`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:19+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `24`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:19+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `71`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:19+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `111`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:19+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `2`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:19+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `3`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:20+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `14`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:19+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `82`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:20+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `2`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:20+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `1`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:19+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `1`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:19+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `1`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:19+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `1`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:20+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `1`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:20+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `1`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:19+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `1`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:19+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `2`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:19+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `2`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:19+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `40`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:19+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `8`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:19+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `28`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:19+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `42`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:20+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `21`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:19+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `2`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:19+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `11`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:19+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `3`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:19+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `3`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:19+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `9`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:19+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `9`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:19+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `30`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:19+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `15`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:19+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `1`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:19+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `1`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:20+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `2`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:20+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `13`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:20+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `55`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:20+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `60`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:20+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `60`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:20+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `41`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:20+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `20`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:20+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `50`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:20+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `50`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:20+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `135`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:20+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `136`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:20+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `27`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:20+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `6`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:20+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `110`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:20+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `43`
|
||||
- 最近渲染时间: `2026-03-19T02:23:04+00:00`
|
||||
- 最近渲染时间: `2026-03-19T02:27:20+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
@@ -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": [
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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,
|
||||
|
||||
文件差异内容过多而无法显示
加载差异
@@ -87,7 +87,7 @@
|
||||
<h1>当前架构库镜像</h1>
|
||||
<div class="meta">工作台内置镜像页:当前架构库结构化数据镜像。</div>
|
||||
<pre>{
|
||||
"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": [
|
||||
|
||||
@@ -88,7 +88,7 @@
|
||||
<div class="meta">工作台内置镜像页:active/retired source、replacement map 与覆盖摘要。</div>
|
||||
<pre># 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`
|
||||
|
||||
@@ -88,7 +88,7 @@
|
||||
<div class="meta">工作台内置镜像页:89 条 advisory 最新完整度、family 矩阵与 ingest 健康度。</div>
|
||||
<pre># 全库 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)')))
|
||||
|
||||
## 剩余风险说明
|
||||
|
||||
|
||||
@@ -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": [
|
||||
{
|
||||
|
||||
@@ -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`
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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": []
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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`
|
||||
|
||||
文件差异内容过多而无法显示
加载差异
文件差异内容过多而无法显示
加载差异
@@ -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)')))
|
||||
|
||||
## 剩余风险说明
|
||||
|
||||
|
||||
@@ -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")])
|
||||
|
||||
@@ -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", []))}
|
||||
|
||||
在新工单中引用
屏蔽一个用户