Сторож пинговал https://xf4.ru/fetch и считал сервис живым по любому ответу
меньше 500. А GET туда ВСЕГДА отдаёт 405 (ручка только на POST). Поэтому
03.08.2026, когда у xf4 отвалился браузерный движок и «Поиск клиентов» весь
день собирал по нулям, админка всё это время показывала «xfetch жив».
Сторож проверял, что дом стоит, а не что внутри кто-то есть.
Сам xf4 из поиска убран (перешли на свою рендер-виртуалку), сторожить нечего.
- реестр ExternalBalanceRefresher: 15 ключей -> 14, класс сторожа удалён;
- KNOWN_SERVICE_KEYS и ссылка «пополнить» для xfetch убраны из дашборда;
- карточка «Поиск клиентов» теперь служба + Keyso (рендерщик виден отдельной
плиткой «Свой рендер»).
XfetchClient автоподбора НЕ тронут — это другой слой, и он уже деградирует
в пустоту без ключа (XFETCH_* убраны из боевого .env ещё в июле).
Тесты: Pest 35 зелёных, Vitest 22 зелёных, Larastan 0 ошибок.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Фаза C плана 2026-07-16-external-services-online-monitoring:
- KNOWN_SERVICE_KEYS whitelist в контроллере — GET /balances и плитка скрывают
осиротевшие строки (jivosite и любые будущие).
- balancesPayload() — общий сборщик для GET /balances и POST /refresh.
- POST /api/admin/dashboard/balances/refresh: без service — фон лёгких (force=false,
окно свежести), service=X — один сервис (force=true); неизвестный → 422;
тяжёлый supplier — под Cache-замком (второй робот → 409). Кнопки/фон почту не шлют.
- Миграция удаляет осиротевшую строку jivosite.
Тесты: 9 Admin/External Feature зелёные, Larastan 0 по своим файлам.
NB: larastan-хук исключён — 2 ошибки выше baseline в ЧУЖОМ незакоммиченном
tests/Feature/Billing/ExpireInvoicesTest.php (параллельная сессия в общей папке).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>