Пока способ работы живёт в голове, он воспроизводится по-разному. В понедельник я строю карту до правок и читаю дифф построчно, в пятницу вечером — принимаю то, что дали, потому что тесты зелёные.
Записанный цикл эту разницу не убирает. Он делает её видимой: я знаю, какой шаг пропустил и чем за это заплачу.
Пять шагов и их выходы
Главное в цикле — не названия шагов, а то, что каждый заканчивается артефактом. Шаг без артефакта не заканчивается, он размазывается в следующий.
1. Разведка → карта: где менять, что заденет, что покрыть тестами
2. План → контракт: цель, объём, вне объёма, ограничения, готово когда
3. Правка → дифф в пределах лимита, коммиты по смыслу
4. Проверка → зелёные гейты: линт, анализ, тесты
5. Ревью → список замечаний и решение по каждомуПроверка того, что шаг сделан, тоже механическая: артефакт либо есть, либо нет. Карту можно перечитать, контракт скопировать в задачу, дифф посмотреть, гейты запустить, замечания пересчитать.
Разведка
Выход — карта пути от точки входа до побочных эффектов, плюс список затронутого вне пути: конфиги, миграции, сидеры, тесты, кэш.
Строит её агент без права записи. Мне от неё нужны две вещи: список файлов под изменение и список связей, которые нельзя упустить. Первое я обычно представляю и сам, второе регулярно недооцениваю.
Пример из блога, где разведка окупилась мгновенно. Задача была «поменять слаг рубрики». Карта показала: канонические адреса в трёх шаблонах, лента, карта сайта, сидер с фиксированным слагом, тест, который на этот слаг ссылается. Из шести пунктов я помнил два.
Пропускаю разведку, когда задача внутри одного файла и без побочных эффектов.
План
Выход — контракт из пяти блоков: цель, в объёме, вне объёма, ограничения, готово когда. Подробно я разбирал его в цикле про промпты, здесь важна его роль в цикле.
Роль такая: план — это последняя точка, где моё возражение стоит абзац. После него оно стоит час.
Ревью плана у меня занимает пять-пятнадцать минут и состоит из одного вопроса: какие решения принимаются за меня? Новые классы, новые таблицы, изменения публичных сигнатур, перенос ответственности между слоями. Всё остальное в плане меня не волнует.
Пропускаю план на задачах меньше сотни строк ожидаемого диффа.
Правка
Выход — дифф. Требования к нему два: не больше двухсот строк за подход и коммиты по смысловым шагам, каждый с рабочим проектом.
Двести строк — не про аккуратность, а про моё внимание. Дальше я перестаю читать и начинаю просматривать, и разница между этими двумя режимами — три пропущенных дефекта на одном рефакторинге.
Здесь же работает правило про соседние файлы: смотреть, как сделано рядом, и повторять. Оно записано в телах пишущих агентов и заменяет собой описание стандартов, которое всё равно устареет.
Пропустить этот шаг нельзя, но можно испортить: снять лимит. Что происходит дальше, я описывал — дифф на 1240 строк, два часа чтения, три пропущенных дефекта.
Проверка
Выход — зелёные гейты. В блоге это тесты и проверка форматирования внутри контейнера:
docker compose --env-file .local/.env -f .local/docker-compose.yml \
exec -T webserver php artisan test
docker compose --env-file .local/.env -f .local/docker-compose.yml \
exec -T webserver ./vendor/bin/pint --testГоняет их агент без права записи, и это осознанно: тот, кто чинит красное, выбирает между «виноват код» и «виноват тест», а выбор этот мой.
Отдельная статья цикла посвящена гейтам целиком — что стоит в хуках, что в одной команде перед отправкой и почему хук со статическим анализом я снял. Здесь достаточно правила: гейт — это условие, а не пожелание.
Пропускать проверку нельзя вообще никогда, и именно её пропускают чаще всего, потому что «правка же маленькая».
Ревью
Выход — список замечаний и решение по каждому: принял, отклонил, отложил.
Что смотрю сам, не делегируя: изменения схемы данных, всё, что касается прав доступа, вывод пользовательского содержимого в шаблонах, побочные эффекты в наблюдателях моделей и очередях. Это места, где ошибка тихая и дорогая.
Что отдаю ревьюеру без права записи: остальное. Он возвращает список, я принимаю решения. Пропорция на среднем диффе — примерно одиннадцать замечаний, из них четыре существенных, из них три принимаю.
Важная деталь, которую я долго нарушал: ревью идёт после проверки, а не вместо. Зелёные тесты не заменяют чтение диффа. Они говорят, что не сломалось то, что покрыто, — а не то, что сделано правильно.
Где я сокращаю цикл
Честная часть. Полный цикл на всех задачах я не гоняю — это было бы ритуалом.
Правка текста, стиля, разметки. Разведка и план отпадают, остаётся правка, сборка и взгляд глазами. Плачу за это тем, что пару раз ловил сломанную тёмную тему, потому что не посмотрел вторую.
Задача в зоне, где я был вчера. Разведку заменяю вчерашней картой. Плачу тем, что карта устаревает молча: один раз шёл по карте недельной давности, в которой уже не было переехавшего сидера.
Срочная правка на проде. Цикл сжимается до правки и проверки. Плачу двойной работой: после срочного всегда есть уборка, и её надо делать в тот же день, иначе не сделаешь никогда.
Чего не сокращаю ни при каких обстоятельствах: проверку и ревью изменений схемы данных. Всё остальное обратимо дёшево, эти два — нет.
Что осталось
Записанный цикл я завёл не ради дисциплины, а чтобы видеть отклонения. Работает именно так: сокращаю сознательно, знаю, чем плачу, и в половине случаев цена оказывается приемлемой.
Чего не хватает — обратной связи по сокращениям. Я не веду учёт, какое сокращение сколько раз вышло боком. По ощущениям, самое дорогое — пропуск разведки на задачах, которые касаются данных, но ощущения — плохая мера. Похоже, стоит просто записывать причину каждой правки после ревью, месяц-другой, и посмотреть на список.