@@ -3734,51 +3734,66 @@ Default to defining either
37343734an IANA registry governed by [[RFC8126]] or a [[w3c-process#registries|W3C Registry]] ,
37353735but another similar mechanism is also acceptable.
37363736
3737- Registries are helpful because they
3738-
3739- * reduce name collisions,
3740- 1. Help readers find the name for a desired purpose.
3741- 1. Direct readers to a specification for each name
3742- (if the registry requires this).
3743-
3744- Items in a registry generally need to implement a defined interface
3745- in order to plug into the specification they're extending.
3746- The definition of the registry must be clear about this interface,
3747- and it should require new entries to include a specification that follows it.
3748- This roughly corresponds to
3749- the IETF's [[RFC8126#section-4.6|Specification Required]] registration policy.
3750- It's difficult to be confident in an interface definition
3751- before that interface has several implementations,
3752- so any new registry should start with at least 2-3 entries defined.
3737+ The place in a specification that dispatches to an extension's implementation
3738+ is known as an <dfn export>extension point</dfn> .
3739+ To maximize the chance that a specification with extension points is interoperably implemented,
3740+ each extension point should
3741+
3742+ * define how implementations can negotiate which extensions are acceptable,
3743+ * define what to do with unrecognized extensions
3744+ (see [[RFC6709#section-4|section 4 of RFC6709]] ),
3745+ * define what interface extensions are supposed to implement, and
3746+ * link to a specification of each extension that is
3747+ detailed enough to support interoperable implementations of the extension,
3748+ as is required by
3749+ the IETF's [[RFC8126#section-4.6|Specification Required]] registration policy.
3750+
3751+ Registries help because they
3752+
3753+ * give each extension a unique name to use
3754+ in negotiation and
3755+ in recognizing what extension is in use,
3756+ * provide a place to link to extension specifications
3757+ (if the registry requires this), and
3758+ * help readers find the name for a desired purpose.
37533759
37543760It is tempting to additionally require that registry entries be
37553761"good" in some way beyond what is needed to achieve interoperability.
3756- Use a permissive registration policy instead of doing this
3757- unless the feature includes
3758- some way to enforce that no implementation can use an unregistered name.
3759- The IETF has found that
3760- when it's too hard to add entries to a registry ,
3761- implementers will often simply use names without registering them .
3762-
3763- When a feature's main specification defines some initial registry entries,
3764- each one can be either required or optional for implementations to recognize.
3765- If implementations need to pick an understood registry entry to send to their recipients,
3766- then the registry should include at least 1 required entry.
3767- If implementations can be
3768- divided into distinct [[spec-variability#subdivision-profile|profiles]]
3769- that tend not to need to communicate with other profiles,
3770- it can be sufficient for each profile to require a registry entry
3771- even if the main specification leaves them all optional.
3772-
3773- It can be tempting to use URLs instead of registered strings to identify extensions.
3774- This has the benefit of making it very easy to extend the feature,
3762+ Whether this can succeed depends on the ecosystem and the expected implementers.
3763+ Implementers are most likely to be willing to
3764+ navigate a demanding registration process and
3765+ constrain their implementations to match strict registration requirements
3766+ when they are a small set, wealthy, and generally-aligned ,
3767+ as in the case of web browser engines .
3768+ The more diverse or constrained implementers become,
3769+ the less you can expect them to consistently work to register extensions.
3770+
3771+ At the limit, implementers might not even be willing to specify their extensions.
3772+ If the specification authors consider this likely, it may be worth allowing
3773+ [[rfc8126#section-4.4|first-come-first-served registrations without a specification]]
3774+ just to reduce the risk of name collisions,
3775+ although the registry should still encourage full specifications.
3776+
3777+ In the case of a registry that doesn't require specifications,
3778+ it can be tempting to identify extensions with URLs or URIs instead of registered strings.
3779+ This has the effect of defining a [[rfc8126#section-4.3|hierarchical registration policy]]
3780+ and making it very easy to extend the feature,
37753781by just picking a URL from a domain that the extender controls.
3776- However, there's no way to ensure that
3777- these URLs point to a specification for the extension they name ,
3778- or even that the domain stays under the control of the entity that defined the extension .
3779- URLs are appropriate for a few kinds of completely-permissionless extension,
3782+ This clearly loses the interoperability benefits of requiring a specification,
3783+ and in the case of DNS-based URLs ,
3784+ it also risks that the entity that defined the extension may lose control of its domain .
3785+ URIs are appropriate for a few kinds of very-low-coordination extension,
37803786but most of the time a WG-managed permissive registry table will work better.
37813787
3788+ Because an [=extension point=] defines an interface,
3789+ and it's difficult to be confident in an interface definition
3790+ before that interface has several implementations,
3791+ any new registry should start with at least 2-3 entries defined.
3792+ Each of these initial registry entries
3793+ can be either required or optional for implementations to recognize.
3794+ For extension points that can't just be ignored when their extension isn't recognized,
3795+ then the registry should include at least 1 required entry.
3796+
37823797See [[qaframe-spec#extensions]] and [[RFC6709]] for
37833798more guidance on how to design extensibility.
37843799
0 commit comments