Vladimir-Human/humanizer-ru

Скилл для ИИ-агентов: находит и убирает следы машинной генерации из русского текста, не трогает живое и не дописывает факты. 56 паттернов, 40 regex-маркеров (реестр доказательств 38/40), ось «дельта детектируемости до/после» с FP-контролем, снятие меток C2PA/EXIF/XMP, пакет на PyPI и онлайн-демо

项目介绍Project Overview

humanizer-ru 是面向 AI 代理的 DSH 工具插件,用于识别并改写俄语文本中的机器生成痕迹。它内置 38 个模式与 39 条正则标记,覆盖类 A、类 B 两类信号并由 CI 校验。适用场景:清理俄语草稿中的 GPT 腔、模板化引用、占位日期等。需注意:它以自然改写为目标,并非规避检测器;不要将 SKILL.md 整段塞入聊天客户端系统提示。

humanizer-ru is a DSH tool plugin for AI agents that detects and rewrites machine-generated traces in Russian text. It ships 38 patterns and 39 regex markers across classes A and B, validated by CI. Use it to clean GPT-style phrasing, templated citations, and placeholder dates from Russian drafts. Note: it targets natural rewriting rather than detector evasion, and loading the full SKILL.md into a chat client's system prompt slows responses without improving tone.

或使用命令行安装(适合开发者)Or use CLI install (for developers)

命令行安装CLI Install

dsh plugin --profile web add "github:Vladimir-Human/humanizer-ru#path:/dsh"

Vladimir-Human/humanizer-ru 加入你的 DSH 配置(web profile)即可启用。

READMEREADME

Humanizer-ru — очеловечивание русского ИИ-текста

License: MIT GitHub stars Версия Regex checks Skills.sh

English version → README.en.md

Скилл для ИИ-агентов: находит и убирает следы машинной генерации в русскоязычном тексте. Переписывает «гпт-шный» текст по-человечески, не искажая смысла, и не трогает живое: ложное срабатывание здесь дороже пропуска.

Здесь 56 паттернов (25 базовых и 31 расширение) и 40 проверяемых regex-маркеров классов A и B; у 38 из них полная запись доказательств в реестре. Проверки гоняет CI. Каталог skills.sh сообщает об успешных проверках Gen Agent Trust Hub и Socket; про красную плашку Snyk — в разделе «Безопасность».

До:

🚀 Инновации: Мы добавили пакетную обработку, горячие клавиши и офлайн-режим. Это безусловно является свидетельством нашего стремления к качеству. Кроме того, эти функции обеспечивают бесшовный, интуитивно понятный и мощный пользовательский опыт — гарантируя эффективность. Эксперты считают, что это революция.

После:

Мы добавили пакетную обработку, горячие клавиши и офлайн-режим.

Скилл убирает штампы, но не дописывает факты за автора. В примере выше всё из варианта «После» уже было в исходнике.

Что ему давать

Дайте скиллу готовый фрагмент. Он найдёт следы генерации и по просьбе перепишет текст. SKILL.md — инструкция агента: её подгружают на задачу анализа или правки вместе с нужными справочниками из references/. PERSONA.md — другое: короткие правила живого тона для диалога, а не для проверки текста. Не кладите весь SKILL.md в системный промпт чат-клиента: это замедлит ответы, но не сделает разговор живее.

Одноимённые проекты — не путать

В GitHub есть другие репозитории с именем humanizer-ru, не связанные с этим проектом. Позиции у них разные:

