- Added new entry for "STAFF-20003" role in `jwt_service.py` to support additional user permissions. - Revised the demo SOP documentation to reflect updated processes and clarify the presentation flow, including changes to the demo script and internal guidelines. - Enhanced the presentation materials with a new HTML slide deck for the advisor agent demo, ensuring a cohesive visual representation of the features and capabilities. - Updated various documentation files to align with recent changes in the advisor agent functionalities and testing baselines. This update improves the clarity and usability of the demo materials while ensuring that the documentation accurately reflects the current state of the project.
43 KiB
TODO
大任务开始时更新;完成一步打钩并验证后再往下。
新 Agent: 先看MEMORY.md§0 交接清单,再从此处取下一项。
进行中
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:
RiskConvertPage.tsx:16-27的ACCEPT_PRESETS[0]是跨主体组合(110022华夏/TA-CN-001 →161725易方/TA-CN-002)→ 点一下就 400CROSS_ENTITY_NOT_SUPPORTED。演示路径的唯一入口不可用,建议优先修(实测换PROD-000001即 202) - 修 F4:
RiskConvertPage.tsx:37的confirmDate默认2026-09-15落在 NAV 区间外(最新2026-09-11)→ 一进来就走confirmed=0的降级路径。改为数据驱动或退化为2026-09-11 - 全量 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:
app/model/entities.py:116的created_at无 Python 侧 default,kyc_session_repository用 ORM 写且不传该字段 ⇒ 显式 NULL 覆盖 DDL 默认值 →IntegrityError 1048。前端取证:KYC 页「创建会话」成功,「发送采集」报INTERNAL_ERROR - 修 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) - 风控演示链自检:
prepare_all.ps1或 SOP §2 后台账/AML/模拟是否「有故事」(reset.ps1后预警常空 — 文档化进自检提示)
P1 · 产品语义 / 安全观感
- 分析对话菜单 — 已重定向
/analytics/chat→ 问数;菜单项已删(2026-09-11 答辩稳) - 前端角色路由守卫(F3 · 2026-09-12 实测确认):
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:
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/处置边界路径
测试资产腐化(T1 · 2026-09-12 FE-001 上报 · 非产品缺陷)
⚠️ 这两支会持续报假红/假绿,污染后续任何「全绿」结论。未修(本轮口径:先报告、确认后再修)。
scripts/dev/sandbox_risk_test.py:325-326:仍断言convert→ 400BAD_REQUEST,而03fce88之后合法 convert 受理为 202 ⇒ 该断言必然失败。 修法(一行):改为断言 202 受理;或换成真正的非法组合(如跨主体PROD-110022 → PROD-161725,即 F1 那对)以保留负例覆盖scripts/demo/run_demo_smoke.ps1:67-79:仍调/api/v1/auth/login并用username/password登录、断言code=="00000"。/api/v1在app/中已无任何路由 ⇒ 按当前代码必然 404 修法:改 canonical 路径 +POST /api/auth/login {"actor_id","token_type"}docs/演示文档/功能演示版启动手册.md等:残留alembic upgrade head与/api/v1指引,与现状不符
前端 E2E · 未跑测试(2026-09-10 走查缺口)
⚠️ 口径说明: 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 绿 -
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-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)