Первая полезная задача задаёт тон всей дальнейшей работе, и выбирать её стоит по одному критерию: она должна быть маленькой, но полной. Маленькой - чтобы diff помещался в голове и любую ошибку было видно сразу. Полной - чтобы у неё были и цель, и граница, и замкнутая проверка. Хорошие кандидаты предсказуемы: исправить конкретный падающий тест, обновить одно правило валидации или добавить узкий регрессионный тест. Плохой кандидат - расплывчатое "улучши модуль", у которого нет однозначного признака выполнения.
Почему именно маленькая и полная, а не быстрая и широкая. Широкая первая задача на незнакомом коде почти гарантированно приводит к дрейфу: агент меняет много, а проверить нечего, и вы остаётесь с красивым, но недоказанным изменением. Маленькая задача с замкнутой проверкой, наоборот, сразу показывает, работает ли связка "воспроизвести - изменить - проверить" в этом репозитории. Это дешёвая калибровка среды перед тем, как доверять агенту более серьёзные изменения.
Замкнутая проверка - сердце такой задачи. Она означает, что у изменения есть сигнал, который до правки падает или явно фиксирует проблему, а после правки становится зелёным. Без этого сигнала "исправил" - это утверждение, а не доказательство. Поэтому первый шаг хорошей задачи - не сама правка, а воспроизведение проблемы существующей командой проекта: тест, который сначала должен упасть, превращает работу из уверенности в проверяемый факт.
Полезно один раз увидеть, как выглядит такая задача в виде контракта. Ниже - короткая формулировка: цель, граница (какой модуль и тесты трогать, зависимости не добавлять), требование сначала воспроизвести ошибку, затем прогнать targeted-тест и typecheck, и в конце показать diff и отдельно перечислить непроверенное. К этой форме возвращаются на каждой новой задаче: именно граница и проверка, а не длина запроса, делают результат оцениваемым.
Порядок шагов внутри задачи важнее их набора. Сначала воспроизвести проблему существующей командой, затем внести минимальное изменение, затем повторить тот же сигнал и убедиться, что он позеленел, и лишь потом расширять проверку на соседние тесты и typecheck. Обратный порядок - сразу "запусти всё" - размывает сигнал: непонятно, что именно починилось, а что сломалось попутно. Узкий сигнал сначала, широкая проверка потом.
Граница в запросе - не формальность, а защита от дрейфа. Явно сказать "меняй только модуль Y и его тесты, зависимости не добавляй" дешевле, чем потом откатывать лишние изменения по всему дереву. Агент, которому не задали границу, склонен "заодно" поправить смежное, и первая же такая правка на плохо понятом коде создаёт больше работы, чем экономит. Узкая граница на первой задаче - это тренировка дисциплины, которая пригодится на всех последующих.
Отчёт закрывает цикл и делает результат честным. Хороший итог первой задачи называет, что было сделано, какие файлы изменены, какие команды запущены с какими кодами возврата, и отдельно - что осталось непроверенным. Последний пункт особенно ценен: явно названная непроверенная граница честнее, чем молчаливое "готово". Она показывает, где вам нужно перепроверить самому, и не выдаёт частичную проверку за полную.
Типичные провалы первой задачи предсказуемы. Взять слишком широкую цель без однозначного признака выполнения. Начать с правки, а не с воспроизведения, и потерять сигнал, доказывающий фикс. Забыть границу и позволить агенту дрейфовать по смежным файлам. И принять "готово" без отчёта о том, что именно проверено. Начните с маленькой полной задачи, воспроизведите проблему до правки, держите границу и требуйте отчёт - и первая же задача откалибрует и агента, и ваш процесс.
Цель: исправить ошибку X.
Граница: меняй только модуль Y и его tests; зависимости не добавляй.
Сначала воспроизведи ошибку существующей командой проекта.
После правки запусти targeted test, затем typecheck.
Покажи diff и отдельно перечисли то, что не проверялось.