Проект Фокус Позиция по детекторам
Vladimir-Human/humanizer-ru — этот проект Редактор русского текста: 56 паттернов, 40 regex-маркеров, слепые парные прогоны Снимает метки в тексте и файлах, которыми владеет пользователь (невидимые символы, статистические знаки, C2PA/EXIF/XMP; недетерминированные техники: best-effort; пиксельный SynthID: вне скоупа, см. removal-matrix), снижает статистические следы машинной генерации в тексте, которым владеет пользователь; снятие меток — открытая возможность продукта. Обход детекторов не заявляется как гарантия: публикуются только относительные дельты детектируемости до/после с контролем ложных срабатываний. Не портить живое и не дописывать факты — незыблемые принципы.
smixs/humanizer-ru Скилл «humanizer & detector»: правка и проверка одним инструментом; в лидерборде участвует его детерминированный линтер
ilyautov/humanizer-ru Скилл-гуманизатор: в тэглайне заявлена подгонка под метрики GPTZero, DivEye, RuBERT, FAQ даёт технику обхода Техника обхода — в их FAQ
blader/humanizer Англоязычный скилл того же жанра, опубликован на три дня раньше

Мы не аффилированы ни с одним из них. Декларация этого проекта: «снятие меток — открытая возможность продукта; обход детекторов не заявляется как гарантия»; рамка изложена в docs/FRAMEWORK.md, границы техник снятия — в references/removal-matrix.md.

Установка за 30 секунд

npx skills add https://github.com/vladimir-human/humanizer-ru --skill humanizer-ru

Если нужен не скилл для агента, а обычная команда в терминале — пакет ставится из PyPI:

pip install humanizer-ru

Установщик команды npx skills add предложит выбрать агентов: 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. Правило одно для любых скиллов: сначала прочитать, потом ставить.

  1. Откройте SKILL.md и references/ прямо на GitHub и убедитесь, что содержимое вас устраивает.
  2. Ставьте только выпуски со страницы Releases (аннотированные теги вида vX.Y.Z), а не произвольное состояние ветки.
  3. После распаковки убедитесь, что внутри лишь текстовые файлы и манифесты: SKILL.md, оба README, CHANGELOG.md, PERSONA.md, обе SECURITY, PRIVACY_POLICY.md, LICENSE, gemini-extension.json, references/, scripts/, knowledge/ и каталоги плагин-манифестов (.claude-plugin/, .codex-plugin/, .cursor-plugin/, agents/, commands/) — ничего исполняемого при установке. Каталогов .github/, research/ и tests/ в архиве нет: валидаторам, которым нужны корпуса и фикстуры, требуется полный клон репозитория.

1. Claude.ai (Веб-интерфейс)

  1. Откройте страницу Releases этого репозитория, выберите свежий выпуск и скачайте приложенный к нему архив humanizer-ru.zip. Это собранный архив скилла — состав перечислен в шаге 0. Source code (zip), который GitHub добавляет к каждому выпуску, — полное дерево репозитория вместе с .github/, research/ и tests/; он нужен только тем, кто собирается запускать валидаторы.
  2. Зайдите в аккаунт Claude.ai и перейдите в Settings > Skills.
  3. Нажмите 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.15.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 и 0.1.0-rc.8 (CI держит rc.8). Это developer preview: ломающие изменения обещаны, поэтому для другой версии сверяйтесь с её документацией.

Глобальная установка (все проекты и агенты профиля):

mkdir -p ~/.agents/skills
git clone --branch v3.15.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/ и knowledge/; гейт check_bundle_sync.py держит её равной источнику. Снять бандл: dsh plugin --profile web remove humanizer-ru-dsh.

Команда установки (add) берёт ветку по умолчанию. Закрепить тег и подкаталог одной строкой не выходит: 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 или другом агенте:

/humanize [вставьте текст]

Проверить без правки:

/audit [вставьте текст]

Или напрямую:

Очеловечь этот текст: [ваш текст]

CI-гейт для своих репозиториев

Репозиторий поставляет переиспользуемый composite action в каталоге action/. Он гоняет по вашим файлам ровно те же скрипты, что и CI этого проекта, — на Python со стандартной библиотекой, без внешних сервисов и без передачи текста куда-либо за пределы раннера GitHub Actions. Для работы нужен только permissions: contents: read (действие выполняет checkout и читает файлы).

