injectSelfDial

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

Inject a self-dial at BOTH ends: make host and joiner each resolve a connection whose remote identity is its OWN Seam.selfId — the #1466 class. A symmetric advertise+browse fabric is delivered its own advertisement (real Bonjour/mDNS/NWBrowser returns a device's own service to its own browser), dials it, and the resulting connection resolves to selfId. Each seam's self-connection guard MUST drop its own. Return true only if the harness injected at both ends; false (the default) means "this harness cannot inject a self-dial", and selfDialIsRejected early-returns without asserting.

Both ends, and why the hook took only a host until #2601. A role-split fabric ships two different Seam implementations behind one harness, so a self-dial proven on host proves at most half of what the harness ships — and the other half is what a joining device runs. Taking both ends is what makes the joiner arms of selfDialIsRejected reachable at all; it is the same shape injectMidSessionDeath and injectMembershipDrain already have, so no harness meets a new concept. Every in-tree harness that declared ObligationDeclaration.Proven could inject at both ends, so widening it cost no coverage — but a future harness that can dial only one end must return false and declare a ObligationDeclaration.Gap rather than injecting one end and returning true, which would make the other end's arms silently vacuous.

The honest limit. The suite cannot check that a harness really dialled the end it was handed: a correctly guarded self-dial leaves no trace at either end, by construction, which is the same reason selfDialDeclaration has no refutation for its NotConstructible arm. A harness that dials the host twice and returns true is indistinguishable from one that dials both. What the signature buys is that the joiner is named — an omission has to be written.

This is a harness capability, not a fabric SeamCapabilities flag — mirroring injectMidSessionDeath. Only a harness that can make a live seam see a connection to its own selfId (e.g. the FakeNwRadio self-endpoint delivery added for #1485) can prove it; a relay/2-peer harness with no self-discovery cannot self-dial at all and leaves this false. It is deliberately opt-in rather than a required abstract: a required hook would force every fabric subclass to implement a self-dial many structurally cannot perform. Accountability is preserved exactly as injectMidSessionDeath's is — an un-overriding harness is tracked, never silently green, via selfDialDeclaration and selfDialDeclarationIsHonest.

A harness that overrides this to true MUST also declare ObligationDeclaration.Proven via selfDialDeclaration.