Kraken nightly bug-hunt flagged DefaultNodeObserver.jobs as potentially mutated from multiple coroutines without synchronization.
The hypothesis was a false positive — every access to jobs was already serialized through mutex.withLock { ... }. However, mutex was declared public (val mutex = Mutex()), which would allow external code to hold the same lock and accidentally cause a deadlock. No deduplication test existed to confirm that calling observe() twice for the same node correctly produces only one collection job.
mutex private in DefaultNodeObserver (shared/src/commonMain/kotlin/krill/zone/shared/node/NodeObserver.kt).observe called twice for the same node does not double-dispatch test to DefaultNodeObserverDispatchTest to guard the deduplication invariant.Mutex, Channel, AtomicReference) should always be private; public visibility is a smell that invites callers to take the lock themselves.