3bfa82839b
CompletionResolver.resolve() used to hand the caller a successful "" reply whenever a turn's scrape came back empty (whether the read failed, or genuinely produced nothing), making a lost turn indistinguishable from a real empty answer. It also had no way to tell a crashed backend's near-instant BUSY -> DONE transition apart from a genuine completion. Add MIN_TURN_NANOS (2s), a named floor below which a completed turn is treated as a crash signature and failed rather than resolved as a reply. Fail on any empty scrape (read failure or a clean-but-empty read) instead of resolving with "". Both failures name the member and carry whatever is on the pane for context. Thread an injectable LongSupplier clock through CompletionResolver (matching the SessionManager/MessageService nowNanos pattern) so the floor is testable without a real sleep.