Все записи
6 мин

Claude Code уверенно поставил диагноз бага. Я ответил «мне кажется ты врёшь» — и оказался прав

claude codeвайбкодингtelegram-боты

Если совсем коротко, то утренний пуш в моём Telegram-мини-аппе перестал приходить, Claude Code уверенно объяснил это рестартом контейнера и пропущенными задачами планировщика, я ему не поверил и в итоге оказался прав, потому что настоящая причина сидела в ограничении базы данных, которое тихо роняло запись. И если вы работаете с ИИ как с напарником по коду, то вывод тут такой: уверенный тон нейросети — это ещё не доказательство, что она права, и иногда самое полезное, что вы можете сделать, это прямо сказать ей «мне кажется ты врёшь» и заставить копать заново.

Что вообще сломалось

У меня в Картаре есть утренний пуш — короткое сообщение пользователю в 9:30 по Москве, такой ежедневный заход. И вот несколько дней подряд он просто не приходит. Я открываю телефон в 9:31, жду, а там тишина. На второй день я уже начинаю закипать, потому что фича вроде сделана, протестирована, задеплоена, а по факту каждое утро молчит так, будто её и нет.

Дословно я тогда написал что-то вроде «пуш снова не пришёл в 9:30, заебало уже, сломалось». Не самое экспертное описание бага, согласен, но по эмоции точное. Когда ты соло, и весь день за рулём, а разработкой командуешь с телефона, то такие мелочи бесят сильнее любого падения на проде, потому что они тихие, сами по себе в логах не видны, и ты вообще не понимаешь, где искать.

Красивый диагноз от нейросети

Дальше я скинул проблему в Claude Code, и он выдал мне диагноз. Причём выдал уверенно, складно, с технической логикой, к которой на первый взгляд не придерёшься. Звучало это так: контейнер бота пересоздался при деплое, планировщик задач (apscheduler) не догоняет те задачи, что он пропустил, пока контейнер перезапускался, и поэтому утренний пуш просто проваливается мимо. И тут же предложил решение — увеличить параметр misfire_grace_time до 3600, чтобы планировщик подбирал пропущенные задачи в окне до часа.

И вот это очень характерный момент в работе с ИИ-агентом, который я хочу разобрать подробно, потому что в нём вся суть. Объяснение выглядело правильным. Оно опиралось на реальный механизм, ведь apscheduler действительно умеет пропускать misfire-задачи, да и контейнер при деплое действительно пересоздаётся. Всё по отдельности правда. Claude Code собрал из правдивых кусочков связную историю, в которую легко поверить, потому что она технически грамотная и звучит как ответ от человека, который знает, о чём говорит.

Если бы я был чуть более уставшим или чуть менее упрямым, я бы просто принял этот диагноз, поправил misfire_grace_time, задеплоил и пошёл дальше. И починил бы не ту проблему. Пуш бы как не приходил, так и не приходил, а я бы ещё неделю думал, что дело в планировщике.

Почему я не поверил

Меня зацепило одно несовпадение. Я-то знаю, что происходило с проектом в те дни, а нейросеть не знает — она видит код и логи, но не видит мою память о том, что я реально делал. А делал я вот что: деплоев в те дни не было вообще, мы ничего не выкатывали. То есть если контейнер не пересоздавался, то и рестарта не было, и вся история про misfire рассыпается прямо в основании.

И второе — вечерний пуш про подарок приходил нормально. То есть один шедулерный пуш доходит, а другой нет. Если бы дело было в планировщике и пропущенных задачах, то страдали бы оба, ведь они в одном контейнере, в одном процессе. А тут утренний молчит, вечерний работает. Это уже не похоже на инфраструктуру, это похоже на что-то конкретное именно в утреннем.

Так что я написал прямо: «мне кажется ты врёшь. Дело не в рестарте сегодня, сегодня мы пуши вообще не делали, только вчера». Не очень вежливо, зато честно. И это, как ни крути, главный инструмент в работе с ИИ — не вежливость, а готовность сказать нейросети, что её красивое объяснение не сходится с фактами, которые знаешь только ты. Я так же гонял два ИИ друг против друга и смотрел, кто из них в итоге оказался прав — уверенность сама по себе ничего не доказывает.

Настоящая причина

Когда я снёс первую версию диагноза и заставил искать заново, уже отталкиваясь от моих возражений, картина сложилась совсем другая. Реальная причина оказалась в базе. В таблице, где логируются отправленные уведомления, на поле с типом уведомления висел CHECK-constraint — это такое ограничение в схеме базы, которое разрешает писать в колонку только заранее перечисленные значения. И вот тип утреннего пуша, morning_digest, в этот список разрешённых значений просто не попал.

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

То есть это был даже не баг кода в том виде, как Claude Code описал его сначала. Это было ограничение схемы базы данных, к которому ни логика про планировщик, ни misfire_grace_time вообще никакого отношения не имели. Если бы я полез крутить настройки apscheduler, я бы потратил время и ничего не изменил, потому что проблема жила на два слоя ниже — в том, что база отказывалась принимать тип записи.

Что я с этого вынес

Главный вывод тут не про этот конкретный баг, а про то, как вообще устроена разработка с ИИ. Нейросеть — сильнейший напарник, она реально пишет код, который я сам писать не умею, и я этого не скрываю: я оркестрирую, а код пишет Claude Code. Но у этого напарника есть одна особенность — он всегда звучит уверенно. У него нет интонации сомнения, он не скажет «слушай, я не уверен, но возможно». Он выдаёт диагноз ровным тоном эксперта независимо от того, прав он или нет.

А значит, ответственность за проверку лежит на вас, а не на нейросети. У вас есть то, чего у неё нет — память о том, что вы реально делали, контекст вокруг кода, чутьё на «это не сходится». Деплоев не было, а он говорит про рестарт. Один пуш работает, другой нет, а он говорит про общий планировщик. Вот эти несовпадения и есть ваше оружие, замечайте их и тыкайте в них носом.

У меня это уже не первый раз, когда красивое «готово» или красивый диагноз от агента расходится с реальностью — про похожие тихие провалы я писал в четырёх косяках Claude Code за четыре дня. И каждый раз вывод один и тот же: ИИ ускоряет работу в разы, но не отменяет того, что думать всё равно надо вам. Если вы делаете чат-бота с нейросетью или любую автоматизацию для бизнеса, где есть рассылка в боте телеграм, фоновые задачи и база, то закладывайте время не только на код, но и на проверку тех диагнозов, которыми вам этот код объясняют.

Так что когда нейросеть в следующий раз уверенно скажет вам, в чём проблема, а у вас в животе шевельнётся «что-то тут не то», не глушите это чувство. Спросите её прямо. Иногда «мне кажется ты врёшь» экономит неделю починки не той проблемы, и это, пожалуй, самый недооценённый навык в вайбкодинге. Вот и делайте выводы.