Минимальный workflow в вашем репозитории, например .github/workflows/humanizer.yml:

name: humanizer-ru

on:
  push:
    paths: ['content/**/*.md', 'docs/**/*.md']
  pull_request:
    paths: ['content/**/*.md', 'docs/**/*.md']
  workflow_dispatch:

permissions:
  contents: read

jobs:
  humanizer:
    name: Следы машинной генерации
    runs-on: ubuntu-latest
    timeout-minutes: 10
    steps:
      - uses: Vladimir-Human/humanizer-ru/action@v3.15.0
        with:
          files: 'content/**/*.md docs/**/*.md'   # bash-глоб(ы)
          genre: neutral                          # для режима soft-threshold
          fail-on: class-a                        # или soft-threshold
          ref: ''                                 # checkout вашего репозитория (пусто — HEAD)

Входы action:

Вход По умолчанию Что делает
files **/*.md Файлы для проверки: один bash-глоб или несколько через пробел. Внутри действие включает globstar и nullglob, поэтому **/*.md заходит в подкаталоги.
genre neutral Жанр для мягких признаков: neutral, fiction, legal, academic, marketing, chat. Используется только при fail-on: soft-threshold.
fail-on class-a class-a — жёсткий regex-слой (check_markers.py --scan --class a: падает только класс A; контекстные маркеры класса B печатаются предупреждениями и вердикта не дают); soft-threshold — счётчик мягких признаков (scan_soft_signals.py --fail-multicat 3).
ref пусто Ref вашего репозитория для checkout. Пусто — текущий HEAD (для pull_request — merge-коммит по умолчанию).

Версия action закрепляется не входом ref, а строкой uses: Vladimir-Human/humanizer-ru/action@v3.15.0. Вход ref управляет тем, какое состояние проверяемого репозитория сканируется.

Ограничения и политика безопасности:

  • permissions: contents: read; действие ничего не публикует и не комментирует.
  • Текст не покидает раннер: скрипты из action/../scripts запускаются локально и не открывают сеть.
  • Внутри только python3 стандартной библиотеки и официальный actions/checkout (закреплён по SHA).

Что выбрать для гейта:

  • class-a — конвейерный минимум: ловите служебные ссылки и артефакты из интерфейсов (ppl-ai-file-upload, [citation:3], невидимые разделители и т.п.). Совпадение — повод снять маркер или проверить происхождение.
  • soft-threshold — лингвистическая сигнализация: --fail-multicat 3 роняет гейт, когда в тексте 3 и более мягких признаков из 2 и более категорий. Одного-двух не хватает: скрипт специально считает паттерны консервативно, вердикт об авторстве не выносит. Пороги действуют до валидации на репрезентативном корпусе; свип порогов — в research/soft-threshold-sweep/.

Демо regex-слоя: онлайн или demo/index.html офлайн — текст не отправляется на сервер.

Что делает

Прогоняет русский текст по 56 паттернам машинного письма (25 базовых и 31 расширение для русского) и 40 проверяемым regex-маркерам классов A и B, затем убирает следы. Опирается на Wikipedia:Signs of AI writing и Википедия:Признаки сгенерированности текста.

С версии 2.3 SKILL.md — это карта с деревом решений. Полное описание паттернов и проверок лежит в подключаемых файлах references/.

С версии 3.8 мягкий слой стал счётным. scripts/scan_soft_signals.py находит кандидатов по четырём категориям признаков, считает каждый паттерн один раз на текст и применяет пороги дерева решений; жанровые исключения берутся из references/false-positives.md. Скрипт печатает цитаты и рекомендацию объёма правки, вердикта об авторстве не даёт — Главное правило остаётся за агентом. Поведение на человеческом контрольном корпусе проверяемо: ни один из 26 человеческих текстов не копит сигналы в 2+ категориях (гейт --max-cats 1 в check_all); одиночные литературные тире и тройки классиков остаются в одной категории и гейт не роняют. На выводах русских моделей он находит кандидатов там, где regex-слой ничего не видит. Наружу идут только механические оси: снятие маркеров, чистота фактов, ложные правки (LEADERBOARD.md). Читаемость оценивает своя панель судей, но её числа мы держим при себе: панель односемейная, а позиционный шум описан в прогонах.

