Metadata-Version: 2.4
Name: humanizer-ru
Version: 3.14.0
Summary: CLI-сканеры следов машинной генерации русского текста (только stdlib)
Author: Vladimir-Human
License-Expression: MIT
Project-URL: Repository, https://github.com/Vladimir-Human/humanizer-ru
Project-URL: Tracker, https://github.com/Vladimir-Human/humanizer-ru/issues
Project-URL: Releases, https://github.com/Vladimir-Human/humanizer-ru/releases
Keywords: russian,ai-text,ai-detection,humanizer,claude-code,agent-skills,codex,cursor,dsh
Classifier: Development Status :: 4 - Beta
Classifier: Environment :: Console
Classifier: Intended Audience :: Developers
Classifier: Natural Language :: Russian
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Text Processing :: Linguistic
Classifier: Topic :: Software Development :: Quality Assurance
Requires-Python: >=3.9
Description-Content-Type: text/markdown
License-File: LICENSE
Dynamic: license-file

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

[![License: MIT](https://img.shields.io/github/license/Vladimir-Human/humanizer-ru)](LICENSE)
[![GitHub stars](https://badgen.net/github/stars/Vladimir-Human/humanizer-ru)](https://github.com/Vladimir-Human/humanizer-ru/stargazers)
[![Версия](https://img.shields.io/github/v/release/Vladimir-Human/humanizer-ru?label=%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D1%8F&color=blue)](https://github.com/Vladimir-Human/humanizer-ru/releases)
[![Regex checks](https://github.com/Vladimir-Human/humanizer-ru/actions/workflows/regex-check.yml/badge.svg)](https://github.com/Vladimir-Human/humanizer-ru/actions/workflows/regex-check.yml)
[![Skills.sh](https://img.shields.io/badge/skills.sh-%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3-blueviolet)](https://skills.sh/vladimir-human/humanizer-ru/humanizer-ru)

**[English version → README.en.md](README.en.md)**

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

Здесь 38 паттернов (25 базовых и 13 расширений) и 39 проверяемых regex-маркеров классов A и B. Проверки гоняет CI. Каталог [skills.sh](https://skills.sh/vladimir-human/humanizer-ru/humanizer-ru) сообщает об успешных проверках Gen Agent Trust Hub и Socket; про красную плашку Snyk — в разделе «Безопасность».

**До:**

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

**После:**

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

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

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

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

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

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

| Проект | Фокус | Позиция по детекторам |
|---|---|---|
| [Vladimir-Human/humanizer-ru](https://github.com/Vladimir-Human/humanizer-ru) — этот проект | Редактор русского текста: 38 паттернов, 39 regex-маркеров с реестром доказательств 37/39, 43 CI-гейта, слепые парные прогоны | Детекторы не обходим и текст под них не подгоняем; цель — естественный текст, а не зелёный вердикт детектора |
| [smixs/humanizer-ru](https://github.com/smixs/humanizer-ru) | Скилл «humanizer & detector»: правка и проверка одним инструментом | — |
| [ilyautov/humanizer-ru](https://github.com/ilyautov/humanizer-ru) | Скилл-гуманизатор; в описании заявлена подгонка под то, что меряют GPTZero, DivEye, RuBERT (perplexity и burstiness) | Обход детекторов заявлен открыто в описании |
| [blader/humanizer](https://github.com/blader/humanizer) | Англоязычный скилл того же жанра, опубликован на три дня раньше | — |

Мы не аффилированы ни с одним из них. Декларация этого проекта: «не
средство обхода детекторов»; подробнее — в разделе «Безопасность».

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

```sh
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. Правило одно для любых скиллов: **сначала прочитать, потом ставить**.

1. Откройте `SKILL.md` и `references/` прямо на GitHub и убедитесь, что содержимое вас устраивает.
2. Ставьте только выпуски со страницы **Releases** (аннотированные теги вида `vX.Y.Z`), а не произвольное состояние ветки.
3. После распаковки убедитесь, что внутри лишь `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 (Веб-интерфейс)

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. Детали — в документации вашего клиента.

Локальная установка — с закреплением на теге выпуска, чтобы получить именно проверенное состояние:

```sh
mkdir -p ~/.claude/skills
git clone --branch v3.14.0 --depth 1 https://github.com/Vladimir-Human/humanizer-ru.git ~/.claude/skills/humanizer-ru
```

Или минимально — только карта скилла (без справочников `references/`; глубина проверки будет ниже):

```sh
mkdir -p ~/.claude/skills/humanizer-ru
cp SKILL.md ~/.claude/skills/humanizer-ru/
```

Если проверять каждый шаг вручную не нужно, быстрее поставить одной командой из каталога [skills.sh](https://skills.sh/vladimir-human/humanizer-ru/humanizer-ru) — см. «Установка за 30 секунд» выше.

### 4. DeepSeek Harness (dsh)

dsh ищет скиллы в собственных каталогах. Проверено с dsh 0.1.0-rc.6. Это developer preview: ломающие изменения обещаны, поэтому для другой версии сверяйтесь с её документацией.

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

```sh
mkdir -p ~/.agents/skills
git clone --branch v3.14.0 --depth 1 https://github.com/Vladimir-Human/humanizer-ru.git ~/.agents/skills/humanizer-ru
```

Второй способ — бандл из подкаталога `dsh/`. Его ставит менеджер плагинов, профиль создаётся при первом обращении, `pnpm` нужен на PATH:

```sh
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 или другом агенте:

```text
/humanizer-ru [вставьте текст]
```

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

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

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

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

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

```yaml
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.14.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`, любой маркер = код возврата 1); `soft-threshold` — счётчик мягких признаков (`scan_soft_signals.py --fail-at 3`). |
| `ref` | пусто | Ref вашего репозитория для checkout. Пусто — текущий HEAD (для pull_request — merge-коммит по умолчанию). |

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

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

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

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

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

Демо regex-слоя: [онлайн](https://vladimir-human.github.io/humanizer-ru/) или [demo/index.html](demo/index.html) офлайн — текст не отправляется на сервер.

## Что делает

Прогоняет русский текст по 38 паттернам машинного письма (25 базовых и 13 расширений для русского) и 39 проверяемым regex-маркерам классов A и B, затем убирает следы. Опирается на [Wikipedia:Signs of AI writing](https://en.wikipedia.org/wiki/Wikipedia:Signs_of_AI_writing) и [Википедия:Признаки сгенерированности текста](https://ru.wikipedia.org/wiki/%D0%92%D0%B8%D0%BA%D0%B8%D0%BF%D0%B5%D0%B4%D0%B8%D1%8F%3A%D0%9F%D1%80%D0%B8%D0%B7%D0%BD%D0%B0%D0%BA%D0%B8_%D1%81%D0%B3%D0%B5%D0%BD%D0%B5%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%B0).

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

С версии 3.8 мягкий слой стал счётным. `scripts/scan_soft_signals.py` находит кандидатов по четырём категориям признаков, считает каждый паттерн один раз на текст и применяет пороги дерева решений; жанровые исключения берутся из `references/false-positives.md`. Скрипт печатает цитаты и рекомендацию объёма правки, вердикта об авторстве не даёт — Главное правило остаётся за агентом. На человеческом контрольном корпусе скрипт молчит: единичные литературные тире и повторы отсекают жанровые исключения. На выводах русских моделей он находит кандидатов там, где regex-слой ничего не видит. Наружу идут только механические оси: снятие маркеров, чистота фактов, ложные правки ([LEADERBOARD.md](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/)
├── GOVERNANCE.md              # Роли, права выпуска, dormant-политика
├── CODE_OF_CONDUCT.md / CONTRIBUTING.md
├── docs/
│   └── FRAMEWORK.md            # Публичная методология проверяемости
├── scripts/
│   ├── check_markers.py          # Прогон regex-маркеров, режим --scan
│   ├── 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          # Схема нейтрального корпуса
│   ├── 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](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: они помечены как наблюдения без корпусного подтверждения, регулярных выражений для них нет.

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


## Источники

- [Wikipedia:Signs of AI writing](https://en.wikipedia.org/wiki/Wikipedia:Signs_of_AI_writing)
- [Википедия:Признаки сгенерированности текста](https://ru.wikipedia.org/wiki/%D0%92%D0%B8%D0%BA%D0%B8%D0%BF%D0%B5%D0%B4%D0%B8%D1%8F%3A%D0%9F%D1%80%D0%B8%D0%B7%D0%BD%D0%B0%D0%BA%D0%B8_%D1%81%D0%B3%D0%B5%D0%BD%D0%B5%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%B0)
- [WikiProject AI Cleanup](https://en.wikipedia.org/wiki/Wikipedia:WikiProject_AI_Cleanup)

## История изменений

Актуальная версия — на значке в начале страницы. Полную историю изменений
смотрите в [CHANGELOG.md](CHANGELOG.md) и на странице
[GitHub Releases](https://github.com/Vladimir-Human/humanizer-ru/releases).

## Лицензия

MIT
