Commit Graph
3 Commits
Author SHA1 Message Date
张胜宇 279a6327e3 docs(W27-2): 出口口径统一为「七出口 + L0」· D2.5 新增行情/闲聊实测台词 · 金标计数对齐 55 条
本轮只改文档(12 份,无代码改动),把 `W27` 的代码实绩(`L0` 表层判定层 + 出口 `E6` 行情)在**全部交付面文档**上对齐。
此前工程侧已入库(3e24033),但答辩面文档仍留「五出口 / 六出口」旧口径,是最容易被评委当场戳到的自相矛盾点。

## 一、口径统一:五出口 → 七出口 + `L0`
- `D3.6`(被多处引为「五出口权威定义」):加**口径更新横幅**(列明 `W20` 六出口、`W27` 七出口 + `L0` 的演进线,
  并写明「不变的」——转人工仍只是 `E5c`、白名单仍 4 类、`INV-1`~`INV-5` 一条没改);§3 标题加「起步定义」;
  **新增 §3.0**说明 §3.1—§3.4 的适用范围;本页 `D3.7` 配套行的金标计数 46→55、10→11 项指标。
- `D1.1`:7 处索引/清单行对齐(`D2.6` / `D2.10` / `D3.6` 的描述与计数),其余「五出口」全部保留为**历史记录**。
- `D2.6`:配套行补 `D3.9` 指向;**新增 `W27` 状态更新段**(金标扩容到 55 条 + 第七个出口 + 三处真缺陷修复),
  并显式声明「上一条 `W24` 的『六个出口』口径已由本条扩为七个」。
- `D3.7`:性质行/读法/§0 计数对齐(46 → 55、十项 → 十一项指标);**§4 增补 `W27` 扩容后的分母口径表**
  (`M-1`/`M-4`/`M-5`/`M-6`/`M-10` = 55、`M-2` = 33、`M-2b` = 20、`M-3` 明示「考检索的 C 组」,门槛不变)。
- `D2.9`:引用表新增 `D3.9` 行;判分输入件由 `cases_46.json` 更新为 **`cases_55.json`**(附两个分母的产物名)。
- `D2.8`:`W27` 判定补充行(前批已入库,本轮核对通过)。

## 二、HTML 规格文档:只声明口径,不重写历史
`D3.1`(需求开发文档)/ `D3.2`(知识库方案)/ `D2.2`(需求收敛版)/ `D2.4`(知识库收敛版)
四处 `§0.1` 之前各加一段 `callout-warn` 口径更新:说明「五出口」是 v1.x/v2.x 时点的**起步定义**、
现行是「七出口 + `L0`」,并明确**语义与安全结论全部有效、只是不再是全集**,指向 `D3.9` 与 `D2.6` §3。
(`_build` 已标注「已过期·请勿重新生成」,故直接在成品上改,不重跑生成器。)

## 三、`D2.10`(端到端答辩文档)
`六出口` → **七出口 + `L0`**(徽标 / meta / Mermaid / S8 表 / 时间分配 / 文档关系表,共 5 处);
§3.8 出口表**新增 `E6` 行情行**,正文补 `L0` 段落;§4.1 阈值表后**新增口径更新块**
(区间重叠 ⇒ 单点阈值不存在;阈值降为安全下限;「跨集合回退 0.65」在代码中不存在);
§6.1 标题与「两个分母都报」的实测块对齐 55 条;§11 补 `D3.9` 与 `W27` 证据文件。

## 四、`D2.5` 演示脚本(答辩当天照着念的那份)
**新增 §4.8「行情走势与闲聊」**——针对上轮被点名的两类,全部用 **2026-09-21 真 HTTP 实跑**的答复:
- `159382这只ETF最近走势怎么样?` → `E6`,给出近 5/20/60/120 个净值日涨跌 + 区间高低 + 数据区间;
- `南方稳健增利债券A最近走势怎么样?` → `E6-miss`,如实说「查不到公开的净值序列」,**拒绝编造**;
- `你好呀` / `谢谢你` / `在吗` → 闲聊,**零检索**;
- **反向守卫**「在吗,想问下南方稳健增利债券A的起投金额是多少?」→ 必须走知识作答(证明 `L0` 判的是整句);
- 附「口径细节」:`E6` **不调模型**(固定模板 + 纯函数,数字全部来自 `fin_nav_history`),
  闲聊**调模型但完全不查库**(新跑 `_w27_probe_guard.py` 单独验证反向守卫,另有 `_w27_probe_trend/chat.txt`)。
§6 表补两行(闲聊不再进检索 / 走势是算出来的),金标计数行改为 55 条并附两个分母的指标表。

## 五、验证
- `_sync_check.py`:权威目录 → 仓库镜像 **0 缺失 / 0 不一致**(13 份同步)。
- `git diff --name-only`:12 份变更**全部是 `.md` / `.html`**,**无任何代码改动** ⇒ 不影响已绿的
  `pytest 2094 passed / 3 skipped`(3e24033 已复跑)。
- 本轮实测证据保留在 `D:\桌面\金融\_w27_probe_guard.py` / `.txt`(答辩后勿删)。
2026-09-21 22:43:46 +08:00
张胜宇 3e24033f72 feat(W27): L0 表层判定层 + 出口 E6 行情 + 收益过滤槽位白名单 + 免责声明分档(设计与代码同轮完成)
设计与依据:新增 D3.9-客服Agent智能路由与行情出口设计-2026-09-21.md(CS-ARCH-2026-024)
DEC-W27-1~12 全部批准并落地。