Доли «0 из N» публикуются с доверительным интервалом: 0 ложных срабатываний на 11 человеческих текстах — наблюдение 0/11, а не гарантированный ноль: Wilson 95% CI равен [0%; 25.9%]. Интервалы пересчитывает и сверяет scripts/check_confidence.py.

Архитектура

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/ + knowledge/)
├── GOVERNANCE.md              # Роли, права выпуска, dormant-политика
├── CODE_OF_CONDUCT.md / CONTRIBUTING.md
├── PRIVACY_POLICY.md           # Короткая политика приватности
├── AGENTS.md                    # Карта репозитория для агентов-редакторов
├── gemini-extension.json        # Манифест Gemini CLI
├── .claude-plugin/              # Манифест Claude
├── .codex-plugin/               # Манифест Codex
├── .cursor-plugin/              # Манифест Cursor
├── agents/                      # Декларация агента OpenAI
├── commands/                    # Слэш-команды /humanize и /audit
├── knowledge/                   # Журнал фидбека владельца
├── docs/
│   └── FRAMEWORK.md            # Публичная методология проверяемости
├── scripts/
│   ├── check_markers.py          # Прогон regex-маркеров, режим --scan
│   ├── check_removal_parity.py  # Паритет «снятие ↔ детектор» новых способностей снятия
│   ├── check_self_prose.py      # Самоприменение: витринная проза ниже порога мягкого слоя
│   ├── check_spec.py             # Валидатор спецификации Agent Skills
│   ├── check_fixture_sources.py  # Валидатор реестра источников
│   ├── check_link_rot.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_adversarial.py      # Гейт adversarial-FP корпуса
│   ├── check_perf.py             # Скорость выражений на большом входе
│   ├── check_release.py          # Сборка и проверка релизного архива
│   ├── check_bundle_sync.py      # Синхронность вендора бандла dsh/
│   ├── check_pkg_sync.py         # Синхронность PyPI-пакета с корневыми скриптами
│   ├── export_markers.py         # Генератор machine-readable реестра markers.v1.json
│   ├── check_markers_export.py   # Гейт синхронности markers.v1.json
│   ├── filemarks/                # Слой A/B и метаданные файлов (inspect/clean)
│   ├── scan_soft_signals.py      # Счётчик мягких признаков
│   ├── check_json_output.py     # UTF-8 машиночитаемого stdout
│   ├── check_confidence.py       # Wilson CI для долей лидерборда
│   ├── threshold_sweep.py        # Свип порогов мягкого слоя
│   └── check_all.py              # Весь релизный чек-лист одной командой
├── eval/
│   ├── run_eval.py               # Нейтральный корпус для любого скилла
│   ├── blind_eval.py             # Слепая парная оценка эффекта
│   ├── HOW-TO-RUN.md             # Протокол прогона и границы метрик
│   ├── README.md                 # Карта eval и словарь метрик
│   ├── manifest.v1.json          # Схема нейтрального корпуса
│   ├── detect_eval.py            # Детектор-харнес «до/после»
│   ├── detectors/                # Адаптеры детекторов (контракт 0..1)
│   ├── run_triggers.py           # Гейт триггеров запуска скилла
│   ├── scenarios/                # Сценарные эвалы «не портить живое»
│   ├── ainl_calibration.py       # Калибровка на AINL-корпусе
│   ├── detect-results/           # JSON детекторных прогонов оси
│   ├── runs/                     # Парные прогоны (12 записей; см. runs/README.md)
│   └── results/                  # Отчёты прогонов целиком, включая
│                                 #   метрики не в пользу скилла
├── .github/workflows/        # CI: regex-check, self-scan, no-anglicisms,
│                             #     validators, docs-check, release-check
├── references/               # 12 справочников; два разбиты на части (17 файлов)
├── research/                 # Протоколы, реестр, аудит и BACKLOG.md
└── tests/fixtures/           # Проверочные образцы

