文档:T-10 回写 + 全仓进度一致性(开发计划 DoD 全勾 + 执行记录)
- 开发计划 v2.0:T-10 六项 DoD 全勾(申购落批次 / 哨兵不超扣 / T+2 半开区间
双向 / 金额公式 D26 / 转换后不超扣验收 9 / rebuild 无漂移)+ 新增执行记录
(改法、验证证据 844 passed、真库 89/89、突防验证、3 处断点与口径)
- 交接文档 v4.0(gitignore 不入库,本轮未提交)
- AGENTS.md 入口引用 → T-1~T-10 ✅ / 844 / 89/89 / 下一步 T-11
- docs/memory/TODO.md:T-10 完成条目 + 待办行 T-11~T-17
- docs/memory/MEMORY.md:进度 + 自检第 5/6 问 → 844 / T-1~T-10
This commit is contained in:
@@ -616,12 +616,14 @@
|
||||
**依赖**:T-3
|
||||
|
||||
**DoD**:
|
||||
- [ ] 普通申购 → 新批次;普通赎回按 FIFO 扣批次,`remain_qty` 不出现负数(哨兵触发回滚用例存在)
|
||||
- [ ] T+2 用例:T+1 确认的转入批次在 T+2 前不可扣、T+2 起可扣(验收 27)
|
||||
- [ ] redeem 份额申报金额公式用例:`qty × T 净值 − 赎回费`(D26)
|
||||
- [ ] 转换后普通赎回:批次与持仓一致、不超扣(验收 9)
|
||||
- [ ] `rebuild_lots.py --dry-run`:无漂移报告
|
||||
- [ ] pytest 全量绿(test_trade_gateway 改写 + 既有共享)
|
||||
- [x] 普通申购 → 新批次;普通赎回按 FIFO 扣批次,`remain_qty` 不出现负数(哨兵触发回滚用例存在)—— `test_redeem_deducts_fifo_across_lots` + `test_deduct_sentinel_blocks_overdraw`
|
||||
- [x] T+2 用例:T+1 确认的转入批次在 T+2 前不可扣、T+2 起可扣(验收 27)—— `test_redeem_t2_not_yet_available_blocks_t1_lot`(申报 150 > 可赎 100 区分度)+ `test_redeem_t2_available_includes_t1_lot`(半开区间双向)
|
||||
- [x] redeem 份额申报金额公式用例:`qty × T 净值 − 赎回费`(D26)—— `test_redeem_amount_formula_qty_times_nav_minus_fee` 断言 `1000×1.0−5.0=995.00`
|
||||
- [x] 转换后普通赎回:批次与持仓一致、不超扣(验收 9)—— `test_redeem_after_convert_leaves_no_overdraw`
|
||||
- [x] `rebuild_lots.py --dry-run`:无漂移报告 —— 真库 58 持仓行 0 补建 0 写入
|
||||
- [x] pytest 全量绿(test_trade_gateway 改写 + 既有共享)—— **844 passed / 10 skipped**(基线 834 + 新增 11,零回归)
|
||||
|
||||
**✅ T-10 完成(普通申赎批次维护 + T+2 校验 + rebuild_lots · 2026-09-11)**:`trade_gateway` 主流程改 —— 新增 `_t2_available_from`(`trading_calendar.previous_biz_day`,日历缺行 try/except `ValueError` → `None` 不过滤,金额/扣减同口径);`_redeem_quote` 走 `available_qty_with_inflight` **硬校验**(R-3,申报超可赎抛 `InsufficientShares`,不静默裁剪改写客户指令);`_maintain_lots` redeem 分支三重裁剪(T+2 过滤 → D8 补建 → 在途占用 → 哨兵 FIFO 扣减);`core_ro.list_share_lots`/`share_lot_repository.select_for_convert` 加 `available_from` **T+2 半开区间过滤**(R-4,`confirmed_at < 前一交易日+1天`);`gateway_repository` 扣批次哨兵 `remain_qty >= :q`。**验证**:`tests/test_share_lot.py` +10 + `tests/test_trade_gateway.py` +1 → 全量 **844 passed / 10 skipped**(834+11 零回归);真库 `verify_convert_api.py` **89/89**(H 节提前到受理前执行 + 原位补 H2「受理占满在途后 redeem 申报抛 `InsufficientShares`」真库断言,88+1);`rebuild_lots.py --dry-run` 无漂移。**突防验证**:临时移除 `select_for_convert` 的 `available_from` 透传 → `test_*_t2_*` 变红(区分度成立,非假绿)→ 还原。**断点与口径**:① `AttributeError: TextClause.format` → 改为字符串 `.format(extra=...)` 再 `text(...)`;② 金额侧初版用 `plan_lots` 全量算、扣减侧裁剪到 `avail` → 改硬校验同口径;③ 在途占用(R-3)放普通赎回侧 = 同一份份额不能既等转换又已赎回。
|
||||
|
||||
**风险**:打穿 test_trade_gateway 大量断言(amount 反算)→ 回归面 §5 逐条处置;哨兵缺位致超扣(DoD 1 守护)
|
||||
**回滚点**:_maintain_lots 独立函数,git 回退即还原
|
||||
|
||||
Reference in New Issue
Block a user