Stabilize source health monitoring

这个提交包含在:
hao
2026-03-18 19:28:13 -07:00
父节点 9b0d72b112
当前提交 94d257177c
修改 83 个文件,包含 4437 行新增546 行删除

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `29` - 待人工/缺浏览器证据: `29`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:19+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `30` - 待人工/缺浏览器证据: `30`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:19+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `70` - 待人工/缺浏览器证据: `70`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:19+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `23` - 待人工/缺浏览器证据: `23`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:19+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `100` - 待人工/缺浏览器证据: `100`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:19+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `70` - 待人工/缺浏览器证据: `70`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:19+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `40` - 待人工/缺浏览器证据: `40`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:19+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `26` - 待人工/缺浏览器证据: `26`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:19+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `140` - 待人工/缺浏览器证据: `140`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:19+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `81` - 待人工/缺浏览器证据: `81`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:19+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `89` - 待人工/缺浏览器证据: `89`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:19+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `15` - 待人工/缺浏览器证据: `15`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:19+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `100` - 待人工/缺浏览器证据: `100`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:19+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `27` - 待人工/缺浏览器证据: `27`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:19+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `112` - 待人工/缺浏览器证据: `112`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:19+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `24` - 待人工/缺浏览器证据: `24`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:19+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `71` - 待人工/缺浏览器证据: `71`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:19+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `111` - 待人工/缺浏览器证据: `111`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:19+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `2` - 待人工/缺浏览器证据: `2`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:19+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `3` - 待人工/缺浏览器证据: `3`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:20+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `14` - 待人工/缺浏览器证据: `14`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:19+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `82` - 待人工/缺浏览器证据: `82`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:20+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `2` - 待人工/缺浏览器证据: `2`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:20+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `1` - 待人工/缺浏览器证据: `1`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:19+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `1` - 待人工/缺浏览器证据: `1`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:19+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `1` - 待人工/缺浏览器证据: `1`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:19+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `1` - 待人工/缺浏览器证据: `1`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:20+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `1` - 待人工/缺浏览器证据: `1`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:20+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `1` - 待人工/缺浏览器证据: `1`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:19+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `1` - 待人工/缺浏览器证据: `1`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:19+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `2` - 待人工/缺浏览器证据: `2`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:19+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `2` - 待人工/缺浏览器证据: `2`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:19+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `40` - 待人工/缺浏览器证据: `40`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:19+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `8` - 待人工/缺浏览器证据: `8`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:19+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `28` - 待人工/缺浏览器证据: `28`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:19+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `42` - 待人工/缺浏览器证据: `42`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:20+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `21` - 待人工/缺浏览器证据: `21`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:19+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `2` - 待人工/缺浏览器证据: `2`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:19+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `11` - 待人工/缺浏览器证据: `11`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:19+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `3` - 待人工/缺浏览器证据: `3`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:19+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `3` - 待人工/缺浏览器证据: `3`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:19+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `9` - 待人工/缺浏览器证据: `9`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:19+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `9` - 待人工/缺浏览器证据: `9`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:19+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `30` - 待人工/缺浏览器证据: `30`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:19+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `15` - 待人工/缺浏览器证据: `15`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:19+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `1` - 待人工/缺浏览器证据: `1`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:19+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `1` - 待人工/缺浏览器证据: `1`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:20+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `2` - 待人工/缺浏览器证据: `2`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:20+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `13` - 待人工/缺浏览器证据: `13`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:20+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `55` - 待人工/缺浏览器证据: `55`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:20+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `60` - 待人工/缺浏览器证据: `60`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:20+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `60` - 待人工/缺浏览器证据: `60`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:20+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `41` - 待人工/缺浏览器证据: `41`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:20+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `20` - 待人工/缺浏览器证据: `20`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:20+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `50` - 待人工/缺浏览器证据: `50`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:20+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `50` - 待人工/缺浏览器证据: `50`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:20+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `135` - 待人工/缺浏览器证据: `135`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:20+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `136` - 待人工/缺浏览器证据: `136`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:20+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `27` - 待人工/缺浏览器证据: `27`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:20+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `6` - 待人工/缺浏览器证据: `6`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:20+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `110` - 待人工/缺浏览器证据: `110`
- 最近渲染时间: `2026-03-19T02:23:04+00:00` - 最近渲染时间: `2026-03-19T02:27:20+00:00`
## 目标约束 ## 目标约束

查看文件

