# 审计 — 告警分页 + 调度单次 fire_at 修复（2026-06-09）

**Changelog**: `docs/changelog/2026-06-09-alerts-schedule-fixes-deploy.md`

## 变更文件清单

| 文件 | 说明 |
|------|------|
| `AlertsPage.vue` | 每页条数状态 + `fetchPagePerPage` |
| `settings.py` | 告警列表 `per_page` 上限 200 |
| `schema_path_validators.py` | `coerce_optional_iso_datetime` |
| `schemas.py` | `ScheduleCreate`/`ScheduleUpdate` `fire_at` → `datetime` |
| `test_schedules.py` | once 推送创建集成测试 |
| `prod_health_check.sh` | 生产公开/鉴权契约巡检 |
| `index.html` | vite 构建 hash 更新 |

## Step 3 规则扫描

| 规则 | 结论 |
|------|------|
| 无静默吞错 | PASS — `loadAlerts` 失败 snackbar |
| 调度 CUD 审计 | PASS — 未改 audit 写入逻辑 |
| `fire_at` 类型安全 | PASS — schema 层解析，避免 ORM 500 |
| 告警分页契约 | PASS — 与 `fetchPagePerPage` / 后端 `page`/`per_page` 一致 |
| 无明文密钥 | PASS — 健康脚本用环境变量/SSH，不入仓 |

## Closure

| 项 | 结果 |
|----|------|
| `test_schedules.py` | 2 passed |
| `test_alerts_audit.py` | 4 passed |
| `vite build` | OK |
| 生产复现 once 500 | 已确认根因；`3864d12` 部署后容器 healthy |
| 部署验证报告 | `docs/reports/2026-06-09-alerts-schedule-fixes-deploy-verification.md` |

## DoD

- [x] 告警每页数目与 API `per_page` 联动
- [x] 单次文件推送调度保存 201（非 500）
- [x] Changelog + 本审计
- [x] 生产部署与健康检查（`/health` ok，容器 healthy；鉴权 UI 待用户终验）
