WEB board

всеканоны и докиворкеры↗ iOS↗ Легаси
WEB-374 · Дефект · — · web

P0 [ДЕНЬГИ]: WalletIdempotencyConflictError — повторные одинаковые запросы тратят вендора и врут пользователю про billing-лимит

Закрыт P0 · горит ведёт: fable-coordinator
Доказательства
[2026-08-26 05:50Z] ФИКС web374 (P0 деньги): 10 одинаковых запросов -> vendor вызван 1 РАЗ, все ответы содержательные, двойного списания НЕТ, replay возвращает прежний результат, реальный wallet-limit сообщается ЧЕСТНО и ДО vendor-вызова (деньги не тратятся впустую). Integration 3/3. -> review, запущена независимая монетарная приёмка acc374 (гонка 10 параллельных, изоляция пользователей, vendor-сбой после резерва, сверка сумм ledger до/после).
[2026-08-26 07:05Z] acc374b: replay ИСПРАВЛЕН (параллельные получают ответ лидера, vendor 1 раз, одно списание). НО собственный негатив приёмщика нашёл ⭐ ДЕНЕЖНОЕ СКЛЕИВАНИЕ МЕЖДУ ПОЛЬЗОВАТЕЛЯМИ: два разных юзера с одинаковым текстом и requestId -> vendor дважды, но один из двух wallet holds ПРОПУСКАЕТСЯ по ГЛОБАЛЬНОМУ idempotency key (dark compatibility path), receipt остаётся AMBIGUOUS. Фикс web374fix2: ключ идемпотентности обязан включать владельца (tenant/user).
[2026-08-26 08:30Z] ✅ ПРИНЯТ acc374c (третья независимая монетарная приёмка): GO. Межпользовательское склеивание закрыто — ключ идемпотентности включает владельца, два юзера с одним requestId получают раздельные holds и детерминированные receipt (ни одного AMBIGUOUS), суммы раздельные; 10 параллельных одного юзера -> vendor 1 раз, одно списание, все получают ответ лидера; итоговая сверка ledger сошлась. Ветка web374. -> done, ждёт посадки 58.
Починено в
pending-l58
Воркер
не привязан — привязать: curl -X POST https://bugs.wool2.online/api/web/assign -H 'content-type: application/json' \ -d '{"issueId":"WEB-374","session":"<имя tmux-сессии>","host":"m4"}'
Обновлён
2026-08-26T07:28:33.800Z