基金转换 T+1 模型:T-1~T-6 落地(DDL/数据层/语义收窄/锁/受理事务)
AIcoding 第 5 步 todo 开发(开发计划 v2.0)前半段: - T-1 3 张新表 DDL(core_convert_request 6 态 ENUM / core_trade_calendar / core_share_rule)+ 种子 + sqlite 单一事实源同步 + 列清单断言 - T-2/T-2b calc 扩展(product_round/redeem_amount/partial_qty)+ 真实净值实算回填 - T-3 convert_request_repository(6 态 + 条件 UPDATE 守卫)+ core_ro 三读方法 + share_lot_repository.available_qty_with_inflight(R-3 在途占用推导) - T-4 convert_repository.sync_mirror 成为 risk_convert_detail 唯一进度镜像写入口 (旧三方法标 Deprecated,T-7 后删) - T-5 locks.py 锁键构造器 convert_req_lock_key / convert_confirm_lock_key - T-6 convert_service.accept_convert 受理事务(八步:锁→幂等→校验→受理日顺延 →在途占用校验→落单→镜像+审计→202;不扣份额/不折算/不写流水) + tests/test_convert_accept.py(16 用例) + scripts/dev/verify_convert_accept.py(真库 36/36 一致) + trading_calendar.py 纯函数包(R-5)+ 21 用例 T-6 真库实测暴露并修复:confirm_eta 在日历数据边界抛 ValueError,会让已落库 的受理单在调用方眼里变 500;改为展示性字段容错 + 单测守护。 基线:798 passed / 10 skipped,零回归。
This commit is contained in:
+1
-1
@@ -48,7 +48,7 @@ RBAC 联调账号:scripts/dev/rbac-seed-reference.md
|
||||
Client → Gateway(JWT/RBAC) → api/chat → agent_service(LangGraph) → Tools → 存储 → 响应 + audit_log
|
||||
```
|
||||
|
||||
当前:**风控事件线(B1~B9b)+ Wave 0 共用底座 + 风控阶段 C(C1~C3 对话线,tag risk-m2/risk-m3)+ T-04 Tool 节点 + T-03 输入防护 + T-21 知识库全部完成**(交易网关 → 规则引擎 → 预警/AML/L3 → 4 API,`main.py` 路由挂载 + trace 中间件 + audit 中间件 + lifespan;T-01/T-02/T-06/T-07/T-04/T-03/T-21 均经独立 AI 评审闭环)。**阶段一「对齐 main 基准」AL-01~AL-08 已完成(2026-09-07,406 测试绿;适当性判定换核 core_ro.check_suitability,risk_suitability_log 21 列,Core 表 is_hnw/风评 expires_at 新列,种子 33 客户/14 产品)**。**下一步:阶段一验收门(用户目视确认)→ AL-09 合并 main → 阶段二 C4~C6 编码**(FR-8 集中度/FR-9 时效升级/FR-10 代理人行为链,实现方案《docs/项目框架设计/实现方案-风控追加需求v1.1-C4C6.md》已定稿并经独立 AI 评审修订闭环,含定时任务 scripts/cron/* 与新增对话 Tool;编码未开始)。
|
||||
当前:**风控事件线(B1~B9b)+ Wave 0 共用底座 + 风控阶段 C(C1~C3 对话线,tag risk-m2/risk-m3)+ T-04 Tool 节点 + T-03 输入防护 + T-21 知识库全部完成**(交易网关 → 规则引擎 → 预警/AML/L3 → 4 API,`main.py` 路由挂载 + trace 中间件 + audit 中间件 + lifespan;T-01/T-02/T-06/T-07/T-04/T-03/T-21 均经独立 AI 评审闭环)。**阶段一「对齐 main 基准」AL-01~AL-08 已完成(2026-09-07,406 测试绿;适当性判定换核 core_ro.check_suitability,risk_suitability_log 21 列,Core 表 is_hnw/风评 expires_at 新列,种子 33 客户/14 产品)**。**下一步:阶段一验收门(用户目视确认)→ AL-09 合并 main → 阶段二 C4~C6 编码**(FR-8 集中度/FR-9 时效升级/FR-10 代理人行为链,实现方案《docs/项目框架设计/实现方案-风控追加需求v1.1-C4C6.md》已定稿并经独立 AI 评审修订闭环,含定时任务 scripts/cron/* 与新增对话 Tool;编码未开始)。**并行线:基金转换下一线(T+1 受理/确认分离模型,2026-09-11 进行中)——PRD v1.1 / 架构 v2.1 / 开发计划 v2.0 已整体重写并经独立审查收敛,已定稿 → 第 5 步 todo 开发进行中(T-1~T-6 ✅,797 绿,下一步 T-7),开工入口 交接文档.md §B.11**。
|
||||
|
||||
**本机已就位状态(2026-09-07 更新 · 已完成上述 ①~⑤,无需重做):** `.env` 已配置(学习项目,`MYSQL_PASSWORD=123456`;NEO4J/DEEPSEEK 留空——DEEPSEEK_API_KEY 空时 chat 走降级回复,不阻塞演示;`.env` 无 JWT 项,签发走默认 `JWT_DEV_SECRET`,**启动时出现默认密钥 warning 属预期**,生产形态须配 `JWT_PUBLIC_KEY_PATH`);`jinrong_core` + `jinrong_agent` 已灌库(**阶段一 AL-01/AL-08 后为 33 客户/14 产品/矩阵 25 行/风评 33** / AML 名单 8 条 / 演示测评 expires_at 新口径已刷新 / 归属同步 33 行);`python -m pytest` **406** 用例全绿(集成测试真连本机 MySQL,未灌库的机器自动 skip 集成模块;pytest 依赖装在系统 Python 3.13.14);**演示库已按阶段一新口径重灌并清理冒烟数据(2026-09-07),全量测试可直接跑,下次演示/走查后再按 SOP §2 重灌**;本机 Redis 服务在跑(`redis://127.0.0.1:6379/0`,B9a 订阅脚本已验证)。
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
| 代理人助手 Agent | L2 画像、RAG、草稿 | L1 只读、Milvus | 空壳 service(chat 骨架已通) |
|
||||
| 数据分析 Agent | NL→SQL→解读 | Core RO、画像只读 | 空壳 service(chat 骨架已通) |
|
||||
| 风控监测 Agent | 预警、L3、R-02 适当性 | 交易事件、AML 名单 | **已实现 B1~B7 + C1~C3(对话线四 Tool + risk 分支 StateGraph,A-6 验收)**;追加 FR-8/9/10(C4~C6:集中度/时效升级/行为链)方案已定稿待编码 |
|
||||
| **基金转换(convert)交易** | 转出赎回 + 转入申购、逐批次计费、补差费、批次维护 | Core 写(仅 `app/gateway/`)、`core_share_lot` 批次表、规则引擎 | ✅ **已实现(T-0 ~ T-13 全部完成 · 2026-09-10,736 passed / 10 skipped)**:PRD **v0.9.3** + 架构 **v1.0** + 开发计划 **v1.0**;HTTP 层 convert 已走通(`/api/simulate` 三型分池 → `trade_gateway._submit_convert` → 八步编排 → 阶段 1.5 引擎 → 补偿脚本);入口 项目根 `交接文档.md` §B |
|
||||
| **基金转换(convert)交易** | 转出赎回 + 转入申购、逐批次计费、补差费、批次维护 | Core 写(仅 `app/gateway/`)、`core_share_lot` 批次表、规则引擎 | ✅ **v0.x 两阶段实时模型已实现(T-0 ~ T-13 全部完成 · 2026-09-10,739 passed / 10 skipped)**;**下一线 T+1 受理/确认分离模型(2026-09-11 进行中)**:PRD **v1.1** + 架构 **v2.1** 已整体重写并通过独立 AI 联网审查(已定稿 2026-09-11)+ 开发计划 **v2.0** 已重做并经三轮独立审核闭环(已定稿 → 第 5 步 todo 开发进行中 T-1~T-6 ✅,下一步 T-7);入口 项目根 `交接文档.md` §B.11 |
|
||||
| Core 只读层 | L0 事实查询 | `jinrong_core` | **已实现 + 已接对话 Tool(T-04)**:core_ro 经 app/tool/core_tools.py 三只读 Tool(L0/持仓/流水)进 chat;风控扩展查询照旧 |
|
||||
| 共用底座 | 会话、审计、输入防护 | MySQL 11 表 + Redis | **已接入(2026-09-07)**:会话(T-06 session_repository + memory_service 窗口)、审计中间件(T-02 http_access + input_guard_log 双写)、agent_tool_call Tool 留痕(T-04)、输入防护(T-03 input_guard:注入词表纯函数检测 + oversize + Redis 固定窗口限流,chat 链路 限流→注入/超长→归属) |
|
||||
| 对话编排 | LangGraph StateGraph + DeepSeek | langgraph/langchain-openai | **已实现(T-07 骨架 + T-04 Tool 节点 + C1 风控四 Tool + C5 追加 query_overdue_alerts 共五只 + C2 risk 分支)**:tool(分组关键词意图→Tool,customer/advisor/risk)→llm→guard(免责声明);analyst 分支与 LLM intent 待后续 |
|
||||
|
||||
@@ -23,3 +23,4 @@
|
||||
| 2026-09-10 | **交接文档合并为单一入口 + 全仓指向统一**:三份交接文档合并为项目根 `交接文档.md`(**v3.0**,545 行)—— **§0 公共层** + **§A 风控模块主线** + **§B 基金转换线**(含工作区最新版 v1.4:T-0~T-2b 完成 / 609 passed)+ **§C 架构改进线**(含工作区最新版 v1.2:结项态 / 7/7 冒烟)。**全仓 10 处指向统一改到 `交接文档.md` §A/§B/§C**(`AGENTS.md` · `docs/memory/{MEMORY,TODO,FRAMEWORK}` · `PRD-架构改进与稳定性加固` · `开发计划-架构改进` · `TODO-架构改进` · `开发计划-基金转换交易`);两份 `docs/交接文档-*.md` **保留为历史留档并加醒目「已废弃·勿读」横幅**(未删除)。⚠️ `交接文档.md` 在 `.gitignore:47` 内、**不入库**(用户 2026-09-10 明确「不进提交」,交接文档只留本地) | 用户「统一一下,不是早都说过交接文档是给你 AI 接手用的吗」—— 交接文档的定位是 **AI 接手入口**,因此全仓指向必须唯一且不可指向过期文件,否则新会话会被误导到旧版(`docs/` 两份留档停在 v1.0/v1.1,不含 T-2/T-2b 等进度) | `交接文档.md`(**v3.0**,未入库) · `AGENTS.md` · `docs/memory/{MEMORY,TODO,FRAMEWORK,ITERATION}` · `PRD-架构改进与稳定性加固` · `开发计划-架构改进` · `TODO-架构改进` · `开发计划-基金转换交易` · `docs/交接文档-基金转换.md` / `docs/交接文档-架构改进.md`(加废弃横幅,保留留档) |
|
||||
| 2026-09-10 | **【事故·已恢复】`git rm` 会静默抹除整个 `docs/` 目录**:对 `docs/` 下两个中文名文件执行 `git rm`(带不带 `-f` 均如此)→ **`docs/` 全部 54 个文件从工作区消失**,且**返回退出码 0 不报错**(**复现 2 次**)。已排除中文路径(同路径 `ls` 正常)与自定义 hooks(`core.hooksPath` 空)→ **触发条件即 `git rm` 本身**,根因未查明。**零内容丢失**:`git checkout HEAD -- docs/` 完整还原 54 文件。改判:删文件用**纯 `rm -f <精确路径>`** + `git add -A` | 工具链缺陷(Git Bash on Windows + 中文名路径);教训:批量删除后必须立即复核文件数,异常立即从 HEAD 还原 | `docs/`(还原) · 规避纪律写入 `交接文档.md` §0.4 第 10 条 + `.workbuddy/memory/MEMORY.md` |
|
||||
| 2026-09-10 | **基金转换线第 5 步 + 第 6 步全部完成(T-3 ~ T-13 结项)**:批 2 仓储/代理/锁(`core_ro` 五方法 + `share_lot_repository` + `convert_repository` + `locks.try_lock`)→ **T-6** 阶段一单事务(`convert_core_repository.apply_convert`)→ **T-7** 八步编排(关键路径)→ **T-8** 规则引擎双视图分流(`amount_view` + `process_convert_event`,阶段 1.5 由「静默跳过」变「真跑」)→ **T-9** API 三型分池 + 网关分派(**HTTP 层 convert 走通** + 展示位数口径修复)→ **T-10** 普通申赎批次维护(FR-C16 + `rebuild_lots.py`)→ **T-11** 工具与 SQL 汇总去重(FR-C15 / R-d,`_amount_view` 提升为公开 `amount_view`)→ **T-12** 补偿脚本(`compensate_convert` 单点入口 + `cleanup_pending_convert.py`)→ **T-13** 全量回归 + 50 并发压测 + 性能补录。**基线 510 → 736 passed / 10 skipped**;7 个 convert 真库脚本复跑零回归;**T-13 压测暴露并修复 2 处并发缺陷**(阶段一失败后同键重试永久 503 · 同键竞态子窗口 A 真·双扣 / B 双扣+503);性能端到端 max 59.8ms / 阶段一 max 16.7ms(远未触阈值);跨客户并发 1213 死锁登记待评估 | AIcoding 第 5 步逐任务开发 + 第 6 步集成测试;用户「开」指令推进 T-13 收尾;方言语义一律上真库(用户 2026-09-10 拍板) | `app/service/convert/*` · `app/gateway/convert_core_repository.py` · `app/repository/{core_ro,convert_repository,share_lot_repository}.py` · `app/service/risk/{rules,engine,alert_service}.py` · `app/api/simulate.py` · `app/gateway/trade_gateway.py` · `tests/test_convert_{calc,service,core,integration,engine,concurrency}.py` · 7 个 `scripts/dev/verify_convert_*.py` · `scripts/agent/cleanup_pending_convert.py`(新) · `scripts/core/rebuild_lots.py`(新) · PRD-基金转换(v0.9.3) · 开发计划-基金转换(§10) · `交接文档.md`(§B v2.4,未入库) · MEMORY / TODO / FRAMEWORK / ITERATION / 当日日志 |
|
||||
| 2026-09-11 | **基金转换线整体重写为 T+1 受理/确认分离模型(v0.x 实时模型废弃)**:**PRD v1.1**(FR-C1~C31 / Q1~Q15 拍板 / 验收 31 条)与 **架构 v2.1**(状态机 6 态 `accepted/nav_pending/confirmed/rejected/cancelled/expired` / D1~D30 / §15 任务 T-0~T-17)整体重写,各经**独立 AI 联网审查通过(0 阻断级)**;**开发计划 v2.0(797 行)整体重做**——T-1~T-17 按架构 §15 重排 + §1.4 代码事实核对表 **F-1~F-25**(文件:行号)+ §1.5 实现级裁定 **R-1~R-15** + §5 十六条回归面 + §6 验收 31 条全映射,**经三轮独立审核闭环**(第一轮 2 阻断 B1/B2 + 5 重要 + 3 可选;第二轮验证型 12 项零残留;第三轮白纸重审 C1~C5+O1~O4 全修订 + 验证型复核 22/22 落位、D-1 残留修复)。**核心认知:不新增冻结列,在途占用由受理单推导;紧池 80% 病根在 T+1 串行确认下自动消失**。**修正动作**:全仓入口文件(AGENTS.md / 交接文档 §B / docs/memory/{MEMORY,TODO,FRAMEWORK})版本号统一为 v1.1/v2.1/v2.0,状态统一为「待用户批准定稿」,v0.x 标记为已结项/被取代(教训:重写文档必须全仓同步入口引用,否则新会话被误导到旧版)。**下一步:待用户批准定稿 → 第 5 步 todo 开发(T-1~T-17)**(**后记:2026-09-11 当晚用户批准开发计划 v2.0,第 5 步已开工,T-1~T-6 ✅**);撤单范围:PRD §5.5 原表述与实现(仅 accepted)不矛盾、无需回填(第三轮 C1 订正) | AIcoding 第 4 步重做(用户指出「按真实业务重写」——T 日受理未知价不扣份额、T+1 登记批量串行确认、T+2 可查,紧池并发问题在此模型下消失;并训示「定稿需用户批准,不得 AI 擅自宣布」) | PRD-基金转换(v1.1) · 架构设计-基金转换(v2.1) · 开发计划-基金转换(v2.0) · `fetch_nav.py` / `06-seed-nav.sql`(60 净值日)/ `gen_trade_calendar.py` / `10-seed-trade-calendar.sql`(503 交易日) · settings(`convert_cutoff_time`) · core_ro(`get_nav_on`) · AGENTS.md · 交接文档.md(§B) · docs/memory/{MEMORY,TODO,FRAMEWORK} · 当日日志 |
|
||||
|
||||
+10
-9
@@ -11,8 +11,9 @@
|
||||
|
||||
**当前进度:** 需求与表设计已定 · **风控模块 B1~B9b 全部完成(M2 tag risk-m2),M4 复核已闭环(2026-09-07),风控阶段 B 正式完结** · **Wave 0 已完成(2026-09-07,经独立 AI 评审闭环)**:T-01 JWT 鉴权(auth_service Auth SDK + deps 工厂替换 + X-Agent-Type 准入矩阵)/ T-02 审计中间件(http_access + 独立 request_id + 4xx/500 统一错误体 + input_guard_log 双写)/ T-06 chat 最小闭环(POST /api/chat + 会话落库 + Redis 窗口)/ T-07 LangGraph StateGraph 骨架 + DeepSeek(无 key 降级)· **T-04 Core RO Tool 节点已完成(2026-09-07)**:app/tool/core_tools.py 三只读 Tool + tool_service(意图/归属校验/run_tool)+ 图 tool 节点 + agent_tool_call 落库 + `utils/authz.py` 公共鉴权留痕,**321 测试绿(首评+复审双闭环)**。风控阶段 C 已完成(2026-09-07,345 绿,tag `risk-m3`,A-6 对话线验收通过,独立 AI 评审 PASS P0=0)。T-03 输入防护已完成(2026-09-07,378 绿,独立 AI 评审 PASS with findings P0=0):app/service/input_guard.py 注入词表 45 条纯函数检测 + oversize 4000 + actor 级 Redis 固定窗口限流 30 次/分(fail-open);chat 链路顺序 = 鉴权→准入→空白→限流 429→注入/超长 400→归属→会话,被拒 fail-fast 不建会话,blocked 落 input_guard_log(ENUM 四值已用满)。**阶段一「对齐 main 基准」AL-01~AL-08 已完成(2026-09-07,逐项独立 commit bb244f4~b5fd52e):适当性判定换核为 main 的 core_ro.check_suitability(C×R 矩阵表数据驱动,match_result 五值/JR-AST-012/FM-01/FM-03/JR-AST-PRO 契约,SUIT-001~008 退役);risk_suitability_log 重建 21 列;Core 表加 is_hnw/风评七新列(expires_at);种子 33 客户/14 产品;全量 406 passed 0 failed 0 skipped + uvicorn 冒烟三端点通过;risk-m1 已补打(指向 3c07de6)**。**下一步:阶段一验收门(**合并 main 前的最终交付检查点,非分支开发阻塞**;用户浏览器目视确认 UI)→ AL-09 合并 main → AL-10 PRD v1.2 → AL-11 docx 登记 → 阶段二 C4~C6(**已完成并打 `risk-m4` tag**)/ 前端 React 多 Agent 入口(HashRouter `web/` init)。****开发在分支 `risk-control-agent`(与 origin/main 已分叉:领先 84 提交 / 落后 0,origin/main 为分支祖先;**分支已推送远程,origin/risk-control-agent 同步于 `1d00e53`,本地跟踪已建立**;**架构改进与稳定性加固 T-101~T-202 已于 2026-09-09 完成并推送 origin/risk-control-agent(2d0e2fa..f733fc2 快进,pytest 510 绿,较 503 基线 +7 例:T-201.3 双层锁 6 例 + T-202 trace 顺序守卫 1 例),含 Redis 双层分布式锁 T-201 与审计中间件 trace 顺序守卫 T-202,均为文档/告警/锁原语修正、接口契约与表结构零变更;远程已提示走 PR 合并 main;**合并(risk-control-agent → main)由合并执行人负责,不归用户管**——AI 只负责把分支推到远程 + 更新文档,不得主动发起 PR / 执行合并,移交执行人按《合并注意事项-风控模块并入main.md》操作。** 旧文档中的 `feature/risk` 为过时口径)。**
|
||||
|
||||
**⚡ 并行新线 · 基金转换(convert)交易(2026-09-10 全流程闭环,**T-0 ~ T-13 已全部完成,无待办**):** `PRD-风控监测Agent` FR-1 一期显式拒收 convert,本线将其放开。**AIcoding 第 1~4 步已完成**:PRD **v0.9.3 定稿**(33 条外审闭环 + 2 处架构回填 + **费率分类修正** + **展示位数补全** + **§9 第 18 条实测补录**)→ 架构 **v1.0.1 定稿**(独立评审通过,13 条建议 **0 悬空**,接受 10 / 修正性接受 3 / 驳回 0)→ 门控 **M-7 已满足** → **开发计划 v1.0 已产出(`docs/项目框架设计/开发计划-基金转换交易.md`,**1,047 行**)并经**四轮**独立子代理审核收敛(**12 条意见 → 接受 11 / 驳回 1(附实测证据)/ 0 悬空**)。**第 5 步 + 第 6 步均已完成:T-0 ~ T-13 已于 2026-09-10 全部完成(T-9 里程碑时 697 passed / 3 skipped;T-1 断言 8/8 PASS;T-2 纯函数包 7 文件 / 93 用例;T-2b 实算脚本 15/15 一致;T-6 真库 24/24;T-7 真库 35/35;T-8 真库 31/31;T-9 真 MySQL 集成 8 条 + 11 条错误码映射 + 4 组突变验证 + **展示位数口径修复**)**,**T-10 ✅(普通申赎批次维护 · 回归风险最大 · +17 用例 / 真库 20/20)、T-11 ✅(工具与 SQL 汇总去重 · +4 用例 / 真库 14/14)与 T-12 ✅(补偿脚本 · +12 用例 / 真库 34/34 · 全套 7 真库脚本复跑零回归)均已完成**,**T-13 ✅(全量回归 + 50 并发压测 + 性能补录)亦已完成** —— 压测暴露并修复 **2 处并发缺陷**(阶段一失败后同键重试**永久 503** · 同键竞态子窗口 A **真·双扣** / B 双扣+503,修法 = `insert_placeholder` 三步法 + 幂等判定 `pending`→202 + 撞键让路→202)、**50 并发不超卖**(实测成交 20~25,理论上限 25)、**紧池退避 40/50 = 80%(不够用,根因近空批次反复争抢)**、**松池 50/50 = 100%**、**跨客户并发触发 InnoDB 1213 死锁**(登记待评估)、**性能端到端 P50 44.2 / P95 51.5 / max 59.8 ms、阶段一 P50 9.8 / max 16.7 ms**(远未触阈值、未改任何实测值),实测值已回填 PRD §9 第 18 条(**v0.9.3**);**基线 736 passed / 10 skipped**,`CONVERT_STRESS=1` 并发 9/9。**本线全部任务闭环,无待办**。**开工前置两个阻断项(✅ 2026-09-10 均已完成)**:**T-0**(sqlite/MySQL 结构对齐:`core_holding` 列名+PK **+ 补 `core_product_nav`**,建库自校验,**同步改 2 处测试 INSERT 并补 3 个 NOT NULL 列**)与 **T-0b**(**DB 账号分离 D20**:`xh_core_ro` SELECT 全库 / `xh_core_rw` **4 表写**无 DELETE·DDL / `xh_agent_rw` **`audit_log` 只授 SELECT+INSERT**(不可改删);**`conftest.py` 四处 engine 已显式 `role="admin"`**)。**遗留环境操作**:`scripts/core/00-grant.sql` 需管理员执行一次 + 写 `.env`,未执行时 3 条权限断言自动 skip,不阻塞 T-1。设计资产五件套:`docs/PRD/PRD-基金转换交易.md` · `docs/项目框架设计/架构设计-基金转换交易.md` · **`docs/项目框架设计/开发计划-基金转换交易.md`(新)** · `评审待办-风控主架构与基金转换.md` · `基金转换-审查意见处置表.md`。**开工前必读开发计划 §1.4(15 条代码事实)/ §1.5(7 条实现级裁定 R-a~R-g)/ §12(16 条回归面)** —— 尤其是 **R-a(弃用方言 UPSERT)· R-b(流水写 redeem/subscribe 不写 convert)· R-e(conftest 用 admin)** 三条,不读必踩。**交接入口:项目根 `交接文档.md` §B(三线合并版唯一入口)**。合规基准 = 证监会公告〔2025〕22 号。
|
||||
|
||||
**⚡ 基金转换(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 开发进行中(T-1~T-6 ✅,797 绿,下一步 T-7)**。撤单范围:PRD §5.5 原表述与实现(仅 `accepted`)不矛盾、无需回填(第三轮 C1 订正)。已就绪:`fetch_nav.py` / `06-seed-nav.sql`(60 个真实净值日)/ `gen_trade_calendar.py` / `10-seed-trade-calendar.sql`(503 交易日)。
|
||||
**仓库地图:**
|
||||
|
||||
| 路径 | 状态 | 说明 |
|
||||
@@ -44,9 +45,9 @@
|
||||
| `docs/项目框架设计/表设计/` | 已定 | Agent 共用 11 表 + agent 专用 SQL |
|
||||
| `docs/项目框架设计/Core模拟底座/` | 已定 | 无真实 Core 时的 L0 方案 |
|
||||
| `web/` | **不存在** | 前端 React 待 init |
|
||||
| `docs/PRD/PRD-基金转换交易.md` | **已定稿(v0.9.3)** | 基金转换线需求权威(FR-C1~C16 / §4 表结构 / §5 接口 / §9 验收 · 第 18 条 T-13 实测补录);✅ **代码已实现** |
|
||||
| `docs/项目框架设计/架构设计-基金转换交易.md` | **已定稿(v1.0)** | 基金转换实现依据(D1~D20 / §5 事务 / §11.1 DB 账号 / §15 任务 T-0~T-13);✅ **代码已实现** |
|
||||
| `docs/项目框架设计/开发计划-基金转换交易.md` | **已定稿(v1.0 · 2026-09-10)** | **基金转换实现计划**(T-0~T-13 逐任务改法 + DoD + §1.4 **十五条代码事实核对表** + §1.5 **七条实现级裁定 R-a~R-g** + §12 **十六条回归面** + 四轮审核记录 + **§3.3 第 0 批 + §4.1 第 1 批执行记录**);**T-0 ~ T-13 已全部实现** · **开工必读** |
|
||||
| `docs/PRD/PRD-基金转换交易.md` | **v1.1 重写(2026-09-11)** | 基金转换线需求权威(T+1 受理/确认分离模型,FR-C1~C31 / Q1~Q15 拍板 / 验收 31 条);**独立 AI 联网审查通过,已定稿(2026-09-11 用户批准)**(取代 v0.9.3) |
|
||||
| `docs/项目框架设计/架构设计-基金转换交易.md` | **v2.1 重写(2026-09-11)** | 基金转换实现依据(状态机 6 态 / D1~D30 / §15 任务 T-0~T-17);**独立 AI 联网审查通过,已定稿(2026-09-11 用户批准)**(取代 v1.0/v1.0.1) |
|
||||
| `docs/项目框架设计/开发计划-基金转换交易.md` | **v2.0 重做(2026-09-11)** | **基金转换实现计划(T+1 模型)**:T-0~T-17 逐任务改法 + DoD + §1.4 **代码事实核对表 F-1~F-25** + §1.5 **实现级裁定 R-1~R-15** + §5 **十六条回归面** + §6 验收 31 条 + FR-C29/C30 映射 + 三轮审核记录;**经三轮独立审核闭环,已定稿(2026-09-11 用户批准)**。旧 v1.0(v0.x 模型)作废 |
|
||||
| 项目根 `交接文档.md` | **v3.0(2026-09-10 三线合并)** | **全仓唯一交接入口**(§0 公共层 + §A 风控主线 + §B 基金转换线 + §C 架构改进线)——**给下一会话 AI,读完即可开工**;⚠️ 在 `.gitignore:47` 内、**不入库**,是本地文件。`docs/交接文档-基金转换.md` / `docs/交接文档-架构改进.md` 为**历史留档,内容已过期,勿读** |
|
||||
|
||||
**本地 bootstrap(首次):** 完整步骤与前置说明见 `FLOW.md` §0(权威),速览:
|
||||
@@ -70,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/)。
|
||||
|
||||
**另(2026-09-10 待办)**:① **基金转换线** ✅ **全流程闭环(T-0 ~ T-13 全部完成、736 绿,无待办)**;设计与开发计划均已闭环,入口 项目根 `交接文档.md` §B);② ~~架构改进线收尾~~ —— **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-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**。
|
||||
|
||||
**禁止(改代码前必记):** Core 正式 C1~C5 不可被画像覆盖 · 审计表只 INSERT · 代理人草稿不外发 · 仅 R-02 可阻断交易 · 四 Agent 不互调 LLM。
|
||||
|
||||
@@ -181,7 +182,7 @@ RBAC 联调账号:scripts/dev/rbac-seed-reference.md
|
||||
| `docs/项目框架设计/` | 表结构、JWT 手册、Core 模拟、技术版本 |
|
||||
| `docs/业务记忆管理/` | Redis 短期 vs MySQL/Milvus/Neo4j 权威记忆 |
|
||||
| 项目根 `交接文档.md` §B | **基金转换线开工入口** —— 接手本线先读这一节(不必重读代码) |
|
||||
| `docs/PRD/PRD-基金转换交易.md` · `docs/项目框架设计/架构设计-基金转换交易.md` | 基金转换需求与实现依据(**v0.9.3 / v1.0.1,代码已实现**) |
|
||||
| `docs/PRD/PRD-基金转换交易.md` · `docs/项目框架设计/架构设计-基金转换交易.md` | 基金转换需求与实现依据(**v1.1 / v2.1,T+1 受理/确认分离模型,重写审查通过已定稿(2026-09-11 用户批准)**) |
|
||||
|
||||
缺 `docs/memory/*` 文件:按 project-memory-kit 同名补回,**禁止空模板盖进度**。
|
||||
|
||||
@@ -199,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` 全量(当前 **736 passed / 10 skipped**,基线 510)· uvicorn 启动 + /health · SQL / sync 脚本 · 对照 REQUIREMENTS 验收列)
|
||||
6. **当前有哪两条并行线?**(① 风控/架构改进线:**已结项**(510 基线绿、§7.2 七项冒烟 7/7 PASS、`037ce7e` 已核实早已推送);② **基金转换线**:设计与开发计划闭环,**全流程闭环 —— T-0~T-13 已全部完成(736 passed),无待办**)——动代码前先确认自己属于哪条线,别混淆前置条件。
|
||||
5. 如何验证?(`python -m pytest` 全量(当前 **739 passed / 10 skipped**,基线 510)· uvicorn 启动 + /health · SQL / sync 脚本 · 对照 REQUIREMENTS 验收列)
|
||||
6. **当前有哪两条并行线?**(① 风控/架构改进线:**已结项**(510 基线绿、§7.2 七项冒烟 7/7 PASS、`037ce7e` 已核实早已推送);② **基金转换线**:v0.x 实时模型已结项(739 绿,**已被 T+1 模型取代**);**下一线 T+1 受理/确认分离模型进行中(2026-09-11)**:PRD v1.1 / 架构 v2.1 / 开发计划 v2.0 重写完毕并经独立审查收敛,**已定稿**(2026-09-11 用户批准),批准后进第 5 步 todo 开发(T-1~T-17))——动代码前先确认自己属于哪条线,别混淆前置条件。
|
||||
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 <sha>` 返回 0,但松散引用消失,**且整个 `refs/remotes/origin/` 目录被删**
|
||||
|
||||
+17
-2
@@ -7,11 +7,14 @@
|
||||
|
||||
**阶段一 AL-01~AL-08 与阶段二 C4~C6 均已完成(2026-09-07)**:全量 pytest **482 passed 0 failed 0 skipped**(真库集成)✓ · uvicorn 冒烟三端点 ✓ · 接口实调验收 ✓(2026-09-07:suitability/check 阻断+放行、simulate/trade 阻断、三条鉴权边界 401/403/403,契约零偏差)· risk-m1~m4 tag 齐。**合并 main 已移交合并执行人**(操作手册:《docs/项目框架设计/合并注意事项-风控模块并入main.md》,随分支上传),后续模块侧待办见下方。
|
||||
|
||||
**⚡ 并行新线 · 基金转换(convert)**(2026-09-10):**设计 + 开发计划均已闭环** —— PRD **v0.9.3** + 架构 **v1.0.1** + 独立评审 13 条 **0 悬空**(接受 10 / 修正性接受 3 / 驳回 0),门控 **M-7 已满足**;**第 4 步开发计划 v1.0 已产出并经独立审核**(4 条意见全接受、**驳回 0**,含新增 2 条回归面 R15/R16 + R-c 双条修订);**第 5 步 + 第 6 步均已完成**:**T-0 ~ T-13 已于 2026-09-10 全部完成**(**736 passed / 10 skipped**;T-1 断言 **8/8 PASS**、T-2 纯函数 **93 用例**、T-2b 实算 **15/15 一致**、T-6 真库 **24/24**、T-7 真库 **35/35**、**T-8 真库 31/31**、**T-9 真 MySQL 集成 8 条 + 4 组突变验证 + 展示位数修复**、**T-10 新增 17 用例 + 真库 20/20 + 2 组突变验证**、**T-11 新增 4 用例 + 真库 14/14 + 3 组突变验证 · `amount_view` 提升为公开**、**T-12 新增 12 用例 + 真库 34/34 + 3 组突变验证 · 补偿逻辑收敛到 `compensate_convert` 单点**),**T-13 ✅ 已完成(全量回归 + 50 并发压测 + 性能补录):压测暴露并修复 2 处并发缺陷(阶段一失败后同键重试永久 503 · 同键竞态子窗口 A 真·双扣 / B 双扣+503)、50 并发不超卖(成交 20~25)、紧池退避 40/50=80%(不够用,根因近空批次反复争抢)、松池 100%、跨客户 1213 死锁已登记、端到端 P50 44.2ms/max 59.8ms · 阶段一 P50 9.8ms/max 16.7ms**。**本线全部任务闭环,无待办**。两个阻断前置(**T-0** sqlite/MySQL 列名统一 + 建库自校验 · **T-0b** DB 账号分离 D20:`xh_core_ro`/`xh_core_rw`/`xh_agent_rw`)**均已落地**。**入口:项目根 `交接文档.md` §B(三线合并版唯一入口,读这一节即可开工)**;**开工前必读开发计划 §1.4(15 条代码事实)+ §1.5(8 条实现级裁定 R-a~R-h)+ §12(16 条回归面)**。
|
||||
**⚡ 并行新线 · 基金转换(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`,797 行,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-11):T-1 ~ T-6 完成(全量 pytest 797 passed / 10 skipped 零失败;T-6 真库 verify 36/36 退出码 0),下一步 T-7(三段编排 + confirm_service,核心重写)**。**待用户确认开工 T-7**。撤单范围:PRD §5.5 原表述与实现(仅 `accepted`)不矛盾、无需回填(第三轮 C1 订正)。
|
||||
|
||||
### 基金转换线待办(推荐顺序)
|
||||
|
||||
- [x] **【第 4 步】产出开发计划** —— **完成(2026-09-10)**:`docs/项目框架设计/开发计划-基金转换交易.md`(**1,047 行**,含 T-0~T-13 任务拆解 + 逐条改法 + DoD + **四轮审核记录**)。**四轮独立子代理审核已收敛:12 条意见 → 接受 11 / 驳回 1(附实测证据)/ 0 悬空**(第一轮:补 R15 真 MySQL 集成用例 `test_integration_risk.py:426-437` + 补 R16 redeem 用例 + **R-c 拆「降级规则 + 覆盖率补偿」双条** + F-11 计数 11→13 更正;第二轮:发现**执行权锁是请求粒度**致并发首次建行撞 UNIQUE → **R-a 增第 ③ 步 `IntegrityError` 回退 UPDATE**,并实测排除 `WHERE NOT EXISTS`/`FROM DUAL` 两个不可移植写法;第三轮:修 §14「四道→五道」口径不一致 + 驳回「SQLAlchemy 会抛 PendingRollbackError」的推测;第四轮:终验通过、无「声明已改实际未改」残留)。**本计划新增的增量资产**:§1.3 两处 PRD-架构口径裁定(W-1/W-2)· §1.4 十五条代码事实核对表 · §1.5 七条实现级裁定(**R-a「条件 UPDATE → 首次 INSERT → `IntegrityError` 回退 UPDATE」三步**、R-b 流水写 redeem/subscribe 不写 convert、R-c 批次降级+覆盖、R-d `sum_trades_on_date` 去重、R-e conftest 用 admin 角色、R-f `core_product_nav` 并入 T-0、R-g 自校验落 `_ddl.py`)· §12 十六条回归面 · §13 PRD 19 条验收映射 · §14 新增实现级风险表
|
||||
- [x] **【第 4 步重做】产出开发计划 v2.0(T+1 模型)** —— **完成(2026-09-11)**:`docs/项目框架设计/开发计划-基金转换交易.md` **整体重做为 v2.0(797 行)**——T-0/T-0b 沿用(✅ 已完成),T-1~T-17 按架构 v2.1 §15 重排 + §1.4 **代码事实核对表 F-1~F-25**(实测文件:行号)+ §1.5 **实现级裁定 R-1~R-15** + §5 十六条回归面 + §6 验收 31 条全映射(+FR-C29/C30)+ §7 风险 14 条。**经三轮独立审核闭环**:第一轮 2 阻断(**B1** `convert_cutoff_time` 配置缺失违反 PRD §2.6.1 不得硬编码 → 已加 settings 全链读;**B2** `core_ro.get_nav_as_of` 实为 `nav_date <= :d LIMIT 1` 回退查询,缺 T 日净值会静默取 T−1 致 nav_pending 永不触发 → 已改新增 `get_nav_on` 精确匹配)+ 5 重要 + 3 可选全闭环;第二轮验证型逐条核实 12 项零残留;**第三轮白纸重审**抓出 5 重要(C1 撤单引述订正 / C2 §6 补 C29·C30 / C3 回归面补 redeem 6 处 / C4 删 0 命中误引 / C5 cash_flow 归属厘清)+ 4 可选,**验证型复核 22/22 落位 + D-1 残留修复**。**状态:已定稿(2026-09-11 用户批准)**(批准后进第 5 步 todo 开发)。⚠️ 开发计划 v2.0 语义与旧 v1.0 **完全不同**(v1.0 是 v0.x 实时模型,作废)
|
||||
- [x] **【第 4 步】产出开发计划 v1.0(v0.x 模型 · 历史)** —— **完成(2026-09-10,已被 v2.0 取代)**:`docs/项目框架设计/开发计划-基金转换交易.md`(原 **1,047 行**,含 T-0~T-13 任务拆解 + 逐条改法 + DoD + **四轮审核记录**)。**四轮独立子代理审核已收敛:12 条意见 → 接受 11 / 驳回 1(附实测证据)/ 0 悬空**。**本计划新增的增量资产**:§1.3 两处 PRD-架构口径裁定(W-1/W-2)· §1.4 十五条代码事实核对表 · §1.5 七条实现级裁定 · §12 十六条回归面 · §13 PRD 19 条验收映射 · §14 新增实现级风险表。**注:该版本属 v0.x 两阶段实时模型,2026-09-11 已随模型切换整体作废(v2.0 重做,见上条)**
|
||||
- [x] **【第 5 步 · T-0 · 阻断前置】sqlite/MySQL 结构对齐 + 建库自校验** —— **完成(2026-09-10)**:`tests/_ddl.py` 重写 `core_holding`(`qty`/`cost_amount`/`as_of`/`pnl_pct` + PK + `uk_cust_product`)+ 补 `core_product_nav`(R-f)+ `_assert_ddl_aligned()` 建库自校验(R-g);2 处测试 INSERT(`test_chat_tools.py:81`、`test_concentration_c4.py:74`)改 `qty` **并补 3 个 NOT NULL 列**(原计划漏项);`test_db.py` 新增 `test_core_holding_columns` / `test_core_product_nav_columns` / `test_ddl_alignment_guard_fails_when_column_missing`(反向验证门禁,无需手工改删)
|
||||
- [x] **【T-0b · 阻断前置】DB 账号分离(D20)** —— **完成(2026-09-10)**:`scripts/core/00-grant.sql` 新建(3 账号逐表授权,**不进 reset.ps1**);`settings.py` +6 项;`db.py` 改 `get_engine(db, role)` + `_resolve_credentials`(缓存键 `(db, role)`,未配置回退 `mysql_user`);`core_ro`→`ro` · `gateway_repository`→`rw` · `risk_repository`/`session_repository`→`rw` 显式;`conftest.py` 4 处→`admin`(R-e)。**两处口径修正**:① `audit_log` 实授 **`SELECT, INSERT`**(字面「只授 INSERT」会剥夺读,致 `has_engine_error_audit`/`list_audit_events` 失权)② conftest 必须 admin。**遗留环境操作**:`00-grant.sql` 需管理员执行 + 写 `.env`,未执行时 3 条权限断言自动 skip
|
||||
- [x] **【T-1 · 第 1 批】DDL + 种子 + sqlite 同步** —— **完成(2026-09-10)**:`scripts/core/01-ddl.sql` 新建 `core_fee_rule`/`core_share_lot`/`core_convert_lot_detail` + `core_trade` 加 `convert_group_id`+索引 + `core_product` 加 8 列(`subscribe_fee_rate` 等)+ `fee_rate` 补 COMMENT;**新增 `07-seed-fee-rule.sql`**(14 产品 × 5 档,按 22 号文 §10)/ **`08-seed-share-lot.sql`**(58 行持仓 → 61 行批次,Σ remain_qty 恒等于 qty,CUST-9527 跨批次)/ **`09-seed-org.sql`**(管理人 + TA + 申购费率 + 最低持有余额);`reset.ps1` 追加 07/08/09;`02-mysql-agent专用.sql` 追加 `risk_convert_detail`(status ENUM 建表即 5 值);`tests/_ddl.py` 同步 4 表 + `REQUIRED_CONVERT_TABLES` 门禁。**验证**:新增 `scripts/dev/verify_convert_seed.py`(pymysql 等价 reset 流程 + 8 条断言)→ **8/8 PASS**;`pytest -q` → **516 passed / 3 skipped(零回归)**。**3 点需注意**:① mysql 不在 PATH → 用该脚本替代 reset.ps1;② `core_fee_rule` 读取走只读账号(T-6 遵守);③ ~~`PROD-005827` 费率分类口径差异(`mixed` vs 主动偏股)待裁定~~ → **已裁定并修正(PRD v0.9.1)**:`mixed` 归位 `0.0050`(其他混合型),主示例转入方改真主动偏股 `PROD-003095`,`09-seed-org.sql` 升 **v1.1** 按「管理人全产品线」重排,并新增断言 ⑧ 机器化卡口
|
||||
@@ -21,6 +24,18 @@
|
||||
- [x] **【T-13 ✅】**(最后一个 · **已完成 2026-09-10**):**全量回归 → 50 并发压测 → 性能实测补录 → PRD §9 第 18 条数字回填**。**DoD 三条**:① 性能实测值**已回填** PRD §9 第 18 条(v0.9.3,替换「预估 < 100ms」);② 50 并发结论(不超卖 / `100/200/400ms` 退避**不够用**)**已写入** `交接文档.md` §B.6.6;③ 实测**未超阈值** → 无需重定阈值(**未修改实测数据**)。**产出**:`tests/test_convert_concurrency.py`(9 条 · `CONVERT_STRESS` 门禁)+ `test_convert_service` +3 + 修复 `insert_placeholder` 三步法 / 幂等判定 `pending`→202;**736 passed / 10 skipped**、`CONVERT_STRESS=1` 并发 **9/9**、重灌双库复跑零回归、4 组突变验证全命中。
|
||||
- [ ] **【待用户裁定】幂等重放响应的数值位数偏差**(T-9 执行期发现,**未顺手改**):首次响应 2 位(`calc` 量化)vs 重放响应 4 位(`core_trade` `DECIMAL(18,4)` 直读)→ `"53456.95"` vs `"53456.9500"`,**数值相等**,违反 PRD「对外一律 2 位」展示契约,属 T-7 `_rebuild_quote` 范畴。集成测试已「比数值不比字符串」并钉住偏差
|
||||
|
||||
### 第 5 步 · T+1 受理/确认分离模型(T-1 ~ T-17 · 进行中)
|
||||
|
||||
- [x] **T-1 DDL + 种子 ✅(2026-09-11)**:`01-ddl.sql` 新建 `core_convert_request`(6 态 ENUM 权威状态机)/ `core_trade_calendar` / `core_share_rule` + `core_product` 补 4 列;`11-seed-share-rule.sql`(42 行);`reset.ps1` 追加 10/11;`settings` 加 `convert_cutoff_time="15:00"` / `convert_confirm_sla_days=2`;`tests/_ddl.py` 三表同步;`verify_convert_seed.py` 加 DoD ⑨⑩⑪(503 交易日 / 42 行 / 6 态 ENUM,真库全 PASS)
|
||||
- [x] **T-2 calc 扩展 ✅**:`calc.py` 加 `product_round` / `redeem_amount` / `partial_qty`(`__all__` 同步);`test_convert_calc.py` +10 用例
|
||||
- [x] **T-2b 示例实算回填 ✅**:`calc_convert_demo.py` 改真实净值(T=2026-09-09 `PROD-110022=1.3604` / `PROD-003095=1.9194`)+ 15 项 EXPECTED;`test_convert_integration.py` 净值常量与 5 处硬断言同步;demo 15 项逐字节一致
|
||||
- [x] **T-3 数据层 ✅**:`core_ro` 加 6 方法(含 `get_nav_on` 精确匹配、`sum_inflight_qty`、`is_open`、`get_share_rule`);`share_lot_repository` 加 `available_qty_with_inflight`;新建 `convert_request_repository.py`(6 态条件 UPDATE);修 1 处生产 bug(`sum_inflight_qty` 列名 `product_id`→`from_product_id`)
|
||||
- [x] **T-4 语义收窄 ✅**:`convert_repository` 新增唯一写入口 **`sync_mirror`**(三步法幂等重写;status 只允许 pending/completed/failed,写 cancelled/expired 直接 ValueError);v1.0 遗留 `insert_placeholder`/`complete_convert`/`mark_failed` 标 Deprecated(T-7 后删除);状态迁移职责归 `convert_request_repository.transition_status`
|
||||
- [x] **T-5 锁原语 ✅**:新增 `app/service/convert/trading_calendar.py`(纯函数包,`is_open` 谓词注入,不查库)+ 单测;`locks.py` 补锁键单一事实源;受理接入 `run_locked`
|
||||
- [x] **T-6 受理事务 ✅**:`accept_convert` 八步落地(幂等前置 → 产品/份额/适当性 → 受理日顺延 R-5 → 可用份额 R-3 → 落 `core_convert_request(accepted)` → 镜像 + 审计 → 202 回执);新增 `tests/test_convert_accept.py`;**真库 `verify_convert_accept.py` 36/36 一致(退出码 0)**
|
||||
- [ ] **T-7 三段编排 + `confirm_service`(核心重写)** —— **下一步**:确认事务 9 步(T 日净值精确匹配 → T+1 适当性复核 → FIFO 扣批 → 部分成交 R-10 → 折算 → 2 条流水 + 明细 → 两端持仓 → confirmed → 引擎恰一次)+ `confirm_batch` 串行批处理;DoD 要求 `verify_convert_confirm.py` 真库 8 条
|
||||
- [ ] T-8 ~ T-17(引擎时机 / API 受理接口 / 撤单 / 调换 / 工具 / 补偿 / 回归 / D27 产品级舍入 / D28 巨额赎回 / D29 资金流中转 / D30 A/C 互转)
|
||||
|
||||
> **第 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)。
|
||||
> **本线已全部闭环(T-0 ~ T-13)**。基线 **736 passed / 10 skipped**(T-10 后 714 → T-11 后 718 → T-12 后 731 → **T-13 后 736**,+5);`CONVERT_STRESS=1` 另跑 9 条并发用例全绿。
|
||||
> **T-11 执行期两条裁定**:① `_amount_view` **提升为公开 `amount_view`**(跨层复用,全仓唯一金额聚合口径);
|
||||
|
||||
Reference in New Issue
Block a user