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,零回归。
18 KiB
18 KiB
需求迭代
| 日期 | 变更 | 原因 | 影响 |
|---|---|---|---|
| 2026-09-05 | init 项目记忆 + app 脚手架 | 用户要求 memory kit + 目录结构 | MEMORY / ENVIRONMENT / REQUIREMENTS / FRAMEWORK / FLOW / TODO |
| 2026-09-05 | 需求拆解四 Agent P0 场景定稿 | 用户故事归纳 | REQUIREMENTS(对照 docs/需求拆解/) |
| 2026-09-05 | 技术栈 Windows 原生 + Milvus Lite | 本机内存限制 | FRAMEWORK |
| 2026-09-05 | Core 模拟库 jinrong_core + 扩大种子 + Neo4j 同步 | 无真实 Core | FRAMEWORK / FLOW / ENVIRONMENT |
| 2026-09-05 | Agent 编排依赖改为 LangGraph 为主 | 状态图 + Tool 节点 | FRAMEWORK |
| 2026-09-05 | memory 全量刷新:§0 新 Agent 交接清单 + 实现状态表 + bootstrap | 脚手架已落地,便于无上下文交接 | MEMORY / FRAMEWORK / FLOW / TODO / REQUIREMENTS / ENVIRONMENT |
| 2026-09-07 | 追加需求 FR-8/FR-9/FR-10 经独立 AI 评审→修订→复审并入 PRD v1.1 + 规则表 v1.1 + 开发计划 v1.2(C4 |
弥补单笔合规盲区/处置时效红线/代理人操作风险 | PRD / 附-风控规则表 / 开发计划 |
| 2026-09-07 | 《实现方案-风控追加需求v1.1-C4C6.md》定稿:独立 AI 评审 FAIL(P0×1/P1×4/P2×6)→ 修订闭环;C4~C6 编码依据可照抄 | 开发流程第 2 步(另一 AI 验证挑毛病) | 实现方案文档 |
| 2026-09-07 | 全库文档同步:分支口径修正(feature/risk → 实况 risk-control-agent,与 main 分叉 67/4)+ T-21 评审闭环 / 425 绿 / T-03 / C1~C3 状态落账 + 新建项目根交接文档.md |
文档与实况不一致(用户排查要求) | MEMORY / TODO / REQUIREMENTS / FRAMEWORK / FLOW / ENVIRONMENT / ITERATION / PRD / 架构设计 / 开发计划 / README / 交接文档 |
| 2026-09-07 | 阶段一「对齐 main 基准」AL-01~AL-08 完成(逐项独立 commit bb244f4 |
阶段一执行(用户拍板 main = 需求唯一基准);基线变更与 SUIT 体系退役需落账 | MEMORY / TODO / REQUIREMENTS / FRAMEWORK / FLOW / ENVIRONMENT / ITERATION / README / 交接文档 |
| 2026-09-08 | 前端接入面交付:方案 B 会话管理三端点(8328c24)+ 方案 C SSE 流式对话(01ec5fc),测试 482→503 绿 |
前端 React 多 Agent 入口需后端接入面先就绪(用户拍板方案 B+C) | chat.py / session_repository / agent_service / 测试 / README / 交接文档 |
| 2026-09-09 | 架构改进与稳定性加固 T-101~T-202:Redis 双层分布式锁(T-201)+ 无 key 启动告警(T-107)+ 审计 trace 顺序守卫(T-202)+ 文档口径勘误(词表 45 / Tool 5 / Agent 表 6);pytest 503→510 绿(+7);接口契约与表结构零变更 | 架构梳理发现 24 项待处理,两轮独立审核通过;用户拍板「补告警 + 换 Redis 锁」;合并 main 前只做低风险项 | 交接文档-架构改进 / 架构设计-风控模块 / MEMORY / 开发计划-架构改进 / TODO / 测试 +7 |
| 2026-09-10 | 架构改进线收尾闭环:§7.2 七项手工冒烟补跑 7/7 PASS(无 key 告警 / 交易阻断放行 / 预警聚合 / Redis 降级退回进程内锁 / Redis 恢复零降级 / 调换装饰器使 T-202 守卫变红后字节级还原);核实并纠正「037ce7e 未 push」的过期表述(远程 risk-control-agent = fffb78a = 本地 HEAD,早已推送);冒烟残留按 SOP §2 重灌双库清除,全量 510 passed 复绿 |
架构改进线唯一缺口是手工冒烟未执行;交接文档/项目记忆的 push 状态与实际 git 状态不符(以 git ls-remote 为准) |
TODO-架构改进 / 交接文档-架构改进 / 交接文档-基金转换 / MEMORY / TODO / ITERATION / 当日日志 |
| 2026-09-10 | 基金转换(convert)线设计闭环:PRD v0.9(33 条外审闭环)+ 架构 v1.0(独立评审通过,13 条建议 0 悬空)+ 执行期风险 5 条 + D18/D19/D20;DB 账号分离定案(用户拍板「按真实项目走」,接主架构 C1);新建 docs/交接文档-基金转换.md |
PRD-风控监测Agent FR-1 一期显式拒收 convert,需放开;合规口径须外部事实核验(证监会公告〔2025〕22 号);账号方案为跨线交叉点 |
PRD-基金转换 / 架构设计-基金转换 / 评审待办 / 处置表 / 交接文档-基金转换(新) / MEMORY / TODO / 交接文档.md / 交接文档-架构改进 / 开发计划-架构改进 |
| 2026-09-10 | 基金转换(convert)线第 4 步开发计划闭环:产出 docs/项目框架设计/开发计划-基金转换交易.md(v1.0,1,047 行,T-0test_integration_risk.py:426-437 + R16 redeem 用例 + R-c 拆「降级规则 + 覆盖率补偿」双条 + F-11 计数 11→13;二轮抓出 R-a 并发论证不成立——执行权锁是请求粒度 → 增第 ③ 步 IntegrityError 回退 + T-6 并发用例;三轮修 §14「四道→五道」口径不一致 + 实测驳回「SQLAlchemy 会抛 PendingRollbackError」的推测;四轮终验通过、无「声明已改实际未改」残留);三项实测加固(sqlite 3.50.4 不支持 ON DUPLICATE KEY UPDATE,且 WHERE NOT EXISTS/FROM DUAL 两个候选写法方言互斥;SQLAlchemy 2.0.51 异常后同事务可用;pydantic 2.13.4 Optional+gt 保 422) |
AIcoding 第 4 步;用户要求「写完拉起子进程审核,改完后再审,审到没问题才能进行下一步」;架构/PRD 存在 2 处口径不一致需裁定(W-1/W-2),且实现级空白 7 处需收口 | 开发计划-基金转换交易(新) / 交接文档-基金转换(v1.2) / MEMORY / TODO / ITERATION / skill ai-coding-step4-dev-plan(新) |
| 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 |
| 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-C1accepted/nav_pending/confirmed/rejected/cancelled/expired / D1 |
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} · 当日日志 |