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

8.3 KiB
Raw Blame History

MoFin 系统彻查报告(2026-08-10

彻查范围:cron 管道 / 健康监控 / 本地vs246差异 / 数据层 目的:了解系统现状 + 发现问题 + 对照文档与246部署版 状态:📋 彻查完成,待老莫决策修改项


一、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-tunnelSSH隧道)
  • sense-xiaoguo-scanner-data(扫描数据)

今日体检结果:ok=35 / warn=3 / error=6 / critical=3critical 全是小果残留检查。

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 commits1 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(健康监控误报)

  1. health_checklist.json 移除小果残留项(infra-xmpp-xiaoguo 等)
  2. system_health_check.py 停用或合并(18天没跑)
  3. HEALTH-PIPELINE.md 文档更新

P2(一致性)

  1. 本地仓库同步(148 commits 落后)——但需确认合并策略(246 是权威)
  2. 健康脚本 4 个 md5 不同——以 246 为准同步

P3(数据)

  1. capital_flow_collector db lockedSQLite 并发)
  2. 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 阶段评分(策略专属评分)或直接复用候选管道