feat: 词表数据化——AST 提取脚本 + wall.json + 编译器 + boundary/conversation 数据源切换(等价回归全绿)

- scripts/extract_config.py: AST 解析两老项目源码取常量(不 import 源模块),
  生成 seed_profiles/<slug>/{wall.json, brand_values.json, prompts/};幂等可重跑
- app/engine/wall_schema.py: compile_wall(json)→CompiledWall,坏结构/坏 regex
  编译期显性失败(WallConfigError 含字段路径)
- boundary_filter/conversation: 墙词表/话术数据源切换为 DEFAULT_WALL
  (jiancai 出厂 seed),函数逻辑不动、常量名保留为 wall 视图(既有测试零修改);
  wall 数据化新增 pivots/pivots_contact/zero_number/reask_patterns 字段
- 脆锚点迁移: test_inline_prohibitions 断言对象从 conversation.py 源码改为
  wall.json 数据文件,语义等价(唯一允许的测试修改)
- 回归: 322 既有全绿 + 10 新增 wall_schema 测试 = 332;提取脚本两遍无 diff

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
浅念
2026-10-12 17:31:57 +08:00
parent 8a16a2959b
commit bc903a273e
19 changed files with 2132 additions and 310 deletions
+14 -6
View File
@@ -1,5 +1,7 @@
"""批次1 集成测试:管道接线/邮件触发/结束守卫/卡单标记。"""
import asyncio
import json
from pathlib import Path
from sqlalchemy import select
@@ -1004,13 +1006,19 @@ def test_reminder_cc_due_turn_email_note_blocked():
def test_inline_prohibitions_all_carry_reask_exception():
"""三轮修复防第四次漏: conversation.py 三处内联禁令运行时文本(app分支/
confirmed块/边界分支)都必须带回显确认例外——号码确认是对"缺国家代码"的
补全动作,只豁免缺失渠道的禁令会压制它(生产验收两轮复发的根因);
"""三轮修复防第四次漏: 三处内联禁令运行时文本(app分支/confirmed块/
边界分支)都必须带回显确认例外——号码确认是对"缺国家代码"的补全动作,
只豁免缺失渠道的禁令会压制它(生产验收两轮复发的根因);
Task 4(spec §4b-3)例外从"可请客户重发完整号一次"收敛为回显语义
(防同场竞争降低首过命中率)。"""
with open("app/engine/services/conversation.py", encoding="utf-8") as f:
src = f.read()
(防同场竞争降低首过命中率)。
锚点迁移(Task 4 词表数据化): 三处禁令已从 conversation.py 源码搬入
seed_profiles/jiancai/wall.json 的 reminders 字段——断言对象改为该
数据文件,断言语义保持等价(同样的禁令字符串与回显例外必须存在于
wall 数据中,且例外与禁令同串就近在场)。"""
wall_path = (Path(__file__).resolve().parents[1]
/ "seed_profiles" / "jiancai" / "wall.json")
src = json.dumps(
json.loads(wall_path.read_text(encoding="utf-8")), ensure_ascii=False)
assert src.count("回显补全后的完整号码") >= 3
anchors = [
"也绝对禁止再索要客户已提供过", # contact_note app+已留资分支