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

Условный пример к [рабочему листу](/prompt-and-context/worksheet/) и
[практикуму](/articles/prompt-and-context-engineering-practice.html).
Задача, репозиторий, промпты и результаты собирательны: это образец того, как
выглядят заполненные поля, а не отчёт о конкретном вечере с измеренными
последствиями. Цифры здесь — наблюдения одного человека на одной задаче, они
ничего не доказывают и не переносятся на другие проекты.

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

---

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

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

## Итог вечера

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

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

---

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

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