文档:convert_fund 退役并入 T-13(用户 2026-09-11 裁定)
开发计划 T-13 目标/改法 6/DoD/风险补「convert_fund 退役 + 清理 v1.0 依赖链」; TODO 待办行补注裁定。本地提交,未推送远程
This commit is contained in:
+1
-1
@@ -35,7 +35,7 @@
|
||||
- [x] **T-6 受理事务 ✅**:`accept_convert` 八步落地(幂等前置 → 产品/份额/适当性 → 受理日顺延 R-5 → 可用份额 R-3 → 落 `core_convert_request(accepted)` → 镜像 + 审计 → 202 回执);新增 `tests/test_convert_accept.py`;**真库 `verify_convert_accept.py` 37/37 一致(退出码 0)**
|
||||
- [x] **T-7 三段编排 + `confirm_service`(核心重写)✅(2026-09-11,提交 `048f1a9`)**:新增 `confirm_service.py`(`confirm_one` 8 步:读单+状态闸门 → T 日净值精确匹配(缺→`nav_pending`)→ 产品复核 + T+1 适当性复核 → 部分成交 R-10 → FIFO 扣批 + 折算 → 确认事务(扣批次 + 2 流水 + 转入批次 + 两端持仓 + 明细 + 受理单置 `confirmed`,同事务,`rowcount!=1` → `ConfirmConflict` 整体回滚)→ 引擎恰好一次(commit 后,异常不阻断)→ 镜像 + 审计;`confirm_batch`:整批锁 + 业务日捞单窗口 + 串行 + 单笔容错);抽出 `format.py`/`audit.py`/`engine_call.py` 三个共用出口;`convert_service` 加 `cancel_convert`(T 日撤单两道闸门)+ `_t1_t2_dates`,受理响应改 PRD §5.3.1 字段;`convert_core_repository.ConvertApplyInput` 加 `convert_request_id`/`diff_fee`/`request_remark` 并内置 `_confirm_request` 状态守卫;`convert_request_repository` 加 `_end_of_day` 闭区间 + `reject()`。**单测 `tests/test_convert_confirm.py`(24 例)+ 真库 `verify_convert_confirm.py` 83/83 一致(含 PRD §5.3.2 示例真库逐字节重放)**;全量 **827 passed / 10 skipped**。**关键裁定(计划缺口,已回写开发计划)**:强制全转是受理段决策,受理单 `remark='full_transfer'` 传承,确认段**只继承不重判**(`plan_lots` 不传 `min_hold_qty`)—— 重判会因 T→T+1 可用份额变化擅自扩大客户指令。
|
||||
- [x] **T-8 引擎时机收口 ✅(2026-09-11,提交 `57f16a5`)**:**R-7 的实现部分在 T-7 已完成**(`engine_call.run_convert_engine` 是引擎唯一出口、位于确认事务 commit 之后;`accept_convert` 自实现起不含引擎调用)。本轮补**守护与端到端验证**:① `test_process_convert_event_has_single_call_site` —— 用 **AST** 统计 `app/` 下 `process_convert_event(` 的 Call 节点**恰 1 处**且宿主为 `run_convert_engine`(字符串匹配会被 `engine_call.py` 说明段误判);② 受理无副作用用例补「不触引擎」断言(受理后 `risk_alert` 0 行、无 `pass`/`engine_error` 审计,验收 29 前半);③ `test_real_engine_on_confirm_dedupes_daily_total` —— 确认链路接**真引擎**(不注入 hook)的正证 + 反证(阈值夹逼 → RISK-002 不命中 / 阈值下调 → 命中),并断言一张单 + `payload.events` 两条 + 去重不删行(验收 5/6/7)。两条新用例**均做突变验证**(加第二处调用 / 禁用引擎调用 → 变红 → 还原)。真库 `verify_convert_engine.py` **整体切换 T+1 链路**(此前走 v1.0 `convert_fund`):受理 → 确认,新增 A0 组「受理不触引擎」,折算期望改用 T 日净值,**真库 39/39 一致**。**订正**:原记「T-8 剩余工作仅为 `rules.amount_view`」有误 —— F-10 明确 T-8 **不动**去重口径(属 T-11 范围),T-8 剩余的是**验证面**。
|
||||
- [ ] T-10 ~ T-17(普通申赎批次维护 + T+2 校验 / 汇总去重 / 补偿改写 / 全量回归 / D27 产品级舍入 / D28 巨额赎回 / D29 资金流中转 / D30 A/C 互转)
|
||||
- [ ] T-10 ~ T-17(普通申赎批次维护 + T+2 校验 / 汇总去重 / 补偿改写 / 全量回归 / D27 产品级舍入 / D28 巨额赎回 / D29 资金流中转 / D30 A/C 互转)。**注(2026-09-11 用户裁定)**:`convert_fund` 退役并入 **T-13**(T-13 目标/改法 6/DoD/风险已加)
|
||||
|
||||
> **第 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「提升为公开函数」是两回事。
|
||||
|
||||
@@ -674,11 +674,11 @@
|
||||
|
||||
---
|
||||
|
||||
### T-13 · 全量回归 + 集成 + 并发 + 性能补录
|
||||
### T-13 · 全量回归 + 集成 + 并发 + 性能补录 + `convert_fund` 退役
|
||||
|
||||
**目标**:第 6 步前的门禁总校验。
|
||||
**目标**:第 6 步前的门禁总校验 + v1.0 过渡函数收尾。
|
||||
|
||||
**涉及文件**:全部 · `scripts/dev/verify_convert_*.py` 套件 · `docs/项目框架设计/开发计划-基金转换交易.md`(本文件基线更新)
|
||||
**涉及文件**:全部 · `scripts/dev/verify_convert_*.py` 套件 · `app/service/convert/convert_service.py` · `docs/项目框架设计/开发计划-基金转换交易.md`(本文件基线更新)
|
||||
|
||||
**改法**:
|
||||
1. 全量 pytest:`739 基线 + 新增 convert 用例`,目标 **739 + N 全绿**
|
||||
@@ -686,6 +686,7 @@
|
||||
3. 并发:CONVERT_STRESS=1 用例全跑(受理并发 + 确认批处理并发双跑)
|
||||
4. 性能补录(验收 18,不得改数据迁就指标):受理/确认事务耗时实测记录;端到端响应 < 2s
|
||||
5. 紧池成功率重测(验收 31,设计目标 100%):构造需求=供给的紧池场景,批量受理 → 全部 accepted;确认后无超卖
|
||||
6. **`convert_fund` 退役**(用户 2026-09-11 拍板并入 T-13):v1.0 两阶段实时过渡函数已无生产调用方(T-9 已把路由/网关/引擎套件切到 `accept_convert`/`confirm_one`)→ 本轮删除函数体 `convert_service.convert_fund`,同步清理其依赖:向 `verify_convert_service.py`(v1.0 链路脚本)提供替代验证路径或按 v1.0 模型留档;约 25 处测试改写为直接不发 v1.0 链路(R-回归 2/7 已有 T-6/T-7 的替代断言);迁移完成后跑全仓 pytest + 真库套件确认无游离引用
|
||||
|
||||
**依赖**:全部任务
|
||||
|
||||
@@ -695,9 +696,10 @@
|
||||
- [ ] CONVERT_STRESS 并发 9/9 通过
|
||||
- [ ] 性能耗时实测定格进文档(受理/确认事务、端到端;**端到端 < 2s 为硬门禁,超限须归因后回填**)
|
||||
- [ ] 紧池场景成功率实测记录(**目标 100%:成功率 < 100% → 记录 P50/P95/max 与瓶颈归因,作为第 6 步验收 31 前置数据;超卖不变量继续成立 = 硬门禁**)
|
||||
- [ ] `convert_fund` 及其 v1.0 依赖链移除后全仓 pytest + 真库套件零回归(grep `convert_fund` 无生产调用残留)
|
||||
|
||||
**风险**:基线重估引入新增失败 → 逐条归因(归因铁律:先复跑真库脚本确认非环境噪音再改代码)
|
||||
**回滚点**:无(纯验证)
|
||||
**风险**:基线重估引入新增失败 → 逐条归因(归因铁律:先复跑真库脚本确认非环境噪音再改代码);`convert_fund` 删除可能打穿 `verify_convert_service.py` 与约 25 处测试 → 需一并改写(R-回归 2/7 已计划)
|
||||
**回滚点**:无(纯验证 + v1.0 过渡函数删除,代码库有 git 历史可恢复)
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user