Provider SLOTS (M3) — "swap out a provider you chose." A module declares providerSlots (e.g.
{ payments: "stripe" }); installModule records them into the document as x-suluk-providers. Each facet
(payments / auth / email / storage) is a SLOT bound to one implementation of a duck-typed interface — exactly
the pattern @suluk/stripe's PaymentProvider and @suluk/deploy's DeployProvider already prove. Swapping
rebinds the slot to another implementation of the SAME interface; the contract (the operations, their cost)
is unchanged — only the runtime binding differs. Pure (no host) → unit-tested.
Provider SLOTS (M3) — "swap out a provider you chose." A module declares
providerSlots(e.g.{ payments: "stripe" }); installModule records them into the document asx-suluk-providers. Each facet (payments / auth / email / storage) is a SLOT bound to one implementation of a duck-typed interface — exactly the pattern @suluk/stripe'sPaymentProviderand @suluk/deploy'sDeployProvideralready prove. Swapping rebinds the slot to another implementation of the SAME interface; the contract (the operations, their cost) is unchanged — only the runtime binding differs. Pure (no host) → unit-tested.