Skip to content

Conversation

@jyasskin
Copy link
Contributor

@jyasskin jyasskin commented Sep 21, 2025

Here is a "define registries" principle, based on the discussion in Hong Kong last week. It will fix #583 once it's polished and merged.


Preview | Diff

index.bs Outdated
Comment on lines 3592 to 3735
Default to defining either
an IANA registry governed by [[RFC8126]] or a [[w3c-process#registries|W3C Registry]],
but another similar mechanism is also acceptable.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What other mechanism do you think might be appropriate? What criteria do you think apply to the selection of process?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My thought here was that, if we were writing this several years ago I would have put just the IANA process here. When the W3C process arrived, I would have wanted it to be written in such a way that the W3C process were also acceptable. I don't know of another process that would fit now, but there's also no reason that only 2 organizations would be acceptable.

On the other hand, maybe this is an extensibility point for the design principles, and we can just update the design principles instead of defining a registry of registry mechanisms with criteria for adding new ones.

Suggested change
Default to defining either
an IANA registry governed by [[RFC8126]] or a [[w3c-process#registries|W3C Registry]],
but another similar mechanism is also acceptable.
Default to defining either
an IANA registry governed by [[RFC8126]] or a [[w3c-process#registries|W3C Registry]].

index.bs Outdated
Comment on lines 3605 to 3747
The definition of the registry must be clear about this interface,
and it should require new entries to include a specification that follows it.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The extension point that is governed by a registry needs to be fully-specified. That includes a definition of what to do if an item is not understood (is there a negotiation mechanism? is there feature detection? is the extension ignored when it is not understood? or, does it cause a failure of some sort?)

RFC 6709 goes into some detail about some of the extension models that might apply. Those are for protocols, but the same principles broadly apply to APIs as well.

Then, the requirements for what it takes to define the extension need to be clearly defined, as you say here.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've rearranged some things to add this in, and to defer to RFC 6790 for details. How does it look?

index.bs Outdated
Comment on lines 3615 to 3761
Use a permissive registration policy instead of doing this
unless the feature includes
some way to enforce that no implementation can use an unregistered name.
The IETF has found that
when it's too hard to add entries to a registry,
implementers will often simply use names without registering them.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This isn't quite the angle I'd use here. The extent to which you can add tighter constraints varies based on the ecosystem you are deploying into. If your implementers are browsers, then you might imagine that a tighter set of restrictions might be respected and therefore it would be more reasonable to at least try it on.

If you are looking at websites implementing, then you can almost guarantee that registrations won't happen, even if the constraints are very lightweight.

Getting that nuance in might be a good idea.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point. I replaced the tail of this paragraph with this discussion, and added a paragraph saying (roughly) that if this is likely, then it can justify a FCFS-with-no-spec policy.

index.bs Outdated
Comment on lines 3622 to 3766
When a feature's main specification defines some initial registry entries,
each one can be either required or optional for implementations to recognize.
If implementations need to pick an understood registry entry to send to their recipients,
then the registry should include at least 1 required entry.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Extensions for optional features - ones that are simply ignored if not understood - don't need this.

You should say that where the functioning of a specification depends on choosing and using an registered value, then you have three choices:

  • One party implements all the options.
  • You mandate a baseline that all parties implement.
  • Risk interoperability failure if the intersection of options between entities is empty.

And that's for a two-party negotiation. There are many things that the W3C documents where there are more than two potential actors involved.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I tried to incorporate optional features.

I feel like we should only endorse one of your three choices:

  • having 1 party implement all options means that party gets a veto on new options ... maybe it's saying that all values have to be marked as required for one side of the protocol so that the other side can make a free choice ... and in that case, values can only be added in a revision of the main spec, so it's not a registry anymore.
  • the baseline is equivalent to requiring at least 1 entry
  • We shouldn't endorse a plan that leads to interoperability failures.

index.bs Outdated
Comment on lines 3632 to 3780
It can be tempting to use URLs instead of registered strings to identify extensions.
This has the benefit of making it very easy to extend the feature,
by just picking a URL from a domain that the extender controls.
However, there's no way to ensure that
these URLs point to a specification for the extension they name,
or even that the domain stays under the control of the entity that defined the extension.
URLs are appropriate for a few kinds of completely-permissionless extension,
but most of the time a WG-managed permissive registry table will work better.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

XML namespaces use URIs (not URLs). They are not using URIs for their ability to resolve to something; most XML namespace URIs, if they are resolved, point to nothing useful. You seem to imply that they could point to something; some do, but that's never been the goal.

They use URIs because the domain into which they are being deployed does not benefit from centralized coordination. They need identifiers and a way to generate them without coordination or - save us all - namecoin-style consensus. Indeed, it would be a mistake to require centralized coordination for those (doubly so for a wasteful distributed consensus). XML is a file format that is used by many people for many reasons. There is no value in asking people to coordinate identifier allocation. The same applies to JSON-LD, for similar reasons 1.

But the question we need to answer here is different. If you are specifying an extension to a protocol, why would you use a registry rather than letting the proverbial thousand flowers bloom? That all comes down to how you conceive of the interoperability goals of the extension point.

An optional, ignorable extension might benefit from a registry if there is a greater need to have different implementations agree on what the meaning of the extension is. In TLS, we have a registry for extensions, not just because there is a limited space available, but because the goal of defining an extension is to enable a shared understanding of the space.

In comparison, the IPTC metadata format uses URLs, because they don't see a need to constrain the space of options. There, the risk that people define multiple identifiers that are close, or even identical, in meaning is something that is tolerated so that there is a low-coordination way of adding metadata for limited or proprietary uses.

An extension point that determines everything that follows, like TLS ciphersuites or digital credential protocols, benefits more from coordination than something that can be readily ignored. Those are places where mandating implementation of a core by all (or a subset by browsers) is necessary.

Footnotes

  1. Even if you don't think that JSON-LD is solving a problem that matters, this choice is not one that is really in contention, to my mind.

Copy link
Member

@annevk annevk Sep 22, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

XML namespaces use strings that by convention often look like URLs and might parse as one, if we're going to quibble about details.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

After some of the rewrites above, the paragraph about URIs/URLs wound up fitting in as a thing one might do if the alternative is a specification-less registry. They're hierarchical in the IETF sense, but they also tend to risk a DNS entry being bought out from under the original creator. And they're usually more bytes than really necessary, but that's petty and I didn't find a convenient way to work it in.

The IPTC example seems like a case where they should have defined the main terms in the main spec, or possibly done a hierarchical space where each "Recommended/used Prefix" is controlled by a particular entity.

Or are you thinking that we should call out the case of enabling local/proprietary extensions as a time when URLs are actually the right way to go?

index.bs Outdated
Comment on lines 3626 to 3771
If implementations can be
divided into distinct [[spec-variability#subdivision-profile|profiles]]
that tend not to need to communicate with other profiles,
it can be sufficient for each profile to require a registry entry
even if the main specification leaves them all optional.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's not interoperability in the sense that we should care about here.

https://www.w3.org/TR/ethical-web-principles/#oneweb

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm happy to drop this sentence, although DIDs might be an example where there are many specifications (protocols) that have fields in which a DID could appear, and each of those specifications needs to mandate at least 1 DID Method to be implemented, but not all of those specifications need to agree on the same Method. I don't think that would violate the One Web principle, although it also wouldn't be ideal.

Copy link
Contributor Author

@jyasskin jyasskin left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry for the long delay. How's it look now?

index.bs Outdated
Comment on lines 3592 to 3735
Default to defining either
an IANA registry governed by [[RFC8126]] or a [[w3c-process#registries|W3C Registry]],
but another similar mechanism is also acceptable.
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My thought here was that, if we were writing this several years ago I would have put just the IANA process here. When the W3C process arrived, I would have wanted it to be written in such a way that the W3C process were also acceptable. I don't know of another process that would fit now, but there's also no reason that only 2 organizations would be acceptable.

On the other hand, maybe this is an extensibility point for the design principles, and we can just update the design principles instead of defining a registry of registry mechanisms with criteria for adding new ones.

Suggested change
Default to defining either
an IANA registry governed by [[RFC8126]] or a [[w3c-process#registries|W3C Registry]],
but another similar mechanism is also acceptable.
Default to defining either
an IANA registry governed by [[RFC8126]] or a [[w3c-process#registries|W3C Registry]].

index.bs Outdated
Comment on lines 3605 to 3747
The definition of the registry must be clear about this interface,
and it should require new entries to include a specification that follows it.
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've rearranged some things to add this in, and to defer to RFC 6790 for details. How does it look?

index.bs Outdated
Comment on lines 3615 to 3761
Use a permissive registration policy instead of doing this
unless the feature includes
some way to enforce that no implementation can use an unregistered name.
The IETF has found that
when it's too hard to add entries to a registry,
implementers will often simply use names without registering them.
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point. I replaced the tail of this paragraph with this discussion, and added a paragraph saying (roughly) that if this is likely, then it can justify a FCFS-with-no-spec policy.

index.bs Outdated
Comment on lines 3626 to 3771
If implementations can be
divided into distinct [[spec-variability#subdivision-profile|profiles]]
that tend not to need to communicate with other profiles,
it can be sufficient for each profile to require a registry entry
even if the main specification leaves them all optional.
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm happy to drop this sentence, although DIDs might be an example where there are many specifications (protocols) that have fields in which a DID could appear, and each of those specifications needs to mandate at least 1 DID Method to be implemented, but not all of those specifications need to agree on the same Method. I don't think that would violate the One Web principle, although it also wouldn't be ideal.

index.bs Outdated
Comment on lines 3622 to 3766
When a feature's main specification defines some initial registry entries,
each one can be either required or optional for implementations to recognize.
If implementations need to pick an understood registry entry to send to their recipients,
then the registry should include at least 1 required entry.
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I tried to incorporate optional features.

I feel like we should only endorse one of your three choices:

  • having 1 party implement all options means that party gets a veto on new options ... maybe it's saying that all values have to be marked as required for one side of the protocol so that the other side can make a free choice ... and in that case, values can only be added in a revision of the main spec, so it's not a registry anymore.
  • the baseline is equivalent to requiring at least 1 entry
  • We shouldn't endorse a plan that leads to interoperability failures.

index.bs Outdated
Comment on lines 3632 to 3780
It can be tempting to use URLs instead of registered strings to identify extensions.
This has the benefit of making it very easy to extend the feature,
by just picking a URL from a domain that the extender controls.
However, there's no way to ensure that
these URLs point to a specification for the extension they name,
or even that the domain stays under the control of the entity that defined the extension.
URLs are appropriate for a few kinds of completely-permissionless extension,
but most of the time a WG-managed permissive registry table will work better.
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

After some of the rewrites above, the paragraph about URIs/URLs wound up fitting in as a thing one might do if the alternative is a specification-less registry. They're hierarchical in the IETF sense, but they also tend to risk a DNS entry being bought out from under the original creator. And they're usually more bytes than really necessary, but that's petty and I didn't find a convenient way to work it in.

The IPTC example seems like a case where they should have defined the main terms in the main spec, or possibly done a hierarchical space where each "Recommended/used Prefix" is controlled by a particular entity.

Or are you thinking that we should call out the case of enabling local/proprietary extensions as a time when URLs are actually the right way to go?

Copy link
Contributor

@matatk matatk left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is great.

Do you think that some concrete examples might help?

In terms of positive examples, there are a few that seem to work well, including: link types/rel attribute values, and Well-known URIs.

But are there any non-contentious, and preferably not recent, examples of where a registry was implemented, but wasn't a good idea, or was decided against?

@jyasskin
Copy link
Contributor Author

jyasskin commented Nov 3, 2025

Examples could help. Some that come to mind:

jyasskin and others added 6 commits December 1, 2025 19:05
Co-authored-by: Martin Thomson <mt@lowentropy.net>
* 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.
@jyasskin
Copy link
Contributor Author

jyasskin commented Dec 2, 2025

I ran out of time to write up both examples this week, but the Link Relations registry turns out to be pretty instructive: https://pr-preview.s3.amazonaws.com/jyasskin/design-principles/pull/596.html#example-link-relation-registry.


<!-- TODO: add examples -->

<h3 id="registries">Use registries to allow constrained extensions outside the original standards track</h3>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this really the right title now that you have done the work to change the focus?


<h3 id="registries">Use registries to allow constrained extensions outside the original standards track</h3>

When you expect a feature to need to be extended over time,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This needs a punchy "Use an appropriate mechanism to manage the future extensibility of your work." Or similar.

This implies that most optional features should be defined
in the same specification that defined the original feature.

Sometimes new extensions are expected to be needed in the future.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This paragraph isn't really about the expectation that extensions might be needed, but about keeping control within the group that defined the original feature. To that end, it belongs with the previous paragraph. I'd still use a new paragraph, but use a bridging statement, not something like what you have here, which implies the situation is very different.

to have to revise the specification to define an extension.
This can reduce or avoid any need to precisely define requirements for extensions.

However, if extensions need to be defined through
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If the substance of this section, the thing introducing it shouldn't start with "However,".

Where there is strong reason to believe that a feature will be used and extended by a diverse set of users, including those who might not be involved in its original creation, a registry is usually the right way to manage extensibility.

A registry is a central location for identifying and managing extensions. Registries can be defined as a [[...|W3C Registry]], where the W3C as a whole, often delegated to a working group, is responsible for the maintenance of the registry. IANA might also be asked to establish and maintain registries, following the procedures in [[RFC8126]].

Comment on lines +3741 to +3743
* define how implementations can negotiate which extensions are acceptable,
* define what to do with unrecognized extensions
(see [[RFC6709#section-4|section 4 of RFC6709]]),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These two points are an "or" situation. If you negotiate, then you might never have to deal with unrecognized extensions, except to the extent they might be mentioned in negotiation. Or, you might not negotiate, in which case you might need to deal with unrecognized extension in different places.

This clearly loses the interoperability benefits of requiring a specification,
and in the case of DNS-based URLs,
it also risks that the entity that defined the extension may lose control of its domain.
URIs are appropriate for a few kinds of very-low-coordination extension,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
URIs are appropriate for a few kinds of very-low-coordination extension,
URIs are appropriate for a few kinds of very-low-coordination extension,
such as the definition of an XML namespace [[XML-NAMES]],

Because an [=extension point=] defines an interface,
and it's difficult to be confident in an interface definition
before that interface has several implementations,
any new registry should start with at least 2-3 entries defined.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
any new registry should start with at least 2-3 entries defined.
any new registry should start with more than one entry defined.

Comment on lines +3791 to +3794
Each of these initial registry entries
can be either required or optional for implementations to recognize.
For extension points that can't just be ignored when their extension isn't recognized,
the registry should include at least 1 required entry.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Each of these initial registry entries
can be either required or optional for implementations to recognize.
For extension points that can't just be ignored when their extension isn't recognized,
the registry should include at least 1 required entry.
Specifications that include extension points for mandatory features,
such as a core function that can have an alternative implementation
that is selected by identifying the extension,
must include at least one entry that all implementations are required to support.

I think that you are referring here to DC and the protocol choice. But this also applies to TLS key exchange methods or cipher suites. You don't have a functional specification if you don't at least one thing that everyone supports.

<div class="example" heading="Link Relations" id="example-link-relation-registry">

Link relations are currently registered in a 3-part registry.
[[rfc8288#procedure|RFC 8288]] defines the [[IANA-RELATIONS inline]] registry
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Interesting. The RFC 8288 link goes to the actual section. The same is not true for https://datatracker.ietf.org/doc/html/rfc8288#procedure though that is where I would expect many RFC links to use. (Failing that: https://www.rfc-editor.org/rfc/rfc8288.html#procedure)

Comment on lines +3809 to +3810
In an ideal world, [[RFC8288]] and [[MFREL inline]] would probably be a single registry,
with [[html#linkTypes|HTML]] defining browser behavior.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I sort of agree with this statement, though this entire example makes me a little uncomfortable. It is not exactly a simple and straightforward example that illustrates the principles on hand. Instead, it's a complicated situation that has evolved over time, mostly as an object lesson in how NOT to do registries.

So, while I appreciate the history lesson, I'm not sure that we're doing our readers the favour that they came here for. We're unloading a lot of nuance on them instead.

Do we have a simple, relatively old, straightforward registry that we can point to? I can point to a lot of IETF work that fits that neatly, but I'm less able to point to a good example from the W3C. That might say something, of course.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Guidance on registries?

4 participants