fix: 干掉blocked状态+所有TODO必有fix_action

- 取消blocked状态:没有"搁着等"这回事
- executor改:fix_action失败→重试→重试用完等明天体检再说
- health check改:创建TODO时fix_action必须非空
  - 没有fix_action→不创建TODO,在报告里直接列出
- 新增derive_fix_action覆盖:delivery/价格监控/信号桥等场景
- 体检报告尾段:查出无fix_action的问题直接列出,不创建空TODO
This commit is contained in:
知微
2026-06-24 21:16:59 +08:00
parent a55d241f30
commit b63c4f5879
2 changed files with 64 additions and 115 deletions
+27 -14
View File
@@ -42,16 +42,24 @@ TODO_PATH = Path("/home/hmo/.hermes/profiles/position-analyst/todo.json")
def derive_fix_action(detail, msg):
"""根据issue信息推导可执行的修复命令"""
# 小果扫描 error → 脚本已更新,只验证
# 小果扫描 error → 验证脚本是否存在
if "xiaoguo_scanner" in msg or "小果扫描" in msg:
return f"cd {BASE} && python3 xiaoguo_scanner.py --test 2>&1 | head -5"
return f"ls -la /home/hmo/.hermes/profiles/position-analyst/scripts/xiaoguo_scanner.py 2>&1 && echo 'ok'"
# system-audit error → 验证拷贝
if "system_audit" in msg or "系统审计" in msg:
return f"ls -la /home/hmo/.hermes/profiles/position-analyst/scripts/system_audit.py 2>&1"
# 港股汇率 → 刷新
if "港股汇率" in msg:
return f"cd {BASE} && python3 hk_rate.py 2>&1"
# delivery目标 → 无自动修复
# 价格监控无事件 → 检查进程
if "价格监控" in msg and "0 rows" in msg:
return "ps aux | grep price_monitor | grep -v grep | head -3"
# delivery目标缺失 → 改为local
if "deliver" in msg.lower() or "delivery" in msg.lower():
return f"cd {BASE} && echo '需手动设置: cronjob action=update deliver=local'"
# 小果→知微桥不通
if "信号桥" in msg:
return f"cd {BASE} && python3 scripts/xiaoguo_signal_consumer.py 2>&1"
return None
@@ -148,8 +156,12 @@ def write_todos_for_issues():
(pri, r_exist[0])
)
else:
# 生成fix_action如果可推导
# 生成fix_action必须非空
fix_action = derive_fix_action(issue.get("detail", ""), issue.get("msg", ""))
if not fix_action:
# 没有fix_action就不创建TODO,直接输出到报告里
print(f" ⚠️ 无自动修复方案: [{pri}] {title[:60]}")
continue
conn.execute(
"INSERT INTO todos (title, description, priority, source, status, fix_action) "
"VALUES (?, ?, ?, 'health_check', 'pending', ?)",
@@ -657,19 +669,20 @@ def main():
if entry["level"] in ("critical", "error"):
print(f" [{entry['level'].upper()}] {entry['category']}: {entry['msg']}")
# 检查是否有阻塞的 TODO 需要知微处理
# 检查是否有待处理的 TODO 需要知微关注
try:
conn = sqlite3.connect(str(DB_PATH))
blocked = conn.execute(
"SELECT id, title, priority, created_at FROM todos WHERE status='blocked' "
"ORDER BY CASE priority WHEN 'high' THEN 0 WHEN 'medium' THEN 1 ELSE 2 END, created_at ASC"
conn2 = sqlite3.connect(str(DB_PATH))
pending_llm = conn2.execute(
"SELECT id, title, priority, created_at FROM todos "
"WHERE status='pending' AND fix_action IS NULL "
"ORDER BY created_at ASC LIMIT 5"
).fetchall()
if blocked:
if pending_llm:
print()
print("⛔ 阻塞TODO(需知微人工处理:")
for b in blocked:
print(f" [{b[2]}] #{b[0]} {b[1][:70]} ({b[3][:10]})")
conn.close()
print("⚠️ 待处理(需知微介入:")
for p in pending_llm:
print(f" [{p[2]}] #{p[0]} {p[1][:70]} ({p[3][:10]})")
conn2.close()
except:
pass