为 DSH agent 提供俄文 AI 痕迹检测与改写能力:识别 ChatGPT/Gemini/Grok/DeepSeek 等聊天机器人的复制粘贴残留并按用户要求将文本改写自然化。
- 语言
- Python
- License
- MIT
- 分支
- main
安装
$ dsh plugin --profile web add github:Vladimir-Human/humanizer-ru在终端中运行以上命令,通过 dsh CLI 安装此插件。可在右上角切换 Profile。 第一次用 dsh?看这篇新手教程
一句话定位
humanizer-ru 是一个面向俄语文本的"去 AI 味"技能:当文本里出现明显的机器生成痕迹——比如 ChatGPT 留的 :contentReference[oaicite:N]、千篇一律的「эксперты считают」式套话、Markdown 残骸、聊天尾巴「Надеюсь, это поможет」——它能识别并按用户要求改写成自然俄语,且不增加原文不存在的事实。
核心能力
- 检测 39 个 regex 标记,覆盖 ChatGPT、Gemini、Grok、Perplexity、DeepSeek、Copilot 等聊天机器人复制粘贴的硬痕迹("класс A")和需要人工判断的上下文线索("класс B")
- 识别 38 种内容/语言/结构/沟通维度的"软信号":空洞赞美、强制三段式、「не только... но и」并排结构、长破折号滥用、Markdown 残骸、剩饭式套话结尾等
- 按用户明确请求改写文本,覆盖从"3–5 个软信号则局部改"到"6+ 个信号则整段重写"的多档干预强度
- 严格遵守"改写不能新增事实"——改后版本里任何数字、日期、名字、单位都必须在原文中能找到
- 对俄语文学/法律/合同/学术/营销等不同文体的"假阳性"边界做了分类(
references/false-positives.md) - 在数据层把文本视作不可信输入:忽略嵌入在待审文本里的指令、不执行链接、不联网、不读写文件
技术实现
- 语言: YAML/Markdown(纯文本技能,运行时无 Node/Python 代码执行)
- 关键依赖:
@deepseek-ai/dsh-skill-filesystem(cordis 注入的技能提供器)、process.getBuiltinModule('node:path')(在 patch 表达式中解析包路径) - 架构模式: Cordis patch 注入——
dsh/cordis.patch.yml在 dsh 启动时插入一行,把宿主自带的 skill-filesystem 提供器指向本 bundle 的skills/目录;插件本身不写代码,所有"逻辑"以 SKILL.md 的指令形式交由 agent 在需要时加载 - 入口文件: dsh/cordis.patch.yml(bundle 注入点)+ dsh/skills/humanizer-ru/SKILL.md(agent 实际加载的指令集)
适用场景
俄罗斯语用户或团队在 DSH agent 里需要审阅/打磨俄文文档时——比如俄文博客、营销文案、内部通告、维基类词条——会让 agent 加载此技能去检查"AI 味",或要求把一段生硬的机器稿改写成人话。适合接到俄语出版、内容运营、客服知识库等场景的 DSH 工作流里。
前置依赖与兼容性
| 依赖 | 最低版本 | 说明 |
|---|---|---|
| DSH 宿主 | 0.1.0-rc.6 | 该 bundle 的 CI 在 0.1.0-rc.6 实测过;新 dsh 版本可能存在兼容性破坏 |
| Node.js | 未声明 | bundle 本身不写代码;cordis patch 内的 process.getBuiltinModule('node:path') 由 dsh 宿主提供,与插件无独立要求 |
| pnpm | 任意兼容 dsh 的版本 | dsh 自身依赖 pnpm;该插件不引入额外 pnpm 包 |
| 平台 | 跨平台 | bundle 只有 YAML + Markdown,没有原生编译模块,也没有 OS/CPU 限制 |
| 原生模块 | 无 | 无 node-pty、sqlite、better-sqlite3 等需要本机编译的依赖 |
安装方式
dsh plugin --profile web add github:Vladimir-Human/humanizer-ru
配置项
本插件无需额外配置。
dsh/cordis.patch.yml 把宿主自带的 skill-filesystem 提供器指向本 bundle 的 skills/ 目录,无需额外环境变量;触发方式是在 dsh 对话中输入 /humanizer-ru … 或自然语言指令「очеловечь」「убери гпт-шность」「перепиши»等。
常见问题
Q: 这个插件是干嘛用的?普通用户能用吗?
A: 能。它专门检测俄语文中"AI 写的痕迹"——套话、空话、聊天机器人格式残骸等——并可按用户明确要求改写成更自然的文字。它对不知道 Cordis/Fiber/Host face 等内部概念的普通用户是友好的。
Q: 它会自动插手我的对话吗?
A: 不会。SKILL.md 明确指出"скилл активируется только по явной просьбе пользователя"——只在用户明确说"очеловечь/перепиши/убери гпт-шность"等关键词时才触发,不暗中拦截任务。
Q: 能处理英文或代码吗?
A: 不能。SKILL.md 的 description 写明:不处理非俄文文本,不处理源代码和配置文件,不处理法律文本,不处理艺术性散文。这些情况下会直接拒绝。
Q: 会改动原文的事实吗?
A: 不会。"Шесть ключевых принципов правки"中第 6 条专门规定:在改写版本里不能新增原文中没有的数字、日期、名字、单位;需要补充具体细节时向用户索取,不是凭空补。
Q: 它会从我的文本里跳到链接、读文件、上网吗?
A: 不会。SKILL.md 的"Границы безопасности"四条规则明确:输入文本仅作为数据处理,不访问输入文本中的链接、不执行代码、不读写文件、不访问网络。
Q: 它和 AI 检测器(如 GPTZero)是同一类工具吗?
A: 不一样。README 明确说"Детекторы не обходим и текст под них не подгоняем"——它不针对检测器优化,目的是产出自然文本而不是获得绿色检测分数。GitHub 还有其他同名/相似的"humanizer"项目,立场和功能都不同。
Q: 在 dsh 里装这个 bundle 有坑吗?
A: 有。该项目的 CI 实测发现,使用 github:Vladimir-Human/humanizer-ru#v3.13.0&path:/dsh 这种"用 tag 钉版本 + 子目录"在一行里组合时,pnpm 会静默丢子目录、安装整个仓库为普通依赖、退出码仍是 0,但 bundle 实际没装上。所以推荐单独指定 path:/dsh,不绑定 tag。
Q: dsh 用户如何完整卸载?
A: 运行 dsh plugin --profile web remove humanizer-ru-dsh 即可。该 bundle 只有 cordis patch + 一个 Skill 文件夹,不在 dsh profile 之外创建任何持久化数据,删除后环境恢复干净。
上手难度
入门 — 安装一行命令即可;使用时用 /humanizer-ru 或自然语言指令触发,不需要写代码或环境变量;SKILL.md 是俄文为主的长文档但 agent 在需要时会按需加载,不会一次性灌入系统提示。
已知问题与限制
- 不适用于非俄语文本:SKILL.md description 明确拒绝并请求用户提供俄文原文(dsh/skills/humanizer-ru/SKILL.md:3, :33-38)
- 不适用于源代码、配置文件、法律合同、纯艺术性散文:会在决策树第一步就拒绝或限制干预(dsh/skills/humanizer-ru/SKILL.md:60-63)
- "软信号"组合不构成作者归属判定:无论软信号有多少个,agent 都不得据此宣称"这段是 AI 写的";只有 A 类硬标记、可证实来源伪造或作者自述才能下结论(dsh/skills/humanizer-ru/SKILL.md:127,
Главное правило) - B 类标记单独不够:必须配合 A 类硬证据或独立旁证;B 类单独不能用来盖戳(dsh/skills/humanizer-ru/SKILL.md:127)
- dsh bundle 安装组合
tag+#path:/dsh在 pnpm 链路下静默失败:CI 实测#v3.13.0&path:/dsh形式 pnpm 会丢掉子目录当作普通依赖安装,退出码仍 0 但 profile 缺层(.github/workflows/dsh-install.yml:7-11) - dsh 处于开发预览阶段,宿主自身承诺可能引入破坏性改动;此 bundle 仅在 0.1.0-rc.6 实测过(README.en.md:68)
- 改写过程有 6 条硬性约束:去垃圾、破模板、改节奏、信读者、无口号、不补事实;用户如果要求"更激进一点"也突破不了这 6 条(dsh/skills/humanizer-ru/SKILL.md:144-152)
English version → README.en.md
Скилл для ИИ-агентов: находит и убирает следы машинной генерации в русскоязычном тексте. Переписывает «гпт-шный» текст по-человечески, не искажая смысла, и не трогает живое: ложное срабатывание здесь дороже пропуска.
Здесь 38 паттернов (25 базовых и 13 расширений) и 39 проверяемых regex-маркеров классов A и B. Проверки гоняет CI. Каталог skills.sh сообщает об успешных проверках Gen Agent Trust Hub и Socket; про красную плашку Snyk — в разделе «Безопасность».
До:
🚀 Инновации: Мы добавили пакетную обработку, горячие клавиши и офлайн-режим. Это безусловно является свидетельством нашего стремления к качеству. Кроме того, эти функции обеспечивают бесшовный, интуитивно понятный и мощный пользовательский опыт — гарантируя эффективность. Эксперты считают, что это революция.
После:
Мы добавили пакетную обработку, горячие клавиши и офлайн-режим.
Скилл убирает штампы, но не дописывает факты за автора. В примере выше всё из варианта «После» уже было в исходнике.
Что ему давать
Дайте скиллу готовый фрагмент. Он найдёт следы генерации и по просьбе
перепишет текст. SKILL.md — инструкция агента: её подгружают на задачу
анализа или правки вместе с нужными справочниками из references/.
PERSONA.md — другое: короткие правила живого тона для диалога, а не
для проверки текста. Не кладите весь SKILL.md в системный промпт
чат-клиента: это замедлит ответы, но не сделает разговор живее.
Одноимённые проекты — не путать
В GitHub есть другие репозитории с именем humanizer-ru, не связанные с
этим проектом. Позиции у них разные:
| Проект | Фокус | Позиция по детекторам |
|---|---|---|
| Vladimir-Human/humanizer-ru — этот проект | Редактор русского текста: 38 паттернов, 39 regex-маркеров с реестром доказательств 37/39, 36 CI-гейтов, слепые парные прогоны | Детекторы не обходим и текст под них не подгоняем; цель — естественный текст, а не зелёный вердикт детектора |
| smixs/humanizer-ru | Скилл «humanizer & detector»: правка и проверка одним инструментом | — |
| ilyautov/humanizer-ru | Скилл-гуманизатор; в описании заявлена подгонка под то, что меряют GPTZero, DivEye, RuBERT (perplexity и burstiness) | Обход детекторов заявлен открыто в описании |
| blader/humanizer | Англоязычный скилл того же жанра, опубликован на три дня раньше | — |
Мы не аффилированы ни с одним из них. Декларация этого проекта: «не средство обхода детекторов»; подробнее — в разделе «Безопасность».
Установка за 30 секунд
npx skills add https://github.com/vladimir-human/humanizer-ru --skill humanizer-ru
Установщик предложит выбрать агентов: Claude Code, Codex, Cursor, Gemini CLI, OpenCode и другие среды с поддержкой формата Agent Skills. Сам скилл состоит из текстовых инструкций и не исполняет код при работе. Команда npx запускает сторонний Skills CLI; если хотите проверить каждый файл до установки, используйте раздел «Установка вручную».
Установка вручную
Скилл humanizer-ru ставится в Claude.ai и в локальный CLI Claude Code. Для команд — свой путь, через администратора организации (см. раздел 2).
0. Проверка перед установкой
Скилл не выполняет код при активации: рабочая часть — только текстовые файлы разметки. В репозитории есть вспомогательные Python-скрипты (scripts/) для тестов и CI — они запускаются только вручную или в GitHub Actions. Правило одно для любых скиллов: сначала прочитать, потом ставить.
- Откройте
SKILL.mdиreferences/прямо на GitHub и убедитесь, что содержимое вас устраивает. - Ставьте только выпуски со страницы Releases (аннотированные теги вида
vX.Y.Z), а не произвольное состояние ветки. - После распаковки убедитесь, что внутри лишь
SKILL.md,README.md,README.en.md,SECURITY.md,SECURITY.en.md,CHANGELOG.md,PERSONA.md,LICENSE,references/иscripts/— ничего исполняемого при установке. Каталогов.github/,research/иtests/в архиве нет: валидаторам, которым нужны корпуса и фикстуры, требуется полный клон репозитория.
1. Claude.ai (Веб-интерфейс)
- Откройте страницу Releases этого репозитория, выберите свежий выпуск и скачайте приложенный к нему архив
humanizer-ru.zip. Это собранный архив скилла — состав перечислен в шаге 0.Source code (zip), который GitHub добавляет к каждому выпуску, — полное дерево репозитория вместе с.github/,research/иtests/; он нужен только тем, кто собирается запускать валидаторы. - Зайдите в аккаунт Claude.ai и перейдите в Settings > Skills.
- Нажмите Upload skill и выберите скачанный архив.
Примечание. В
humanizer-ru.zipфайлSKILL.mdлежит в корне архива, поэтому переупаковка не нужна. Она может понадобиться, только если вы взялиSource code (zip): там всё вложено в папку видаhumanizer-ru-<номер версии>.
2. Организации (Enterprise & Team)
Администратор организации проверяет выпуск (см. шаг 0) и загружает его в общую библиотеку — скилл становится доступен всей команде.
3. API и локальные агенты (Claude Code)
Работаете через API (эндпоинт /v1/messages или аналоги) — передайте скилл параметром container.skills. Детали — в документации вашего клиента.
Локальная установка — с закреплением на теге выпуска, чтобы получить именно проверенное состояние:
mkdir -p ~/.claude/skills
git clone --branch v3.13.0 --depth 1 https://github.com/Vladimir-Human/humanizer-ru.git ~/.claude/skills/humanizer-ru
Или минимально — только карта скилла (без справочников references/; глубина проверки будет ниже):
mkdir -p ~/.claude/skills/humanizer-ru
cp SKILL.md ~/.claude/skills/humanizer-ru/
Если проверять каждый шаг вручную не нужно, быстрее поставить одной командой из каталога skills.sh — см. «Установка за 30 секунд» выше.
4. DeepSeek Harness (dsh)
dsh ищет скиллы в собственных каталогах. Проверено с dsh 0.1.0-rc.6. Это developer preview: ломающие изменения обещаны, поэтому для другой версии сверяйтесь с её документацией.
Глобальная установка (все проекты и агенты профиля):
mkdir -p ~/.agents/skills
git clone --branch v3.13.0 --depth 1 https://github.com/Vladimir-Human/humanizer-ru.git ~/.agents/skills/humanizer-ru
Второй способ — бандл из подкаталога dsh/. Его ставит менеджер плагинов, профиль создаётся при первом обращении, pnpm нужен на PATH:
dsh plugin --profile web add "github:Vladimir-Human/humanizer-ru#path:/dsh"
В бандле лежит копия SKILL.md и references/; гейт check_bundle_sync.py держит её равной источнику. Снять бандл: dsh plugin --profile web remove humanizer-ru-dsh.
Команда берёт ветку по умолчанию. Закрепить тег и подкаталог одной строкой не выходит: pnpm молча отбрасывает подкаталог, ставит репозиторий целиком обычной зависимостью и возвращает 0, а профиль остаётся без слоя. Проверено на dsh 0.1.0-rc.6.
Порядок поиска скилла в dsh (ближайший каталог побеждает): <проект>/.dsh/skills, <проект>/.agents/skills, ~/.dsh/skills, ~/.agents/skills. Каталог ~/.claude/skills dsh не сканирует: скилл, установленный туда по инструкции для Claude Code выше, в dsh не виден.
Использование
В Claude Code или другом агенте:
/humanizer-ru [вставьте текст]
Или напрямую:
Очеловечь этот текст: [ваш текст]
Что делает
Прогоняет русский текст по 38 паттернам машинного письма (25 базовых и 13 расширений для русского) и 39 проверяемым regex-маркерам классов A и B, затем убирает следы. Опирается на Wikipedia:Signs of AI writing и Википедия:Признаки сгенерированности текста.
С версии 2.3 SKILL.md — это карта с деревом решений. Полное описание паттернов и проверок лежит в подключаемых файлах references/.
С версии 3.8 мягкий слой стал счётным. scripts/scan_soft_signals.py находит кандидатов по четырём категориям признаков, считает каждый паттерн один раз на текст и применяет пороги дерева решений; жанровые исключения берутся из references/false-positives.md. Скрипт печатает цитаты и рекомендацию объёма правки, вердикта об авторстве не даёт — Главное правило остаётся за агентом. На человеческом контрольном корпусе скрипт молчит: единичные литературные тире и повторы отсекают жанровые исключения. На выводах русских моделей он находит кандидатов там, где regex-слой ничего не видит. Наружу идут только механические оси: снятие маркеров, чистота фактов, ложные правки (LEADERBOARD.md). Читаемость оценивает своя панель судей, но её числа мы держим при себе: панель односемейная, а позиционный шум описан в прогонах.
Архитектура
humanizer-ru/
├── SKILL.md # Карта, дерево решений, чек-лист
├── CHANGELOG.md # Полная история версий
├── LEADERBOARD.md # Механические оси: прогоны детекторов
├── PERSONA.md # Компактные правила живого диалога
├── README.md / README.en.md # Описание проекта (рус/англ)
├── SECURITY.md / SECURITY.en.md
├── CITATION.cff # Карточка цитирования
├── LICENSE # MIT
├── dsh/ # Бандл для DeepSeek Harness (вендор SKILL.md + references/)
├── CODE_OF_CONDUCT.md / CONTRIBUTING.md
├── docs/
│ └── FRAMEWORK.md # Публичная методология проверяемости
├── scripts/
│ ├── check_markers.py # Прогон regex-маркеров, режим --scan
│ ├── check_spec.py # Валидатор спецификации Agent Skills
│ ├── check_fixture_sources.py # Валидатор реестра источников
│ ├── count_style_markers.py # Счётчик стилевых нарушений
│ ├── check_docs.py # Согласованность документации
│ ├── check_examples.py # Гейт честности примеров До/После
│ ├── check_readme_parity.py # Паритет и правдивость витрины RU/EN
│ ├── check_own_style.py # Порог мягких признаков на свою прозу
│ ├── check_reference_maps.py # Карты разбитых справочников
│ ├── check_budget.py # Бюджет контекста по спецификации
│ ├── check_corpus.py # Регрессия корпусов валидации
│ ├── check_perf.py # Скорость выражений на большом входе
│ ├── check_release.py # Сборка и проверка релизного архива
│ ├── check_bundle_sync.py # Синхронность вендора бандла dsh/
│ ├── filemarks/ # Слой A/B и метаданные файлов (inspect/clean)
│ ├── scan_soft_signals.py # Счётчик мягких признаков
│ └── check_all.py # Весь релизный чек-лист одной командой
├── eval/
│ ├── run_eval.py # Нейтральный корпус для любого скилла
│ ├── blind_eval.py # Слепая парная оценка эффекта
│ ├── HOW-TO-RUN.md # Протокол прогона и границы метрик
│ ├── README.md # Карта eval и словарь метрик
│ ├── manifest.v1.json # Схема нейтрального корпуса
│ ├── runs/ # Парные прогоны (10 записей; см. runs/README.md)
│ └── results/ # Отчёты прогонов целиком, включая
│ # метрики не в пользу скилла
├── .github/workflows/ # CI: regex-check, self-scan, no-anglicisms,
│ # validators, docs-check, release-check
├── references/ # 11 справочников; два разбиты на части (16 файлов)
├── research/ # Протоколы, реестр, аудит и BACKLOG.md
└── tests/fixtures/ # Проверочные образцы
Содержательные паттерны
| # | Паттерн | Критичность |
|---|---|---|
| 1 | Усреднение — конкретика заменяется общими эпитетами «выдающийся», «титан» | высокая |
| 2 | Раздувание значимости — «ключевой момент в истории отрасли» | средняя |
| 3 | Перечисление СМИ — «цитировали NYT, BBC, Forbes» без контекста | средняя |
| 4 | Деепричастные хвосты — «символизируя... отражая...» | средняя |
| 5 | Рекламный язык — «жемчужина региона», «идеальное место» | средняя |
| 6 | Размытые эксперты — «эксперты считают» без источника | высокая |
| 7 | Вызовы и перспективы — «несмотря на трудности, продолжает процветать» | низкая |
| 8 | Канцелярит — «осуществлять деятельность» | средняя |
| 9 | Текст о тексте — описание статьи вместо предмета | средняя |
| 9a | Академические клише-заполнители — «актуальность темы обусловлена», «целью работы является» | средняя |
| 6a | Именованная псевдоатрибуция эпохи RAG — «критик подчеркнул непреходящее влияние» без опоры на источник | средняя |
Языковые паттерны
| # | Паттерн | Критичность |
|---|---|---|
| 10 | Машинная лексика — «безусловно, синергия, ландшафт, погрузиться» | высокая |
| 11 | Избегание «есть» — «представляет собой» вместо «это» | средняя |
| 12 | «Не только..., но и» — отрицательные параллелизмы | средняя |
| 13 | Правило трёх — принудительные тройки | высокая |
| 14 | Погоня за синонимами — «герой... протагонист... персонаж» | низкая |
| 15 | Ложные диапазоны — «от Большого взрыва до тёмной материи» | средняя |
| 15a | Нелогичные деепричастные обороты — «используя метод, результаты улучшаются» | средняя |
| 15b | Каскад смягчений — «возможно, в некоторых случаях, в зависимости от» | средняя |
| 15c | Связки-переходы и заключительные обороты-затычки — «Однако стоит отметить...», «В заключение хочется отметить...» | средняя |
| 15d | Резкая смена стилистики внутри одного текста | низкая |
| 15e | Семантический сдвиг через английское поле — «основание науки», «адресовать проблему» | средняя |
| 15f | Отсутствие идиоматики — длинный текст без единого живого оборота | низкая |
Структурные и стилевые паттерны
| # | Паттерн | Критичность |
|---|---|---|
| 16 | Избыток тире и жирного шрифта | высокая |
| 17 | Эмодзи-списки — 🚀 Скорость: ... | высокая |
| 18 | Кавычки — «лапки» вместо «ёлочек» | средняя |
| 19 | Избыточные таблицы — таблица на 2–3 строки вместо текста | высокая |
| 20 | Следы Markdown — **жирный**, #заголовки в обычном тексте | высокая |
| 21 | Нарушение иерархии заголовков — прыжок с H1 на H3 | высокая |
| 21a | Каждое Слово Заголовка С Прописной — «Ранняя Жизнь и Образование» | высокая |
| 21b | Раздел-пересказ в конце текста — «Вкратце», «Подводя итоги», дублирование уже сказанного | средняя |
Коммуникативные паттерны
| # | Паттерн | Критичность |
|---|---|---|
| 22 | Остатки реплик и шаблоны — «Надеюсь, это поможет!», [вставьте имя] | высокая |
| 23 | Оговорки о пределах знаний — «хотя конкретные детали ограничены...» | средняя |
| 23a | Заявление о недоступности информации со спекуляцией — «данные не публикуются, однако, вероятно...» | средняя |
| 24 | Льстивый тон — «Отличный вопрос!» | средняя |
| 24a | Псевдо-терапевтический регистр и имитация живости — «Ты не ошибаешься, что так чувствуешь», «Короткие. Точные. Отдельные.» | средняя |
| 25 | Общие позитивные выводы — «будущее выглядит светлым» | средняя |
| 25a | Обрыв на полуслове — текст кончается посреди предложения | средняя |
Отличия от английской версии
- Добавлен паттерн «канцелярит» («осуществлять деятельность», «в соответствии с»)
- Список машинной лексики адаптирован под русский язык
- Title Case наоборот: в английском заголовки из слов с прописной — норма, а не признак ИИ; в русском такая манера не применяется, и её перенос в русские заголовки сам стал признаком (паттерн #21a, высокая критичность, только в сочетании с другими признаками)
- Кавычки: «ёлочки» вместо „нижних лапок“
Безопасность
- Скилл только текстовый: не выполняет код, не обращается к сети и файловой системе, не собирает данные.
scripts/check_markers.pyзапускается лишь в CI и вручную разработчиком. - Текст пользователя скилл читает как данные: команды, спрятанные внутри, он не выполняет (раздел «Границы безопасности» в
SKILL.md). - Модель угроз, гарантии и порядок сообщения об уязвимостях — в SECURITY.md.
- Про красную плашку Snyk на витрине skills.sh. Автоматический аудит помечает скилл кодом E005 «подозрительная ссылка на скачивание». Срабатывание ложное: сканер видит идентификатор S3-бакета Perplexity
ppl-ai-file-upload— это документированная примета класса A, по которой скилл распознаёт машинную генерацию, — и принимает описание приметы за инструкцию скачать файл. Скилл ничего не скачивает: переход по ссылкам из проверяемого текста запрещён разделом «Границы безопасности» вSKILL.md. Тот же класс ложных срабатываний известен по наборам правил YARA и по тестовой строке EICAR: инструмент, который ищет признак, обязан этот признак содержать. Два других аудитора каталога дают PASS. Убрать примету ради вердикта мы не будем — это дыра в детекторе.
Regex-маркеры: классы A и B
39 регулярных выражений делятся на два класса. Класс A — жёсткие copy-paste-артефакты: служебные ссылки ChatGPT,
[cite: N]и span-метки Gemini, карточки цитат Grok, S3-ссылки Perplexity и остатки тегов рассуждений DeepSeek. Класс B — контекстные индикаторы: placeholder-URL и даты,referrer=grok.com, невидимые разделители цитат из области частного использования (U+E200–E204), короткая форма сноски (U+EA01/U+EA02вокруг цифры), символы нулевой ширины, невидимая раскладка (наборные пробелы, мягкий перенос, вариационные селекторы вне эмодзи) и имена сносок с внутренними идентификаторами (<ref name="0searchN">). B требует ручной проверки и не даёт самостоятельного вердикта.
У каждого маркера три фикстуры: прямая, отрицательная и граничная. Маркеры с доказательной цепочкой дополнительно проверяются по research/fixtures/marker-sources.json. Политика обновлений разделяет устойчивое ядро (правила и границы ложных срабатываний) и быстрый слой (модельные артефакты): быстрый слой меняем только с образцами и источником, класс A/B при этом сохраняется.
Полная запись доказательств — неизменяемая ссылка на источник, дата обращения, дословный образец, класс доказательства и fixture — есть у 37 из 39 маркеров. Остальные закрыты только фикстурами.
| Маркер | Источник | Регулярное выражение |
|---|---|---|
:contentReference[oaicite:N]{index=N} | OpenAI ChatGPT | :contentReference\[oaicite:\d+\]\{index=\d+\} |
oaicite:7 (усечённая форма метки) | OpenAI ChatGPT | oaicite:\d+ |
oai_citation:N‡ | OpenAI ChatGPT | oai_citation:\d+‡ |
attributableIndex в JSON | Внутреннее поле разметки JSON-ответов при использовании инструментов | \battributableIndex\b |
turn0search0 | OpenAI веб-поиск | turn\d+search\d+ |
turn0fetch0 | OpenAI загрузка страниц | turn\d+fetch\d+ |
<ref name="0search12"> | Контекстный след внутреннего инструмента в имени вики-сноски | <ref\b[^>]*\bname=["']\d+(?:search|fetch|file|image|news|video|ref)\d+["'] |
?utm_source=chatgpt.com | OpenAI ChatGPT | [?&]utm_source=chatgpt\.com |
?utm_source=openai | OpenAI API | [?&]utm_source=openai |
attached_file:// | OpenAI ChatGPT | attached_file:\/\/ |
grok_card:// | xAI Grok | grok_card:\/\/ |
vertexaisearch.cloud.google.com/grounding-api-redirect | Google Gemini | vertexaisearch\.cloud\.google\.com/grounding-api-redirect |
[^N^] | Microsoft Copilot | \[\^\d+\^\] |
【N†source】 | OpenAI Assistants | 【\d+(?::\d+)?†source】 |
citeturn0file0 | OpenAI ChatGPT (поток) | citeturn\d+[a-z]+\d+ |
turn0file2, fileciteturn0file2turn0file6 | OpenAI file_search | turn\d+file\d+ |
\]\(sandbox:/mnt/data/...\) | OpenAI ChatGPT (анализ данных) | \]\(sandbox:/mnt/data/ |
Невидимые символы U+E200–E204 | OpenAI ChatGPT (служебные разделители цитат) | [\ue200-\ue204] |
Короткая форма сноски: цифра в U+EA01/U+EA02 (новое в v3.2) | OpenAI ChatGPT | [\uea01\uea02] |
<think>…</think> | DeepSeek и другие рассуждающие модели | (?m)^\s*</?think>|</think>\s*$ |
Сцепка ISO+3ISO+3 | OpenAI ChatGPT (ошибка отрисовки сносок) | [A-Za-z\u0410-\u042f\u0430-\u044f\u0401\u0451)]\+\d+(?=[A-Z\u0410-\u042f\u0401][A-Za-z\u0410-\u042f\u0430-\u044f\u0401\u0451&.\-]*(?: [A-Z\u0410-\u042f\u0401][A-Za-z\u0410-\u042f\u0430-\u044f\u0401\u0451&.\-]*){0,3}\+\d) |
[cite_start] | Google Gemini (анализ PDF) | \[cite_start\] |
[cite: 8], [Cite: 12], [cite: 19, 20, 21] | Google Gemini (ссылка на фрагменты источника; расширено в v3.2) | \[[Cc]ite:\s?\d+(?:,\s?\d+)*\] |
[span_N] start_span / end_span (новое в v3.5) | Google Gemini (внутренние границы фрагментов) | \[span_\d+\][\[(](?:start_span|end_span)[\])] |
Символы нулевой ширины U+200B–U+200D, U+2060, U+FEFF | Внутренние разделители цитат и кодировочные артефакты; U+FEFF в начале файла — BOM, не ИИ | [\u200b\u200c\u2060\ufeff]|(?<![\U0001f000-\U0001faff\u2600-\u27bf\ufe0f\U0001f1e6-\U0001f1ff])\u200d(?![\U0001f000-\U0001faff\u2600-\u27bf\ufe0f\U0001f1e6-\U0001f1ff]) |
:::writing{variant="document" id="68427"} | Writing-разметка интерфейса; атрибуция версии не подтверждена evidence registry | :::\w+\{variant |
turn0image0, turn0news0, turn0video0, turn0ref0 | OpenAI ChatGPT (мультимедиа-инструменты) | turn\d+(?:image|news|video|ref)\d+ |
?utm_source=copilot.com | Microsoft Copilot | [?&]utm_source=copilot\.com |
?referrer=grok.com | xAI Grok | [?&]referrer=grok\.com |
<grok-card ... data-type="citation_card"> | xAI Grok (XML-тег карточки) | <grok-card\b[^>]*\bcitation_card\b |
grok_render_citation_card_json={...} | xAI Grok (JSON карточек) | grok_render_citation_card_json |
【85†L261-269】, 【854†L119-L123】 | DeepSeek и производные (ссылки на строки) | 【\d+†L\d+(?:-L?\d+)?】 |
[attached_file:N], [web:N] | Perplexity (скобочная форма ссылок, осень 2025) | \[(?:attached_file|web):\d+\] |
[citation:3] | Perplexity и другие поисковые ИИ | \[citation:\d+\] |
citegenerated-reference-identifier | ChatGPT (сгенерированный идентификатор) | citegenerated-reference-identifier |
INSERT_SOURCE_URL, URL_HERE, PASTE_*_URL_HERE | Placeholder-URL из шаблонных ответов | \b(?:INSERT_SOURCE_URL(?:_\d+)?|URL_HERE|PASTE_\w+_URL_HERE)\b |
2025-XX-XX, 2022-11-XX | Placeholder-даты из шаблонных ответов (чаще всего «дата обращения») | \b(?:19|20)\d{2}-(?:0[1-9]|1[0-2]|[Xx]{2})-[Xx]{2}\b |
ppl-ai-file-upload в URL (новое в v3.5) | Perplexity (ссылки на Amazon S3-bucket) | ppl-ai-file-upload |
Полный список с дословными образцами — в references/test-fixtures.md.
Подлог источников (новое в v2.3)
Отдельный класс проверок для текстов со ссылками: 404, DOI ведёт на чужую статью, несуществующий ISBN, автор умер до даты публикации, книжная ссылка без номера страниц. См. references/source-fabrication.md.
Границы ложного срабатывания (новое в v2.3)
Длинное тире у Цветаевой и Бродского, изогнутые кавычки от автозамены macOS, правило трёх в риторической прозе, канцелярит в юридическом документе — это не признаки ИИ. Скилл намеренно не исправляет такие случаи. См. references/false-positives.md.
Отпечатки моделей (новое в v2.3)
references/llm-fingerprints.md не ведёт каталог актуальных версий моделей. Он описывает уровни доказательств, воспроизводимые артефакты и локальные наблюдения с явными ограничениями атрибуции. Версию или доступность модели нельзя выводить из стилистического признака без первичного датированного источника. Там же собраны ручные мягкие сигналы русских моделей — GigaChat, Алисы и YandexGPT: они помечены как наблюдения без корпусного подтверждения, регулярных выражений для них нет.
Шкала критичности: высокая — мгновенно выдаёт ИИ · средняя — сильный сигнал · низкая — слабый сигнал
Источники
История изменений
Актуальная версия — на значке в начале страницы. Полную историю изменений смотрите в CHANGELOG.md и на странице GitHub Releases.
Лицензия
MIT