feat(robustness+ui): отказоустойчивость main, тесты, a11y-полировка, лицензия
Надёжность main-процесса: - глобальные uncaughtException/unhandledRejection (лог + flushNow) - safeHandle/safeOn вокруг всех IPC-хендлеров (не падаем молча, generic-ошибка наружу) - таймаут 4s на tasklist, Atomics.wait вместо busy-spin на exit-записи - единый log.error для фоновых сбоев вместо console.error/тишины Тесты (178 -> 203): meeting-detect, scheduler-gating, store (миграции/карантин/cap). UI/UX: - prefers-reduced-motion через MotionConfig + CSS media-блок - Spinner/Skeleton примитивы, loading-состояния вместо пустых заглушек - aria-live анонсы достижений и выполнения (useAnnounce) - оформленные пустые состояния, клавиатура в меню ExerciseCard Лицензия: проприетарный LICENSE + правка README/CLAUDE.md, счётчик тестов. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -127,7 +127,15 @@ async function bootCheckWithRetry(): Promise<void> {
|
||||
return // success
|
||||
}
|
||||
const delay = BOOT_RETRY_DELAYS[attempt]
|
||||
if (delay === undefined) return // exhausted retries
|
||||
if (delay === undefined) {
|
||||
// Исчерпали ретраи — раньше сдавались молча. Логируем, чтобы при
|
||||
// диагностике было видно «boot-check так и не достучался». Следующая
|
||||
// попытка — на ближайшем hourly-тике.
|
||||
log.warn(
|
||||
'[updater] boot check exhausted retries — will retry on hourly tick'
|
||||
)
|
||||
return
|
||||
}
|
||||
await new Promise((r) => setTimeout(r, delay))
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user