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

14 KiB
Raw Permalink Blame History

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-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 阶段评分(策略专属评分)或直接复用候选管道

七、检修补充发现(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(策略评估/候选过滤等)逐个排查