匿名化数据
操作规范的 oai-trial 项目。不要在此技能中重复其匹配器、格式适配器、验证器、模式或错误处理。项目现有的 argparse CLI 有意保留;此包装器不添加 Python CLI 或服务。
设置与主要操作
ANONYMIZE_DATA_ROOT 覆盖上面的默认主检出路径。设置需要 uv,并安装项目声明的开发/发现额外依赖。运行时操作不需要内存、提供者凭证、LLM、网络或数据库服务。
./run.sh setup
./run.sh --input /data/exports --policy /data/policy.json --output /data/release
./run.sh anonymize --input /data/export.sqlite --policy /data/policy.json --output /data/release
输入是一个 .csv、.json、.txt 或 .sqlite 文件,或包含这些文件的目录。策略必须是一个独立的常规文件。在输入之外使用一个专用的空输出目录。原始文件被复制到私有临时快照中;成功输出仅包含 corpus/ 和 report.json。
现有的 bundle 接口仍然可用:
./run.sh run --input /data/bundle --output /data/release
./run.sh verify --input /data/bundle --output /data/release
./run.sh inspect /data/release
bundle 包含 policy.json 和 corpus/。策略、规范标识、受保护值规则、类型化失败和报告模式由项目拥有。在解释它们时,请阅读其 README.md、docs/ANONYMIZATION_SEMANTICS.md 和 schemas/report.schema.json。不要仅凭退出代码宣布成功:读取实际报告,验证其就绪字段,并检查输出是否符合请求的格式。损坏或缺失的报告视为 NOT READY。
可选的 RapidFuzz 发现:永远不会自动替换
./run.sh discover --input /data/exports --policy /data/policy.json --output /data/work/review.json
./run.sh approve-discovery --input /data/exports --policy /data/policy.json \
--review /data/work/review.json --approve CANDIDATE_ID --output /data/work/approved-policy.json
./run.sh --input /data/exports --policy /data/work/approved-policy.json --output /data/release
发现功能将完整的结构化字符串值和完整的文本行与 name 类型的策略条目进行比较。它不是 NLP 跨度提取或通用的 PII 扫描器。默认值:相似度阈值 90,分离余量 5;可通过 --threshold 和 --margin 配置。不会提出并列项、近并列项、受保护值、包含数字或标识符标点(如 @、/、_)的值以及已知字面量。单引号、连字符和句点允许出现在名称形状的文本中;相似度绝不是证明两个人是同一个人的证据。
要求操作员批准特定的候选 ID。 绝不能仅凭相似度分数就批准。批准会针对当前策略/语料库重新派生提案,拒绝过时/已编辑的审查,并编译一个精确匹配的策略。未经批准的提案绝不会影响匿名化。发现/批准回执上必须设置 release_ready: false。
审查和已批准策略文件包含原始名称:将它们保持在发布、日志和共享报告之外。它们以模式 0600 创建,并且绝不会覆盖现有文件。临时快照默认使用工件驱动器;必要时可用 ANONYMIZE_DATA_WORK_DIR 覆盖。
Docker 仍是独立接口
从项目检出目录:
docker build -t anonymization-trial .
docker run --rm anonymization-trial
# 可选的启用发现的镜像;默认镜像保持精确引擎无依赖。
docker build --build-arg INCLUDE_DISCOVERY=1 -t anonymization-trial:discovery .
仅挂载请求的输入/策略(只读)和一个专用输出目录。相同的项目 CLI 在镜像内运行;评估器不需要此技能。有关完整的挂载命令示例,请参见项目的 docs/DISCOVERY.md。
失败与证明边界
此包装器保留项目退出代码和清理过的错误代码。缺失项目/设置和错误的已安装包路径会在处理前失败。使用 --help 获取实际参数合约。发现是审查材料,而非发布、匿名性保证、置信概率或人类授权。
./sanity.sh 运行真实的正面、负面和对抗性 CLI 检查。保留的 fixtures/agentic_eval.json 重复它们并要求回读工件。先前的试验资格不会自动限定这些试验后扩展。
表示规则(操作员 2026-09-11)
PII 必须与值而非字符串匹配:在任何 JSON/SQL 标量原封不动地传递之前,以规范形式将其字符串化(电话形状的数字采用 E.164 格式),并在字符串化形式上运行策略匹配。固定装置必须包含每种 JSON 标量类型中的每个 PII 类别。作为整数存储的电话号码与同一个电话号码相同,包括当策略将其写为格式化字符串(如 555-123-4567)而语料库存储 5551234567 时。前导零或浮点精度有损的数值转换必须以失败关闭,除非特定类型的规范规则证明了安全的等价性。请参阅 $best-practices-skills "值表示矩阵"。
加固教训(不要再艰难地重新学习这些)
该试验因存储为 JSON/SQLite 整数的电话通过仅字符串匹配器而被取消资格。根本原因是过程错误:验收检查是根据代码的行为编写的,而非根据交付的规范。这些规则的存在是为了防止此类遗漏再次发生。
-
根据规范而非代码派生检查。
policy.json列出了确切的敏感值。正确的验收检查是“这些值都不以任何表示形式出现在解码输出中”——从策略文件中读取值,绝不要手动编写列表。通过依赖探针证明检查依赖于规范(翻转一个策略值 → 结果必须翻转)。参考实现:项目scripts/spec_derived_check.py连接到scripts/verify.sh。 -
独立验证器不得与转换共享任何假设。 原始验证器与生产者一样存在仅字符串盲点,因此没有任何东西以失败关闭。验证预言机必须具有表示感知能力且独立:解析 JSON(解码
\uXXXX),将数值标量扩展为整数/十进制形式,对两侧进行 NFC/NFD 规范化,扫描 SQLite 表+视图单元格以及sqlite_masterDDL 以及每个标头整数,并扫描整个发布边界(包括report.json),而不仅仅是corpus/。 -
完整的表示类别是一个清单,而不是单个错误。 以下每一项都可能将敏感值携带通过天真匹配器;项目为每一项修复并保留了一个保护措施:类型化数值标量(int/float,科学记数法)、SQLite BLOB(失败关闭)、Unicode NFC/NFD、视图重建、空闲列表残留、恶意数据库模式(表达式/部分索引、非确定性视图、计算后的 DEFAULT)、模式 DDL 字面量和持久标头整数。有关完整表格,请参见项目的
docs/SECURITY_REMEDIATION.md。 -
通过真正的 Docker 路径确定性证明。 验证必须是一个提交的脚本,用于构建镜像、运行概要的确切命令并回读发布的字节,并带有硬性的 PASS/FAIL 退出——而不是代理散文。参考:
security/docker_brief_contract.py(构建 + 两个概要命令 + 表示感知泄漏扫描 + 输入前置条件)和security/docker_hardening_matrix.py(通过docker run的对抗性漏洞)。记录 git 提交和构建的镜像 ID。 -
诚实界定范围。 确定性公共命名空间假名会泄露相等性/频率,并且不提供外部链接抵抗;运行报告在
key_mode和does_not_establish中声明了这一点。等于强制性 SQLite 格式常量的策略值是退化输入,而非真实 PII;管道以失败关闭并记录该残留物为已界定范围。