ormeilu/avoid-ai-writing-russian
v2.7.0MIT
Аудит и правка русских текстов от ИИ-стиля: канцелярит, кальки, шаблонная структура. Под-скилл antiplagiat готовит текст к проверке «Антиплагиатом» и «Думейтом».
История изменений
Формат — Keep a Changelog, версии — семантические.
[Не выпущено]
[2.7.0] — 2026-11-07
Добавлено
- Плагины для Kimi Code (
.kimi-plugin/plugin.json), pi (package.jsonс ключомpi) и Hermes Agent (корневойplugin.jsonв формате Agent Plugins v1). Все три ставят весь репозиторий и указывают на ту же папкуskills/. Для DeepSeek Harness в README описаны ссылки в~/.dsh/skills/: формата плагина со скиллами у него нет.release.pyиcheck_versions.pyобновляют и сверяют версии в новых манифестах. aiw-ru --versionпечатает версию пакета.
Изменено
- Скиллы объясняют, что путь
../..вuv run --project ../.. aiw-ruсчитается от папки SKILL.md, и велят подставлять абсолютный путь. pi запускал команду из папки пользователя, и безaiw-ruв PATH детектор не находился. - Нижняя граница
richснижена с 15.0 до 14.3: Hermes ставит пакет плагина в своё окружение, а тамrichзакреплён на 14.3.4. Вuv.lockостаётсяrich15, тесты проходят на обеих версиях. - Из шапок скиллов убран вложенный блок
metadata.openclaw: по спецификации agentskills.io значенияmetadata— строки, и Hermes пропускал оба скилла с ошибкой «metadata must map string keys to string values».
[2.6.0] — 2026-11-07
Добавлено
antiplagiat --explain: для каждого красного и жёлтого фрагмента вклад признаков в логит под действующей моделью (с калибровкой, если она есть), замер, от которого зависит признак (средняя длина предложения, cv длин, повторяющиеся первые слова, MATTR, приметы, канцелярит), цель для каждого признака по отдельности и план, который делит нужное снижение между признаками. В JSON полеexplainу фрагмента. Цель правки — зелёная зона, ниже порога на 0,1.- Цвет фрагмента в
antiplagiat: красный от порога, жёлтый в пределах 0,1 под ним, зелёный ниже (полеzoneв JSON, цвет вероятности в таблице, «у порога: N» в строке «Фрагменты»). - Поле
typicalProseв отчётеantiplagiatи строка «Ровная проза» вcalibrate: вероятность абзаца, у которого из признаков есть только типичная длина предложения (около 19 слов). Если она в жёлтой зоне или выше, обе команды предупреждают, что доля ИИ-текста будет прыгать от правки пары слов.
Изменено
- Скилл
antiplagiatбез отчёта системы правит по карте детектора: красные фрагменты и жёлтые у порога. Правка идёт циклом «замер с--explain, правка,validateпротив исходника, замер», пока доля ИИ-текста не дойдёт до нуля или проход не перестанет снижать долю и число красных и жёлтых фрагментов. Лимит в два прохода основного скилла к этому циклу не относится (#20). - Скилл больше не говорит, что падение оценки детектора ничего не доказывает и что переписанный моделью текст остаётся сгенерированным. Оговорка о приблизительной оценке осталась советом: загрузить итог в систему и принести отчёт для калибровки. Раздел «Почему здесь нет приёмов обхода» говорит о технических уловках (невидимые символы, подмена букв, текст картинкой), запрет на них не изменился.
- Справка по «Думейту», раздел «Калибровка у порога»: в калибровке по 134 фрагментам признаки не отделяют красные фрагменты от остальных (ROC AUC 0,45–0,59), вес типичной длины держится на начальных весах, и ровный абзац получает 0,436 при пороге 0,44. Пересчёт по тем же отчётам не поможет, нужны отчёты по правленым версиям.
[2.5.2] — 2026-10-19
Исправлено
calibrateписал калибровку в.aiw-ru.jsonтекущей папки, аantiplagiatчитал её из--config,$AIW_RU_CONFIGили~/.config/aiw-ru.json. При$AIW_RU_CONFIGили калибровке в~/.configобразцы копились не в том файле, который читается, а накопленная калибровка из~/.configтерялась: следующийcalibrateначинался с нуля. Теперьcalibrateпишет в тот же файл, откуда читаетantiplagiat.
[2.5.1] — 2026-10-14
Добавлено
- Хук
private-texts(scripts/check_private.py): сверяет файлы коммита с собственными работами автора из~/.config/aiw-ru/private(или папок изAIW_RU_PRIVATE) и не пропускает восемь слов подряд из них, с файлом и строкой. Читает.txt,.mdи.docx; без папки молчит, поэтому CI и другие участники его не замечают.
Изменено
- Примеры в каталоге (каркас абзаца, мораль в конце, пояснение через двоеточие, перечень «во-первых… в-третьих»), сценарий
domate-asks-heatmapс эталоном и тексты в тестах переписаны: в них стояли фрагменты статьи и реферата автора. Новые примеры выдуманы и показывают те же приёмы на складском учёте. В AGENTS.md правило: примеры в каталоге, тестах иevals/выдуманные, на постороннюю тему. - Демо
docs/demo.gifпоказывает светофор: на посте с узким неразрывным пробелом он жёлтый, на правке зелёный, строка есть и уantiplagiat.classifyв демо идёт на модели по умолчанию, поэтомуscripts/demo.pyтребует только её.
[2.5.0] — 2026-10-14
Добавлено
- Светофор символов в
scanиantiplagiat: строка «Светофор», в JSON полеlightс цветом, подсказкой и типами находок. Зелёный — «всё чисто». Жёлтый — «ИИ или типография?»: редкие типографские символы или мягкие переносы, агент спрашивает пользователя, убрать их или оставить. Красный — «почти наверняка ИИ или маскировка»: разметка ссылок из чата, параметры ИИ-инструментов в ссылках, невидимые символы, подмена букв; их агент удаляет без вопросов. В JSON отчётаantiplagiatтоже есть полеlight. - Тип находки «Редкие типографские символы» (
typography-chars, P2): неразрывный и узкий неразрывный пробелы, шпации U+2002–U+200A, математический пробел, дефис U+2010 и неразрывный дефис U+2011, цифровое тире, горизонтальная черта, знак минуса, стрелки. Одна находка на символ, только в прозе: в коде, цитатах и служебных частях статьи символы не считаются. В оценку не идёт. На 500 русских диалогах LMArena (весна и лето 2025 года) такие символы, кроме стрелок, есть в 26 % ответов o3-mini, 16 % ответов o3 и 5 % ответов o4-mini. У GPT-4.1 и GPT-4o их нет ни в одном из 81 ответа, у моделей других компаний они нашлись в 1 ответе из 1047, в репликах людей — в 2,2 %. Стрелки есть в 6,7 % ответов моделей и ни в одной реплике людей. Раздел каталога — «Редкие типографские символы» вtypography.md. validate --marked heat.jsonназывает абзацы под красной подсветкой отчёта, которые остались без правки (предупреждение «красный абзац без правки», код выхода не меняет). Снятые неразрывные пробелы и замена дефисов правкой не считаются, заголовки, HTML, рисунки, таблицы и абзацы короче 15 слов не проверяются.- docs/domate.md: второй документ (реферат, 42,72 → 9,38 → 0 % ИИ в «Думейте»), что изменилось в правленых абзацах статьи, типографика до и после, калибровка по трём отчётам с проверкой на отчёте, который в неё не входил.
Изменено
- Типографский проход больше не ставит неразрывные пробелы: между числом и единицей и в разрядах скилл пишет обычный пробел, U+00A0 и U+202F в правку не вставляет. Уже стоящие в тексте — жёлтая находка светофора.
- Числа в выводе
aiw-ruи в текстах находок делятся на разряды обычным пробелом (52 521 текст), раньше там стоял неразрывный. antiplagiatи справка по «Думейту»: процент двигает правка красных абзацев, а не типографика. В статье неразрывных пробелов было 279 до правки и 284 после (38,35 → 9,98 %), в реферате абзацы, где сняли только неразрывные пробелы, остались на прежнем уровне, а лёгкая перестройка предложений вывела из красного 13 абзацев из 16. Скилл велит править каждый красный абзац, не трогать ради процента оранжевые и жёлтые и сверять покрытие черезvalidate --marked.- Калибровку «Думейта» скилл честно называет слабой: подогнанная по двум отчётам, она угадывает красные фрагменты третьего с ROC AUC 0,36–0,55. Долю правленой версии (
--share) в калибровку «Думейта» добавлять не велено: на статье она подогнала долю, а точность по фрагментам уронила до 45,5 %. - Проверяющий агент (
review.md) сравнивает светофор исходника и итога: новые редкие типографские символы и красный светофор в итоге — «Исправить». Если правили по отчёту системы проверки, он получает разметку отчёта, проверяетvalidate --marked, не засчитывает правку, которая свелась к типографике, и пишет в ответе, сколько красных абзацев осталось без правки.
Исправлено
- Кусок отчёта, который начинается с заголовка раздела, находился в оглавлении: заголовок там встречается раньше. Разметка калибровки и судьи захватывала оглавление и введение; в реферате так появились 6 ложных красных фрагментов из 29. Теперь берётся первое вхождение начала куска, после которого рядом находится и его конец.
- Записи списка литературы с неразрывными пробелами («С. 12», «№ 4», «И. И.») не распознавались как служебная часть статьи: правила ждали обычный пробел.
- Скиллы велят звать
aiw-ruнапрямую, если он есть в PATH (command -v aiw-ru), и идти черезuv run --project ../..только без него. Раньше в них стоял один способ, через uv.aiw-ru skillэту подсказку не печатает.
[2.4.0] — 2026-10-03
Добавлено
- «Думейт» (domate.ru) — вторая система в под-скилле
antiplagiat. Описание скилла откликается на «Думейт показал N % ИИ». Справкаreferences/domate.mdобъясняет отчёт: тепловая карта с тремя уровнями, в процент входят только красные фрагменты, бесплатная проверка даёт только процент. В ней же порядок, как получить разметку, и проверенный скрипт, который забирает тепловую карту со страницы отчёта в JSON, если у агента есть браузер, а пользователь сам вошёл в аккаунт. --system antiplagiat|domateуantiplagiatиcalibrate: у каждой системы своя калибровка в том же.aiw-ru.json. Прежние поля файла остаются за «Антиплагиатом», «Думейт» лежит в новом полеsystems, и старые версии читают файл как раньше. В JSON отчётаantiplagiatновое полеsystem.calibrate --markedпринимает тепловую карту в JSON (список{"level", "text"}или объект с ним вfragments) и берёт из неё только красные фрагменты.aiw-ru judgeпечатает задание для слепого судьи: свежий агент без контекста редактора ставит пронумерованным фрагментам (те же, что уantiplagiat) уровни none/low/medium/high.aiw-ru judge scoreсводит ответы нескольких прогонов: средний уровень, доля слов со средним medium и выше, совпадение прогонов, а с--marked— ROC AUC судьи и детектора против подсветки отчёта. Справкаreferences/judge.mdв основном скилле, задание в ней сверяется с CLI тестом.- Правила на суждение в каталоге: «Пояснение через двоеточие как каркас» (
sentences.md), «Мораль в конце абзаца» (rhetoric.md), «Перечень „во-первых… в-третьих“ в прозе» (structure.md) и заглавная после двоеточия в «Оформлении и типографике». Детектор их не ищет. - Сценарий
domate-asks-heatmapвevals/с эталонным ответом: по одной доле «Думейта» агент правит каркас абзаца и просит отчёт с тепловой картой. - docs/domate.md: замер на обзорной статье в 2600 слов. «Думейт» нашёл 38 % ИИ-текста,
antiplagiatи ModernBERT — 0 %. По фрагментам против красной подсветки детектор дал ROC AUC 0,40, слепой судья — 0,75–0,80 за прогон и 0,82 по среднему трёх. Правка 27 красных абзацев по скиллу снизила долю ИИ в «Думейте» до 9,98 %, оригинальность не изменилась.
Изменено
- Порядок работы
antiplagiat: первым шагом агент просит отчёт с подсветкой и правит по нему, оценка детектора идёт вторым шагом. В правке появился «каркас абзаца» (пояснения через двоеточие, мораль в конце, «во-первых… в-третьих», зеркальные пары, безличное «предлагается»). Добавлен список ошибок, которые на проверке поймал проверяющий агент: синонимы терминов, сниженный регистр, вывод исследователей в виде прямой речи, снятые оговорки. Проверяющий агент поreview.mdобязателен, если правка задела больше пары абзацев. calibrate --markedразмечает фрагменты по покрытию слов. Кусок из отчёта ищется по первым и последним словам, поэтому переносы строк, разметка и расхождения текстового слоя PDF не мешают. Фрагмент подсвечен, если куски покрывают больше половины его слов или кусок целиком лежит внутри него. Раньше подсвеченным считался только абзац, где начинался кусок, и подсветка через несколько абзацев размечала один из них.- Основной скилл предупреждает, что отшлифованный текст детектор может не видеть, и отправляет к слепому судье. Подсказка под
antiplagiatговорит, что при отчёте с подсветкой править нужно по нему.
[2.3.0] — 2026-10-02
Добавлено
- Служебные части статьи (#8): список литературы, ключевые слова, английская аннотация вместе с названием и авторами над ней, сведения об авторах, строки «УДК», «Для цитирования» и даты поступления. Список литературы находится по заголовку («Список литературы», «Библиографический список», «Литература», «References») или по трём записям подряд с «//», «— С.»,
Vol., «№», DOI. Правила стиля,antiplagiatи модели их не оценивают, слова оттуда не входят в счётчик. Раздел по заголовку кончается на первой строке обычной прозы, а заголовок «Литература» без единой записи разделом не считается: на русской части LLMTrace (52 521 текст) служебные части нашлись у трёх человеческих текстов, и все три по делу. validateсверяет служебные части целиком, как YAML-шапку: правка записи в списке литературы теперь нарушение, даже если числа в ней те же.- Тип находки «Жаргон и транслитерация с английского», 49 правил (#7). Транслитерации из машинного обучения и разработки («бейзлайн», «пайплайн», «чекпоинт», «инференс», «эмбеддинг», «фолд», «псевдолейблы»), общий ИТ-жаргон («апрув», «фидбэк», «митигировать», «роадмап», «стейкхолдер», «из коробки», «по дизайну») и кальки-слова («фокусируется на извлечении», «робастность», «устоявшихся и валидированных», «на финальном этапе»). Уровень P1 с пометкой «стиль», в оценку ИИ-стиля не идут: на русской части LLMTrace жаргон есть у 1,1 % человеческих текстов и у 0,6 % сгенерированных. В
chatправила не действуют, общий жаргон не ищется и вtelegram, «фреймворк» и «таргет» — вdocs. Слова со вторым законным значением ловятся только в понятном обороте: «пресс-релиз», «кропотливый», «размер батча», «супервизия» у психологов, «финальный матч» и масонские «ландмарки» не трогаются. «Сделать звонок» в значении «решить» и устоявшиеся термины машинного обучения («датасет», «энкодер», «аугментация») описаны в каталоге как правила на суждение. - В скилле шаг для документа Word:
pandoc файл.docx -t gfm --wrap=none -o файл.md, номера строк относятся к копии, правки вносятся в исходник. Прямые кавычки в подписях рисунков скилл велит сначала сверить с самим docx. classify,scanиantiplagiatназывают строки абзацев не на русском, которые модель не читала: в выводе «Не на русском», в JSONnotRussianLines.
Изменено
- Модели не видят YAML-шапку, блоки кода, служебные части статьи и абзацы не на русском, а номера строк фрагментов остаются по исходному файлу (#6). На английском ModernBERT почти всегда уверенно говорит «ИИ», а шапка с
abstract-enпопадала в первый фрагмент и тянула вверхaiLinesиaiWordShare. Текст или фрагмент, где кириллицы меньше половины букв, модель не оценивает. В JSON у сигнала и у элементовfragments.itemsновые поляlanguage(ruилиother) иskipped, у сигнала ещёcyrillicShare; у неоценённыхprobability,ai,nearThresholdравныnull.fragments.countтеперь считает только оценённые фрагменты, пропущенные — в новомfragments.skipped.aboveThreshold,aiLinesиaiWordShareсчитаются по оценённым. На русской части LLMTrace (test) очистка меняет для моделей 759 текстов из 52 521. 381 из них почти целиком не на русском (вопросы с кодом, генерации, сбившиеся на другой язык), их модели теперь не оценивают. На остальных ModernBERT ошибается не чаще прежнего: выше порога 1 человеческий текст из 100 и 263 сгенерированных из 278. - «Челлендж» рядом с Interspeech, ComParE, Kaggle, конференцией или «участием в» подсказывает «соревнование», «конкурс», а не «трудность» (#6, #7).
- Жирный номер в начале строки (
**12.**,**12)**) не считается выделением в «Избытке жирного». - Признак «канцелярит» в
antiplagiatне считает жаргон: калибровки пользователей подобраны под прежний состав. - Руководство
models guide: раздел «Только русский текст», а рецепт перепроверки фрагмента начинается с того, чтобы посмотреть, что в отмеченных строках (шапка, таблица с заглушками, список литературы, английский текст), и только потом читать число.
Исправлено
- Оценка статьи по ГОСТ, собранной в docx и переведённой pandoc в Markdown, завышалась на десятки пунктов из-за оформления (#8): записи литературы давали «Рубленые фрагменты», жирные номера — «Избыток жирного», кавычки в записях — «Прямые кавычки». На двух статьях-фикстурах
scan --context vakдавал 54 и 52, теперь 7 и 0, как у тех же статей без списка литературы. ModernBERT на первой из них отмечал фрагмент со списком литературы (77 %), теперь все фрагменты ниже порога. [Дата обращения: 12.03.2026]в записи литературы больше не считается незаполненной заглушкой.- Ссылки
\[12\], которые pandoc экранирует при переводе docx в Markdown, маскируются как[12], иvalidateсравнивает их без обратной косой черты. antiplagiatна пустом тексте падал сTypeErrorна таблице без строк.- Нормализация трансформера и разбиение на предложения работали за квадрат времени на длинной серии пробелов: на вырезанном списке литературы в 20 000 знаков это секунды. Теперь такие серии обходятся.
[2.2.1] — 2026-09-26
Добавлено
scripts/models_catalog.py --hub-onlyобновляет в каталоге моделей только ревизии, хэши и размеры с Hugging Face, без замеров скорости и памяти.
Исправлено
- После обновления aiw-ru уже скачанная модель оставалась прежней: aiw-ru брал из кэша Hugging Face то, что скачано последним, и с каталогом это не сверял. У того, кто ставил ModernBERT с aiw-ru 2.1, после 2.2.0 работала старая модель на окне 512. Теперь каталог моделей хранит ревизию и хэши файлов каждой модели.
aiw-ru models installкачает ревизию из каталога, ту, на которой замерено качество.models,classify,scanиantiplagiatсверяют скачанные файлы с хэшами и, если они другие, подсказываютaiw-ru models install <имя>; в JSON у модели и вclassifierдля этого полеoutdated. Ревизии не сравниваются: после модели в репозиторий идут коммиты с одной карточкой, и обновлять ради них модель не нужно. Кэш без символических ссылок (Windows без режима разработчика) сверить нельзя, тамoutdatedравноnull.
[2.2.0] — 2026-09-26
Добавлено
aiw-ru models guideпечатает руководство по классификации: какую модель взять под свою машину (для слабых ноутбуков и песочниц агентов —transformer), как читать вероятность и итог по фрагментам длинного текста, как перепроверить отмеченные строки всеми моделями иscan, сколько это стоит по времени и памяти. Это файл каталога скиллаreferences/models.md, его же читает агент; SKILL.md ссылается на него перед тем, как пересказывать пользователю вероятность.- Под итогом
classifyпо фрагментам подсказка, как его читать: один фрагмент выше порога в длинном тексте — слабый признак, отмеченные строки шире самого ИИ-текста. - docs/runtime.md: почему модели работают через onnxruntime, а не PyTorch. Установка в десятки раз меньше (24 МБ против 555 МБ и 1,25 ГБ библиотек CUDA на Linux), на окне в 512 токенов ONNX втрое легче по памяти; замеры скорости и памяти на 8 и 2 потоках и что пробовали и не взяли. Замеры повторяет
scripts/runtime_bench.py. - Замер проверки по фрагментам на длинных документах:
scripts/long_docs.pyсклеивает тексты LLMTrace одного жанра в документы на 5–40 тысяч знаков (целиком человеческие, целиком ИИ и со вставками ИИ-текста) и считает, как часто фрагменты находят ИИ-кусок и как часто поднимают ложную тревогу. Отчёт в docs/long-documents.md: вставку находят 88–94 % документов против 30–34 % по началу, но в человеческом документе на 20 000 знаков хоть один фрагмент выше порога бывает в 22–37 % случаев, поэтому один фрагмент — слабый признак. inference.jsonможет задаватьread_length: окно, которым модель читает текст целиком, длиннееmax_length, по которомуclassifyрежет фрагменты. aiw-ru до 2.2.0 этого поля не знает и работает с такой моделью на окнеmax_length, как с прежней.scripts/long_docs.py eval --labelотделяет прогон новой версии модели от старой;train_transformer.py exportу модели с окном длиннее 512 меряет задержку ещё на 2048 и 8192 токенах;reportберёт задержку изexport-latency.json, если модель обучали и оценивали на другой машине, и для обучения на своей видеокарте даёт в «Как воспроизвести» прямые команды без Colab.
Изменено
- ModernBERT (toiletsandpaper/russian-ai-text-detector-modernbert) обучена заново на окне в 8192 токена вместо 512 и выложена новой ревизией в тот же репозиторий (#4). Текст целиком она читает до 8192 токенов, это 4–5 тысяч слов; обрезанных текстов на test 0,1 % вместо 13,5 %. На test ROC AUC 0,993, как у прежней, accuracy 0,9635 против 0,9620, людей за ИИ 3,4 % против 4,3 %, на текстах от 400 слов accuracy 0,982 против 0,966. Локальное внимание — ±64 токена, как в исходном ModernBERT: на пилотах окно ±128 и длина 512 или 2048 не дали разницы больше разброса между сидами. Фрагменты
classifyу неё остались по 512 токенов: на окне в 8192 ИИ-вставка тонет в человеческом тексте, и на длинных документах вставку нашли бы в 1,6 % смешанных документов против 92,3 % (docs/long-documents.md). Фрагмент на M1 считается за 72 мс вместо 126. classifyпроверяет по фрагментам любой текст длиннее одного фрагмента, даже если модель прочитала его целиком.aiw-ru models installбез имени ставит ModernBERT и LightGBM: ModernBERT точнее всех и реже других принимает людей за ИИ. Трансформер теперь ставится только по имени,aiw-ru models install transformer, для слабой машины и песочницы агента. Справкаmodels info, скилл и руководствоmodels guideговорят то же.- Экспорт ModernBERT в ONNX (
scripts/train_transformer.py export) идёт черезscripts/fast_modernbert.py: локальные слои считают внимание блоками в окне, а не матрицей n × n с маской, слои после последнего глобального — только для начала текста, нужного токену CLS. Ответы те же (расхождение с transformers до 3·10⁻⁶), а окно в 8192 токена на M1 считается около 3 секунд вместо 48. Глобальные слои считают запросы 16 кусками: пик памяти на 8192 токенах около 1 ГБ вместо 3,8 ГБ, на 2048 — 330 МБ вместо 520, скорость та же, на двух потоках даже выше. Так экспортирована новая ModernBERT на окне 8192. train_transformer.py train --batch-tokens Nограничивает пачку по токенам, без этого окно 8192 не помещается в память GPU; без сети ревизия базы берётся из локального кэша Hugging Face.- Карточка LightGBM показывает
aiw-ru models install lightgbmиclassify --model lightgbm: без имени по умолчанию теперь отвечает ModernBERT. - Благодарности humanizer-ru в README и NOTICE называют все взятые оттуда идеи: сверку фактов, проверку правки свежим агентом, тест на переносимость и три приметы детектора.
Удалено
- Команды
embedиheadвscripts/train_transformer.py: замороженный энкодер FRIDA с логистической головой. На test он дал ROC AUC 0,952 при 823 млн параметров, хуже всех трансформеров aiw-ru и тяжелее их всех, и выпускать его не стали.
Исправлено
- На macOS процесс с моделью в ONNX (трансформер, ModernBERT, mini-frida) изредка падал на выходе с
libc++abi: terminating due to uncaught exception of type std::__1::system_error: recursive_mutex lock failed: Invalid argumentи кодом 134. Падала телеметрия onnxruntime 1.30: она включается при импорте, секунд через десять отправляет данные по сети, и если процесс завершается во время отправки, её поток обращается к уже разрушенному мьютексу. Теперьaiw_ru.modelsпри импорте ставитORT_DISABLE_TELEMETRY=1, если переменная не задана, так что при любом запускеaiw-ruтелеметрия не включается. Пример на Python в карточках трансформера, ModernBERT и mini-frida ставит ту же переменную до импорта onnxruntime.
[2.1.0] — 2026-09-25
Добавлено
scan,antiplagiatиclassifyговорят, какую часть текста прочитала модель. Трансформер видит одно окно в 512 токенов, 300–350 слов от начала, а вывод раньше этого не показывал: вероятность по началу поста в 40 000 знаков выглядела как оценка всего поста. Теперь для длинного текста есть строка «Прочитано: 351 слово из 4598, строка 1 из 56: окно модели 512 токенов», в JSON полеreadсtruncated, словами, строками и токенами. Место обрыва точное: подбирается длина начала исходника, которая после нормализации даёт полное окно (#5).classifyпроверяет длинный текст по фрагментам. Текст режется на фрагменты в одно окно по границам предложений, соседние заходят друг на друга на четверть окна, предложение длиннее четверти окна делится по словам, чтобы фрагменты были полными, а последний фрагмент добирается назад до полного окна. Вывод — таблица «строки, слова, вероятность» и итог «выше порога 2 фрагмента из 17, в них 11 % слов: строки 26–28», в JSON полеfragments. Одно число на документ не выводится: среднее прячет ИИ-кусок в смешанном документе. На документе из человеческих статей со вставкой ИИ-текста в середине все три трансформера нашли вставку.--max-fragments Nпроверяет только первые N фрагментов,--no-fragmentsотключает проверку по фрагментам.- Время проверки по фрагментам видно в выводе. Если по первым фрагментам выходит больше 5 секунд,
classifyсразу пишет в stderr, сколько ждать: на M1 фрагмент занимает около 25 мс у трансформера, 65 мс у mini-frida и 110 мс у ModernBERT, текст в 330 000 знаков у ModernBERT — около 25 секунд. - Правило в скиллах: если модель прочитала не весь текст, её вероятность относится только к началу; весь текст агент проверяет через
classifyпо фрагментам, называет строки, а не одно число, и предупреждает, если проверка будет долгой.
[2.0.0] — 2026-09-25
Стабильный выпуск 2.0. Вместе с предварительными выпусками 2.0.0rc1–2.0.0rc4 в него вошли детектор на Python и пакет aiw-ru на PyPI вместо TypeScript и Bun, aiw-ru skill для агентов без плагина, четыре необязательные модели с Hugging Face (ModernBERT, трансформер на rubert-tiny2, mini-frida и LightGBM) со справкой models info и сравнением classify --all, каталог примет по темам и сверка фактов в validate. Подробности в разделах этих rc в CHANGELOG.md.
Изменено
- Свежее демо в README: к
scan,validateиantiplagiatдобавилсяclassify --all, где на правке четыре модели расходятся во мнении, в выводе видна вероятность модели.scripts/demo.pyсобирает запись terminalizer из настоящего вывода команд и сжимает gif до ширины README. - Раздел «Какую модель выбрать» в карточках трансформеров на Hugging Face и в отчётах
docs/models/: вместо сплошного абзаца попарных сравнений таблица всех моделей в порядке, в котором их выбирает aiw-ru, строка «когда брать» на каждую модель (та же, что вaiw-ru models info) и правило выбора. У mini-frida вместо «промежуточного варианта» её место по ROC AUC и по доле людей, принятых за ИИ.
[2.0.0rc4] — 2026-09-25
Исправлено
aiw-ru skillне находил файлы скилла, если пакет стоял под скрытой папкой, то есть почти всегда: в.venvили в кэше uv (~/.cache/uv) при запуске черезuvx. Выводился только SKILL.md, аaiw-ru skill avoid-ai-writing-russian references/review.mdотвечал «других файлов нет». Скрытые файлы теперь отсеиваются только внутри папки скилла.- Трансформер, ModernBERT и mini-frida падали с
AttributeError: … no attribute 'no_truncation'на tokenizers 1.0: в нём нет методовno_truncationиno_padding, обрезку и дополнение снимают присваиваниемNone. Поддерживаются обе версии, токены и вероятности на них совпадают. Версию 1.0.0rc2 ставит, например,uvx --prerelease allow.
[2.0.0rc3] — 2026-09-25
Добавлено
aiw-ru classify --allпоказывает вероятности всех установленных моделей рядом и пишет, выше порога они все, ниже или расходятся. В JSON у вероятности теперь есть порог (threshold) и признакnearThreshold: вероятность ближе 15 пунктов к порогу, модель не уверена; в выводе это «близко к порогу».- Правило в скиллах: вероятность модели — тоже сигнал. Агент смотрит на само число, сверяет его с находками и своим чтением, при сомнении сравнивает модели через
classify --all, не правит текст ради цифры и не пишет «написан ИИ» по одной вероятности. Повод: человеческое письмо из тестов проекта все четыре модели отнесли к ИИ. aiw-ru models info [имя]сравнивает модели до скачивания: ROC AUC и accuracy на test LLMTrace, доля людей, принятых за ИИ, скорость, память и размер. Числа лежат в пакете (aiw_ru/data/models.json), их собираетscripts/models_catalog.pyперед выпуском. Скилл смотрит эту справку, прежде чем предложить модель.- Третья необязательная модель, самая точная: дообученный RuModernBERT-small в ONNX fp32 (toiletsandpaper/russian-ai-text-detector-modernbert). Весит около 140 МБ и в несколько раз медленнее трансформера на rubert-tiny2, поэтому ставится только по имени:
aiw-ru models install modernbert. Если она установлена, вероятность даёт она;--modelвыбирает другую. - Четвёртая необязательная модель: дообученный
sergeyzh/rubert-mini-fridaв ONNX fp32 (toiletsandpaper/russian-ai-text-detector-mini-frida). На test ROC AUC 0.991 и accuracy 0.948, между ModernBERT (0.993) и трансформером на rubert-tiny2 (0.987), но при пороге 50 % принимает за ИИ 9.5 % человеческих текстов против 7.2 % у трансформера. Весит около 130 МБ и в 3 раза медленнее трансформера, поэтому ставится только по имени:aiw-ru models install mini-frida. Если стоят несколько моделей, вероятность даёт первая из установленных в порядке ModernBERT, трансформер, mini-frida, LightGBM: по доле людей, принятых за ИИ на test, а не по ROC AUC. Ошибиться в человеке дороже, поэтому mini-frida рядом с трансформером работает только через--model mini-frida. scanназывает файлы каталога скилла с разделами, где описаны условия и исключения найденных примет: под таблицей и в полеcatalogJSON.- После правки скилл сверяет итог с источником по утверждениям: действия, условия, уверенность, числа, причинные связи и рамка (как выглядят названные клиенты и люди до и после). Если среда позволяет, итог проверяет свежий агент по
references/review.md: он видит только исходник, итог и задание, без рассуждений редактора, и блокирует выдумку, сдвиг смысла, потерянный довод и чужой голос. Тест на переносимость убирает предложения, которые встанут в любой чужой текст без правки. Идея из humanizer-ru, текст свой. - Раздел каталога про оторванные деепричастия и сбитое согласование, в том числе в собственных правках редактора.
aiw-ru validateсверяет факты. Нарушения: снятая оговорка («обычно», «примерно», «около 40», «от 5000», «вероятно», «не всегда») и появившиеся имя или название (слово с заглавной не в начале предложения, латиница, аббревиатура), число словами, месяц, которых нет в исходнике. Стопку оговорок свести к одной можно, синонимы внутри семейства («обычно» → «как правило», «от 0,15 до 0,40» → «0,15–0,40») и падежи имён («Москва» → «Москве») нарушением не считаются. Предупреждения идут в новое полеwarningsи код выхода не меняют: снятое одиночное «может», новые слова-претензии («впервые», «единственный», «всегда», «доказали») и мелкие числа словами («один», «оба»). Морфологии нет, только словари и регистр букв; идея из humanizer-ru.- Тест
tests/test_examples.py: примеры замен в файлах скилла и эталонные ответы изevals/goldenпроходят ту же сверку фактов без нарушений и предупреждений, а плохие эталоны на ней падают. Один эталон её не прошёл (придуманные «видео и звук» и механизм с двумя каналами), он исправлен. - Новые приметы в детекторе, идеи из humanizer-ru, словари и замеры свои. «Почерк модели» (
model-idiolect): восемь оборотов свежих моделей («подчёркивает», «важность», «что делает его…», «Это позволяет…» в начале предложения, «может привести к», «символом», «незабываемый», «важный шаг» вне шаблона «важный шаг к…»). Находка появляется, когда в тексте два разных оборота и больше. На русской части LLMTrace так пишут 1,47 % сгенерированных текстов и 0,12 % человеческих; из 22 кандидатов остались те, у кого lift не меньше 3 и доля у людей не больше 1 %. «Обвязка ответа чата» (chat-wrapper): предложение доработать ответ («Хотите, я сокращу его?», «Могу также подготовить более официальную версию») и подводка «Вот вариант поста:». «Текст оборван на полуслове» (truncated): последний абзац кончается запятой или предлогом, как ответ, оборванный на лимите длины; 1,14 % сгенерированных текстов против 0,07 % человеческих. Разделы вvocabulary.md,chat.mdиstructure.md. ROC AUC оценки правил на test LLMTrace выросла с 0,610 до 0,615 (люди против всего ИИ), доля людей с оценкой 40 и выше осталась 5,9 %. Признаки модели LightGBM не меняются: новые типы в них не входят. - Разметка из чатов, которую ловит
chat-markup::::writing{variant=,[cite: N]и[span_N](start_span)из Gemini, переадресацияvertexaisearch.cloud.google.com/grounding-api-redirect,grok_render_citation_card_json,](sandbox:/mnt/data/,[citation:N],attributableIndex, теги<think>. - Невидимые символы: знаки направления текста (U+200E, U+200F, U+061C, U+202A–U+202E, U+2066–U+2069) и U+180E удаляются перед поиском и делают документ подозрительным. Рядом с ивритом и арабским знак направления законен, узкий неразрывный пробел U+202F не трогается.
- Разделы каталога на суждение, без детектора: «Финальная мораль», «Псевдотерапия», «Запятая после обстоятельства в начале предложения». На LLMTrace эти формулы не отделяют людей от моделей: «мораль этой истории» у людей встречается не реже, самопомощь пишет «вполне нормально чувствовать…», а запятую после «В 2024 году» люди ставят чаще моделей.
Изменено
- Каталог примет разбит на тематические файлы:
vocabulary.md,typography.md,sentences.md,rhetoric.md,chat.md,structure.mdиprofiles.mdвместо одногоpatterns.mdна 87 КБ. Агент больше не читает каталог целиком. Кандидатов он ищет по краткому каталогу в SKILL.md (уровни P0–P2 и частые ложные находки), а файл темы открывает перед правкой находки из неё. Все файлы нужны только для полного аудита. Поводом стал слепой тест проекта humanizer-ru: компактная инструкция дала смысловые ошибки в 1 правке из 65, полный каталог — в 15.
Исправлено
aiw-ru validateне замечал изменённый инлайн-код: бэктики вырезались до сравнения.- Фрагмент находки в
scanпоказывался после нормализации: «подчеркивает» вместо «подчёркивает», без невидимых символов и с исправленной подменой букв. Теперь это текст исходника как есть, и его можно найти в файле поиском. models infoпечатал число текстов test без разрядов («52521 текст»).- «Играет всё более важную роль» давало две пересекающиеся находки («играет всё» и «всё более важную»), теперь одну на весь оборот.
- Разбор ответа в
evals/grade.pyзахватывал в итоговый текст раздел «Проверка», если его текст шёл на той же строке, что и подпись (**Проверка:** …).
[2.0.0rc2] — 2026-09-25
Добавлено
- Вторая необязательная модель: дообученный русский трансформер в ONNX (toiletsandpaper/russian-ai-text-detector-bert). Работает на CPU через onnxruntime, без torch. Если стоят обе модели, вероятность в
scan,antiplagiatиclassifyдаёт трансформер. В основеcointegrated/rubert-tiny2в int8, файл около 30 МБ. На test русской части LLMTrace ROC AUC 0.987 и accuracy 0.945 (у LightGBM 0.943 и 0.868), человеческих текстов, принятых за ИИ, 7.2 %; замеры относятся к ревизииa05ddceна Hugging Face. Отчёт об обучении вdocs/models/russian-ai-text-detector-bert.md, скриптыscripts/train_transformer.pyиscripts/colab_transformer.py. --model transformer|lightgbmвыбирает модель вscan,antiplagiatиclassify;aiw-ru models install [имя…]ставит одну модель или обе.
Изменено
- Вероятность от модели в JSON
scanиantiplagiatлежит в полеclassifierс именем модели. В 2.0.0rc1 она была в полеmodelи вantiplagiatзатирала имя модели калибровки. aiw-ru models --jsonотдаётready(готова хотя бы одна модель) и списокmodelsс состоянием каждой.- extra
mlставит и onnxruntime с tokenizers для трансформера; на Mac с Intel onnxruntime не ставится, там работает только LightGBM.
Исправлено
- На Windows
aiw-ru scan … | headзавершался с кодом 120: закрытый канал там приходит как OSError с EINVAL. - На macOS без libomp LightGBM падал с трассировкой при загрузке; теперь
aiw-ru modelsпроситbrew install libomp.
[2.0.0rc1] — 2026-09-25
Добавлено
- Пакет
aiw-ruна PyPI:uvx aiw-ru scan статья.mdзапускает детектор без клонирования репозитория,pip install aiw-ruставит его как библиотеку (from aiw_ru import analyze). aiw-ru skillвыводит скиллы, если стоит только пакет, без плагина: список, SKILL.md с командами черезaiw-ruи файлы скилла вродеreferences/patterns.md. Скиллы входят в пакет.aiw-ru scan --jsonlиaiw-ru antiplagiat --jsonlпроверяют пачку документов: на входе по JSON-строке с полемtext, на выходе по строке результата на документ. Так корпус в сотни тысяч текстов проходит за несколько запусков, а не за сотни тысяч.- Необязательная модель LightGBM поверх признаков детектора.
aiw-ru models installскачивает её с Hugging Face (toiletsandpaper/russian-ai-text-detector-lightgbm),aiw-ru classifyдаёт вероятность, что текст написала модель, аscanиantiplagiatпоказывают её рядом с оценкой, если модель установлена. Зависимости модели ставятся отдельно (extraml), без них всё остальное работает как раньше. Скиллы предлагают модель пользователю и ставят её только с его согласия. На test русской части LLMTrace у модели accuracy 0.868 и ROC AUC 0.943, у оценки правил ROC AUC 0.610; человеческих текстов, принятых за ИИ, 16.5 %. Замеры относятся к ревизии6b80454на Hugging Face;aiw-ru models installберёт последнюю ревизию. scripts/llmtrace.pyмеряет детектор на русской части LLMTrace:fetchскачивает корпус и продолжает загрузку после обрыва связи,evalсчитает ROC AUC, accuracy и F1 по порогам и частоту каждого правила у людей и у моделей,spansсверяет фрагментыantiplagiatс разметкой по знакам. Данные и кэш ответов детектора лежат в~/.cache/aiw-ru/llmtrace, в репозиторий не попадают.scripts/train.pyобучает LightGBM на признаках языка (сработавшие правила, длина предложений и слов, пунктуация, частоты служебных слов), сравнивает его с оценкой детектора и выкладывает модель на Hugging Face. Карточка модели собирается из замеров:model-indexс результатами на LLMTrace и таблицы по жанрам, длине текста, типу задания и модели-генератору. Отчёт об обучении с описанием всех признаков и командами для воспроизведения пишется вdocs/models/russian-ai-text-detector-lightgbm.md.
Изменено
- Детектор, CLI, скрипты выпуска и поведенческие проверки переписаны с TypeScript на Python: пакет uv, ruff, ty, pydantic, rich. Ответы детектора те же, что у версии на TypeScript, а работает он примерно втрое быстрее.
- Смещения, номера столбцов и доля знаков в
antiplagiatсчитаются по символам Python, а не по единицам UTF-16: эмодзи теперь один знак, а не два. Для текстов без эмодзи и других символов вне BMP ничего не изменилось. - Скиллы вызывают детектор через
uv run --project ../.. aiw-ru. Вместо Bun нужен uv, Python 3.12 или новее он поставит сам. - В JSON целые значения дробных полей печатаются с точкой:
12.0, а не12. - Версии по PEP 440: предварительные выпуски пишутся как
2.0.0rc1и выходят на GitHub с пометкой pre-release.
Удалено
- Бинарники
aiw-ruпод Linux, macOS и Windows в выпусках: вместо них пакет на PyPI. - API на TypeScript (
import { analyze } from "avoid-ai-writing-russian"); вместо негоfrom aiw_ru import analyze.
[1.0.0] — 2026-09-24
Изменено
- Невидимые символы и подмена букв больше не входят в оценку ИИ-стиля и в плотность примет у
antiplagiat. Находки P0 и флаг «подозрительный документ» остаются. На русской части LLMTrace подмена встречается в 1,2 % человеческих документов и в 0,5 % сгенерированных: это гигиена документа, а не признак модели. - Подмена букв определяется по смене алфавитов внутри слова, а алфавит слова выдаёт буква без двойника. Теперь ловятся кириллические двойники внутри английских слов и латинские в заглавных русских словах. Латинская основа с русским окончанием («PHPшник», «OKей», «CEOшный») больше не P0. Не считаются подменой латинская i в украинских словах, «х» как знак умножения между буквами и ударение латинской буквой с акутом.
- NOTICE.md и CITATION.cff называют данные и источники, по которым проверялись правила: LLMTrace, GigaCheck, технический отчёт Pangram 4, раздел Википедии о признаках ИИ-текста. Раздел «Ограничения» в README приводит замер на LLMTrace: сколько человеческих и сгенерированных текстов детектор отмечает.
- Под-скилл antiplagiat объясняет, почему в нём нет приёмов обхода: опубликованный приём закрывают и превращают в улику, а спрятанный всё равно выдаёт общий стиль.
Исправлено
- SKILL.md антиплагиата и README писали, что
.aiw-ru.jsonхранит фрагменты текста. В файле только модель и числовые признаки; текст есть в выписанных из отчёта файлах. - Латинское сокращение через дефис с русским словом («HTTP-запрос», «PHP-скрипт», «OK-кодом») считалось подменой букв P0, и технический текст получал до 100/100. Теперь алфавиты сравниваются внутри каждой части слова.
- Один мягкий перенос (U+00AD) из Word или PDF делал документ подозрительным и давал короткому тексту 71/100. Теперь это отдельная находка P2 «Мягкие переносы» без веса в оценке.
- Соединитель U+200D внутри составного эмодзи и BOM в начале текста при вызове
analyze()считались невидимыми вставками. - Слова с неразрывным дефисом U+2011 или дефисом U+2010 («по-настоящему») выпадали из словарей. Теперь они читаются как обычный дефис.
- Разметка цитирования ChatGPT не ловилась в виде служебных символов U+E200–U+E204, голого
turn0search12и【4:0†source】. - Подсказка писала «1 невидимых символов».
- Детектор зависал на длинном слове без пробелов (вырожденный вывод модели в LLMTrace, около 18 тысяч знаков): регулярка пассива без привязки к началу слова работала кубически. Длинное отточие разбивалось на предложения квадратично. Обе регулярки теперь линейные.
[0.3.0] — 2026-09-23
Изменено
- Вывод
scan,antiplagiatиvalidateпеределан для людей: сводка сверху, находки и фрагменты таблицей по ширине терминала с переносом внутри ячеек, P0 выше P1. Цвет только в терминале,NO_COLORиFORCE_COLORработают. - Под-скилл antiplagiat сам просит у пользователя отчёты «Антиплагиата» для калибровки, если модель не откалибрована, и предлагает несколько способов их передать: PDF отчёта или скриншоты (фрагменты агент выпишет сам), скопированные фрагменты, номера абзацев, итоговая доля.
- Вывод
calibrate— таблица отчётов и сводка калибровки.
Исправлено
- Ручной перенос строки внутри абзаца больше не считается концом предложения: у Markdown с переносами врала статистика ритма.
aiw-ru … | headпадал с EPIPE.- Детектор пропускал «В заключение,» и «будущее за инновационными…», хотя каталог их описывает.
Добавлено
calibrate --share N: калибровка по итоговой доле ИИ-текста из отчёта, когда разметки фрагментов нет. Подстраивает общую строгость модели; несколько отчётов передаются парами--doc … --marked …и--doc … --share …в одном вызове.- Демо в README (
docs/demo.gif):scan,validateиantiplagiatна примерах изdocs/demo/; там же запись terminalizer, из которой gif собирается заново.
[0.2.0] — 2026-09-23
Исправлено
- Тесты командной строки и проверка невидимых символов падали на Windows из-за путей вида
/D:/…. - Шапки SKILL.md были невалидным YAML (двоеточие внутри
description), строгие парсеры не читали скилл. - Квадратичная сложность в научном и техническом режимах: на 38 тыс. знаков проверка шла 6,8 с, теперь 0,4 с.
Изменено
- TypeScript 7 (нативный компилятор), actions/checkout v7, j178/prek-action v2.
Добавлено
- Хуки prek: гигиена файлов, gitleaks, Biome (линтер и форматтер), проверка типов, невидимые символы, синхронность версий, самопроверка документации детектором, сообщения коммитов на русском, тесты перед отправкой.
- Система выпусков:
bun run release X.Y.Zпереносит «Не выпущено» в раздел версии, обновляет версию во всех манифестах, скиллах иCITATION.cff, делает коммит и тег; по тегу GitHub Actions собирает бинарники под Linux, macOS и Windows и публикует выпуск с заметками из CHANGELOG. - Тесты скилла: фронтматтер, ссылки, согласованность профилей и категорий детектора с каталогом, примеры из каталога.
- Поведенческие проверки скилла (
bun run eval): набор случаев с автоматической оценкой ответа агента. - Метаданные: расширенные шапки скиллов (ссылки на проект, апстрим, теги), манифесты плагинов Claude Code и Codex с описанием для каталога,
CITATION.cff,SECURITY.md, CODEOWNERS, Dependabot. - CLAUDE.md с правилами для Claude Code: проверка плагина, установка из рабочей копии, поведенческие проверки, ловушки при разработке.
- Тесты кода: разбиение на предложения и блоки, маскирование, стилометрия, корпус живых текстов разных жанров без ложных срабатываний, калибровка через командную строку.
[0.1.0] — 2026-09-23
Первый выпуск русской адаптации avoid-ai-writing (за основу взята версия 3.36.0).
Добавлено
- Скилл
avoid-ai-writing-russian: режимыrewrite,detect,edit, договор о правке, уровни P0–P2, правило «никогда не добавляй» — на русском. - Каталог русских примет: словарь в три уровня с отдельной группой канцелярита (1Б), кальки с английского, цепочки родительного падежа, пассив без деятеля, русская типографика (тире как грамматика, «ёлочки», десятичная запятая, ГОСТ-списки), социальные хуки и следы чат-ботов.
- Профили контекста
vak,docs,blog,telegram,business-email,chatс матрицей строгости и исключениями для научного текста. - Под-скилл
antiplagiat: подготовка к проверке системой «Антиплагиат», оценка по фрагментам, чистка артефактов, оформление заимствований как цитирований. - Детектор на TypeScript для Bun: команды
scan,antiplagiat,validate,calibrate; нормализация невидимых символов и подмены букв с картой смещений; маскирование цитат, кода, формул, ссылок[12]и[@key]. - Калибровка модели
antiplagiatпо реальным отчётам с накоплением образцов в.aiw-ru.json. - Манифесты плагинов для Claude Code и Codex, CI на GitHub Actions.