From eac6b61ce4a7e34b3af6b436953c56aeafd8531e Mon Sep 17 00:00:00 2001 From: YUAN Date: Sat, 12 Sep 2026 14:52:01 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=87=E6=A1=A3=EF=BC=9A=E7=AC=AC=206=20?= =?UTF-8?q?=E6=AD=A5=E9=9B=86=E6=88=90=E6=B5=8B=E8=AF=95=E6=94=B6=E5=AE=98?= =?UTF-8?q?=EF=BC=88=E8=BD=AC=E6=8D=A2=E7=BA=BF=20AIcoding=20=E5=85=AD?= =?UTF-8?q?=E6=AD=A5=E5=85=A8=E6=B5=81=E7=A8=8B=E5=AE=8C=E6=88=90=20=C2=B7?= =?UTF-8?q?=20849=20=E7=BB=BF=20/=20CONVERT=5FSTRESS=207/7=20/=20=E7=9C=9F?= =?UTF-8?q?=E5=BA=93=209/9=20/=20=E7=B4=A7=E6=B1=A0=20100%=20=E9=87=8D?= =?UTF-8?q?=E6=B5=8B=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AGENTS.md | 2 +- docs/memory/2026-09-12.md | 48 ++++++++++++++++++++++ docs/memory/MEMORY.md | 8 ++-- docs/memory/TODO.md | 3 +- docs/项目框架设计/开发计划-基金转换交易.md | 38 ++++++++++++++++- 5 files changed, 92 insertions(+), 7 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index d96e7bf..7109664 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -24,7 +24,7 @@ - 技术选型 / JWT:`docs/项目框架设计/技术选型和版本/` - Core 模拟底座:`docs/项目框架设计/Core模拟底座/` - 业务记忆分层:`docs/业务记忆管理/业务记忆管理手册.md` -- **基金转换线(第 5 步 todo 开发 ✅ 已收官 2026-09-12 · T+1 受理/确认分离模型)**:**T-1 ~ T-17 全部完成**(当前基线 **849 passed / 8 skipped** 实测;真库 verify 套件 **9/9 退出码 0**:accept 43 / confirm 103 / engine 39 / api 89 / compensate 56 / apply 30 / lots 20 / seed 全 PASS / tools 14。T-15 = D28 部分成交专项(防御纵深三道防线 + 真库争批);T-16 = D29 资金流中转(core_cash_flow 全仓唯一写入点同事务 2 条 remark 带 gid);T-17 = D30 A/C 互转(share_class 非空且不同才查 allow_ac_convert,任一端=1 放行;口径裁定 NULL 不参与判定/同类走一般规则);**开口 3 项 ✅ 已全部闭环(2026-09-12 用户拍板)** = PRD §2.5.3 已修订 + truncate 已接入(get_share_rounding 单点 + 09 ⑦ 段载体 PROD-005828)+ R-12 口径已追认定稿;下一步 = **第 6 步集成测试**);开工入口 **`交接文档.md` §B**(§B.11 下一条立项指引 = 最新状态)· `docs/PRD/PRD-基金转换交易.md`(**v1.1**)· `docs/项目框架设计/架构设计-基金转换交易.md`(**v2.1**)· `docs/项目框架设计/开发计划-基金转换交易.md`(**v2.0** · T-1~T-17 逐任务改法 + DoD) +- **基金转换线(✅ 全流程收官 2026-09-12 · T+1 受理/确认分离模型 · AIcoding 六步全部完成)**:**第 5 步 T-1 ~ T-17 全部完成 + 第 6 步集成测试 ✅ 通过**(集成测试零代码改动五步全过:按 SOP 重灌双库(DoD 断言全 PASS 含 ⑨a/⑩/⑫)→ 全量 **849 passed / 8 skipped 零失败** → CONVERT_STRESS=1 **7/7**(T-15 争批用例加入)→ 真库 verify 套件 **9/9 退出码 0**:accept 43 / confirm 103 / engine 39 / api 89 / compensate 56 / apply 30 / lots 20 / tools 14 / seed 全 PASS → 残留检查零命中 + 收尾重灌恢复干净演示态;**验收 31 紧池重测 = 受理 50/50 + 串行确认 50/50 = 100%**、**验收 18 性能重测端到端 P50 78.8 / P95 94.8 ms**(< 2s 余量约 20 倍);执行记录 = 开发计划 §10 + `docs/memory/2026-09-12.md`;**无待办,可选项 = 分支推送 / 里程碑 tag 由用户拍板**);开工入口 **`交接文档.md` §B**(§B.11 下一条立项指引 = 最新状态)· `docs/PRD/PRD-基金转换交易.md`(**v1.1**)· `docs/项目框架设计/架构设计-基金转换交易.md`(**v2.1**)· `docs/项目框架设计/开发计划-基金转换交易.md`(**v2.0** · T-1~T-17 逐任务改法 + DoD + §10 集成测试记录) - **架构改进线(✅ 2026-09-10 已结项,无待办)**:开工入口 **`交接文档.md` §C** - **风控模块主线**:**`交接文档.md` §A** diff --git a/docs/memory/2026-09-12.md b/docs/memory/2026-09-12.md index f0dc551..0374d43 100644 --- a/docs/memory/2026-09-12.md +++ b/docs/memory/2026-09-12.md @@ -536,3 +536,51 @@ cancelled)是幂等 skip**(批处理单笔容错语义),`ConfirmConflict **开口清零**。转换线(T-1~T-17 + 开口闭环)全部完成;下一步 = 开发计划 **第 6 步集成测试**。 + +--- + +# 第 6 步 · 集成测试 ✅(2026-09-12 · 转换线全流程收官) + +> 范围对齐 v0.x 第 6 步惯例 + 开发计划 T-13 门禁总则 + PRD §9 验收 18/31 +> 「待第 6 步重测」注记。**全程零代码改动**——纯验证性收口,无一处需要修复。 + +## 一、执行记录(五步全过) + +| # | 步骤 | 结果 | +| --- | --- | --- | +| 1 | **按 SOP 重灌双库**:`verify_convert_seed.py`(DROP + 重建 00~11 全套 SQL + 自动补跑 `prepare_risk_demo.sql`,演示态「剩余 275 天」) | DoD 断言全 PASS(含 ⑨a 日历 503 交易日 / ⑩ 份额规则 42 行 / ⑫ truncate 载体) | +| 2 | **全量 pytest 回归** | **849 passed / 8 skipped,零失败**(重灌后真库集成模块全真跑,与基线一致) | +| 3 | **CONVERT_STRESS=1 并发套件**(真库) | **7/7 通过**(T-15 争批用例加入后由 6 演进为 7 条) | +| 4 | **全套 9 个真库 verify 脚本复跑** | **9/9 退出码 0**:accept 43 / apply 30 / lots 20 / tools 14 / confirm 103 / engine 39 / api 89 / compensate 56 / seed 全 PASS | +| 5 | **残留检查 + 收尾重灌** | grep `MUTATION` 零命中;grep `1 = 1` 唯一命中 `core_ro.py:662` 动态 WHERE 初始占位(正常模式、基线提交内,非突变残留);收尾重灌后 seed 复验全 PASS,库恢复干净演示态 | + +## 二、两条「待第 6 步重测」验收的重测结论 + +- **验收 31 紧池成功率 100%**:`test_tight_pool_accept_all_then_confirm_100pct` + 通过——50 并发受理各 1000、池恰 50000 → **受理 50/50 + `confirm_batch` + 串行确认 50/50 = 100%**,扣减恰=池守恒无超卖。T+1 模型核心收益 + (v0.x 同场景 80%)再次实测成立。 +- **验收 18 性能**:`test_performance_probe_accept_confirm_end_to_end` 通过 + (n=59)——**端到端 P50 78.8 / P95 94.8 / max 229.4 ms**(< 2s 硬门禁, + 余量约 20 倍);受理段 P50 36.5 / 确认事务 P50 10.4 ms(均 < 100ms 预估)。 + 与 T-13 记录(P50 79.2 / P95 110.3)同量级,PRD §9 第 18 条已回填数字 + 仍准确,无需改写。 + +## 三、执行期归因留痕(2 条,均非缺陷) + +1. **业务脚本跑完后 `seed --no-reset` 断言 FAIL = 预期防护行为**:9 个脚本 + 全跑完后批次 61→67 行、Σremain 漂移(`CUST-3001/PROD-510300` 转入批次 + +108279 份;持仓快照滞后为 T+1 已知设计)→ seed 的**静态快照**断言 + (②批次守恒 / ④档位覆盖)显式 FAIL。**seed 断言的权威时点 = 重灌后、 + 业务脚本运行前**;各脚本自身的隔离断言(清理后残留 0)为运行态权威。 + 收尾重灌即恢复(v0.x 集成测试同款现象,核查单⑥防护语义)。 +2. **CONVERT_STRESS 用例数 6→7 是 T-15 演进而非回归**: + `test_two_confirms_race_same_lot_first_wins`(Barrier 窄窗争批,断言恰 + 1 confirmed + 1 rejected)为 T-15 新增;旧记录「6/6」以本次「7/7」为准。 + +## 四、结论与下一步 + +**第 6 步集成测试全部通过,基金转换线(T+1 受理/确认分离模型)AIcoding +六步全流程收官**:第 1 步讨论 ✅ → 第 2 步 PRD v1.1 ✅ → 第 3 步架构 v2.1 ✅ +→ 第 4 步开发计划 v2.0 ✅ → 第 5 步 T-1~T-17 ✅ → **第 6 步集成测试 ✅**。 +后续可选项(由用户拍板):分支推送 / 里程碑 tag 等收尾事项。 diff --git a/docs/memory/MEMORY.md b/docs/memory/MEMORY.md index df87b9d..ea89b8d 100644 --- a/docs/memory/MEMORY.md +++ b/docs/memory/MEMORY.md @@ -13,7 +13,7 @@ **⚡ 基金转换(convert)线 — 两条子线**: - **(一)v0.x 两阶段实时模型(已结项 2026-09-10)**:PRD **v0.9.3** + 架构 **v1.0.1** + 开发计划 **v1.0**,T-0 ~ T-13 全部完成(第 5+6 步闭环,最终 **739 passed / 10 skipped**,`CONVERT_STRESS=1` 并发 9/9,含死锁重试补丁 `43cf2a1`);**该模型已被下一线取代,其 PRD/架构/开发计划作废,代码保留作过渡基线**。 -- **(二)下一线 · T+1 受理/确认分离模型(进行中 · 2026-09-11)**:入口 **交接文档.md §B.11**(10 项真实业务拍板)· PRD **v1.1** + 架构 **v2.1** 已整体重写并经独立 AI 联网审查通过(0 阻断级),**已定稿**(2026-09-11 用户批准);**第 4 步开发计划 v2.0 已整体重做**(`docs/项目框架设计/开发计划-基金转换交易.md`,797 行:T-0~T-17 按架构 §15 重排 + §1.4 代码事实核对表 F-1~F-25 + §1.5 实现级裁定 R-1~R-15 + §5 十六条回归面 + §6 验收 31 条 + FR-C29/C30 全映射),**经三轮独立审核闭环(第一轮挑毛病 2 阻断+5 重要+3 可选 / 第二轮验证型 12 项零残留 / 第三轮白纸重审 C1~C5+O1~O4 + 验证型复核 22/22 落位),已定稿(2026-09-11 用户批准)**。**核心认知:不新增冻结列,在途占用由受理单推导;紧池 80% 病根在 T+1 串行确认下自动消失。** 下一步:**第 5 步 todo 开发已收官(2026-09-12,T-1~T-17 全部完成 + 三项开口闭环【PRD §2.5.3 修订 / truncate 已接入 / R-12 定稿】,**849 passed / 8 skipped** 零失败;真库 verify 套件 **9/9 退出码 0**:accept 43 / confirm 103 / engine 39 / api 89 / compensate 56 / apply 30 / lots 20 / seed 全 PASS / tools 14。T-15 = D28 部分成交专项(终态单幂等 skipped 口径 + 防御纵深三道防线实证 + Barrier 窄窗争批);T-16 = D29 资金流中转(core_cash_flow 全仓唯一写入点,out/redeem + in/subscribe 各 1 条 remark 带 gid 同事务,5 处清理段 FK 坑修复);T-17 = D30 A/C 互转(share_class 非空且不同才查 allow_ac_convert 开关,任一端=1 两向放行,联网核实 = 摩根 2025-11「开通」公告;口径裁定:NULL 不参与判定、同类走一般规则,已追认定稿),下一步 = 第 6 步集成测试)**。**T-7 关键裁定:强制全转属受理段决策** —— 受理由 `plan_lots` 判定并把 `qty` 收敛为实际全转量 + 受理单 `remark='full_transfer'`,确认段**只继承不重判**(`plan_lots` 不传 `min_hold_qty`);重判会因 T→T+1 可用份额变化(部分成交/他人申赎/产品参数改)得出与受理承诺不一致的结论(擅自扩大客户指令)。**T-8 关键裁定**:引擎时机(R-7)的实现部分在 T-7 已完成,T-8 补的是**守护与验证**(AST 守护唯一调用点 / 受理不触引擎 / 确认链路真引擎正证+反证);⚠️ **T-8 不动去重口径** —— `amount_view` 三处消费方原样不动(属 T-11);`convert_fund` 的阶段 1.5 调用点随 T-9 删函数一并清除(只摘调用会让 v1.0 过渡函数「扣份额但不出预警单」,风控缺失比时机错更危险)。撤单范围:PRD §5.5 原表述与实现(仅 `accepted`)不矛盾、无需回填(第三轮 C1 订正)。已就绪:`fetch_nav.py` / `06-seed-nav.sql`(60 个真实净值日)/ `gen_trade_calendar.py` / `10-seed-trade-calendar.sql`(503 交易日)。 +- **(二)下一线 · T+1 受理/确认分离模型(进行中 · 2026-09-11)**:入口 **交接文档.md §B.11**(10 项真实业务拍板)· PRD **v1.1** + 架构 **v2.1** 已整体重写并经独立 AI 联网审查通过(0 阻断级),**已定稿**(2026-09-11 用户批准);**第 4 步开发计划 v2.0 已整体重做**(`docs/项目框架设计/开发计划-基金转换交易.md`,797 行:T-0~T-17 按架构 §15 重排 + §1.4 代码事实核对表 F-1~F-25 + §1.5 实现级裁定 R-1~R-15 + §5 十六条回归面 + §6 验收 31 条 + FR-C29/C30 全映射),**经三轮独立审核闭环(第一轮挑毛病 2 阻断+5 重要+3 可选 / 第二轮验证型 12 项零残留 / 第三轮白纸重审 C1~C5+O1~O4 + 验证型复核 22/22 落位),已定稿(2026-09-11 用户批准)**。**核心认知:不新增冻结列,在途占用由受理单推导;紧池 80% 病根在 T+1 串行确认下自动消失。** 下一步:**第 5 步 todo 开发已收官(2026-09-12,T-1~T-17 全部完成 + 三项开口闭环【PRD §2.5.3 修订 / truncate 已接入 / R-12 定稿】,**849 passed / 8 skipped** 零失败;真库 verify 套件 **9/9 退出码 0**:accept 43 / confirm 103 / engine 39 / api 89 / compensate 56 / apply 30 / lots 20 / seed 全 PASS / tools 14。T-15 = D28 部分成交专项(终态单幂等 skipped 口径 + 防御纵深三道防线实证 + Barrier 窄窗争批);T-16 = D29 资金流中转(core_cash_flow 全仓唯一写入点,out/redeem + in/subscribe 各 1 条 remark 带 gid 同事务,5 处清理段 FK 坑修复);T-17 = D30 A/C 互转(share_class 非空且不同才查 allow_ac_convert 开关,任一端=1 两向放行,联网核实 = 摩根 2025-11「开通」公告;口径裁定:NULL 不参与判定、同类走一般规则,已追认定稿);**第 6 步集成测试已通过(2026-09-12 · 零代码改动:按 SOP 重灌双库 → 全量 849 passed / 8 skipped 零失败 → CONVERT_STRESS 7/7(T-15 争批用例加入)→ 真库 9/9 退出码 0 → 残留检查 + 收尾重灌恢复干净演示态;验收 31 紧池重测 100%、验收 18 性能端到端 P95 94.8ms < 2s)——AIcoding 六步全流程收官**)**。**T-7 关键裁定:强制全转属受理段决策** —— 受理由 `plan_lots` 判定并把 `qty` 收敛为实际全转量 + 受理单 `remark='full_transfer'`,确认段**只继承不重判**(`plan_lots` 不传 `min_hold_qty`);重判会因 T→T+1 可用份额变化(部分成交/他人申赎/产品参数改)得出与受理承诺不一致的结论(擅自扩大客户指令)。**T-8 关键裁定**:引擎时机(R-7)的实现部分在 T-7 已完成,T-8 补的是**守护与验证**(AST 守护唯一调用点 / 受理不触引擎 / 确认链路真引擎正证+反证);⚠️ **T-8 不动去重口径** —— `amount_view` 三处消费方原样不动(属 T-11);`convert_fund` 的阶段 1.5 调用点随 T-9 删函数一并清除(只摘调用会让 v1.0 过渡函数「扣份额但不出预警单」,风控缺失比时机错更危险)。撤单范围:PRD §5.5 原表述与实现(仅 `accepted`)不矛盾、无需回填(第三轮 C1 订正)。已就绪:`fetch_nav.py` / `06-seed-nav.sql`(60 个真实净值日)/ `gen_trade_calendar.py` / `10-seed-trade-calendar.sql`(503 交易日)。 **仓库地图:** | 路径 | 状态 | 说明 | @@ -71,7 +71,7 @@ **下一步开发(见 TODO):** **模块侧交付完毕(2026-09-07:全量 pytest 482 绿 + 接口实调验收通过——suitability/check 阻断+放行、simulate/trade 阻断、三条鉴权边界 401/403/403 契约零偏差;`risk-m1~m4` tag 齐)。合并 main 已移交合并执行人,操作手册《docs/项目框架设计/合并注意事项-风控模块并入main.md》(含基底锁定/20 冲突裁决/14 静默文件/三硬伤/合并后必测,实测数据编制)。模块侧开放项:chat 链路 risk_suitability_log.actor_id 落 SYSTEM 待评估 / 前端 React 多 Agent 入口(`web/` 未 init,归属待拍板)。**演示走查按 `docs/项目框架设计/演示SOP-风控模块.md`(debug 头通道仍有效;JWT 通道签发用 `scripts/dev/issue_dev_token.py`;演示库已按 AL-08 expires_at 新口径重灌)。知识库入库:`python scripts/kb/build_kb.py`(先启 Ollama;**Milvus 数据路径必须纯英文**——faiss 不支持中文路径,本机 .env 已配 C:/Users/YUAN/.jinrong/milvus/)。 -**另(基金转换线)**:① **v0.x 两阶段实时模型已结项(2026-09-10,T-0~T-13 全部完成、739 绿),已被下一线取代(文档作废)**;**下一线 T+1 受理/确认分离模型(进行中 · 2026-09-11)**:PRD **v1.1** / 架构 **v2.1** / 开发计划 **v2.0** 已整体重写并经独立审查收敛,**已定稿(2026-09-11 用户批准) → 第 5 步 todo 开发**,入口 项目根 `交接文档.md` §B.11);② ~~架构改进线收尾~~ —— **2026-09-10 已闭环结项**:§7.2 七项手工冒烟补跑 **7/7 PASS**、冒烟残留按 SOP §2 重灌双库清除、全量 **510 passed** 复绿;**「`037ce7e` 未 push」的旧表述已作废**(实测 `git ls-remote`:远程 `risk-control-agent` = `fffb78a` = 本地 HEAD,`037ce7e` 在其祖先链上,早已推送;本地 `git branch -vv` 显示 `origin/risk-control-agent: gone` 是本仓 `refs/remotes/**` 写入不落盘所致(见交接清单第 7 问,**不是**「`git fetch` 即恢复」的普通 stale ref),非远程分支被删)。入口 **项目根 `交接文档.md` §C**。 +**另(基金转换线)**:① **v0.x 两阶段实时模型已结项(2026-09-10,T-0~T-13 全部完成、739 绿),已被下一线取代(文档作废)**;**下一线 T+1 受理/确认分离模型(✅ 全流程收官 · 2026-09-12)**:PRD **v1.1** / 架构 **v2.1** / 开发计划 **v2.0** 已整体重写并经独立审查收敛,**已定稿(2026-09-11 用户批准)**;第 5 步 T-1~T-17 ✅ + 第 6 步集成测试 ✅(2026-09-12,AIcoding 六步全部完成),入口 项目根 `交接文档.md` §B.11);② ~~架构改进线收尾~~ —— **2026-09-10 已闭环结项**:§7.2 七项手工冒烟补跑 **7/7 PASS**、冒烟残留按 SOP §2 重灌双库清除、全量 **510 passed** 复绿;**「`037ce7e` 未 push」的旧表述已作废**(实测 `git ls-remote`:远程 `risk-control-agent` = `fffb78a` = 本地 HEAD,`037ce7e` 在其祖先链上,早已推送;本地 `git branch -vv` 显示 `origin/risk-control-agent: gone` 是本仓 `refs/remotes/**` 写入不落盘所致(见交接清单第 7 问,**不是**「`git fetch` 即恢复」的普通 stale ref),非远程分支被删)。入口 **项目根 `交接文档.md` §C**。 **禁止(改代码前必记):** Core 正式 C1~C5 不可被画像覆盖 · 审计表只 INSERT · 代理人草稿不外发 · 仅 R-02 可阻断交易 · 四 Agent 不互调 LLM。 @@ -200,8 +200,8 @@ RBAC 联调账号:scripts/dev/rbac-seed-reference.md 2. 改动属于 api / service / tool / repository 哪一层? 3. 是否需 customer_id 归属与 JWT RBAC? 4. Core 是模拟库只读还是 agent 库读写? -5. 如何验证?(`python -m pytest` 全量(当前 **842 passed / 8 skipped**,风控基线 510 / v0.x convert 完结 739)· uvicorn 启动 + /health · SQL / sync 脚本 · 对照 REQUIREMENTS 验收列) -6. **当前有哪两条并行线?**(① 风控/架构改进线:**已结项**(510 基线绿、§7.2 七项冒烟 7/7 PASS、`037ce7e` 已核实早已推送);② **基金转换线**:v0.x 实时模型已结项(739 绿,**已被 T+1 模型取代**);**下一线 T+1 受理/确认分离模型:第 5 步 todo 开发已收官(2026-09-12,T-1~T-17 全部完成,**842 绿**;真库 9/9 退出码 0)**)——动代码前先确认自己属于哪条线,别混淆前置条件。 +5. 如何验证?(`python -m pytest` 全量(当前 **849 passed / 8 skipped**,风控基线 510 / v0.x convert 完结 739)· uvicorn 启动 + /health · SQL / sync 脚本 · 对照 REQUIREMENTS 验收列) +6. **当前有哪两条并行线?**(① 风控/架构改进线:**已结项**(510 基线绿、§7.2 七项冒烟 7/7 PASS、`037ce7e` 已核实早已推送);② **基金转换线**:v0.x 实时模型已结项(739 绿,**已被 T+1 模型取代**);**T+1 受理/确认分离模型:✅ 全流程收官(2026-09-12)——第 5 步 T-1~T-17 + 第 6 步集成测试全部通过(849 passed / 8 skipped;真库 9/9 退出码 0;CONVERT_STRESS 7/7;验收 31 紧池 100% / 验收 18 性能 P95 94.8ms 重测成立)**)——动代码前先确认自己属于哪条线,别混淆前置条件。 7. **远程分支到底还在不在?**(**在**。`git ls-remote --heads origin` 实测 `refs/heads/risk-control-agent` = `fffb78a`。⚠️ **判断远程存亡只能用 `git ls-remote`** —— 2026-09-10 **同日误报两次**,勿再踩。) **本仓特有异常(2026-09-10 深挖确认,别误判为 stale ref)**:`.git/refs/remotes/**` **写入不落盘** —— `git update-ref refs/remotes/origin/X ` 返回 0,但松散引用消失,**且整个 `refs/remotes/origin/` 目录被删** diff --git a/docs/memory/TODO.md b/docs/memory/TODO.md index dbab5a3..a938ed6 100644 --- a/docs/memory/TODO.md +++ b/docs/memory/TODO.md @@ -9,7 +9,7 @@ **⚡ 并行新线 · 基金转换(convert)**—— **两条子线**: - **(一)v0.x 两阶段实时模型(已结项 2026-09-10)**:PRD **v0.9.3** + 架构 **v1.0.1** + 开发计划 **v1.0**,**T-0 ~ T-13 全部完成**(第 5 步 + 第 6 步闭环,**736 passed / 10 skipped**;7 个 convert 真库脚本复跑零回归;压测修复 2 处并发缺陷 + 死锁重试后补 `43cf2a1` 最终 **739 passed / 10 skipped**)。**注:该模型已被下一线取代(按下述),其设计文档作废,代码仍保留作过渡基线**。 -- **(二)下一线 · T+1 受理/确认分离模型(进行中 · 2026-09-11)**:入口 **交接文档.md §B.11** · PRD **v1.1** + 架构 **v2.1** 均已整体重写并经独立 AI 联网审查通过(0 阻断级),**已定稿**(2026-09-11 用户批准);**第 4 步开发计划 v2.0 已整体重做(`docs/项目框架设计/开发计划-基金转换交易.md`,T-1~T-17 按架构 §15 重排 + 代码事实 F-1~F-25 + 裁定 R-1~R-15 + 16 条回归面 + 验收 31 条 + FR-C29/C30 全映射),经三轮独立审核闭环(挑毛病 / 验证型 / 白纸重审 + 验证型复核 22/22 落位),已定稿(2026-09-11 用户批准)**。**第 5 步 todo 开发已收官(2026-09-12):T-1 ~ T-17 全部完成(全量 pytest 849 passed / 8 skipped 零失败(含 T-14 开口② truncate 接入 +7);真库 verify 套件 9/9 退出码 0:accept 43 / confirm 103 / engine 39 / api 89 / compensate 56 / apply 30 / lots 20 / seed 全 PASS / tools 14,v1.0 链路 verify_convert_service 已随 convert_fund 退役删除),下一步 = 第 6 步集成测试**。撤单范围:PRD §5.5 原表述与实现(仅 `accepted`)不矛盾、无需回填(第三轮 C1 订正)。 +- **(二)下一线 · T+1 受理/确认分离模型(✅ 全流程收官 · 2026-09-12)**:入口 **交接文档.md §B.11** · PRD **v1.1** + 架构 **v2.1** 均已整体重写并经独立 AI 联网审查通过(0 阻断级),**已定稿**(2026-09-11 用户批准);**第 4 步开发计划 v2.0 已整体重做(`docs/项目框架设计/开发计划-基金转换交易.md`,T-1~T-17 按架构 §15 重排 + 代码事实 F-1~F-25 + 裁定 R-1~R-15 + 16 条回归面 + 验收 31 条 + FR-C29/C30 全映射),经三轮独立审核闭环,已定稿(2026-09-11 用户批准)**。**第 5 步 todo 开发已收官(2026-09-12):T-1 ~ T-17 全部完成(全量 pytest 849 passed / 8 skipped 零失败;真库 verify 套件 9/9 退出码 0);第 6 步集成测试已通过(2026-09-12,见下方专条)——AIcoding 六步全流程收官**。撤单范围:PRD §5.5 原表述与实现(仅 `accepted`)不矛盾、无需回填(第三轮 C1 订正)。 ### 基金转换线待办(推荐顺序) @@ -44,6 +44,7 @@ - [x] **T-15 D28 部分成交专项测试 + 边界补强 ✅(2026-09-12)**:sqlite +1 `test_confirm_after_cancel_conflicts`(**时序口径裁定**:`confirm_one` 对终态单(含 cancelled)= 幂等 `skipped` + current_status 回显,`ConfirmConflict` 仅限「读单后状态才变」窗口);真库 verify_confirm +3 组 19 项(E2 占用释放双向证明 / G2 `actual_qty=0` → `rejected` 零残留 / H2 撤单后确认)→ **102/102**;R-10 实测钉死 = 部分确认吃掉全部物理可用、「释放」的是受理占用。**CONVERT_STRESS 争批**:`Barrier(2)` 钉 `apply_convert` 事务门口构造「两单都完成 ④⑤ 读」窄窗,断言恰 1 confirmed + 1 rejected。**突变 = 防御纵深实证**:单独拆事务内哨兵不红(④⑤ 拦)、单独拆 ④ partial_qty 不红(⑤ plan_lots 拦)→ 窄窗 + 同拆哨兵 ×3 红、还原 ×3 绿——④可用量复核 / ⑤plan_lots / 事务内哨兵三道防线拆任何一道仍收敛 rejected。全量 **838 passed / 8 skipped**。 - [x] **T-16 D29 资金流中转建模 ✅(2026-09-12)**:`_apply_convert_once` 在 `_insert_trades` 后加 `_insert_cash_flows` —— **全仓唯一写入点**,2 条 `out/redeem`=out_amount(费前)+ `in/subscribe`=in_amount(净转入),remark=`convert:{gid}`、channel=online,与流水/明细/持仓/置态同事务(幂等由 T-7 哨兵保证);`tests/_ddl.py` 补 sqlite 表 + 门禁;`test_confirm_writes_no_cash_flow` **反转为** `test_confirm_writes_exactly_two_cash_flows`(T-7 登记「表建立后改 0 行断言」闭环);真库 apply **A2 组 5 项 + B 组冲突 0 残留 → 24 → 30 项**、confirm「不写资金流」断言反转 → **103 项**。**⚠️ FK 新坑(T-9 同款)**:`core_cash_flow.fk_cf_customer` 挡客户删除 → **5 处清理段补删**(verify_apply / test_convert_integration / verify_engine / verify_api / verify_compensate,remark LIKE 精准定位)。**突变**:拆写入调用 → 反转用例红,还原全绿。 - [x] **T-17 D30 share_class + A/C 互转 ✅(2026-09-12 · 转换线收官)**:`_validate_products` ta_code 后**纯新增拦截分支**——两端 share_class 非空且不同 = A/C 场景,任一端 `allow_ac_convert=1` 两向放行、全关 → `CrossEntityNotSupported`(错误码沿用,message 指明 A/C)。**口径裁定 2 条(R-12 字面偏差,✅ 2026-09-12 用户追认定稿,R-12 条目已回写)**:① NULL 不参与 A/C 判定(字面会打穿全部既有受理用例);② 「share_class 相同 → 400」不采纳(同类别跨基金走一般转换规则)。**联网核实**:A/C 互转需管理人「开通」(摩根行业睿选 2025-11 公告)= 开关真实载体;转换后持有期重新起算(本仓转入新批次一致零改动);转换费 = 赎回费 + 申购补差(本仓范围外)。**种子 ⑥ 段**(09-seed-org.sql:双开对/双关对照/同类对照,其余 NULL 零回归)。**测试 +4(838→842)**:双开/单开/双关 400/同类+NULL 回归保护;真库 accept **H 组 6 项 → 43/43**(H3 首跑撞种子 min_redeem_qty=100 教训:种子产品做载体须通读既有段);**突变**:分支恒 False → closed 红,还原绿。模拟库近似留痕:无 fund_code,判定 = 同管理人同 TA + share_class 非空且不同。 +- [x] **【第 6 步 · 集成测试 ✅】(2026-09-12 · AIcoding 六步全流程收官)**:**零代码改动,五步全过**——① 按 SOP 重灌双库(`verify_convert_seed.py` 重建 00~11 + 自动补跑 `prepare_risk_demo.sql`,DoD 断言全 PASS 含 ⑨a/⑩/⑫);② 全量 pytest **849 passed / 8 skipped 零失败**(重灌后真库集成模块全真跑);③ CONVERT_STRESS=1 **7/7**(T-15 争批用例加入后由 6 演进为 7 条;**验收 31 紧池重测 = 受理 50/50 + 串行确认 50/50 = 100%**、无超卖);④ 真库 verify 套件 **9/9 退出码 0**(accept 43 / apply 30 / lots 20 / tools 14 / confirm 103 / engine 39 / api 89 / compensate 56 / seed 全 PASS);⑤ 残留检查(grep MUTATION 零命中;`1 = 1` 唯一命中 `core_ro.py:662` 动态 WHERE 初始占位=正常模式)+ **收尾重灌恢复干净演示态**。**验收 18 性能重测**(n=59):端到端 P50 78.8 / P95 94.8 / max 229.4 ms(< 2s 余量约 20 倍),受理 P50 36.5 / 确认事务 P50 10.4 ms。**归因留痕 2 条(均非缺陷)**:① 业务脚本跑完后 `seed --no-reset` 静态快照断言 FAIL = 预期防护行为(批次 61→67 行、Σremain 漂移为脚本痕迹;seed 断言权威时点 = 重灌后、业务脚本运行前);② CONVERT_STRESS 6→7 = T-15 演进非回归。细节见 `docs/memory/2026-09-12.md` 第 6 步章节。 > **第 0~2 批结果(2026-09-10)**:基线 **510 passed** → 批 0 后 **516 passed / 3 skipped**(+3 T-0 用例 +3 T-0b 引擎用例)→ 批 1(T-1)后**仍 516 passed / 3 skipped**(只加表与种子,未加用例 → **零回归**);**T-1 数据层断言 8/8 PASS**(含新增断言 ⑧:费率档 ↔ `product_type` 匹配,越档即 FAIL)→ 批 2(T-2 + T-2b)后 **609 passed / 3 skipped**(**+93 纯函数用例**,零回归);T-2b 实算脚本 15/15 与 PRD §5.3 一致(退出码 0)。 > ⚠️ **以下四条引用块均为 v0.x 两阶段实时线记录,其 T 编号与新线(T-1~T-17)无关、勿混**:新线 T-11 亦涉 `amount_view`,与 v0.x T-11「提升为公开函数」是两回事。 diff --git a/docs/项目框架设计/开发计划-基金转换交易.md b/docs/项目框架设计/开发计划-基金转换交易.md index a8fdb5a..9b91730 100644 --- a/docs/项目框架设计/开发计划-基金转换交易.md +++ b/docs/项目框架设计/开发计划-基金转换交易.md @@ -1056,4 +1056,40 @@ BelowMinQty 拦)→ 改申请 100——种子产品做载体必须通读既有 10. **对外契约是否逐条与 PRD 比对**(**T-9 实测补** · 2026-09-11):凡本计划中**新出现或改写**的对外契约 —— **API 路径 / 参数名 / 响应字段名 / HTTP 状态码 / 错误码** —— 必须回到 PRD 原文逐条对齐,并注明 PRD 出处(章节或行号)。 - **为什么单列一条**:T-9 初稿自拟的三个接口路径与 PRD §5.5/§5.7 给出的路径**完全不同**,而**三轮独立审查(挑毛病 / 验证型 / 白纸重审)全部未发现** —— 原因是本清单前 9 条对的是「架构 §15 / 代码事实行号 / tests 回归面 / PRD §9 验收**条目**」,**没有一条对接口契约本身**;审查做的是「计划是否**覆盖** PRD 的要求」,而非「计划是否**擅自改** PRD 的承诺」,契约改写恰好落在盲区。 - **做法**:对本计划所有 `/api/...` 字符串、`FIELD_NAME` 常量、`409`/`422` 等状态码做一次 `grep`,逐条问「PRD 原文怎么写的?出处是哪一节?」,**自拟而无出处的必须标出并请用户裁定**。 - - **同源规律(与铁律 10 一致)**:**带「文件:行号」的断言会被逐条验;不带出处的自由书写没有锚点 → 必漏**。 \ No newline at end of file + - **同源规律(与铁律 10 一致)**:**带「文件:行号」的断言会被逐条验;不带出处的自由书写没有锚点 → 必漏**。 +--- + +## 10. 第 6 步集成测试执行记录(2026-09-12 · ✅ 全部通过) + +> **全程零代码改动**——纯验证性收口。范围对齐 v0.x 第 6 步惯例 + 本计划 T-13 门禁总则 +> + PRD §9 验收 18/31「待第 6 步重测」注记。细节归档:`docs/memory/2026-09-12.md` 第 6 步章节。 + +| # | 步骤 | 结果 | +| --- | --- | --- | +| 1 | 按 SOP 重灌双库(`verify_convert_seed.py`:DROP + 重建 00~11 全套 SQL + 自动补跑 `prepare_risk_demo.sql`) | DoD 断言全 PASS(含 ⑨a 日历 503 交易日 / ⑩ 份额规则 42 行 / ⑫ truncate 载体) | +| 2 | 全量 pytest 回归 | **849 passed / 8 skipped,零失败**(重灌后真库集成模块全真跑) | +| 3 | CONVERT_STRESS=1 并发套件(真库) | **7/7**(T-15 争批用例 `test_two_confirms_race_same_lot_first_wins` 加入后由 6 演进为 7 条) | +| 4 | 全套 9 个真库 verify 脚本复跑 | **9/9 退出码 0**:accept 43 / apply 30 / lots 20 / tools 14 / confirm 103 / engine 39 / api 89 / compensate 56 / seed 全 PASS | +| 5 | 残留检查 + 收尾重灌 | grep `MUTATION` 零命中;grep `1 = 1` 唯一命中 `core_ro.py:662` 动态 WHERE 初始占位(正常模式、基线提交内);收尾重灌后 seed 复验全 PASS,库恢复干净演示态 | + +**两条「待第 6 步重测」验收的重测结论**: + +- **验收 31 紧池成功率 100%**:50 并发受理各 1000、池恰 50000 → **受理 50/50 + + `confirm_batch` 串行确认 50/50 = 100%**、扣减恰=池守恒无超卖(T+1 核心收益, + v0.x 同场景 80%,重灌后复测成立)。 +- **验收 18 性能**(n=59):**端到端 P50 78.8 / P95 94.8 / max 229.4 ms** + (< 2s 硬门禁余量约 20 倍);受理段 P50 36.5 / 确认事务 P50 10.4 ms + (均 < 100ms 预估)。与 T-13 记录同量级,PRD §9 第 18 条已回填数字仍准确。 + +**归因留痕 2 条(均非缺陷)**: + +1. **业务脚本跑完后 `seed --no-reset` 静态快照断言 FAIL = 预期防护行为**: + 9 个脚本全跑完后批次 61→67 行、Σremain 漂移(转入批次痕迹 + 持仓快照滞后 + 为 T+1 已知设计)→ seed 断言(②批次守恒 / ④档位覆盖)显式 FAIL。 + **seed 断言权威时点 = 重灌后、业务脚本运行前**;各脚本自身的隔离断言 + (清理后残留 0)为运行态权威。收尾重灌即恢复。 +2. **CONVERT_STRESS 用例数 6→7 = T-15 演进而非回归**(Barrier 窄窗争批用例 + 为 T-15 新增);旧记录「6/6」以本次「7/7」为准。 + +**结论**:第 6 步集成测试通过,基金转换线(T+1 受理/确认分离模型)AIcoding +六步全流程收官(讨论 → PRD v1.1 → 架构 v2.1 → 开发计划 v2.0 → T-1~T-17 → 集成测试 ✅)。