Files
AgentLab/backend
ThearchyHelios 1136b2d09d K3:换了写法的号码在回答正文、质询工件的文字格和最后一道关里也认得出
验收准备时复现过:模型把号码写成 199-1474-2785、199 1474 2785、199.1474.2785、(199)1474-2785、+8619914742785、
全角数字,回答正文、事件、回答文档原样带着,最后一道关 _leaked 也拦不住,正式运行里永久封存。

engine/masking.py 的 _Secrets 新加 loose_spans:在正文里找允许夹分隔符的数字串(数字含全角,之间夹一到三个空格、
连字符、点、括号,含全角;开头可带 + 和括号),从每一截起往后拼,规范化(全角转半角、去分隔符、去 0086 / 86 国家码)
之后在「遮罩值的纯数字写法」集合里查——集合查找,不现编正则,两万个遮罩值照样不卡。拼出来的要是完整的号码:和别的
数字只隔着一个连字符或点连着的(13900000001-2、日期)、只有两截中间一个点的(小数)不算,同原来按词认的边界。
括号配成对:(199)1474-2785 整个换掉,「(电话 199-1474-2785)」两个括号留着。存的值本身带分隔符或国家码的,也按
纯数字写法认。

- scrub:正文(prose)缺省这样认,文字格(质询工件里夹着的、整格就是号码的)也认;SQL 里不认,199-1474-2785 在
  SQL 里是一个算式。
- protect:提问人换着写法写进问题的号码照样免遮;SQL 里照原样留着的阈值换了写法也只在正文里不遮。
- inquiry._leaked:组装之后还认得出换了写法的号码,整份不交。

反方审稿的理由正文目前没有按值遮这一步(理由里只引用反方自己的查询格子,查询结果在核查 agent 的工具边界先遮,见
下一个提交),这里不另加。补单元测试(18 种写法 × 三种存法、不误伤日期小数编号、文字格、最后一道关、提问人写的、
阈值、两万个值的耗时)和端到端测试(11 种写法写进回答都换成「已遮罩」,事件、回答文档里也没有;备注里夹着换了
写法的号码时回答整份不交、质询工件只换那一截)。去掉实现后这些用例都会变红。
2026-10-06 17:11:00 +08:00
..