# 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 单行 upsert(commit 19461765)| | §十一 fix_gateway_port 死循环 | ✅ v3(commit 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.json(63任务),非系统 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-23(18天没跑)** | ### 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/Tier2(agents_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/master(aa85fc21) - 本地 master 有本地独有 commit:fc68ca38(docs 归档)、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-scripts:self_todo_executor_v2.py / market_screener.py / prepare_report_data.py ### 3.3 deploy_guard 状态 - 246 上 deploy_guard:ok=true,0 problems(12: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 locked(SQLite 并发) 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/MoFin(HEAD=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 候选管道断裂根因(双重点) **断点1:candidate_filter 永远 0 待处理** - 查询条件:`pass_final IS NULL OR pass_final=0` - 但 candidate_filter 给**所有非否决候选**设 `pass_final=1`(不管分数)→ 一旦过滤永久 pass,**从不重审** - 结果:427 候选全 pass_final=1 → filter 永远报"0只" **断点2:promote_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_filter:pass_final 语义修正(分数阈值才 pass,或允许重审) - 新策略接入:独立 sector(p_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 error(stock_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_progress(07-29"调用知微失败timed out")——自愈链路滞留点 ### 洞察 - 策略评估链路实际停摆(3天)——评估体系没有真正闭环 - self_repair 也是 600s 超时(与 promote 同类问题)——**系统性超时问题**:hermes child_timeout_seconds=600 对重型脚本太短 - 这些与候选管道修复是**同一类问题**(超时),修复模式可复用 ## 八、知微链路检修结论(2026-08-10) | 检查项 | 结论 | |---|---| | 知微 bot 进程 | ✅ 运行中(xmpp_zhiwei_bot.py PID 1254814)| | 简报 cron 调度 | ✅ 正常(工作日跑,周末跳过符合预期)| | 开盘简报 | ✅ ok(next 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 locked;promote 无守卫 | | **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 kill(code -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系统从无到有过程中陆续加入,含不合时宜部分。系统性审视分类处理。 ### 已归档(pause,5个) | 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 v3(87808165) 1. 重启冷却30分钟(防循环) 2. 等待120s(覆盖冷启动) 3. LLM端点故障不重启只告警(重启gateway无用) ### 待观察(第2步) - B类3个cron(市场精选/策略时效/持仓复查)明天是否恢复 - D类持续error(策略评估/候选过滤等)逐个排查