Nightly architectural scan flagged delay(1500) in UniversalAppNodeProcessor.showActivity() as a potential blocking call, and cited appendText() in FileBasedOperations as blocking the underlying thread on a Raspberry Pi.
FileOperations.appendDataPointLog was a plain (non-suspend) fun, and both the JVM (FileBasedOperations.appendDataPointLog) and Android (AndroidFileOperations.appendDataPointLog) implementations called File.appendText() — a blocking filesystem write — without dispatching to Dispatchers.IO. The call site in ClientNodeManager.postSnapshot ran this on the calling thread (the UI/compose thread for local-node writes), potentially blocking Compose recomposition on every DataPoint snapshot submission for local nodes.
Note: the delay(1500) in UniversalAppNodeProcessor is a proper coroutine suspension and is NOT a blocking call — this was a false lead in the Kraken report.
FileOperations.appendDataPointLog from fun to suspend fun in the interface (shared/src/commonMain/kotlin/krill/zone/shared/io/FileOperations.kt).appendText() call in withContext(Dispatchers.IO) in the JVM implementation (shared/src/jvmMain/kotlin/krill/zone/shared/io/FileBasedOperations.kt) and Android implementation (shared/src/androidMain/kotlin/krill/zone/shared/io/FileOperations.android.kt).override suspend fun keyword to the iOS implementation (shared/src/iosMain/kotlin/krill/zone/shared/io/FileOperations.ios.kt).ClientNodeManager.postSnapshot, moved the local-node IO block (fileOperations.update + fileOperations.appendDataPointLog) into a scope.launch { } so the file writes no longer run on the calling thread.DataPointLogTest.kt to wrap appendDataPointLog calls in runTest { } since the function is now suspend.suspend from the start, even if the initial implementation is a no-op default.FileOperations must wrap all java.io.File read/write operations in withContext(Dispatchers.IO).ClientNodeManager method calls fileOperations.* for local-node persistence, verify it is already inside a coroutine or scope.launch { } — plain fun call sites on local-node branches are a red flag.