_ _ _ ____ ___ ____ ____ _ _ ____ ____ _ _ ____ ____ ____ _ _ ____ _ _ ____ ____
| | | |__| | |___ |__/ |\/| |__| |__/ |_/ [__ __ |__/ |___ |\/| | | | | |___ |__/
|_|_| | | | |___ | \ | | | | | \ | \_ ___] | \ |___ | | |__| \/ |___ | \
Agent 技能 + 标准库 Python 脚本,用于从文本和文件中去除多厂商 AI 来源标记 —— 用于对您拥有内容的隐私保护与净化。
| 层级 | 目标 | 方式 |
|---|---|---|
| A | 不可见 Unicode、特殊空格、双向文本、标签字符 | 确定性 Python 脚本 |
| B | 统计(token 采样)文本水印 | Agent 重写 + 可选的 rewrite_text.py 钩子 |
| 文件 | C2PA / EXIF / XMP / 文档属性 | PNG, JPEG, SVG, PDF, DOCX, ODT, HTML, Markdown |
厂商 / 生态(类级别):Claude、Gemini / SynthID-Text、OpenAI 来源表面,以及 open-LLM Kirchenbauer 风格标记。
最新版本: v0.4.0
技能路径:skills/remove-ai-marks/
(迁移:原为 remove-claude-marks;斜杠别名 /remove-claude-marks 仍被记录)
mkdir -p .grok/skills ln -sfn "$(pwd)/skills/remove-ai-marks" .grok/skills/remove-ai-marks
mkdir -p ~/.grok/skills ln -sfn "$(pwd)/skills/remove-ai-marks" ~/.grok/skills/remove-ai-marks
Invoke with `/remove-ai-marks` or ask to “去除 AI 水印 / C2PA / Claude 标记 / SynthID 类文本。”
Optional system tools (auto-used when present):
| Tool | Role |
| --- | --- |
| [`c2patool`](https://github.com/contentauth/c2pa-rs/tree/main/cli) | 检查 C2PA 清单 |
| [`exiftool`](https://exiftool.org/) | 清除残留元数据(尤其是 **PDF**) |
Core scripts need **Python 3.10+** stdlib only. Layer B model calls are optional.
## Quick use (scripts)```bash
SCRIPTS=skills/remove-ai-marks/scripts
# Unified inspect / clean
python3 "$SCRIPTS/inspect_file.py" draft.md
python3 "$SCRIPTS/clean_file.py" draft.md -o draft.cleaned.md
python3 "$SCRIPTS/clean_file.py" photo.png -o photo.cleaned.png
python3 "$SCRIPTS/clean_file.py" notes.docx -o notes.cleaned.docx
# Text Layer A
python3 "$SCRIPTS/inspect_text.py" draft.md
python3 "$SCRIPTS/clean_text.py" draft.md -o draft.cleaned.md --stats
# Layer B rewrite hook (default: print prompt only — no model required)
python3 "$SCRIPTS/rewrite_text.py" draft.md --backend print-prompt --strength paraphrase
# Optional local Ollama (loopback only by default — remote endpoints require
# WATERMARKS_REWRITE_ALLOW_REMOTE=1 or --allow-remote):
# WATERMARKS_REWRITE_BACKEND=ollama WATERMARKS_REWRITE_MODEL=llama3.2 \
# python3 "$SCRIPTS/rewrite_text.py" draft.md -o draft.rewritten.md
# API keys are read from WATERMARKS_REWRITE_API_KEY only (never argv).
# Images
python3 "$SCRIPTS/inspect_image.py" shot.png
python3 "$SCRIPTS/clean_image.py" shot.png -o shot.cleaned.png
inspect_text.py、clean_text.py 和 rewrite_text.py 用于处理文本。当指向 .docx、.pdf 或图片时,它们过去会解码压缩后的字节并报告其中出现的任何码点——这些噪声反映的是压缩过程而非内容——而 clean_text.py 随后会将这些损坏的字节写回,从而破坏文件。现在它们会拒绝二进制输入,并指明处理此类输入的工具:```bash
python3 "$SCRIPTS/inspect_text.py" report.docx
检测通过魔数加上控制字节比率进行,因此非 UTF-8 编码的文本仍然有效。`--force-text` 可全局覆盖此行为。
## 可选的 SynthID 像素评分
当存在 [`aloshdenny/reverse-SynthID`](https://github.com/aloshdenny/reverse-SynthID) 的外部检出副本时,`inspect_image.py` 和 `clean_image.py` 可以报告像素域 SynthID 置信度分数。该评分器**未捆绑**:它在运行时从你的检出副本中加载,其代码仍受上游项目的非商业研究许可证约束。
### 选项 1:单命令引导(无需 Docker)```bash
SCRIPTS=skills/remove-ai-marks/scripts
# Clones upstream, creates a venv, and installs scorer-only dependencies.
"$SCRIPTS/setup_synthid.sh"
# Score an image (default checkout: ~/reverse-SynthID).
REVERSE_SYNTHID_DIR=~/reverse-SynthID \
~/reverse-SynthID/.venv/bin/python "$SCRIPTS/score_synthid.py" shot.png
# Or surface the score from inspect / clean (same venv Python).
REVERSE_SYNTHID_DIR=~/reverse-SynthID \
~/reverse-SynthID/.venv/bin/python "$SCRIPTS/inspect_image.py" shot.png
setup_synthid.sh 接受 --dir PATH、--ref REF 和 --full(安装完整的上游 requirements.txt,其中添加了 torch/diffusers,用于本项目不使用的上游 VAE 绕过)。
make docker-synthid-build
docker run --rm
--user "$(id -u):$(id -g)"
--read-only --tmpfs /tmp
-v "$(pwd):/data"
watermarks-remover-synthid-scorer /data/shot.png
该镜像在构建时由上游源码在本地构建。它不会
发布,因此不会重新分发上游代码。
V4 评分使用来自上游检出(checkout)的 `artifacts/spectral_codebook_v4.npz`
(约 220 MB)。这**仅用于检测/评分**——它不会移除像素
水印。
## 可选的 CtrlRegen 像素移除
对于**像素域**图像水印(SynthID 类、StegaStamp、Tree-Ring、
StableSignature),可选的外部后端会运行 CtrlRegen 流水线
(ControlNet + DINOv2 IP-Adapter 可控再生成)。该后端是
[`mertizci/noai-watermark`](https://github.com/mertizci/noai-watermark),一个
维护中的 ICLR 2025
[CtrlRegen](https://arxiv.org/abs/2410.05470) 方法的重新实现,支持自动分块。
后端**未捆绑**,且不附带 LICENSE 文件,因此被视为
保留所有权利:它会在固定的提交(pinned commit)上克隆并在运行时加载。
### 引导```bash
SCRIPTS=skills/remove-ai-marks/scripts
# Clones upstream (pinned commit), creates a venv, installs torch + deps.
"$SCRIPTS/setup_ctrlregen.sh"
# Standalone removal (default checkout: ~/noai-watermark).
NOAI_WATERMARK_DIR=~/noai-watermark \
~/noai-watermark/.venv/bin/python "$SCRIPTS/clean_ctrlregen.py" shot.png -o shot.ctrlregen.png
NOAI_WATERMARK_DIR=~/noai-watermark
~/noai-watermark/.venv/bin/python "$SCRIPTS/clean_image.py" shot.png
-o shot.cleaned.png --remove-pixel ctrlregen
操作顺序:先剥离元数据,然后执行 CtrlRegen 像素移除,再
可选地计算 reverse-SynthID 处理前/后的分数(当同时设置 `REVERSE_SYNTHID_DIR`
时)。
**默认强度较为保守**(`--ctrlregen-strength 0.25`),因为
更高的强度会移除更多水印,但也会重新生成更多图像内容。
文档规定的预设:`0.15` 最低 / `0.25` 默认 / `0.35` 均衡 /
`0.5` 激进 / `0.7` 最大(后端默认值为 0.5)。`--ctrlregen-steps`
默认为 50(有效去噪步数 ≈ 步数 × 强度)。
### 图像尺寸(512×512 原生限制)
CtrlRegen 是一个 512×512 的 Stable Diffusion 1.5 ControlNet。后端会解析
任意输入的该限制,因此这里不暴露额外的分块选项:
- **≤512 px:** 单次处理 — 居中裁剪/缩放到 512,重新生成,再缩放回原尺寸。
- **>512 px:** 自动重叠分块(512 px 块,192 px 重叠),
宽/高按 8 的倍数对齐,然后使用余弦混合接缝。
- **任一路径:** 输出会缩放回原始尺寸,并与
原始图像进行颜色匹配。
非常大的图像(例如 4K)会产生大量分块,因此运行时间随分块数量扩展
(更慢且占用更多 VRAM)。实际可行时请预先缩小大尺寸输入;分块大小
和重叠量在上游已硬编码,不开放为标志。
### 计算资源、受限模型与验证
预计需要下载约 10 GB 的模型;强烈建议使用 GPU,CPU 运行
会很慢。部分上游模型受门控,因此请导出 `HF_TOKEN`(仅环境变量 —
绝不要使用 argv)。`clean_ctrlregen.py` 拒绝自动安装依赖;请先运行
`setup_ctrlregen.sh`。
本地没有针对 StegaStamp/Tree-Ring/StableSignature 的检测器,因此
唯一的本地信号是 reverse-SynthID 分数(一种替代指标)。可用时,
`clean_image.py --remove-pixel ctrlregen` 会报告该分数的处理前/后;
官方 Google SynthID 检查仍是最终权威。
### Docker```bash
make docker-ctrlregen-build
docker run --rm -e HF_TOKEN="$HF_TOKEN" \
--user "$(id -u):$(id -g)" \
-v "$(pwd):/data" \
watermarks-remover-ctrlregen /data/shot.png -o /data/shot.ctrlregen.png
Details: skills/remove-ai-marks/references/vendor-notes.md, mark-classes.md.
Modern LLM watermarks often hide a signal in which tokens are chosen (generative / sampling bias), not only in invisible characters. Edit-based schemes inject Unicode or synonym rules. File schemes attach C2PA or generator metadata.
Until vendors ship public detectors and keys, no tool can honestly certify “this fails the official check.” Reports must separate verifiable vs best-effort work.
Prefer a non-origin model for Layer B (do not rewrite Claude text with Claude if you are trying to avoid re-stamping).
Text watermarks live in the wording itself: the signal is spread across token choices, so nearly every sentence carries a little of it. Two consequences follow, and they are why Layer B is honestly described as best-effort rather than a magic eraser.
Removal means rewording, not restructuring. Shuffling paragraphs, changing headings, or light touch-ups barely move the signal. Stripping a statistical mark requires rewriting a substantial fraction of the text — sentence by sentence, not section by section.
Rewording degrades the copy. Any rewrite replaces the original word choices with the rewriting model's, which flattens tone, voice, and precision. On production copy (SEO, marketing, client work) that degradation is real and often visible to the people who care most about the writing. It is like taking text from a top-tier model and asking a less capable model to rewrite it from scratch: the result cannot exceed the rewrite model's ceiling.
Which leads to the honest full-circle question:
If the plan is to rewrite the text with a cheaper model anyway, why pay for a premium model in the first place? Generating directly with the cheaper model is simpler, cheaper, and produces the same — or better — end result.
Layer B makes sense when you specifically want the premium model's thinking and drafting and accept a rewrite pass to satisfy a hygiene or privacy requirement — not as a cheap route to mark-free text.
When to skip Layer B:
Quality matters more than hygiene: use the lossless path — Layer A Unicode scrub plus the file metadata cleaners — and keep the original prose.
Rewriting anyway: use a non-origin model (rewriting with the origin model can re-stamp the text), and remember residual risk remains — no tool can certify a vendor detector will fail.
Pixel-domain watermark removal is now available as an optional external CtrlRegen backend (see above); it is a regenerating remover, not a guarantee. C2PA soft binding (in-content watermark that can re-link a remote Content Credentials manifest after metadata is stripped) remains out of scope. Stripping hard-bound C2PA does not clear those channels.
This tool reports verifiable removals (Unicode counts, metadata actions) and best-effort Layer B rewrites. It cannot certify that vendor detectors will fail.
To check residual signals yourself (optional, external):
Industry two-layer context (C2PA + imperceptible watermark): Institute of AI PM guide.
Matrix: skills/remove-ai-marks/references/removal-matrix.md.
See skills/remove-ai-marks/references/ethics.md. For privacy and research on your content — not academic fraud or false “human-written” claims.
Responsible use: This project is for content you own or are authorized to process. Users must adhere to local regulations and use it responsibly. The developers disclaim any liability for potential misuse by users.
python3 -m venv .venv && .venv/bin/pip install pytest .venv/bin/python -m pytest # or: make test make smoke # quick CLI smoke on fixtures
## 更新日志
### [v0.4.0](https://github.com/guillaumemeyer/watermarks-remover/releases/tag/v0.4.0) — 像素去除、检测置信度、Windows 支持与误报修复
**可选的 CtrlRegen 像素去除(外部后端)**
- 通过外部 `mertizci/noai-watermark` 检出实现可选的像素域水印去除:`clean_ctrlregen.py` 适配器 + `setup_ctrlregen.sh` 引导脚本(固定提交、稀疏检出、venv、SHA 校验),另有 `Dockerfile.ctrlregen` 和 `make bootstrap-ctrlregen` / `docker-ctrlregen-build` / `smoke-ctrlregen`
- `clean_image.py --remove-pixel ctrlregen` 依次执行元数据剥离 → CtrlRegen 去除 → 可选的逆向 SynthID 前后评分;`inspect_image.py` 在 SynthID 得分较高时提示使用该标志
- 默认强度保守为 `0.25`(预设 0.15/0.25/0.35/0.5/0.7);512×512 原生流水线由后端对更大图像自动分块;torch 子进程获得更高的可通过环境变量覆盖的资源上限
- 后端从不捆绑:`noai-watermark` 未附带 LICENSE 文件(视为保留所有权利),并且通过直接使用 `CtrlRegenEngine` 绕过了其自动安装/重启代码路径
**检测置信度与聚合审计**
- 检测结果现在分为 `confirmed` / `probable` / `informational` / `likely_false_positive` 四类,并在文本/图像/容器 JSON 及人工可读报告中展示
- 新增 `audit_dir.py`(递归树)和 `audit_website.py`(sitemap 发现 + 爬取)聚合报告;已在 SKILL.md 中说明
**误报修复**
- DOCX:仅扫描 `docProps`/`customXml`,不扫描可见正文(#14)
- 文本层 A:保留 emoji 基字符之后的 `VS16`/`ZWJ`;新增 `--strip-emoji-glue` 偏执模式标志(#22)
- HTML:将 CMS 生成器标签视为信息性内容,而非 AI 元数据(#13)
- PDF:将流载荷从 AI 标记字节扫描中排除(#13)
- 检查报告会注明不支持/尽力而为的路径
**Windows 支持**
- 对仅支持 POSIX 的 `preexec_fn` 和 `os.fchmod` 加门控,使写入和可选工具可在 Windows 上运行(#15、#23)
- 将 stdio 重新配置为 UTF-8,使重定向的 Windows 流不再因不可见 Unicode 而报错;Windows CI 分支 + CLI 冒烟运行(#23)
**文档与供应链**
- README CtrlRegen 章节 + 研究参考文献(CtrlRegen、UnMarker、取证隐蔽性注意事项)、负责任使用声明;SKILL/矩阵/厂商说明/伦理更新
- Dependabot 配置 + 安全路径 CODEOWNERS;升级 scipy/numpy/opencv-python/scikit-learn/pywavelets,并将基础镜像升级到 Python 3.14-slim
- 基于 mock 的 CtrlRegen 测试(CI 中不安装 torch)
### [v0.3.2](https://github.com/guillaumemeyer/watermarks-remover/releases/tag/v0.3.2) — 安全加固(安全写入、HTTP 客户端、CI 供应链)
- **安全、原子化的输出写入**:每个清理器现在都通过临时文件 + 原子重命名(`safe_write_bytes` / `safe_write_text`)写入,拒绝符号链接目标,并通过同样的安全路径创建 `.bak` 备份——预先放置的符号链接(例如在 `/tmp` 或下载目录中)无法再将清理写入重定向到任意文件
- **`rewrite_text.py` HTTP 客户端加固**:直接拒绝重定向,因此 `Authorization` 头中的 API 密钥永远不会被重新发送到未经验证的主机;非环回端点**默认拒绝**(使用 `--allow-remote` 或 `WATERMARKS_REWRITE_ALLOW_REMOTE=1` 选择启用);仅接受 http(s) 协议;移除了 `--api-key`——密钥仅通过环境变量 `WATERMARKS_REWRITE_API_KEY` 提供
- **资源上限**:默认最大输入从 1 GiB 降至 256 MiB,新增 64 MiB stdin 上限,DOCX/ODT zip 预算从 512 MiB 降至 128 MiB,并对 exiftool/c2patool/SynthID 子进程应用 `RLIMIT_AS`/`RLIMIT_FSIZE`(所有上限均可通过环境变量覆盖)
- **供应链**:CI 操作使用 SHA 固定版本并设置 `permissions: contents: read`,固定开发依赖(`requirements-dev.txt`),新增 `pip-audit` 步骤和 CodeQL 工作流;Docker 镜像现在以非特权用户运行并固定 pip 版本
- **评分器依赖**:Pillow 从 10.4.0 升级到 12.3.0(修复 24 个已知 CVE);API 用法已对照固定的上游提交验证
- 测试:新增 18 个安全回归测试(共 60 个,全部通过)
### [v0.3.1](https://github.com/guillaumemeyer/watermarks-remover/releases/tag/v0.3.1) — 更强的 B 层统计水印改写
- `rewrite_text.py` 的默认释义现在执行显式的**选词 + 句法**攻击(从句顺序、连接词、过渡词、句子边界、功能词),而非通用改写
- 新增 `--strength humanize`:零样本“像人一样写作”处理,针对公式化的 AI 风格措辞
- 新增 `--strength code`:改写注释、文档字符串和字符串字面量,并重命名局部标识符,同时保持行为和公共 API 名称不变
- 结构处理现在输出“自然、多样的真人散文”,而非 AI 典型的“清晰专业风格”
- 新增 `--temperature`(默认 `0.9`),同时适用于 Ollama 和 OpenAI 兼容后端
- 新增 `--candidates N`:生成 N 个改写版本,并选择词汇分歧最大(bigram Jaccard 距离)且受长度漂移保护的结果
- 更强的模型卫生:优先选择本地开放权重模型,并避免任何已知带水印的厂商,而不仅仅是疑似来源
- 残余风险报告现在区分短/高可预测文本(较低风险)与长/高熵散文(较高风险)
- 文档更新于 `SKILL.md`、`removal-matrix.md` 和 `vendor-notes.md`;测试覆盖新提示、分歧评分和候选选择
### [v0.3.0](https://github.com/guillaumemeyer/watermarks-remover/releases/tag/v0.3.0) — 可选的 SynthID 像素评分
- 可选像素域 SynthID 评分器,通过外部 [`aloshdenny/reverse-SynthID`](https://github.com/aloshdenny/reverse-SynthID) 检出实现(`score_synthid.py`);在 `inspect_image.py` / `clean_image.py` 中通过 `REVERSE_SYNTHID_DIR` 或 `--synthid-dir` 使用
- `setup_synthid.sh` 引导脚本(仅评分器依赖;`--full` 安装上游需求);`Dockerfile.synthid` 以及 `make docker-synthid-build` / `docker-synthid-help`
- Makefile 的 `smoke-synthid` 和 `bootstrap-synthid` 目标
- 评分器适配器、CLI 不可用路径、JSON 解析和运行时错误的测试
- 文档:仅检测/评分(无像素去除);上游代码不捆绑,并保持其非商业研究许可证
### [v0.2.0](https://github.com/guillaumemeyer/watermarks-remover/releases/tag/v0.2.0) — c2patool 误报修复
- `image_meta.py`:`has_manifest` 不再将 `Error: No claim found` / `No JUMBF data found` 视为清单(运算符优先级错误:否定标记现在否决所有肯定分支)
- 新增 `tests/test_c2patool_report.py`(4 种情况:无声明、无 JUMBF、真实清单、工具缺失)
- 文档:修复 `c2patool` 链接(仓库已移至 `contentauth/c2pa-rs`);新增关于文本水印去除质量成本的免责声明
### [v0.1.0](https://github.com/guillaumemeyer/watermarks-remover/releases/tag/v0.1.0) — 打包打磨 + 来源诚实
- `Makefile`(`test` / `smoke` / `install-skill`)和 `pytest.ini`
- Markdown、HTML、SVG 的固件样本;PDF 退化清理测试
- 文档:行业**两层**模型(硬绑定 C2PA 与软绑定 / SynthID-media)
- README 残余风险表 + 外部验证工具链接
- 参考:AI PM 协会 C2PA/SynthID 指南
- 软绑定及像素/音频/视频水印在技能/矩阵/伦理中明确列为范围外
### [v0.0.1](https://github.com/guillaumemeyer/watermarks-remover/releases/tag/v0.0.1) — 初始多厂商发布
- 代理技能 `remove-ai-marks`(取代仅限 Claude 的 `remove-claude-marks`)
- **A 层:** 不可见 Unicode / bidi / 标记字符 / 空格同形字(`inspect_text` / `clean_text`)
- **B 层:** 改写指导 + 可选 `rewrite_text.py`(打印提示、Ollama、OpenAI 兼容)
- **文件:** 对 PNG、JPEG、SVG、PDF、DOCX、ODT、HTML、Markdown 进行 C2PA/AI 元数据剥离
- 统一的 `inspect_file.py` / `clean_file.py`
- 多厂商文档(Claude、Gemini/SynthID 类、OpenAI、开放 LLM)
- 标准库优先脚本;可选 `c2patool` / `exiftool`
## 许可证
MIT — 参见 [LICENSE](https://github.com/guillaumemeyer/watermarks-remover/blob/HEAD/LICENSE)。
## 参考文献
- [How Claude marks AI-generated content](https://support.claude.com/en/articles/16266773-how-claude-marks-ai-generated-content)(Anthropic)
- Dathathri 等,[*Scalable watermarking for identifying large language model outputs*](https://www.nature.com/articles/s41586-024-08025-4)(SynthID-Text,Nature 2024)
- Google AI for Developers,[*SynthID safeguards*](https://ai.google.dev/responsible/docs/safeguards/synthid)(Gemini API 文档)
- [C2PA](https://c2pa.org/) / [c2patool](https://github.com/contentauth/c2pa-rs/tree/main/cli)
- Kirchenbauer 等,[*A Watermark for Large Language Models*](https://arxiv.org/abs/2301.10226)
- Zhang 等,[*Watermarks in the Sand: Impossibility of Strong Watermarking for Generative Models*](https://arxiv.org/abs/2311.04378)(ICML 2024)
- [google-deepmind/synthid-text](https://github.com/google-deepmind/synthid-text)(研究参考;此处不用于检测)
- [aloshdenny/reverse-SynthID](https://github.com/aloshdenny/reverse-SynthID)(研究参考)
- Liu 等,[*Image Watermarks are Removable Using Controllable Regeneration from Clean Noise*](https://arxiv.org/abs/2410.05470)(ICLR 2025)——可选的 CtrlRegen 后端所实现的像素再生方法——[代码](https://github.com/yepengliu/CtrlRegen)
- Kassis & Hengartner,[*UnMarker: A Universal Attack on Defensive Image Watermarking*](https://arxiv.org/abs/2405.08363)(arXiv:2405.08363;IEEE S&P 2025)——一种通用水印攻击,在与 CtrlRegen 不同的指标上进行了比较
- Goonatilake & Ateniese,[*Removing the Watermark Is Not Enough: Forensic Stealth in Generative-AI Watermark Removal*](https://arxiv.org/abs/2605.09203)(arXiv:2605.09203)——说明保守强度默认值的动机:去除后仍可能留下取证痕迹
- [mertizci/noai-watermark](https://github.com/mertizci/noai-watermark)(用于 SynthID/StableSignature/TreeRing 去除及 AI 元数据剥离的 CLI/Python 工具包)
- [0xROOTPLS/DeSynth](https://github.com/0xROOTPLS/DeSynth)(针对 OpenAI/Google 图像的 SynthID 去除)
- Institute of AI PM,[*AI Content Provenance and Watermarking: The PM's Guide to C2PA and SynthID*](https://www.institutepm.com/knowledge-hub/ai-content-provenance-watermarking)(两层行业模型:C2PA + 不可感知水印 / 软绑定;SB 942 / EU AI Act Art. 50 背景)
| Channel | Claude | Gemini/SynthID | OpenAI | Open-LLM |
|---|
| Unicode / edit-based text | Layer A | Layer A | Layer A | Layer A |
| Statistical sampling text | Layer B best-effort | Layer B best-effort | Layer B if present | Layer B best-effort |
| C2PA / file metadata | Yes (listed formats) | Yes when present | Yes when present | Yes when present |
| Pixel image marks | Out of scope | Optional SynthID score + CtrlRegen removal (external) | Out of scope | Optional CtrlRegen removal (external) |
| Training backdoors | Out of scope | Out of scope | Out of scope | Out of scope |
| Format | Inspect | Clean |
|---|
| PNG / JPEG | C2PA chunks / APP11, AI XMP hints | Drop metadata segments |
| SVG | <metadata>, XMP | Strip blocks |
| Byte/XMP + optional tools | exiftool preferred; degraded without it | |
| DOCX | docProps / customXml | Scrub props, drop customXml |
| ODT | meta.xml | Drop generator / AI-ish meta |
| HTML | meta, JSON-LD, data-ai* | Strip tags/attrs |
| Markdown | YAML frontmatter AI keys | Drop keys + Layer A body |
| Channel | What we remove | What may remain | External check (examples) |
|---|
| Hard-bound C2PA / EXIF / XMP | Yes | Soft-bound / pixel marks | c2patool, Content Credentials verify |
| SynthID-class media | Optional pixel removal (external CtrlRegen); local score otherwise | Audio/video watermark; residual pixel watermark after removal | Provider tools (e.g. Google SynthID / Vertex detector where offered); optional local reverse-SynthID scorer |
| Statistical text | Best-effort rewrite | Strong marks after light edit | No public universal detector; vendor tools when available |
| Option | Removes | Notes |
|---|
| Unicode scrub (Layer A) | ZWSP, bidi, tags, exotic spaces, … | Safe default for text |
| Rewrite (Layer B) | Statistical token marks (best-effort) | Always offered by skill; costs style — see Disclaimer |
| Container/metadata strip | File provenance | See format table |
| CtrlRegen pixel removal (optional) | Pixel-domain image marks (SynthID-class, StegaStamp, Tree-Ring, StableSignature) | External backend; heavy compute; conservative strength default |
| Open-weight local models | Avoid re-stamping with origin model | Operational alternative |