20 августа у меня в композере LinkedIn лежал готовый пост и перед отправкой я поменял 1 слово. Там стояло Six node processes, я сделал 7 node processes. Днём раньше та же фраза ушла в X с Six прописью. Эта правка теперь строка в файле, а под ней регулярное выражение. Машина, которая пишет для меня черновики, прогоняет её по каждому английскому тексту раньше, чем я его прочитаю. Всего таких проверок 19, к английскому применимы 16. 5 появились по одной уже после того дня, каждая из такой же правки. Остальные 11 легли в первый день: часть это общий список машинных признаков, часть это предпочтения, которые я тем вечером назвал вслух.
Возражение, которое я слышу постоянно: ничего этого не нужно. Покажи модели опубликованное, дай ей вывести голос самой и перестань записывать правила. Английских эссе на сайте к началу работы было 11, то есть материал лежал на поверхности. Я наполовину в это верил. Свод читается как описание того, как я пишу. Я ни разу не проверял, описание ли это.
Обстановка
Прогоны идут в пустой папке за пределами этого репозитория, потому что однажды я так не сделал. Корпус, который я сгенерировал изнутри репозитория, подхватил лежащий здесь CLAUDE.md, где правила записаны словами. То, что я записал как свойство модели, было послушанием. context-check.mjs из tells-baseline идёт от рабочей папки вверх до корня и перечисляет каждый файл, который подгружает CLI. На этот раз нашёлся один, ~/.claude/settings.json с единственным ключом theme.
Корпус это те самые 11 эссе без шапки, фигур и блоков кода, то есть 12587 слов прозы на коммите d4650ea. 8 самых старых уходят модели, 3 самых свежих отложены. Что я просил: вот 8 эссе одного автора, напиши свод правил, по которому машина будет писать в его голосе. Каждая запись, которая может нести регулярное выражение, обязана его нести. 5 прогонов, один промпт, claude-opus-5 через claude CLI 2.1.235 на node 22.23.1.
Что вернулось
Каждый прогон вернул 18 или 19 записей, всего 92. Я разложил их по кластерам руками и кластеризацию записал, так что с ней можно спорить.
| кластеров | записей | |
|---|---|---|
| одна из моих 16 проверок голоса | 2 | 10 |
| другая инструкция, которую машина действительно получает | 6 | 23 |
| соответствие, которое я бы отстаивал, но не настаивал бы | 5 | 17 |
| нигде не записано | 16 | 42 |
Нашлись 2: запрет тире и правило, что счёт пишется цифрами. Обе вернулись во всех 5 прогонах.
Всё, что найдено сверх них, пришло из процедуры, по которой я пишу эти посты, а не из свода голоса. Таких 6 и каждая требует что-то положить на страницу. Раздел под определённым заголовком, строка с версией, предложение, называющее убеждение, которое я ни разу не мерил. Ещё одно про место, где я споткнулся, зачин на конкретном случае и пометка, когда число стоит на одном прогоне.
Те 14, которых там и не было
Все 16 проверок дают 0 на всех 12587 словах, для того гейт и стоит, а сам по себе это не новость. Полезный вопрос в том, насколько велика дыра, которую оставляют эти нули.
У tells-baseline для этого есть 2 публичных корпуса. Корпус A это 40 инженерных текстов, опубликованных до 2020 года, 72573 слова. Я пересобрал его из источников тем же скриптом. Все 40 хэшей вернулись без изменений. Корпус B это 30 текстов, написанных claude-opus-5 в пустой папке, 35907 слов. Здесь интереснее второй, потому что свод стоит против этой модели, а не против человека.
Для каждой проверки я беру тот из 2 корпусов, где она встречается чаще, чтобы ничто не выглядело менее заметным, чем оно есть на самом деле. При таких частотах на мои 8001 показанное слово должно было прийтись 129.5 запятых перед and и 75.6 сваренного дефисом слова. Ещё туда же должно было прийтись 63.3 счёта словами и 39.7 тире. Эти 4 оставляют дыру, которую видно. Остальные 12 дают 1.3 срабатывания и меньше, а 6 не дали вообще ничего на 108480 словах обоих корпусов вместе.
Переведём это в объём: сколько мне надо опубликовать, чтобы читатель мог это заметить. Порог это 3 ожидаемых срабатывания, то есть 5% вероятности не увидеть ни одного по случайности. Тире нужно 605 моих слов, запятой перед and нужно 185. Проверке not-just-x-but-y нужно 18143, проверке it-s-not-x-it-s-y нужно 217719. Обе цифры взяты по человеческой частоте, потому что модель таких конструкций не написала ни разу. У меня 12587.
Дальше то, что стоило предвидеть. Все 4 видимые проверки я в какой-то момент проговорил сам. Из 12 невидимых 9 относятся к тому самому общему списку первого дня. В нём ракета, концовка с приманкой на отклик и delve с соседями. Ни один из корпусов их не производит, поэтому соблюдать их ничего не стоит и мои эссе никогда бы их не показали.
Почему тире, а не запятая
Запятая перед and это самая громкая дыра из 4 и она не вернулась ни разу. Посмотрите, что модель придумала вместо этого. Там проступает граница. Она запретила восклицательный знак, точку с запятой, разделитель тысяч, маркированный список и сокращения вроде it's. Всё это символы или строки, которых в моих эссе нет вообще нигде. У запятой перед and другая форма. В 8 эссе стоят 245 запятых и 170 раз and, но рядом они не оказались ни разу. С дефисом то же самое. Их 102, проверка насчитывает 9 сваренных пар и все 9 стоят внутри обратных кавычек, где это код. Мимо on-stack в прозе эссе про JIT она проходит, потому что требует 3 буквы слева от дефиса. 4 проверки это шаткое основание для правила про правила, поэтому я называю это прочтением, а не результатом.
Что она написала вместо этого
42 записи из 92 не соответствуют ничему, что этой машине кто-либо говорил, а большинство из них верны. Правило against, not versus вернулось во всех 5 прогонах и оно настоящее. Я его за собой не замечал. Правила про заголовки вернулись 6 раз, запрет восклицательного знака 4, обратные кавычки вокруг машинных имён 4. 30 записей из 42 лежат в кластерах, на которых сошлись 3 и больше разных прогонов. Под большинством я бы подписался.
Остальное это шум выборки. Прогон 4 велит писать расстояние как metre и kilometre, а взял он это из одного эссе про прогулку с собакой. 2 прогона хотят, чтобы файл открывался заголовком третьего уровня и датой в скобках под ним. Это описание скрипта, склеившего корпус.
Из 48 запрещающих записей с выражением 10 срабатывают на моих собственных предложениях. При чтении руками 7 оказались настоящими, а 3 это выражение, которое говорит не то, что говорит правило. Настоящие сводятся к 4 предложениям. 2 обращаются к читателю на you, в одном стоит really, в одном точка с запятой. Из-за этой же точки с запятой 3 из 5 записей про тире шире моего правила. Прогоны 3, 4 и 5 приклеивают её к тире.
Теперь промах, который чуть не прошёл. Первое место в 4 прогонах из 5 занимает запрет сокращений. Первый счёт сказал, что отложенные эссе нарушают его 5 раз. Все 5 это чужие слова. 4 это цитаты Рича Хикки, пятое это What's in your Toolkit, его слайд, который я называю без кавычек. За пределами кавычек счёт равен 1. Это название слайда. Абзац про это у меня был написан раньше, чем я посмотрел.
Правило, которое она поняла точнее меня
Правило про цифры это единственное место, где модель обыграла файл. Я сказал его 20 августа 4 словами. Проверка, написанная из этой фразы, положила hundred, thousand, million и billion в один список с мелким счётом. На моём же опубликованном корпусе такая форма срабатывает 25 раз, на million rows, million keys и billion commits. Исправленная форма даёт 0. Старая форма простояла 12 дней и ушла 1 сентября, когда приёмку откалибровали по уже вышедшим статьям. Прогон 4 вписал это исключение в свою версию правила сам. Прогоны 2 и 3 вывели исключение для one.
Вывод точен относительно тех 8 эссе, которые модель прочитала, если не считать те 7 записей. На одном правиле он оказался точнее моей фразы. До чего он не дотягивается, так это до решения, потому что решение про текст, который я ещё не написал. Проверка hyphen-compound появилась 28 августа, после того как детектор оценил мой комментарий как машинный на 100%. Разницу дали 3 слова, сваренных дефисом. Каждая из 5 проверок, добавленных после 14 августа, выросла из текста, который пошёл не так. А 19 августа в моём опубликованном тексте всё ещё стояло Six node processes.
Чего я не проверял
Одна модель, один промпт, 5 прогонов, 8 эссе. Просьба дать выражение могла толкнуть ответы к тому, что в выражение помещается. Я не пробовал показать 3 эссе или 30, поэтому кривой у меня нет. Я не пробовал сказать модели, какого рода правила искать. Это подняло бы счёт и заодно означало бы, что свод снова пишу я. Ничто здесь не отделяет правило, вычитанное из моего текста, от правила, известного модели как фольклор. Для этого нужен прогон, где имена из фольклора спрятаны. 3 отложенных эссе слабая проверка: 4586 слов не опровергнут правило, которое срабатывает раз на 20000. Модель, у которой попросили пост в другом регистре, дала бы не те частоты, что корпус B.