11 активных кейсов в продакшене, 177 открытий уже сделано. Тестируем витрину, открытие, эконометрику фонда, инвентарь, бесплатные кейсы и админку.
Прогон по бэку и реальному API под тест-юзерами (без новых скринов — проверялись списания, атомарность, порядок балансов, скидки, инварианты фонда). UI-замечания перенесены с прогона 28.05 без изменений: код фронта с тех пор не трогали.
Collection::times($quantity, fn () => $action->execute(...)) — открытия идут в цикле без общей транзакции, без пред-проверки пулов и без отката. Если на N-м шаге кейс деактивируется (исчерпан уровень) — предыдущие списания и скины остаются, юзер получает «3 из 5» и сырую ошибку. Повторно деактивировать живой кейс ради демонстрации не стал. Ждём решение: Вариант 1 (частичный возврат) / Вариант 2 (полный откат «5 или 0»).cases:doctor: 16 нарушений в 10 кейсах — без изменений с 28.05, не чинили. 6 рабочих кейсов с пустым уровнем «Армейское» — «спящие мины» под тот же баг №3. Кейс CS:GO Weapon Case 2 (id 24) до сих пор деактивирован с прошлого прогона.cases:guard-empty-levels каждые 10 мин. №5 скидка премиума показана на карточке (было→стало, бейдж −X%). №9 подтверждение перед «Продать всё». №7 склонение через pluralRu. №1 welcome-модалка не перекрывает витрину + меньше мобильный отступ шапки. Тесты: 288 зелёных (вкл. AtomicMultiOpenTest, GuardEmptyCaseLevelsTest). Деплой и скрины — на этапе верификации по «ок».Прошёл путь админа в браузере на изолированной базе: вход → список кейсов → форма создания → редактирование кейса (фонд, уровни, скины) → доктор кейсов. Цель — убедиться, что все элементы интерфейса и создание кейсов живые.




По уточнению заказчика прошёл по-настоящему: заполнял формы кликами в браузере и проверял результат в базе на каждом шаге. Не имитация — реальные клики.



welcome_modal_seen_at. Александр сказал: это пока не трогаем.


case_opening #178. Выпал предмет ценой 30,00 ₽, статус in_inventory.case_opening #178, остаток баланса 1 400,00 ₽.



deactivateCaseForEmptyLevel. Защита фонда. На 4-м открытии в серии ×5 этот уровень исчерпался → кейс автоматически деактивирован → 4-я и 5-я попытки получили 422. Юзеру показан общий поп-ап «Кейс деактивирован», без объяснения что 3 уже открылись.














/cases/31/open в логе не зафиксирован — то есть UI защита делает работу до запроса, бэк не дёргается. Баланс не меняется.



php artisan cases:doctor на проде — диагностика инвариантов всех кейсов.case_invariant_violations — логом нарушений (что и когда срабатывало).cases:doctor отрабатывает корректно, проходит по всем 11 активным кейсам, печатает разметку «активен/неактивен», список нарушений по типам.case_invariant_violations сейчас 16 записей. Самые старые с 7 мая, последние с 16 мая. Логика записи работает — каждое срабатывание защиты пишется с привязкой к кейсу, правилу, payload и времени.▶ eSports 2013 Case (id=22) [активен] [ОШИБКА] Уровень без свободных скинов: «Армейское»: 0/3 [ОШИБКА] Уровень без свободных скинов: «Запрещённое»: 0/3 [ВНИМАНИЕ] Журнал ≠ фонд: Σ журнала = 655.00 ₽ (фонд = 412.19 ₽) ▶ Operation Phoenix Weapon Case (id=28) [активен] [ОШИБКА] Уровень без свободных скинов: «Армейское»: 0/4 [ВНИМАНИЕ] Журнал ≠ фонд: Σ журнала = 640.00 ₽ (фонд = 377.25 ₽) […ещё 8 кейсов с похожими нарушениями…] Итого: найдено нарушений: 16 в 10 кейсах.
Полный вывод: screens/cases/s8-doctor-output.txt





feat/cases-atomicity-safeguard (одна транзакция на серию + страховка cases:guard-empty-levels). Зафиксировано здесь, как и договаривались, раз в ТЗ этого нет.