Программирование с ИИ
ENRU
3.5

Шаблон — исправить баг

что делал, что ожидал, что получил

Что это

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

Из этого следует главное правило: не пересказывай ошибку своими словами. Отдай то, что видел, дословно, и добавь то, чего в трейсбеке нет, — что ты делал и чего ожидал.

Как выглядит в коде

Шаблон

Запрос
Что делал: <действие, которое привело к ошибке>
Что ожидал: <какое поведение считаешь правильным>
Что получил: <вывод, трейсбек, скриншот — дословно>

<трейсбек целиком>

Где чинить: <если знаешь, в каком слое должно лечиться>

Плохо

Не так
бот падает при погоде, почини

ИИ не знает ни города, ни ошибки, ни строки. Он начнёт переписывать весь хендлер целиком, попутно меняя то, что работало.

Хорошо

Лучше
Что делал: отправил боту /weather Тёнсберг
Что ожидал: ответ «Город не найден» — такого города в API нет
Что получил: исключение, бот не ответил вообще

Traceback (most recent call last):
  File "handlers/weather.py", line 34, in cmd_weather
    await message.answer(format_report(data))
  File "handlers/weather.py", line 11, in format_report
    temp = data["main"]["temp"]
           ~~~~^^^^^^^^
KeyError: 'main'

Где чинить: ошибку API надо ловить в fetch_weather,
а не в format_report.

Как сказать ИИ

Три вопроса, без которых не чинят

Что делал. Шаги воспроизведения. Если ошибка не каждый раз — скажи и это: «падает примерно раз из пяти» меняет направление поиска полностью.

Что ожидал. Без этого ИИ не отличит баг от задуманного поведения. В примере выше именно эта строка говорит, что «Город не найден» — нормальный ответ, а не ошибка.

Что получил. Дословно. Трейсбек целиком, от слова Traceback. Как его читать — статья 2.12.

Где чинить — необязательно, но ценно

Если не сказать, ИИ починит там, куда указал трейсбек. А место падения и причина — разные места. Строка 11 честно делает, что просили; виновата строка, где решили, что ответ сервера — это погода.

Если трейсбека нет

Бывает, что ничего не падает, а просто работает неправильно. Тогда уликами становятся данные:

Запрос
Что делал: /stats за октябрь
Что ожидал: 142 записи, как в базе
Что получил: 138

Вот запрос, которым считаю: <код>
Вот что в базе: <вывод SELECT COUNT(*)>

Два числа, которые не сошлись, — такая же улика, как трейсбек.

На что смотреть

ИИ глушит ошибку вместо того, чтобы её обработать. Признаки в диффе: try/except вокруг упавшей строки, .get(key, {}) вместо проверки, значение по умолчанию там, где должна быть ошибка. Падать перестанет, врать начнёт.

Починено место падения, а не причина. Если правка коснулась только той строки, на которую указывал трейсбек, спроси: «откуда в эту функцию пришли неверные данные?»

Заодно переписано лишнее. Починка на две строки не должна давать дифф на полсотни. Добавляй в запрос: «меняй только то, что нужно для починки».

Починили, но не проверили. Дифф выглядит правильно — это не значит, что баг ушёл. Воспроизведи тот же случай, с которого начал.

Шпаргалка

  • Три строки: что делал · что ожидал · что получил.

  • Трейсбек отдавай дословно и целиком.

  • Скажи, в каком слое чинить, иначе починят место падения.

  • «Убрать ошибку» ≠ «починить причину».

  • Нет трейсбека — уликой служат два несошедшихся числа.

  • После починки воспроизведи исходный случай.