Desktop app could not discover a Krill server running on the same machine. Remote servers (on separate Pi nodes) appeared normally. The demo-recording pipeline was completely blocked because it co-locates the app and a sandbox server on the same box.
ClientBeaconWireHandler.handleIncomingWire filtered “own” beacons by comparing wire.host() == hostName. When app and server share a host, both advertise the same hostname in their beacons, so the server’s beacon was indistinguishable from the client’s own and was silently dropped — even though their installId values are different.
composeApp/src/commonMain/kotlin/krill/zone/app/io/beacon/BeaconWireHandler.kt: replaced the hostname equality check with wire.installId == selfId(). Added selfId: () -> String = installId constructor parameter (default preserves existing behavior) so the seam is testable without reading the filesystem.composeApp/src/desktopTest/kotlin/krill/zone/app/io/beacon/ClientBeaconWireHandlerSelfFilterTest.kt with three cases: own-beacon dropped, same-host server beacon accepted, remote server beacon accepted.installId (stable UUID) for any “is this my own beacon?” check, not hostName. Hostname equality is not a unique identity — it breaks whenever two processes share a host.installId correctly; the self-filter should have matched it.expect-val (installId, hostName, platform), inject it as a constructor parameter with a default so the unit is testable without an environment.