Android, ciris-client 0.5.209 + ciris-server 0.5.203, run #34228782947, live-qa-linux-android → logs/android-logcat.txt, pid 5838:
13:15:48.414 E AndroidRuntime: FATAL EXCEPTION: main
Process: ai.ciris.mobile.debug, PID: 5838
java.lang.Exception: Timeout waiting for services (10/22 online)
at ai.ciris.mobile.shared.viewmodels.StartupViewModel.waitForServices(StartupViewModel.kt:417)
at ai.ciris.mobile.shared.viewmodels.StartupViewModel$waitForServices$1.invokeSuspend(Unknown Source:14)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:101)
at android.os.Handler.handleCallback(Handler.java:958)
…
Suppressed: kotlinx.coroutines.internal.DiagnosticCoroutineContextException: [StandaloneCoroutine{Cancelling}@216a3c5, Dispatchers.Main.immediate]
13:15:48.473 ActivityManager: Process ai.ciris.mobile.debug (pid 5838) has died: fg TOP
A waitForServices timeout is raised as a plain Exception inside a coroutine on Dispatchers.Main.immediate with no handler, so it reaches the main thread and the process dies. Context: this is the no-AI session, after the client correctly re-pointed to the node on :4243 (0.5.209's #43 fix) — a node has no 22 agent services to wait for, so the count never arrives and the wait times out. The 10/22 it reports is presumably the last thing the agent showed before it handed off.
iOS, same run, live-qa-macos-ios → cmdlogs/ios-oslog.log: pid 33205 polls http://127.0.0.1:8080/v1/system/health and gets Connection refused for roughly a hundred seconds, then
13:19:10 launchd_sim: UIKitApplication:ai.ciris.mobile [33205]: exited due to SIGABRT | sent by iosApp[33205], ran for 102558ms
A self-sent SIGABRT is what an uncaught Kotlin/Native exception looks like, and the timing matches a services wait giving up — but the Kotlin-side text does not reach oslog, so I am presenting iOS as corroboration rather than the same trace. The consequence on iOS is worse than Android's: nothing restarts the app, so our next leg found no test server at all (no /health from :9091 within 120s).
What I would expect, without prescribing: a services-wait timeout is a UI state ("still starting", "could not reach the agent"), never a throw that escapes the coroutine; and on a run-without-AI install the wait should not be counting agent services in the first place — the backend is a node, and its readiness is /v1/identity (or whatever ActiveBackend names), not 22 services.
This is the third hand-off behaviour after the two on #43, and unlike those it ends the process. On desktop the same wait presumably exists but the app survives; on the phones it is fatal.
Android, ciris-client 0.5.209 + ciris-server 0.5.203, run #34228782947,
live-qa-linux-android→logs/android-logcat.txt, pid 5838:A
waitForServicestimeout is raised as a plainExceptioninside a coroutine onDispatchers.Main.immediatewith no handler, so it reaches the main thread and the process dies. Context: this is the no-AI session, after the client correctly re-pointed to the node on:4243(0.5.209's #43 fix) — a node has no 22 agent services to wait for, so the count never arrives and the wait times out. The 10/22 it reports is presumably the last thing the agent showed before it handed off.iOS, same run,
live-qa-macos-ios→cmdlogs/ios-oslog.log: pid 33205 pollshttp://127.0.0.1:8080/v1/system/healthand getsConnection refusedfor roughly a hundred seconds, thenA self-sent SIGABRT is what an uncaught Kotlin/Native exception looks like, and the timing matches a services wait giving up — but the Kotlin-side text does not reach oslog, so I am presenting iOS as corroboration rather than the same trace. The consequence on iOS is worse than Android's: nothing restarts the app, so our next leg found no test server at all (
no /health from :9091 within 120s).What I would expect, without prescribing: a services-wait timeout is a UI state ("still starting", "could not reach the agent"), never a throw that escapes the coroutine; and on a run-without-AI install the wait should not be counting agent services in the first place — the backend is a node, and its readiness is
/v1/identity(or whateverActiveBackendnames), not 22 services.This is the third hand-off behaviour after the two on #43, and unlike those it ends the process. On desktop the same wait presumably exists but the app survives; on the phones it is fatal.