pull
Pull a snapshot of the device's metrics: wait for the host's state to replicate in and settle, then collapse each CRDT to its reported value.
Waits until the host is connected and its first-contact full-state has actually merged — not merely until a peer appears — so it never returns the still-empty initial state over an asynchronous link. Bounded by MetricTapConfig.pullTimeout: a pull that does not converge in time throws kotlinx.coroutines.TimeoutCancellationException rather than returning a partial result. The result is point-in-time; call again (or use tail) to observe later changes.
Empty is not a fast return. This waits for the first non-empty state, so a device that has recorded no metrics yet does not resolve to an empty MetricSnapshot — the call blocks for the full MetricTapConfig.pullTimeout and then throws kotlinx.coroutines.TimeoutCancellationException. Use tail if you need to observe a buffer that may legitimately be empty for a while.