Шаблон — исправить баг
что делал, что ожидал, что получил
Что это
Запрос на починку отличается от запроса на новую функцию одним: здесь ты даёшь не задание, а улики. ИИ не видел, как оно ломалось, и всё, что у него есть, — твоё описание.
Из этого следует главное правило: не пересказывай ошибку своими словами. Отдай то, что видел, дословно, и добавь то, чего в трейсбеке нет, — что ты делал и чего ожидал.
Как выглядит в коде
Шаблон
Что делал: <действие, которое привело к ошибке>
Что ожидал: <какое поведение считаешь правильным>
Что получил: <вывод, трейсбек, скриншот — дословно>
<трейсбек целиком>
Где чинить: <если знаешь, в каком слое должно лечиться>Плохо
бот падает при погоде, починиИИ не знает ни города, ни ошибки, ни строки. Он начнёт переписывать весь хендлер целиком, попутно меняя то, что работало.
Хорошо
Что делал: отправил боту /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, {}) вместо проверки,
значение по умолчанию там, где должна быть ошибка. Падать перестанет,
врать начнёт.
Починено место падения, а не причина. Если правка коснулась только той строки, на которую указывал трейсбек, спроси: «откуда в эту функцию пришли неверные данные?»
Заодно переписано лишнее. Починка на две строки не должна давать дифф на полсотни. Добавляй в запрос: «меняй только то, что нужно для починки».
Починили, но не проверили. Дифф выглядит правильно — это не значит, что баг ушёл. Воспроизведи тот же случай, с которого начал.
Шпаргалка
Три строки: что делал · что ожидал · что получил.
Трейсбек отдавай дословно и целиком.
Скажи, в каком слое чинить, иначе починят место падения.
«Убрать ошибку» ≠ «починить причину».
Нет трейсбека — уликой служат два несошедшихся числа.
После починки воспроизведи исходный случай.