Skip to content

Repository files navigation

Humanizer RU

Этот skill разработан в рамках проекта VibeCoding1C для подписчиков Telegram-канала It Does Matter.

Редактор русского текста после нейросети. Убирает канцелярит, пустые зачины и выводы, рекламную накачку и обёртки чат-бота — чтобы текст было легко читать. Факты, термины и позицию автора не трогает. За обходом ИИ-детекторов не гонится: мерило — читатель, а не GPTZero.

По умолчанию говорит на разговорном ИТ-языке и знает терминологию 1С: «проведение документа» и «регламентное задание» канцеляритом не считает. Калиброван на живых статьях с Хабра: вводные, усилители, ирония и «не только… но и» — голос автора, а не дефект.

Две части:

  • Линтер humanizer_ru — Python, без зависимостей. Находит дефекты, считает ритм, выдаёт оценку 0–100. Годится как гейт в CI.
  • Скилл skills/humanizer-ru/ — инструкция для LLM-агента (Claude Code, Codex, Cursor, любой чат), который правит по находкам и каталогу паттернов.

Правилами текст не переписать — это делает модель. Линтер подсвечивает и проверяет результат.

Установка skill из GitHub

Отправьте агенту одну фразу:

Установи skill по ссылке https://github.com/comol/Humanizer_RU глобально для себя и проверь, что humanizer-ru доступен.

Агент установит стандартный Agent Skill одной командой:

npx skills add comol/Humanizer_RU --skill humanizer-ru --global --yes

Команда работает через открытый Skills CLI: он сам определяет поддерживаемые агенты и размещает skill в их каталогах. Для установки только в текущий проект уберите --global. Python-пакет ставить не обязательно: сам редактор работает по SKILL.md; линтер запускается агентом отдельно, когда доступны Python 3.10+ и uv.

Быстрый старт

# из корня репозитория, установка не обязательна
python -m humanizer_ru lint статья.md
python -m humanizer_ru lint статья.md --genre article --json
python -m humanizer_ru brief статья.md --output prompt.md              # промпт для любой LLM
python -m humanizer_ru brief статья.md --genre article --voice skills\humanizer-ru\knowledge\voice-author.md
python -m humanizer_ru selftest
python tests\run_tests.py

Если на проверку отдаёте ответ агента целиком (текст, ---, «что изменено»), добавьте --first-block: линтер возьмёт только чистовик до разделителя, иначе он найдёт цитаты «до» в резюме.

Или поставить:

pip install -e .            # появится команда humanizer-ru
pip install -e .[morph]     # + pymorphy3: цепочки родительных, сущ./глаг.

Пример вывода:

ОЦЕНКА: 30/100 → переписать   (≥85 чисто · 60–84 точечная правка · <60 переписать)
   -40  пустышки и штампы: 12 (9.4/100 слов)
   -19  канцелярит и сигналы: 5 (3.9/100 слов)
   -11  ровный ритм (CV=0.246)

ПУСТЫШКИ И ШТАМПЫ — убирать (12):
  стр. 1   [intro-empty] «В современном мире» автоматизация тестирования игра…
           → Начать с факта, действия или проблемы читателя.

Живой текст с тире, списками и терминами получает 85–100: 16 статей с Хабра в --genre article дают 78–100 без единой ошибки (корпус в tests/fixtures/human/habr/). Если живой текст получает меньше 70 — это баг линтера, заводите кейс в tests/fixtures/evals.json. На фрагментах короче ~50 слов оценка скачет (плотность считается на 100 слов) — смотрите на находки, а не на число.

Жанр решает: фрагмент ТЗ из корпуса в --genre spec получает 100, в auto — 79. Канцелярит в ТЗ — язык жанра, а не дефект.

Команды

Команда Что делает
lint ФАЙЛ [--genre Ж] [--json] [--fail-below N] находки по уровням, метрики, оценка; код возврата 1 при ошибках или оценке ниже N
analyze ФАЙЛ [--mode careful|deep] то же в JSON плюс редакторский чек-лист
brief ФАЙЛ [--voice голос.md] [--output prompt.md] инструкция + находки + текст одним промптом для LLM; --voice добавляет паспорт голоса автора
selftest 60 встроенных проверок правил
genres жанры и что каждый снимает

Вместо файла — - для stdin.

Жанр меняет правила

humanizer-ru lint инструкция.md --genre doc     # повтор «нажмите», списки — норма
humanizer-ru lint тз.md --genre spec            # канцелярит и пассив — язык жанра
humanizer-ru lint пост.txt --genre post         # эмодзи и жаргон — формат площадки

Жанры: auto, doc, article, post, letter, spec, legal, academic, fiction.

Уровни находок

  • error — артефакты копипаста из чат-бота (turn0search3, utm_source=chatgpt.com), «Конечно! Вот текст», «Надеюсь, это поможет», заглушки [укажите сумму], обрыв на предлоге или запятой. Гейт не пройден.
  • high — «в современном мире» в начале фразы, «важно отметить», «играет ключевую роль», «подводя итог», «эксперты считают», «не просто X, а Y». Убирать.
  • low — «осуществлять», «данный запрос», «представляет собой», пассив «нами было реализовано», рекламные оценки, кальки, ровный ритм, стены текста; -weak-коды по контексту: «давайте посмотрим» (announce-weak), «нужно понимать, что» (transition-weak). Смотреть кластерами.
  • note — усилители, заполнители «по сути» (filler), много жирного, повтор глагола, много тире, нет точки в конце (unfinished). На усмотрение автора — у живого текста это чаще голос.

