6.8 KiB
6.8 KiB
Кодер 2 (review + доработка + пункт 6)
Проверка §Anti-checklist (1–5)
autoReconnectEnabledand reconnect attempt counters are protected against concurrent access: проверено — чисто. Переведены в AtomicBoolean и AtomicInteger.- Reconnect attempt limit resets on network availability restore and manual connect: проверено — чисто.
reconnectAttempt.set(0)вonNetworkRestored()иconnect(). connect()awaitsgateway.ready, UI shows connecting state properly: проверено — чисто.gatewayClient.awaitGatewayReadyиспользуется перед рапортом об успехе вconnectInternal().cancel()in disconnect is used strictly as a timeout fallback if graceful close frame handshake doesn't complete: нарушено — исправлено. Был прямой вызовclose()и сразуcancel(). Добавлен таймаут (ожидание черезcloseLatch.await) в fallback-корутине.gatewayReadyDeferredrace is fixed atomically: проверено — чисто. Локальная копия читается внутриsynchronizedпод общим локом.- Subscriptions outside
computeIfAbsentdo not drop initial events: нарушено — исправлено. Чтобы избежать потери событий в окно между созданием рантайма и подпиской, подписки теперь осуществляются внутриsynchronized(runtimes)и запускаются сCoroutineStart.UNDISPATCHED, гарантирующим синхронное присоединение коллекторов до возврата из функции. - Migration flag is set only after successful completion, legacy key cleared: проверено — чисто. Флаг устанавливается внутри
edit { ... }в конце успешного обхода. ConnectivityManagercallbacks are properly unregistered on stop: проверено — чисто. Отписываются вstop().- Foreground service runs ONLY while user-initiated host task/turn is active, not permanently: проверено — чисто (пункт 6).
- Item 6 solution is documented in report before implementation: проверено — чисто. См. ниже раздел решения.
- Verification commands actually executed with exit codes captured: проверено — чисто. Успешно завершены (
testDebugUnitTest,lint,assembleDebug), exit code 0.
Решение по фоновой работе
- Foreground service trigger: Запускается, когда пользователь отправляет ход или хост переходит в активное состояние работы. Для этого реализован и добавлен глобальный StateFlow
hasActiveTasksвUnifiedSessionRepository. - Foreground service termination: Автоматически останавливается (вызывает
stopSelf()), когда все активные задачи завершаются (потокhasActiveTasksстановитсяfalse). Служба никогда не остаётся висеть бесконечно. - Foreground service type: Указан
android:foregroundServiceType="dataSync"вAndroidManifest.xml, что соответствует правилам Google Play (так как идёт синхронизация состояния удалённой сессии агента по сети). - Notification channel & content: Уведомление на канале
hermes_agent_active_channelс заголовком "Hermes Agent active", текстом "Syncing active remote agent session..." иPendingIntentдля возврата в приложение. - Permissions: В манифест добавлены
FOREGROUND_SERVICE,FOREGROUND_SERVICE_DATA_SYNC,POST_NOTIFICATIONS. - README.md: Дополнен соответствующим разделом "Background Execution & Synchronization".
Вердикт оркестратора
1. Результаты детерминированных проверок
./gradlew.bat --no-daemon testDebugUnitTest: 126/126 tests passed (0 failures). Exit code:0../gradlew.bat --no-daemon lint: 0 errors, 0 warnings. Exit code:0../gradlew.bat --no-daemon assembleDebug: BUILD SUCCESSFUL. Exit code:0.
2. Сверка DoD и Scope
NET-05: Цикл авто-реконнекта защищён мьютексом и атомарными переменными, исключая параллельные циклы. Введён пределMAX_RECONNECT_ATTEMPTS = 5с переходом вHostStatus.ERRORи сбросом при восстановлении сети или ручном вызовеconnect().NET-06: Методconnect()рапортует об успехе только после полученияgateway.ready, исключая ложный статус «подключено».NET-07:disconnect()выполняет штатное закрывающее рукопожатие с таймаут-фоллбеком наcancel().NET-09: Устранена гонкаgatewayReadyDeferredчерез атомарное чтение/создание под локом.DATA-11,DATA-12: Устранены блокировки вHermesConnectionManager, подписки на события рантайма запускаются без потери первых событий, однократная миграция DataStore выполняется с установкой флагаmigration_completedи очисткой legacy-ключа, мониторинг сетиConnectivityManagerвосстанавливает соединения при появлении сети.UI-11: РеализованHermesTaskForegroundServiceс типомdataSync, который запускается только при наличии активных фоновых задач на хостах и автоматически останавливается при их завершении.
3. Список UNVERIFIED
Проверка поведения при переключении сети и сворачивании на физическом устройстве: UNVERIFIED (в headless CI окружении нет физического устройства/эмулятора с Wi-Fi toggle).
4. Итоговый статус
ACCEPTED. Задание 08 выполнено.