
Удаление мультивендорных меток происхождения ИИ: гигиена Unicode-текста, статистические хуки переписывания и C2PA/метаданные из PNG/JPEG/SVG/PDF/DOCX/HTML/MD
_ _ _ ____ ___ ____ ____ _ _ ____ ____ _ _ ____ ____ ____ _ _ ____ _ _ ____ ____
| | | |__| | |___ |__/ |\/| |__| |__/ |_/ [__ __ |__/ |___ |\/| | | | | |___ |__/
|_|_| | | | |___ | \ | | | | | \ | \_ ___] | \ |___ | | |__| \/ |___ | \
Навык агента + скрипты Python из стандартной библиотеки для удаления мультивендорных маркеров происхождения ИИ из текста и файлов — для приватности и гигиены контента, которым вы владеете.
| Уровень | Объект | Метод |
|---|
| A | Невидимый Unicode, экзотические пробелы, bidi, символы тегов | Детерминированные скрипты Python |
| B | Статистические (токен-семплинг) текстовые водяные знаки | Переписывание агентом + опциональный хук rewrite_text.py |
| Файлы | C2PA / EXIF / XMP / свойства документов | PNG, JPEG, SVG, PDF, DOCX, ODT, HTML, Markdown |
Вендоры / экосистемы (на уровне классов): Claude, Gemini / SynthID-Text, поверхности происхождения OpenAI, марки в стиле Kirchenbauer для open-LLM.
Последний релиз: 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
Используйте `/remove-ai-marks` или команду «удалить AI-водяные знаки / C2PA / метки Claude / текст класса SynthID».
Дополнительные системные инструменты (используются автоматически при наличии):
| Инструмент | Назначение |
| --- | --- |
| [`c2patool`](https://github.com/contentauth/c2pa-rs/tree/main/cli) | Просмотр манифестов C2PA |
| [`exiftool`](https://exiftool.org/) | Удаление остаточных метаданных (особенно в **PDF**) |
Основным скриптам требуется только стандартная библиотека **Python 3.10+**. Вызовы моделей в слое B необязательны.
## Быстрое использование (скрипты)```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 в пиксельной области
`inspect_image.py` и `clean_image.py` могут сообщать оценку уверенности SynthID в пиксельной области,
если доступна внешняя копия репозитория
[`aloshdenny/reverse-SynthID`](https://github.com/aloshdenny/reverse-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 из upstream, который добавляет torch/diffusers для
обхода upstream 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 использует `artifacts/spectral_codebook_v4.npz` из рабочей копии апстрима
(~220 МБ). Это **только обнаружение/оценка** — оно не удаляет пиксельные
водяные знаки.
## Необязательное удаление пиксельных водяных знаков с помощью CtrlRegen
Для водяных знаков изображений **в пиксельной области** (SynthID-class, StegaStamp, Tree-Ring,
StableSignature) опциональный внешний бэкенд запускает конвейер CtrlRegen
(ControlNet + DINOv2 IP-Adapter с управляемой регенерацией). Бэкенд — это
[`mertizci/noai-watermark`](https://github.com/mertizci/noai-watermark),
поддерживаемая повторная реализация метода [CtrlRegen](https://arxiv.org/abs/2410.05470)
(ICLR 2025) с автоматическим тайлингом.
Бэкенд **не поставляется в комплекте** и не содержит файла LICENSE, поэтому он рассматривается как
«все права защищены»: он клонируется по зафиксированному коммиту и загружается во время выполнения.
### Инициализация```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 (эффективное количество шагов шумоподавления ≈ steps × strength).
### Размер изображения (собственный лимит 512×512)
CtrlRegen — это ControlNet 512×512 на базе Stable Diffusion 1.5. Бэкенд обрабатывает
произвольные входные данные, поэтому здесь не предусмотрено дополнительного тайлинга:
- **≤512 px:** один проход — центральный кадр/изменение размера до 512, регенерация, обратное изменение размера.
- **>512 px:** автоматическое перекрывающееся тайлингование (тайлы 512 px, перекрытие 192 px),
ширина/высота выравниваются по кратности 8, затем швы с косинусным смешиванием.
- **В любом случае:** вывод изменяется до исходного размера и подбирается по цвету к
исходному изображению.
Очень большие изображения (например, 4K) порождают много тайлов, поэтому время выполнения растёт с количеством тайлов
(медленнее и больше VRAM). По возможности уменьшайте большие входные данные заранее; размер тайла
и перекрытие жёстко заданы в апстриме и не выставляются флагами.
### Вычислительные ресурсы, закрытые модели и проверка
Ожидайте загрузку моделей объёмом ~10 ГБ; настоятельно рекомендуется GPU, а на CPU выполнение
медленное. Некоторые вышестоящие модели закрыты, поэтому экспортируйте `HF_TOKEN` (только через env —
никогда через 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
| Канал | Claude | Gemini/SynthID | OpenAI | Open-LLM |
|---|---|---|---|---|
| Текст на основе Unicode / редактирования | Layer A | Layer A | Layer A | Layer A |
| Текст со статистической выборкой | Layer B best-effort | Layer B best-effort | Layer B, если имеется | Layer B best-effort |
| C2PA / метаданные файлов | Да (перечисленные форматы) | Да, при наличии | Да, при наличии | Да, при наличии |
| Пиксельные метки изображений | Не входит в область охвата | Опционально: оценка SynthID + удаление CtrlRegen (внешнее) | Не входит в область охвата | Опционально: удаление CtrlRegen (внешнее) |
| Бэкдоры в обучении | Не входит в область охвата | Не входит в область охвата | Не входит в область охвата | Не входит в область охвата |
Подробности: skills/remove-ai-marks/references/vendor-notes.md, mark-classes.md.
Современные водяные знаки LLM часто скрывают сигнал в том, какие токены выбираются (генеративное / выборочное смещение), а не только в невидимых символах. Схемы на основе редактирования внедряют правила Unicode или синонимов. Файловые схемы добавляют C2PA или метаданные генератора.
Пока поставщики не выпустят публичные детекторы и ключи, ни один инструмент не может честно гарантировать, что «это не пройдёт официальную проверку». В отчётах необходимо разделять проверяемую и best-effort работу.
Для Layer B предпочтительнее использовать не исходную модель (не переписывайте текст Claude с помощью Claude, если пытаетесь избежать повторной маркировки).
Текстовые водяные знаки живут в самой формулировке: сигнал распределён по выбору токенов, поэтому почти каждое предложение несёт его частицу. Отсюда следуют два следствия, и именно поэтому Layer B честно описывается как best-effort, а не как волшебный ластик.
Удаление означает переформулирование, а не переструктурирование. Перестановка абзацев, изменение заголовков или лёгкая правка почти не влияют на сигнал. Удаление статистической метки требует переписывания значительной части текста — предложение за предложением, а не раздел за разделом.
Переформулирование ухудшает текст. Любое переписывание заменяет исходный выбор слов на выбор слов модели-переписчика, что нивелирует тон, голос и точность. На продакшн-текстах (SEO, маркетинг, работа с клиентами) это ухудшение реально и часто заметно тем, кому текст важнее всего. Это как взять текст от модели высшего уровня и попросить менее способную модель переписать его с нуля: результат не может превысить потолок модели-переписчика.
Что приводит к честному вопросу полного цикла:
Если всё равно планируется переписывать текст более дешёвой моделью, зачем вообще платить за премиум-модель? Генерация напрямую более дешёвой моделью проще, дешевле и даёт тот же — или лучший — конечный результат.
Layer B имеет смысл, когда вам нужны именно мышление и черновики премиум-модели, и вы принимаете проход переписывания для удовлетворения требований гигиены или конфиденциальности, — а не как дешёвый путь к тексту без меток.
Когда следует пропустить Layer B:
| Формат | Проверка | Очистка |
|---|---|---|
| PNG / JPEG | C2PA chunks / APP11, XMP-подсказки ИИ | Удалить сегменты метаданных |
| SVG | <metadata>, XMP | Удалить блоки |
| Byte/XMP + опциональные инструменты | Предпочтителен exiftool; без него качество снижается | |
| DOCX | docProps / customXml | Очистить свойства, удалить customXml |
| ODT | meta.xml | Удалить генератор / ИИ-подобные метаданные |
| HTML | meta, JSON-LD, data-ai* | Удалить теги/атрибуты |
| Markdown | ключи ИИ в YAML frontmatter | Удалить ключи + тело Layer A |
Удаление водяных знаков в пиксельной области теперь доступно как опциональный внешний бэкенд CtrlRegen (см. выше); это регенеративный инструмент удаления, а не гарантия. Мягкая привязка C2PA (водяной знак в содержимом, который может повторно связать удалённый манифест Content Credentials после удаления метаданных) остаётся вне области охвата. Удаление жёстко связанного C2PA не очищает эти каналы.
Этот инструмент сообщает о проверяемых удалениях (счётчики Unicode, действия с метаданными) и best-effort переписываниях Layer B. Он не может гарантировать, что детекторы производителей не сработают.
Чтобы самостоятельно проверить остаточные сигналы (опционально, внешне):
| Канал | Что мы удаляем | Что может остаться | Внешняя проверка (примеры) |
|---|---|---|---|
| Жёстко связанные C2PA / EXIF / XMP | Да | Мягко связанные / пиксельные метки | c2patool, Content Credentials verify |
| Медиа класса SynthID | Опциональное удаление пикселей (внешний CtrlRegen); в противном случае локальная оценка | Водяной знак аудио/видео; остаточный пиксельный водяной знак после удаления | Инструменты провайдера (например, Google SynthID / детектор Vertex, где доступен); опциональный локальный оценщик reverse-SynthID |
| Статистический текст | Переписывание best-effort | Сильные метки после лёгкого редактирования | Нет публичного универсального детектора; инструменты производителей, когда доступны |
Отраслевой контекст двух уровней (C2PA + незаметный водяной знак): руководство Institute of AI PM.
| Вариант | Удаляет | Примечания |
|---|---|---|
| Очистка Unicode (Layer A) | ZWSP, bidi, теги, экзотические пробелы, … | Безопасный вариант по умолчанию для текста |
| Переписывание (Layer B) | Статистические метки токенов (best-effort) | Всегда предлагается навыком; ценой является стиль — см. Отказ от ответственности |
| Удаление метаданных контейнера | Происхождение файла | См. таблицу форматов |
| Удаление пикселей CtrlRegen (опционально) | Пиксельные метки изображений (класс SynthID, StegaStamp, Tree-Ring, StableSignature) | Внешний бэкенд; высокая вычислительная нагрузка; консервативная сила по умолчанию |
| Локальные модели с открытым весом | Избежание повторной маркировки исходной моделью | Операционная альтернатива |
См. skills/remove-ai-marks/references/ethics.md. Для конфиденциальности и исследований вашего контента — а не для академического мошенничества или ложных заявлений о «написанном человеком».
Ответственное использование: Этот проект предназначен для контента, которым вы владеете или который уполномочены обрабатывать. Пользователи должны соблюдать местные законы и использовать его ответственно. Разработчики снимают с себя любую ответственность за возможное неправомерное использование пользователями.
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 → опциональную оценку reverse-SynthID до/после; `inspect_image.py` подсказывает флаг при высоком SynthID-скоре
- Консервативная сила по умолчанию `0.25` (пресеты 0.15/0.25/0.35/0.5/0.7); конвейер с нативным разрешением 512×512 автоматически разбивается на тайлы бэкендом для изображений большего размера; torch-подпроцесс получает более высокие переопределяемые через env лимиты ресурсов
- Бэкенд никогда не встраивается: `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: сохранять `VS16`/`ZWJ` после базового эмодзи; новый параноидальный флаг `--strip-emoji-glue` (#22)
- HTML: считать теги генератора CMS информационными, а не AI-метаданными (#13)
- PDF: исключить полезные нагрузки потоков из байтового сканирования AI-маркеров (#13)
- Отчёты inspect указывают на неподдерживаемые пути и пути best-effort
**Поддержка Windows**
- Ограничить POSIX-only `preexec_fn` и `os.fchmod`, чтобы запись и опциональные инструменты работали в Windows (#15, #23)
- Перенастроить stdio на UTF-8, чтобы перенаправленные потоки Windows больше не вызывали ошибок на невидимых символах Unicode; добавлен этап Windows CI и дымовой прогон CLI (#23)
**Документация и цепочка поставок**
- Раздел README о CtrlRegen + научные ссылки (CtrlRegen, UnMarker, предупреждение о форензической скрытности), дисклеймер об ответственном использовании; обновления SKILL/matrix/vendor-notes/ethics
- Конфигурация Dependabot + CODEOWNERS для путей безопасности; обновлены scipy/numpy/opencv-python/scikit-learn/pywavelets и базовый образ до Python 3.14-slim
- Тесты CtrlRegen на основе mock (без torch в CI)
### [v0.3.2](https://github.com/guillaumemeyer/watermarks-remover/releases/tag/v0.3.2) — усиление безопасности (безопасная запись, HTTP-клиент, цепочка поставок CI)
- **Безопасная атомарная запись вывода**: каждый очиститель теперь пишет через временный файл + атомарное переименование (`safe_write_bytes` / `safe_write_text`), отказывается от симлинков в качестве назначения и создаёт резервные копии `.bak` тем же безопасным путём — заранее созданные симлинки (например, в `/tmp` или папках загрузок) больше не могут перенаправить «чистую» запись на произвольный файл
- **Усиление HTTP-клиента `rewrite_text.py`**: редиректы полностью запрещены, поэтому API-ключ в заголовке `Authorization` никогда не будет повторно отправлен на непроверенный хост; конечные точки вне loopback **запрещены по умолчанию** (включаются с помощью `--allow-remote` или `WATERMARKS_REWRITE_ALLOW_REMOTE=1`); принимаются только схемы http(s); `--api-key` удалён — ключи задаются только через переменную окружения `WATERMARKS_REWRITE_API_KEY`
- **Лимиты ресурсов**: максимальный входной размер по умолчанию снижен с 1 ГиБ до 256 МиБ, добавлен лимит stdin 64 МиБ, бюджет zip для DOCX/ODT снижен с 512 МиБ до 128 МиБ, а `RLIMIT_AS`/`RLIMIT_FSIZE` применяются к подпроцессам exiftool/c2patool/SynthID (все лимиты переопределяются через env)
- **Цепочка поставок**: действия CI зафиксированы по SHA с `permissions: contents: read`, зафиксированы dev-зависимости (`requirements-dev.txt`), добавлен шаг `pip-audit` и новый workflow 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) — более сильный переписыватель статистического водяного знака Layer B
- Парафраза по умолчанию в `rewrite_text.py` теперь выполняет явную атаку на **выбор слов + синтаксис** (порядок клауз, коннекторы, слова-связки, границы предложений, служебные слова), а не общий переписыватель
- Новый `--strength humanize`: zero-shot проход «пиши как человек», нацеленный на шаблонные AI-стилистические обороты
- Новый `--strength code`: переписывает комментарии, докстроки и строковые литералы, переименовывает локальные идентификаторы, сохраняя поведение и публичные имена API
- Структурный проход теперь выдаёт «естественную, разнообразную человеческую прозу» вместо типичного для AI «чёткого профессионального стиля»
- Новый `--temperature` (по умолчанию `0.9`) для бэкендов Ollama и OpenAI-совместимых
- Новый `--candidates N`: создаёт N переписанных вариантов и выбирает наиболее лексически расходящийся (дистанция Жаккара для биграмм) с защитой от дрейфа длины
- Более строгая гигиена моделей: предпочитать локальные модели с открытыми весами и избегать любого вендора с известными водяными знаками, а не только предполагаемого источника
- Отчёт об остаточном риске теперь различает короткий/легко предсказуемый текст (низкий риск) и длинную прозу с высокой энтропией (высокий риск)
- Документация обновлена в `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 и ошибок времени выполнения
- Документация: только обнаружение/оценка (без удаления пикселей); код апстрима не встраивается и остаётся под некоммерческой Research License
### [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 случая: нет claim, нет 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 + ссылки на внешние инструменты проверки
- Справочник: руководство Institute of AI PM по C2PA/SynthID
- Мягкая привязка и пиксельные/аудио/видео водяные знаки явно выходят за рамки в skill/matrix/ethics
### [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` (print-prompt, Ollama, OpenAI-совместимый)
- **Файлы:** удаление C2PA/AI-метаданных для PNG, JPEG, SVG, PDF, DOCX, ODT, HTML, Markdown
- Унифицированные `inspect_file.py` / `clean_file.py`
- Мультивендорная документация (Claude, класс Gemini/SynthID, OpenAI, open-LLM)
- Скрипты на основе стандартной библиотеки; опциональные `c2patool` / `exiftool`
## Лицензия
MIT — см. [LICENSE](https://github.com/guillaumemeyer/watermarks-remover/blob/HEAD/LICENSE).
## Ссылки
- [Как Claude помечает AI-сгенерированный контент](https://support.claude.com/en/articles/16266773-how-claude-marks-ai-generated-content) (Anthropic)
- Dathathri и др., [*Масштабируемые водяные знаки для идентификации выходных данных больших языковых моделей*](https://www.nature.com/articles/s41586-024-08025-4) (SynthID-Text, Nature 2024)
- Google AI for Developers, [*Защитные механизмы SynthID*](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 и др., [*Водяной знак для больших языковых моделей*](https://arxiv.org/abs/2301.10226)
- Zhang и др., [*Водяные знаки на песке: невозможность сильных водяных знаков для генеративных моделей*](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 и др., [*Водяные знаки на изображениях можно удалять с помощью управляемой регенерации из чистого шума*](https://arxiv.org/abs/2410.05470) (ICLR 2025) — метод пиксельной регенерации, реализованный в опциональном бэкенде CtrlRegen — [код](https://github.com/yepengliu/CtrlRegen)
- Kassis & Hengartner, [*UnMarker: универсальная атака на защитные водяные знаки изображений*](https://arxiv.org/abs/2405.08363) (arXiv:2405.08363; IEEE S&P 2025) — универсальная атака на водяные знаки, сравнение проводится по другой метрике, чем у CtrlRegen
- Goonatilake & Ateniese, [*Удалить водяной знак недостаточно: форензическая скрытность при удалении водяных знаков генеративного ИИ*](https://arxiv.org/abs/2605.09203) (arXiv:2605.09203) — обосновывает консервативную силу по умолчанию: после удаления всё ещё могут оставаться форензические следы
- [mertizci/noai-watermark](https://github.com/mertizci/noai-watermark) (CLI/Python-инструментарий для удаления SynthID/StableSignature/TreeRing и очистки AI-метаданных)
- [0xROOTPLS/DeSynth](https://github.com/0xROOTPLS/DeSynth) (удаление SynthID для изображений OpenAI/Google)
- Institute of AI PM, [*Прослеживаемость и водяные знаки AI-контента: руководство PM по C2PA и SynthID*](https://www.institutepm.com/knowledge-hub/ai-content-provenance-watermarking) (двухуровневая отраслевая модель: C2PA + незаметный водяной знак / мягкая привязка; контекст SB 942 / ст. 50 Закона ЕС об ИИ)