D2执行前最后修正(最终确认版 v8)
日期: 2026-09-14
状态: 等待用户最终确认
任务1:B3 测试任务细节 ✅
hb_capital_watchdog.py 实际路径
完整路径: C:\Users\Admin\AppData\Local\hermes\scripts\hb_capital_watchdog.py
文件大小: 530 字符(12行)
内容: 包装脚本,调用实际的 capital_watchdog.py
关键发现
# hb_capital_watchdog.py 内容
import subprocess, sys, os
sys.path.insert(0, r"C:/Users/Admin/AppData/Local/hermes/scripts")
os.chdir(r"C:/Users/Admin/AppData/Local/hermes/scripts")
r = subprocess.run(
[sys.executable, r"C:/Users/Admin/AppData/Local/hermes/scripts/heartbeat_run.py",
"capital_watchdog", r"C:/Users/Admin/AppData/Local/hermes/scripts/capital_watchdog.py"],
cwd=r"C:/Users/Admin/AppData/Local/hermes/scripts",
)
sys.exit(r.returncode)
明天10:30运行确认
cron_id: 29145a4dd49f
调度: 30 10 * * 1-5(工作日10:30)
明天是周一(工作日)
启用状态: True
结论: ✅ 明天10:30会运行
B3测试方案调整
原方案: 临时修改command字段包装run_with_alert.py
问题: 需要暂停cron,影响明天10:30运行
修正方案: 使用另一个script-mode任务
推荐: 因子IC衰减监控(a7e2b8dc,20:00运行)
- 明天20:00运行,测试在22:45后,无冲突
- script-mode,安全可控
- 不读写alert_state.db
任务2:扩展受控测试窗口 ✅
| 时间 |
测试项 |
内容 |
预期结果 |
| 22:00-22:15 |
告警路径测试 |
修改last_run_at为3小时前,触发alert_channel_health |
alerts表写入记录,TG告警发送 |
| 22:15-22:30 |
超时路径测试 |
验证超时检测逻辑(timeout_threshold_s) |
正确识别超时任务 |
| 22:30-22:45 |
通道健康测试 |
检查channel_health表+心跳记录 |
心跳记录正常,无异常 |
任务3:B3 验证指标 ✅
| 序号 |
验证项 |
检查方法 |
预期结果 |
| 1 |
run_with_alert.py 成功调用原脚本 |
检查日志输出 |
"run_with_alert wrapper called" |
| 2 |
task_runs 表写入新记录 |
SQL查询 |
新记录写入,task_id正确 |
| 3 |
audit_log 表写入记录 |
SQL查询 |
审计日志写入 |
| 4 |
原脚本输出正常 |
检查stdout/stderr |
与原脚本运行一致 |
| 5 |
exit_code 与原脚本一致 |
比较exit code |
一致 |
| 6 |
无异常报错 |
检查stderr |
无Traceback |
任务4:dead_mans_switch 告警路径 ✅
实际告警路径(从代码分析)
# dead_mans_switch.py 第180-210行
if result["status"] == "timeout":
# 1. TG告警
tg_ok, tg_err = send_tg(f"🔴 [看门狗] {result['message']}", "P0")
# 2. 邮件告警
email_ok = send_email_alert(subject, body)
# 3. 本地文件告警
send_local_alert(f"心跳超时: {result['message']}")
# 写入: D:/Hermes/data/state/dead_mans_switch_alert.txt
告警路径总结
| 路径 |
写表/文件 |
条件 |
| TG告警 |
send_tg() |
心跳超时30分钟 |
| 邮件告警 |
smtplib |
SMTP配置存在 |
| 本地文件 |
dead_mans_switch_alert.txt |
心跳超时30分钟 |
| alerts表 |
❌ 不写入 |
dead_mans_switch不写alerts表 |
| audit_log表 |
❌ 不写入 |
dead_mans_switch不写audit_log |
重要发现
❌ dead_mans_switch 不写 alerts 表
❌ dead_mans_switch 不写 audit_log 表
✅ dead_mans_switch 写本地文件 dead_mans_switch_alert.txt
✅ dead_mans_switch 发送 TG 告警
✅ dead_mans_switch 发送邮件告警(如果配置)
任务5:D2 最终时间表 ✅
| 时段 |
任务 |
内容 |
状态 |
| 17:25-18:20 |
Dead-Man测试 |
暂停alert_channel_health→等待→验证→恢复 |
✅ 确认 |
| 22:00-22:45 |
受控测试前3项 |
告警路径、超时路径、通道健康 |
✅ 确认 |
| 22:45-23:15 |
影子cron集成(B3) |
用因子IC衰减监控测试 |
✅ 确认 |
| 23:15-23:45 |
回归验证 |
清理+确认 |
✅ 确认 |
B3测试任务确认
推荐任务: 因子IC衰减监控 (a7e2b8dc)
调度: 0 20 * * 1-5(工作日20:00)
明天20:00运行,测试在22:45后,无冲突
脚本: hb_ic_monitor.py
模式: script-mode
最终确认清单
□ D1总结已确认(90次运行,100%成功)
□ Dead-Man测试步骤已确认
□ B3测试任务已确认(因子IC衰减监控 a7e2b8dc)
□ dead_mans_switch告警路径已确认(本地文件+TG+邮件,不写alerts表)
□ 时段冲突已分析并规避
□ 备份文件已确认(jobs.json.bak_20260913)
✅ 所有条件满足,可以进入D2执行
请确认以上方案,回复"进入D2"启动明天执行。