T-14/T-17 开口闭环:PRD §2.5.3 修订 + truncate 舍去法接入 + R-12 定稿(用户三项拍板 · 849 绿 / 真库 9/9)
① PRD §2.5.3 修订:删「易方达 ETF 场外取整数位」(无证据且有反证,真实整数位载体为场内),改记「2 位主流 + 舍去型真实存在」,版本块加注记 ② rounding_mode=truncate 消费接入(用户拍板补做): - core_ro.get_share_rounding = 位数+模式回退链单点(规则行 → core_product → 默认 2/half_up,mode 白名单读取即校验,get_share_digits 转薄包装) - calc.product_round/in_qty 加 mode 参数(truncate → ROUND_DOWN) - 确认段 + 申购折算两处透传;载体 09-seed-org.sql ⑦ 段 PROD-005828(product 层回退,零转换场景引用) - 测试 +7(842→849):calc 4 + 确认段 2(truncate 34945.53 vs half_up .54 分化 + 回退链遮蔽语义)+ 申购段 1 - 突变:两调用点同拆 mode 透传 → 2 红,还原绿;真库 9/9(seed 新增 ⑫ 载体在位断言) ③ R-12 口径裁定追认定稿:条目回写开发计划(NULL 不参与 A/C 判定 / 同类走一般转换规则) 审核教训留痕:PRD 独立 AI 三轮审查未抓出外部事实断言无出处 —— 联网核实铁律再添例证 文档:开发计划 T-14 开口闭环段 + 基线 849 · 日志新节 · TODO/MEMORY/AGENTS/交接文档开口清零
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
|
||||
> **文档状态**:v2.0 整体重写 · ✅ **三轮独立审核闭环**(第一轮 2 阻断 B1/B2 + 5 重要 + 3 可选;第二轮验证型 12 项零残留;**第三轮白纸重审 C1~C5+O1~O4 全修订 + 第三轮验证型复核 22/22 落位、D-1 残留已修复**)· **已定稿**(2026-09-11 用户批准)(批准后可进入第 5 步 todo 开发)
|
||||
>
|
||||
> **代码基线**:分支 `risk-control-agent` · pytest 基线 **842 passed / 8 skipped**(T-17 后;**T-0~T-17 全部完成**,v1.0 `convert_fund` 已退役)· push 由用户定
|
||||
> **代码基线**:分支 `risk-control-agent` · pytest 基线 **849 passed / 8 skipped**(T-14 开口②闭环后;T-0~T-17 全部完成,v1.0 `convert_fund` 已退役)· push 由用户定
|
||||
>
|
||||
> **上游依据**:PRD-基金转换交易.md **v1.1**(§2 模型 / §5 接口 / §6 引擎 / §9 验收 31 条 / Q1~Q15 拍板)· 架构设计-基金转换交易.md **v2.1**(D1~D30 · §15 任务映射 T-0~T-17)
|
||||
>
|
||||
@@ -220,7 +220,7 @@
|
||||
| R-9 | 撤单窗口判定(FR-C22) | 仅 `status='accepted'` 且**业务日 = 受理日**且提交时刻 ≤ 截点(`settings.convert_cutoff_time`,B1)可撤;否则 409 `CANCEL_NOT_ALLOWED`;撤单事务:条件 UPDATE `accepted→cancelled` + 占用自然释放(R-3 推导) | PRD §5.5;nav_pending 在 T+1 才出现,撤单窗口 T 日 15:00 前已过,不可撤(§1.3 裁定 9) | 允许 nav_pending 撤(业务上窗口已过,驳回) |
|
||||
| R-10 | 部分成交(D28)怎么落库 | `core_convert_request` 加 `actual_qty DECIMAL(18,4) NULL`;确认时 `available = min(申请 qty, 当前可用)`;`actual_qty < qty` → 落 `actual_qty`、状态仍 `confirmed`、`remark='partial'`;未确认部分占用随终态自动释放 | 状态机不加 partial 态(6 态权威);记 actual_qty 差异,响应/查询可展示 | 加 `partial` 第七态(复杂化,驳回;PRD 六态) |
|
||||
| R-11 | D29 资金流中转怎么建模 | 确认事务内写 **2 条** `core_cash_flow`:转出产品 `flow_subtype='redeem'`(out)+ 转入产品 `flow_subtype='subscribe'`(in),`remark` 带 `convert_group_id`;channel/金额对齐两条 core_trade;幂等:与流水同事务天然保证 | D29 注册登记账户中转 = 转出方出账 + 转入方入账;同事务防半写 | 单条汇总(丢失中转语义,驳回) |
|
||||
| R-12 | D30 A/C 互转校验规则 | 放行条件:两端 `fund_company` 相同 + `ta_code` 相同 + `allow_ac_convert=1`(任一为 1 即两向放行)+ 产品不同但 `share_class` 不同;不满足 → 400 `CROSS_ENTITY_NOT_SUPPORTED` 语义沿用(换提示) | A/C 互转 = 同管理人同 TA 不同份额类别;D30 定义 | 放宽同产品(违反转换定义,驳回) |
|
||||
| R-12 | D30 A/C 互转校验规则 | **(2026-09-12 实现后追认定稿)**两端 `share_class` **非空且不同** = A/C 场景,才查 `allow_ac_convert`(任一端 =1 即两向放行,全关 → 400 `CROSS_ENTITY_NOT_SUPPORTED` 语义沿用换提示);`share_class` **NULL 不参与 A/C 判定**(走一般转换规则);**同类别(如 A→A)不 400**,同走一般规则。前置仍为 `fund_company` 同 + `ta_code` 同 + 产品不同 | 原字面「不满足→400」会让 share_class NULL 参与比较打穿全部既有受理用例(种子全 NULL);「share_class 相同→400」在真实业务无依据(同管理人同类别跨基金互转 = 普通转换,市面平台无禁转做法)。两处字面偏差经 T-17 实现裁定、**用户 2026-09-12 追认** | 放宽同产品(违反转换定义,驳回) |
|
||||
| R-13 | D27 产品舍入接入点 | `core_share_rule(product_id, business_type)` 给 `share_digits`(默认 2);`calc.round2` **不动**,新增 `product_round(value, product_id)`:查规则取位数 → quantize;接入点 = `in_qty`(转入份额)与普通申赎 qty 落库处;**T-14 才切换**(T-2 只建入口不接) | 避免 T-2 动全局行为导致回归爆炸;T-14 一次性切换 + 全量回归 | T-2 直接接管 round2(回归爆炸,驳回) |
|
||||
| R-14 | 补偿脚本改写后「重跑确认」语义 | `cleanup_pending_convert.py` 改为扫 `core_convert_request`:`accepted/nav_pending` 且受理日 < 当前业务日 − **2 个交易日** → `expired`(标记不硬删,S2 沿用);`rebuild_alerts.py` 继续仅凭 Core 侧数据(含 core_convert_lot_detail.nav/nav_date)补 agent 进度/审计 | Q14 拍板 SLA=2 交易日;验收 17 | 沿用 SLA 24h 自然小时(Q14 推翻,弃) |
|
||||
| R-15 | `convert_confirm_offset_days` 处置 | **废弃**(保留字段+COMMENT 标记 deprecated,不删防破坏既有 env);T-7 全程改用交易日历;**同法处置新增 `convert_cutoff_time`(默认 "15:00")与 `convert_confirm_sla_days=2`** | 自然日近似作废(Q11);cutoff 硬化(B1);不删字段保测试环境兼容 | 直接删除(破坏既有 env 引用,驳回) |
|
||||
@@ -786,6 +786,23 @@ engine 39 / api 89 / compensate 56 / apply 24 / lots 20 / tools 14 —— 2 位
|
||||
修订;② `rounding_mode='truncate'` 消费接入(真实存在但计划范围外,接入 =
|
||||
product_round 加 mode 参数 + 回退链透传 + 种子配 truncate 产品)。
|
||||
|
||||
**✅ 开口闭环(2026-09-12 用户三项拍板)**:① **PRD §2.5.3 已按核实结论修订**
|
||||
(删「易方达 ETF 场外取整数位」——无证据且有反证,真实整数位载体为场内;
|
||||
改记「2 位为主流 + 舍去型真实存在」,PRD 版本块加修订注记)。② **truncate
|
||||
消费接入已补做**(独立 AI 三轮审核未抓出 PRD 该句无出处,靠执行期联网核实
|
||||
兜底——外部事实断言必须联网核实的铁律再添一例):`core_ro.get_share_rounding`
|
||||
= 位数+模式回退链单点(规则行 → core_product → 默认 `(2,'half_up')`,mode
|
||||
合法性读取即校验,get_share_digits 转薄包装零破坏);`calc.product_round` /
|
||||
`in_qty` 加 `mode` 参数(`_ROUND_MODES = {half_up, truncate→ROUND_DOWN}`);
|
||||
确认段与网关申购折算两处透传。**载体 09-seed-org.sql ⑦ 段 PROD-005828**
|
||||
(11-seed 未覆盖 → 走 product 层回退,零转换场景引用 → 全套零回归)。**测试
|
||||
+7(842 → 849)**:calc 4(truncate 分化 / 非法 mode / in_qty 透传 / 默认一致
|
||||
锚点保持)+ 确认段 2(链路 truncate 34945.53 vs half_up 34945.54 天然分化;
|
||||
回退链逐层独立 + 规则行遮蔽语义 + 非法值)+ 申购段 1(对称)。**突变**:
|
||||
两调用点同拆 mode 透传 → 2 链路用例红;还原绿。真库 **9/9 退出码 0**
|
||||
(seed 新增 ⑫ 断言:⑦ 段载体在位)。③ **R-12 口径裁定用户追认**,条目已
|
||||
回写定稿(NULL 不参与 A/C 判定 / 同类走一般规则),T-17 执行记录同步。
|
||||
|
||||
---
|
||||
|
||||
### T-15 · D28 部分成交专项测试 + 边界补强
|
||||
@@ -897,7 +914,7 @@ core+confirm 37 全绿,MUTATION 零残留。
|
||||
**回滚点**:校验是前置分支,git 回退即还原
|
||||
|
||||
**✅ T-17 完成(D30 share_class + A/C 互转 · 2026-09-12 · 转换线收官)**:
|
||||
**① 口径裁定(R-12 字面两处偏差,取业务正确口径,登记待用户追认)**:
|
||||
**① 口径裁定(R-12 字面两处偏差,取业务正确口径,✅ 用户 2026-09-12 已追认定稿,R-12 条目已回写)**:
|
||||
(a) `share_class` **NULL 不参与 A/C 判定**——字面「不满足 → 400」会打穿全部既有
|
||||
受理用例(种子产品 share_class 全 NULL);实现 = 两端非空且不同才触发 A/C
|
||||
分支。(b) 字面「share_class 相同 → 400」**不采纳**:非空同类别跨基金互转走
|
||||
|
||||
Reference in New Issue
Block a user