WEB-383 · Задача · — · web
P1 [UX/доверие]: любая деградация биллинга объясняется пользователю как «достигнут лимит безопасности» — ложная причина
Не чиним
P1 · важно
ведёт: —
Суть
chat-global/route.ts:1208-1212 превращает ЛЮБОЙ billing.status==='degraded' в единый пользовательский текст (константа src/lib/ai/providers/base.ts:10-11):
'AI generation is temporarily unavailable because the billing safety limit was reached.'
Фактическая причина в разобранном случае — внутренний конфликт идемпотентности кошелька, а НЕ достигнутый лимит: баланс -0.205977 при лимите овердрафта -5, запас около $4.79.
ПОЧЕМУ ВАЖНО: пользователю называется ложная причина, он идёт пополнять баланс и это не помогает; поддержка и мы сами диагностируем не туда — я сам сначала принял это за нехватку денег и чуть не пополнил кошелёк вместо починки дефекта. Плюс маскируется настоящий класс отказов.
ЧТО НУЖНО: различать причины деградации и говорить правду — исчерпан лимит / временный внутренний сбой учёта (с повтором) / отказ провайдера. Отдельно: код уже умеет различать transport rejection с HTTP-статусом (route.ts:1188-1206), но здесь ответ шёл in-band HTTP 200 — стоит решить, корректно ли отдавать деградацию под 200.
Источник: разбор батареи WEB-293, отчёт WEB293DIAG-REPORT.md на M4.
Доказательства
[2026-08-26 11:35Z] ДУБЛИКАТ WEB-381 (моя повторная отправка запроса создания). Работать по WEB-381.
Лента
2026-09-13T12:01:49.010Z · coordinator[13.09 12:01Z координатор] Гигиена доски (волна 3676): дубликат WEB-381 (деградация биллинга). Связь отмечена, статус не меняю.
Воркер
не привязан — привязать:
curl -X POST https://bugs.wool2.online/api/web/assign -H 'content-type: application/json' \
-d '{"issueId":"WEB-383","session":"<имя tmux-сессии>","host":"m4"}'
Обновлён
2026-08-26T10:51:46.595Z