一、客服 Agent 智能增强(正面回应"不智能、动不动就转人工")
- 决策链由 2 个出口扩到 5 个:E1 澄清 / E2 计算型 / E3 知识直返 / E4 证据约束生成 / E5 分级回退
- 转人工从"默认动作"降为最后一档 E5c,只保留 4 类白名单:
P0 反诈 / P1 账户与个人数据 / P2 写操作与争议 / 用户明确要求人工
- 46 条金标实测(修复前 → 修复后):
转人工率 43.5% → 10.9%;出口准确率 45.7% → 100%;事实正确率 69.6% → 100%
禁忌违反 1 → 0;档位越权 / 无出处数字 / 误拒 四项零容忍全 0
- 安全不变量 INV-1~INV-5;零容忍规则未删,改的是挂载点
(输出侧字面黑名单 → 检索层档位隔离 + 判定层合规词表 + 输出守护)
二、知识库:档位单点化与物理隔离
- 新增 app/core/knowledge_tier.py 作为档位规则唯一落点(G-03),
knowledge_contracts.py 原定义块改为显式再导出(X as X,非副本)
- 档位过滤由 bool 默认值(fail-open)改为 tiers 必填集合(缺参即 TypeError)
- Milvus 侧四集合按 visibility 分区键物理隔离;双 schema 收敛为一套
- 新增 app/core/actor.py:访客三元组与匿名判定的唯一构造/判定点(G-01/G-01b)
- 新增 app/core/fund_fee_rules.py:费率计算纯函数
三、前端入参边界对齐(本轮 W11 新修,4 处"校验宽于存储")
- message 加 max_length=8000(与浮窗 widget.js 的 maxlength 一致)
- session_id 加 1—64;idempotency_key 上限 128 → 64(对齐列宽 String(64))
- feedback_type 加 max_length=32(对齐列宽 String(32))
- 8 条路径参数补 min_length=1 + max_length=64 + 字符集正则
({session_id} / {run_id} / {handover_id})
- 改前超限值会落到 MySQL 才失败(500);改后一律 422 AGENT_INPUT_INVALID + 字段级定位
- 新增 tests/unit/api/test_frontend_boundaries.py(33 例),含"端点表 ↔ OpenAPI 全量对照"
四、投顾模块整体清除(D4.4 / D4.5)
- 删除投顾相关 controller / schema / model / repository / service 及门户页面
- tools/portal_api_check.py 同步作废 AD003/AD005/AD011/A047 四条用例与 advisor_t 登录
(端点与账号均已不存在,此前稳定报 3 条假红)
五、验证(提交前实测)
- pytest -q:1856 passed / 2 skipped / 0 failed
- ruff check app tools tests:19(= 基线);mypy app:2(= 基线)
- 前端接口契约体检 portal_api_check.py:38 项,通过 34,失败 0,跳过 4
- 全链路冒烟 e2e_smoke_test.py --read-only:31/31
- HTTP 全链路探针 http_probe.py:11/11 succeeded
- 跨文档一致性 _consistency.py:GATE PASS
- 真机边界复验 12 条:12/12 符合预期
六、纪律与文档
- 可改文件白名单 A-09(docs/46)与底座会签申请单 A-10(docs/47,组 1—组 4 全部受理)
- 零 DDL:未新增/修改任何表结构,89 张业务表与基线一致
- 证据留痕:docs/evidence/**(含 46 条金标 score、快照、清除与重建记录)
- 未提交(刻意排除,见提交说明):仓库内 客服agent/ 与 开发文档/ 是 2026-09-16 前的
过期副本(Todolist 440 行 vs 权威 D2.1 1167 行),权威正本在仓库外;
_chunks_report.txt 是 tools/build_knowledge_chunks.py 生成的本地产物
167 lines
7.5 KiB
JSON
167 lines
7.5 KiB
JSON
{
|
||
"evidence_id": "20260919-t2n-consistency-judgment",
|
||
"step": "乙-30(a) 收尾:一致性工具首轮判读 + 作门禁 + 从 _build 移出留痕",
|
||
"artifacts_outside_repo": {
|
||
"tool": "D:\\桌面\\金融\\_consistency.py",
|
||
"output": "D:\\桌面\\金融\\_consistency.txt"
|
||
},
|
||
"tool_relocation": {
|
||
"from": "客服agent/_build/_consistency.py",
|
||
"to": "_consistency.py",
|
||
"reason": "_build/ 已被 D1.1 §13 第九轮宣布「勿重跑」,脚本留在那里会被连带误执行",
|
||
"build_dir_kept": true,
|
||
"build_dir_kept_reason": "客服agent/_build/README-已过期-请勿重新生成.txt(2011 字节)已在 D1.1 §13 登记留痕;删除会丢留痕 ⇒ 修正早前「删 _build」建议,改为保留(本轮如实登记该建议修正)"
|
||
},
|
||
"judgment": {
|
||
"real_residue_fixed": [
|
||
{
|
||
"site": "客服agent/D2.1-客服Agent执行Todolist.md:569",
|
||
"issue": "D-03 仍写成 over-fetch 在办任务,与 D2.2 FR-CS-033(v2.5 取消 over-fetch)冲突",
|
||
"fix": "改为「分区裁剪取回口径 + 『过滤后为空』独立指标(v2.5 取消 over-fetch;隔离机制并入 H-05)」"
|
||
},
|
||
{
|
||
"site": "客服agent/D2.1-客服Agent执行Todolist.md:682",
|
||
"issue": "S-6 理由(必须 over-fetch)已失效",
|
||
"fix": "保留「D-01/D-02/D-03 同批」串行约束并显式标注 v2.5 口径修正"
|
||
},
|
||
{
|
||
"site": "客服agent/D2.3-客服Agent开发计划.html:557",
|
||
"issue": "批次 D 依赖链仍写 D-03 over-fetch",
|
||
"fix": "改为 D-03 取回口径 +「过滤后为空」独立指标(v2.5 取消 over-fetch)"
|
||
},
|
||
{
|
||
"site": "客服agent/D2.3-客服Agent开发计划.html:692",
|
||
"issue": "S-6 同 D2.1",
|
||
"fix": "同 D2.1 的 HTML 版"
|
||
},
|
||
{
|
||
"site": "客服agent/D2.4-客服Agent知识库设计方案.html:475",
|
||
"issue": "§0.3 术语表把 over-fetch 当现行术语(同表 visibility / tiers 均为现行)",
|
||
"fix": "补「❌ v1.3 起取消——改由集合内分区裁剪结构性保证(见 §7.2.1)」"
|
||
}
|
||
],
|
||
"judged_not_residue": [
|
||
{
|
||
"term": "actor.py / knowledge_tier.py",
|
||
"verdict": "非残留——工具标签贴错",
|
||
"evidence": "仓库 app/core/ 下两者均不存在;它们是 D2.1 G-01 / G-03 两条 [ ] 待办任务声明要「新增」的文件"
|
||
},
|
||
{
|
||
"term": "subject_type",
|
||
"verdict": "非残留",
|
||
"evidence": "仓库源码 subject_type 0 命中 / visibility 48 命中;D2.4 §0.3 明示权限模型是「subject_type(主体,运行时推导)+ visibility(档位,入库标注)」两轴 ⇒ 不是旧字段名。登记为『术语—代码落差』观察项"
|
||
},
|
||
{
|
||
"term": "low_score_repeat / 「连续 2 轮兜底」",
|
||
"verdict": "非残留(正常留痕)",
|
||
"evidence": "全部命中位于「已删除 / 零残留取证 / 白名单收口」语境(D1.6 §4.21)"
|
||
},
|
||
{
|
||
"term": "投顾",
|
||
"verdict": "非残留(正常留痕)",
|
||
"evidence": "D2.2 命中 11 行全部为「已于 2026-09-17 整体清除 / 底座保留性确认 / 风险表」语境;D2.3、D2.1 同型。工具 §三 的『疑似仍在依赖』是关键词启发式,首轮判读真残留 0"
|
||
}
|
||
],
|
||
"real_residue_count": 5,
|
||
"judged_not_residue_count": 4
|
||
},
|
||
"eol_evidence": {
|
||
"客服agent/D2.1-客服Agent执行Todolist.md": {
|
||
"before": {
|
||
"crlf": 0,
|
||
"lf": 860
|
||
},
|
||
"after": {
|
||
"crlf": 0,
|
||
"lf": 860
|
||
},
|
||
"bytes": 125813
|
||
},
|
||
"客服agent/D2.3-客服Agent开发计划.html": {
|
||
"before": {
|
||
"crlf": 893,
|
||
"lf": 0
|
||
},
|
||
"after": {
|
||
"crlf": 893,
|
||
"lf": 0
|
||
},
|
||
"bytes": 67874
|
||
},
|
||
"客服agent/D2.4-客服Agent知识库设计方案.html": {
|
||
"before": {
|
||
"crlf": 0,
|
||
"lf": 1758
|
||
},
|
||
"after": {
|
||
"crlf": 0,
|
||
"lf": 1758
|
||
},
|
||
"bytes": 148020
|
||
}
|
||
},
|
||
"gate": {
|
||
"kind": "退出码门禁(0 = 通过,1 = 拦截)",
|
||
"positive": {
|
||
"returncode": 0,
|
||
"verdict_lines": [
|
||
" ✅ 通过:14 条关键事实无遗漏 / 需求编号事实在位 / 失效锚点 0 / 交叉引用全齐 / 四文件齐备"
|
||
],
|
||
"rerun_after_trace_writeback": true
|
||
},
|
||
"negative_test": {
|
||
"mutation": "需求 去 FR-CS-052 / 计划 插假 TOC 锚点 #bogus-anchor-xyz / 知识库 去交叉引用『客服Agent需求文档』",
|
||
"returncode": 1,
|
||
"caught_items": [
|
||
"· actor.py / knowledge_tier.py 是 G-01 / G-03 的**待新增文件**(在办任务产物),命中即正常",
|
||
"· subject_type 是「会话主体」轴的设计术语(`D2.4` §0.3 明示与 visibility 不同轴);代码零命中属设计期概念",
|
||
"· over-fetch / low_score_repeat / 「连续 2 轮兜底」是真作废概念,必须逐条看语境",
|
||
"· 首轮真残留:`D-03 over-fetch` 在办任务链(`D2.1` 2 处 + `D2.3` 2 处)——已修",
|
||
"· [需求] over-fetch(v2.5 取消,改分区裁剪) —— 6 处",
|
||
"· [计划] over-fetch(v2.5 取消,改分区裁剪) —— 4 处",
|
||
"· [Todo] over-fetch(v2.5 取消,改分区裁剪) —— 6 处",
|
||
"· [知识库] over-fetch(v2.5 取消,改分区裁剪) —— 18 处",
|
||
"· [需求] subject_type(会话主体轴概念名,与 visibility 不同轴) —— 12 处",
|
||
"· [知识库] subject_type(会话主体轴概念名,与 visibility 不同轴) —— 11 处",
|
||
"· [需求] actor.py(G-01 待新增文件,非旧文件名) —— 5 处",
|
||
"· [计划] actor.py(G-01 待新增文件,非旧文件名) —— 2 处",
|
||
"· [Todo] actor.py(G-01 待新增文件,非旧文件名) —— 3 处",
|
||
"· [需求] knowledge_tier.py(G-03 待新增文件,非旧文件名) —— 1 处",
|
||
"· [计划] knowledge_tier.py(G-03 待新增文件,非旧文件名) —— 3 处",
|
||
"· [Todo] knowledge_tier.py(G-03 待新增文件,非旧文件名) —— 2 处",
|
||
"· [知识库] knowledge_tier.py(G-03 待新增文件,非旧文件名) —— 2 处",
|
||
"· [需求] low_score_repeat(v2.5 删除) —— 1 处",
|
||
"· [Todo] low_score_repeat(v2.5 删除) —— 3 处",
|
||
"· [需求] 连续 2 轮兜底(v2.5 删除) —— 2 处",
|
||
"· [计划] 连续 2 轮兜底(v2.5 删除) —— 1 处",
|
||
"· [Todo] 连续 2 轮兜底(v2.5 删除) —— 5 处",
|
||
"· 关键事实全文档缺失:FR-CS-052",
|
||
"· 需求文档缺失编号事实:FR-CS-052",
|
||
"· 失效锚点:计划 #bogus-anchor-xyz",
|
||
"· 交叉引用缺失:知识库 → 客服Agent需求文档"
|
||
],
|
||
"verdict": "三类问题全部被拦 ✅"
|
||
},
|
||
"non_gating_sections": [
|
||
"§二-b 已作废概念(只报数)",
|
||
"§三 投顾残留(只报数)"
|
||
]
|
||
},
|
||
"tool_state": {
|
||
"_consistency.py": {
|
||
"bytes": 7824,
|
||
"sha256_16": "c918621444e9406e",
|
||
"eol": "LF(本轮把 1 处 CRLF 统一为 LF)"
|
||
},
|
||
"_consistency.txt": {
|
||
"bytes": 15789
|
||
}
|
||
},
|
||
"temp_scripts_remaining": 2,
|
||
"post_gate_writeback": {
|
||
"note": "门禁跑通后,又向 D1.6 写 §4.22、向 D2.1 写 v6.9(D2.1 是门禁对象之一)⇒ 重跑门禁复核并回填本字段",
|
||
"d21_bytes": 128452,
|
||
"d16_bytes": 165195
|
||
}
|
||
}
|