Полный чек-лист — одна команда: python scripts/check_all.py — 53 гейта полного чек-листа (49 в --quick). Юнит-тесты — python -m unittest discover -s tests.

Содержательные паттерны

Шкала критичности: высокая — мгновенно выдаёт ИИ · средняя — сильный сигнал · низкая — слабый сигнал

# Паттерн Критичность
1 Усреднение — конкретика заменяется общими эпитетами «выдающийся», «титан» высокая
2 Раздувание значимости — «ключевой момент в истории отрасли» средняя
3 Перечисление СМИ — «цитировали NYT, BBC, Forbes» без контекста средняя
4 Деепричастные хвосты — «символизируя... отражая...» средняя
5 Рекламный язык — «жемчужина региона», «идеальное место» средняя
6 Размытые эксперты — «эксперты считают» без источника высокая
7 Вызовы и перспективы — «несмотря на трудности, продолжает процветать» низкая
8 Канцелярит — «осуществлять деятельность» средняя
9 Текст о тексте — описание статьи вместо предмета средняя
9a Академические клише-заполнители — «актуальность темы обусловлена», «целью работы является» средняя
6a Именованная псевдоатрибуция эпохи RAG — «критик подчеркнул непреходящее влияние» без опоры на источник средняя
6b Неодушевлённый субъект с глаголом намерения — «в исследовании рассматривается», «текст не стремится» средняя
6c Пустые открытия — «не секрет, что», «как известно» перед трюизмом средняя
6d Анонсы вместо дела — «в этой статье мы рассмотрим», «вы узнаете» средняя
6e Псевдоглубина — «вот что все упускают», «настоящий вопрос в том» средняя

Языковые паттерны

# Паттерн Критичность
10 Машинная лексика — «безусловно, синергия, ландшафт, погрузиться» высокая
11 Избегание «есть» — «представляет собой» вместо «это» средняя
12 «Не только..., но и» — отрицательные параллелизмы средняя
13 Правило трёх — принудительные тройки высокая
14 Погоня за синонимами — «герой... протагонист... персонаж» низкая
15 Ложные диапазоны — «от Большого взрыва до тёмной материи» средняя
15a Нелогичные деепричастные обороты — «используя метод, результаты улучшаются» средняя
15b Каскад смягчений — «возможно, в некоторых случаях, в зависимости от» средняя
15c Связки-переходы и заключительные обороты-затычки — «Однако стоит отметить...», «В заключение хочется отметить...» средняя
15d Резкая смена стилистики внутри одного текста низкая
15e Семантический сдвиг через английское поле — «основание науки», «адресовать проблему» средняя
15f Отсутствие идиоматики — длинный текст без единого живого оборота низкая
15g Пунктуационные кальки с английского — «Мир, где…», «Представь: …» средняя
15h Мат-знаки в прозе — «=», «±», «≥» вместо слов средняя
15i Повтор глагола в соседних предложениях — «говорит… говорит» средняя
15j Модальная неопределённость — «может стать», «призван решить» вместо факта средняя
15k Формулы-афоризмы — «X — новая валюта Y» средняя
15l Фальшивая доверительность — «честно?», «вот в чём штука» средняя
15m Двоеточия-подводки — «самое интересное:» средняя
15n Псевдо-сократика — «Зачем? Потому что.» средняя

Структурные и стилевые паттерны

