~/VibeHandbook

Глава 12 · 03

Кейс 3: Утилита личной автоматизации

Идея

Чисто эгоистичная: скрипт, который каждое утро берёт события из календаря на день и погоду, форматирует однострочное резюме и отправляет его в личный чат Telegram. Смысл был в том, чтобы перестать открывать три приложения до кофе.

Спецификация

Запланированная задача, выполняющаяся в 7 утра по моему часовому
поясу. Она читает сегодняшние события из моего календаря, получает
прогноз для моего города и отправляет одно сообщение в Telegram
вроде: «3 события сегодня, первое в 9:30. Макс 24C, дождь после 16:00».
Если какой-то источник падает, всё равно отправь то, что есть, и
отметь, чего не хватает.

Это последнее предложение — деградировать корректно вместо того, чтобы падать, — это тот вид поведения, о котором приходится просить явно. AI не будет его предполагать. Если не сказать, умолчание, к которому тянется модель, — это «бросить исключение при ошибке», а для cron-задачи в 7 утра это означает тихое утро и никакой подсказки, почему.

Стек

Одна запланированная serverless-функция (запускаемый по Cron Worker), чтобы не было машины, которую нужно держать включённой. Всё целиком — это один файл плюс расписание. Для личной утилиты это важнее, чем звучит: что угодно с сервером, за которым нужно присматривать, — это то, за что вы в конце концов забудете заплатить, и проект умрёт от запущенности, а не от сбоя.

Ключевые промпты

Напиши Cloudflare Worker, запускаемый по cron в 7 утра Asia/Seoul.
Он вызывает API погоды и API календаря (оба токена я предоставлю как
секреты), собирает однострочное резюме и делает POST в Telegram Bot
API. Оберни каждый внешний вызов в try/catch, чтобы один сбой не
убил сообщение. Читай каждый токен из env.

Когда мы захотели поитерировать над формулировками, не дожидаясь 7 утра:

Добавь ручной триггер: если по Worker приходит GET-запрос с
query-параметром ?test=1, запусти ту же логику немедленно и верни
текст сообщения в ответе вместо отправки. Спрячь это за секретным
токеном, чтобы только я мог это триггерить.

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

Препятствие

Сообщение в Telegram пришло, но времена были неверными: события показывались в UTC, а не по корейскому времени. С погодой всё было в порядке. Мы изолировали это:

Времена календаря смещены на 9 часов — показывают UTC, а не
Asia/Seoul. Время погоды («дождь после 16:00») верное. Вот как я
форматирую и то, и другое: [вставлено]. Исправь только форматирование
календаря и скажи мне, почему путь погоды уже был верным.

AI объяснил, что API погоды уже возвращал локализованные строки, тогда как API календаря возвращал UTC-метки времени, которые мы печатали в сыром виде. Он добавил одно преобразование часового пояса на шаге форматирования календаря. Ограничение исправления «только путём календаря» не дало ему переписать работающий код погоды — распространённый способ, которым исправления AI ломают то, что было в порядке. Вторая половина того промпта — «скажи мне, почему путь погоды уже был верным» — выполнила двойную работу: она дала нам настоящую первопричину вместо догадки и заставила AI сформулировать различие, чтобы его исправление случайно не «гармонизировало» два пути в один сломанный.

Запуск

«Запуск» здесь означал просто деплой Worker, установку cron-расписания и добавление API-токенов как зашифрованных секретов. Мы несколько раз дёрнули эндпоинт ?test=1, чтобы убедиться, что сообщение читается хорошо, а затем оставили его. С тех пор он работает каждое утро — и строка про корректную деградацию доказала свою ценность через месяц, когда у API погоды был сбой, а сообщение всё равно пришло, просто без прогноза.

Хотите офлайн-версию?

Получите PDF + EPUB + скачиваемую библиотеку промптов + обновления версий.

$ Получить PDF — $39