establishSigil

Establish the sigil for the canonical rpId: reuse an existing one if present, forge a new one only when none is.

Tries signIn first — a GET with no allowCredentials, so the platform satisfies it from ANY passkey for the rpId (e.g. one a sibling Kuira app already forged and GPM synced across the device's account). Only when the platform reports NO credential (NoPasskeyCredentialException) does it forge a new one.

This is what stops a second Kuira app from minting a DUPLICATE sigil (a different seed) instead of converging on the shared identity. Any other failure (cancellation, RP-id mismatch) propagates unchanged — we never forge over a real error.

On reuse, signIn has already persisted the sigil triple (publicKeyHex empty — a GET cannot return the P-256 pubkey). On forge, the caller persists the returned triple, exactly as it does for forge.