@@ -12,7 +12,7 @@
- 已实证(synthetic): `0` - 已实证(synthetic): `0`
- 阻塞数: `0` - 阻塞数: `0`
- 待人工/缺浏览器证据: `43` - 待人工/缺浏览器证据: `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", "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", "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": [ "sections": [
@@ -49,7 +49,7 @@
}, },
{ {
"label": "\u751f\u6210\u65f6\u95f4", "label": "\u751f\u6210\u65f6\u95f4",
"value": "2026-03-19T02:23:04+00:00" "value": "2026-03-19T02:27:20+00:00"
} }
], ],
"links": [ "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, "advisory_total": 89,
"registry_advisory_total": 2392, "registry_advisory_total": 2392,
"scope": "latest-run-backed-advisories", "scope": "latest-run-backed-advisories",
@@ -168,30 +168,25 @@
} }
], ],
"ingest_health": { "ingest_health": {
"failure_count": 4, "failure_count": 0,
"failures": [ "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)')))"
]
}, },
"source_health": { "source_health": {
"active_source_count": 118, "active_source_count": 118,
"green_source_count": 118, "green_source_count": 118,
"failure_count": 0, "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, "open_alert_count": 0,
"resolved_alert_count": 0 "resolved_alert_count": 4
}, },
"monitor_summary": { "monitor_summary": {
"generated_at": "2026-03-19T02:22:24+00:00", "generated_at": "2026-03-19T02:27:12+00:00",
"active_source_count": 118, "active_source_count": 118,
"green_source_count": 118, "green_source_count": 118,
"source_failure_count": 0, "source_failure_count": 0,
"open_alert_count": 0, "open_alert_count": 0,
"resolved_alert_count": 0, "resolved_alert_count": 4,
"last_fully_green_run": "2026-03-19T02:22:24+00:00", "last_fully_green_run": "2026-03-19T02:27:12+00:00",
"source_catalog": { "source_catalog": {
"system_count": 62, "system_count": 62,
"source_count": 173, "source_count": 173,
@@ -200,7 +195,7 @@
"ingest": { "ingest": {
"new_count": 0, "new_count": 0,
"updated_count": 7, "updated_count": 7,
"failure_count": 4, "failure_count": 0,
"systems_touched": [ "systems_touched": [
"nextjs", "nextjs",
"undici" "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, "active_source_count": 118,
"green_source_count": 118, "green_source_count": 118,
"source_failure_count": 0, "source_failure_count": 0,
"open_alert_count": 0, "open_alert_count": 0,
"resolved_alert_count": 0, "resolved_alert_count": 4,
"last_fully_green_run": "2026-03-19T02:22:24+00:00", "last_fully_green_run": "2026-03-19T02:27:12+00:00",
"source_catalog": { "source_catalog": {
"system_count": 62, "system_count": 62,
"source_count": 173, "source_count": 173,
@@ -14,7 +14,7 @@
"ingest": { "ingest": {
"new_count": 0, "new_count": 0,
"updated_count": 7, "updated_count": 7,
"failure_count": 4, "failure_count": 0,
"systems_touched": [ "systems_touched": [
"nextjs", "nextjs",
"undici" "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, "system_count": 62,
"source_count": 173, "source_count": 173,
"active_source_count": 118, "active_source_count": 118,

查看文件

@@ -87,7 +87,7 @@
<h1>当前架构库镜像</h1> <h1>当前架构库镜像</h1>
<div class="meta">工作台内置镜像页:当前架构库结构化数据镜像。</div> <div class="meta">工作台内置镜像页:当前架构库结构化数据镜像。</div>
<pre>{ <pre>{
&quot;generated_at&quot;: &quot;2026-03-19T02:23:04+00:00&quot;, &quot;generated_at&quot;: &quot;2026-03-19T02:27:20+00:00&quot;,
&quot;title&quot;: &quot;当前架构库&quot;, &quot;title&quot;: &quot;当前架构库&quot;,
&quot;summary&quot;: &quot;工作台、控制面、数据层、授权边界与系统覆盖的当前真值视图。&quot;, &quot;summary&quot;: &quot;工作台、控制面、数据层、授权边界与系统覆盖的当前真值视图。&quot;,
&quot;sections&quot;: [ &quot;sections&quot;: [
@@ -137,7 +137,7 @@
}, },
{ {
&quot;label&quot;: &quot;生成时间&quot;, &quot;label&quot;: &quot;生成时间&quot;,
&quot;value&quot;: &quot;2026-03-19T02:23:04+00:00&quot; &quot;value&quot;: &quot;2026-03-19T02:27:20+00:00&quot;
} }
], ],
&quot;links&quot;: [ &quot;links&quot;: [

查看文件

@@ -88,7 +88,7 @@
<div class="meta">工作台内置镜像页active/retired source、replacement map 与覆盖摘要。</div> <div class="meta">工作台内置镜像页active/retired source、replacement map 与覆盖摘要。</div>
<pre># Source Catalog Audit <pre># Source Catalog Audit
- generated_at: `2026-03-19T02:22:09+00:00` - generated_at: `2026-03-19T02:26:48+00:00`
- systems: `62` - systems: `62`
- sources: `173` - sources: `173`
- active_sources: `118` - active_sources: `118`

查看文件

@@ -88,7 +88,7 @@
<div class="meta">工作台内置镜像页89 条 advisory 最新完整度、family 矩阵与 ingest 健康度。</div> <div class="meta">工作台内置镜像页89 条 advisory 最新完整度、family 矩阵与 ingest 健康度。</div>
<pre># 全库 Advisory 完整度报告 <pre># 全库 Advisory 完整度报告
- 生成时间: `2026-03-19T02:23:04+00:00` - 生成时间: `2026-03-19T02:27:20+00:00`
- 最新 advisory 完整度: `89/89` `verified-real` - 最新 advisory 完整度: `89/89` `verified-real`
- 合成验证数量: `0` - 合成验证数量: `0`
- 阻塞数量: `0` - 阻塞数量: `0`
@@ -96,7 +96,7 @@
- 完整度百分比: `100.0%` - 完整度百分比: `100.0%`
- active source 全绿: `118/118` - active source 全绿: `118/118`
- source open alerts: `0` - 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 健康度 ## Ingest / Source 健康度
- source failures: `4` - source failures: `0`
- active sources: `118` - active sources: `118`
- green sources: `118` - green sources: `118`
- open alerts: `0` - open alerts: `0`
- django::OSV Django::tls::HTTPSConnectionPool(host=&#x27;api.osv.dev&#x27;, port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, &#x27;EOF occurred in violation of protocol (_ssl.c:1129)&#x27;)))
- flask::OSV Flask::tls::HTTPSConnectionPool(host=&#x27;api.osv.dev&#x27;, port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, &#x27;EOF occurred in violation of protocol (_ssl.c:1129)&#x27;)))
- spring-security::OSV Spring Security::tls::HTTPSConnectionPool(host=&#x27;api.osv.dev&#x27;, port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, &#x27;EOF occurred in violation of protocol (_ssl.c:1129)&#x27;)))
- symfony::OSV Symfony::tls::HTTPSConnectionPool(host=&#x27;api.osv.dev&#x27;, port=443): Max retries exceeded with url: /v1/querybatch (Caused by SSLError(SSLEOFError(8, &#x27;EOF occurred in violation of protocol (_ssl.c:1129)&#x27;)))
## 剩余风险说明 ## 剩余风险说明

查看文件

@@ -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, "advisory_count": 2392,
"run_count": 140, "run_count": 140,
"statuses": { "statuses": {
@@ -158,7 +158,7 @@
"green_source_count": 118, "green_source_count": 118,
"source_failure_count": 0, "source_failure_count": 0,
"open_alert_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": [ "systems": [
{ {

查看文件

@@ -1,6 +1,6 @@
# 最新同步摘要 # 最新同步摘要
- 渲染时间: `2026-03-19T02:23:04+00:00` - 渲染时间: `2026-03-19T02:27:20+00:00`
- 系统数量: `62` - 系统数量: `62`
- Advisory 数量: `2348` - Advisory 数量: `2348`
- 重点 Markdown 数量: `156` - 重点 Markdown 数量: `156`
@@ -8,11 +8,4 @@
- 新增记录: `0` - 新增记录: `0`
- 更新记录: `7` - 更新记录: `7`
- Triage 数量: `1169` - Triage 数量: `1169`
- 失败的 source adapter: `4` - 失败的 source adapter: `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,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, "active_source_count": 118,
"green_source_count": 118, "green_source_count": 118,
"source_failure_count": 0, "source_failure_count": 0,
"open_alert_count": 0, "open_alert_count": 0,
"resolved_alert_count": 0, "resolved_alert_count": 4,
"last_fully_green_run": "2026-03-19T02:22:24+00:00", "last_fully_green_run": "2026-03-19T02:27:12+00:00",
"source_catalog": { "source_catalog": {
"system_count": 62, "system_count": 62,
"source_count": 173, "source_count": 173,
@@ -14,7 +14,7 @@
"ingest": { "ingest": {
"new_count": 0, "new_count": 0,
"updated_count": 7, "updated_count": 7,
"failure_count": 4, "failure_count": 0,
"systems_touched": [ "systems_touched": [
"nextjs", "nextjs",
"undici" "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, "system_count": 62,
"advisory_count": 2348, "advisory_count": 2348,
"markdown_count": 156, "markdown_count": 156,
@@ -11,62 +11,5 @@
], ],
"triage_count": 1169, "triage_count": 1169,
"run_bundle_count": 89, "run_bundle_count": 89,
"failures": [ "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
}
]
} }

查看文件

@@ -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, "system_count": 62,
"source_count": 173, "source_count": 173,
"active_source_count": 118, "active_source_count": 118,

查看文件

@@ -1,6 +1,6 @@
# Source Catalog Audit # Source Catalog Audit
- generated_at: `2026-03-19T02:22:09+00:00` - generated_at: `2026-03-19T02:26:48+00:00`
- systems: `62` - systems: `62`
- sources: `173` - sources: `173`
- active_sources: `118` - active_sources: `118`

文件差异内容过多而无法显示 加载差异

文件差异内容过多而无法显示 加载差异

查看文件

@@ -1,6 +1,6 @@
# 全库 Advisory 完整度报告 # 全库 Advisory 完整度报告
- 生成时间: `2026-03-19T02:23:04+00:00` - 生成时间: `2026-03-19T02:27:20+00:00`
- 最新 advisory 完整度: `89/89` `verified-real` - 最新 advisory 完整度: `89/89` `verified-real`
- 合成验证数量: `0` - 合成验证数量: `0`
- 阻塞数量: `0` - 阻塞数量: `0`
@@ -8,7 +8,7 @@
- 完整度百分比: `100.0%` - 完整度百分比: `100.0%`
- active source 全绿: `118/118` - active source 全绿: `118/118`
- source open alerts: `0` - 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 健康度 ## Ingest / Source 健康度
- source failures: `4` - source failures: `0`
- active sources: `118` - active sources: `118`
- green sources: `118` - green sources: `118`
- open alerts: `0` - 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 from __future__ import annotations
import json
import os
import re import re
from hashlib import sha1
from pathlib import Path
from typing import Any, Dict, List from typing import Any, Dict, List
import requests import requests
from intel.config import STATE_DIR
from intel.http_client import build_session, request from intel.http_client import build_session, request
from intel.models import Candidate 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" QUERY_BATCH_URL = "https://api.osv.dev/v1/querybatch"
DETAIL_URL = "https://api.osv.dev/v1/vulns/{vuln_id}" 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]") 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]+)?)") 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( response = request(
"GET", method,
DETAIL_URL.format(vuln_id=vuln_id), url,
source=source,
session=session, session=session,
json=json_body,
headers={"User-Agent": "websafe-intel"}, headers={"User-Agent": "websafe-intel"},
) )
response.raise_for_status() 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]: 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] queries = [{"package": {"name": pkg["name"], "ecosystem": pkg["ecosystem"]}} for pkg in packages]
session = build_session(source) session = build_session(source)
response = request( payload = request_querybatch_json(source, queries, session=session)
"POST",
QUERY_BATCH_URL,
source=source,
session=session,
json={"queries": queries},
headers={"User-Agent": "websafe-intel"},
)
response.raise_for_status()
payload = response.json()
detail_cache: Dict[str, Dict[str, Any]] = {} detail_cache: Dict[str, Dict[str, Any]] = {}
candidates: List[Candidate] = [] 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: if since_dt is not None and modified is not None and modified < since_dt:
continue continue
if vuln_id not in detail_cache: 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] vuln = detail_cache[vuln_id]
aliases = unique(vuln.get("aliases", []) + [vuln.get("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", []) packages = system.get("package_names", [])
if not packages: if not packages:
return {"kind": kind, "items_seen": 0} return {"kind": kind, "items_seen": 0}
response = request( payload = osv_api.request_querybatch_json(
"POST", source,
osv_api.QUERY_BATCH_URL, [{"package": {"name": packages[0]["name"], "ecosystem": packages[0]["ecosystem"]}}],
source=source,
json={"queries": [{"package": {"name": packages[0]["name"], "ecosystem": packages[0]["ecosystem"]}}]},
headers={"User-Agent": "websafe-intel"},
) )
response.raise_for_status()
payload = response.json()
if not isinstance(payload, dict): if not isinstance(payload, dict):
raise ValueError("OSV probe returned non-object payload") raise ValueError("OSV probe returned non-object payload")
return {"kind": kind, "items_seen": len(payload.get("results", []))} return {"kind": kind, "items_seen": len(payload.get("results", []))}