From 7e06e43334bbeaf339a2cc1305355cc8f1fd5494 Mon Sep 17 00:00:00 2001 From: zlt Date: Fri, 28 Aug 2026 13:07:27 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=85=A8=E9=9D=A2=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DEVLOG.md | 63 +++++ app/core/action_engine.py | 31 ++- app/core/exec_timing.py | 8 +- app/core/planner.py | 83 +++++-- app/core/recon.py | 13 +- app/core/rule_gate.py | 19 +- app/core/signal_rules.py | 20 +- app/core/sizer.py | 33 ++- app/core/tradedays.py | 37 ++- app/repo/downstream_repo.py | 19 +- app/repo/pms_repo.py | 20 +- app/scheduler.py | 76 +++++- app/services/command_service.py | 111 ++++++++- app/services/dispatcher.py | 10 +- app/services/executor.py | 75 +++++- app/services/industry.py | 11 +- app/services/ledger_service.py | 325 ++++++++++++++++++------ app/services/macro_service.py | 75 +++++- app/services/market.py | 38 ++- app/services/proposal_service.py | 124 ++++++++-- app/services/signal_service.py | 76 ++++-- app/services/strategy_advisor.py | 36 ++- app/services/strategy_runner.py | 77 +++++- app/services/strategy_service.py | 39 ++- app/web/main.py | 79 ++++-- app/web/static/index.html | 101 +++++--- app/ws/runner.py | 49 +++- scripts/backtest_churn.py | 44 +++- scripts/backtest_entry.py | 66 +++-- scripts/check_db.py | 12 +- scripts/gen_keys.py | 13 +- scripts/migrate_archived_at.py | 7 +- scripts/probe_strategy_signals.py | 5 + scripts/report_strategy_score.py | 12 +- scripts/reset_ledger.py | 4 +- scripts/run_tests.py | 10 +- scripts/test_batch10_units.py | 10 +- scripts/test_batch11_units.py | 4 + scripts/test_batch17_units.py | 3 + scripts/test_batch19_units.py | 398 ++++++++++++++++++++++++++++++ scripts/test_batch2_units.py | 1 + scripts/test_batch3_units.py | 11 +- scripts/test_batch5_units.py | 12 +- scripts/test_batch6_units.py | 3 + scripts/test_batch7_units.py | 2 + scripts/test_wiring.py | 376 ++++++++++++++++++++++++++-- scripts/watch.py | 53 ++-- scripts/ws_smoke.py | 9 +- 48 files changed, 2297 insertions(+), 406 deletions(-) create mode 100644 scripts/test_batch19_units.py diff --git a/DEVLOG.md b/DEVLOG.md index e05e126..c113329 100644 --- a/DEVLOG.md +++ b/DEVLOG.md @@ -919,6 +919,69 @@ bionic 的 `pms_advisor`(支撑压力位算 PMS 买卖区间、`signal_type` --- +## 2026-08-28 · 全仓库审查后的一轮集中修复:47 个文件,585 例单测两端全绿 + +**做了什么** +以提交 654d88f 为基线做了一次全仓库审查(报告见 `CODE_REVIEW_2026-08-28.md`,已在 c058870 入库), +然后把审查确认的问题全部修掉。要点按危害排序: + +1. **联调单识别闸修通**:`ledger_service` 入账三分流读错列名(`parent_instruction_id`, + 真表叫 `parent_id`),SMOKE 联调单的假成交一直按真单入账。改对列名,并把 test_wiring + 桩里同样写错的键名与那句写反的注释一起改对——桩错得和代码一样,所以从前全绿。 +2. **成交回放游标改成 v2 时间游标**:原来按 order_id 字典序推进,乱序单号会被永久漏掉。 + 现在按「时间窗 + 已入账清单(seen)」推进,带 24 小时重叠回看与 48 小时清单裁剪; + 冷启动只对齐锚点不追认历史。`daily_settle` 开头先补一次回放再结算。 +3. **ws 入账逐笔推进**:每笔入账成功立刻 `inbox_mark`,中途崩溃只影响当笔(原来整批 + 最后一起标,崩一次重放整批)。费用记账对重复键容忍。剩余风险见「还欠着什么」第 1 条。 +4. **撤销链路修通**:撤销命令的在途指令必须逐条经 `executor.cancel_instruction` 撤回下游, + 撤不成的命令保持在途、单独列出可重撤(原来只把本端行标 CANCELLED,券商侧委托继续挂着)。 +5. **科创板 200 股最小申报统一进 `sizer.lot_of`**:planner 批次拆分、rule_gate 买卖校验、 + executor 当日配额、action_engine 四类动作与新建仓、signal 消化、strategy 两侧,全走同一口径。 +6. **风控置信度按文档 0~100 制归一**(`_norm_conf_pct`):原启发式把 1 当 100% 直接触发 + 自动清仓,方向恰好反了。 +7. **命令进度两处口径**:GATED 批金额不进完成分母(建仓命令不再必然拖成 PARTIAL); + 目标金额 0 但方案未出清(盘前一键清仓无现价)不判 DONE。 +8. **并发防护**:plan 认领锁(PENDING→PLANNING 条件更新)、四个调度任务加租约互斥、 + 指令/提议确定性编号撞唯一键自动重试、beat 任务 expires=50 防堆积。 +9. 其余:动作引擎同轮 TRIM×买入互斥;除权调整同步缩放已核销批次;交易日历按年探测降级; + 网格只买中枢下方;跟踪止盈部分卖一次性闩锁;策略买入暂停按来源分记;宏观失败路径保留 + 当日留痕;行业批量查询失败不写日缓存;市场取数失败不缓存;前端十来处(管理员按钮 + v-if、试算防连点、撤销警示展示、今日账本口径等);脚本与回测口径若干。 +10. **测试侧补桩补例**:FakeRepo 补上 pms_strategy 全套桩(原来一个策略函数都没有, + 所有策略接线在单测里靠 try/except 吞异常混过去);FakeRedis 改成真消费组语义 + (">"/"0"/PEL/ack,原桩恰好掩护了试算吞消息的真 bug);新增 test_batch19(17 例 + 审查回归);test_wiring 增到 66 例。全套 585 例。 + +**动了哪些文件** +app 下 26 个、scripts 下 21 个(含新增 `scripts/test_batch19_units.py`),完整清单看本次 +提交的 diff。`.env.example`、`config/settings.py`、鉴权与 cookie 策略这轮**特意没动** +(属于要拍板的策略项,见「还欠着什么」)。没有 DDL 变更,没有新增 env。 + +**部署方式** +tlai4090 那台:`git pull` 后 `make deploy`(源码打进镜像,必须重建),再 `make test` 看 +ALL SUITES PASS 且代码指纹与工作树一致。纪律照旧:**收盘后再部署**。 + +**真机判收** +容器(py3.11,与生产镜像同版本)与开发机本地(py3.10,pip 装齐依赖后)各跑一遍 +`python3 scripts/run_tests.py`,两端都是 ALL SUITES PASS(585 例)。部署后的判收三步: +① `make test` 全绿且指纹对上;② ws 通道在线时跑一次 `scripts/ws_smoke.py`,SMOKE 单 +必须**不**入账(联调单闸首次真正生效,账本里查不到 99.99 这类假价核销);③ 盘中盯一跳 +`signal_digest` 与 `intraday_exec` 的日志,无新报错。 + +**还欠着什么** +1. 单笔成交「入账成功→inbox 标记」之间仍非原子:恰好崩在这个窗口会重复入账一笔。 + 根治要给 trade 入账加 trade_no 唯一键(DDL 变更),等拍板。 +2. `.env.example` 里 `SIGNAL_REDIS_PASSWORD` 是真密码,建议轮换并改成占位符; + `PMS_ADMIN_PERMS=band:yhyqx` 维持联测拍板不动。 +3. `/api/params` 目前只把 `PMS_DISPATCH_MODE` 收进管理员白名单,其余自治类参数键 + (自主档位、总规模这类)要不要一并收,等拍板。 +4. cookie 的 Secure 标记、登出的服务端失效、鉴权默认拒绝的结构调整,这轮没动。 +5. GATED 批仍没有解锁机制(这轮只是让它不再拖坏进度结算),补解锁还是砍掉这层,等拍板。 +6. 审查报告第八节里"疑似待核"的几条(交接冷却文档口径与实现不一致、派发→止盈边沿)未处理。 +7. `.git` 下有几个 `index.lock.stale*` 空文件(云会话删不了文件只能改名避让),可随手删掉。 + +--- +

今天发生了什么 - · {{ ledger.length }} 条 + · {{ ledgerToday.length }} 条 {{ showLedger?'▲ 收起':'▼ 展开' }}