injectMembershipDrain

open suspend fun injectMembershipDrain(host: Seam, joiner: Seam): Boolean

Inject a mid-session membership drain: drop joiner from host's peer set mid-session without tearing host's seam — host.peers shrinks while host.state stays SeamState.Woven. Return true if the harness performed the injection; false (the default) means "this harness cannot inject a drain", and peersDrainWithoutTearOnInjectedMembershipDrain early-returns without asserting.

This is the distinct event from injectMidSessionDeath (#1466): a transport tear latches SeamState.Torn under both ends; a membership drain leaves the survivor SeamState.Woven and only shrinks its roster. A strictly-2-peer mesh cannot honour this — losing its only link IS a tear — so only an N-peer harness whose shared roster survives one peer leaving (e.g. the reference InMemoryLoom, where a leaver's close() removes it from the shared peers while the other seam stays Woven) can prove it. An overriding harness drops joiner from the roster, leaving host Woven, then returns true, and MUST also override membershipDrainGap to null.