Условный пример к рабочему листу и практикуму. Задача, репозиторий, промпты и результаты собирательны: это образец того, как выглядят заполненные поля, а не отчёт о конкретном вечере с измеренными последствиями. Цифры здесь — наблюдения одного человека на одной задаче, они ничего не доказывают и не переносятся на другие проекты.
Пример намеренно не идеальный: два поля остались пустыми, а шестой шаг не довели до конца. Так чаще всего и заканчивается первый вечер.
Задача: разобрать падающий интеграционный тест импорта CSV и описать причину так, чтобы правку мог сделать другой человек Репозиторий: внутренний сервис импорта прайс-листов, Ruby, ~40 тысяч строк Модель и инструмент: агент в терминале, доступ к репозиторию и запуску тестов Дата: условная
Шаг 1. Критерии приёмки до промпта
- Названа конкретная строка или функция, в которой теряется значение, а не «проблема в парсинге».
- Объяснено, почему тест проходит локально и падает в CI — с указанием различающегося условия.
- Есть воспроизведение в двух командах, которые я могу выполнить сам.
Четвёртый критерий («предложить исправление») я сознательно не стал добавлять: на этом заходе мне нужен диагноз, а не патч.
Шаг 2. Промпт и три прогона
Промпт по каркасу из части 3 рабочего листа: задача, материал (файл теста, файл импортёра, вывод упавшего запуска), два ограничения, формат из трёх разделов, критерии приёмки из шага 1.
| Прогон | Что получилось | Каких критериев не хватило |
|---|---|---|
| 1 | Назван импортёр целиком, предложены три возможные причины | 1 и 2: нет конкретной строки, различающееся условие не названо |
| 2 | Названа функция нормализации кодировки, объяснение правдоподобное | 3: воспроизведение предложено «примерно», команды не работают |
| 3 | Снова три версии, другие по составу | 1 и 2 |
Разброс между прогонами: большой
Вывод после трёх прогонов: дело не в формулировке задачи. Модель каждый раз честно перебирает варианты, потому что различающегося условия нет в том, что я ей дал: конфигурация CI во вход не попадала вообще.
Шаг 3. Один воспроизводимый отказ
Отказ: уверенный разбор со ссылкой на функцию, которой в текущем коде уже нет; при этом ответ выглядит убедительно и внутренне непротиворечиво.
Тип (по таблице из части 2): отвлекающий материал — агент нашёл и прочитал lib/legacy/importer.rb, оставшийся от прошлой версии.
Что изменил (одно): исключил lib/legacy/ из области поиска и явно назвал актуальный файл импортёра в разделе материала.
Результат трёх прогонов после правки: три прогона из трёх называют один и тот же файл. Критерий 1 выполнен во всех трёх; критерий 2 — в двух.
Шаг 4. Разбор контекста
Шаг (номер и что агент делал): второй шаг сессии, поиск по репозиторию перед первым ответом.
| Что попало во вход | Источник | Примерный объём | Нужно / мешает |
|---|---|---|---|
| Системная инструкция | агент | небольшой | нужно |
| Файл правил проекта | AGENTS.md | небольшой | нужно |
| Описания инструментов | агент | заметный | нужно, но избыточно подробно |
| Формулировка задачи | мой промпт | небольшой | нужно |
| Найденные файлы | поиск по import | самая большая доля | наполовину мешает: три legacy-файла |
| Вывод команд | запуск теста | заметный | нужно, но с длинным бэктрейсом фреймворка |
| История предыдущих шагов | сессия | небольшой на этом шаге | нужно |
| Внешние данные | — | — | — |
Доля «мешает» от общего объёма: на глаз около трети, почти вся — найденные файлы и хвост бэктрейса.
Что сделал по находкам: исключил lib/legacy/ из поиска; обрезал вывод теста до кадров своего кода. Формат вывода инструментов трогать не стал — это настройка агента, до неё в тот вечер не дошёл.
Результат до чистки: ответ про несуществующую функцию, разный на каждом прогоне.
Результат после: один и тот же файл в трёх прогонах из трёх.
Шаг 5. Вынос устойчивого наружу
В файл правил проекта добавил: строку о том, что lib/legacy/ — архив и не является источником истины о текущем поведении.
В файл решений добавил: запись о различии конфигурации импорта между локальным запуском и CI — то самое различающееся условие, которое я искал весь вечер и которое нигде не было записано.
Что сознательно не стал добавлять и почему: сам промпт. Он написан под разовую диагностику; повторяемым он станет, если такая задача придёт второй раз — тогда и положу его в репозиторий.
Шаг 6. Длинная задача
Что пережило компактизацию, а что нет: не дошёл. Вечер кончился на пятом шаге.
Была ли ранняя ошибка, повлиявшая на поздние шаги: да, и это главное наблюдение вечера: первый ошибочный вывод про legacy-функцию агент дальше использовал как установленный факт и строил на нём следующие версии. Пока я не начал новую сессию, ни одна правка промпта не помогала.
Моё правило остановки сессии: если два подряд ответа опираются на утверждение, которое я уже опроверг, — новая сессия с перенесёнными фактами, а не третья попытка переубедить.
Итог вечера
- Критерии приёмки формулирую до открытия агента
- Есть воспроизведённый отказ и снявшая его правка
- Знаю, что лежит во входе модели, и умею это посмотреть
- Правила и решения лежат в репозитории
- Есть момент, когда я прекращаю сессию, а не спорю с агентом
Что отработать на следующей задаче: шестой шаг целиком — поведение на длинной задаче и что именно переживает компактизацию.
Что показывает этот пример
- Первые три прогона дали не решение, а диагноз: проблема была не в промпте, а в том, чего во входе не было.
- Найденный отказ оказался контекстным, хотя выглядел как «модель галлюцинирует». Разница видна только если посмотреть фактический вход.
- Самое ценное, что осталось после вечера, — две строки в репозитории, а не удачный промпт.