Files
MoFin/docs/system-audit-20260810.md
T

302 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# MoFin 系统彻查报告(2026-08-10
> 彻查范围:cron 管道 / 健康监控 / 本地vs246差异 / 数据层
> 目的:了解系统现状 + 发现问题 + 对照文档与246部署版
> 状态:📋 彻查完成,待老莫决策修改项
---
## 处理状态追踪(2026-08-11 核实)
### ✅ 已修复
| 问题 | 修复 |
|---|---|
| P0-1 promote_candidates 超时 | ✅ 限批10 + 单例守卫(commit 9f82a9b1|
| P0-2 candidate_filter "待处理0只" | ✅ 低分<7 七天重审(commit 79980ce9|
| P1-4 小果残留检查项 | ✅ 8/10 health_checklist 清理 |
| P1-5 system_health_check | ✅ 已暂停(22:43|
| P1-6 HEALTH-PIPELINE 文档 | ✅ 8/11 已更新 |
| P2-7 本地仓库落后 | ✅ 8/11 origin 修正为 Gitea + 三方同步 |
| P3-9 capital_flow db locked | ✅ 8/11 单行 upsertcommit 19461765|
| §十一 fix_gateway_port 死循环 | ✅ v3commit 87808165|
| §十 多个 LLM cron 停摆 | ✅ 8/11 key1 直连恢复 + gateway 稳定 |
### 🔴 仍未处理(待办)
| 问题 | 说明 |
|---|---|
| P2-8 健康脚本 md5 不同 | 需确认是否已被硬链同步覆盖 |
| P3-10 market.json 假阳性 | health 检查仍查 JSON,需改查 DB |
| §八 收盘简报 8/7 error | 非紧急,观察 |
| §十 cron_to_xmpp 双通道 | 主 profile 停 + crontab */2 可能重复 |
| §九 run_all_tests.py 缺失 | 规范 6.2 要求但脚本不存在 |
| §七 todos 254 号卡死 | 宏观风险 HIGH TODO 滞留 in_progress |
---
## 一、cron 管道彻查(63个任务)
### 1.1 今日失败/异常任务(2026-08-10
| 任务 | 脚本 | 问题 | 影响 |
|---|---|---|---|
| 候选股自动提拔-每30分 | promote_candidates.py | **超时 600s** | 候选无法入自选 |
| 盘前全量重评-自选退出 | premarket_full_review.py | **超时 600s** | 重评中断 |
| 资金流采集-盘中 | capital_flow_collector.py | database is locked | 资金流数据缺失 |
| 开盘前钉对钉验证 | preflight_verify.py | 退出码 1 | 1/18 提示词不一致 |
| 小果市场筛选-全市场 | market_screener.py | SIGTERM (code -15) | 筛选中断 |
| 收盘简报 | closing_brief.py | interpreter shutdown | 简报可能缺失 |
| 策略评估-每日 | stale_detector.py | Connection error | 评估中断 |
| LLM修复循环-L3 | self_repair.py | SIGTERM | 自愈中断 |
### 1.2 🔴 管道断点:候选池积压
- `candidates` 表:**427 行**,其中 250 已提拔、**177 未提拔**、7 dropped
- sector 分布:**accumulation=412**(占96%)、v_mr=5 等
- **`candidate_filter` 今日报"待处理候选: 0只"** —— 但 177 个未提拔候选存在!
- **`promote_candidates` 每次超时 600s** —— 无法消费积压(对每个候选调 stock_quote 子进程10s + technical_analysis 重型计算 + per_stock_reassess 480s,多个候选顺序处理必然超时)
- **管道断裂点**accumulation_scanner(15分) → candidate_filter(30分,处理0) → promote_candidates(30分,超时)
### 1.3 调度机制
- market_watch.py **链式调用 mr_scanner + s2_scanner**(不是 accumulation_scanner
- accumulation_scanner 独立 cron*/10 9-15
- 调度在 hermes cron jobs.json63任务),非系统 crontab
## 二、健康监控彻查
### 2.1 多层健康检查体系
| 层级 | 脚本 | 调度 | 状态 |
|---|---|---|---|
| 系统体检(8类47项) | morning_health_check.py | 交易日8:00 | ✅ 今日8:00跑 |
| 盘中自检-高频 | intraday_health_check.py | */15 9-15 | ✅ 今日12:30跑 |
| 功能健康-L1 | functional_health_check.py | */15 | ✅ |
| 健康数据采集 | mofin_health.py | */15 | ✅ |
| 元监控-L4 | meta_watchdog.py | 每5分 | ✅ |
| 系统健康检查 | system_health_check.py | 0 9 * * 1-5 | 🔴 **last_run=2026-07-2318天没跑)** |
### 2.2 🔴 小果残留导致虚假 critical 报警
**小果已归档**xiaoguo 服务已停),但 health_checklist.json 仍包含:
- `infra-xmpp-xiaoguo`(小果 XMPP Bot
- `infra-gateway-xiaoguo`:8645
- `infra-xiaoguo-tunnel`SSH隧道)
- `sense-xiaoguo-scanner-data`(扫描数据)
今日体检结果:**ok=35 / warn=3 / error=6 / critical=3**critical 全是小果残留检查。
### 2.3 其他问题
- checklist 实际 **47 项**(文档说 48 项,差1
- `system_health_check.py` 被 cron-catalog 标注"被 morning 替代"但仍在调度且 18 天没跑
- cron 审计报警"全部cron最近24h 43个异常"(可能误报或真实)
- HEALTH-PIPELINE.md 描述 Tier1/Tier2agents_health_check),与实际 MoFin 多层体系**不符**
### 2.4 本地 vs 246 健康脚本差异(4个 md5 不同)
| 脚本 | 本地 | 246 | 说明 |
|---|---|---|---|
| mofin_health.py | 48KB | 80KB | 246 版大 |
| morning_health_check.py | 38KB | 71KB | 246 版大 |
| cron_health_monitor.py | 有 | 有 | 内容不同 |
| gateway_health.py | 有 | 有 | 内容不同 |
## 三、本地 vs 246 漂移(严重)
### 3.1 git 差异
- **本地落后 148 commits**1 ahead, 148 behind origin/master
- 246 master == origin/masteraa85fc21
- 本地 master 有本地独有 commitfc68ca38docs 归档)、88c6ea45(盯盘防闪烁)等
### 3.2 脚本差异
- **70 个文件内容不同**(本地旧)
- **8 个脚本仅 246 有**heavy_run.sh / market_regime.py / mr_scanner.py / news_collector.py / resonance.py / s2_scanner.py / ths_news.py / v71_gate.py
- 3 个 cron 引用脚本不在 canonical deploy/profile-scriptsself_todo_executor_v2.py / market_screener.py / prepare_report_data.py
### 3.3 deploy_guard 状态
- 246 上 deploy_guardok=true0 problems12:30)——canonical 与 profile scripts 一致
## 四、数据层(简要)
- live_prices 今日 12:40 新鲜
- market_snapshots 新鲜
- holding_strategies active=18
- 资金流采集失败(db locked)→ 资金流数据今日可能缺失
- **market.json 496h 旧**health 假阳性——market_watch 已迁 DB,但 health 仍查 JSON
## 五、问题优先级(建议修改顺序)
### P0(管道断裂,影响实盘)
1. `promote_candidates.py` 超时修复(批处理/跳过 heavy 子进程/加单例守卫)
2. `candidate_filter` "待处理 0 只" 断点排查
### P1(健康监控误报)
4. health_checklist.json 移除小果残留项(infra-xmpp-xiaoguo 等)
5. `system_health_check.py` 停用或合并(18天没跑)
6. HEALTH-PIPELINE.md 文档更新
### P2(一致性)
7. 本地仓库同步(148 commits 落后)——但需确认合并策略(246 是权威)
8. 健康脚本 4 个 md5 不同——以 246 为准同步
### P3(数据)
9. capital_flow_collector db lockedSQLite 并发)
10. market.json 假阳性(health 检查改查 DB
---
> 彻查方式:246 实查(jobs.json 解析/candidates 表/md5 对比/health_checklist+ 本地对照
> 待老莫决策:哪些先修、如何修(P0 管道断裂是否优先处理)
## 六、深入结论(2026-08-10 二次深挖)
### 6.1 git 三方同步关系(同步问题真相)
```
git.yoin.fun/hmo/MoFin.git ←← 246 的 origin(真正权威远端)
↑ origin/master (aa85fc21)
246 工作区 /home/hmo/MoFin
↑ 本地 origin = ssh://246(本地连的是 246 本身,不是 git.yoin.fun
本地 /projects/MoFinHEAD=fc68ca38,落后 30+ 提交)
```
**结论**
- **246 部署代码与 git 一致**deploy_guard 硬链接 + 每日守卫,ok=true
- **本地落后 origin/master 30+ 提交**fc68ca38 是我提交的文档归档)
- **246 有 3 个游离未提交改动**strategy_lab.py(M)、evolution/evolution_api.py(M)、data/strategy_staleness_report.json(M)——**不在 deploy_guard CODE_PATHS 里**(守卫只监控 deploy/profile-scripts/mofin_db.py 等特定路径),所以守卫不处理
- **部署目录 = 硬链接到 git 工作区**(inode 相同),deploy 一致性由 deploy_guard 保证
### 6.2 候选管道断裂根因(双重点)
**断点1candidate_filter 永远 0 待处理**
- 查询条件:`pass_final IS NULL OR pass_final=0`
- 但 candidate_filter 给**所有非否决候选**设 `pass_final=1`(不管分数)→ 一旦过滤永久 pass,**从不重审**
- 结果:427 候选全 pass_final=1 → filter 永远报"0只"
**断点2promote_candidates 必然超时**
- 查询:`score_final>=7`**~240 个候选**
- 每个候选:stock_quote 子进程(10s) + technical_analysis + per_stock_reassess(480s)
- hermes `child_timeout_seconds=600` 杀进程(exit code -15)→ **必然超时**
- 实际只处理了 ~33 个就被杀(约18s/个,240个需要1小时)
**accumulation_scanner**"发现515只但新增0只"——所有检测到的都已存在于 candidates(不重复插入),池子饱和
### 6.3 新策略接入点(关键问题回答)
**candidate_filter / promote_candidates 都无 sector 过滤** → 会消费任何 sector 的新候选
但**新策略接入前必须先修复管道**:
1. promote_candidates 超时(240个×18s=1h >> 600s)是当前最大障碍
2. candidate_filter 的 6 阶段通用评分**为 accumulation 设计**(量价放大/中低位),超跌策略候选评分可能不适配
3. RR>=2.0 门槛(promote 内)会把超跌候选大量拒绝(当前 31/33 被 RR<2 拒绝)
4. per_stock_reassess 480s 子进程是超时主因
**修复方向(待老莫批准)**
- promote_candidates:分批处理(每批 N 个)+ 缩短 per_stock_reassess 超时 + 加单例守卫
- candidate_filterpass_final 语义修正(分数阈值才 pass,或允许重审)
- 新策略接入:独立 sectorp_oversold)+ 考虑绕过通用 6 阶段评分(策略专属评分)或直接复用候选管道
## 七、检修补充发现(2026-08-10 策略评估/自愈体系)
### 策略评估/反馈/进化链路(数据正常)
- strategy_evaluations 217条 / feedback 222 / history 5513 / research 111 / tracking 311 / lessons 16
### 🔴 cron 停摆/error
| cron | 脚本 | 状态 | 根因 |
|---|---|---|---|
| 策略评估-每日 | stale_detector.py | 🔴 error(08-06起) | Connection errorstock_quote子进程超时+兜底失败)|
| LLM修复循环-L3 | self_repair.py | 🔴 error(今天) | Script timed out after 600s(同promote问题)|
| 策略复盘-每日 | strategy_review.py | ⚠️ 08-07后停 | 3天没跑 |
| 分支剪枝-每日 | prune_branches.py | ⚠️ 08-07后停 | 3天没跑 |
| 系统全局审计 | system_audit.py | ⚠️ 08-07后停 | 3天没跑 |
### ⚠️ TODO 滞留
- todos 表 254 号:宏观风险HIGH TODO 卡 in_progress07-29"调用知微失败timed out")——自愈链路滞留点
### 洞察
- 策略评估链路实际停摆(3天)——评估体系没有真正闭环
- self_repair 也是 600s 超时(与 promote 同类问题)——**系统性超时问题**hermes child_timeout_seconds=600 对重型脚本太短
- 这些与候选管道修复是**同一类问题**(超时),修复模式可复用
## 八、知微链路检修结论(2026-08-10)
| 检查项 | 结论 |
|---|---|
| 知微 bot 进程 | ✅ 运行中(xmpp_zhiwei_bot.py PID 1254814|
| 简报 cron 调度 | ✅ 正常(工作日跑,周末跳过符合预期)|
| 开盘简报 | ✅ oknext 08-11 09:35|
| 收盘简报 | ⚠️ 08-07 error(上周五,需查非紧急)|
| 知微洞察 | ✅ next 今天15:35 |
| 市场精选推荐 | ✅ next 今天16:00 |
| 信息通道 | 简报模板→cron_to_xmpp→知微XMPP,链路完整 |
## 九、规范差距评估(DEVELOPMENT_STANDARDS.md vs 实际)
### 规范要求但实际缺失
| 规范条目 | 实际状态 |
|---|---|
| run_all_tests.py 必须通过(6.2| ❌ **脚本不存在**(只有 TEST_PLAN.md 文档)|
| 一次 commit 一个逻辑(6.4| ✅ 遵守 |
| 无重复代码(1.1| ⚠️ 部分违反(candidate_filter 直接写SQL|
### 规范缺失(检修发现需补充)
| 缺失内容 | 背景 |
|---|---|
| **单例守卫铁律** | refresh_mtf_cache 重复实例→db lockedpromote 无守卫 |
| **deploy_guard 部署流程** | 改 deploy/profile-scripts 必须 commit,否则被回滚(实战踩坑)|
| **提交白名单** | GIT_ALLOW_COMMIT=1 令牌 + push 用 hmo 身份 |
| **600s 超时限制** | hermes child_timeout_seconds=600,重型脚本需分批/护栏 |
## 十、知微链路深入检修(2026-08-10 二次)
### 🔴 今天开盘简报生成失败
- 09:35 运行但 LLM API 失败(deepseek-v4-flash 空流 → 180s kill
- 无输出文件,jobs.json 状态未更新
- 根因:LLM 通道不稳定 + 失败状态未正确记录
### 🔴 多个 cron 静默停摆/失败
| cron | 问题 |
|---|---|
| 市场精选推荐 | 7/31后停摆(5交易日)|
| 小果市场筛选 | 8/7 killcode -15|
| 收盘简报 | 8/7 RuntimeError |
| 策略评估-每日 | 8/6起 Connection error |
### ⚠️ cron_to_xmpp 双通道
- 主 profile 30908cdc44a8(每分)7/23 停
- position-analyst f948702cf5de(每5分)在跑
- 系统 crontab */2 跑 deploy 版 → 可能重复
### 部署启示
知微信息 = hermes cron + LLM + XMPP 推送。LLM 不稳定→简报静默失败,部署新策略需监控此链路。
## 十一、Cron 系统审视与整理(2026-08-10 晚)
### 背景
63个cron从MoFin系统从无到有过程中陆续加入,含不合时宜部分。系统性审视分类处理。
### 已归档(pause5个)
| cron | 原因 |
|---|---|
| 自选买入区提醒-盘前午间尾盘 | 被候选管道promote_candidates替代 |
| 系统健康检查-开盘前 | 被morning_health_check替代 |
| 300308入场信号紧盯 + 午后紧盯 | 中际旭创盯盘,确认停用 |
| 小果市场筛选-全市场 | 小果已归档,筛选残留 |
### 根因发现(解释8/3起所有LLM cron停摆)
**fix_gateway_port.py 看门狗反噬死循环**
- 每5分钟cron检测8643端口/session → LLM端点故障误判异常
- → sudo systemctl restart gateway → 只等5s(冷启动20-100s)误判失败
- → 下次又restart → 死循环(8/3起gateway每5分钟被重启)
- 后果:所有LLM cron停摆(市场精选/策略时效/持仓复查/开盘简报/策略评估)
### 已修复:fix_gateway_port v387808165
1. 重启冷却30分钟(防循环)
2. 等待120s(覆盖冷启动)
3. LLM端点故障不重启只告警(重启gateway无用)
### 待观察(第2步)
- B类3个cron(市场精选/策略时效/持仓复查)明天是否恢复
- D类持续error(策略评估/候选过滤等)逐个排查