Files
group_xinghuo_jinrong/docs/memory/tests/2026-09-12-advisor-agent-e2e/TEST-LOG-2026-09-12-ADV-001.md
T
zhanghongyu_0626 2296a4a002 feat(api): Add convert_meta_api for retrieving latest NAV date and enhance created_at field handling
- Introduced `convert_meta_api` endpoint to fetch the latest NAV date for conversion processes, restricted to users with the "risk_officer" role.
- Updated `created_at` field in `AgentMessage` to use UTC timezone for consistency in timestamp handling.
- Added `get_max_product_nav_date` method in `CoreReadOnlyRepository` to support the new API functionality.
- Enhanced Milvus template loading in `MilvusTemplateVectorStore` to ensure collections are loaded when they exist.

This update improves the API's capability to handle conversion metadata and ensures accurate timestamp management across the application.
2026-09-13 12:40:44 +08:00

27 KiB
Raw Blame History

企业级测试日志 · TEST-2026-09-12-ADV-001

投资顾问 Agent(代理人 Agent)· /api/advisor-agent/* 全端点真实 HTTP 端到端冒烟


1. 文档元数据

字段 值
测试记录编号 TEST-2026-09-12-ADV-001
缺陷/变更标题 顾问线全景端到端验收:63 用例 · 60 PASS / 3 FAIL / 0 SKIP · D1 已关闭,D2/D3 未修
文档版本 v1.2
创建日期 2026-09-12
最后更新 2026-09-12(v1.2 · 基线已随 merger 改写 · D3 计数口径更正)
关联分支 merger(v1.0 时为 integrate/advisor-agent;该分支已合入 merger)
关联拍板 / TODO 合并说明 §6.3 Scope B 冒烟 · D1~D9 · docs/memory/TODO.md「顾问 Agent 合并」批
风险等级 MEDIUM(v1.0 为 HIGH —— 市场异动线已随 D1 修复恢复,剩余 KYC 采集与语义检索两项降级)
缺陷类型 接缝接口不一致 ×1(D1 已修) · ORM/裸 SQL 写入姿势不一致 ×1 · 静默降级 ×1
发现阶段 真实 HTTP 端到端验收(首轮 v1.0 · v1.1 为合并后基线复跑)
修复阶段 D1 已修复(03fce88)· D2/D3 未修复 —— 本轮定性仍为「先报告、确认后再修」

2. 组织与责任

字段 值
所属系统 JinRong 金融四 Agent 智能管家
所属模块 投资顾问 Agent(顾问工作台后端线 · 源分支 xinghuo/advisor-agent)
子模块 / 服务 advisor_compliance · advisor_script_templates · kyc · market · copy · guard · dashboard/allocation 桩
模块负责人 (合并中 · 见 docs/项目框架设计/理财顾问Agent-合并说明.md)
发现人 Andrew
修改人 (未修改 · 待确认后再修)
测试执行人 Andrew
评审人 (待模块负责人确认)
发布建议 v1.1 订正:不建议合并 merger —— D1 已修,市场异动线已恢复;KYC 采集(D2)与语义检索(D3)仍不可用/降级,是否阻断发布请模块负责人按这两项的演示权重决定

3. 环境与基线

字段 值
测试环境 development · 本机 Windows 11 · Python 3.13.9
被测版本 v1.1:merger @ c09b987(feat(web): 基金转换演示页与 agent 镜像表迁移; Core seed 修复)—— 本轮复跑前已确认 :8000 上无 merge 前的旧进程(/openapi.json 含 convert 路径),git status 干净
v1.0 被测版本(存档) integrate/advisor-agent @ 64c5db7 —— 该分支已合入 merger,v1.0 的结论仅对旧基线成立
基线变化(v1.0 → v1.1) 03fce88 把「基金转换 T+1」整条线并入 merger(110 文件),并在 app/repository/core_ro.py:839,851 补上 list_product_nav_history / list_latest_product_navs —— 这正是 D1 的修复点。c09b987 再补 RiskConvertPage 前端与迁移
被测服务 python -m uvicorn app.main:app --host 127.0.0.1 --port 8000(真实进程 · 无 --reload)
数据库 MySQL jinrong_agent(29 表)+ jinrong_core(12 表)· 顾问 7 张专用表已迁移
种子 compliance_rule 50 条 · script_template 20 条(全 is_approved=1)· core_customer 33 · core_customer_advisor 33 · core_product 14 · core_product_nav 5110 行(NAV 最新 2026-09-04)
Redis Docker 6380 · /api/ready = {"ok":true,"degraded":false}
Ollama / Milvus bge-m3(1024 维)已就绪 · Milvus Lite C:/Users/Windows/.jinrong/milvus/milvus.db
DeepSeek 有效 key · market-alerts/generate 必经(失败回退安全模板)
Neo4j 未启动 —— 顾问链路在 app/ 中无任何引用,不依赖
特性开关 COMPLIANCE_AI_ENABLED=false · KYC_AI_ENABLED=false(硬规则 + 确定性解析,结果可复现)
基线对照 python -m pytest → MEMORY §0 记 926 passed / 65 failed(红均为顾问 test_sprint*)
本轮口径 真实 HTTP + 真实 MySQL;现有 pytest 全部为 TestClient 进程内 + 内存 SQLite,无任何测试打到真实服务

4. 测试目标与方法

字段 值
目标 只测 API、忽略前端;把 /api/advisor-agent/* 全部 24 个端点逐个打通
方法 真实 uvicorn + 真实 JWT,逐端点正向 + 边界(越权 403 / 注入拦截 / 合规 BLOCK·WARN 门闸)
账号 advisor STAFF-10086 · compliance STAFF-40001(多 template:write/compliance:rule:write)· analyst STAFF-20001
脚本 scripts/dev/advisor_e2e_smoke.py(可重复 · --only G6 单组重跑 · 退出码非 0 即有 FAIL)
用例总数 63(G1 鉴权封套 5 · G2 合规 14 · G3 复制门闸 5 · G4 话术模板 12 · G5 市场异动 10 · G6 KYC 10 · G7 输入防护 3 · G8 桩路由 2 · G9 跨线回归 2)

5. 结果总览

v1.1 复跑结果(当前基线 merger @ c09b987):60 PASS / 3 FAIL / 0 SKIP 复现:python scripts/dev/advisor_e2e_smoke.py(退出码 1 = 有 FAIL)

指标 v1.1(当前) v1.0(存档)
PASS 60 53
FAIL 3(收敛为 2 个缺陷:D2 / D3) 5(3 个缺陷)
SKIP 0 5(全部被 D1 阻断)
可判定率 63/63(100%) 58/63
业务线 状态(v1.1) 相较 v1.0
鉴权 / RBAC / 封套 / Trace ✅ 正常(含越权 403、未知账号 fail-closed、Trace 双向回显) 不变
合规检测 + 规则库 ✅ 正常(keyword/regex 硬规则、BLOCK/WARN/INFO 分级、AI 层降级) 不变
复制门闸 ✅ 正常(BLOCK / WARN 未确认 / hash 一致性 三种门闸全生效) 不变
话术模板 CRUD / 使用 / 合规前置 ✅ 正常(未审核不可用、改内容回落审核态、违禁文案创建被拦) 不变
输入防护 ✅ 正常(注入 40002 且不落库) 不变
跨线回归(适当性 / 问数) ✅ 未被顾问线破坏 不变
市场异动(行情/扫描/解读/反馈) ✅ 已恢复(10/10 PASS) 🔴→🟢 由 D1 修复
KYC 对话采集 ❌ D2 阻断,采集不可用 不变
话术语义检索 ⚠️ D3 静默降级为纯关键词 不变(但根因经本轮实测订正)

6. 缺陷描述(3 条 · D1 已关闭 · D2/D3 未修复)

D1 · 顾问市场数据 Provider 与 merger Core 仓储接口不一致(阻断 · P1 → 已修复 ✅)

v1.1 状态:CLOSED(由 03fce88 修复;merger @ c09b987 实测转绿)

项 内容
修复证据(代码) app/repository/core_ro.py:839 新增 list_product_nav_history、:851 新增 list_latest_product_navs,与 app/service/market_data_service.py:40,61 的调用签名对齐
修复证据(实测) G5 市场异动 10/10 PASS,含 异动扫描 → 200 scanned=14 created=2 skipped=12、异动解读 → 四段式 used_fallback=False latency=1415;v1.0 时这两项为 500
连带解除 v1.0 因 D1 而 SKIP 的 5 项全部恢复可判定,本轮 SKIP = 0
仍潜伏 app/service/agent_tools.py:70 的同款错误调用仍在(见下方 D4 记录),当前无 HTTP 入口故不计入分母

以下为 v1.0 原始记录,仅作历史存档。

字段 内容
缺陷编号 DEF-ADV-2026-09-12-001
严重等级 P1(市场异动整条业务线不可用)
现象 GET /api/advisor-agent/market/fund/{code} 与 POST /api/advisor-agent/market-alerts/scan 双双 500
复现 POST /api/advisor-agent/market-alerts/scan {"nav_date":"2026-09-04","threshold_pct":1.0}
期望 / 实际 200 + 行情/扫描结果 / 500 INTERNAL_ERROR
根因 app/service/market_data_service.py 调用的是顾问源分支方法名,与 merger app/repository/core_ro.py 对不上::40 调 list_product_nav_history(id, limit=N),merger 实为 list_nav_history(id, *, days=N, end_date=None)(:499)——方法名与关键字参数名都不同;:61 调 list_latest_product_navs(nav_date=N),全仓库不存在此方法。线上异常实测:AttributeError: 'CoreReadOnlyRepository' object has no attribute 'list_product_nav_history' / ... 'list_latest_product_navs'
半途痕迹 _to_nav_point()(:100-111)已改为读 merger 的 daily_chg_pct 字段 —— 合并时改了字段名但漏改方法名
波及 scan 不可用 ⇒ 无 alert 落库 ⇒ 异动列表 / 异动解读 / 反馈闭环 4 项后续用例全部 SKIP
同类潜在缺陷 app/service/agent_tools.py:70 同一错误调用。当前仅被 app/service/agent_graph.py:158 引用,LangGraph 未挂任何端点故暂未暴露,接线即 500
为何测试没拦住 tests/test_sprint2_market_alert_scan.py 用 FakeMarketDataProvider、tests/test_step10_agent_tools.py:97 用 MagicMock —— 顾问侧测试全部把 Core 提供方 fake 掉,真实 CoreReadOnlyRepository 契约从未被任何测试校验
修复方向(待确认) 改调 list_nav_history(product_id, days=history_limit);为 list_latest_product_navs 在 core_ro.py 补只读实现(按 nav_date 取各产品最新净值 + join core_product 取 product_name/product_type/min_risk_code),或在 market_data_service 内改为逐产品组合

D2 · KYC 对话写 agent_message 时 created_at 显式传 NULL(阻断 · P1)

字段 内容
缺陷编号 DEF-ADV-2026-09-12-002
严重等级 P1(KYC 采集不可用;建会话/越权拦截/完成均正常,唯采集一步挂)
现象 POST /api/advisor-agent/kyc/sessions/{id}/chat 500
复现 建会话 → {"customer_input":"客户今年28岁,女性,未婚"}
期望 / 实际 200 + parsed_fields / 500 INTERNAL_ERROR
根因 app/repository/kyc_session_repository.py:138-159 用 ORM 实体写 agent_message,构造 AgentMessage(...) 未给 created_at;app/model/entities.py:116 该映射列无 Python 侧 default(同表 has_disclaimer 有 default=False 作对照),SQLAlchemy 遂以显式 NULL 写入 —— 显式 NULL 覆盖了 DDL 默认值。实测 pymysql.err.IntegrityError: (1048, "Column 'created_at' cannot be null")
关键对照 表 DDL 本身正确:created_at datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3)。宿主链路因走裸 SQL 且不列该字段而正常吃到默认值(app/repository/session_repository.py:184 · app/repository/agent_repository.py:73)
性质 同一张表,宿主用裸 SQL(OK)、顾问用 ORM(炸) —— 合并引入的第二套写入姿势不一致
修复方向(待确认) 实体列补 default=lambda: datetime.now(UTC)(或 server_default=text("CURRENT_TIMESTAMP(3)")),或在 kyc_session_repository 显式传 created_at。前者更根治且不影响宿主裸 SQL 链路

D3 · Milvus 集合从未 load(),语义检索永久静默失效(降级 · P2)

v1.1 复核定论:根因维持 v1.0 原判 —— 且本轮由服务端日志直接坐实。

v1.1 开工前曾提出一条相反的假设并写入 plan:app/tool/milvus_template_tool.py:136-137 用的是 pymilvus 高层 MilvusClient,该 API 在 search 时自动 load,不需要显式 load_collection,因此 match_type 恒为 keyword 更可能是「集合根本没灌向量」。该假设经本轮实测被证伪:

证据 内容
服务端日志(决定性) 被测进程 uvicorn 日志中 MilvusException: (code=101, message=Collection 'kb_script_templates' is in state 'released'; call load() before search/get/query) —— 5 次独立异常(18:19:25 / 18:25:08 / 18:28:35 / 18:31:42 / 18:34:20),且全 session 无其它 Milvus 错误类型。⇒ 检索确实卡在 released 状态,高层 client 并未自动 load
⚠️ 口径更正(2026-09-12 晚) 本文初版此处写作「出现 10 次」—— 该数字实为日志行数(5 次异常 × 2 行:RPC-error + traceback),不是异常次数。FE-001 收口时按日志原件重新点数为 6 次(本文覆盖时段内 5 次 + 其 18:55 复现验证 +1)。D3 结论不变。日志原文摘录:../2026-09-12-agent-frontend-e2e/_raw/server-log-evidence.md §2
前端侧同一现象 浏览器 E2E 09-advisor-pages.mjs A3.2:搜「亏损」返回 4 行,match_type 全为 keyword
API 侧同一现象 G4 Milvus 语义检索生效 FAIL:实际仅 ['keyword']
并存的第二层(本轮新增观测) Milvus Lite 数据目录中 kb_script_templates 仅 5.0K / 2 文件,而已灌入的 fin_faq / fin_policy / fin_product 各为 50K / 5 文件 ⇒ 该集合很可能同时是空集。故仅补 load_collection 未必能让语义召回生效,需一并确认向量已灌

结论(订正后):D3 是两层叠加 —— ①集合状态 released 未 load(日志已证);②集合疑似未灌向量(目录体量佐证,未做写入验证)。修 ① 后可消除异常,但是否恢复语义召回取决于 ②。建议修复后以 match_type 出现 semantic/hybrid 作为验收口径,而非仅看异常消失。

字段 内容
缺陷编号 DEF-ADV-2026-09-12-003
严重等级 P2(不报错、不 5xx,但能力增量归零)
现象 GET /api/advisor-agent/script-templates/search 返回 200 但 match_type 恒为 keyword,从不出现 semantic/hybrid
根因 app/tool/milvus_template_tool.py 只调 has_collection(:50)与 create_collection(:72),全文件无 load_collection。集合跨进程后状态为 released,检索即报 MilvusException (code=101) Collection 'kb_script_templates' is in state 'released'; call load() before search/get/query(v1.1 实测日志 5 次独立异常 —— 初版误记为「10 次」,见上表口径更正;FE-001 时点心为 6 次)
第二层因素 集合目录体量 5.0K/2 文件 vs 已灌集合 50K/5 文件 ⇒ 疑似空集,见上方 v1.1 复核
为何静默 该异常被 search_templates 的 except MilvusToolError 吞掉并降级为关键词检索(64c5db7 刻意加的兜底,方向正确),但降级无任何显式标记 —— 日志有异常、HTTP 无异常、响应体无 degraded 字段,调用方无从得知
影响 话术「混合检索」退化为「纯 LIKE 关键词」,同义/近义召回为零。实测 q=市场 仅召回 1 条
修复方向(待确认) ①ensure_template_collection() 或 client 构造后补 load_collection(collection_name);②确认 kb_script_templates 已灌向量(python scripts/sync/sync_template_vectors.py);③在响应或日志显式标记语义层降级

7. 测试执行记录(明细)

分组 覆盖端点 v1.1 结果 v1.0 存档
G1 鉴权与封套(5) POST /api/auth/login · 无 token · Trace 透传 · envelope 5 PASS 5 PASS
G2 合规检测(14) POST /compliance/content-check · GET/POST/PUT/DELETE /compliance/rules 14 PASS 14 PASS
G3 复制门闸(5) POST /copy/track 5 PASS 5 PASS
G4 话术模板(12) GET "" · GET /search · POST/PUT/DELETE · POST /{id}/use 11 PASS / 1 FAIL(D3) 11 PASS / 1 FAIL
G5 市场异动(10) GET /market/fund/{code} · GET/POST /market-alerts · POST /scan · POST /generate · PUT /{id}/feedback 10 PASS / 0 FAIL / 0 SKIP ✅ 3 PASS / 2 FAIL / 5 SKIP
G6 KYC(10) POST /kyc/sessions · GET/POST /sessions/{id}[/chat] · /complete 8 PASS / 2 FAIL(D2) 8 PASS / 2 FAIL
G7 输入防护(3) POST /guard/check 3 PASS 3 PASS
G8 桩路由(2) /dashboard/ping · /allocation/ping 2 PASS(仅桩,无业务实现) 2 PASS
G9 跨线回归(2) POST /api/compliance/suitability-check · POST /api/analyst/chat 2 PASS 2 PASS

7.0 v1.1 G5 由红转绿(D1 修复的实测证据)

用例 v1.0 v1.1
G5 基金行情 → 200 500 ✅ 200 nav=1.0 nav_date=2026-09-07 daily_return=0.0
G5 异动扫描 → 200 500 ✅ 200 scanned=14 created=2 skipped=12 dup=0
G5 异动扫描去重 SKIP(被 D1 阻断) ✅ duplicated=2
G5 异动列表 SKIP ✅ n=2
G5 异动解读 → 四段式 SKIP ✅ used_fallback=False latency=1415
G5 反馈 dismiss SKIP ✅ status=dismissed

7.1 关键边界用例(全部 PASS)

用例 期望 实际
未知账号登录 401 AUTH_401_UNKNOWN_ACTOR ✅ fail-closed
advisor 读/写规则库 403(无 compliance:rule:write) ✅ AUTH_403_PERMISSION
advisor 写话术模板 403(无 template:write) ✅ AUTH_403_PERMISSION
KYC 建会话越权客户 403 40302 ✅ 归属校验前置生效
提示词注入(guard) 400 40002 prompt_injection ✅
提示词注入(KYC 对话) 400 40002 且不落库 ✅ agent_message 计数 0→0
复制门闸 BLOCK 403 40302 ✅
复制门闸 WARN 未确认 400 40002 ✅ 确认后放行
复制门闸 check_id 与 hash 不符 400 40002 ✅
使用未审核模板 400 拒绝 ✅
违禁文案建模板 400 40002 合规前置拦截 ✅
重复完成 KYC 会话 409 40901 ✅

7.2 失败明细

v1.1 失败明细(3 条 · 收敛为 2 个缺陷):

用例 期望 实际 缺陷
G4 Milvus 语义检索生效 match_type 含 semantic/hybrid 仅 ['keyword'](已降级为纯关键词) D3
G6 对话采集推进进度 200 且 parsed_fields 非空 progress_pct>0 500 parsed=None pct=None D2
G6 skip_to 回退节点 200 且 current_node=basic_info 500 node=None D2

v1.0 存档:另有 G5 基金行情 → 200、G5 异动扫描 → 200 两条 500,均随 D1 修复转绿(见 §7.0)。

7.3 跳过明细

用例 阻塞原因
—— v1.1 无 SKIP —— v1.0 的 5 条 SKIP 全部由 D1 阻断所致,D1 修复后已恢复可判定

8. 非缺陷澄清(易误判项)

项 结论
探针文案「保证赚钱,绝对不会亏」判 INFO 而非 BLOCK 非缺陷。种子 50 条规则实际 pattern 为 保本保收益 / 稳赚不赔-2 / 高收益无风险-7 / 内幕消息-5 等,该文案确实不含任何 pattern,判 INFO 正确
规则 pattern 普遍带 -N 测试后缀 非缺陷但需注意。命中要求文案逐字包含 -N 后缀,作为演示语料极易被误判为「规则没生效」
scripts/demo/run_demo_smoke.ps1 已失效(文档/脚本腐化)。仍调用 /api/v1/* + 旧登录形(username/password、断言 code=="00000"),而 /api/v1 在 app/ 中已无任何路由(决策 D1 明确不保留),按当前代码必然 404。合并说明 §5.1 要求改到 canonical 路径,实际未完成
docs/演示文档/功能演示版启动手册.md · 后端接口测试指南.md 同样残留 alembic upgrade head 与 /api/v1 指引,与现状不符
64c5db7 移除 KYC 四端点的 response_model=ApiResponse 行为无回归(实测封套仍为 {code,message,data,trace_id},仅由 _advisor_ok 运行时拼装)。但契约层退化:KYC 成为唯一不在 OpenAPI 里声明响应封套的顾问端点(其余端点仍带 response_model),前端 codegen / 类型生成对 KYC 将拿不到封套类型 —— 有 web/src/pages/advisor/AdvisorKycPage.tsx 消费,建议后续统一(本轮仅记录,未改动)

8.1 D4 · agent_tools.py 七处调用与实现签名不匹配(潜伏 · 不阻断 · 不计入分母)

字段 内容
缺陷编号 DEF-ADV-2026-09-12-004
严重等级 P3 潜伏(当前 0 个 FAIL 用例 —— 无任何 HTTP 路由可达)
v1.1 实测口径 app/service/agent_tools.py 中 kyc_service.* / template_service.* / compliance_service.* 共 7 处调用与实现签名对不上::70 · :113 · :118 · :123 · :128 · :150 · :170(:70 即 D1 同款市场数据调用,随 D1 一并修好)
为何不计入 仅被 app/service/agent_graph.py:158 引用;LangGraph 编排未挂任何 HTTP 端点,故真实 HTTP E2E 触达不到 ⇒ 本轮 0 FAIL,不是「没问题」,是「够不着」
处置 本轮仅记录。接线前必须回归,否则一挂端点即 500

9. 变更清单(本轮)

类型 路径 说明
脚本 scripts/dev/advisor_e2e_smoke.py 新增 · 真实 HTTP 端到端冒烟(63 项 · 可重复 · --only 单组重跑)
文档 docs/memory/tests/2026-09-12-advisor-agent-e2e/ 新增 · 本测试包(README + 本日志)
文档 本文件(v1.1) 改 · 按 merger @ c09b987 复跑结果重写 §3/§5/§6/§7/§11/§12;原文以删除线/存档块保留
业务代码 —— 未改动(v1.0/v1.1 一致,定性均为「先报告,确认后再修」)

9.1 v1.1 本轮相关产出(详见 <2026-09-12-agent-frontend-e2e>)

类型 路径 说明
脚本 scripts/dev/risk_e2e_smoke.py 新增 · 风控 API 真实 HTTP E2E(67 项 · R1–R6)
脚本 C:/Users/Windows/e2e-jinrong/09-advisor-pages.mjs 新增 · 顾问前端四页真实浏览器 E2E(17 项 · 仓库外)
文档 docs/memory/tests/2026-09-12-agent-frontend-e2e/ 新增 · 本轮报告包

记录收敛: 首跑时脚本曾把机器矩阵落到 artifacts/advisor-agent-e2e-report.md,内容已全部并入本日志第 5~8 节,该文件已删除。脚本 --report 同时改为可选项(默认不落盘),避免再次产生旁支记录;复核只需看控制台输出与退出码。


10. 数据准备与重灌结论

数据集 是否需重灌 说明
jinrong_agent 顾问 7 表 否 已迁移,compliance_rule 50 条 + script_template 20 条(全已审核)
jinrong_core(v1.1 基线) 否 33 客户 / 14 产品 · NAV 最新 2026-09-11(v1.0 时为 2026-09-04;03fce88/c09b987 补种后区间已延伸)
脚本副作用 —— 每轮会新增:临时合规规则(软删)、临时模板(软删)、KYC 会话与消息、copy_track_log、compliance_check_log、audit_log 行
Milvus kb_script_templates 未灌(v1.1 佐证) 需 python scripts/sync/sync_template_vectors.py。v1.1 佐证:该集合目录 5.0K / 2 文件,已灌的 fin_faq/fin_policy/fin_product 各 50K / 5 文件。本轮未执行灌入(属写操作,且会掩盖 D3 的待修状态)
未执行的破坏性操作 —— 本轮未运行 prepare_all.ps1 / reset.ps1 / 无 --no-reset 的 verify_convert_seed.py(会 DROP DATABASE jinrong_core);测试数据一律保留取证

11. 结论与剩余风险

字段 结论
需求是否覆盖 顾问线 24 个端点全部触达;未交付能力(KYC Profile、资产配置、看板汇总、导出、LangGraph 编排 F01/F02/F04)不在本轮范围
旧功能是否破坏 未破坏 —— G9 跨线回归:平台适当性 200 · 问数线 200(script_template_service 重命名未伤及问数 template_service)
剩余风险(v1.1) ① D2 未修 ⇒ KYC 采集不可用(前端取证见 <2026-09-12-agent-frontend-e2e> A4.2:页面 INTERNAL_ERROR);② D3 未修 ⇒ 语义检索静默降级,且集合疑似空集,仅补 load() 未必恢复;③ D4 潜伏 ⇒ app/service/agent_tools.py:70,113,118,123,128,150,170 七处签名/方法不匹配,无 HTTP 入口故本轮 0 FAIL,但 agent_graph.py:158 已引用,接线即 500;④ run_demo_smoke.ps1 已失效,演示链路无可用脚本;⑤ 既有 test_sprint* 65 红仍全部把 Core 提供方 fake 掉,无法替代真实端到端信号
建议人工再验 修完 D2/D3 后重跑 python scripts/dev/advisor_e2e_smoke.py,目标 0 FAIL / 0 SKIP(当前 3 FAIL / 0 SKIP)
是否可发布 v1.1 订正:否(D1/D2 未修) —— D1 已修、市场异动线恢复;剩余 D2(KYC 采集)+ D3(语义检索降级) 是否阻断发布,请模块负责人按演示权重判定(两者均不影响鉴权/合规/门闸/模板主线)

12. 修订历史

版本 日期 作者 说明
v1.0 2026-09-12 Andrew 首版 · 63 用例 · 53 PASS / 5 FAIL / 5 SKIP · D1~D3 定性未修(基线 integrate/advisor-agent @ 64c5db7)
v1.1 2026-09-12 Andrew 基线改至 merger @ c09b987 复跑:60 PASS / 3 FAIL / 0 SKIP。 ①§3 被测版本改写并留 v1.0 存档;②D1 关闭(附代码 core_ro.py:839,851 与实测 G5 10/10 双证据),§7 新增 §7.0 转绿明细;③D3 根因经实测坐实并订正:v1.1 开工时的「高层 client 会自动 load」假设被 uvicorn 日志 code=101 … 'released' 证伪,同时新增「集合疑似空集」第二层观测;④§5/§11 结论由「不建议合并」改为「D1 已修,剩余 D2/D3 交模块负责人判定」;⑤D4 潜伏项按实测更新为 7 处
v1.2 2026-09-12 Andrew 计数口径更正(D3 结论不变)。 §6 D3 原记「日志出现 10 次」—— 收口时按日志原件(18:19:25 → 18:55:05 单 session 全文 3,592 行)重新点数,实为 5 次独立异常(10 = 5 异常 × 2 行,把 RPC-error 行 + traceback 行 当成两次了)。D3 根因、证据链、结论均未变,仅计数表述订正。同时:⑥补 pymysql.err.IntegrityError (1048, "Column 'created_at' cannot be null") 逐字报文,D2 根因由「推断」升级为「日志直证」(失败 SQL 明确列出 created_at 列 + 参数 created_at: None);⑦日志摘录入库 ../2026-09-12-agent-frontend-e2e/_raw/server-log-evidence.md,结论可被第三方查阅