- Implemented `_merged_items` and `_merged_memory_text` functions to consolidate consult and chitchat memories, improving context awareness in intent classification and response generation. - Updated intent prompts to include recent dialogue history, aiding in the resolution of ambiguous user queries. - Enhanced `search_knowledge` tool to utilize context window for better query understanding, addressing issues with omitted references in user inputs. - Fixed existing test cases to reflect changes in intent constants and ensure accurate context handling during tests. This update significantly improves the handling of multi-turn dialogues, ensuring a more coherent and contextually aware interaction for users.
67 KiB
TODO
大任务开始时更新;完成一步打钩并验证后再往下。
新 Agent: 先看MEMORY.md§0 交接清单,再从此处取下一项。
进行中
2026-09-14 · 多轮对话三缺陷修复 + 既存测试 bug 收口(分支 merger · 未 commit)
起因「看看其他 agent 有没有类似缺陷」(visitor 三缺陷)。结论:三缺陷是节点函数设计选择,非 LangGraph 架构问题;问数线(analyst_agent)排除。
- 多轮三缺陷修复(visitor/customer/advisor · 6 文件 +90/−20):合并 consult+chitchat 记忆(
_merged_items/_merged_memory_text/_rag_query,按 ts 排序,从已加载 state 取,不再回 Redis 重取)· RAG query 拼接近期原文 · INTENT prompt 注入{memory}·run_tool转发context_window给search_knowledge(原死管道)·kb_tools.search_knowledge加context_window参数 - 既存测试 bug 收口(5 处,非本轮三缺陷引入):
test_suitability_risk_level_normalized:fake_suit补user_message形参(query_suitability已加该参)test_query_injected_from_user_message:断言补_context_window(tool_node恒注入)test_intent_constants:VALID_INTENTS13→14(含trade_action)test_keyword_route_data_queries[我上个月申购了啥]:looks_like_trade_execute误判 →_TRADE_QUERY_MARKERS补「了/过+疑问词」查询标记test_chat_sync_persist_disclaimer:mock 返 4→5 元组(+pending_trade)
- 验证:
test_wave2_prompts+test_kb_tools+test_trade_action_service+test_chat+test_wave3_customer_service五文件 98 passed / 0 failed(含_TRADE_QUERY_MARKERS改动对test_trade_action_service零回归) - convert 五文件单测(F-β 选A · 收口):
test_convert_confirm.py的 28 条其实已在f856ab4(客户 C3→C4)修掉,剩test_convert_accept.py::test_accept_uk_idem_race_falls_back_to_idempotent1 条——L1 同键异体→409 后,竞态用例「抢占者」份额 100≠50 四元组不匹配误走冲突 → 抢占者份额改 50 对齐。验证:test_trade_gateway+test_trade_flow_service+test_trade_action_service+test_convert_accept+test_convert_confirm五文件 99 passed / 0 failed
2026-09-13 · 端到端覆盖缺口补测(三条线全补 · 一线一包)(分支 merger · 未 commit)
起因:「看看还有哪块没有端到端跑过」。方法:superpowers(先取证再下结论 · 先定根因再提修法)。计划归档
docs/superpowers/plans/2026-09-13-e2e-coverage-gap.md。 口径(七项,已拍板): 产出边界「盘点 + 直接开跑补齐」· 缺陷「只报告不修」· 仓库外 09/10/11「本轮收回仓库」· 数据「快照+还原」· 腐化资产「修,但单独记账」· 覆盖「三条线全补」· 报告包「一线一包」。
- Phase 0 环境与基线:
/api/readyok · openapi 66 路径 / 71 handler ·mysqldump5 表快照 · 四项门槛实测锁定 - 腐化资产 F-01~F-06 已修:恒真断言(
03-risk.mjs:23)· 路由写错(06-chat.mjs:12)· 选择器过期(08-edge.mjs)· 陈旧前提(11-cross-role.mjs:104)· harness 指向 · 截图路径参数化(零代码改动,用E2E_SHOT_DIR) - 收 09/10/11/03/04/06/07/08 进仓库(
scripts/e2e/)并改指向仓库内 harness - Part A(真实 HTTP):AN-003 问数线 137 PASS / 6 FAIL(= 缺陷 A/A2/B)· AD-001 理财师 31 PASS / 4 FAIL(AD8 取证组)· RK-001 风控 23 PASS / 0 FAIL · XC-001 横切 33 PASS / 0 FAIL / 1 SKIP
- Part B(真浏览器):8 支脚本 123 PASS / 0 FAIL / 6 INFO,全部退出码 0
- Part C(回归):
npm run build✅ 0 ·npm run test✅ 27 passed (8 files) · 四文件交易单测 ❌ 49/28(F-β)·pytest❌ 1236/102/9/21(F-α + F-ζ) - Phase 6 还原并校验:
core5 表 逐表 COUNT + CHECKSUM 与快照完全一致(95/59/73/19/0)·script_template页面可见恢复到 20 · 还原前后端/api/readyok - 四包写毕:各含
README.md+TEST-LOG-*.md+_raw/(含 shots 与原生输出) - 并入 commit
merger(你确认后) - 修复轮(另开):见下「端到端第五轮 · 上报」
端到端第五轮 · 上报(只报告不修;3 项拍板全数落定 ✅ ⇒ 可开修复轮)
🟢 已拍板 2 项(用户 2026-09-13 定):
-
F-14 · 返回收益数字的回复是否强制带规范风险提示?→ 拍板:维持现状(「目前够用就行」) 决定:接受 LLM 自撰措辞,不扩
compliance_guard.py:108-110的should_add_disclaimer名单。 背景:客户问「我的持仓收益怎么样?」→ 意图不在名单(product_consult/policy_interpret/faq)⇒ 按设计不追加RISK_DISCLAIMER;实测回复含 LLM 自撰的「不构成任何买卖建议」(实质性提示在、规范文案不在)。 已知代价:措辞与是否出现由 LLM 随机决定,06-chat.mjs中该条已按 F-14 降级为 2 条 INFO(不计入 PASS 分母),断言不再硬性要求逐字命中。不再作为待办项。 -
RK 发现-1 · 未知资源「找不到」语义是否统一为 404?→ 拍板:关闭(「这个不用管」) 背景:
POST /api/risk/suitability/check对未知客户 officer 200 / advisor 403 / customer 403,无一 404(risk.py:134的 404 分支本轮未构造出可达条件)。 决定:不改。现状不泄漏客户存在性(安全上更优),404 的"信息更准"价值不足以推动变更。 仅作实测事实保留在风控包与横切包,不再作为待办项。
🟢 已拍板 3 项(用户 2026-09-13 定):
- F-β · R4 到底该「放行+揭示」还是「直接阻断」?→ 拍板:选 A,维持现状语义不动,改测试
决定:
simulate_self_service_blocked不动("需揭示 → 自助端阻断"保持),下一轮只改tests/test_convert_confirm.py的客户档位。零业务代码改动。 规则(拍板后即生效,答辩口径同此):C3×R4/C4×R5= 匹配但需揭示 ⇒ 自助渠道阻断并引导线下;这是设计意图,不是缺陷。任何"给阻断响应体补字段让测试变绿"的改法一律禁止。 执行清单(下一轮):① 把需要"受理成功"的用例客户 C3→C4(C4×R4=allowed)或转入产品 R4→R3(C3×R3=allowed);② 保留CUST_LOW(C1) 的阻断用例作 T+1 复核对照;③ 重跑四文件单测,目标 77 passed / 0 failed(原 76 + 新增语义对照);④ 确认阻断响应体仍不含forced_full_transfer。 判断依据(存档,备答辩追问):- L0 权威矩阵是刻意设三态(
jinrong_core.core_suitability_rule实测 25 行,全rule_ref=JR-AST-012):C3×R4与C4×R5=allowed_with_disclosure,既非allowed亦非forbidden;服务层对它返回matched=True/blocked=False/mismatch_type="none"/block_response_code="SUIT_NEED_DISCLOSURE"—— 它压根不是"不匹配",而是"匹配但须特别风险警示+签署揭示书"(《证券期货投资者适当性管理办法》第十九条:主动要求高于承受能力的产品,特别警示并确认后可销售)。 - "需揭示 → 自助端阻断"是已定的设计,三处实证同指:答辩稿
docs/答辩/答辩知识点清单.md:59原文即「C3×R4 揭示 block」· 前端web/src/pages/customer/CustomerTradePage.tsx:116「标有『风险不匹配 / 需揭示』的请换产品或到网点办理」· 前端web/src/utils/tradeEligibility.ts对两类情形均给canSelfServe:false+tone:'warn'+ 标签「需揭示/网点办理」。逻辑自洽:揭示需双录/柜面,线上自助无法完成"签署"动作,故自助渠道拒绝并转人工。⇒ 上一轮 P1 修复(commit5c18164)是后端追平前端,方向正确。 - 28 条失败的根因是测试前提过期,不是接口缺陷:
tests/test_convert_confirm.py:1013的assert accepted["forced_full_transfer"] is False,其用例 docstring 明写前提是"受理成功后验证 T+1 只继承不重判min_hold";而forced_full_transfer是受理成功路径字段。CUST-CC(C3) 被阻断后受理未发生、响应体换成阻断体 ⇒ 无该键 ⇒KeyError×28。阻断响应体里本就不该有forced_full_transfer(未受理,谈不上转换方式)。 测试内已有该模式(CUST_LOW = "CUST-CCL" # C1 客户 → 转入 R4 = 阻断),作者本就知道要分档客户,只是未跟上语义变更。 ⚠️ 反向禁忌(已拍板为禁止项):不得给阻断响应体补forced_full_transfer让测试变绿 —— 那等于让"阻断"伪装成"受理成功",比测试失败更危险。 选项 B(已否决,若日后要做属独立需求轮):演示"签揭示书后自助成交"=把 PRD 二期(放行+提示)提前做,需新建前端揭示书 Modal + 确认留痕 + 后端requires_disclosure受理分支。只改后端不建前端 UI 会更糟(变成"毫无提示地放行",比一期口径更不安全)。当前不做。
- L0 权威矩阵是刻意设三态(
🟠 新增记账(F-β 调查中发现 · 真缺口 · 只记录不修):
- 文案引导的「网点办理 / 请联系持证投资顾问」没有对应实现通路
实测:理财师线(
app/api/advisor_*.py)无任何交易类 API(仅 compliance / script_templates / advisors 读取);全仓唯一交易入口是POST /api/simulate/trade+ convert 族,不区分渠道身份。 ⇒ 当前实现里C3×R4任何渠道都买不成。与 PRD 一期"不做线下受理"并不矛盾,但文案承诺 > 实现能力 —— 答辩被追问「那网点怎么买」会答不上来。 处置建议:① 答辩口径统一为"一期自助渠道不做揭示后成交,线下受理未实现";② 或改前端文案(CustomerTradePage.tsx:116的「到网点办理」→「需临柜签署风险揭示书(一期未开放)」)。不改代码,二选一由你定。
🔴 测试基建(与业务缺陷分开记账):
- F-ε(影响最广)·
pytest写真实库 → 已修(2026-09-13 修复轮):根因不单是import_script_templates.py:14,测试文件自身的模块级from app.advisor_db import AgentSessionLocal在收集期绑定真库 sessionmaker,绕过 fixture 的monkeypatch。修法:① 10 个test_sprint*.py改from app import advisor_db+ 调用点advisor_db.AgentSessionLocal/advisor_db.agent_engine;②import_script_templates.py同改;③ 唯一写真库的 subprocess 用例(seed 脚本独立跑)改@pytest.mark.skip(另两处 subprocess 经查只读)。验证:跑后script_template仍 65/20/36,零污染。副作用(如实):转 sqlite 后暴露 F-α 假 DDL 缺列(agent_session无metadata等),45 条 sprint 失败为陈旧 DDL/期望,非本轮引入 - 陈旧登录契约(2026-09-13 修复轮新发现):6 个
test_sprint2_*.py的token_for(username,password)打/api/v1/auth/login+{username,password},与现行POST /api/auth/login(actor_id+token_type+roles)不符 ⇒ 404/422。迁移到tests/advisor_test_utils.login_token(已有 compat 映射)。6 文件全改,无/api/v1残留 - F-ζ ·
--ignore-glob=test_sprint*.py是空操作:pytest 匹配完整路径,test_sprint*.py缺*/⇒ 一个文件都没过滤掉(1368 collected / 其中 94 来自 sprint)。故文档门槛「排除 sprint 后的 896」从未按设计生效。修正:--ignore-glob='*/test_sprint*.py'(1368 → 1274,sprint 项 0) - F-η · 套件非幂等:同库同命令连跑两次 FAIL 集合不同(129 vs 127 行)⇒ 单次
pytest的 passed 数不可作「不退步」基线,引用须附跑批序号与库状态 - F-α · 验收文档门槛陈旧:
docs/答辩/DEMO-功能测试流程.mdA3 称 896 passed,实测 1236/102/9/21。根因:假 DDL 与 fixture 插入不一致(test_platform_api.py21 条 error 全是table core_holding has no column named quantity) - F-γ · 还原判据更正:Phase 0 记的
core_share_lot=74与同次快照(73 行)不自洽 ⇒ 判据改为「与快照逐表 CHECKSUM 一致」,不再用某个读数值 - ADV-3 · 工具接缝(P3,孤儿代码,本轮已实证):
agent_graph.py5 个工具3 个接错 ——manage_kyc_session写kyc_service.chat(真名chat_session)·get_session缺 keyword-onlyauth·template_service.search不存在 ·compliance_service.check(真名check_text)。对照组稳定 PASS 排除"探针写错";tests/test_step11_agent_graph.py全注入Mock()⇒ 遮蔽。修复须同时改测试替身 - 本轮未做完(如实声明):
/register注册链路仍零覆盖 ·/app/home·/app未访问 · 面包屑/登出/会话侧栏切换未做浏览器验证 ·AnalystAssetsPage「提交沉淀」表单仍未提交过 ·risk.py:134404 分支未触达
2026-09-13 · 客户线交易 + 选购清单(app/service · app/tool · web/)(分支 merger · 未 commit)
设计 spec:
docs/superpowers/specs/2026-09-13-customer-trade-design.md
- 后端:
trade_action_service/trade_flow_service(Redis 抽槽 · 菜单序号 ·restore_flow_from_context)·customer_service交易意图与续轮 ·trade_tools顾问侧 - 适当性清单:多 R「有哪些」列产品 · 「我能买什么」→
_list_purchasable_product_catalog(【R1】… + 全局序号 + PROD 编号 · 非计数汇总) - 解读旁路:含
请回复上方序号的清单 不经 LLM interpret(避免又变成「能买几只」) - 合规:C3×R4 揭示/双录 助手内不可自助申购 ·
subscribe_suitability_block· prompts 规则 12–14 - 前端:
CustomerTradePage·TradeConfirmModal· SSEpending_trade·simulate.ts扩展 - 持仓快照(根因修仪表盘):
gateway_repositoryapply_holding_subscribe/apply_holding_redeem·trade_gateway._maintain_lots申赎后同步core_holding(与 convert 确认段口径一致) - 前端 · 能买能卖:
tradeEligibility.ts· 交易中心下拉 适当性标签 + 禁用不可自助申购 · 赎回/转出仅持仓 ·?tab/product/from预填 - 前端 · 看板刷新:
tradeEvents.tsjr:trade-completed·TradeConfirmModal成功派发 ·useHoldingsDashboard+CustomerTradesPage监听 - 持仓读侧补偿:
core_ro.list_holdings_from_lots_gap·customer_service.list_holdings合并(历史只写批次仍能在持仓/看板看到) - 网关持仓写加固:
apply_holding_subscribeUNIQUE 冲突回退 UPDATE · 失败 warning 日志 - 交易中心 UX:非 customer 角色顶栏警示 · 确认 Modal 成功态自关(父页不再
onSuccess抢先关窗)·requires_disclosure0/1 口径 - 前端 · 行情交易入口:
TradeProductActions(详情页)·MarketQuotesPage客户列 申购 / 走势·赎回 / 转换 - 单测:
test_trade_flow_service·test_trade_action_service·test_wave2_core_ro_tool(选购清单)·test_wave3_customer_service路由 ·test_trade_gateway.py33 passed(含申赎批次维护) - 运维:
restart-dev.ps1(叠尸清理 · Docker 容错 · 结束 Redis 未就绪黄字提醒)·restart-dev.bat·start-redis.ps1(本脚本不代启 Redis) - 前端自检:
DevReadyBanner在degraded(路由 OK 但 redis=false) 时顶栏警示 - 本机验收:客户 Demo CUST-9527 → 交易中心或行情页申购 → 首页资产/持仓即时刷新;下拉见「可申购/需揭示」;助手线「我能买什么」→ 序号 → Modal;换购多轮 + 回「1」不 fallback —— 2026-09-13 第四轮端到端(CT-001 v1.2):真浏览器对账 + 后端 raw 核对到分。P0/P1/L1/CT6 已于同日收口并复跑取证 —— Part A 135 PASS / 0 FAIL / 1 SKIP / 25 INFO(退出码 0)· Part B 41 PASS / 0 FAIL / 0 SKIP / 7 INFO(退出码 0);缺口已关闭,余 Redis 降级路径未验(见 §第四轮上报)
- 可选(已读侧兜底):历史只写 lot 未写快照 →
list_holdings_from_lots_gap;仍建议新单走网关写快照或reset.ps1清演示态 - 并入 commit
merger(与前端字体栈等同批或拆分,你确认后)
2026-09-13 · 前端设计栈补强(web/ · Inter 字体 + Radix Colors)(分支 merger · 未 commit)
触发:小红书《Codex 必装高级设计感 Skill》推荐的 8 项。逐项核实后只有 1 项是净收益、4 项完全不适用,未照单全收。
- Fontsource Inter(真缺口 · 已落地):字体栈第一顺位写着
"Inter",但全仓零加载(无@font-face/ 无外链 / 无依赖),一直静默回退系统字体 -@fontsource-variable/inter可变字体 ·main.tsximport · 字族名是Inter Variable而非Inter(不改则匹配不上、白装) -theme.ts:21+tokens.css:20字体栈 Inter 提到最前(拍板:全平台一致,牺牲 Mac 原生 SF Pro) - 运行时仅下载 latin 48KB(unicode-range分片;中文仍回落 PingFang/雅黑,混排无碍) - Radix Colors(部分采用 · 已落地):只引
slate+jade,11 个品牌色一个都没替换 - 选用依据(CIELAB 色差):positive→jade-11 dE 5.6 ✅ · muted→slate-10 dE 4.9 ✅ · text→slate-12 dE 4.8 ✅ - 刻意不引:ink(9.5) / info(10.1) / gold(11.5) / negative(16.0) 均无匹配 —— 品牌色是刻意降饱和的(#c9564a陶土红非 Radix 红、#c9a66b古董金 Radixgold阶里根本没有) - ⚠️ 踩坑教训(值得写进规约):表面层 bg/surface/border 是暖米黄。纯按 dE 最小会误选冷调slate(总分 21.5,优于暖调sand的 27.4),但slate-2 #f9f9fb是 R<B 冷色,品牌#f6f5f1是 R>B 暖色 —— 色温正负相反,dE 却只差 3。欧氏 dE 由明度主导,看不出色温。选色相不能只看色差 - 新增 6 个状态阶 token--jr-text-soft/-faint、--jr-positive-bg/-border/-hover/-strong(原项目每色仅单值,无 hover/active/disabled 来源) - 验证:
npm run build绿 · Vitest 27/27 · lint 零新增 · JS bundle 2,728.22 kB 与装包前完全一致 · CSS +1.88 kB(gzip +0.61 kB) - Simple Icons:装了但无用武之地(待拍板 留 / 删):全仓零第三方品牌 logo,应用用自己的
public/assets/brand/logo-mark.svg+ 7 张手绘插图;业务数据只有PROD-110022类产品 ID 与净值,无银行/基金公司名称字段。未编造需求去消费它。当前零成本(sideEffects:false+ 未被 import,bundle 一字节未涨,已实测) - 未采纳 4 项及理由(留档,避免重复评估):
shadcn/ui(Radix+Tailwind 组件体系,与 antd 6 双栈冲突:行为/z-index/主题变量/bundle 全部重复)·Rough.js(手绘草图感与「静奢」克制几何风冲突,"人手痕迹"已由global.css的.jr-grain噪点承担)·README Stats/Markdown Badges(GitHub README 外部图片服务,与 web 应用无关) - 发现的既有 bug(非本次引入 · 待确认语义):
web/src/pages/advisor/AdvisorTemplatesPage.tsx:38违反 Rules of Hooks ——await useScriptTemplate(auth.accessToken, useModal.id, {...}),oxlint 报Hook "useScriptTemplate" is called in function "Anonymous"(HEAD原始版本即如此,已核实非本次改动所致)。需确认useScriptTemplate/useModal是真 hook 还是取名带use的普通 async 函数:若为误报,改名即消除;若确为 hook,则当前在非组件函数中调用,条件分支下有实害 - 技术选型文档已腐化(待确认后一并修):
docs/项目框架设计/技术选型和版本/01-技术栈与版本.md§1.7 / §6.3 / §248 仍写 Ant Design 5 + Vite 7,实际web/package.json已是 antd ^6.6.3 + vite ^8.2.2。另按 MEMORY §3 硬阀门「新增依赖须再确认」,本次 3 个前端依赖(@fontsource-variable/inter·@radix-ui/colors·simple-icons)需你确认后补登记到该文档 §1.7
2026-09-12 · 端到端第三轮:顾问前端 + 风控转换线 + 风控前端(分支 merger @ c09b987)
包:
docs/memory/tests/2026-09-12-agent-frontend-e2e/· 报告 FE-001 · spec design · plan 入库副本 174 用例 · 161 PASS / 12 FAIL / 1 SKIP → 收敛 6 缺陷 + 1 项测试资产腐化。业务代码零改动。
- Part B 风控 API 真实 HTTP E2E(新建
scripts/dev/risk_e2e_smoke.py· 64 用例 R1–R6):63 PASS / 0 FAIL / 1 SKIP · 退出码 0 - 过程中的 3 条 FAIL 全是脚本自身 bug(份额自污染 ·accept_date格式非法实为 422 非 400 · 撤单跑在 confirm 之后),已逐条定位并修 - Part A/C 真浏览器 E2E(仓库外
09/10/11-*.mjs· 47 用例):38 PASS / 9 FAIL - Part A 顾问 API 复跑(
advisor_e2e_smoke.py不改):60 PASS / 3 FAIL - 改写顾问报告 → v1.1(关闭 D1 · D3 重新定性)
- 履约 superpowers:spec + plan 入库
- 待你确认后再修(P 级见下):F1 转换页预置跨主体必失败(建议首选)· F2 预警编号恒
—· D2 KYC 500 · F4 确认日默认越界 · F3 无路由守卫 · D3 语义检索降级 - 修完 F1/F2 后重跑
node 10-risk-pages.mjs,目标 21/21 PASS;修完 D2 后重跑advisor_e2e_smoke.py,目标 0 FAIL
2026-09-12 · 基金转换 T+1(分支 integrate/risk-convert · risk-control-agent → merger 方案 A · 待合入 merger)
- merge 冲突解完(15 文件)·
main.py保留平台/问数/顾问 + convert 路由 ·core_ro并集 + 顾问行情别名 - fast-forward
merger→03fce88(integrate/risk-convert) - 本机 Core convert 种子(
verify_convert_seed.py+ nav-history 可选)·verify_convert_api.py9/9 - 前端:
/app/risk/convert+web/src/api/convert.ts - 端到端首验(FE-001 v1.0):后端四端点 R6 全绿(202 受理 · 幂等同
group_id· 未确认单不含_CONFIRMED_ONLY_FIELDS· 撤单 409 语义 · 确认批处理双日期 · RBAC 403)· 前端页 19/21 PASS - 修 F1(已由
2296a4a修复):ACCEPT_PRESETS[0]已改为同主体PROD-110022 → PROD-000001(华夏/TA-CN-001),不再触发CROSS_ENTITY_NOT_SUPPORTED - 修 F4(已由
2296a4a修复):FALLBACK_CONFIRM_DATE退化为2026-09-11+ 新增convert_meta_api取最新净值日 - 全量 pytest 回归
2026-09-12 · 投资顾问 Agent 合并(分支 integrate/advisor-agent · 目标合入 merger)
- 拍板 D1–D9 · 合并说明 + superpowers spec/plan
- 代码接缝:
/api/advisor-agent/*·advisor_auth_adapter·advisor_db· 话术/合规重命名 ·main.py挂载 - Sprint0 冒烟 · OpenAPI 62 路径 ·
test_main更新 - 本机
migrate-advisor-agent-sprint1-3.sql+ 合规/话术 seed(scripts/demo/seed_advisor_agent.ps1) - 理财师演示前端 A:四页 +
advisorAgent.ts·npm run build+ Vitest 27 绿 - 顾问线真实 HTTP 端到端验收(TEST-2026-09-12-ADV-001 v1.1,2026-09-12 复跑改写):63 用例 60 PASS / 3 FAIL / 0 SKIP → D1 已关闭 ✅ · D2/D3 待修
- D1 已由
03fce88修复:app/repository/core_ro.py:839,851补齐list_product_nav_history/list_latest_product_navs,与app/service/market_data_service.py:40,61调用一致。实测 G5 市场异动 10/10 PASS(scanned=14 created=2 used_fallback=False)+ 浏览器 4/4 转绿 - D3 定性已更正:原假设「高层
MilvusClient自动 load,所以不是未 load 的问题」被服务端日志证伪 —— uvicorn 日志MilvusException (code=101, … Collection 'kb_script_templates' is in state 'released'; call load() before search/get/query)出现 10 次。第二层:集合目录 5.0K/2 文件 vs 已灌集合 50K/5 文件 ⇒ 疑似同时是空集,仅补load()未必恢复召回
- D1 已由
- 修 D2(已由
2296a4a修复):AgentMessage.created_at(entities.py:116)补default=lambda: datetime.now(timezone.utc)...;KycSession.created_at(entities_advisor.py:45)已有server_default=func.now()。原IntegrityError 1048根因消除 - 修 D3:先确认
kb_script_templates是否已灌向量(sync_template_vectors.py),再定load()修法 test_sprint*全绿(conftest 内存 SQLite + 规则种子已接;模板 seed · Core 行情 · Milvus 等待补)—— 注意:sprint 测试全部 fake 掉 Core 提供方,拦不住 D1 这类接缝错配,不能替代真实端到端- 合入
merger(2026-09-12 · fast-forward973bf1b→4be27c5) - 契约附录 · 本说明状态「已接线」· memory 基线收敛
git commit(用户确认后)
2026-09-11 批次(merger · 回归 896 pytest 不含 sprint · npm run build 绿):TEST-RISK-001 · N-03/N-07 · /api/ready · 未 commit
本批次 · 优先收尾(推荐顺序)
- git commit
merger:Wave3 + analyst D-06/模板缓存 + 风控前端/灌库/深潜课7 + 问数 UI 标签 + 客服问候快路由/闲聊降级 + 答辩清单/课程 + 文档(你确认后执行) - 风控深潜课改版(方案 1 · 7 模块 · 读者 dev):模块 1–7 已写(含写侧并发)·
jinrong-module-risk/index.html已拼接 - 数据分析 · 20 题 live battery:
run_query_battery.py已加interpret: false· 本机uvicorn+ DeepSeek 跑完写battery_report.json(不入库) - 口径字典/问数模板种子:
scripts/dev/seed_analyst.ps1→seed-analyst-metric-dict.sql·seed-analyst-query-templates.sql - 接口契约发群稿:
docs/项目管理/接口契约发群-2026-09-09.md(复制到群即完成 · TODO 已勾) - TEST-AN-001 签核(开发侧):
TEST-LOG-2026-09-11-AN-001.mdv1.3 · A/B/D 已修 · 825 pytest(含 RISK 修复 +1) - 前端 E2E 补齐未跑测试(见下方「前端 E2E · 未跑测试」;2026-09-10 走查只做到「路由能渲染」,不是逐功能详测)
2026-09-10 日终 · 工作清单(给用户/答辩交接)
今天已完成(代码 + 文档 · 工作区多未 commit)
| 类别 | 内容 |
|---|---|
| 前端 E2E 收口 | AuthProvider(登录崩溃/退出死循环)· Redis 连接超时 0.5s · 预警客户 ID 防抖 · displayLabels/formatDateTime · 对话 ** 粗体 · 登录重入/a11y/index.html · AntD <App> |
| ChatPanel | 流式续聊 session_id · sessionStorage 恢复 · 固定高度/侧栏分页 · 用户气泡白字 · 单条删除/清空历史 |
| 会话 API | GET /sessions?status= · POST /sessions/close-all · 侧栏仅 active(服务端+客户端双滤)· close 兜底 · test_chat 增补 |
| 文档 | docs/整体测试/前端整体测试交接.md(BUG/CHAT 状态列)· FRONTEND-HANDOFF §8/§9 · ITERATION · MEMORY(22 Vitest)· 前端/API 优化 TODO(本节 §前端/API · 优化) |
| 盘点 | Agent 输出「现有功能硬伤」→ 已写入下方优化 TODO(P0~P3) |
正在做 / 未验证闭环
- 本机验证:重启 uvicorn(含
close-all)+ Redis 6380 + 前端强刷 → 客户助手「清空历史」· 多轮 Chat F5 · 四角色登录/退出 - CHAT-1~4 回归:E2E 脚本去
login()内 reload workaround(仓库外e2e-jinrong) - PERF-1 复测:Redis 正常后重测带 token 接口耗时,更新交接文档数字
将要做(已记入 TODO · 推荐顺序)
- 上方「本批次 · 优先收尾」(commit merger · battery · 客服验收 · 发群稿)
§前端/API · 优化 TODOP0(启动自检 · E2E 进仓库 · PERF 复测)§2026-09-11 接续(进页转圈 · 看板钻取口径 · 客户趋势拍板)§前端 E2E · 未跑测试P1(对话详测 · 错误态 · 数据对账 · 边界路径)
2026-09-11 接续(2026-09-10 晚对话落账 · 明天干)
工作区已有改动 · 未 commit。先读
MEMORY.md§0(Redis≠页面缓存)· §3 客户「趋势」行。
Tonight 已做
- TEST-AN-001 问数 RBAC:修复 sql_guard 缺口 A/B + deny 审计 D · v1.2 测试日志 · 820 pytest(后续 RISK/N-03 等 → 825)
docs/答辩/答辩知识点清单.md+ 课程对齐(总览模块 8 · 问数 D-06 模块 5)- 客服「你好」→ 问候
keyword_route+CHITCHAT_DEGRADED_TEXT(customer_service/visitor_service· 单测test_greeting_chitchat_without_llm) - 前端 E2E 清单收口(
AuthProvider· Redis 连接超时 · 预警防抖 ·displayLabels· 对话粗体 · 登录/a11y ·docs/整体测试/前端整体测试交接.md) - ChatPanel CHAT-1~4:流式
session_id·sessionStorage恢复 · 固定高度/侧栏分页 · 用户气泡白字 · 删除/清空会话 - 会话 API:
GET /sessions?status=·POST /sessions/close-all· 前端 active 双滤 + close 兜底 ·test_chat增补 - TEST-RISK-001 修复(F1–F11 子集):
repo_access· service_risk 只读 · compliance 矩阵 · 825 pytest · 日志 v1.1
明天优先
- 前端进页转圈:batch 净值 API 或合并请求 · 客户端 stale-while-revalidate(见
FRONTEND-HANDOFF.md§10) - 看板演示口径:四角色
/app/{role}/home有图表;无 BI 大屏 · D-12 钻取仍 open - 客户持仓产品趋势(若要做):拍板 Chat 历史 nav Tool vs 问数引导 · 平台行情详情已接 Core 历史 · Chat §9.6 仍仅问数
self域
需拍板(定了再开任务)
| 项 | 选项 / 说明 |
|---|---|
| C-04 阈值 push | 维持 inline(现状) vs Redis pub / 定时扫仓 |
| C-11 匹配说明放开度 | 已拍板:「我能买什么」→ suitability;「推荐稳赚」仍 reject |
battery_report.json |
已拍板:不入库(.gitignore · 本地跑 run_query_battery.py 生成) |
本地 data-analysis-agent 分支 |
是否 git pull xinghuo data-analysis-agent 对齐远程(与 merger 独立) |
已拍板(2026-09-10 · 见下方风控/课程待办)
- 风控 L1/L2 Redis 不做(仅 L3 cache-aside)
- 风控前端 P1:台账筛选 + 适当性页 + AML 扫描页一起做(自有组件栈)
- 风控演示:
scripts/demo/prepare_all.ps1一键灌库 - 风控深潜课:加模块 7(写侧并发)
待办(统筹 · P1 推荐顺序)
2026-09-09 P0 主链路已通;当前优先看上方「2026-09-10 批次」。
- 代销平台 API v0.1 实现(2026-09-08)
web/P0 脚手架 + 主链路真接(2026-09-09)web/src/api/risk.ts补X-Agent-Type: risk(2026-09-09)- 同步
MEMORY/REQUIREMENTS/FRAMEWORK(analyst S3 · 773 基线 · D-01~D04) - 接口契约发群稿(
docs/项目管理/接口契约发群-2026-09-09.md— 待你复制到群)
前端 web/ · P0 收尾
四角色 Demo 主链路已通(登录 → Dashboard → Chat/问数/风控 REST);以下为 polish / 规格缺口。
- 四角色 Dashboard · 平台只读 · ChatPanel · 游客试聊 · 行情 · 风控台账+筛选+适当性+AML+模拟交易 · 问数工作台+资产沉淀
- 问数模板原句(2026-09-12):
match_phrases·/template-prompts· 常用问法/标星/最近 · TEST-LOG-AN-002 · 861 pytest / 27 Vitest - 问数 NL2SQL few-shot(2026-09-12):仅 published 库(去掉
_BUILTIN_SQL_FEW_SHOTS)·seed-analyst-few-shots.sql - D-11 运行时(2026-09-12):dict/few_shot/template ·
GET /assets·POST …/publish·POST /dict/ambiguity-check· 沉淀页列表/歧义 Modal · 问数 clarify 按钮 - D-11 后续:rolled_back · 成功问数一键沉淀
- 答辩稳套餐 ①(2026-09-11):A1 sql_guard Q17 · A5 流水 clarify 单测 · C1 种子 +2 模板 · D1 分析对话重定向/菜单收 · E1
docs/答辩/DEMO-SOP-问数.md· 答辩清单同步 - 分析对话菜单下线或强引导(问数页已承载解读)· 看板钻取 — D-12 往后排
- Vitest 补测(可选):
useChatPanel·api/analyst.tsmock
前端/API · 优化 TODO(2026-09-10 硬伤盘点 · 仅现有功能)
来源:E2E 交接 + 本日修复复盘 + Agent 盘点。不含 PRD 未做能力(BI 大屏、预警 WebSocket 订阅等)。
P0 · 演示/稳定性
- 启动自检页或 health 条:
GET /api/ready+ 前端DevReadyBanner(Redis + close-all/问数路由) - PERF-1 复测:Redis 正常后重测带 token 接口耗时,更新交接文档数字
- E2E 最小集进仓库:登录/退出 · 客户 Chat 多轮+F5 · 清空会话(Playwright;可替代仓库外
e2e-jinrong) ⬆ 优先级上调(2026-09-12 · FE-001):47 条浏览器用例的脚本本体仍在仓库外C:/Users/Windows/e2e-jinrong/(09-advisor-pages.mjs/10-risk-pages.mjs/11-cross-role.mjs+harness.mjs),他人 clone 拿不到。 已缓解:本轮结果明细与 12 张截图已随包入库(docs/memory/tests/2026-09-12-agent-frontend-e2e/_raw/)⇒「结论不可被查阅」已解决。 仍缺:「结论不可被重跑」—— 建议至少把harness.mjs+ 一支最小脚本入库(用npx playwright免装依赖,不动web/package.json) ⬆ 进一步上浮(2026-09-13 · CT-001)——「腐化」已从推测变为实证:scripts/e2e/harness.mjs+scripts/e2e/12-customer-trade.mjs已入库(客户线两支),Playwright 由PW_HOME解析、未动web/package.json✅。 但仓库外三支本轮被击穿:前端登录页由「一键 Demo 按钮」重写为表单后,仓库外harness.mjs的按钮式login()全线超时 ⇒09/10/11-*.mjs三支集体无法启动,直到临时改写该login()才恢复。 待办:把09/10/11三支也收进scripts/e2e/(它们依赖的login()修复只存在于仓库外的那份备份里) - 风控演示链自检:
prepare_all.ps1或 SOP §2 后台账/AML/模拟是否「有故事」(reset.ps1后预警常空 — 文档化进自检提示)
P1 · 产品语义 / 安全观感
- 分析对话菜单 — 已重定向
/analytics/chat→ 问数;菜单项已删(2026-09-11 答辩稳) - 前端角色路由守卫(F3)· ✅ 已修 · 第四轮独立复现转绿(2026-09-13):
11-cross-role.mjs由 4 PASS / 5 FAIL → 8 PASS / 1 FAIL,C1.2–C1.5现为「打开=false hash=#/app/risk/home」即正确重定向;余 1 FAIL(C1.6)是前提已失效的陈旧断言,非缺陷(CT-001 §8-11)。浏览器侧另以B9直接验证:顾问直达/app/customer/trade→ hash 最终为/app/advisor/home。
修复前原貌(存档):AppLayout.tsx:20的allowedPaths只用于算 Menu 的selectedKey(:23),未参与任何路由守卫;routes/menus.ts的buildMenuGroups(roleLabel)只做菜单隐藏。实测(11-cross-role.mjs):风控身份直达顾问四页、顾问直达/app/risk/convert全部能打开,无重定向。定性:不是数据越权 —— 后端 RBAC 仍生效(风控在顾问页实际点「检测」→ HTTP 403/api/advisor-agent/compliance/content-check),缺口只在 UI 可见性。修法:在AppLayout或路由层加基于roleLabel的守卫,越界重定向本角色首页 - 修 F2 · ✅ 已修 · 第四轮独立复现转绿(2026-09-13):
10-risk-pages.mjs由 19 PASS / 2 FAIL → 21 PASS / 0 FAIL(CT-001 §7 节 C)。
修复前原貌(存档):RiskSimulatePage.tsx:138取key: 'alert_id'(单数),而POST /api/simulate/trade返回alert_ids(复数数组)⇒ 页面「预警编号」恒显示—。后端无问题(已实测返回alert_ids=["ALT-20260912-A021D01E"]),纯渲染缺陷。演示时「造预警」看着像失败,会误导重复操作 - SSE 断流:半条 assistant 的提示/重试或续发策略(四角色
ChatPanelstream)· 心跳注释帧已加(: ping),断连重试仍 open - 会话侧栏性能:后端稳定后改为
status=active分页即可,去掉全量扫页 + 双端 close 兜底
P2 · 展示 / 数据 / 闭环
- I18N 扫尾:行情/持仓风险码/图表轴等仍可能露英文或原始枚举
- 对话 Markdown:列表/链接(现仅
**粗体) - OBS-2 种子 UTF-8:
fix_utf8_seed.py+ 客户资料页扩字段前必做 - 资产沉淀页:仅有 POST 表单,补列表/发布态或菜单降级说明
- AntD 6 弃用 API 清告警(OBS-1 余量)
- HashRouter 生产说明:Nginx SPA fallback 写入
FRONTEND-HANDOFF部署节
P3 · 验证债(与「前端 E2E · 未跑测试」重叠)
- 接口错误态逐页打断验证 · 数据与后端 raw 对账 · 适当性/模拟/AML/处置边界路径
客户线交易 · 第四轮上报(2026-09-13 CT-001 · 初稿 6 FAIL → 2026-09-13 代码收口)
初轮口径:先报告、确认后再修(
TEST-LOGv1.0 仍保留当时 162/6 快照)。同日已落地 P0/P1/L1/CT6(见docs/memory/2026-09-13.md)→ 2026-09-13 19:26 已复跑取证,三条缺陷同期望值转绿。
- P0 · 鉴权提权(高):
infer_roles()忽略 bodyroles· 未知 actor → 401 ·tests/test_wave0_auth.py - P1 · 适当性 R4「需揭示」自助阻断(中):
simulate_self_service_blocked·trade_gateway+convert_service· 相关单测已绿 - L1 · 幂等键同键不同体 → 409:
IdempotencyConflict·CT7-05·test_accept_same_client_request_id_different_body_raises_conflict - CT6 赎回覆盖:
derive_redeem_qty()·CT10-07无赎回时 SKIP - CT-001 复跑归档 ✅(2026-09-13 19:26):Part A 161 行 135 PASS / 0 FAIL / 1 SKIP / 25 INFO(退出码 0)· Part B 48 行 41 PASS / 0 FAIL / 0 SKIP / 7 INFO(退出码 0);
TEST-LOG升至 v1.2、新增_raw/ct-api-report-v1.1-postfix.md+results-12-customer-trade-v1.1-postfix.json;5 表还原核对95 / 59 / 73 / 19 / 0
复跑新暴露的三条(需拍板 · 均为「修复本身的残留」,非新缺陷)
- P0 只堵了方向①(🟢 2026-09-13 已拍板「本轮不动,只记录」):
infer_roles()已不信任入参,但/api/auth/login(app/api/auth.py:16)仍无app_env门禁、app/main.py:103仍无条件挂载。本轮只证明「注入roles不再生效」,未证明「生产配置下非白名单 actor 一律无法登录」 —— 若日后有人改回if roles语义,缺陷原样复现。处置(已拍板):本轮不动,留待部署前修(可选:login() 内加app_env != "development"即 403/404,或仅 development 条件挂载 router)。当前APP_ENV=development,加门禁不影响 demo。 - P1 可能收窄了业务能力(必须业务确认):
simulate_self_service_blocked把allowed_with_disclosure并入阻断 ⇒ R4 产品自助通道完全不可下单。原设计是「可买但需弹揭示书 + 双录」。当前实现与前端tradeEligibility.ts口径一致,但等于收窄业务能力 —— 若期望「揭示后仍可买」,本修复是过渡方案,需另开揭示书续接流程 CT3-05跨轮次顺序敏感(测试资产设计缺陷):查询窗口是audit_log.created_at >= DATE_SUB(NOW(), INTERVAL 15 MINUTE)(墙钟),而jinrong_agent按审计语义永不还原 ⇒ 距上一轮 <15 分钟复跑会假 FAIL(本轮实测踩到3 条残留,等待窗口老化后才取得0 条)。建议改为按本轮 runstamp 过滤,消除跨轮次串扰。复跑口径已写入 README 与_raw/README.md- Redis 降级路径未验证:停 Redis 复跑 CT11(
restore_flow_from_context)两轮均未执行 —— 唯一一条主口径未覆盖的功能路径
证据链缺口(如实声明 · 不可补)
_raw/shots/的 11 张截图被 v1.1 复跑就地覆盖(脚本shots路径为固定常量),v1.0 的修复前截图不可恢复;v1.0 的修复前结论仅有ct-api-report.md与results-12-customer-trade.json可查。改进方向:把截图目录改为带 runstamp 的子目录
测试资产腐化(T1 · 2026-09-12 FE-001 上报 · 非产品缺陷)
⚠️ 这两支会持续报假红/假绿,污染后续任何「全绿」结论。未修(本轮口径:先报告、确认后再修)。
scripts/demo/run_demo_smoke.ps1:登录改POST /api/auth/login(actor_id+token_type·code=0);注释说明后续/api/v1/*仍不存在,整脚本需按当前路由重写scripts/dev/sandbox_risk_test.py:convert跨主体负例仍断言 400CROSS_ENTITY_NOT_SUPPORTED(与当前受理模型一致 · 2026-09-13 核对无需改);TODO 初稿误写为「合法 convert 202 vs 400 BAD_REQUEST」—— 以脚本内PROD-110022→PROD-161725为准docs/演示文档/功能演示版启动手册.md等:残留alembic upgrade head与/api/v1指引,与现状不符- (2026-09-13 CT-001 新发现 · 已临时修补)仓库外 harness 按钮式
login()被前端登录页重写击穿 前端LoginPage.tsx由「一键 Demo 账号按钮」改为表单(demoAccounts.ts的DEMO_ACCOUNTS已置空并标@deprecated)⇒ 仓库外C:/Users/Windows/e2e-jinrong/harness.mjs的getByRole('button', {name:/客户 Demo/})全线超时,09/10/11-*.mjs三支集体无法启动。 本轮处置:仅替换该 harness 的login()为「填input#loginId→ 点表单登录按钮」,既有断言一字未改(备份harness.mjs.bak-pre-20260913);三支随后恢复并转绿(09 → 17/0 · 10 → 21/0 · 11 → 8/1)。 残留:① 该修复只存在于仓库外那份文件里,需随「E2E 最小集进仓库」一并收编;②11-cross-role.mjs的C1.6是前提已失效的陈旧断言(假定顾问页对风控用户会打开,而 F3 修复后应被重定向)⇒ 应改断言或删除 教训:这正是「脚本在仓库外 ⇒ 无法随产品改动同步」的实证,不再是推测
前端 E2E · 未跑测试(2026-09-10 走查缺口)
✅ 部分已补(2026-09-13 第四轮 · 客户线):
B10用page.route强制 500 验证了接口错误态(ApiErrorResult渲染 code/message/trace_id);B3.2/B4.1/B8把前端渲染值与后端 raw 对账到分(总资产 Δ 恰为提交金额 · 明细行文本 · 弹窗 payload)。但仅限客户线,顾问线/风控线/问数线的同类对账仍未做。详见 CT-001 §4。
⚠️ 口径说明: 2026-09-10 那轮 E2E 不是逐功能详测。25 条路由的断言只是「页面渲染出来 + 无 console error + 无 4xx/5xx」, 页面上的数字、图表、交互是否正确一律未验证。下面这些是明确没跑的,复测前不要当作已验证。 报告与脚本:
docs/整体测试/前端整体测试交接.md· 脚手架在仓库外C:/Users/Windows/e2e-jinrong/。 反例佐证: CHAT-1~4 这四条真实缺陷是后来别人发现的,走查时完全漏掉 —— 因为对话线每条只发了 1 句就收工。
P1
- 对话模块详测(最优先 · CHAT-1~4 已修需回归):多轮连发 · F5 刷新保持同一 session · 会话侧栏分页 · 会话切换/删除/关闭 · 并发发送 · 超长消息 · 断流重连
- 接口错误态:主动打断后端(停 uvicorn / 改 proxy 返 500 / 制造超时),逐页验证
ApiErrorResult是否给出 code / message / trace ID + 可重试 —— 这是FRONTEND-HANDOFF.md§8 白纸黑字的验收项,本轮完全未验证 - 数据正确性:拿后端原始响应逐项核对前端渲染值(持仓市值/盈亏、AUM、预警条数、仪表指标卡)—— 本轮一次都没对过
- 业务边界路径:
- 适当性:只跑了 A-1 阻断,通过路径未测
- 模拟交易:只跑了放行,风控拦截路径未测
- 预警处置:只提交一次,其余状态流转 / 校验失败未测
- AML 扫描:只全量跑一次,未核对结果正确性
P2
- 图表正确性:
@ant-design/charts数据映射、空数据、单点、极值 —— 本轮只确认「渲染出来没报错」 - 排序/分页正确性:只确认「点了不崩」,未验证排序真的有序、翻页真的换内容
- 资产沉淀:只确认表单渲染,从未提交过一条
- 客户档案:只看到 5 个字段(customer_id / display_name / risk_code / risk_expires_at / phone_masked),其余字段渲染未验证(另见 OBS-2 后端
occupation:"???"乱码) - 掩码持久化:眼睛按钮状态跨路由 / 刷新 / 重登录的行为未全量验证
- PERF-1 复测:Redis 起到 6380 后重测接口耗时 —— 当前记录的 2.05s 是 Redis 未起环境下的测量值,环境修好后数字会变
- simulate 交易 UI:风控菜单「模拟交易」+
RiskSimulatePage+api/simulate.ts(演示说明 · A-3/A-1 预设) - 接口契约发群稿(见
docs/项目管理/接口契约发群-2026-09-09.md· 复制到群即完成)
待办(模块侧开放项)
客服 Agent · S2 接缝(2026-09-09 已接线 · 并行分流)
清单:
docs/项目框架设计/客服Agent-合并说明.md§3–§4 · 原则只增不盖、不覆盖main.py/chat.py/agent_service.py整体。
- 跑迁移 SQL:
scripts/agent/migrate-customer-agent-cs-c11.sql(conversation_archive·customer_notes)(2026-09-09 本机已执行) - 挂游客路由:
POST /api/chat/visitor→main.py - 编排接缝(并行):
X-Agent-Type: customer→customer_service.run_customer_chat;其余 Agent 仍agent_service.chat - Wave 3 测试解禁:
test_wave3_customer_service.py19 例绿 · 基线 554 passed - Wave 1/2 解禁:
test_wave1_*·test_wave2_*已移出collect_ignore并绿(132+ 例) - Wave 3 profile / 4 / 5 解禁:
test_wave3_profile_service·test_wave4_e2e·test_wave5_notes· 基线 730 passed - 1B/R1 拍板落地(2026-09-10):
sanitize_postprocess· Top-K · TEST-LOG · 776 pytest - Wave3 能力批次(2026-09-10):C-04 threshold · C-05 nav · C-11/C-07/C-08 · visitor 1B 对齐 · keyword 优先级 · 786→795 pytest
- 企业级测试包
docs/memory/tests/2026-09-10-customer-1b-r1/ - 课程 layout 修复(2026-09-10):
showLayer单参回退 ·.module-innerCSS 别名 ·build_all.py - 客服 KB 第二套(fin_*)· Ollama 灌库(2026-09-09 本机):
ollama pull bge-m3✓- Ollama 服务
http://127.0.0.1:11434✓ - Windows:
MILVUS_URI须英文绝对路径(如C:/Users/Windows/.jinrong/milvus/milvus.db),中文项目路径 faiss 会炸 python scripts/kb/build_collections.py --rebuild(原料data/kb_collections/)✓ 9 块python scripts/kb/test_search.py✓
- 客服 RAG 接 fin_ 三库*:
VisitorRagService→search_cs_knowledge(fin_product/fin_policy/fin_faq);宿主 Tool 仍走kb_product_rules(T-21) - tool 层实现 + 种子文档:
document_parser/embedding_tool/milvus_tool+data/kb_collections/*(2026-09-09)
数据分析 Agent · S3 接缝(2026-09-09 已接线)
清单:
docs/项目框架设计/数据分析Agent-合并说明.md· 825 passed · 冒烟scripts/dev/smoke_analyst.py
- merge + 接缝(
analyst_router·analyst_auth_adapter· 问数走get_platform_auth_context) - customer
self域 + 「AI 分析有风险」尾注 - Wave6 测试 · 迁移
migrate-analyst-d07-d11.sql· 重置reset-analyst-d07-d11.sql - 前端问数页 · Scope B 冒烟 19/19
- P2 · D-11 资产沉淀 UI(
AnalystAssetsPage·POST /api/analyst/assets)— 仅写 draft 表,未接 NL2SQL/发布(2026-09-12 拍板延后) - P2 · 问数页 dashboard 卡片(
GET /api/analyst/dashboard·AnalystQueryPage顶部 metrics) - P2 · 口径字典种子 SQL(
scripts/agent/seed-analyst-metric-dict.sql· 本机需手工执行) - customer Chat SSE(
chat.pystream →prepare_customer_stream· 前端mode="stream") - STAFF-30001/30002 追加 risk_demo(
jwt_service.py· 模拟交易页可造预警) 445cfbb功能层 cherry-pick(2026-09-10):guardrail.py·dict_service.py· wave6 测试 ·run_query_battery.py- D-06 双层缓存(2026-09-10):结果缓存+表世代写侧失效 · 模板填参 · 问数页标签 · 种子 SQL
- D-09 多轮追问 · [x] N-03 溯源明细 · [x] N-07 转人工 — N-03/07 最小闭环(sample + escalate + 问数页按钮)
数据分析 Agent · 445cfbb 合入后开放项
- 20 题 live battery 跑分(见上方「本批次 · 优先收尾」)
- agent 编排接流水 Ambiguity:
dict_service已返 Ambiguity · 确认analyst_agent反问链路在 live 20 题里生效(Q 含「流水」) - D-06 写侧主动失效(2026-09-10):表世代 bump · 模拟交易
core_trade· 预警/L3 写侧 ·invalidate_tables+ 单测 - D-06 模板缓存(2026-09-10):
template_service匹配+填参 · 问数编排跳过 LLM · 种子seed-analyst-query-templates.sql - D-06 PII 脱敏后再缓存 — 暂缓(全仓脱敏方案未定)
- 已知挂账(迭代文档):Q7 无城市字段静默改职业 · 待排期(Q17 已修)
- 远程分支同步(可选):本地
data-analysis-agent@fd9464d落后xinghuo/data-analysis-agent2 commit
风控 Agent · 2026-09-10 拍板收口
后端主链路(FR-1~10 · 对话 6 Tool · 处置 API)已完成。 下列为 polish / 演示 / 文档,不是「风控坏了」。
拍板(已定 · 不再扩 scope)
- 画像 Redis L1/L2 不进风控:L1/L2 热缓存归客服线(
customer_service+ProfileHotCache);风控只保留 L3 cache-aside(profile_l3.get_profile_l3·customer_contextTool 已走)— 不做 risk 侧 L1/L2 Redis - 前端用自有组件:扩页时复用
PageShell·Button(components/ui)·ApiErrorResult· AntDTable/Modal/Select(对齐RiskAlertsPage/RiskSimulatePage),不新引 UI 库 - 模拟交易 UI 已有:
RiskSimulatePage+api/simulate.ts(A-1/A-3 预设)
P1 · 前端代码(2026-09-10 拍板 · 三页一起做 · 2026-09-10 完成)
- 台账筛选 UI:
RiskAlertsPage·alert_type/customer_id/ 日期窗 - 适当性检查页:
RiskSuitabilityPage·POST /api/risk/suitability/check - AML 扫描页:
RiskAmlScanPage·POST /api/risk/aml/scan - 路由/菜单:
/app/risk/suitability·/app/risk/aml-scan
P1 · 演示一键灌库(2026-09-10 完成)
scripts/demo/prepare_all.ps1:双库 DROP → core + agent 种子 → AML → prepare_risk_demo → sync_advisor_rel- TEST-RISK-001 修复:见
docs/memory/tests/2026-09-11-risk-agent-e2e/TEST-LOG-2026-09-11-RISK-001.mdv1.1 ·sandbox_risk_test.pyD 节期望TypeError
P2 · 深潜课(2026-09-10 完成)
- 模块 7 · 写侧并发:
modules/07-concurrency.html· nav 7 dots ·build.sh/ python 拼接index.html
后端 / 架构 · 挂账(非 P1 · 动契约前先出方案)
- AL-06:chat 链路
risk_suitability_log.actor_id暂落 SYSTEM(agent_tool_call已覆盖发起者;改须动core_tools/kb_tools冻结签名)
对话 Tool(risk Chat SSE)— 已完成
- risk Chat SSE(
ChatPanel·X-Agent-Type: risk) - 6 只 Tool 已注册(含
query_agent_behavior)
运维 / 演示 checklist(脚本已有 · 非产品化 · 见 演示SOP-风控模块.md)
走查时手工跑即可;不等于后端缺 API。
subscribe_alerts.py→ Redisrisk:pub:alert实时推送演示escalation_scan.py/agent_behavior_scan.py(FR-9/10 · cron 无 UI,运维手跑)rebuild_alerts.py(engine_error 补偿)- SOP §2 灌库:
seed-aml-list.sql+prepare_risk_demo.sql(reset.ps1只重建 core)→prepare_all.ps1一键串联 - 走查样例 A-1~A-5 · FR-9/10 · L3 high 样例(文档步骤,非代码任务)
客服 Agent · Wave3 开放项(2026-09-10 后)
- C-04 push/cron(演示最小):
POST .../threshold-check?push=·scripts/demo/push_threshold_alerts.py· 持仓页「检查阈值提醒」 - C-05 Phase B:
nav-snapshot外部 sync(Core 内 07 历史种子 + nav/history API + 详情页 已做 · 见 v0.2 草案) - C-08 偏离检测:仅 L1 槽位,无自动调仓建议
- Vitest:客户 Chat 新 intent 无前端单测(后端已覆盖)
- 手工验收 + TEST-LOG 签核(见上方「本批次 · 优先收尾」)
画像 Redis · cache-aside(2026-09-09 · 客服域,非风控)
- L3 热读(风控):
get_profile_l3cache-aside ·customer_contextTool 已走此路径 - L1 懒读(客服):
ProfileHotCache.get_style_tags_lazy· 写侧warm_l1·customer_service已切懒读 - L2 热读/写(顾问):表与 JWT scope 已有 · Repository/Redis 未实现 — 风控不做
- 【前端接入·方案 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)已修复 - 【前端接入·方案 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_turnuser+assistant 同事务落库(修评审 P0/P1)。测试 494→503 绿。遗留:无心跳帧、断连留空会话待清理 - chat 同步/流式落库免责声明口径统一(2026-09-09):
chat.py_assistant_content_for_persist· sync/stream 共用 ·test_chat回归 - 2026-09-05 memory 文件夹更新(新 Agent 交接清单)
AL-09 已完成(2026-09-08)——见
docs/项目框架设计/合并注意事项-风控模块并入main.md执行记录。
-
【AL-09】合并接线(2026-09-08):JWT 统一 · 模块 chat 恢复 · auth_adapter · test_module_boundary 绿 · 502 pytest 绿
-
T-04 Core RO 封装为 Tool 节点;A-01 归属校验(chat Tool 接入 + agent_tool_call 落库)—— 完成(2026-09-07):
app/tool/core_tools.py(L0/持仓/流水三只读 Tool + TOOL_REGISTRY 白名单)+app/service/tool_service.py(关键词意图仅 customer/advisor;归属校验对齐 deps.assert_customer_access 口径——Tool 层拒绝不抛 403 而 blocked 留痕,纵深防御;run_tool 执行+落库,落库失败降级)+ agent_service 图 tool 节点(START→tool→llm→guard;结果注入 LLM 上下文,降级回复带摘要)+ session_repository.insert_tool_call(message_id 一期 NULL)。A-01 口径:本任务只做 Tool 层归属校验语义(customer 本人/advisor assigned/risk_officer 全量/其余拒),A-01 完整场景(代理人画像)仍归 T-20;risk 分支四 Tool 归 C1 复用 run_tool。评审闭环(2026-09-07):首评 P1×2+P2×3+P3×2 → 修复40a9ee2→ 复审 P2×1+P3×4 → 修复1216d26,pytest 321 绿;入参白名单+days 钳制、公共鉴权双写utils/authz.py、list_holdings LIMIT 均落地 -
T-21 Milvus Lite + kb_product_rules 首批入库 —— 完成(2026-09-07,commits e34973f~535c8a0 共 6 个 + 评审闭环 9cc2e59):
app/service/embedding.py(Ollama bge-m3 批量 /api/embed 1024 维,四类失败一律 EmbeddingError 不静默降级)+app/service/milvus_service.py(kb_product_rules 幂等建集合+upsert+search_kb 溯源/effective_date 合规过滤)+data/kb/6 只种子产品手册(prospectus/fee/rule/risk 四节 24 块)+scripts/kb/build_kb.py(--dry-run/--kb-dir)+app/service/rag_service.py落地(search_knowledge→chunks+source_refs,异常上抛防 LLM 编造)+app/tool/kb_tools.py挂注册表第三层(ToolSpec 新增 skip_access_check:公开知识无归属语义,advisor 无绑定客户可查;意图层限定 customer/advisor,risk 不开放——用户拍板)+ tool_node 按 spec 白名单注入 query + summarize 溯源口径。真库验收:24 块入库,search_knowledge("基金申购") Top3 命中申赎规则(score 0.73+),溯源完整。三坑收口:Milvus Lite 跨进程重开须显式 load / faiss 不支持中文路径(本机 .env 改 C:/Users/YUAN/.jinrong/milvus/)/ build_kb sys.path 引导。知识库 API(上传/重建端点)一期不做(knowledge.py 仍空壳,用户拍板),425 绿。〔2026-09-14 勘误〕 当时 24 块灌入的是C:/Users/YUAN/.jinrong/milvus/;当前.env指向C:/Users/Windows/.jinrong/milvus/milvus.db,实测该库无 kb_product_rules(两份现存 store 均无),需重跑scripts/kb/build_kb.py灌入当前库 -
T-03 输入防护规则(F-03:prompt_injection/oversize/限流)—— 完成(2026-09-07,commits 497554d/65b45aa/cc6f34f/207fc79):
app/service/input_guard.py(注入短语词表 42 条四类纯函数检测 +inspect_messageoversize 4000 先于 injection +check_rate_limitRedis INCR 固定窗口 actor 级 30 次/分 fail-open)+ chat 路由接入(顺序:鉴权→准入→空白→限流 429→注入/超长 400→归属→会话;被拒 fail-fast 不建会话不落消息,blocked 落 input_guard_log,留痕降级不改拒绝语义;Pydantic 硬顶 20000,业务限 4000 移 guard 层换留痕)+ redis_gateway.incr + settings.guard_rate_limit_*;拍板:命中即拒不清洗、仅 blocked 留痕、词表代码常量可审计。独立 AI 评审 PASS with findings(P0=0;P2×3 已收口:词表断言修正/补 7 条同构变体/窗口 TTL 断言+EXPIRE 失败取舍锁定;P3 已收 session_id 截断,挂账对抗变体扩表),378 绿 -
风控阶段 C(C0 pytest-asyncio / C1 chat_tools / C2 risk 分支 StateGraph / C3 A-6 验收)—— 完成(2026-09-07):
app/service/risk/chat_tools.py四只读 Tool(alert_query/customer_context/suitability_check/aml_lookup)挂RISK_TOOL_REGISTRY;tool_service.run_tool改查 core+risk 统一注册表get_registered_tool且恒传risk_repo;_normalize_params读 spec 白名单;match_intent按 agent 分组扩 risk 关键词;agent_service.tool_node守卫放宽(requires_customer=False允许无绑定客户,支撑 A-6 全量待审);A-6 验收+诱导处置边界(无处置 Tool、系统提示禁自动处置、诱导只触发只读且预警状态不变);独立 AI 评审 PASS(P0=0,P2 补 advisor 归属/空 product_id 单测已收口),345 绿,tagrisk-m3
风控模块(PRD v1.0 已冻结 · docs/PRD/PRD-风控监测Agent.md,事件驱动线不依赖 T-07 可先行)
- T-30 风控事件线 —— 全部完成(B1~B9b,M2 tag risk-m2):规则引擎/预警聚合/L3/AML/交易网关/4 API/演示走查 11/11 PASS + 核查单①~⑥收口,均经独立 AI 评审闭环;scan_all 幂等读后写无锁留痕(接批量时 run_locked)
- T-31
service/suitability.py公共校验(SUIT-001008)+008 编号体系已随 AL-05 换核退役,判定内核改为 main 的 core_ro.check_suitability(C×R 矩阵 + JR-AST/FM 契约),测试按 main 契约重写(原 77 例作废,全量基线 425→406)**POST /api/risk/suitability/check—— **交付=suitability 服务函数+单测(77 例;check API 随 B6 带鉴权+直调审计);MySQL 手工 SQL 对照(阶段 A 评审 P2-8)2026-09-07 收口:4 组演示组合真库 SQL 推导与函数判定逐项一致(演示 SOP 核查单附行)。【2026-09-07 阶段一退役】SUIT-001 - T-32 预警台账与人工处置 API + 对话线 —— 台账/处置 API 已由 B6 覆盖并复审通过(A-7/A-9 用例绿);交付=对话线,归阶段 C(C1~C3,T-07 已就绪)
已完成
- 2026-09-13 问数「最近N天+金额/流水」时间序列修复(分支
merger· 未 commit):根因 = NL2SQL 对该问法生成原始明细行/单行合计(审计 trace-c8de6a2ab7964ee8:23 行流水明细;另一次INTERVAL 30 DAY与「十天」不符),分析助手拿不到日期维度 → 折线图无法生成、柱状图按单笔成柱。修法 =_nl_sql_hints增_recent_days_series_hint(analyst_agent.py):命中「最近/近 N 天|日」+ 金额/流水/交易/申购/赎回/笔数 且非明细问法时,注入按日聚合口径(DATE(traded_at)+SUM/COUNT+GROUP BY ... ORDER BY ASC,中文数字 N 归一化为INTERVAL n DAY)。验证:test_wave6_analyst_agent25 绿(新增 3 用例)· 真 HTTP 复现(advisor STAFF-10086)问数得 5 行日聚合表 → 分析助手「折线图」返回 line spec(x=trade_date/y=total_amount)·「柱状图」返回 column spec 同绑定。注意:用户需重新问数后再开分析助手(旧表格快照仍是明细行) - 2026-09-07 风控 M2 收尾(M4 复核):MEMORY/TODO 状态与边界文字对齐(任务映射 T-30/T-31/T-32 口径确认;B7 复审留痕「成功响应不包裹外壳」演进口径维持并登记开发计划 M4 节)——风控阶段 B 正式完结
- 2026-09-07 T-01 JWT 鉴权(commit
36f476f+ 评审闭环 61711cb):app/service/auth_service.pyAuth SDK(HS256 dev/RS256 生产、必填 claims 显式校验、jti 吊销 fail-open、RS256/HS256 算法白名单互斥)+deps.get_auth_context工厂替换(Bearer 全环境优先;debug 头降级 dev 兜底,双闸门=APP_ENV+无 RS256 公钥)+ X-Agent-Type 交叉校验(手册 §4.6/§5.4 AGENT_ACCESS_MATRIX)+scripts/dev/issue_dev_token.py签发 CLI + lifespan 改验 jwt_ready - 2026-09-07 T-02 审计中间件(commit 3cec034):
app/api/audit_middleware.pyhttp_access 全量访问审计(actor 经 request.state.auth,排障路径/OPTIONS 跳过,写库失败降级)+ 独立 request_id(X-Request-Id 贯通,B7 复审 P3-4)+ 422/404/405/500 统一错误体(500 由 trace 中间件兜底回写 trace 头,B7 复审 P2-2)+ input_guard_log 双写(挂账⑧收口;401 归 platform、四 Agent 入口写 guard) - 2026-09-07 T-07 LangGraph 骨架(commit fb18c04):
agent_serviceStateGraph(llm→guard)+ DeepSeek/langchain-openai(无 key 降级明确标注)+ 四 Agent 边界 system prompt + customer/risk 免责声明(has_disclaimer)+ 单测 mock LLM 不依赖外网 - 2026-09-07 T-06 chat 最小闭环(commit ee5c78a):
api/chat.pyPOST /api/chat(X-Agent-Type 分流+准入+归属校验+SessionGuard AUTH_403_SESSION_AGENT+closed 409)+session_repository(agent_session/agent_message)+memory_service(Redis 窗口 sess:{agent}:{id}:msgs TTL2h N≤20,miss/异常回源 MySQL)+ main 挂载 - 2026-09-07 Wave 0 独立 AI 评审有条件通过→闭环(commit 61711cb):P2×5(python-jose>=3.5.0 防 CVE / audit 降级测试 / JWT 通道 chat 用例 / debug 兜底纵深防御 / 留痕失败降级显式化)+ P3×11 顺手,273 测试绿
- 2026-09-05 init 项目记忆目录 +
app/脚手架(api/service/tool/model/config/utils) - 2026-09-05 需求拆解文档(业务场景/矩阵/合规)
- 2026-09-05 表设计 + 技术选型 + JWT 手册
- 2026-09-05 Core 模拟库
scripts/core/*+reset.ps1+ 文档 - 2026-09-05
core_ro.py+settings.mysql_core_database+ sync 脚本 - 2026-09-05 Agent 编排依赖改为 LangGraph(requirements.txt)
- 2026-09-05 memory 文件夹更新(新 Agent 交接清单)
- 2026-09-10 merger 批次(工作区 · 804 pytest · 未 commit):Wave3 · analyst D-06 · 风控前端/灌库/深潜课7 · 问数 template 标签
- 2026-09-10 客服 Wave3 + analyst
445cfbbcherry-pick + 课程 layout 修复(795 pytest · 已并入上项) - 2026-09-09 数据分析 Agent S3 合并接线 + 问数页 + 迁移/冒烟(
773 passed· commitaf9fb71) - 2026-09-09 数据分析 Agent 需求规格定稿 v1.1(
docs/需求拆解/01-数据分析Agent需求规格.md)