Из пяти задач агент сделает три. Остальные испарятся
Месяц назад завёл журнал задач на диске, потому что агент молча терял половину запроса. 147 файлов и 5045 пунктов спустя — что сработало, что пришлось доработать после факапов и что нашлось попутно в собственных правилах.
Даёшь агенту пять задач в одном сообщении. Три он делает, одну наполовину, одну молча теряет. И бодро отчитывается — по тем трём, что сделал.
Ловить это должен ты. То есть держать в голове, что именно просил сорок минут назад, и сверять с тем, что получил. Я так пробовал. Не работает: к третьему запросу ты помнишь уже не формулировку, а общее ощущение «вроде всё сделал».
Дело не в том, что модель ленивая. Дело в том, что её память — это контекст, а контекст сжимается, чистится и вообще не для хранения. Задачи вымывает из него первыми: они короткие и выглядят выполненными.
Месяц назад я завёл простую штуку — журнал задач на диске.
Как устроено
Правило: если в запросе больше одного действия, агент до начала работы выписывает чеклист в файл. Файл на день на проект.
Внутри:
- дословная цитата запроса — не пересказ;
- нумерованные пункты, по одному на глагол;
- галочка ставится сразу, как пункт закрыт;
- не сделал или решил не делать — не молча, а пометка с причиной.
Отчёт в конце — только после чтения этого файла. По всем пунктам, в исходной нумерации. Не «сначала расскажу, что получилось».
Дословная цитата тут не педантизм. Пересказ теряет ровно те детали, из-за которых всё и затевалось: «поправь X и заодно Y» превращается в «поправить X», и Y испаряется ещё до начала работы.
Что вышло за месяц
147 файлов, 32 проекта, 5045 пунктов. Из них 3265 закрыто, 482 отменено с причиной, остальные висят открытыми.
Вот эти 482 — главное. Раньше отменённое просто исчезало: агент решал, что пункт неважный, и не упоминал его. Теперь на каждый есть строка «не делал, потому что». Решать, важный он или нет, — не его работа.
Открытые тоже никуда не делись. Их видно. Неприятно, но видно.
Три доработки, каждая после факапа
Галочка должна означать «проверено», а не «сделал».
Попросил агента врезать в мои правила несколько принципов из записок Карпаты — тех, что недавно разошлись по сети. Он врезал, отчитался, поставил галочку. Спрашиваю: а оригинальный файл с гитхаба ты скачивал?
Не скачивал. Работал по моему пересказу.
Скачали, сверили. Формулировки совпали — повезло. Но в оригинале было три пункта, которых в моём пересказе не было, и взяться им было неоткуда.
Теперь у каждого пункта в чеклисте стоит вторая половина: чем проверю. Команда с кодом возврата, тест, файл на месте, значение в базе. «Выглядит правильно» и «я проверил» — не проверка. Нечем проверить — так и пишем: нечем, только глазами.
Строчка «на чём остановились».
Внизу каждой секции — одна перезаписываемая строка: где встали, какой следующий шаг, якорь (файл и строка, ветка, команда). Она отвечает ровно на один вопрос: что делать первым, если контекст обнулился прямо сейчас.
Раньше после чистки контекста начиналось «так, на чём мы остановились?» и минут пять расспросов. Теперь агент читает журнал и продолжает.
Файл на окно.
Три окна параллельно — отчёт, платежи, багфикс — писали в один файл и затирали друг друга. Починка тупая: файл на окно и запрет перезаписывать его целиком, только дописывать.
Что взяли у Карпаты
Из тех самых записок прижились три строки. Не весь конспект — три.
Каждая изменённая строка трассируется к запросу. Никаких попутных рефакторингов, переименований и «заодно причесал». Увидел мусор рядом — скажи, не трогай.
Цель, а не шаги. Задача формулируется как проверка, которая либо проходит, либо нет: падающий тест, условие, которое должно стать истинным. Нет такой проверки — сначала ищем её, потом пишем код.
Больше проверок, меньше кода. Вот эта оказалась самой ценной, но не сама по себе — а тем, что вскрылось, когда я пошёл её вписывать.
Побочный эффект: правила спорили друг с другом
В файле правил рядом жили две строки. «В сомнениях делай БОЛЬШЕ — лишние проверки, лишние тесты». И «минимум кода, никаких лишних абстракций».
Обе написал я, в разное время, обе по делу. Но агент читает обе и выбирает ту, что удобнее под текущую задачу. И формально он всегда прав.
Развели явно: больше проверок — да, больше кода — нет.
Там же нашлось второе. Антипаттерн «недооцениваешь сложность — спроси реальный объём работ» я писал про себя-человека, для которого «это две недели» — аргумент. Для агента реализация стоит несколько долларов компьюта, и «это много работы» перестало быть аргументом вообще. Переписал на то, что действительно важно: что здесь необратимо — данные, миграции, публичный интерфейс, деньги — и насколько широко разлетится, если рванёт.
Третья находка вообще смешная. Файл, про который у меня написано «читать при необходимости», грузился в каждую сессию целиком — просто потому что не был оформлен ленивым. Полгода я платил за строчку «по требованию» полную цену. Заодно ужал стартовый вес инструкций с 12 800 токенов до 9 900.
И четвёртая, неожиданная. Правило «обращайся ко мне по имени» выглядит косметикой, я готов был выкинуть его как лишний вес. Оказалось — диагностика: под нагрузкой длинного технического ответа агент теряет форматные правила первыми, имя пропадает раньше, чем содержание начинает врать. Перестал звать по имени — пора чистить контекст и перепроверять выводы. Агент, кстати, предложил подставлять имя механически, первым словом ответа. Отказал: подпорка убила бы сигнал.
Экономия токенов тут приятный бонус, не приз. Приз — что в правилах не осталось двух строк, между которыми можно выбрать удобную.
Что забрать
Агенту не нужна память. Ему нужно место, куда он обязан писать, — до работы, а не после.
Три вещи дают почти весь эффект:
- чеклист из дословной цитаты запроса, составленный до начала работы;
- у каждого пункта — чем проверю;
- отчёт только по файлу и в исходной нумерации.
Заводится за десять минут. Ловит ровно то, что иначе ловишь ты сам — через сорок минут и на нервах.