Учебный пример

Учебный пример: заполненный рабочий лист

Как выглядят заполненные поля рабочего листа после одного вечера — включая то, что осталось незаполненным.

Условный пример к рабочему листу и практикуму. Задача, репозиторий, промпты и результаты собирательны: это образец того, как выглядят заполненные поля, а не отчёт о конкретном вечере с измеренными последствиями. Цифры здесь — наблюдения одного человека на одной задаче, они ничего не доказывают и не переносятся на другие проекты.

Пример намеренно не идеальный: два поля остались пустыми, а шестой шаг не довели до конца. Так чаще всего и заканчивается первый вечер.


Задача: разобрать падающий интеграционный тест импорта CSV и описать причину так, чтобы правку мог сделать другой человек Репозиторий: внутренний сервис импорта прайс-листов, Ruby, ~40 тысяч строк Модель и инструмент: агент в терминале, доступ к репозиторию и запуску тестов Дата: условная

Шаг 1. Критерии приёмки до промпта

  1. Названа конкретная строка или функция, в которой теряется значение, а не «проблема в парсинге».
  2. Объяснено, почему тест проходит локально и падает в CI — с указанием различающегося условия.
  3. Есть воспроизведение в двух командах, которые я могу выполнить сам.

Четвёртый критерий («предложить исправление») я сознательно не стал добавлять: на этом заходе мне нужен диагноз, а не патч.

Шаг 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-функцию агент дальше использовал как установленный факт и строил на нём следующие версии. Пока я не начал новую сессию, ни одна правка промпта не помогала.

Моё правило остановки сессии: если два подряд ответа опираются на утверждение, которое я уже опроверг, — новая сессия с перенесёнными фактами, а не третья попытка переубедить.

Итог вечера

  • Критерии приёмки формулирую до открытия агента
  • Есть воспроизведённый отказ и снявшая его правка
  • Знаю, что лежит во входе модели, и умею это посмотреть
  • Правила и решения лежат в репозитории
  • Есть момент, когда я прекращаю сессию, а не спорю с агентом

Что отработать на следующей задаче: шестой шаг целиком — поведение на длинной задаче и что именно переживает компактизацию.


Что показывает этот пример

  • Первые три прогона дали не решение, а диагноз: проблема была не в промпте, а в том, чего во входе не было.
  • Найденный отказ оказался контекстным, хотя выглядел как «модель галлюцинирует». Разница видна только если посмотреть фактический вход.
  • Самое ценное, что осталось после вечера, — две строки в репозитории, а не удачный промпт.