# MoFin 架构修复记录——holding_strategies 多写入方 + 快照污染(2026-08-19) ## 背景 老莫发现系统有"幽灵重复实现"问题:holding_strategies 被 8 个写入方 + write_holding_strategy 高频打快照,导致: - 参数互相覆盖(一个模块写的参数被另一个覆盖) - 快照污染(strategy_history 频繁写入,但多数是无意义的"参数没变也快照") - 并发隐患(同一时刻多个模块写同一条记录) ## 发现(深挖证据) ### 写入方清单(8 个模块都在写同一张表) ``` per_stock_reassess → 写策略参数(entry/stop/tp/rr/signal/full_analysis) promote_candidates → 提拔时写新策略 holdings_reconciliation → 对账写 branch_scanner → 分支扫描写 advice_reconciliation → 建议对账写 clean_watchlist → 清理写 prune_branches → 剪枝写 import_holding_xls → 导入写 ``` ### 快照污染量化(2026-08-19) - 今天 strategy_history **2290 条** - **66% 是同参数重复快照**(无变化也照拍) - 同票被反复快照:00020 同参数快照 **11 次** ### 权威保护失效 - **AUTHORITY 日志 0 条**(保护机制存在但从没触发过) - 权威保护只覆盖"信号降级",**不覆盖"参数覆写"**(entry/stop/tp/rr) - 导致 per_stock_reassess 重评成果被别的模块覆盖丢失 ## 修复计划 ### A+D:快照瘦身 - **快照前对比新旧内容**:参数没变 → 不快照 - **快照只留变化轨迹**:记录 diff(变化的字段)而非全量参数 ### B+C:权威保护加固 - **参数覆写保护**:per_stock_reassess 重评后 24h 内,其他 source_trigger 不得覆写参数 - **权威判断**:从"信号降级"扩展到"所有字段覆写" ## 最终修改结果 ### Commit 记录 | Commit | 内容 | |---|---| | `88885eae` | fix(P2-A+D): 快照瘦身——write_holding_strategy先对比新旧内容,无变化不快照(66%垃圾快照消除) | | `3cbd76f7` | feat(P2-B+C): 权威保护加固——per_stock重评24h内其他源不得覆写参数(解决参数覆盖反复出bug) | ### 关键改动 1. **mofin_db.py snapshot_strategy_history**:加变化检测,有变化才快照 2. **mofin_db.py write_holding_strategy**:权威保护扩展(参数覆写保护) ### 验证结果 - **快照瘦身生效**:连续无变化写不触发快照("参数无变化,跳过快照") - **权威保护生效**:per_stock 重评后 24h 内其他源无法覆写参数(AUTHORITY-24H 日志) ### 遗留问题(后续需处理) - **写入方收敛**:8 个写入方未真正收敛(per_stock_reassess 是唯一权威写入方,但其他 7 个模块仍在写)——需要后续设计"统一写入入口"或"写入锁" - **并发隐患**:WAL 模式 + busy_timeout=30s 理论上安全,但 8 个模块各自开连接仍有风险——需观察 ## 复盘要点 - **快照瘦身**消除了 66% 垃圾快照(今天 2290 → 预计 ~780 条) - **权威保护**防止参数被其他源覆写(per_stock 重评成果得到保护) - **遗留**:写入方收敛是下一步(需评估 8 个模块的功能必要性)