## 新增(3 个源文件 + 3 个测试文件)
- app/core/exit_codes.py:出口码注册表(E0/E1/E2a~E2e/E3/E4/E5a~E5c/E6/E8/CHAT/LOGIN/CONTACT)
  + NON_BUSINESS_EXIT_CODES 白名单(免责分档的判据面)
- app/service/fund_trend_service.py(E6):summarize_trend() 纯函数 + query_fund_trend 工具
  读 fin_nav_history;按净值日个数(5/20/60/120)给区间涨跌 / 区间高低 / 来源与区间
- tests/unit/{service,tools} 新增 45 条守卫单测(E6 出口 / L0 表层判定 / 工具配置)

## 改动(重点)
- customer_service.py:
  · _route_surface()(L0-a 闲聊 / L0-b 行情 / L0-e 无信息量),位置在安全路由之后
  · drop_yield_claims() 重写为「入口闸 × 槽位白名单」+ fail-closed
    (旧黑名单会误删权重:A-06 业绩基准公式整行消失)
  · allowed_tools 补 query_fund_trend —— 修掉发布被拒 422「配置超出 Agent 工具上限」
    (该 422 是**子集**校验而非数量上限,根因即此项漏配)
  · 25 处 CoreResult 全部补 exit_code(AST 守卫保证零遗漏)
- customer_service_rules.py:闲聊判定重写(业务实体边界 + 词表 + 特征串 + 语气词)
  + is_low_information_message() + is_contact_inquiry()
- governance.py:免责声明按 exit_code 分档(业务档完整 / 非业务档轻型)
- actor.py:VISITOR_PERMISSIONS 补 fund:quote:read(E6 对访客开放,DEC-W27-11)
- tools/:seed_compliance_baseline 新增 TPL_DISCLAIMER_LIGHT;publish 工具改为
  「从生效版本派生原列表再追加」(_inherit_tools 取不到返回 None,防静默改窄)

## 实测
- 金标扩容 46 → 55(新增 Q 组行情 5 条 + C 组闲聊 4 条)
- M-1 55/55、M-4 55/55;M-5 与四项零容忍(M-7/M-8/M-9/M-10)全 0
- 原 46 条可比基线逐项不变(46/46);M-6 9.1%(5 条全在转人工白名单内)
- 全量 pytest 2094 passed / 3 skipped;ruff 零新增(余 5 条与 HEAD 逐条对应)
- 配置版本 244(cs-tools-75813de45421)已发布并激活

## 文档
- 新增 D3.9(设计专册);D1.1 §34 补「代码实施已同轮完成」并把旧表述作废
- D3.7:新增 Q 组判据表 + §6.4 第四次实测 + M-3/M-9 口径澄清
- D2.9:新增 §2.11(9 条新增用例的实测答复原文)+ 汇总表改双列口径
- D2.1:新增 v6.41 执行条目
- 权威副本(D:\桌面\金融\)→ 仓库镜像 全量比对一致(0 缺失 / 0 不一致)

## 诚实未做项
- 知识出口(E3/E4)侧的实体锚点闸门未做(故金标扩容 9 条而非 12 条,A-11~A-13 未成集)
- 阈值未重标(D3.9 §3.4 只给方法);M-3 分母未改(仅明示口径);
  D1.1 §0 与 §4.0 历史计数偏移(差 1)仍沿用
2026-09-21 22:32:39 +08:00
张胜宇 bc61d5c579 docs: 入库权威文档目录(客服agent/ 24 份 + 开发文档/ 50 份,替换旧命名的过期副本)
## 为什么做这一步

权威文档 74 份此前**只在本机**,评审者 clone 分支后看不到任何设计文档;而仓库里那两份同名目录
是 **2026-09-16 之前的过期副本,连文件名都是旧的**(无体系编号)。本次按「**权威覆盖过期**」入库。

## 入库内容

| 目录 | 文件数 | 体积 | 说明 |
|---|---|---|---|
| `客服agent/` | 24 | 0.77 MB | `D2.1`~`D2.6` 对外交付四件套 + 演示脚本/答辩报告 + `_build` 构建工具 |
| `开发文档/` | 50 | 2.16 MB | `D1.x` 索引与决策、`D3.x` 方案、`D4.x` 清除与重构留痕、`D5.x` 业务流程、`D6.x` 业务事实基座、`D7.x` 交付物、`D8.x` 规范 |

**旧的过期副本整体移除**(`客服Agent执行Todolist.md` → `D2.1-客服Agent执行Todolist.md` 之类
的改名 + 新增 `D2.5`/`D2.6`),入库后目录内容与权威副本**逐文件一致(零差异,已复核)**。

## 入库前的安全扫描(必须留痕)

- 扫描规则:`sk-` 类密钥 / `Bearer` 长串 / `password=`、`api_key=` 赋值 / 会话中出现过的两把明文 key 片段。
- 结论:**真实密钥只出现在 `.env`**(已被 `.gitignore` 命中,未入库);`.env.example` 与
  `config/risk.env.example` 只有**空占位**。
- 文档内唯一命中是 `D3.1` 里一处**截断的示例 JWT**(`Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...`),
  末尾带省略号,是接口文档的示意值,**不是可用凭据**。
2026-09-20 15:03:15 +08:00