День когда всё сломалось и починилось
Сегодня утром открыл систему управления каналами и увидел что одна из вилл стоит 3.6 миллиона за ночь. В моей базе — 950 тысяч. Разница в 4 раза. Отчёт скрипта при этом говорит что цены обновились успешно 138 раз. Началась охота за багом. К полуночи я закрыл 21 блок работы, переписал три системы, выделил отдельный проект, добавил QA-гейты в пять агентов и вытащил скрытые ID через DevTools. День когда всё сломалось и в процессе починки выросло в 5 раз.
Первая линия защиты: разница в 4 раза
Проблема началась с простого вопроса: как цена на виллу в базе может не совпадать с реальностью на 380%? Полез разбираться в логи скрипта. Логи говорят что цены обновились. HTTP 200, всё должно быть в порядке.
Оказалось что менеджер каналов сидит за firewall. Когда мой скрипт отправил 119 запросов подряд через один логин, первые 20 прошли, а остальные молча дропнулись. Не ошибка, не timeout, просто тишина. HTTP 200, тело ответа пустое, всё как будто в порядке. Скрипт радовался что всё обновилось, а в реальности ничего не изменилось после 20-го запроса.
Это классическая ловушка автоматизации: когда успешный статус кода не означает успешное исполнение команды. Я добавил проверку ответа. Теперь скрипт смотрит не только на статус, но и на то, есть ли данные в ответе. Если их нет — это не успех.
Цены на год: когда нужно разделить три модели
После того как разобрался с багом, понял что нужно пересинхронизировать цены на несколько вилл. Перезалил четыре объекта на год вперёд: 21 блоком по 60 дней. Проверил через браузер что реально применилось, не доверился скрипту после первого бага.
На одной из вилл контракт истекает в июле. На неё я сделал особый правило: цена действует до срока окончания, а потом откатывается на рыночную. Это не просто правило для одной виллы, это поворотная точка в том как я вообще думаю про цены.
Пока я крутил цены, понял что у меня есть три разные модели: цены за которые уже получена оплата вперёд (максимизируй выручку), цены где нужно достичь break-even (минимальный заработок), и цены где всё окупилось (любой заработок это бонус). Одна формула на все не подходит. Нужны три.
Видео которое сломало контент-бота
Пока я разбирался с ценами, в чате пишет менеджер от клиента (клиника, автоматизация контента). Контент-бот не принимает видео больше 20 мегабайт. Telegram Bot API на таких файлах выдаёт ошибку 400, и мы эту ошибку раньше не ловили. Бот просто падал.
Добавил fallback. Если файл больше 20 МБ, бот не пытается загрузить его через обычный API. Вместо этого он использует Telethon с user session (это уже было подключено под другую задачу с расписанием постов). Telethon может работать через MTProto с лимитом 2 гигабайта на файл.
Это не просто баг-фикс. Это паттерн: когда одна система упирается в потолок, попробуй использовать уже имеющуюся мощность из другой системы. Telethon уже был в коде, просто не применялся в этом контексте.
Маркетинг-агент: когда QA нужен до публикации, не после
Потом я открыл свой Instagram и почти упал. За неделю marketing-агент запостил 14 каруселей с фейковыми цифрами: «10 лет опыта, 4.9 из 5 звёзд, 50+ проектов» — и всё это на фоне AI-картинок с markdown-разметкой прямо на слайдах.
Снёс все 14 постов через Graph API. Оставил только один который был корректный. Потом разбираться с корневой причиной. Оказалось что агент писал текст один раз, а потом публиковал его без проверки. Плюс функция которая накладывает текст на фон, не удаляла спецсимволы.
Но главное — я добавил pre-publish guard. Эта система блокирует слова из чёрного списка (фейковые цифры, маркетинговые клише типа «Отличный вопрос!»), и потом запускает inline QA через gpt-4o-mini перед тем как пост попадёт в сеть. QA читает готовый пост и даёт либо PASS (опубликовать), либо FAIL (держать в черновиках).
Потом я прописал те же правила ещё пяти агентам под остальные соцсети. Теперь у каждого есть чёрный список и inline QA перед выходом.
Масштабирование через честные цифры
После обеда сел заниматься виллами по-взрослому. Зафиксировал финальную формулу дележа прибыли с инвесторами и разнёс эту формулу по трём файлам unit-economics. Каждый объект теперь имеет честную модель: когда окупается, какой баланс при разной загрузке (50% / 75% / 90%), какие решения принимать при каждом сценарии.
Формула одна на всех, без исключений. Это не просто финансовое правило. Это удаляет место для ошибок. Когда виллу нельзя оценивать по разным моделям, экономику можно предсказать.
Применил новую модель цен на 13 вилл. Разделил их по признаку: аренда оплачена вперёд или нет. Где оплачена — работает формула максимизации выручки (цена до предела). Где не оплачена — работает break-even модель (минимальная безопасность). Перезалил 12 объектов, активировал виллу куда я сам переехал на прошлой неделе.
Chrome DevTools как способ обойти firewall
Отдельный брейктру: до этого я не мог автоматически вытащить ID комнат из панели менеджера, потому что она блокирует IP сервера. Всё что остаётся в логах — это ошибка доступа, 403 Forbidden.
Запустил Chrome DevTools прямо на маке. Из Бали IP не блокируется, потому что это личный девайс. Написал JS-скрипт который собирает все ID комнат через вкладку Elements, и в 30 секунд у меня было 25 ID вместо того чтобы вводить вручную или ждать ответа от менеджера.
Это не техническое решение. Это показатель того как система может быть устроена неправильно. DevTools — это средство разработчика, но когда обычные каналы заблокированы, он становится единственным способом двигаться вперёд.
Выделение проектов и переведение систем
К вечеру выделил проект Atomy в отдельную Paperclip-компанию (это клиент на автоматизацию). Написал промпты трём агентам: CEO, CTO и SEO. Оформил чек-лист из 6 фаз под индонезийский сайт.
Параллельно закрыл дыру в передаче гостям кодов Wi-Fi: теперь коды отправляются только в день заезда активной брони, не раньше (раньше было много спама по гостям которые ещё не приехали). Синхронизировал таблицу с Google Sheets на Postgres, прикрутил proactive пуш через существующий пайплайн каждые 5 минут.
Когда успех скрывает отказ
Главный инсайт дня не в одном из этих фиксов. Главный инсайт в том что успешный статус кода может означать отказ. HTTP 200 не означает что данные доставлены. Pre-publish QA не означает что контент будет правильным (нужно делать перед публикацией, не после). Один скрипт может быть рабочим, но неправильным в контексте системы (три модели цен вместо одной).
День когда всё сломалось — это не катастрофа. Это признак что система наконец показала свои трещины. И когда трещину видишь, можно её закрыть. Я закрыл 21. К завтрашнему дню система будет жёстче.
Один день с 16 виллами, тремя социальными сетями, системой цен и пятью контент-агентами. День который выглядел как отладка, а на самом деле был переаудитом всей операционки.