# Паттерн Критичность
16 Избыток тире и жирного шрифта высокая
17 Эмодзи-списки — 🚀 Скорость: ... высокая
18 Кавычки — «лапки» вместо «ёлочек» средняя
19 Избыточные таблицы — таблица на 2–3 строки вместо текста высокая
20 Следы Markdown — **жирный**, #заголовки в обычном тексте высокая
21 Нарушение иерархии заголовков — прыжок с H1 на H3 высокая
21a Каждое Слово Заголовка С Прописной — «Ранняя Жизнь и Образование» высокая
21b Раздел-пересказ в конце текста — «Вкратце», «Подводя итоги», дублирование уже сказанного средняя
21c Заголовок-пересказ в первой строке — первая фраза повторяет заголовок средняя
21d Стопка абзацев без связок — три абзаца подряд с нового тезиса без связей средняя

Коммуникативные паттерны

# Паттерн Критичность
22 Остатки реплик и шаблоны — «Надеюсь, это поможет!», [вставьте имя] высокая
23 Оговорки о пределах знаний — «хотя конкретные детали ограничены...» средняя
23a Заявление о недоступности информации со спекуляцией — «данные не публикуются, однако, вероятно...» средняя
24 Льстивый тон — «Отличный вопрос!» средняя
24a Псевдо-терапевтический регистр и имитация живости — «Ты не ошибаешься, что так чувствуешь», «Короткие. Точные. Отдельные.» средняя
24b Самомаркировка честности — «без воды», «скажу без прикрас» средняя
24c Триада-отрицание — «Не реклама. Не манипуляция. Просто факты.» средняя
24d Возражения-фантомы — «кто-то скажет, что…» без оппонента средняя
24e Ложные альтернативы — «дело не в X, а в Y» на клише-парах средняя
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

40 регулярных выражений делятся на два класса. Класс 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 — есть у 38 из 40 маркеров. Остальные закрыты только фикстурами.

Маркер Источник Регулярное выражение
: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+\][\[(](https://github.com/Vladimir-Human/humanizer-ru/blob/HEAD/?:start_span|end_span)[\])]
:::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
Символы нулевой ширины U+200BU+200D, биди-контролы U+202AU+202E/U+2066U+2069, невидимые операторы U+2061U+2064, межстрочные аннотации U+FFF9U+FFFB (класс B, v3.11) Скрытая разметка в тексте из интерфейсов; U+200D внутри эмодзи-последовательностей исключён guard-ом [\u200b\u200c\u200e\u200f\u202a-\u202e\u2060-\u2064\u2066-\u2069\ufeff\ufff9-\ufffb]|(?<![\U0001f000-\U0001faff\u2600-\u27bf\ufe0f\U0001f1e6-\U0001f1ff])\u200d(?![\U0001f000-\U0001faff\u2600-\u27bf\ufe0f\U0001f1e6-\U0001f1ff])
Невидимая раскладка: мягкий перенос U+00AD, пробелы U+1680/U+205F/U+3000, вариационные селекторы вне эмодзи (класс B, v3.11) Невидимые метки раскладки; наборные пробелы U+2000U+200A исключены как легитимные в оцифрованных классиках \u00ad|[\u1680\u205f\u3000]|(?<![\U0001f000-\U0001faff\u2600-\u27bf\U0001f1e6-\U0001f1ff])[\ufe00-\ufe0f](https://github.com/Vladimir-Human/humanizer-ru/blob/HEAD/?![\U0001f000-\U0001faff\u2600-\u27bf\U0001f1e6-\U0001f1ff])
Скрытая ASCII-нагрузка в блоке Tags U+E0000U+E007F (класс B, v3.15) Стеганографические водяные знаки (SteganoPrompt, arXiv:2605.16336): chr(0xE0000+ord(c)), переживает копипаст; флаги-эмодзи исключены guard-ом (?<![\U0001f3f4\U0001f3f3\ufe0f\U000e0000-\U000e007f])[\U000e0000-\U000e007f]

Полный список с дословными образцами — в 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

上一个 Prev xskill 下一个 Next dsh-evolve-modes