From 4c37ff0cb1e7e2a89bd2aade29b35b8ef73fe69a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B5=85=E5=BF=B5?= Date: Thu, 8 Oct 2026 15:10:59 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20spec=E5=A4=8D=E5=AE=A1=E7=BB=88?= =?UTF-8?q?=E4=BF=AE=E2=80=94=E2=80=94=E7=8A=B6=E6=80=81=E6=9C=BA=E2=91=A1?= =?UTF-8?q?=E8=BD=AE=E7=9F=9B=E7=9B=BE/=E8=B5=84=E4=BA=A7=E8=A1=A8?= =?UTF-8?q?=E5=90=8C=E6=AD=A5/=E6=A0=87=E6=B3=A8=E5=87=BA=E7=AB=99?= =?UTF-8?q?=E6=B4=BE=E7=94=9F=E9=9B=B6=E6=B3=84=E6=BC=8F/=E6=9B=B4?= =?UTF-8?q?=E6=AD=A3=E8=A7=A6=E5=8F=91=E8=90=BD=E7=AC=94/=E6=8E=A8?= =?UTF-8?q?=E9=80=81v1=E4=B8=8D=E5=81=9Acorrection/=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E8=A1=A5=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Code --- ...2026-10-08-cc-ip-country-confirm-design.md | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/docs/superpowers/specs/2026-10-08-cc-ip-country-confirm-design.md b/docs/superpowers/specs/2026-10-08-cc-ip-country-confirm-design.md index cf95579..ec097cc 100644 --- a/docs/superpowers/specs/2026-10-08-cc-ip-country-confirm-design.md +++ b/docs/superpowers/specs/2026-10-08-cc-ip-country-confirm-design.md @@ -20,8 +20,8 @@ | 能力 | 现状 | 结论 | |---|---|---| | WS 路由真实 IP | chat.py:24-27 已处理 X-Forwarded-For 第一段 | ✅ 复用 | -| REST 路由真实 IP | chat_rest.py:107 仅 request.client.host(反代下=127.0.0.1) | ⚠️ 前置补 XFF(一行) | -| IP→国家 | ip_service.resolve_country(iptocc,返回中文/ISO) | ✅ 复用(内部用 ISO code) | +| REST 路由真实 IP | /session 的 client_info 来自请求体(自报);:107 仅喂限流 | ⚠️ /session 注入 Request 合并 XFF(§4.5) | +| IP→国家 | ip_service.resolve_country(中文/ISO 混合,另有 AU 重复键 bug) | ⚠️ 新增 resolve_iso 直返 ISO + 修 bug(§4.5) | | 国家→电话前缀 | 无 | ❌ 新建映射表 | | CC 强制墙骨架 | conversation.py cc_wall 缓冲/替换/Important-2 closing | ✅ 复用(换文案) | | 出站管道 | email_service + lead_push._build_payload | ✅ 挂补全点 | @@ -35,7 +35,7 @@ │ → [_cc_conf] ②号码确认轮:"…reach you at {补全号} — is that right?" │ (墙白名单放行该精确号码;确认句墙保证必出) │ ├─ Yes → [终态 _cc_done] 客户亲口确认 - │ └─ No / 无法判定(一次重试后仍无)→ 请给完整号一次[_cc_asked_full] + │ └─ No / 无法判定(②仅此一次,不重试)→ 请给完整号一次[_cc_asked_full] │ → 给了(带前缀)→ [终态 _cc_done,用客户号无标注] ├─ No(猜错)→ 请给带码完整号一次[_cc_asked_full] → 得到则 [终态 _cc_done] └─ 无法判定 → ①重试一次 → 仍无 → 请完整号一次 → 仍无 → [超限终态 _cc_done] @@ -100,12 +100,17 @@ No 后不再重复②,直接进"请完整号一次";"请完整号"全会话 +标注的更正(信息升级)。 - **邮件**:更正邮件渲染 `_cc_full` 补全号 + 标注(`+966501234567(原号 - 0501234567,据 IP+客户确认为沙特,已补国家码)`) + 0501234567,据 IP+客户确认为沙特,已补国家码)`)——**标注由 `_cc_full`+ + 当前裸号在出站渲染时派生,不落 raw_info 正常键**(正常键会进三处 LLM 输入 + 路径被 GLM 当客户信息看见——泄漏前科教训,钉死为零泄漏面) +- **更正邮件触发机制(复审落笔说明)**:现有 correction 触发条件是 canon 变化 + (Yes→Yes 路径 canon 不变、永不自然触发)——实现必须以"本轮 `_cc_done` 与 + `_cc_full` **同时新出现**"为强制触发事件独立插入;额度耗尽 + (correction_count≥3)时跳过;`ev.contact_info` 快照同步更新为补全号 - **推送(UniService,当前关闭)**:contact.phone/whatsapp 给**干净补全号** - (E.164,无标注——对端契约要求"带国际区号且有效",中文标注串会被整条拒收, - 见 docs/AI_INQUIRY_PUSH_API.md);标注写 profile 的正常键(如 - `号码补全说明`,随画像进 CRM);推送时机=确认完结后的下一轮自然触发(或 - correction 推送,与邮件对齐,v1 只做自然轮) + (E.164,无标注——对端契约要求"带国际区号且有效",中文标注串会被整条拒收); + **v1 明确不做** correction 推送(邮件主通道已完整;推送启用后靠自然轮/ + 届时再补) - ⚠️ 消费顺序:`_build_payload` 先读 raw_info 生成补全 contact → 再过滤 `_` 键 - DB 不改客户原文;聊天里仅②确认轮展示补全号(白名单放行) @@ -135,6 +140,9 @@ bug:`"AU": "加拿大"` 重复键吞掉了加拿大(应为 CA),并新增 4. 墙测试:白名单精确放行(同号放/异号拦/无参数照拦);确认句替换 5. 出站测试:邮件/push 的补全与标注;`_` 键过滤与消费顺序 6. 真实 LLM 验收:全流程三路径 + 误判对照(长消息含 Yes 不触发) +7. (复审补项)存量 `_cc_asked` 等价终态不重复问;旁路转移(流中给完整号→ + ①②全退);更正邮件补发时机(_cc_done+_cc_full 新出现触发)与额度耗尽 + 跳过;推送 contact 为纯 E.164 断言 ## 7. 风险