��его линтер не делает намеренно: не запрещает тире, вопросы, двоеточия, списки, «не только… но и», «в данном случае», формальный регистр, вводные и усилители автора. Это не дефекты читаемости.

Что нового в 0.3.0

Линтер прогнали по 16 статьям владельца с Хабра (2022–2026, 20 тысяч слов). До калибровки живые статьи получали 34–94 и три ложных «обрыва»; после — 78–100 без ошибок. Что изменилось:

  • Голос ≠ дефект. «По сути», «собственно», «в любом случае» — filler уровня note; «не только… но и» не помечается; «в данном случае», «на данный момент» исключены из bureau-word; «из уникального» — не реклама; «прекрасная мысль попробовать» — не похвала чат-бота; «в современном мире» внутри фразы — не зачин.
  • Контекст решает. «Давайте посмотрим» → announce-weak, «нужно понимать, что» → transition-weak (low, а не high); «Итак, приступим» и «В итоге,» больше не «пустой вывод».
  • Разметка Хабра. Строки-ярлыки «Задача 2:», «Kiro» не считаются парцелляцией; реплики «— …» — цитата; экспорт без пустых строк между абзацами не склеивается в стену; многоточие перед строчной — пауза, не точка.
  • Стена текста по жанру: 120 слов в auto/doc, 200 в article, 220 в academic.
  • Обрыв честнее. truncated (error) — только если фраза кончается предлогом, союзом, запятой или тире; просто нет точки — unfinished (note); подпись со ссылкой на канал — не обрыв.
  • Оценка по плотности. Штраф за пустышки и канцелярит считается в основном на 100 слов, а не по числу находок — лонгрид больше не проигрывает заметке.
  • Повтор глагола без pymorphy3 узнаёт глагол строже: «интервал», «правило», «деятельность» больше не «глаголы».
  • Паспорт голоса владельцаskills/humanizer-ru/knowledge/voice-author.md; brief --voice вставляет его в промпт. Словарь терминов пополнен лексикой разработки с ИИ (MCP, SDD, harness, семантический поиск, «сети», «курсор»).
  • Корпус: +16 живых статей, +15 кейсов, selftest 40 → 60.

Skill для разных агентов

Папка skills/humanizer-ru/ соответствует открытому формату Agent Skills. Через Skills CLI один и тот же пакет устанавливается в Claude Code, Codex, Cursor, Gemini CLI и другие поддерживаемые агенты. Команда из раздела установки сама находит доступные агенты; для конкретного добавьте, например, --agent codex.

После установки достаточно попросить: «очеловечь», «сделай читаемым», «убери канцелярит» или «проверь на слоп». Skill пройдёт по каталогу паттернов и вернёт текст + «что изменено» + «на решение автора» + «нужны данные». Если доступны Python и uv, агент дополнительно запустит линтер прямо из GitHub.

Файлы скилла:

  • SKILL.md — процесс: жанр → аудит → правка по находкам → проверка; три принципа и факт-замок.
  • references/patterns.md — 42 паттерна с примерами из ИТ/1С.
  • references/false-positives.md — что не дефект.
  • references/voice.md — паспорт голоса «разговорный ИТ» и как снять голос с образцов автора.
  • references/terms-it-1c.md — термины, которые не канцелярит; с 0.3.0 — и лексика разработки с ИИ.
  • knowledge/corrections.md — ваши правила поверх дефолтов.
  • knowledge/voice-author.md — паспорт голоса владельца, снятый с его статей: ритм, структура статьи, лексика, что править, что не трогать. Образец, как такой паспорт выглядит для любого другого автора.

Нет агента — humanizer-ru brief файл.txt даст промпт для любого чата с моделью.

Принципы

  1. Объективное правим — вкусовое предлагаем.
  2. Голос автора неприкосновенен: стерилизация хуже канцелярита.
  3. Минимальная достаточная правка: чистый абзац не трогаем.
  4. Факт-замок: ни одного числа, имени или названия, которых не было в исходнике. Нет данных — [нужны данные].
  5. Лучше пропустить дефект, чем испортить живую фразу. Ложное срабатывание — баг.

Подробнее — docs/methodology.md.

Структура

humanizer_ru/        линтер: rules.py (правила), terms.py (словарь ИТ/1С), metrics.py, linter.py, cli.py, brief.py
skills/humanizer-ru/ скилл для LLM-агентов
tests/               run_tests.py (без зависимостей), test_core.py (pytest), fixtures/ (evals.json, корпус human/, human/habr/ и ai/)
docs/methodology.md  зачем так
THIRD_PARTY_NOTICES.md  что взято из smixs, Vladimir-Human, ilyautov, chukovsky (все MIT)

Источники

Проект собран поверх открытых наработок: smixs/humanizer-ru, Vladimir-Human/humanizer-ru, ilyautov/humanizer-ru, beaverbeard/chukovsky — все MIT, см. THIRD_PARTY_NOTICES.md. Книги: Ильяхов и Сарычева «Пиши, сокращай», Чуковский «Живой как жизнь», Галь «Слово живое и мёртвое».

Лицензия — MIT.

About

Русский Humanizer: Agent Skill и линтер читаемости для LLM-агентов

Topics

Resources

Stars

9 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages