docs: 文档治理第二波——更新8份保留文档(QUICKSTART/DEPLOY/DASHBOARD/HEALTH-PIPELINE/portfolio-data-model/morning-health-check/SELF_GROWTH/lifecycle),归档cron-catalog+system-audit

This commit is contained in:
hmo
2026-08-11 04:04:04 +08:00
parent a5a0a46fe9
commit 6929720d47
11 changed files with 111 additions and 84 deletions
+91
View File
@@ -0,0 +1,91 @@
# MoFin Cron 完全手册
> 版本: v1 | 最后更新: 2026-06-27
> 用途: 所有定时任务的完整文档,含设计意图、实现方式、数据流、代码结构、依赖关系。
## 一、系统健康
| 脚本 | 调度 | 设计意图 | 数据流 | 关键代码 |
|------|------|---------|--------|---------|
| `morning_health_check.py` | 交易日8:00 | 开盘前全面体检8类48项,发现异常→auto_fix/TODO | 读:checklist.json/DB/进程/端口/API → 写:health_check_log表+todos表 | main() → run_check() → write_todos_for_issues() → auto_fix_issue() |
| `intraday_health_check.py` | 交易日每15分 9-15 | 盘中轻量自检,XMPP/Gateway/Scanner/价格/信号管道 | 读:DB/进程/API/macro_risk_state.json → 写:todos表 | main() → check_bots/gateways/xiaoguo/price_monitor/signal_pipeline → write_todos() |
| `system_health_check.py` | 每日9:00 | 传统系统检查(进程/端口/文件/数据新鲜度)——被morning_health_check替代 | 读:系统状态 → stdout | run() |
| `system_audit.py` | 交易日17:30 | 7维度审计(信号/股票/策略/建议/组合/数据管道/服务) | 读:DB+JSON → 写:audit_report.json | audit_signals/stocks/strategies/advice/portfolio/pipeline/services() |
| `memory_guardian.py` | 每日7:00 | 按SOUL记忆规则检查并清理共享memory | 读:MEMORY.md+gateway → 调gateway清理 + report | check_memory_md() → cleanup_memory() |
## 二、数据采集
| 脚本 | 调度 | 设计意图 | 数据流 | 关键代码 |
|------|------|---------|--------|---------|
| `price_monitor.py` | 交易日每2分 9-16 | 腾讯API实时价→更新portfolio.json+price_events表 | 腾讯API→price_events表+portfolio.json(price更新) | main() → fetch_quote() → write_price_event() → update_portfolio() |
| `macro_context_collector.py` | 工作日每30分 8-15 + 周末 | 宏观新闻采集+实时红绿灯检测+指数采集 | akshare→macro_raw_news表+signal_news(macro_watch)+macro_risk_state.json+macro_context_log表 | main() → fetch_news() → detect_risk() → write_risk_signal() → 指数→DB |
| `divergence_detector.py` | 工作日每30分 8-15 + 周末 | 跨市场5项背离检测→风险信号 | 腾讯API→计算背离→signal_news(macro_watch) | main() → check_divergences() → write_signal() |
| `refresh_mtf_cache.py` | 交易日9:00 | 开盘前预填多周期K线缓存 | 腾讯API→multi_tf_cache.json | main() → batch_update_all() |
| `collect_evaluation_data.py` | 交易日20:30 | 六维评估原始数据采集 | 各API→evaluation_input.json | main() → collect_index/sector/fundamental/money_flow() |
## 三、策略与交易
| 脚本 | 调度 | 设计意图 | 数据流 | 关键代码 |
|------|------|---------|--------|---------|
| `stale_push_wlin.py` | 交易日每30分 9-15 | 自选买入区提醒+自动重评+换仓评估+T+2前瞻 | 读:decisions.json+portfolio.json+code_data → 推XMPP | main() → evaluate_swap() → check_tplus2() → push_to_xmpp() |
| `stale_detector.py` | 每30分(被stale_push_wlin调用) | 检测价格偏离/策略过期/RR<1.5→标记STALE | 读:decisions.json → stdout(WL_IN/DRIFT/STALE等) | main() → check_entries() |
| `per_stock_reassess.py` | 交易日9:00/12:00 + 盘中触发 | 个股策略重评(技术面→止损/止盈/买入区) | 读:decisions.json+腾讯API → 写:decisions.json | main() → reassess_strategy() for each code |
| `strategy-staleness-check.py` | 交易日9:00 | 策略时效性扫描→staleness_report.json | 读:decisions.json → 写:strategy_staleness_report.json | main() → check_age/drift/invalid() |
| `strategy_evaluator.py` | 每周六21:00 | 双维度策略评估 | 读:evaluation_input.json+decisions.json → evaluation结果+accuracy_stats | main() → evaluate_holdings/watchlist() |
| `advice_reconciliation.py` | 每周六20:00 | 建议对账:追踪建议执行情况 | 读:advice_timeline表+portfolio.json → 报告 | main() → reconcile() |
| `strategy_review.py` | 交易日20:00 | 三层复盘(信号/执行/综合),失败模式归因 | 读:decisions.json+腾讯API → 写:accuracy_stats表 | review() → evaluate_strategy() → classify_outcome() |
| `data_governance.py` | 每周六10:00 | holding_strategies去重+缺失策略检查+深套统计 | 读:DB+decisions.json → 归档+报告 | clean_holding_strategies() → check_missing_strategies() |
## 四、信号消费
| 脚本 | 调度 | 设计意图 | 数据流 | 关键代码 |
|------|------|---------|--------|---------|
| `xiaoguo_scanner.py` | 交易日每5分 9-15 | 全市场排行榜→新闻搜索→情感判断→signal_news | akshare→小果LLM→signal_news(xiaoguo) | main() → fetch_hot_board/rotating_board/sector_leaders() → check_stock() |
| `xiaoguo_signal_consumer.py` | 交易日每30分 9-15 | 消费xiaoguo信号→五维评估→加自选/关注/跳过 | 读:signal_news(xiaoguo)+腾讯行情 → 写:watchlist.json+标记processed | main() → quick_assess() → evaluate_and_act() |
| `macro_signal_consumer.py` | 交易日每15分 9-15 | 消费宏观风险信号→macro_risk_state.json | 读:signal_news(macro_watch) → 写:macro_risk_state.json+标记processed | main() → read_signals() → update_risk_state() |
## 五、自成长
| 脚本 | 调度 | 设计意图 | 数据流 | 关键代码 |
|------|------|---------|--------|---------|
| `branch_scanner.py` | 交易日每15分 9-15 | 分支状态变化检测→触发计数+剪枝候选 | 读:decisions.json+strategy_tree+当前情景 → 写:trigger_count+scanner_state.json | main() → evaluate_branches() → detect_changes() |
| `prune_branches.py` | 交易日21:00 | 低效分支剪枝(触发≥5次+成功率<50% | 读:strategy_tree.branches → 移入pruned_branches | main() → prune() |
| `hardcode_scanner.py` | 交易日17:25 | 扫描.py中大额数字硬编码 | 读:所有.py → 写:audit JSON | main() → scan_files() |
| `meta_growth.py` | 每个交易日12:45+0:45 | 分析git log修复模式→扩展hardcode_scanner规则 | 读:git log+growth_registry → 写:hardcode_scanner扩展点+growth_registry | main() → analyze_fixes() → extend_rules() |
## 六、LLM Cron(调度LLM分析,非纯脚本)
| 任务 | 调度 | 设计意图 | 加载skill |
|------|------|---------|-----------|
| 开盘简报 | 9:35 | 简短开盘简报(需操作票+分支理由+其他不变) | cron-report-format, analyst-knowledge |
| 收盘简报 | 16:10 | 当日回顾+明日关注+情景判断 | cron-report-format, analyst-knowledge |
| 策略评估-每日 | 21:00 | 六维分析+三阶段递进判断 | analyst-knowledge, strategy-reassessment, strategy-evaluation |
| 策略评估-每周 | 周六21:00 | 周度回顾 | (no_agent: strategy_evaluator.py) |
| 知识萃取-盘后 | 16:30 | 当日经验沉淀 | analyst-knowledge |
| 系统全局审计 | 17:30 | 审计报告解读 | analyst-knowledge |
| 宏观风险扫描 | 8:30/11:30 + 周末 | 宏观新闻→系统性风险评估 | macro-risk-scanner |
| 小果情感分析 | 16:00 | 持仓+自选新闻情感分析 | (LLM cron, 调xiaoguo API) |
## 七、暂停/废弃
| 脚本 | 原因 | 替代 |
|------|------|------|
| MoFin 盘前中/午后监控 | Dad说不需要盘中推 | intraday_health_check(静默采集) |
| 核心区间维护 | 被高频价格监控替代 | price_monitor |
| 知微洞察生成 | 被每日评估替代 | strategy_evaluation |
| 小果市场筛选-全市场 | 小果LLM不可靠 | xiaoguo_scanner(降级版) |
| 市场数据采集 | 整合到macro_context_collector | macro_context_collector |
| 市场精选推荐-每日 | Dad不需要 | — |
## 八、cron数量统计
| 分类 | 启用 | 暂停 | 合计 |
|------|------|------|------|
| 系统健康 | 5 | 0 | 5 |
| 数据采集 | 5 | 0 | 5 |
| 策略与交易 | 8 | 0 | 8 |
| 信号消费 | 3 | 0 | 3 |
| 自成长 | 4 | 0 | 4 |
| LLM Cron | 8 | 0 | 8 |
| 暂停/废弃 | 0 | 5 | 5 |
| **合计** | **33** | **5** | **38** |
+274
View File
@@ -0,0 +1,274 @@
# 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-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(策略评估/候选过滤等)逐个排查