diff --git a/AGENTS.md b/AGENTS.md index 60e262f..3aea751 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,5 +1,9 @@ # Agent +**⚡ 需要接手/开工,先读项目根「[交接文档.md](交接文档.md)」** —— 三线合并版**唯一交接入口**: +**§0 公共层**(铁律 / 环境 / 已知坑 / 禁止事项)· **§A 风控模块主线** · **§B 基金转换(convert)线** · **§C 架构改进线**。 +(该文件在 `.gitignore` 内、不入库,是**给 AI 接手用的本地文件**;`docs/交接文档-*.md` 两份为**历史留档,内容已过期,勿读**。) + **无上下文时先读** [docs/memory/MEMORY.md](docs/memory/MEMORY.md) **§0 交接清单**(5 分钟了解仓库地图、bootstrap、禁止项、下一步)。 ## 阅读顺序 @@ -20,8 +24,9 @@ - 技术选型 / JWT:`docs/项目框架设计/技术选型和版本/` - Core 模拟底座:`docs/项目框架设计/Core模拟底座/` - 业务记忆分层:`docs/业务记忆管理/业务记忆管理手册.md` -- **基金转换线(第 5 步进行中 · T-0/T-0b/T-1/T-2/T-2b 已完成 · 下一步 T-3)**:开工入口 `docs/交接文档-基金转换.md` · `docs/PRD/PRD-基金转换交易.md`(v0.9.1)· `docs/项目框架设计/架构设计-基金转换交易.md`(v1.0)· `docs/项目框架设计/开发计划-基金转换交易.md`(v1.0 · T-0~T-13 逐任务改法 + DoD) -- **架构改进线(已交付 · 待收尾)**:开工入口 `docs/交接文档-架构改进.md` +- **基金转换线(第 5 步进行中 · T-0/T-0b/T-1/T-2/T-2b 已完成 · 下一步 T-3)**:开工入口 **`交接文档.md` §B** · `docs/PRD/PRD-基金转换交易.md`(v0.9.1)· `docs/项目框架设计/架构设计-基金转换交易.md`(v1.0)· `docs/项目框架设计/开发计划-基金转换交易.md`(v1.0 · T-0~T-13 逐任务改法 + DoD) +- **架构改进线(✅ 2026-09-10 已结项,无待办)**:开工入口 **`交接文档.md` §C** +- **风控模块主线**:**`交接文档.md` §A** ## 代码入口 diff --git a/docs/PRD/PRD-架构改进与稳定性加固.md b/docs/PRD/PRD-架构改进与稳定性加固.md index 42d8bf5..ea02270 100644 --- a/docs/PRD/PRD-架构改进与稳定性加固.md +++ b/docs/PRD/PRD-架构改进与稳定性加固.md @@ -8,7 +8,7 @@ > - 问题清单与方案对比:《docs/项目框架设计/改进方案评审-问题清单与对比.md》(已过第一轮审核) > - 开发计划(HOW):《docs/项目框架设计/开发计划-架构改进.md》(已过第二轮审核) > - 任务清单:《docs/项目框架设计/TODO-架构改进.md》 -> - 开工入口:《docs/交接文档-架构改进.md》 +> - 开工入口:项目根《交接文档.md》§C > > **本文定位**:只定义**做什么(WHAT)与为什么(WHY)及验收标准**;**怎么做(HOW)见开发计划**。 diff --git a/docs/memory/2026-09-10.md b/docs/memory/2026-09-10.md index 930d7a0..f4c0d3c 100644 --- a/docs/memory/2026-09-10.md +++ b/docs/memory/2026-09-10.md @@ -170,3 +170,44 @@ SOP A-4:CUST-9527 / PROD-510300 / subscribe / 1000 **连发 4 笔**: **基金转换线:第 4 步「产出开发计划」** —— 输入已齐备: `docs/项目框架设计/架构设计-基金转换交易.md` §15(任务映射 T-0~T-13)+ §15.1(依赖拓扑与并行分组)+ §12(风险表); 产出落点 `docs/项目框架设计/开发计划-基金转换交易.md`(待创建)。 + +--- + +## 六、交接文档合并为单一入口 + 全仓指向统一(2026-09-10 晚) + +### 6.1 用户指令与判定 + +- 指令:「由版本库的交接文档为主,这两个交接文档你合并成一个新的放到这次更新」+ 指向项目根 `交接文档.md`。 +- 追加纠正:**「统一一下,不是早都说过交接文档是给你 AI 接手用的吗」** —— + **交接文档的定位 = AI 接手入口**,所以全仓指向必须**唯一**,且**绝不能指向过期文件**,否则新会话会被误导。 + (`docs/` 下两份留档停在 v1.0 / v1.1,不含 T-2/T-2b、609 passed、D20 实施等进度 —— 是个真实陷阱。) + +### 6.2 落地 + +**项目根 `交接文档.md` → v3.0(545 行)**,三线合并为单一入口: +**§0 公共层**(项目是什么 / 铁律与禁止事项 / 开发运行手册 / 已知坑 10 条 / 发现问题怎么办)· +**§A 风控模块主线**(原主干)· **§B 基金转换线**(含**工作区最新版 v1.4**)· **§C 架构改进线**(含**工作区最新版 v1.2**)。 +最大价值:这两份工作区最新版**从未提交**,随时可能丢,现已完整固化。 + +**全仓 10 处指向统一** → `交接文档.md` §A/§B/§C: +`AGENTS.md`(含顶部新增「⚡ 需要接手/开工先读交接文档.md」)· `docs/memory/{MEMORY,TODO,FRAMEWORK}` · +`docs/PRD/PRD-架构改进与稳定性加固.md` · `docs/项目框架设计/{开发计划-架构改进,TODO-架构改进,开发计划-基金转换交易}.md`。 + +**两份 `docs/交接文档-*.md` 保留为历史留档**,顶部加醒目横幅:**「本文件已废弃(2026-09-10)—— 请勿据此开工, +正确入口 `交接文档.md` §B/§C,内容已过期,勿读」** —— 不删除(保留仓库历史),但明确失效。 + +**未入库**:`交接文档.md` 在 `.gitignore:47` 内,用户确认「不进提交」。 + +### 6.3 ⚠️ 事故:`git rm` 静默抹除整个 `docs/`(复现 2 次,已零损失恢复) + +- **现象**:`git rm`(带不带 `-f` 均如此)删除 `docs/` 下两个**中文名**文件 → **`docs/` 全部 54 个文件从工作区消失**, + 命令**返回退出码 0 不报错**。 +- **定位**:① `ls`/`find`/Read 三方确认真实删除;② `git checkout HEAD -- docs/` 完整还原 54 文件(索引与 HEAD blob 完好); + ③ 无自定义 hooks(`core.hooksPath` 空);④ **同一中文路径 `ls` 完全正常** → **触发条件就是 `git rm` 本身**; + ⑤ 换 **纯 `rm -f <精确路径>` → 正常**。 +- **损失**:**零内容丢失**(HEAD blob 完好)。代价:本轮引用修改被连带还原 2 次(重做 3 次)。 +- **纪律**(已写入 `交接文档.md` §0.4 第 10 条 + `.workbuddy/memory/MEMORY.md`): + - ❌ 本仓库**禁止对 `docs/` 下文件用 `git rm`**; + - ✅ 删文件用**纯 `rm -f <精确路径>`** + `git add -A` 记录删除; + - ✅ 批量删除后**立刻** `find -type f | wc -l` 复核,异常立即 `git checkout HEAD -- `。 + - 根因未查明,**规避即可**。 diff --git a/docs/memory/FRAMEWORK.md b/docs/memory/FRAMEWORK.md index 5d93520..57d1862 100644 --- a/docs/memory/FRAMEWORK.md +++ b/docs/memory/FRAMEWORK.md @@ -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` 批次表、规则引擎 | 🟡 **第 5 步进行中**(**T-0 / T-0b / T-1 / T-2 / T-2b 已完成(609 passed),下一步 = T-3**):PRD **v0.9.1** + 架构 **v1.0** + 开发计划 **v1.0**(T-3~T-13 待实现);入口 `docs/交接文档-基金转换.md` | +| **基金转换(convert)交易** | 转出赎回 + 转入申购、逐批次计费、补差费、批次维护 | Core 写(仅 `app/gateway/`)、`core_share_lot` 批次表、规则引擎 | 🟡 **第 5 步进行中**(**T-0 / T-0b / T-1 / T-2 / T-2b 已完成(609 passed),下一步 = T-3**):PRD **v0.9.1** + 架构 **v1.0** + 开发计划 **v1.0**(T-3~T-13 待实现);入口 项目根 `交接文档.md` §B | | 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 待后续 | diff --git a/docs/memory/ITERATION.md b/docs/memory/ITERATION.md index 7bd0a9b..f2940a3 100644 --- a/docs/memory/ITERATION.md +++ b/docs/memory/ITERATION.md @@ -20,3 +20,5 @@ | 2026-09-10 | **基金转换线:T-0 / T-0b / T-1 落地 + PRD 费率分类修正(v0.9 → v0.9.1)**:**T-0** sqlite/MySQL 结构对齐(`core_holding` 列名+PK、补 `core_product_nav`)+ 建库自校验 · **T-0b** DB 账号分离 D20(`xh_core_ro` / `xh_core_rw` / `xh_agent_rw`)· **T-1** 数据层(`core_fee_rule`、`core_share_lot`、`core_convert_lot_detail`、`risk_convert_detail` 四表 + `07-seed-fee-rule` / `08-seed-share-lot` / `09-seed-org` 三个种子 + reset 链),全量 **516 passed / 3 skipped**(批 0 后基线,零回归),T-1 数据层断言 **8/8 PASS**;**外审漏网的费率分类错误修正**——`PROD-005827` 由「主动偏股 0.0080」归位「其他混合型 0.0050」(22 号文 §8 分档),主示例转入方改真主动偏股 `PROD-003095`,`09-seed-org` 按真实「管理人全产品线」重排为 v1.1 | 用户驳回「那是两种类型,怎么能混呢?」并强调「按真实业务走,强调很多遍了,这个项目要贴近真实,是要上线的」;根因是**五轮评审只做内部自洽核对,从未做「产品类型 ↔ 费率档」匹配核对** | PRD-基金转换(v0.9.1) / 开发计划-基金转换交易 / 交接文档-基金转换(v1.3) / 架构设计-基金转换交易 / AGENTS.md / `09-seed-org.sql`(v1.1) / `verify_convert_seed.py` / MEMORY(自检第 11、12 问) / TODO / FRAMEWORK | | 2026-09-10 | **基金转换线 T-2(纯函数包)+ T-2b(实算回填)完成**:新增 `app/service/convert/` **7 文件**(`__init__` / `types`(frozen dataclass + 3 归一工具)/ `calc` / `fee` / `nav` / `lot_bootstrap` / `errors`(`ConvertError` + **11** 子类))+ 新增 `tests/test_convert_calc.py` **93 用例**(12 类,含 **HALF_UP 反向自证**与**纯函数零 IO 依赖断言**,把 DoD 的「人工 grep」升级为硬断言);**重写 `scripts/dev/calc_convert_demo.py`** —— 去掉脚本内公式副本、改调生产 `calc.py`、末尾 15 项自校验(不一致即退出码 1),使其兼作「PRD §5.3 ↔ 生产口径」一致性门禁;新增实现级裁定 **R-h**(`plan_lots` 零剩余不触发强制处置);两处文档计数差异已留痕(异常实为 11 个而非 8 个 / 架构 §7 补 `hold_days`·`rounding_diff`·`ensure_batch_limit` 三签名);全量 **609 passed / 3 skipped**(516 → +93,零回归) | 用户「继续推进到结束」;T-2 是并行组 A(T-3/T-4/T-5)与 T-2b 的唯一前置;原实算脚本自带公式副本 = 与 D18 同类的漂移风险 | 开发计划-基金转换交易(§1.5 R-h + §4.2/§4.3 执行记录 + DoD 勾选) / 架构设计-基金转换交易(§7 签名回填 · §8.3 `FEE_RULE_MISSING` 注 · §15 T-2 完成) / PRD-基金转换(§5.3 数值来源) / 交接文档-基金转换(v1.4) / AGENTS.md / `app/service/convert/*`(新) / `tests/test_convert_calc.py`(新) / `scripts/dev/calc_convert_demo.py` / MEMORY / TODO / FRAMEWORK / ITERATION | | 2026-09-10 | **基金转换线第 5 步开工 · 第 0 批门禁 T-0 + T-0b 完成**:基线 510 → **516 passed / 3 skipped**。**T-0**:`tests/_ddl.py` 重写 `core_holding`(`qty`/`cost_amount`/`as_of`/`pnl_pct` + PK + `uk_cust_product`)+ 新增 `core_product_nav` + `_assert_ddl_aligned()` 建库自校验;2 处测试 INSERT 改 `qty` **并补 3 个 NOT NULL 列**(**原计划漏项**);`test_db.py` +3 用例(含**门禁反向验证的自动化用例**)。**T-0b(D20 账号分离)**:新增 `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) | AIcoding 第 5 步(T-0/T-0b 为阻断前置);用户「你进行下一步」 | tests/_ddl.py · tests/test_db.py · tests/conftest.py · tests/test_chat_tools.py · tests/test_concentration_c4.py · app/utils/db.py · app/config/settings.py · 4 个 Repository · **scripts/core/00-grant.sql(新)** · 开发计划-基金转换(§3.3) · 架构设计-基金转换(§11.1 实施记录) · 交接文档-基金转换(v1.2) · MEMORY / TODO / 当日日志 | +| 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` | diff --git a/docs/memory/MEMORY.md b/docs/memory/MEMORY.md index c2b0c14..14bda68 100644 --- a/docs/memory/MEMORY.md +++ b/docs/memory/MEMORY.md @@ -11,7 +11,7 @@ **当前进度:** 需求与表设计已定 · **风控模块 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 设计+开发计划闭环,**第 5 步进行中:T-0 / T-0b / T-1 已完成**):** `PRD-风控监测Agent` FR-1 一期显式拒收 convert,本线将其放开。**AIcoding 第 1~4 步已完成**:PRD **v0.9.1 定稿**(33 条外审闭环 + 2 处架构回填 + **费率分类修正**)→ 架构 **v1.0 定稿**(独立评审通过,13 条建议 **0 悬空**,接受 10 / 修正性接受 3 / 驳回 0)→ 门控 **M-7 已满足** → **开发计划 v1.0 已产出(`docs/项目框架设计/开发计划-基金转换交易.md`,**1,047 行**)并经**四轮**独立子代理审核收敛(**12 条意见 → 接受 11 / 驳回 1(附实测证据)/ 0 悬空**)。**第 5 步进行中:T-0 + T-0b + T-1 + T-2 + T-2b 已于 2026-09-10 完成(609 passed / 3 skipped;T-1 断言 8/8 PASS;T-2 纯函数包 7 文件 / 93 用例;T-2b 实算脚本 15/15 一致)**,**下一步 = T-3(并行组 A:T-3 / T-4 / T-5 可同时开工)**。**开工前置两个阻断项(✅ 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)** 三条,不读必踩。**交接入口:`docs/交接文档-基金转换.md`**。合规基准 = 证监会公告〔2025〕22 号。 +**⚡ 并行新线 · 基金转换(convert)交易(2026-09-10 设计+开发计划闭环,**第 5 步进行中:T-0 / T-0b / T-1 已完成**):** `PRD-风控监测Agent` FR-1 一期显式拒收 convert,本线将其放开。**AIcoding 第 1~4 步已完成**:PRD **v0.9.1 定稿**(33 条外审闭环 + 2 处架构回填 + **费率分类修正**)→ 架构 **v1.0 定稿**(独立评审通过,13 条建议 **0 悬空**,接受 10 / 修正性接受 3 / 驳回 0)→ 门控 **M-7 已满足** → **开发计划 v1.0 已产出(`docs/项目框架设计/开发计划-基金转换交易.md`,**1,047 行**)并经**四轮**独立子代理审核收敛(**12 条意见 → 接受 11 / 驳回 1(附实测证据)/ 0 悬空**)。**第 5 步进行中:T-0 + T-0b + T-1 + T-2 + T-2b 已于 2026-09-10 完成(609 passed / 3 skipped;T-1 断言 8/8 PASS;T-2 纯函数包 7 文件 / 93 用例;T-2b 实算脚本 15/15 一致)**,**下一步 = T-3(并行组 A:T-3 / T-4 / T-5 可同时开工)**。**开工前置两个阻断项(✅ 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 号。 **仓库地图:** @@ -47,7 +47,7 @@ | `docs/PRD/PRD-基金转换交易.md` | **已定稿(v0.9.1)** | 基金转换线需求权威(FR-C1~C16 / §4 表结构 / §5 接口 / §9 验收);⚠️ **代码未实现** | | `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-0b/T-1 已实现**,T-2 起待实现 · **开工必读** | -| `docs/交接文档-基金转换.md` | **新增(2026-09-10)** | **基金转换线交接入口**——给下一会话 AI,读完即可开工 | +| 项目根 `交接文档.md` | **v3.0(2026-09-10 三线合并)** | **全仓唯一交接入口**(§0 公共层 + §A 风控主线 + §B 基金转换线 + §C 架构改进线)——**给下一会话 AI,读完即可开工**;⚠️ 在 `.gitignore:47` 内、**不入库**,是本地文件。`docs/交接文档-基金转换.md` / `docs/交接文档-架构改进.md` 为**历史留档,内容已过期,勿读** | **本地 bootstrap(首次):** 完整步骤与前置说明见 `FLOW.md` §0(权威),速览: @@ -70,7 +70,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 待办)**:① **基金转换线**第 5 步进行中(**T-0 / T-0b / T-1 / T-2 / T-2b 已完成,下一步 = T-3**;设计 + 开发计划均已闭环,入口 `docs/交接文档-基金转换.md`);② ~~架构改进线收尾~~ —— **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` 只是远程跟踪引用失效,`git fetch` 即恢复,非远程分支被删)。入口 `docs/交接文档-架构改进.md`。 +**另(2026-09-10 待办)**:① **基金转换线**第 5 步进行中(**T-0 / T-0b / T-1 / T-2 / T-2b 已完成,下一步 = T-3**;设计 + 开发计划均已闭环,入口 项目根 `交接文档.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` 只是远程跟踪引用失效,`git fetch` 即恢复,非远程分支被删)。入口 **项目根 `交接文档.md` §C**。 **禁止(改代码前必记):** Core 正式 C1~C5 不可被画像覆盖 · 审计表只 INSERT · 代理人草稿不外发 · 仅 R-02 可阻断交易 · 四 Agent 不互调 LLM。 @@ -180,7 +180,7 @@ RBAC 联调账号:scripts/dev/rbac-seed-reference.md | `docs/需求拆解/` | 业务原文(场景、矩阵、合规) | | `docs/项目框架设计/` | 表结构、JWT 手册、Core 模拟、技术版本 | | `docs/业务记忆管理/` | Redis 短期 vs MySQL/Milvus/Neo4j 权威记忆 | -| `docs/交接文档-基金转换.md` | **基金转换线开工入口** —— 接手本线先读这一份(不必重读代码) | +| 项目根 `交接文档.md` §B | **基金转换线开工入口** —— 接手本线先读这一节(不必重读代码) | | `docs/PRD/PRD-基金转换交易.md` · `docs/项目框架设计/架构设计-基金转换交易.md` | 基金转换需求与实现依据(**v0.9.1 / v1.0,代码未实现**) | 缺 `docs/memory/*` 文件:按 project-memory-kit 同名补回,**禁止空模板盖进度**。 diff --git a/docs/memory/TODO.md b/docs/memory/TODO.md index 5a5d8d0..f56d16e 100644 --- a/docs/memory/TODO.md +++ b/docs/memory/TODO.md @@ -7,7 +7,7 @@ **阶段一 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.1** + 架构 **v1.0** + 独立评审 13 条 **0 悬空**(接受 10 / 修正性接受 3 / 驳回 0),门控 **M-7 已满足**;**第 4 步开发计划 v1.0 已产出并经独立审核**(4 条意见全接受、**驳回 0**,含新增 2 条回归面 R15/R16 + R-c 双条修订);**第 5 步进行中**:**T-0 + T-0b + T-1 + T-2 + T-2b 均于 2026-09-10 完成**(**609 passed / 3 skipped**;T-1 断言 **8/8 PASS**、T-2 纯函数 **93 用例**、T-2b 实算 **15/15 一致**),**下一步 = T-3(并行组 A:T-3 / T-4 / T-5 可同时开工)**。两个阻断前置(**T-0** sqlite/MySQL 列名统一 + 建库自校验 · **T-0b** DB 账号分离 D20:`xh_core_ro`/`xh_core_rw`/`xh_agent_rw`)**均已落地**。**入口:`docs/交接文档-基金转换.md`**(读这一份即可开工);**开工前必读开发计划 §1.4(15 条代码事实)+ §1.5(7 条实现级裁定 R-a~R-g)+ §12(16 条回归面)**。 +**⚡ 并行新线 · 基金转换(convert)**(2026-09-10):**设计 + 开发计划均已闭环** —— PRD **v0.9.1** + 架构 **v1.0** + 独立评审 13 条 **0 悬空**(接受 10 / 修正性接受 3 / 驳回 0),门控 **M-7 已满足**;**第 4 步开发计划 v1.0 已产出并经独立审核**(4 条意见全接受、**驳回 0**,含新增 2 条回归面 R15/R16 + R-c 双条修订);**第 5 步进行中**:**T-0 + T-0b + T-1 + T-2 + T-2b 均于 2026-09-10 完成**(**609 passed / 3 skipped**;T-1 断言 **8/8 PASS**、T-2 纯函数 **93 用例**、T-2b 实算 **15/15 一致**),**下一步 = T-3(并行组 A:T-3 / T-4 / T-5 可同时开工)**。两个阻断前置(**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 条回归面)**。 ### 基金转换线待办(推荐顺序) @@ -51,7 +51,7 @@ ## 待办(模块侧开放项) -- [x] **【架构改进线 · 收尾】`docs/开发计划-架构改进.md` §7.2 七项手工冒烟 —— 2026-09-10 全部补跑,7/7 PASS**:无 key 启动告警(清空/占位非空各一次)· 交易阻断+放行(`SUIT_AGE_CONFIRM` / `RISK-001,002`)· 预警聚合(CUST-9527 连发 4 笔,第 3/4 笔 `alert_ids` 同单、`pending_review` 计数 1、`audit` 呈 `alert_created→alert_appended`)· Redis 不可用→退回进程内锁(日志 2 次 `退回进程内锁`,交易仍 200)· Redis 恢复→`退回进程内锁` 命中 0 行 · 调换 `main.py` 装饰器→T-202 守卫变红(`assert ''` @ `test_audit_middleware.py:221`)→字节级还原后转绿。**`037ce7e` 早已 push(远程 `risk-control-agent` = `fffb78a` = 本地 HEAD),原「未 push」表述作废**;残留已按 SOP §2 重灌,全量 **510 passed**。入口:`docs/交接文档-架构改进.md` +- [x] **【架构改进线 · 收尾】`docs/开发计划-架构改进.md` §7.2 七项手工冒烟 —— 2026-09-10 全部补跑,7/7 PASS**:无 key 启动告警(清空/占位非空各一次)· 交易阻断+放行(`SUIT_AGE_CONFIRM` / `RISK-001,002`)· 预警聚合(CUST-9527 连发 4 笔,第 3/4 笔 `alert_ids` 同单、`pending_review` 计数 1、`audit` 呈 `alert_created→alert_appended`)· Redis 不可用→退回进程内锁(日志 2 次 `退回进程内锁`,交易仍 200)· Redis 恢复→`退回进程内锁` 命中 0 行 · 调换 `main.py` 装饰器→T-202 守卫变红(`assert ''` @ `test_audit_middleware.py:221`)→字节级还原后转绿。**`037ce7e` 早已 push(远程 `risk-control-agent` = `fffb78a` = 本地 HEAD),原「未 push」表述作废**;残留已按 SOP §2 重灌,全量 **510 passed**。入口:项目根 `交接文档.md` §C - [ ] chat 链路 `risk_suitability_log.actor_id` 暂落 SYSTEM(run_tool 统一透传需动 core_tools/kb_tools 冻结 func 契约,发起者留痕已由 agent_tool_call 覆盖)——AL-06 遗留,动 Tool 契约前先出方案 - [x] **【前端接入·方案 B】chat 拉侧三端点**(commit `8328c24`,2026-09-08):`GET /api/chat/sessions`(本人+本 Agent 线分页列表)、`GET /api/chat/sessions/{id}/messages`(历史消息升序分页,closed 仍可读)、`POST /api/chat/sessions/{id}/close`(active→closed,重复/非 active 409);chat.py 抽 `_resolve_agent_type`/`_assert_chat_entry`/`_guard_session` 三守卫供四端点共用,POST "" 行为零回归;risk_manager 在对话线数据面保持 403(PRD 4A.1)。测试 482→**494 绿**;独立评审 P0=0,P1(close 并发 rowcount 静默 200)已修复 - [x] **【前端接入·方案 C】SSE 流式对话**(commit `01ec5fc`,2026-09-08):新增 `POST /api/chat/stream`(OpenAI 兼容 chunk:首帧 meta → delta → finish_reason=stop → `[DONE]`);`agent_service.stream_chat` 生成器 + `needs_disclaimer`;`_guard_request`/`_prepare_turn` 与同步端点共用守卫;`session_repository.insert_turn` user+assistant 同事务落库(修评审 P0/P1)。测试 494→**503 绿**。遗留:无心跳帧、断连留空会话待清理 diff --git a/docs/交接文档-基金转换.md b/docs/交接文档-基金转换.md index afe86ce..5ab6c41 100644 --- a/docs/交接文档-基金转换.md +++ b/docs/交接文档-基金转换.md @@ -1,5 +1,11 @@ # 交接文档 · 基金转换(convert)交易线 +> # ⛔ 本文件已废弃(2026-09-10)—— 请勿据此开工 +> **内容已全部并入项目根 `交接文档.md` §B(三线合并版唯一交接入口)**,且本文件停留在 **v1.0(设计阶段完结)**, +> **不含** T-0 / T-0b / T-1 / T-2 / T-2b 的落地进度与 **609 passed** 现状。 +> ⚠️ 下方「下一步是第 4 步开发计划」等表述**早已过期**(第 4 步、第 5 步前两批均已完成)。 +> **正确入口:`交接文档.md` §B** —— 本文件仅作历史留档,内容**已过期,勿读**。 + > **版本**:2026-09-10 **v1.0(设计阶段完结,交接给开发会话)** > **用途**:**给接手本线的 AI / 人**。读完本文即可开工,**不需要重读全部代码**。 > **代码基线**:分支 `risk-control-agent`(HEAD 以 `git log -1` 为准);pytest **510 绿**。 @@ -166,7 +172,7 @@ T-10(批次维护 · 回归风险最大:先跑 510 基线再动) 2. ~~`037ce7e` 已 commit 未 push~~ → **本文原表述已过期**:实测 `git ls-remote`,远程 `risk-control-agent` = `fffb78a` = 本地 HEAD,`037ce7e` 早在祖先链上,**该线全部提交已推送,无待推内容** 3. 冒烟产生的演示库残留已按 SOP §2 重灌清除,全量 **510 passed** 复绿 -明细与入口见 **`docs/交接文档-架构改进.md`**。本线 **T-0b 与其无关**(那是基金转换自己的前置)。 +明细与入口见 **`交接文档.md` §C**(原 `docs/交接文档-架构改进.md` 已废弃为历史留档)。本线 **T-0b 与其无关**(那是基金转换自己的前置)。 --- diff --git a/docs/交接文档-架构改进.md b/docs/交接文档-架构改进.md index b9ce948..248e54c 100644 --- a/docs/交接文档-架构改进.md +++ b/docs/交接文档-架构改进.md @@ -1,5 +1,11 @@ # 交接文档 · 架构改进与稳定性加固(给执行 AI) +> # ⛔ 本文件已废弃(2026-09-10)—— 本线已结项,请勿据此开工 +> **内容已全部并入项目根 `交接文档.md` §C(三线合并版唯一交接入口)**,且本文件停留在 **v1.1(执行后回写)**, +> **不含** §7.2 七项手工冒烟 7/7 PASS、push 状态纠正(`037ce7e` 早已推送)、残留重灌复绿等结项记录。 +> ⚠️ 下方「commit 但不 push」「待收尾」等表述**已过期**。 +> **正确入口:`交接文档.md` §C** —— 本文件仅作历史留档,内容**已过期,勿读**。 + > **版本**:2026-09-09 **v1.1(执行后回写)** > **用途**:**给执行代码改动的 AI(hy3)**。读完本文即可开工,**不需要重读全部代码**。 > **代码基线**:分支 `risk-control-agent`,HEAD `2d0e2fa`,pytest **503 绿** diff --git a/docs/项目框架设计/TODO-架构改进.md b/docs/项目框架设计/TODO-架构改进.md index 5a48397..557cd4b 100644 --- a/docs/项目框架设计/TODO-架构改进.md +++ b/docs/项目框架设计/TODO-架构改进.md @@ -3,7 +3,7 @@ > **用途**:开发执行清单。**按 T-1xx → T-2xx 顺序做**,每完成一项勾选并跑一次 pytest。 > **上游**:《docs/PRD/PRD-架构改进与稳定性加固.md》(做什么)·《docs/项目框架设计/开发计划-架构改进.md》(怎么做) > **基线**:分支 `risk-control-agent`,HEAD `2d0e2fa`,**pytest 503 绿** -> **开工前必读**:《docs/交接文档-架构改进.md》 +> **开工前必读**:项目根《交接文档.md》§C > **实施记录(2026-09-09,hy3 执行 · 已复核)**:T-101~T-202 全部完成,pytest **510 绿**(503 基线 + 6 条锁测试 + 1 条中间件顺序守卫 = 新增 7 条);**未新增配置项/依赖/路由,三处 run_locked 调用点未改**。注意:《架构设计说明书》实际文件为 `docs/项目框架设计/架构设计-风控模块.md`(无 §4.3.x 章节),T-104/105/106 标注已落到 §2 树(scoring.py)、§5.2(locks.py)、§5.8(G1/G2/G3)对应位置。 > **提交**:`037ce7e`(commit 不 push,待用户浏览器目视确认后推送) > **遗留手工验证(未经执行,勿视为通过)**:T-107 清空/恢复 key 各启动一次、停/启 Redis 各一次、`/api/simulate/trade` 阻断+放行各一次。 @@ -17,7 +17,7 @@ - [x] 确认当前分支 `risk-control-agent`,HEAD 为 `2d0e2fa` - [x] 跑一次基线:`python -m pytest -q` → 记录实际数字(应为 503 passed) - [x] 确认 `locks.py` / `redis_gateway.py` 在目标合并分支**无在途改动** -- [x] 读《交接文档-架构改进.md》全文(5 分钟,避免踩已记录的坑) +- [x] 读《交接文档.md》§C 全文(5 分钟,避免踩已记录的坑) --- diff --git a/docs/项目框架设计/开发计划-基金转换交易.md b/docs/项目框架设计/开发计划-基金转换交易.md index 14ca60d..af0a9ff 100644 --- a/docs/项目框架设计/开发计划-基金转换交易.md +++ b/docs/项目框架设计/开发计划-基金转换交易.md @@ -1028,7 +1028,7 @@ def try_lock(key: str, ttl_seconds: int = LOCK_TTL_SECONDS) -> _Token | None: **DoD** - [ ] 三项完成且**落点明确**:① 性能实测数据**回填 `docs/PRD/PRD-基金转换交易.md` §9 第 18 条**(用实测值替换「预估 < 100ms」); - ② 50 并发结论(是否超卖 / 退避间隔够不够)写入 `docs/交接文档-基金转换.md`;③ 若实测超阈值 → 优化索引/锁策略后**重定阈值**(**不得反向修改实测数据迁就指标**) + ② 50 并发结论(是否超卖 / 退避间隔够不够)写入 项目根 `交接文档.md` §B;③ 若实测超阈值 → 优化索引/锁策略后**重定阈值**(**不得反向修改实测数据迁就指标**) - [ ] 50 并发结果写入交接文档(含退避间隔是否够用的结论) --- diff --git a/docs/项目框架设计/开发计划-架构改进.md b/docs/项目框架设计/开发计划-架构改进.md index 9b32c35..484ecca 100644 --- a/docs/项目框架设计/开发计划-架构改进.md +++ b/docs/项目框架设计/开发计划-架构改进.md @@ -356,7 +356,7 @@ def test_audit_middleware_runs_inside_trace_middleware(client, captured_audit): ### 5.4 F1 · 支持 `convert` -> **状态(2026-09-10)**:✅ **已立项为独立线**(PRD v0.9 + 架构 v1.0 定稿,**代码未动**),开工入口 `docs/交接文档-基金转换.md`。 +> **状态(2026-09-10)**:✅ **已立项为独立线**(PRD v0.9 + 架构 v1.0 定稿,**代码未动**),开工入口 项目根 `交接文档.md` §B。 > 本节指出的**两处硬编码正是该线 D7 `_amount_view` 要解决的问题**(`core_ro.py:390`/`:432` 的 `trade_type` 白名单, > 不改则 convert 在 RISK-001/002/003 聚合中隐形且不报错)。本线不再跟进,本节保留备查。