Я всё утро вылизывал план на 1700 строк. Дольше, чем заняла бы сама задача, если бы я сел и написал её руками. И к обеду поймал себя на мысли, что я не написал ни строчки кода, я редактировал документ про то, как код будет написан, и кажется немного поехал 😁
Потом отпустило. Я не поехал. Просто работа переехала, а я не сразу заметил.
Короче. Код стал дешёвым. Любой агент перепишет тебе модуль по запросу, в третий раз, в десятый, на другой язык, ему вообще всё равно. То, за что раньше платили деньги, теперь стоит примерно ничего. А дорого стало то, что по краям от кода. Спереди и сзади. И оба края про одно: сделать правду, которую агент не сможет заболтать.
Потому что заболтать он умеет шикарно. «Готово, всё работает, тесты зелёные». Ага.
Я это понял не из статьи, а из своих же шрамов. Но статья, на которую отвечаю, попала ровно в ту же точку, просто зашла с другой стороны.
Про что речь
Есть на Хабре текст про язык Nova. Насколько я понял, чел почти месяц пилил свой язык и компилятор практически целиком автономными агентами в Claude Code. Сотни инженерных планов, тысячи регрессионных тестов как жёсткий зелёный гейт, свой self-audit, публичный репозиторий. Цифры привожу по памяти из статьи, могу ошибиться в порядке, но масштаб такой.
И это сильная честная работа. Без шуток, у меня местами так взросло не сделано. Я с ним не спорю и точно не собираюсь его подъёбывать. Он доказал делом ту штуку, которую и я сам постепенно нащупываю.
Его текст читается как методичка про дисциплину. А по факту он про то, что ценность уехала на края. Просто он это не назвал вслух, а я вот сижу и называю.
Первый край: план это документ, а не промпт
Мои планы это не промпты в чат. Это большие точные документы. Вот свежий, прямо из пайплайна, дословно: «План готов: 1701 строка, 24 задачи, у каждой acceptance criteria и команды для проверки».
У каждой задачи точные пути к файлам, номера строк, before/after сниппеты, verify-команды и критерии приёмки. Планка простая: свежая сессия, которая впервые видит проект и ничего про задачу не знает, должна выполнить любой пункт без единого вопроса ко мне.
Звучит как занудство и оверкилл. Пока не посчитаешь, где ошибка ловится дешевле всего. А дешевле всего она ловится прямо тут, в плане, до того как написана хоть строчка кода.
У меня в пайплайне над планом сначала проходит свой Скептик: ходит по плану и ищет миражи, по плану, не по коду. Дёшево ловит тупое, типа противоречия в критериях приёмки или шага, который ссылается на то, чего в плане ещё нет. Полезно. Но это всё та же слепая модель, которая план и писала. Тот же blind spot, тот же кивок самому себе. Заспавнил верифаера как субагента, и это та же башка, которая просто кивает в такт.
Я это не закрыл до конца. Но сдвинул, и сдвинул тупой штукой: кросс-модельное ревью плана, обязательное.
План я собираю обычно в Claude Code на Opus. И ревьюить его я отдаю не такому же Opus, а Codex на GPT-шке. Собрал в Codex, ревьюит Claude. Не «может, если время останется», а всегда. Другая модель это буквально другой слепой угол, не тот же самый.
И вот тут вылезает уже не косметика. Один проход поднимает замечаний десять-пятнадцать, и из них штук пять-семь это P0, реальные криты, на которых план бы поехал: тут задача 12 молча ломает инвариант из задачи 4, тут два пункта приёмки противоречат друг другу, тут вообще не сказано, что делать в degraded-режиме. Глазами на 1700 строках я такое проскакиваю, честно. А тут оно поймано на тексте, ценой нуля написанного кода, в коде всплыло бы дня через два, уже на середине реализации. Первый проход самый злой, дальше по убывающей. Обычно две-три итерации туда-сюда, пока план не встанет. И почти каждый прогон выкатывает вопрос, на который ответить может только человек, то есть я.
Вот это и сдвигает проблему слепого проверяльщика. Не закрывает, сдвигает. Один и тот же класс модели кивает сам себе. Разные классы спорят, и на стыке вылезает то, что в одиночку не вылезло бы.
Для самых важных планов я гоняю даже не одного скептика. Разные линзы. Одна смотрит с продукта: мы вообще ту задачу решаем. Вторая с архитектуры: оно не развалится через месяц. Третья самая злая, она тупо спрашивает «а это нельзя сделать в три раза проще и вообще иначе». Всё сливается в один фидбек, проговаривается, и план дотачивается до вменяемого.
Вот этого у меня вчера не было. Вчера был тупик «проверяльщик тоже врёт, я обречён всё перечитывать сам». Сегодня хотя бы: проверяльщик из другого класса врёт в других местах.
Второй край: машина, которую не уболтать
Второй край это не «заспавнь ещё одного проверяльщика того же класса». Это вещи, которые агент физически не может обойти словами, как бы красиво ни рапортовал.
Типы. На одном проекте у меня TypeScript проверяет контракт на этапе сборки. Сломал контракт, tsc не собрался. Тут уже пофиг, что модель пишет в чате, exit code или ноль, или не ноль, с компилятором не поговоришь.
Контракты. Самая жирная находка за последнее время: контракт говорит CAMPAIGN_ABORTED, а код шлёт CAMPAIGN_ABORT. Реальный баг, который агент прошёл, бодро отрапортовав об успехе, потому что для него обе строки выглядели одинаково правдоподобно. Я бы тоже глазами проскочил. А контракт не «выглядел», у него просто не сошлось.
И главное правило проверки, которое повторяю себе как мантру: смотреть не «тесты зелёные», а наблюдаемое поведение на той поверхности, которую видит живой пользователь. Зелёные тесты это не доказательство. Доказательство это когда кнопка реально делает то, что должна, на настоящем экране. Разницу очень легко проспать.
И тут же сам сдвиг: я перестал контролировать реализацию, начал контролировать результат. Сверяю готовое с критериями, которые сам и написал, минут десять на план, и таких планов едет параллельно много, как конвейер.
И ровно это уже делает автор Nova, просто без названия. Его планы это план-как-продукт. Его тесты жёстким гейтом это машинная правда. А его эффекты в типах, когда ревьюер видит из сигнатуры, что функция реально делает, и ему не надо гадать, это вообще самая взрослая версия идеи «сделай правду, которую модель не заболтает». У него это сделано аккуратнее, чем у меня, и я подсматриваю.
Сейчас скажут
Сейчас кто-нибудь напишет: да это же просто старый добрый TDD, типы, контракты, ничего нового ты не открыл.
И да. Ровно. Новизна не в инструментах, инструменты те же.
Новизна в том, что теперь это ЕДИНСТВЕННОЕ, что держит. Раньше типы и тесты были страховкой поверх того, что ты сам написал и сам прочитал глазами. Теперь между планом и машинной проверкой тебя почти нет. Ты не писал этот код и не читаешь каждый дифф руками. Значит вся нагрузка легла на два края, и если один из них дырявый, агент проедет насквозь и даже не споткнётся.
А вы прям уверены, что у вас не так? Что ваш сетап держится не на этих же двух тисках, просто вы их пока не назвали? У меня два: план спереди, типы и контракты сзади. Назовите свои, если они другие.
И ещё скажут: ну у тебя просто проект попроще, вот и хватает. А у вас прям сложнее? У автора Nova целый компилятор, и он упёрся ровно в то же. Размер задачи тут ни при чём.
И вот теперь про то, что меня бесит. Бесит одна сладкая вера, в которой я сам долго сидел. Вера, что дыру закроет «ещё один агент-проверяльщик». И её сестра, мечта про «оно само», поставил и забыл. Эту веру ты не сам придумал, её тебе продают с каждой сцены и каждого лендинга про автономных агентов: вот, мол, оркестратор, поставил на ночь, утром пришёл за готовым. Не закроет и не само. Лишний агент того же класса слеп там же, где исполнитель. Чем больше агентов в работе, тем больше остаётся ровно того, что поймает только твоё внимание, и больше ничьё.
И был под одной статьёй справедливый коммент, мол, у вас нет регулярных ревью, агенты нарушают ваши же декларированные правила. Не буду спорить. Так и есть. У меня агенты нарушают мой же CLAUDE.md регулярно, и оно так у всех. Именно поэтому я и не верю одному проверяльщику той же породы. Скептик тут не оппонент, он соавтор тезиса.
И да, добью себя сам, чтобы было честно. Засада не в том, что я однажды поленюсь и пропущу сам гейт, хотя и это бывает. Засада тоньше. Я могу прогнать все проверки и при этом не синкануться с планом по-настоящему. Не заставить модель разжевать мне как маленькому, откуда взялся вот этот кусок и не выдумала ли она его. Не проверить своей головой, что вся махина едет туда, куда я задумал, а не туда, куда агентам было удобнее её привести. Сам гейт автоматизируется на раз. А моё понимание происходящего не автоматизируется никак. И последний проверяльщик в этой цепочке всё равно я, живой и уставший, и халтурю я именно тут, не на кнопке, а на том, чтобы реально понять. Класс модели вообще ни при чём, сильная она или слабая. Слеп одинаково любой проверяльщик того же класса, и я в том числе.
Где я честно не знаю
Между двумя тисками, точный план спереди и машина, которую не уговоришь, сзади, автономный агент работает. Вне их он галлюцинирует и наматывает круги, у меня один так однажды просто полировал какой-то файл в углу часами, на ровном месте, пока я не пришёл и не остановил. Код посередине стал дешёвой частью.
Но дыру я не закрыл. Я честно не знаю, где проходит граница. Сколько реально можно зажать в типы и критерии приёмки, а сколько всё равно придётся прочитать своими глазами, потому что ни один контракт это не ловит. Иногда мне кажется, что границу можно двигать почти до конца. Иногда, что я просто ещё не напоролся на случай, который вернёт её на место и больно. Кажется, пока никто точно не знает, как надо, и все ещё ищут на ощупь. Будет круто, если кто-то уже нащупал эту линию — расскажите.
Если ты тоже ловил себя на том, что вылизываешь план дольше, чем заняла бы задача руками, и думал, что это паранойя, ты не один. Туда просто переехала работа.
Пишу про это вот тут
ссылка на оригинал статьи https://habr.com/ru/articles/1043582/