Skip to content

Commit 3f73f49

Browse files
committed
Redraft to fix review comments.
* Define "extension point". * Say to specify the extension point itself. * Discuss how many registration constraints the ecosystem will accept. * Deal with "optional" extension points. * Don't acknowledge multi-profile specs. * Reframe URI-named extensibility systems.
1 parent 748cd76 commit 3f73f49

File tree

1 file changed

+54
-39
lines changed

1 file changed

+54
-39
lines changed

index.bs

Lines changed: 54 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -3734,51 +3734,66 @@ Default to defining either
37343734
an IANA registry governed by [[RFC8126]] or a [[w3c-process#registries|W3C Registry]],
37353735
but 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

37543760
It 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,
37753781
by 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,
37803786
but 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+
37823797
See [[qaframe-spec#extensions]] and [[RFC6709]] for
37833798
more guidance on how to design extensibility.
37843799

0 commit comments

Comments
 (0)