Общий переключатель прав запер бесплатную пробу ИИ-карточек у всех новых пользователей. Мы вернули её отдельным правилом
30 сентября в поддержку в MAX написал новый пользователь — назовём его Александр. Он только что завёл бесплатный кабинет, Авито ещё даже не подключал, и на первой же попытке сделать ИИ-карточку получил одну-единственную ошибку: «Не удалось загрузить фото».
Полезли в логи API. Загрузка фото ответила 402 — само по себе это нормально, если у человека кончился лимит. Но мы на всякий случай дёрнули саму ручку бесплатной пробы, `/api/ads/ai-cards/free-trial`, — и она тоже вернула 402, хотя у Александра ещё не было ни одной использованной попытки. Лимит тут ни при чём: что-то не пускало человека на порог ещё до счётчика.
Причина нашлась в истории изменений от 28 августа. В тот день мы включили общий предохранитель прав доступа — он должен был закрыть дыры у платных функций: проверяет, подключён ли у тарифа нужный модуль, прежде чем пустить запрос внутрь ручки. До этого гейта на уровне прав не было вовсе — только разрозненные проверки внутри каждой ручки по отдельности.
Предохранитель сработал ровно так, как мы его написали. У прав на карточки (создать, посмотреть, отредактировать, удалить) стоит требование модуля `cards`, а у бесплатного тарифа список подключённых модулей пуст. Значит — 402 ещё до входа в саму ручку, независимо от того, что внутри неё давно жила отдельная, более тонкая лестница: бесплатная проба с водяным знаком, которую мы сознательно сделали доступной без модуля ещё 23 августа, решая ровно обратную задачу — дать попробовать, не продавая. Общий предохранитель не знал про это исключение и запирал его наравне с платными сценариями.
Эффект посчитали по цифрам, а не на глаз. На неделе 24 августа, пока общего гейта ещё не существовало, бесплатные кабинеты создали 2 карточных проекта — пробой почти не пользовались, но дверь была открыта. После 28 августа — 0. Ровно ноль, хотя за это время завелось 59 новых бесплатных кабинетов: ни один физически не мог дойти до функции, ради которой мы когда-то отдельно прописали для неё исключение.
Чинили не точечным костылём в одной ручке, а вынесли права на карточки в собственную тарифную лестницу — по тому же принципу, что уже работал для распознавания фото (там тоже есть бесплатный лимит поверх платной подписки, и он тоже один раз чуть не попал под общий гребень). Теперь у прав на карточки своя проверка: платный тариф — по модулю, бесплатный — по собственному счётчику проб и водяному знаку, а общий предохранитель в эту ветку вообще не заходит.
Проверили на кабинете Александра: ручка бесплатной пробы отвечает 200, свободная попытка 1 из 1, карточка выходит с водяным знаком, обычная ручка карточек — тоже 200. Александру сообщили, что всё починили, и он сделал первую карточку в тот же день.
Вывод, который я унёс себе. Когда ставишь общий предохранитель поверх системы, где уже есть тонкая логика исключений — пробных лимитов, демо-доступа, бесплатных дорожек, — одной проверки «не стало ли хуже платным сценариям» недостаточно. Нужно отдельно пройти именно по исключениям и спросить: а бесплатный путь всё ещё открыт? Иначе предохранитель молча запирает ту самую дверь, которую вы когда-то специально оставили приоткрытой, — и узнаёте вы об этом не из мониторинга, а из сообщения в поддержку от человека, который просто хотел попробовать продукт.