tradingSystem/docs/交接_每日选股计划完善_2026-10-15.md

279 lines
28 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 每日选股计划完善交接
2026-10-15,北京时间。状态先行:基座、155 桥与 155 模拟 PMS 均已部署并重建相关容器。
用户批准补齐旧排序配置,桥保持 transmission 与 CARD_SORT_BY_QUALITY=0;11:28:51 完成最终重建。
新版发布代码已生效。已安排 10-16 07:25 核验首个完整晨版;XXL 任务 137 已创建且停止,判收后启用五分钟修订及 PMS 提议重核。用户已取消额外五日模拟观察。PMS 三项差异已定位为成交双记,防双记代码于 12:02:54 部署;历史账本尚未修复,详细证据见末节。
正式契约与实现原理见同目录《每日选股计划完善方案与开发规格_2026-10-15.md》。
## 用户已决定的范围
允许 astock-kg、akg-factor-bridge、tradingSystem 联动。保留准入门槛及真实运行参数;
盘中评析变化发布完整修订;采纳前核验,只有排名变化不撤销。基座只提供研究,桥负责版本与计划,
PMS 负责组合和执行。择时能力不扩展,bionic_trader 只同步文档。用户本次明确批准部署和容器重启;
该批准不改变禁止机器重启和禁止自动切换排序、档位及仓位参数的边界。
## 工作区与原有修改
| 仓库 | 本轮开始的本地基线 | 本轮范围 |
| --- | --- | --- |
| astock-kg | codex/review-asof-export-20261012,a6d8c7c | 报告对象归档、固定引用接口、计划代理和今日页、离线测试、规格与交接入口 |
| akg-factor-bridge | main,ca46a95 | 确定排序、输入录制与重放、不可变版本、修订任务、只读查询缓存、复盘及契约测试 |
| tradingSystem | main,afec4f7 | 消费记录、顺序与核验、命令和指令来源、研究页面、回归及台账 |
| bionic_trader | main,ec533d9 | 仅方案和交接同名副本 |
PMS 初始已有 docs/复盘决定台账.md 未提交修改,以及方案讨论稿、probe_both_offline.py、probe_crash_live.py 三个未跟踪文件。
本轮仅在该台账末尾追加 018,不覆盖原内容。bionic 已见 .DS_Store、.claude/.DS_Store 修改和第三方接入指引未跟踪文件,均未触碰。
以上为本轮开始的基线,不能当作本轮部署版本。实际提交见末节;提交已逐文件选取,未带入其他会话文件。
## 四批实际交付
1. 排序:桥证据次级键与股票代码稳定收尾;无主题不限额桶;PMS 消费顺序进入自主扫描,信号插队留原因;命令保持原分配规则。
2. 版本:桥新增 plan_inputs.py、plan_versions.py、plan_refresh.py、plan_health.py,来源与配置冻结、文件锁、原子入口、固定晨版、父链、失败待核验、版本缓存。旧实时覆盖入口已删除,历史不现算。
3. PMS:新增 plan_revision.py、plan_recheck.py;received/consumed/rechecked 三类 JSON 记录;计划到提议及执行的来源关联;人工确认版本令牌及状态/原内容条件更新;停止按行数清理。PMS_PLAN_VERSION_RECHECK 默认 False,尚未启用。
4. 研究:基座 archive.py 按内容归档并提供 ref 查询;桥完整透传已有研究字段,保存变更;基座今日页和 PMS 候选/提议/持仓页显示材料时间、报告时间、论点与未知项;固定报告不可用时明确缺失。
新增任务五处登记已写入规格书:发布存储、XXL 独立步骤、run.py 手工入口、plan_health 日检、桥台账 064/PMS 台账 018 与本交接。
实际 XXL 平台任务没有创建;requirements 新增 chinesecalendar>=1.11,部署镜像须包含它。
## 预判与离线实测
所有命令均在本地执行;PMS 及桥测试在空临时工作目录、清理业务环境变量并禁止所有网络连接的护栏内运行。
本地 Python 使用已存在的测试运行时,不安装生产依赖、不连接任何库或模型。
| 预判 | 实测证据 |
| --- | --- |
| 基座引用确定、内容或材料变化产生新引用;代理保持指定版本及研究字段 | 全套 190 项 unittest,OK,退出码 0;含 6 项新增归档/代理用例 |
| 好转差同步改变判决、质地带和排序,晨版不变;查询不读取新评析 | 桥 test_daily_plan_contracts 32 个用例/断言组,OK,退出码 0,含真实 collect 的合成来源修订测试 |
| 重复发布幂等、并发只有一版、断电后保留完整旧版、孤立文件不可查、晨版指针可恢复 | 同桥版本回归;健康检查能发现超过十二分钟无检查及入口损坏 |
| 历史不得回源、当前参数不改旧消费、无主题和同证据强度确定 | 桥历史/缓存/排序断言组通过;缺档明确排除 |
| 单一名额优先给消费顺序靠前者;信号优先有原因 | PMS 全套隔离入口 ALL SUITES PASS;包含新第 38 批 15 项 OK |
| 仅排名变化保留,材料变化重评数量,旧确认拒绝,状态条件更新防重复采纳 | 第 38 批覆盖资格失效、版本不可用、缩量 300→100、旧令牌、SQLite 两线程竞争仅一次成功 |
| 120 交易日与引用保留不能被行数清理破坏 | 清理函数已变为不删除;15 项中有不允许触发 DELETE 的回归;真实留存天数未判收 |
| 页面可读、未知不伪造、旧确认返回后要求重新确认 | 三个 PMS 页面守卫退出码 0;基座 JSX 构建成功;本地浏览器显示中文研究字段及再次确认提示,两端无 JS error |
PMS 最终全套回归已包含第 38 批 15 项;另覆盖名次裁剪复核、历史清理、在途承诺变化和旧研判缓存失效。
页面改动也通过全部三个页面守卫。桥日历的 2026 年日期另以现有 chinesecalendar 1.11.0 离线验证一项,OK。
浏览器服务只监听 127.0.0.1,所有接口为合成数据,任何 POST 都返回过期确认提示;它不能连接或产生真实交易。
```bash
# 本地 · astock-kg 根;实测使用 Codex 附带 Python 运行时
PYTHONDONTWRITEBYTECODE=1 PYTHONPATH=backend /Users/baobao/.cache/codex-runtimes/codex-primary-runtime/dependencies/python/bin/python3 -m unittest discover -s backend/tests -t backend
```
```bash
# 本地 · akg-factor-bridge 根;测试入口复用 PMS 的配置隔离、断网护栏
/Users/baobao/.cache/codex-runtimes/codex-primary-runtime/dependencies/python/bin/python3 ../tradingSystem/scripts/unit_test_guard.py test_daily_plan_contracts.py
```
```bash
# 本地 · tradingSystem 根;既有离线测试虚拟环境
/private/tmp/pms-codex-20261012-venv/bin/python scripts/run_tests.py
/private/tmp/pms-codex-20261012-venv/bin/python scripts/unit_test_guard.py scripts/test_batch38_units.py
/private/tmp/pms-codex-20261012-venv/bin/python scripts/unit_test_guard.py scripts/test_page_copy_guard.py
/private/tmp/pms-codex-20261012-venv/bin/python scripts/unit_test_guard.py scripts/test_page_enum_guard.py
/private/tmp/pms-codex-20261012-venv/bin/python scripts/unit_test_guard.py scripts/test_page_wiring_guard.py
```
本次原始输出位于本机 /private/tmp/base-final.log、bridge-contracts-final.log、pms-final.log、pms38-final.log;
临时目录可被系统清理,不把它当长期验收库。需要复核时用上述离线入口重跑。
页面截图在本机 /private/tmp/daily-plan-ui/,内容均为假数据,不能充作生产读数。
## 尚未完成的生产验收
本地实现阶段没有生产操作。下列原上线步骤中的核对、提交和首批部署已完成,状态以末节为准:
1. 只读核对真实运行参数、部署 Git 版本、容器和模拟/真实实例身份;明确当前排序轴、档位白名单及仓位参数。
2. 整理仅包含本轮文件的提交,按仓库中文提交约定处理文档副本;容器操作前取得用户同意,避开北京时间 06:10 与 07:10。
3. 先部署兼容读取及留痕,再部署桥发布并核验晨版;最后在模拟实例启用五分钟修订与 PMS_PLAN_VERSION_RECHECK。
4. 按规格每天核对版本一致性、源到发布到消费的时刻、顺序、核验和重复指令。完成五个连续交易日后才宣布模拟判收。
真实时延、平台调度互斥、进程重启恢复、数据量下磁盘容量及全部生产接口形状仍待真机验证。
本地恢复测试不能替代真实机器断电/重启证据;不得以此请求或执行机器重启。
回退保留全部版本及账本,停修订并提供最后有效版本;不恢复历史现算或局部覆盖。
此前财报历史导出的来源修订不完整限制仍有效,本轮没有解除旧实验的研究资格限制或投资验证暂停记录。
## 2026-10-15 首阶段部署记录(桥切换前,后续以末节为准)
时间均为北京时间。用户本轮指令为“继续,完成部署和重启”。未重启机器,未操作数据库容器,未执行交易、提议采纳或账本修复命令。
| 对象 | 实际结果 |
| --- | --- |
| 178 基座,`~/project/astock-kg` | 功能提交 `148745a`,时间显示补正 `4a603d5`,均已推送 master 并快进部署。10:27:28 重建 API 与四组 worker,各一副本;10:33:02 前端补正后完成再次构建与重建。beat 及数据服务未动。 |
| 155 模拟 PMS,`/home/factor/project/tradingSystem` | 功能提交 `65d2940`、时间显示补正 `6a5ae12`,10:42:37 四服务完成重建。镜像 `sha256:ff022b05645d77bc7d204f3344036f41ad585de2e07d1ed5e2cd02e67c0abaf7`;镜像内与运行目录 Python 指纹均为 `eb4b4cbbff7f`。 |
| 155 桥,`/home/factor/project/akg-factor-bridge` | 正式运行仍为 `3d3f317`;待部署 `20431fe`,含功能 `5eac6f6` 及远程历史台账合并。候选镜像 `akg-factor-bridge-candidate:20261015` 已就绪,32 项断网契约测试 OK。未拉正式目录、未重建运行容器。 |
| 188 真实 PMS | 只读核对为 `51bd6dc`,只运行 web 与 ws;未更新、未重启。先完成模拟观察。 |
| bionic_trader | 仅同步方案及交接副本;未部署或重启服务。 |
**运行态判收为真机见过的部分:**
- 基座 API 与前端 HTTP 200,四个 worker 均回应 ping,六个重建服务重启计数为零。日检 17 项通过、0 错误、2 警告;警告为 10 月国庆休市日缺档。行情与传导日均为 10-14,投影为 10-15。
- 基座真实浏览器页面显示旧计划“追溯不完整”,缺失研究字段为未知;旧无时区时间改为“时区未记录”,不再误标北京时间。浏览器未见 JS 错误。
- PMS 在服务器临时目录和新镜像内分别运行配置隔离、禁止联网的完整回归;新镜像 42 批 `ALL SUITES PASS`,新增 15 例 OK。页面三道守卫通过。四服务健康、DB 连通、交易日历正常;QMT ONLINE,水位继续推进,待入账与在途出口委托均为零。
- PMS 自动调度已落 received 记录 54(10:42:50)和 consumed 记录 55(10:43:04)。消费记录保存 13 只实际顺序、过滤条件、参数及消费指纹;排序为 quality_bucket,rank_by_upstream=False。旧桥没有 decision,记录保留空值,未伪造版本。
- 部署前后既有参数一致:下发 ws、自主 full、新建仓 propose_only;仅强传导、TOP_N=50、上下游主题限额 0、盘中信号优先 True;总规模 200 万、总仓上限 0.70、单股上限 0.08、最多 40 只、行业最多 4 只/0.40。PMS_PLAN_VERSION_RECHECK=False。
**桥暂缓的具体原因。** 正式代码还没有 PLAN_RANK_AXIS 与 CARD_SORT_BY_QUALITY;容器环境和 .env 都没有这两项。旧行为是传导主轴加档内质地加减分。main 中此前未上线的提交默认改为 quality 与卡内质地排序。直接更新会违背本轮“不得自动修改线上排序开关”。已向用户请求确认仅补 `PLAN_RANK_AXIS=transmission` 与 `CARD_SORT_BY_QUALITY=0` 保持当前行为;未收到答复前不修改配置、不切桥容器。已有 `CARD_REQUIRE_STARTED=0` 和质地降档门保持。
**未判收。** 桥完整晨版、固定历史版本、真实修订与十二分钟传播、提议重新核验、并发采纳及连续五个交易日观察仍未判收。XXL 五分钟任务尚未建立,新核验仍关闭。不能在盘中补造 07:10 晨版;桥部署后等待首个真实晨版再启用后续阶段。
**既有异常。** PMS 部署前监视已出现 8—9 月出口委托缺父指令的历史记录。部署后轻量对账还报告 3 项差异,原因未在本轮定位;未改账、未清理。这些不能写成“全系统全绿”。
**保留与回退。** 基座服务器原有临时数据删改和未跟踪文件保留;155 的 deploy.sh 可执行位和未跟踪文件保留。PMS 原有台账 017、讨论稿及两个探针未随本轮提交。基座旧前端镜像为 `astock-kg-frontend:rollback-20261015-3207417`,PMS 旧镜像为 `pms:rollback-20261015-afec4f7`。155 源码挂载,回退必须匹配源码与镜像;任何回退均保留新版本及消费账本。
**证据位置。** 基座宿主 `~/akg_logs/daily-plan-deploy-20261015.log`、`daily-plan-postdeploy-check-20261015.log`;155 宿主 `~/pms_logs/daily-plan-deploy-20261015.log`、`daily-plan-postdeploy-watch-20261015.log`。镜像测试临时证据分别在 `/tmp/pms-dailyplan-20261015.SX6G8I/` 与 `/tmp/bridge-dailyplan-20261015.v6U7Wo/`,临时目录不能代替本交接中的实测摘要。
部署期间 155 SSH 曾返回 Exceeded MaxStartups,10:33 恢复并复用同一连接,未修改 SSH 设置。台账临时还原命令曾被自动审批拒绝;之后采用先完整提交再合并远程条目的方式解决,没有丢弃内容。
## 2026-10-15 桥部署完成及最终核验
时间均为北京时间。用户明确答复“补齐旧排序配置,保持当前行为”。已在 155 桥 .env 补入
`PLAN_RANK_AXIS=transmission` 与 `CARD_SORT_BY_QUALITY=0`。原配置备份保存在
`~/akg_bridge_logs/bridge.env.before-20261015`,未将配置或凭据提交到仓库。
桥 11:21:06 首次重建后,继续修复旧格式计划直接读取的兼容问题,提交为 `fe443f6`。
原底层时间守卫还会因代码哈希变化拒绝旧计划;HTTP 缓存入口原本已正常返回 200,不能把它记成线上接口中断。
修复后直接读取也保留有效期内旧计划,仍保留原代码版本、时间约束和追溯缺失标记,不回源、不伪造新决策版本。
本地断网契约测试 33 个用例/断言组通过。仅含已提交源码的候选镜像内同样 33 组通过,才切换容器。
首次镜像测试因护栏挂载层级错误在入口退出,未计为通过;修正挂载后重跑成功。
最终 `akg_factor_bridge` 于 **11:28:51** 启动,运行镜像为
`sha256:107929c3366d271eb762aee8687dac56dbabcae134d7856770dc6fcd2af7639b`。
可读标签为 `akg-factor-bridge-candidate:fe443f6`,旧镜像保留为 `akg-factor-bridge:rollback-20261015-3d3f317`。
11:31 核对桥及 PMS 四服务全部 running,重启计数均为零。基座六个已重建服务也持续运行。
| 验收对象 | 真机读数 |
| --- | --- |
| 桥有效配置 | PLAN_RANK_AXIS=transmission,CARD_SORT_BY_QUALITY=False,CARD_REQUIRE_STARTED=False,CARD_COMPANY_QUALITY_GATE=True。 |
| 最新与日期查询 | `/plan` 与数据日 2026-10-14 查询均 200;两次主榜前 50 名查询分别约 1.47 秒、0.84 秒,前五名相同。缺失历史与非法版本均 404,不重装配。 |
| 旧计划保留 | 部署前后及查询后 `plan_2026-10-14.json` SHA256 均为 `f849119c78b0f3ff780c69fa111a315d4c56a70ff3651e9347eabf3c2cd457cb`。全量主榜 551、观察 595,decision 为空。 |
| 修订手工入口 | `python run.py plan-refresh` 返回 no_morning,未补造晨版,旧计划文件未变。健康提示“旧快照,追溯不完整”,为阶段内预期提示。 |
| PMS 实际读取 | 11:30 以真实参数只读拉取 300 条主榜、100 条观察档,日龄检查通过。没有触发扫描、采纳或执行。 |
| 自动留痕 | 正常调度于 11:23:02 写 received 56 与 consumed 57。与切换前 consumed 55 比较,13 只完整入选顺序、参数、rank_mode 全同;过滤记录变化另存新消费指纹。旧记录未改。 |
| 最终顺序 | consumed 57 前五为 002979.SZ、300274.SZ、002518.SZ、688147.SH、601138.SH;消费指纹 `227b078ec947375b4f9a4d1684aa8bbc49117d7ac06aec69a8e442f9dfa9ebd8`。 |
| PMS 控制与健康 | ws、propose_only、信号优先 True、总规模 200 万、总仓 0.70、单股 0.08 保持;PMS_PLAN_VERSION_RECHECK=False。/health 为 200、db_ok=True、calendar_degraded=False。 |
| 基座浏览器 | 桥切换后今日页正常显示旧计划、追溯不完整、截止时刻未知和旧时间未记录时区;浏览器错误数 0。 |
本阶段完成的是部署、兼容读取、消费留痕和现有行为核对。既有 07:10 晨间入口下次运行才形成首个完整晨版,
预期最早为 10-16;必须实际核验后,再配置 XXL 五分钟任务并在模拟仓开启新版核验。
本轮未新增宿主 cron,也未建立自动检查或自动启用任务。XXL 平台任务尚未创建,后续需从现有平台入口接续。
十二分钟传播、新版提议重核及五个连续交易日观察仍未判收。188 真实仓和择时服务未部署、未重启。
前节记载的 PMS 历史异常与轻量对账三项差异继续待查,本轮没有据此改账或清理。
桥日志在宿主 `~/akg_bridge_logs/daily-plan-deploy-20261015.log`、
`daily-plan-compat-tests-20261015.log`、`daily-plan-postdeploy-check-20261015.log`。
本地补充回归为 `/private/tmp/bridge-deploy-compat-20261015.log`。PMS 最终读取追加到原 postdeploy-watch 日志。
此前连接问题出现在开发机到 155:2280,尝试从 178 到 155 也遇到相同限流;已恢复,之后部署持续使用开发机到 155 的 SSH 连接。
## 10-15 12:05 接续决定、差异根因及修复部署
用户最新要求:先排查 PMS 三项对账差异,安排下个交易日核验首个完整晨版,通过后启用五分钟自动修订与提议重核。
当前实例本身就是模拟仓,不再增加五个交易日观察。本条覆盖前文、规格书与台账 064 的五日上线等待要求;
版本一致性、顺序、幂等、故障恢复和十二分钟传播的技术验收继续保留,五/十/二十日策略复盘口径不变。
### 三项差异
| 股票 | PMS / QMT 数量 | 核对结果 |
| --- | --- | --- |
| 002050.SZ | 800 / 700 | 同一委托重复买入 100。WS 为 73+27 股,汇总表又以 31.560 记 100;重复批次 1361。 |
| 002979.SZ | 0 / 1900 | 四个委托的 1300+500+100+100 股被 WS 与汇总各扣一遍,账本下限截断为零。 |
| 688100.SH | 2400 / 1400 | 700 买、400 卖、700 买被双记,净多 1000;重复部分还被误认外部 BASE。 |
八个委托的 instruction_id/order_id、broker_order_id/qmt_order_id 均逐笔相同,WS 全部 processed=1,
汇总全部已在 replay cursor.seen。原因是 ledger_service.replay_fills 的“汇总只兜外部成交”停留在注释,实际没有归属排除。
差异发生于本次计划部署前。另有 ws 与 trading_position 表的两个代码覆盖差异(562590.SH、688825.SH),
属于事实源分歧提示,与上面三项账本数量差异分列;本次仍按现行 ws_first 规则。
修复 e9afc7a 已推送并在 155 拉取。按出口身份分流,已归属 ws 的汇总只留跳过记录和 seen,等待逐笔;
身份读取失败或矛盾不落账不记 seen。无归属的外部人工成交保持原流程。新增 12 例,开发机隔离全量 43 批、
155 候选镜像 --network none 全量 43 批均通过。真机只读分类覆盖八笔实际委托,全部正确命中。
12:02:54 北京时间重建 pms-web、pms-worker、pms-beat、pms-ws,镜像为
`sha256:c17af17aeb09d151bbe932395b879add1ed336b16739703f9acc594bee30b3f1`,标签 `pms:replay-fix-e9afc7a`,
镜像与运行工作树 Python 指纹同为 `cc988cd762bf`。回退标签 `pms:rollback-before-replay-fix-20261015`。
12:04:59 /health 正常,db_ok=True、calendar_degraded=False,QMT ONLINE,seq/acked_seq 都为 1226149,
待入账与在途出口委托均为 0。ws、propose_only、信号优先 True、200 万、0.70、0.08 及完整计划筛选参数未变,
PMS_PLAN_VERSION_RECHECK 仍 False。午休正常返回 not_in_session;修复后自然成交回放尚待真实事件判收。
历史账本没有直接调平。日终 RECON 调数量不能还原被污染的成本、已实现盈亏和指令执行进度,不能声称账已修好。
需根据逐笔与可用历史批次快照另做可逆修复设计;证据不足部分显式保留不确定性,不虚构准确历史。
详细排查与修复规格在 tradingSystem 的 `docs/PMS三项对账差异排查_2026-10-15.md`,台账 019。
原始证据位于 155 `~/pms_logs/reconciliation-evidence-20261015-before-fix-v2.json`(340982 字节,
SHA256 `8e0badf4d771fbf8a3227250c6cc2c2bf3c8234dda2fc33a31f0ab00920f5501`)。首次导出的空文件是失败初稿,v2 才有效。
部署、候选镜像测试、判收分别见 `~/pms_logs/replay-fix-deploy-20261015.log`、
`replay-fix-tests-20261015.log`、`replay-fix-postdeploy-20261015.log`。服务器原有 deploy.sh 修改与未跟踪文件未覆盖。
### 已建立的接续入口
- Codex 心跳 `automation-2`,名称“每日计划首个晨版核验与启用”,ACTIVE,按北京时间每天 07:25。
首次预期 2026-10-16,155 日历确认该日为交易日且未降级。不是业务修订调度,不替代 XXL。
完成启用与必要技术验收后暂停;等待期间只报告实质变化,不能加回五日观察条件。
- XXL 平台 `http://192.168.16.165:8080/xxl-job-admin`,通用执行器,任务 **137“每日选股计划五分钟修订”**。
已复制既有 08:45 区制任务的通用 HTTP GLUE(Python3) 脚本并只改入口步骤为 plan-refresh;
A股交易日模式、07:20—15:10、间隔 300 秒,回调开启。已有鉴权值沿用,不写入文档。
当前 **已停止**,没有执行一次、没有提前启用;以后找到 137 启用即可,不重复创建。
- 原 07:10“知识图谱每日股票池生成”与 08:45“知识图谱每日股票池重检索”均保持启用,未改配置。
平台记录 10-15 07:10 构建成功,耗时 1 分 28 秒;08:45 成功,耗时 3 秒。
07:25 首版验收要逐项核对:实际行情日与今日 cutoff、schema/decision、morning 指针、冻结输入及有效配置、
全量名次、最新/日期/固定版本查询一致、旧版本不变、缺档不重构。通过后启用任务 137,核对下一次触发与回调结果,
随后仅用 ParamStore.set_param 打开 155 的 PMS_PLAN_VERSION_RECHECK。保持其余运行参数。
消费必须来自正常 received/consumed 记录,预览读取不充作实际消费。自然新评析才能测实际传播时延;
不得为验收采纳提议或制造交易。若该时点还没有消费或自然修订证据,调整同一心跳后续核验时间继续。
当前历史账本差异不能被记录为已解决,但不以额外模拟天数代替具体技术验收。
## 10-15 12:40 历史账本修复完成与判收
本节取代前文“三项历史差异尚未修复”的当前状态。用户明确批准先备份、逐笔核对并恢复数量、成本、盈亏及指令执行进度。已在 155 模拟仓完成,188 未操作。
### 备份、部署和写回
功能提交 `0871885`,Python 指纹 `01251315d8d1`。本地配置隔离禁网和 155 候选镜像 `--network none` 均通过全部 44 批测试,新批次 40 有 21 例。未将用户原有未提交台账 017、讨论稿或探针纳入提交。
先于任何写账保存完整备份,再在午间暂停 beat/worker,拉取已提交版本并重建四容器。web/ws 于 12:37:27 启动,worker/beat 于 12:39:33 恢复。四容器同镜像 `sha256:22422dc46784ff87c8ccfc6f9a2ae05ba8ee111eb18e3f1a369f9d913279ff0b`,标签 `pms:history-repair-0871885`;上一镜像留为 `pms:rollback-before-history-repair-20261015`。
155 宿主 `~/pms_logs/` 的证据如下,JSON 文件权限为 600。
| 文件 | 内容或 SHA256 |
| --- | --- |
| historical-repair-backup-20261015-1225.json | 初始完整备份,81cfc59600d7ca07de7fc4b83b7c5b153719d0ea248be21fd9d910bcfc32e636 |
| history-repair-before-write-20261015.json | 12:37:55 写前完整备份,d1b3eeaede0ea418ec071fa593ee6a98177a55433ee0201b502ff80ff6226f02 |
| history-repair-preview-20261015.json | 逐笔映射、每笔卖出分配、逐日数量金额、全部目标列和原值 |
| history-repair-after-write-20261015.json | 写后完整备份,8463f0da2e1d152e7606c38607918b05555481f4ecbd15b482a326951ebd3606 |
| history-repair-apply-20261015.log / history-repair-verify-20261015.json | 实际提交及独立读回判收,全部检查通过 |
| history-repair-build-20261015.log / history-repair-tests-20261015.log / history-repair-deploy-20261015.log | 候选构建、断网测试及容器重建 |
修复批号 `HIST_c036a684cab040387321396e`。同一事务校验原行、完整逐笔和有效参数,修改 122 行,保存 122 条逐行原值审计和 1 条完成记录。再次执行同一备份返回 already_applied,审计数仍 122+1。原始成交、回放游标、方案、命令、手续费流水、旧日报净值及其他股票原行均未被改写。
### 实际恢复结果
| 股票 | 恢复数量 | T+1 可卖量 | 摊薄成本(元) | 账期已实现盈亏(元) | 可追溯起点 |
| --- | ---: | ---: | ---: | ---: | --- |
| 002050.SZ | 700 | 600 | 44.109 | -6762.70 | 2026-09-22 |
| 002979.SZ | 1900 | 1900 | 55.060 | -1684.25 | 2026-09-21 |
| 688100.SH | 1400 | 0 | 23.704 | 16.86 | 2026-10-14 |
成本沿用 PMS 的含已实现盈亏摊薄口径,盈亏为原批次核销规则下的毛额,不含费用。134 笔成交对应 61 个真实买入批次;33 个重复汇总或 RECON 批次归零留痕,原 ID 保留。逐笔成交与 39 个留存子单的累计数量一致,累计均价差异最大 0.004964 元,处于 QMT 两位小数舍入范围内;其中 2 个子单属于 688100 的已闭合旧轮次,未混入当前账期。
24 条父指令恢复实际成交量、成交均价,并在 progress 中增加逐笔证据、原进度、剩余量及超额量。七条原误判 CONFIRMED 的指令改为 CANCELLED,含义为“历史修复暂停剩余执行”;其子单都已终态,无需撤单,也没有向 QMT 发送撤单或新单。仍在执行的 002050 DCA 指令实际进度为 100/300,保持原生命周期。
002979 的 `STR20261012093212_002979SZ_g` 目标 1300 股,两个真实子单累计买入 2600 股,保留超额 1300 的事实。这是实际执行异常,无法通过删账撤销,后续须单独排查历史出手并发/重试链路;本次没有反向交易。688100 活跃网格第 3 档恢复为真实剩余 1000 股,批次成本 23506.51 元、均价 23.50651;原仅记 700 股/16471 元。已取消的旧策略未恢复。
12:40 真机健康 200、db_ok=True、calendar_degraded=False,QMT ONLINE、last_seq=acked_seq=1226583、last_error 为空,待入账 0。独立对账返回 diffs=[]、errors=[]、severity=OK。历史 streak=14 是尚未到日终重置的旧计数,不是仍有三项差异。既有 ws_first 源覆盖警告仍为 562590.SH、688825.SH 两票,单列保留,不混同已修复差异。
### 明确不能还原或未判收的部分
1. 134 笔逐笔费用为空,无法还原真实扣费与净盈亏;费用流水原为空,未补零冒充真实费用。
2. 缺完整盘中行情和当时账本,历史安全垫峰值无法准确恢复,保留原值并标明限制。
3. 688100 的 08-27 买 800、09-01 卖 800 的旧轮次可核对成交毛差 330.47 元,但原父指令和批次已不在当前账本;无法恢复原始批次分配与完整决策链,不把该旧轮次利润写进本轮。
4. 历史日报和全组合净值受旧错账影响,缺少重建全组合所需的全部原始状态,本次保持原档案。修复预演提供逐票逐日数量、成交净额和批次盈亏,不能将其冒充当时实际报表或已修复全历史绩效。
5. 防双记代码的自然新成交判收仍需真实事件;不得制造成交来验收。真实超目标成交和两个事实源覆盖分歧仍单列待查。
### 后续和回退
`automation-2` 已更新修复结论,保持 ACTIVE 和北京时间 10-16 07:25。首个完整晨版通过后启用已创建且停止的 XXL 137,再开启 155 的 PMS_PLAN_VERSION_RECHECK。当前该参数仍 False,ws、propose_only、旧传导排序及档位和仓位参数保持;不增加额外五日模拟观察。版本一致、顺序、自然传播十二分钟、失败守成和无重复指令仍须实际事件判收。
手工入口 `scripts/repair_ledger_history.py` 开头列有 backup/preview/apply/rollback 跑法。回退须读取审计并比较修复后原行,后续有新交易或状态变化会拒绝覆盖;不得通过切旧镜像恢复旧账,更不得直接用旧备份覆盖新的成交。回退保留新旧审计与计划版本。