# -*- coding: utf-8 -*- """对外脱敏规则入口 —— sim_sys_server.py 的唯一依赖 (scrub / residual)。 ★ 使用者侧恢复 (2026-09-11), 原因: v0.2.0 包里**缺这个文件**。release/sim_sys_server.py 第 36 行 `from scrub_rules import scrub, residual` 因此 ModuleNotFoundError, /sim/sys/ 分系统合页直接 502 (证据: logs/sim_sys.log 的 traceback, check/serve 里该模块 [DOWN])。 这里**不新写、也不复制任何脱敏规则**, 只把包内唯一那份规则表 src/windscada/deid_public.py 转出来 —— 它就是全项目实际在用的那一份 (windscada_serve.py 的 scrub_or_die、上云件、云端问答都走它)。 这样同时也满足 sim_sys_server.py 的要求: "规则表唯一正本…禁止在此另抄一份" —— 规则仍然只有一处。 若日后拿到交付方的原版 release/scrub_rules.py, 直接覆盖本文件即可。 """ import pathlib import sys ROOT = pathlib.Path(__file__).resolve().parent.parent # release/ -> 项目根 if str(ROOT) not in sys.path: sys.path.insert(0, str(ROOT)) from src.windscada.deid_public import audit, scrub, scrub_or_die # noqa: E402 def residual(text): """回扫脱敏后的文本 → [(类别, 命中次数, 样例)]; 空列表 = 干净。 对应 deid_public.audit: "过了脱敏"只能由回扫结果说, 不能由"我替换过了"说。 """ return audit(text) __all__ = ['scrub', 'residual', 'scrub_or_die']