Files
ai-kefu-jc/docs/superpowers/specs/2026-10-08-cc-enforcement-wall-design.md
T
浅念 99f51e7703 fix: 墙层审查修复——10位号穿透/CC轮回显closing用CC句/breach号码观测/拼接分隔
审查(With fixes)四项:

- Important-1: LONG_NUMBER_RE {9,17}→{8,17}——旧量词最小匹配 11 字符,
  纯 10 位号(沙特裸号 0501234567,CC 模板范例市场本体)穿透。实测钉死
  行为边界: 逗号不在字符类,"50,000,000" 千分位形态仍放行(与
  "45,000 km" 同机制,审查预估会命中系漏算逗号);空格分隔 ≥10 位命中;
  DN110/5000m/VIN 规格形态全放行
- Important-2: CC 触发轮回显被零号码墙拦下时(violation==no_contact),
  closing 改用 CC 模板句而非 NO_CONTACT_ALREADY——GLM 有 3/3 回显倾向,
  客户该收到追问而非"稍后联系"虚假承诺;价格墙路径不变。设计文档 §2
  补记该裁决
- Minor-4: breach_rate.py 补号码回显(≥10位,与墙同形)与邮箱回显两条
  观测模式,补上漏放观测盲区
- Minor-5: violated 收尾与已流出前缀之间补空格分隔("...xxxx? Got it —"),
  空格随 closing 一起流出,客户所见与落库一致;CC/触发轮缓冲未流出,
  emitted 恒空天然不受影响

测试 256 passed(253+3)。

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-08 13:59:41 +08:00

70 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 设计增补:CC 追问输出侧强制 + 回显豁免收窄(墙层)
- 日期:2026-10-08(场景①三轮提示词迭代 0/8 后的需求方决策)
- 前置:2026-10-08-dual-contact-and-country-code-design.md(本增补修改其实现层)
## 1. 背景与决策
场景①(裸号→国家代码追问)经三轮提示词层修复(共改 system.md 5 处 + reminder 3 处
+ 让位唯一锚点 + 禁数字回显),真实 GLM 验收核心断言累计 **0/8**。行为分析结论:
GLM 对**顺对话惯性**的指令全部服从、对**反惯性**的 CC 重发追问结构性无视——
这是层级问题不是措辞问题。
**决策(需求方已确认)**:沿用本项目"prompt 教行为,墙保底线"的既有 doctrine
(价格墙同款演进路径),把 CC 追问升级为输出侧确定性强制;同步收窄零号码墙的
客户回显豁免(该豁免与"不回显"红线矛盾,GLM 稳定利用它回显号码 3/3)。
## 2. 规则一:CC 强制墙
- **触发**:本轮 `_contact_completion_note` 返回 `["_cc_asked"]`(裸号在场且未问过)
——conversation.py 流程已有该判定(completion_marks)
- **检测**:本轮完整 AI 回复不含 `country code`(大小写不敏感)——含则视为
GLM 已自发服从,不干预
- **动作**:不含 → 整段替换为 CC 模板句(英文正文 "Got it — Could you send the
full number with the country code, like +966 5x xxx xxxx? Just so our manager
can reach you directly.",中文同 `_CC_NOTE_ZH` 正文),走既有 violated 替换
机制(logger.warning 留痕)
- **回显冲突裁决(2026-10-08 审查修复补记)**:触发轮若零号码墙先拦下回显句
(violation=="no_contact"),替换句改用 CC 模板句而非 NO_CONTACT_ALREADY——
GLM 有 3/3 回显倾向,该路径概率高,客户该收到追问而非"稍后联系"虚假承诺;
价格墙路径(violation=="boundary")维持原替换话术不变
- **计数**:`_cc_asked` 照常写回(一次性语义不变——无论 GLM 是否服从,本轮消耗)
- 客户配合重发完整号后:下轮号码带前缀 → CC 墙/note 均不再触发,确认句自然回归
- 客户不理睬:下轮 `_cc_asked` 已消耗 → 墙不再触发(一次性)
## 3. 规则二:回显豁免收窄(零号码墙)
- **现状**:`no_contact_value` 对 AI 输出中的 ≥10 位数字串/邮箱,若出现在近期
客户消息中则豁免("礼貌回显"设计)
- **决策变更**:**移除 AI 输出侧的回显豁免**——红线早已规定"客户自己的号码/
邮箱也不回显(确认收到即可)",豁免与红线矛盾且被 GLM 稳定利用;AI 输出中
的客户号码只可能来自回显(它不掌握其他号码),拦截无误杀面(规格数字
DN110/5000m 等不构成 ≥10 位连续数字)
- **实现**:`no_contact_value` 的 `user_history` 豁免参数停用(保留签名兼容或
移除参数+清理调用点,以最小改动为准);替换句走 NO_CONTACT_* 既有分支
- **测试影响**:既有回显豁免测试(含阿语回显一致性)按新语义更新为"AI 输出
客户号码一律拦"
## 4. 不变项
- 提示词层全部保留(三层话术/提醒/禁令——墙只是兜底,GLM 自发服从时零干预)
- 串行优先级/一次性计数/推送过滤/墙渠道精确化均不变
- 价格墙/零号码墙其余行为不变
## 5. 测试策略
1. CC 墙单测:触发轮回复不含 "country code" → 替换为模板句;含 → 原样;
非触发轮(带前缀号/_cc_asked 已耗/双渠道齐)→ 不干预
2. 回显收窄单测:AI 输出含客户裸号/完整号/邮箱(无论客户消息是否有)→ 拦截;
规格数字形态 → 放行
3. 集成:CC 触发轮 + FakeAI 输出纯确认句 → 最终流出为 CC 模板句且 `_cc_asked` 落库
4. 第四轮生产验收:场景①三断言(CC 句必出/零数字回显/一次性)+ 场景②③复验不回归
## 6. 风险
| 风险 | 等级 | 缓解 |
|---|---|---|
| CC 替换句与客户上下文衔接生硬 | 低 | 模板句自带 "Got it —" 开头;观察期收集反馈 |
| 回显收窄误杀合法场景 | 低 | AI 输出无其他号码来源;规格数字形态已验证安全 |
| 邮箱回显也被拦后确认句变短 | 低 | 符合红线设计(确认收到即可) |