From c272d0247e68a6cfa1aa440123a3ba4a6bd88411 Mon Sep 17 00:00:00 2001 From: hmo Date: Tue, 11 Aug 2026 06:32:44 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20cron=E6=9E=B6=E6=9E=84=E6=B7=B1?= =?UTF-8?q?=E5=BA=A6=E5=AE=A1=E6=9F=A5=E4=B8=8E=E9=87=8D=E6=9E=84=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E2=80=94=E2=80=94=E5=8F=91=E7=8E=B04=E5=A4=A7?= =?UTF-8?q?=E9=97=AE=E9=A2=98(=E7=AD=96=E7=95=A5=E6=89=AB=E6=8F=8F?= =?UTF-8?q?=E5=99=A8=E5=B5=8C=E5=85=A5/=E5=A4=9A=E5=85=A5=E5=8F=A3?= =?UTF-8?q?=E8=B0=83=E5=BA=A6/=E4=BB=A3=E7=A0=81=E5=88=86=E5=8F=89/?= =?UTF-8?q?=E5=81=A5=E5=BA=B7=E6=A3=80=E6=9F=A5=E8=BF=87=E5=BA=A6=E5=B1=82?= =?UTF-8?q?=E7=BA=A7)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/cron-architecture-review-20260811.md | 224 ++++++++++++++++++++++ 1 file changed, 224 insertions(+) create mode 100644 docs/cron-architecture-review-20260811.md diff --git a/docs/cron-architecture-review-20260811.md b/docs/cron-architecture-review-20260811.md new file mode 100644 index 00000000..4f8ec14d --- /dev/null +++ b/docs/cron-architecture-review-20260811.md @@ -0,0 +1,224 @@ +# MoFin Cron 架构深度审查与重构设计 + +> 创建:2026-08-11 | 审查人:小小莫 | 状态:📋 审查完成,重构方案待老莫批准 +> 背景:新策略(预测超跌反弹 p_oversold)引入前,必须清理 cron 架构的 +> 重复调度、代码分叉、职责混乱问题,让架构清晰可维护。 + +--- + +## 一、现状全景 + +### 1.1 调度系统 + +| 调度系统 | 任务数 | 说明 | +|---------|--------|------| +| hermes 顶层 jobs.json | 16 | ⚠️ 7/23 起调度器停摆(残留)| +| hermes position-analyst | 63 | ✅ 主调度(活跃)| +| hermes mohe | 2 | ✅ 少量 | +| 系统 crontab | ~33 | ⚠️ 部分与 hermes 重复 | + +### 1.2 脚本总数 + +- deploy/profile-scripts/:~100 个 py +- hermes scripts/:硬链接(sync_profile_scripts.sh 维护) +- MoFin 根目录:库文件 + 残留 + +--- + +## 二、核心架构问题 + +### 问题 1:策略扫描器嵌入数据采集器(违反单一职责) + +**现状**: +``` +market_watch.py(行业板块采集,*/10) + ├─ 1. 板块数据采集(EM→THS)→ market_snapshots + ├─ 2. market_regime 计算 → market_regime 表 + ├─ 3. subprocess 调 mr_scanner.py(v_weak,timeout=1500s) + └─ 4. subprocess 调 s2_scanner.py(S2 恐慌买,timeout=1500s) +``` + +**问题**: +- market_watch 职责 = 数据采集 + 市场阶段 + 2 个策略扫描,四合一 +- mr_scanner/s2_scanner **无独立调度**,只能被 market_watch 触发 +- timeout=1500s(25分钟)嵌入采集器,若超时影响采集 +- 新策略 p_oversold 替换时无处安放(要改 market_watch 还是新建?) + +**重构方案**:策略扫描器独立调度 +``` +market_watch.py(纯板块采集,*/10) +mr_scanner.py(v_weak,独立 cron 0 9 * * 1-5 或并入扫描调度) +s2_scanner.py(S2 恐慌买,独立 cron) +predictive_oversold_scanner.py(新策略,独立 cron) +``` +- 每个扫描器独立 job、独立日志、独立幂等 +- market_watch 只做采集(单一职责) + +### 问题 2:同一脚本多个调度入口 + +| 脚本 | 入口 | 建议 | +|------|------|------| +| market_watch.py | 顶层(0,30 9-16) + position(*/10) | 停顶层(调度器已死)| +| stale_detector.py | 策略评估-每日(21:00) + 周末重评(30 10 0,6) | 保留(两用途不同)| +| memory_guardian.py | 顶层 + position | 停顶层 | +| cron_to_xmpp.py | 顶层(* 9-16) + position(*/5) | 停顶层(已停 crontab)| +| divergence_detector.py | 工作日(*/30 8-15) + 周末(30 8-16/2) | 保留(两用途合理)| + +### 问题 3:一份代码多版本(分叉) + +| 文件 | 副本 | 状态 | +|------|------|------| +| market_watch.py | MoFin根(旧) vs deploy(新) | ❌ 分叉,根目录残留 | +| promote_candidates.py | docs/backup 残留 | ❌ 备份未清理 | +| self_todo_executor.py | deploy vs hermes vs AgentsMeeting | ⚠️ 新旧版并存 | +| agents_health_check.py | MoFin/AgentsMeeting/self-growing | ⚠️ 三项目各自维护 | + +**原则(红线)**: +- 一份代码只存在于一个 canonical 位置(MoFin git 仓库) +- deploy/profile-scripts ↔ hermes scripts 用硬链接(已规范) +- 其他位置(根目录/backup/其他项目)不得有副本 + +### 问题 4:健康检查体系过度层级化 + +**现状 8 个健康类脚本**: +``` +L0: agents_health_check(Tier1,5min) +L1: morning_health_check(8:00 体检)+ intraday_health_check(15min) +L1: functional_health_check(L1 功能检查,15min) +L1: mofin_health(dashboard 数据,15min) +L2: system_hygiene_audit(卫生审计) +L3: self_repair(LLM 修复) +L4: meta_watchdog(检查检查的检查) ++ system_audit(全局审计 17:30) +``` + +**问题**:8 个脚本职责重叠,互相引用,排查复杂 +**建议**:保留核心 4 层(Tier1/morning+intraday/functional/self_repair),合并冗余 + +--- + +## 三、逐任务设计文档(分类) + +### 3.1 候选管道(核心链路) + +``` +accumulation_scanner(*/10)→ candidates(sector=accumulation) + → candidate_filter(*/30,6阶段评分) + → promote_candidates(*/30,RR>=2 + 容量60) + → per_stock_reassess(12维重评)→ holding_strategies +盘前: premarket_full_review(8:10)→ regenerate_all +``` + +| 脚本 | 职责 | 调度 | 数据流 | 问题 | +|------|------|------|--------|------| +| accumulation_scanner | 主力建仓扫描 | */10 | 行情→candidates | 与新策略无关,保留 | +| candidate_filter | 6阶段过滤 | */30 | candidates→评分 | 耦合 accumulation 设计 | +| promote_candidates | 候选提拔 | */30 | candidates→自选 | RR>=2 门槛需适配 | +| premarket_full_review | 盘前重评 | 8:10 | 全量重评 | 依赖缓存预热 | + +### 3.2 策略扫描器(问题 1 核心) + +| 脚本 | 职责 | 当前入口 | 重构后 | +|------|------|---------|--------| +| mr_scanner.py | v_weak 弱市扫描 | 嵌入 market_watch | 独立 cron | +| s2_scanner.py | S2 恐慌买 | 嵌入 market_watch | 独立 cron | +| **predictive_oversold_scanner** | **新策略(待建)** | 无 | 独立 cron | + +### 3.3 数据采集 + +| 脚本 | 职责 | 调度 | 问题 | +|------|------|------|------| +| price_monitor | 价格(A+港股)| hermes */2 9-16 | ✅ 已统一 | +| market_watch | 板块 | hermes */10 | ⚠️ 待拆策略扫描 | +| capital_flow_collector | 资金流 | 1,31 9-15 | ✅ 已修锁 | +| refresh_mtf_cache | 多周期缓存 | 50 7,11,14 | ✅ 已修 flush | +| fundamentals_refresh | 基本面 | 早/午两次 | ⚠️ 午间可停?| +| sector_enrich_cninfo | 行业富集 | 早/午两次 | ⚠️ 午间可停?| +| macro_context_collector | 宏观新闻 | */30 | ✅ | +| refresh_macro_context | 宏观上下文 | */30 | ✅ | +| news_collector | 新闻 | crontab 30 9,13,17 | ✅ | +| divergence_detector | 跨市场背离 | */30+周末 | ✅ | + +### 3.4 健康自检(问题 4) + +| 脚本 | 职责 | 调度 | 保留 | +|------|------|------|------| +| agents_health_check | Tier1 4服务 | */5 | ✅ | +| morning_health_check | 每日体检 8类40项 | 8:00 | ✅ | +| intraday_health_check | 盘中自检 | */15 | ✅ | +| functional_health_check | L1 功能 | */15 | ✅ | +| mofin_health | dashboard 数据 | */15 | ✅ | +| self_repair | L3 LLM 修复 | */30 | ✅ | +| meta_watchdog | L4 元监控 | 5min | ✅ | +| system_hygiene_audit | 卫生审计 | 8:20 | ⚠️ 与 system_audit 重叠 | +| system_audit | 全局审计 | 17:30 | ⚠️ 与 hygiene 重叠 | +| system_health_check | 传统检查 | 已停 | ❌ 可归档 | + +### 3.5 报告简报 + +| 脚本 | 职责 | 调度 | 备注 | +|------|------|------|------| +| opening_brief/closing_brief | 开/收盘简报 | 9:35/16:10 | ✅ | +| market_insight | 知微洞察 | 15:35 | ✅ | +| strategy_review | 策略复盘 | 20:00 | ✅ | +| strategy_evaluator | 策略评估 | 每周/每日 | ⚠️ 每日版可停 | +| collect_evaluation_data | 评估数据 | 20:30 | ✅ | +| prepare_report_data | 报告数据 | 周四 | ✅ | + +### 3.6 自成长 + +| 脚本 | 职责 | 调度 | 备注 | +|------|------|------|------| +| branch_scanner | 分支自成长 | 15min | ✅ | +| prune_branches | 分支剪枝 | 21:00 | ✅ | +| meta_growth | 元自成长 | 0:45/12:45 | ✅ | +| hardcode_scanner | 硬编码扫描 | 17:25 | ✅ | + +### 3.7 系统维护 + +| 脚本 | 职责 | 调度 | 备注 | +|------|------|------|------| +| deploy_guard | 部署守卫 | */15 | ✅ 核心 | +| fix_gateway_port | gateway 看门狗 | 10min | ✅ 核心 | +| agent_spiral_watchdog | 螺旋监控 | */10 | ✅ | +| db_daily_backup | DB 备份 | 7:50 | ✅ | +| vacuum_state_db | state.db 整理 | 周六 | ✅ | +| system_audit | 全局审计 | 17:30 | ✅ | + +--- + +## 四、重构方案(待老莫批准) + +### 4.1 立即执行(低风险) +1. **停顶层 jobs.json 残留**(16个 job 调度器已死)——enabled=False 或确认清理 +2. **清理 market_watch.py 根目录分叉**(旧版移 archive) +3. **清理 promote_candidates.py backup 残留** +4. **统一 agents_health_check**(确认三项目各自维护是否必要) + +### 4.2 重构(中等风险,需测试) +5. **拆 market_watch 策略扫描**:mr_scanner/s2_scanner 独立调度 +6. **fundamentals/sector_enrich 午间版停用**(早间足够) +7. **评估每日版停用**(每周版足够) + +### 4.3 为 p_oversold 准备 +8. **新建 predictive_oversold_scanner.py**(独立 cron,对齐 accumulation_scanner 模式) +9. **候选管道适配**(p_oversold 走专属评估,绕过 RR>=2) + +### 4.4 红线(杜绝多版本) +- 一份代码一个 canonical 位置(MoFin git) +- deploy↔hermes 硬链接(已规范) +- 根目录不留脚本副本(库文件除外,且必须与 deploy 硬链) +- 备份不进仓库 + +--- + +## 五、执行优先级 + +| 优先级 | 动作 | 风险 | +|--------|------|------| +| P0 | 停顶层 jobs 残留 + 清 market_watch 分叉 | 低 | +| P1 | 拆策略扫描器独立调度 | 中 | +| P2 | 停午间重复采集 | 低 | +| P3 | 建 p_oversold 扫描器 | 中 | + +> 待老莫确认后分批执行。 \ No newline at end of file