# Phase 3 逐行走读修复

**日期**: 2026-05-23  
**批次**: 3a（安全核心）、3b（background）、3c（基础设施）、3d（main/middleware）

## 修复清单

| ID | 文件 | 级 | 说明 | 修复 |
|----|------|----|------|------|
| F3a-01 | `agent.py:97-102` | P2 | `float(cpu/mem/disk)` 对非数字 Agent 数据 → ValueError/500 | 提取 `_safe_float()` 包裹转换，非数字值 WARNING 级跳过 |
| F3b-01 | `schedule_runner.py:84` | P1 | `now`（tz-aware）- `last_run_at`（MySQL naive）→ TypeError → 已跑调度永远失败 | 统一去除 tzinfo 后再减 |
| F3b-02 | `schedule_runner.py:47` | P3 | cron `*/0` → ZeroDivisionError | step==0 时返回 False 跳过 |
| F3c-01 | `redis/client.py:49` | P2 | Redis URL 含 auth 时密码写入日志 | 启动日志脱敏（`user:**@host`） |
| F3d-01 | `main.py:116-118` | P2 | primary lock 丢失时续锁退出，后台任务继续双跑 | lock 丢失时 cancel 所有后台任务 |
| F3d-02 | `main.py:344` | P2 | CORS origins 不去除空格 | `o.strip()` 过滤 |

## 审查结论

| 批次 | 覆盖 | 结论 |
|------|------|------|
| 3a | auth_jwt.py、webssh.py、crypto.py、agent.py、dependencies.py | 1 BUG 修复；安全核心均正确 |
| 3b | heartbeat_flush、retry_runner、schedule_runner、self_monitor | 2 BUG 修复；整体逻辑正确 |
| 3c | engine_compat.py、session.py、redis/client.py | 1 日志脱敏；新增文件无安全问题 |
| 3d | main.py | 2 BUG 修复；中间件注册顺序正确 |
