# MoFin 自愈循环系统设计

> 版本: v1.0 | 最后更新: 2026-06-24
> 核心理念：体检发现问题 → TODO追踪 → 自动修复 → 次日体检验证，形成无人值守的修复闭环。

## 一、自愈循环架构

```
                     ┌───────────────────────────────────┐
                     │     morning_health_check.py        │
                     │     每日 8:00（开盘前）           │
                     │                                   │
                     │  体检 7 层 43+ 项                  │
                     │  发现问题 → 写 TODO               │
                     └──────────┬────────────────────────┘
                                │ TODO: health_fix_xxx
                                ▼
                     ┌───────────────────────────────────┐
                     │     self-todo cron                │
                     │     每 2-3 小时自动执行           │
                     │                                   │
                     │  读取 pending 任务                 │
                     │  按优先级逐个处理                  │
                     │  完成后 git commit + 标记完成     │
                     └──────────┬────────────────────────┘
                                │ git push
                                ▼
                     ┌───────────────────────────────────┐
                     │     次晨体检验证                  │
                     │                                   │
                     │  确认昨日问题已修复 → ✅          │
                     │  问题依然存在     → ⚠️ 升级标记  │
                     └───────────────────────────────────┘
```

## 二、健康检查 → TODO 对接

### 对接点

morning_health_check.py 发现异常后：

```
1. 读当前 TODO 文件
2. 检查是否已有相同 issue 的 TODO（去重）
3. 如果没有 → 追加新 TODO：
   - status: pending
   - priority: 根据 severity（critical→high, error→medium, warn→low）
   - deps: 无
   - title: "[体检发现] {问题描述}"
4. 如果有相同 TODO 且 status=completed → 
   - 说明昨天标记修复但今天仍然有问题 → 重新打开
   - 修改 status=pending, priority 升一级
```

### TODO 字段映射

| 体检 severity | TODO priority | 预期修复时间 |
|---------------|---------------|-------------|
| critical | high | 当前 session / 下一个 self-todo |
| error | medium | 24h 内 |
| warn | low | 48h 内 |

## 三、xiaoguo 信号桥（知微消费 xiaoguo_scanner 产出）

### 问题

xiaoguo_scanner 每5分钟写 `signal_news` 表，但知微没有任何组件读取它。

### 解决方案

新增 `xiaoguo_signal_consumer.py`（no_agent 脚本，每30分钟运行一次）：

```
xiaoguo_signal_consumer.py (每30分, 盘中)
    │
    ├── 读 mofin.db signal_news 表
    │   WHERE source LIKE 'xiaoguo%' 
    │   AND (processed=0 OR processed IS NULL)
    │   AND date(created_at) == today
    │
    ├── 逐条处理：
    │   ├── source=xiaoguo（看多信号）:
    │   │   ├── 检查是否已在自选/持仓
    │   │   ├── 拉腾讯行情（实时价/PE/涨跌幅）
    │   │   ├── 五维快速评估（大盘→行业→消息→基本面→技术）
    │   │   ├── 决策：加自选 / 关注 / 跳过
    │   │   └── 写入 decisions.json / watchlist.json
    │   │
    │   └── source=xiaoguo_risk（看空信号）:
    │       └── 检查持仓止损距，预警
    │
    └── 标记 processed=1
```

### 执行层次

健康检查和信号消费是 **两个独立管道**：

| 管道 | 脚本 | 频率 | 用途 |
|------|------|------|------|
| 系统体检 | morning_health_check.py | 每日8:00 | 检查全部组件健康状态 |
| 信号消费 | xiaoguo_signal_consumer.py | 每30分 9:30-15:00 | 消费小果扫描信号 |

## 四、核心文件

| 文件 | 用途 |
|------|------|
| /home/hmo/MoFin/docs/self-healing-loop.md | 本文档 |
| /home/hmo/MoFin/scripts/morning_health_check.py | 体检脚本（已存在，需修改） |
| /home/hmo/MoFin/scripts/xiaoguo_signal_consumer.py | 信号消费脚本（新建） |
| /home/hmo/.hermes/profiles/position-analyst/todo.json | TODO 系统数据文件 |

## 五、TODO 集成修改计划

### morning_health_check.py 修改项

在 main() 函数末尾追加 TODO 写入逻辑：

```python
def write_todos_for_issues(report_entries):
    """将体检发现的异常写入 TODO 系统"""
    todo_path = Path("/home/hmo/.hermes/profiles/position-analyst/todo.json")
    # 读现有 TODO
    # 去重（检查是否已有相同 issue）
    # 追加新 TODO
    # 写回
```

### xiaoguo_signal_consumer.py 新建

30分钟盘中循环，消费 signal_news 中的未处理 xiaoguo 信号。

### self-todo cron 适配

确保 self-todo cron（b53435fbb38b 每小时多次运行）能识别并处理 `[体检发现]` 前缀的 TODO 项。
