tradingSystem/docs/开发接续_2026-10-12.md

157 lines
15 KiB
Markdown
Raw Permalink 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.

# PMS 开发接续与 Codex 迁移记录
日期为 2026-10-12,北京时间。开发入口已迁到根目录 `AGENTS.md`。本次整理完成了仓库规则与工作上下文的接续,下文第一至六节保留接手时快照,修复整合见第七节,部署结果见第八节。
用户在本次会话确认两件事。第一,原定 10-09 的服务器只读核对与离线探针均未执行。第二,先以当前仓库为准,不另找旧 Claude 会话资料。
## 一、当前开发基线
本机主分支是 `main`,提交为 `fbe00144137c9b03a51c90c00e6b1bf1ccda3a77`,日期是 2026-09-20。本次用 `git ls-remote` 直接核对代码服务器,远程 `main` 与本机相同。不能据此判断服务器运行的代码版本。
9 月 20 日交接里的模拟仓读数和真实仓版本都是历史快照。10 月 8 日命令结算分支的开发记录还记了一次隔离容器测试,但不是新版本部署。155 和 188 的当前运行状态均未在本次会话核对。
接手时已有以下未提交工作,本次保持内容不变。
| 文件 | 内容与状态 |
|---|---|
| `docs/复盘决定台账.md` | 已修改,新增台账 017。记录 09-22 把上游排序开关设回 False,等待约定时点再开。后续是否已重开,当前材料没有结论 |
| `docs/方案讨论稿_量化平台接入与急跌满仓预案_2026-10-08.md` | 未跟踪的讨论稿。已记第一轮反馈,仍有待拍板项 |
| `scripts/probe_crash_live.py` | 未跟踪的盘中只读探针。用户确认尚未执行 |
| `scripts/probe_both_offline.py` | 未跟踪的合并离线探针。用户确认尚未执行 |
根目录 `AGENTS.md` 在接手时也已存在但未跟踪,内容基本是 `CLAUDE.md` 的改名副本。本次在该文件上完成迁移。
## 二、接手时的两个未合入修复
两个工作树均位于 `.claude/worktrees/`,都应保留。每个工作树还有自己的未跟踪 `AGENTS.md`,本次未修改。向远程查询下面两个完整分支名时没有返回同名引用;不要删除本地分支或工作树。
| 分支 | 提交 | 改动 | 历史验证记录 |
|---|---|---|---|
| `claude/happy-almeida-0b0343` | `ead20bf` | 命令结算线按目标金额与方案金额取较小者,再扣未解锁批次金额。解决取整零头导致命令不能完成的问题 | 分支 `DEVLOG.md` 记载开发机与 155 断网隔离容器通过,新增 10 例。未部署,未真机判收 |
| `claude/great-herschel-e57674` | `01dbcdb` | 一字板方向结合昨收判定。一字涨停的卖单不再误按跌停顺延,一字跌停的买单继续拦截 | 分支 `DEVLOG.md` 记载开发机通过,新增 19 例。未部署,未真机判收 |
这些是旧会话留下的验证记录,本次没有重新运行这两个分支的业务测试,也没有完成代码复审。
合并之前有三件事要处理。
第一,两条分支都新增了 `scripts/test_batch35_units.py`,并改了 `scripts/run_tests.py` 和 `DEVLOG.md`。合并时必须为两批测试分别登记,不能用一边覆盖另一边。历史记录中的测试总数也不一致,要在最终合并版本上实跑统计。
第二,命令结算分支留下了未解锁批次的收尾问题。命令判为完成后,GATED 批仍可能阻挡策略自动挂载,而完成的命令不能再用撤销路径清理它们。该分支也改变了方案本身不足目标时的完成判定,缺口保留在进度里。这些行为需要在复审时明确。
第三,一字板分支没有解决盘中才封住、最高价不等于最低价的跌停买入问题。昨收所用 `close_qfq` 的复权基准也还需核实。不能把这次修复描述成已经补齐所有跌停买入保护。
## 三、接手时发现的问题
### 接手时的单测隔离缺口
`scripts/test_wiring.py` 的 `install_fakes` 没有替换 `consensus_stat_repo`。`proposal_service.scan_and_route` 会调用 `consensus_stats.record_round`,后者仍有真实仓储写路径。
9 月 20 日交接记录了测试污染 `pms_consensus_stat` 的四行假数据。本次只核对了代码缺口,没有连接数据库确认这些行的现状。修复并验证隔离前,不在带真实配置的服务器容器里执行全量测试。清理历史数据另列具体行,再按仓库纪律确认后操作。
### 排序轴协同要补当前读数
台账 017 已记录 09-22 关闭 `PMS_PLAN_RANK_BY_UPSTREAM`。原计划随后重新打开,并把 `PMS_PLAN_TIERS` 调为两档,但当前材料没有执行结果。10-16 前后的四周复核仍是历史方案中的计划,不能先假定切轴已完成。
后续核对至少需要三个事实:当前开关和档位白名单、上游计划的 `rank_axis`、名册快照的 `rank_mode` 与名次顺序。
### 时间口径有待校准
旧规则把数据库时间列统一写成 UTC。代码里 PMS 部分自有列是 `DATETIME`,由容器内 `datetime.now()` 写入,容器配置为北京时间。两个新探针都注意到了这个差异,准备通过心跳或快照校准。
探针尚未执行,不能把代码推断写成真机结论。后续读数要按具体列核对写入方式,并保留时区标注。
### 旧链路问题单独排期
9 月 20 日记录的开盘研判不可用、网格持仓对账差异、页面人工验收、盘中确认开关和真实仓准备包都还在旧交接中。10 月 8 日讨论稿记载当轮不查旧链路、宏观档位不改。本次迁移没有替这些事项重新排期或执行。
## 四、两个新方向停在哪里
量化平台接入仍处于讨论阶段。已有方向是先做接入契约、只读探针、每日快照和影子记录。量化因子最终作为第二意见还是独立来源,尚未形成最终执行方案。
偏冷区满仓操作也仍是讨论稿。尾盘预估、分档节奏、退出规则、名单篮子和参数恢复范围都需要继续讨论。此前的数字是方案初值,不是当前运行参数。
原定 10-09 的两项探针没有运行,不能跳到依赖探针结果的回测和实施结论。重新执行前需要重定时间,按脚本检查实际实例、查询范围与运行负荷。旧日期不会自动顺延成今天的容器操作授权。
## 五、本次迁移具体做了什么
`AGENTS.md` 成为唯一开发规则入口,保留三条铁律、单表访问纪律、ParamStore、密钥保护、双实例和部署边界。可读中文与页面偏好直接写入该文件,移除了不存在的 `.Codex/output-styles/readable-chinese.md` 引用。页面检查补全为枚举、接线、文案三道守卫。
`CLAUDE.md` 改为兼容入口,明确要求先读 `AGENTS.md`。历史设计文档与交接中的 Claude 名字保留,避免把历史记录改写成新事实。
`.gitignore` 排除旧 Claude 嵌套工作树,`.dockerignore` 排除开发代理本地目录,避免嵌套源码与本机配置进入运行镜像。工作树和分支本身仍保留。
当前仓库没有可迁移的 `.claude/settings.json`、项目 MCP 配置或项目技能目录。本次没有创建无实际用途的 Codex 配置,也没有修改全局账号设置。
Codex 使用仓库中的 `AGENTS.md` 加载项目规则,依据见 [官方项目指令文档](https://learn.chatgpt.com/docs/agent-configuration/agents-md)。本次会话也已实际收到根目录 `AGENTS.md`。以后在新会话中可要求先复述项目三条铁律和当前接续事项,核对读取的是新入口。
迁移改动目前保存在本地工作区,尚未提交或推送。后续提交必须同时包含 `AGENTS.md` 和 `CLAUDE.md`,以及它们引用的本接续记录,不能只提交兼容入口。业务讨论稿、探针和台账的原有修改应另行安排提交。
## 六、迁移阶段的验证与后续安排
本次验证限定为开发机静态检查。三道页面守卫均已通过,`git diff --check` 通过。两个探针仅做语法解析,未执行。迁移文档的本地链接检查通过,原有台账、讨论稿和两个探针的文件摘要与接手时一致。
三道页面守卫可以用以下命令复核,预期各自输出通过并以状态码零退出。
```bash
# 开发机,仓库根目录。
python3 scripts/test_page_enum_guard.py
python3 scripts/test_page_wiring_guard.py
python3 scripts/test_page_copy_guard.py
git diff --check
```
本次没有运行全量业务回归,没有部署服务器,也没有改运行参数。服务器状态仍标为未判收。
建议下一步先修复测试隔离缺口,再复审并整合两个现成修复;探针另定执行窗口,取得读数后继续两份方向的方案讨论。真实仓上线继续按 `REAL_TRADING_DEPLOY_PLAN.md` 的准备边界处理。
## 七、修复与整合进展
用户已要求先修复单测隔离,再复审整合两个分支,并择机部署。用户进一步确认,命令完成时取消未解锁批次。当前整合分支为 `codex/test-isolation-integrate`。
两个原始修复已按代码差异整合,保留原分支和工作树。`ead20bf` 的十例测试改为第三十六批,`01dbcdb` 的十九例测试改为第三十七批。第三十五批留给隔离回归,避免同名测试覆盖。
测试隔离修复补齐了 `consensus_stat_repo` 的四个内存入口,以及账本扫描、夜间定性、量比和资金流水等漏桩。全部测试经独立进程清除业务环境变量,在空临时目录运行,并在套接字连接前拦截外部访问。联网异常即使被业务代码捕获,进程仍返回失败。各批直接运行时也安装此护栏。
命令结算按命令目标与方案金额中的较小值计算,扣除未解锁批次。没有任何方案金额的非零目标不会误报完成。完成前先保存扣除金额,再把该命令的 GATED 方案改成 CANCELLED,最后写命令完成状态。写入失败时保留执行状态并报错,下一轮可按保存的金额继续结算。目标金额、缺口和取消的方案记录都保留。此逻辑只处理本次及后续结算,不批量改写历史已完成命令。
一字板修复按核实过日期的昨收识别方向,保留昨收不明时的保守回退。复审补了空值、陈旧值和无效价格不缓存,避免短暂失败影响全天。它仍只识别最高价、最低价和现价一致的一字板。盘中才封板的情况以及因子库前复权基准仍是原有边界,不能写成已经覆盖。
开发机用临时 Python 3.9 虚拟环境按 `requirements.txt` 安装依赖,经 `scripts/run_tests.py` 全量回归,41 批、983 例通过,包含三道页面守卫。旧总数 904 已过期,接手时实际为 941 例,本次新增 42 例。日志保存在开发机 `/tmp/pms-integrated-fifth.log`。容器运行时是 Python 3.11,仍需服务器断网容器验证。
155 已做主机与容器元数据只读核对。仓库在 `/home/factor/project/tradingSystem`,主分支仍为 `fbe0014`,四个 PMS 服务运行,网页健康检查通过。四个容器均有源码挂载,启动时间为 2026-09-18 11:51:59 北京时间,由 Docker 的 UTC 值换算。服务器有本地文件和 `scripts/deploy.sh` 的修改,部署时保留。188 未操作。
部署候选不含原有台账、讨论稿及两个探针。上线前需确认实例的运行参数与在途队列,在 155 断网临时容器通过后再重建镜像、重建四个 PMS 容器。本次没有 DDL 和依赖变更,无需重新建表。部署结果见下一节。两项修复在真实行情中的触发行为仍未判收。
## 八、155 模拟仓已完成部署
2026-10-12 北京时间 12:16:07,155 的四个 PMS 服务完成重建。用户已明确批准 155 条件部署,并确认允许推送到当前 `origin`。主分支和整合分支均已推送修复提交 `55e2ed6aa32012d4c09649836120c0622c19624f`。原始 Claude 分支和工作树仍保留。部署后的本节与流水账作为另一次纯文档提交保存。
部署前先在服务器临时目录展开该提交,通过 `docker run --rm --network none` 运行完整测试,没有生产 `.env`。实际使用 Python 3.11.9,41 批、983 例通过。随后在正式项目目录快进代码,执行 `make build` 和 `make up`。没有执行建表,没有修改运行参数,没有操作 188。155 的 `scripts/deploy.sh` 只有服务器本地可执行位修改,已原样保留。服务器原有未跟踪文件也保留。
运行态判收为真机见过。四个容器均为运行状态,重启计数为零,启动时间均为上述北京时间。四者镜像相同,为 `sha256:63e786de910adc5dd5ded41368922114cc40dc759dc6b472a5fcda60b032ee45`。另外用无挂载临时容器读取镜像内代码指纹,结果为 `18d7286b926a`,与提交快照、服务器工作树一致,因此没有仅凭源码挂载后的指纹一致判断上线成功。
12:16 至 12:18 的检查见网页健康状态为 `ok`,数据库连通,交易日历正常。QMT 通道为 `ONLINE`,回报水位继续推进,无重同步标记,无在途子委托,无待入账回报。四服务启动后日志没有 ERROR、CRITICAL 或 Traceback。调度正常完成任务,午休交易任务按 `not_in_session` 跳过。部署后的 `make test` 再次输出 `ALL SUITES PASS`,41 批、983 例通过。
本次只读确认的运行参数如下。这是 2026-10-12 午休的快照,后续仍以页面和参数表为准。
| 参数 | 读数 |
|---|---|
| `PMS_TABLE_PREFIX` | 空,模拟仓自有表 |
| `PMS_DISPATCH_MODE` | `ws` |
| `PMS_QMT_WS_ENABLED` | `True` |
| `PMS_AUTONOMY` | `full` |
| `PMS_SELF_DECIDE` | `full` |
| `PMS_GLOBAL_BUY_HALT` / `PMS_GLOBAL_EXEC_HALT` | 均为 `False` |
| `PMS_PLAN_RANK_BY_UPSTREAM` | `False` |
| `PMS_PLAN_TIERS` | `强传导` |
部署时没有 GATED 方案。尚未终态的两条父指令中,一条没有下发子委托,另一条已有子委托为 FILLED。它们没有被部署脚本撤销或改写。新结算与一字板修复在真实行情中的触发效果仍未判收,不能用测试通过代替实盘事件判收。
155 的回退引用为 `codex/predeploy-20261012`,指向 `fbe0014`。旧镜像保留为 `pms:rollback-20261012-fbe0014`。若需要回退,要同时切回该源码和旧镜像,再重建四服务;155 挂载源码,只换镜像不能回退。回退不是本次已执行的动作,不对账本做逆向写入。
开发机证据日志为 `/tmp/pms-integrated-fifth.log`、`/tmp/pms-deploy-55e2ed6.log`、`/tmp/pms-postdeploy-tests.log`。服务器部署前断网回归日志为 `/tmp/pms-codex-55e2ed6.wfe1Da/test.log`。这些临时日志不是长期归档,关键结果已记录在本文和 `DEVLOG.md`。
另核实宿主机系统时间为 UTC,容器时间为北京时间。部署脚本的窗口判断已显式用北京时间。PMS 通道心跳的 DATETIME 原值与容器北京时间同步,不能再给该字段一律加八小时;其他数据库时间列仍需按各自写入路径校准。
剩余事项不变:四行历史假读数未清理,两项探针未执行,盘中才封板与因子库前复权基准仍未补充验证,188 真实仓继续等待原准备条件。