From 5e01c0c6857a50a75c5e0968920408baeb703061 Mon Sep 17 00:00:00 2001 From: Benjie Gillam Date: Thu, 15 Jan 2026 08:18:57 +0000 Subject: [PATCH 01/13] Extract service capabilities --- spec/Appendix C -- Grammar Summary.md | 19 ++++++ spec/Section 2 -- Language.md | 12 ++++ spec/Section 3 -- Type System.md | 91 +++++++++++++++++++++++++++ spec/Section 4 -- Introspection.md | 43 ++++++++++++- 4 files changed, 162 insertions(+), 3 deletions(-) diff --git a/spec/Appendix C -- Grammar Summary.md b/spec/Appendix C -- Grammar Summary.md index cc464a4a6..79089a923 100644 --- a/spec/Appendix C -- Grammar Summary.md +++ b/spec/Appendix C -- Grammar Summary.md @@ -71,6 +71,11 @@ Digit :: one of - `0` `1` `2` `3` `4` `5` `6` `7` `8` `9` +QualifiedName :: + +- QualifiedName . Name [lookahead != `.`] +- Name . Name [lookahead != `.`] + IntValue :: IntegerPart [lookahead != {Digit, `.`, NameStart}] IntegerPart :: @@ -248,6 +253,7 @@ TypeSystemDefinition : - SchemaDefinition - TypeDefinition - DirectiveDefinition +- ServiceDefinition TypeSystemExtensionDocument : TypeSystemDefinitionOrExtension+ @@ -414,6 +420,19 @@ TypeSystemDirectiveLocation : one of - `INPUT_OBJECT` - `INPUT_FIELD_DEFINITION` +ServiceDefinition : Description? service { ServiceAttribute\* } + +ServiceAttribute : + +- ServiceCapabilities + +ServiceCapabilities: capabilities { ServiceCapability\* } + +ServiceCapability: + +- Description? QualifiedName [lookahead != `(`] +- Description? QualifiedName ( StringValue ) + ## Schema Coordinate Syntax Note: Schema coordinates must not contain {Ignored}. diff --git a/spec/Section 2 -- Language.md b/spec/Section 2 -- Language.md index 94b99f20d..96accb2f1 100644 --- a/spec/Section 2 -- Language.md +++ b/spec/Section 2 -- Language.md @@ -233,6 +233,18 @@ Any {Name} within a GraphQL type system must not start with two underscores {"\_\_"} unless it is part of the [introspection system](#sec-Introspection) as defined by this specification. +### Qualified Names + +QualifiedName :: + +- QualifiedName . Name [lookahead != `.`] +- Name . Name [lookahead != `.`] + +A qualified name is a case-sensitive string composed of two or more names +separated by a period (`.`). A qualified name allows for a structured chain of +names which can be useful for scoping or applying namespaces. A _capability +identifier_ is an example of a {QualifiedName}. + ## Descriptions Description : StringValue diff --git a/spec/Section 3 -- Type System.md b/spec/Section 3 -- Type System.md index 44760852c..911595e67 100644 --- a/spec/Section 3 -- Type System.md +++ b/spec/Section 3 -- Type System.md @@ -12,6 +12,7 @@ TypeSystemDefinition : - SchemaDefinition - TypeDefinition - DirectiveDefinition +- ServiceDefinition The GraphQL language includes an [IDL](https://en.wikipedia.org/wiki/Interface_description_language) used to @@ -2321,3 +2322,93 @@ input UserUniqueCondition @oneOf { organizationAndEmail: OrganizationAndEmailInput } ``` + +## Service Definition + +ServiceDefinition : Description? service { ServiceAttribute\* } + +ServiceAttribute : + +- ServiceCapabilities + +A GraphQL service is defined in terms of the capabilities that it offers which +are external to the schema. + +All capabilities within a service must have unique identifiers. + +### Service Capabilities + +ServiceCapabilities: capabilities { ServiceCapability\* } + +ServiceCapability: + +- Description? QualifiedName [lookahead != `(`] +- Description? QualifiedName ( StringValue ) + +:: A _service capability_ describes a feature supported by the GraphQL service +but not directly expressible via the type system. This may include support for +new or experimental GraphQL syntactic or behavioral features, protocol support +(such as GraphQL over WebSockets or Server-Sent Events), or additional +operational information (such as endpoints for related services). Service +capabilities may be supplied by the GraphQL implementation, the service, or +both. + +A _service capability_ is identified by a _capability identifier_ (a +{QualifiedName}), and may optionally have a string value. + +**Capability Identifier** + +:: A _capability identifier_ is a {QualifiedName} (a case-sensitive string value +composed of two or more {Name} separated by a period (`.`)) that uniquely +identifies a capability. This structure is inspired by reverse domain notation +to encourage global uniqueness and collision-resistance; it is recommended that +identifiers defined by specific projects, vendors, or implementations begin with +a prefix derived from a DNS name they control (e.g., {"com.example."}). + +Clients must compare capability identifiers using exact (case-sensitive) string +equality. + +**Reserved Capability Identifiers** + +A _capability identifier_ must not start with an underscore {"\_"}; this is +reserved for future usage. + +Capability identifiers beginning with the prefix {"graphql."} are reserved and +must not be used outside of official GraphQL Foundation specifications. +Identifiers beginning with the prefix {"graphql.rfc."} are reserved for RFC +proposals. + +Any identifiers beginning with case-insensitive variants of {"graphql."}, +{"org.graphql."} and {"gql."} are also reserved. + +Implementers should not change the meaning of capability identifiers; instead, a +new capability identifier should be used when the meaning changes. Implementers +should ensure that capability identifiers remain stable and version-agnostic +where possible. + +Note: Capability versioning, if needed, can be indicated using dot suffixes +(e.g.{ "org.example.capability.v2"}). + +This system enables incremental feature adoption and richer tooling +interoperability, while avoiding tight coupling to specific implementations. + +**Capability value** + +For capabilities that require more information than a simple indication of +support, a string value may be specified. + +For example, the capability {"graphql.onError"} does not require additional +information and thus does not specify a value; whereas +{"graphql.defaultErrorBehavior"} uses the value to indicate which _error +behavior_ is the default. + +**Specified capabilities** + +This version of the specification defines the following capabilities: + +- {"graphql.defaultErrorBehavior"} - indicates the _default error behavior_ of + the service via the {value}. If not present, assume the _default error + behavior_ is {"PROPAGATE"}. +- {"graphql.onError"} - indicates that the service allows the client to specify + {onError} in a request to indicate the _error behavior_ the service should use + for the request. No {value} is provided. diff --git a/spec/Section 4 -- Introspection.md b/spec/Section 4 -- Introspection.md index 8963a3e9c..64272fdaf 100644 --- a/spec/Section 4 -- Introspection.md +++ b/spec/Section 4 -- Introspection.md @@ -85,13 +85,14 @@ operation. ## Schema Introspection -The schema introspection system is accessible from the meta-fields `__schema` -and `__type` which are accessible from the type of the root of a query -operation. +The schema introspection system is accessible from the meta-fields `__schema`, +`__type` and `__service` which are accessible from the type of the root of a +query operation. ```graphql __schema: __Schema! __type(name: String!): __Type +__service: __Service! ``` Like all meta-fields, these are implicit and do not appear in the fields list in @@ -228,6 +229,16 @@ enum __DirectiveLocation { INPUT_OBJECT INPUT_FIELD_DEFINITION } + +type __Service { + capabilities: [__Capability!]! +} + +type __Capability { + identifier: String! + description: String + value: String +} ``` ### The \_\_Schema Type @@ -512,3 +523,29 @@ Fields\: {true}, deprecated arguments are also returned. - `isRepeatable` must return a Boolean that indicates if the directive may be used repeatedly at a single location. + +### The \_\_Service Type + +The `__Service` type is returned from the `__service` meta-field and provides +information about the GraphQL service, most notably about its capabilities. + +Note: Services implementing an older version of this specification may not +support the `__service` meta-field or `__Service` type. Support may be probed +using the introspection query: `{ __type(name: "__Service") { name } }`, a +{null} result indicates lack of support. + +Fields\: + +- `capabilities` must return a list of `__Capability` detailing each _service + capability_ supported by the service. + +### The \_\_Capability Type + +A `__Capability` object describes a specific _service capability_, and has the +following fields\: + +- `identifier` must return the string _capability identifier_ uniquely + identifying this service capability. +- `description` may return a String or {null}. +- `value` the String value of the service capability, or {null} if there is no + associated value. From ccb76ed9618d02ef83a195eb20f72e86d955d26e Mon Sep 17 00:00:00 2001 From: Benjie Gillam Date: Thu, 15 Jan 2026 08:52:03 +0000 Subject: [PATCH 02/13] Reserve example.* identifiers --- spec/Section 3 -- Type System.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spec/Section 3 -- Type System.md b/spec/Section 3 -- Type System.md index 911595e67..ee4c1b4f9 100644 --- a/spec/Section 3 -- Type System.md +++ b/spec/Section 3 -- Type System.md @@ -2376,7 +2376,8 @@ reserved for future usage. Capability identifiers beginning with the prefix {"graphql."} are reserved and must not be used outside of official GraphQL Foundation specifications. Identifiers beginning with the prefix {"graphql.rfc."} are reserved for RFC -proposals. +proposals. Identifiers beginning with the prefix {"example."} are reserved for +documentation purposes. Any identifiers beginning with case-insensitive variants of {"graphql."}, {"org.graphql."} and {"gql."} are also reserved. From 35b8067f07f77bdb7d64dee591f7d51fa0dcf7f5 Mon Sep 17 00:00:00 2001 From: Benjie Gillam Date: Thu, 15 Jan 2026 08:53:00 +0000 Subject: [PATCH 03/13] Replace default capabilities --- spec/Section 3 -- Type System.md | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/spec/Section 3 -- Type System.md b/spec/Section 3 -- Type System.md index ee4c1b4f9..a1b7e3f64 100644 --- a/spec/Section 3 -- Type System.md +++ b/spec/Section 3 -- Type System.md @@ -2398,18 +2398,14 @@ interoperability, while avoiding tight coupling to specific implementations. For capabilities that require more information than a simple indication of support, a string value may be specified. -For example, the capability {"graphql.onError"} does not require additional -information and thus does not specify a value; whereas -{"graphql.defaultErrorBehavior"} uses the value to indicate which _error -behavior_ is the default. +For example, the capability {"graphql.operationDescriptions"} does not require +additional information and thus does not specify a value; whereas a capability +such as {"example.transport.ws"} might use the value to indicate the endpoint to +use for websocket communications (or might omit a value to indicate that +websockets are supported at the current endpoint). **Specified capabilities** This version of the specification defines the following capabilities: -- {"graphql.defaultErrorBehavior"} - indicates the _default error behavior_ of - the service via the {value}. If not present, assume the _default error - behavior_ is {"PROPAGATE"}. -- {"graphql.onError"} - indicates that the service allows the client to specify - {onError} in a request to indicate the _error behavior_ the service should use - for the request. No {value} is provided. +- {"graphql.operationDescriptions"} - indicates syntax support for descriptions on operation and fragments From 62583e9fbfbe926210bf4c502fc05bee3d87f107 Mon Sep 17 00:00:00 2001 From: Benjie Gillam Date: Thu, 15 Jan 2026 09:06:14 +0000 Subject: [PATCH 04/13] Update syntax, add examples --- spec/Appendix C -- Grammar Summary.md | 13 ++++--------- spec/Section 3 -- Type System.md | 23 +++++++++++++---------- 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/spec/Appendix C -- Grammar Summary.md b/spec/Appendix C -- Grammar Summary.md index 79089a923..16e8fb64b 100644 --- a/spec/Appendix C -- Grammar Summary.md +++ b/spec/Appendix C -- Grammar Summary.md @@ -420,18 +420,13 @@ TypeSystemDirectiveLocation : one of - `INPUT_OBJECT` - `INPUT_FIELD_DEFINITION` -ServiceDefinition : Description? service { ServiceAttribute\* } +ServiceDefinition : Description? service Directives? { ServiceCapability* } -ServiceAttribute : +ServiceCapability : -- ServiceCapabilities +- Description? capability QualifiedName ServiceCapabilityValue? -ServiceCapabilities: capabilities { ServiceCapability\* } - -ServiceCapability: - -- Description? QualifiedName [lookahead != `(`] -- Description? QualifiedName ( StringValue ) +ServiceCapabilityValue : ( StringValue ) ## Schema Coordinate Syntax diff --git a/spec/Section 3 -- Type System.md b/spec/Section 3 -- Type System.md index a1b7e3f64..5f9fa3a1c 100644 --- a/spec/Section 3 -- Type System.md +++ b/spec/Section 3 -- Type System.md @@ -2325,11 +2325,7 @@ input UserUniqueCondition @oneOf { ## Service Definition -ServiceDefinition : Description? service { ServiceAttribute\* } - -ServiceAttribute : - -- ServiceCapabilities +ServiceDefinition : Description? service Directives? { ServiceCapability* } A GraphQL service is defined in terms of the capabilities that it offers which are external to the schema. @@ -2338,12 +2334,9 @@ All capabilities within a service must have unique identifiers. ### Service Capabilities -ServiceCapabilities: capabilities { ServiceCapability\* } +ServiceCapability : Description? capability QualifiedName ServiceCapabilityValue? -ServiceCapability: - -- Description? QualifiedName [lookahead != `(`] -- Description? QualifiedName ( StringValue ) +ServiceCapabilityValue : ( StringValue ) :: A _service capability_ describes a feature supported by the GraphQL service but not directly expressible via the type system. This may include support for @@ -2356,6 +2349,16 @@ both. A _service capability_ is identified by a _capability identifier_ (a {QualifiedName}), and may optionally have a string value. +```graphql example +service { + "Indicates syntax support for descriptions on operation and fragment definitions" + capability graphql.operationDescriptions + + "Websocket transport is supported via the given endpoint" + capability example.transport.ws("wss://api.example.com/graphql") +} +``` + **Capability Identifier** :: A _capability identifier_ is a {QualifiedName} (a case-sensitive string value From 601b84691cd4a94155def12b973ed621017a222f Mon Sep 17 00:00:00 2001 From: Benjie Gillam Date: Thu, 15 Jan 2026 09:18:46 +0000 Subject: [PATCH 05/13] Editorial --- spec/Section 3 -- Type System.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spec/Section 3 -- Type System.md b/spec/Section 3 -- Type System.md index 5f9fa3a1c..30a8473fe 100644 --- a/spec/Section 3 -- Type System.md +++ b/spec/Section 3 -- Type System.md @@ -2351,7 +2351,7 @@ A _service capability_ is identified by a _capability identifier_ (a ```graphql example service { - "Indicates syntax support for descriptions on operation and fragment definitions" + "Descriptions on operations and fragments are supported" capability graphql.operationDescriptions "Websocket transport is supported via the given endpoint" @@ -2391,7 +2391,7 @@ should ensure that capability identifiers remain stable and version-agnostic where possible. Note: Capability versioning, if needed, can be indicated using dot suffixes -(e.g.{ "org.example.capability.v2"}). +(e.g. {"org.example.capability.v2"}). This system enables incremental feature adoption and richer tooling interoperability, while avoiding tight coupling to specific implementations. @@ -2411,4 +2411,4 @@ websockets are supported at the current endpoint). This version of the specification defines the following capabilities: -- {"graphql.operationDescriptions"} - indicates syntax support for descriptions on operation and fragments +- {"graphql.operationDescriptions"} - indicates support for descriptions on operations and fragments From 33a152486b7bd6172ef2037d60d0b5e320adc3ad Mon Sep 17 00:00:00 2001 From: Benjie Gillam Date: Thu, 15 Jan 2026 09:31:54 +0000 Subject: [PATCH 06/13] Extend syntax --- spec/Appendix C -- Grammar Summary.md | 6 ++++++ spec/Section 3 -- Type System.md | 31 +++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/spec/Appendix C -- Grammar Summary.md b/spec/Appendix C -- Grammar Summary.md index 16e8fb64b..bc7cda535 100644 --- a/spec/Appendix C -- Grammar Summary.md +++ b/spec/Appendix C -- Grammar Summary.md @@ -265,6 +265,7 @@ TypeSystemDefinitionOrExtension : TypeSystemExtension : - SchemaExtension +- ServiceExtension - TypeExtension SchemaDefinition : Description? schema Directives[Const]? { @@ -422,6 +423,11 @@ TypeSystemDirectiveLocation : one of ServiceDefinition : Description? service Directives? { ServiceCapability* } +ServiceExtension : + +- extend service Directives? { ServiceCapability+ } +- extend service Directives [lookahead != `{`] + ServiceCapability : - Description? capability QualifiedName ServiceCapabilityValue? diff --git a/spec/Section 3 -- Type System.md b/spec/Section 3 -- Type System.md index 30a8473fe..1dd7d517b 100644 --- a/spec/Section 3 -- Type System.md +++ b/spec/Section 3 -- Type System.md @@ -40,6 +40,7 @@ TypeSystemDefinitionOrExtension : TypeSystemExtension : - SchemaExtension +- ServiceExtension - TypeExtension Type system extensions are used to represent a GraphQL type system which has @@ -2412,3 +2413,33 @@ websockets are supported at the current endpoint). This version of the specification defines the following capabilities: - {"graphql.operationDescriptions"} - indicates support for descriptions on operations and fragments + +### Service Extension + +ServiceExtension : + +- extend service Directives? { ServiceCapability+ } +- extend service Directives [lookahead != `{`] + +Service extensions are used to represent a service which has been extended from +a previous service. For example, this might be used by a GraphQL service which +adds additional capabilities to an existing service. + +Note: Service extensions without additional capability definitions must not be +followed by a {`{`} (such as a query shorthand) to avoid parsing ambiguity. + +```graphql example +extend service { + capability example.newCapability +} +``` + +**Service Validation** + +Service extensions have the potential to be invalid if incorrectly defined. + +1. The Service must already be defined. +2. Any non-repeatable directives provided must not already apply to the previous + Service. +3. Any capabilities provided must not already be defined on the previous + Service. From 6d0c2d64f4a883e2d8e9342051c4c6fb312ad7c7 Mon Sep 17 00:00:00 2001 From: Benjie Gillam Date: Thu, 15 Jan 2026 09:34:36 +0000 Subject: [PATCH 07/13] Note that IANA reserved domains are also reserved --- spec/Section 3 -- Type System.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/spec/Section 3 -- Type System.md b/spec/Section 3 -- Type System.md index 1dd7d517b..53d9da839 100644 --- a/spec/Section 3 -- Type System.md +++ b/spec/Section 3 -- Type System.md @@ -2381,7 +2381,12 @@ Capability identifiers beginning with the prefix {"graphql."} are reserved and must not be used outside of official GraphQL Foundation specifications. Identifiers beginning with the prefix {"graphql.rfc."} are reserved for RFC proposals. Identifiers beginning with the prefix {"example."} are reserved for -documentation purposes. +documentation purposes, and should not be used in operations. + +Note: Since IANA RFC 2606 reserves the second-level domain names +{example.com}, {example.net}, and {example.org} for documentation purposes, the +corresponding reverse-domain prefixes {"com.example."}, {"net.example."}, and +{"org.example."} are also reserved for documentation purposes. Any identifiers beginning with case-insensitive variants of {"graphql."}, {"org.graphql."} and {"gql."} are also reserved. From 39b9b565daa538255e6a45586f147e0d90687d82 Mon Sep 17 00:00:00 2001 From: Benjie Gillam Date: Thu, 15 Jan 2026 09:46:50 +0000 Subject: [PATCH 08/13] Clearer --- spec/Section 3 -- Type System.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/Section 3 -- Type System.md b/spec/Section 3 -- Type System.md index 53d9da839..e061d32c9 100644 --- a/spec/Section 3 -- Type System.md +++ b/spec/Section 3 -- Type System.md @@ -2380,8 +2380,8 @@ reserved for future usage. Capability identifiers beginning with the prefix {"graphql."} are reserved and must not be used outside of official GraphQL Foundation specifications. Identifiers beginning with the prefix {"graphql.rfc."} are reserved for RFC -proposals. Identifiers beginning with the prefix {"example."} are reserved for -documentation purposes, and should not be used in operations. +proposals. Identifiers beginning with the prefix {"example."} are reserved and +should only be used for documentation purposes. Note: Since IANA RFC 2606 reserves the second-level domain names {example.com}, {example.net}, and {example.org} for documentation purposes, the From fb440fadce5eb8fbf6ecfb65dc7073e94f6076ed Mon Sep 17 00:00:00 2001 From: Benjie Gillam Date: Thu, 15 Jan 2026 10:16:50 +0000 Subject: [PATCH 09/13] Lee suggested to not use + --- spec/Appendix C -- Grammar Summary.md | 2 +- spec/Section 3 -- Type System.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/Appendix C -- Grammar Summary.md b/spec/Appendix C -- Grammar Summary.md index bc7cda535..24ffce36d 100644 --- a/spec/Appendix C -- Grammar Summary.md +++ b/spec/Appendix C -- Grammar Summary.md @@ -425,7 +425,7 @@ ServiceDefinition : Description? service Directives? { ServiceCapability* } ServiceExtension : -- extend service Directives? { ServiceCapability+ } +- extend service Directives? { ServiceCapability* } - extend service Directives [lookahead != `{`] ServiceCapability : diff --git a/spec/Section 3 -- Type System.md b/spec/Section 3 -- Type System.md index e061d32c9..ef8d3a174 100644 --- a/spec/Section 3 -- Type System.md +++ b/spec/Section 3 -- Type System.md @@ -2423,7 +2423,7 @@ This version of the specification defines the following capabilities: ServiceExtension : -- extend service Directives? { ServiceCapability+ } +- extend service Directives? { ServiceCapability* } - extend service Directives [lookahead != `{`] Service extensions are used to represent a service which has been extended from From f1659df71aad60c3d032c4042b24e145e431c16b Mon Sep 17 00:00:00 2001 From: Benjie Gillam Date: Thu, 15 Jan 2026 10:20:01 +0000 Subject: [PATCH 10/13] Move Service stuff to bottom of lists --- spec/Appendix C -- Grammar Summary.md | 2 +- spec/Section 3 -- Type System.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/Appendix C -- Grammar Summary.md b/spec/Appendix C -- Grammar Summary.md index 24ffce36d..07729ee8c 100644 --- a/spec/Appendix C -- Grammar Summary.md +++ b/spec/Appendix C -- Grammar Summary.md @@ -265,8 +265,8 @@ TypeSystemDefinitionOrExtension : TypeSystemExtension : - SchemaExtension -- ServiceExtension - TypeExtension +- ServiceExtension SchemaDefinition : Description? schema Directives[Const]? { RootOperationTypeDefinition+ } diff --git a/spec/Section 3 -- Type System.md b/spec/Section 3 -- Type System.md index ef8d3a174..65c1a056e 100644 --- a/spec/Section 3 -- Type System.md +++ b/spec/Section 3 -- Type System.md @@ -40,8 +40,8 @@ TypeSystemDefinitionOrExtension : TypeSystemExtension : - SchemaExtension -- ServiceExtension - TypeExtension +- ServiceExtension Type system extensions are used to represent a GraphQL type system which has been extended from some previous type system. For example, this might be used by From 9980de866257089f4f7535ebdf7c4a79567808d6 Mon Sep 17 00:00:00 2001 From: Benjie Gillam Date: Thu, 15 Jan 2026 10:30:28 +0000 Subject: [PATCH 11/13] More editorial --- spec/Section 3 -- Type System.md | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/spec/Section 3 -- Type System.md b/spec/Section 3 -- Type System.md index 65c1a056e..3fb2a505c 100644 --- a/spec/Section 3 -- Type System.md +++ b/spec/Section 3 -- Type System.md @@ -2331,8 +2331,6 @@ ServiceDefinition : Description? service Directives? { ServiceCapability* } A GraphQL service is defined in terms of the capabilities that it offers which are external to the schema. -All capabilities within a service must have unique identifiers. - ### Service Capabilities ServiceCapability : Description? capability QualifiedName ServiceCapabilityValue? @@ -2348,7 +2346,8 @@ capabilities may be supplied by the GraphQL implementation, the service, or both. A _service capability_ is identified by a _capability identifier_ (a -{QualifiedName}), and may optionally have a string value. +{QualifiedName}), and may optionally have a string value. All capabilities +within a service must have unique identifiers. ```graphql example service { @@ -2380,24 +2379,26 @@ reserved for future usage. Capability identifiers beginning with the prefix {"graphql."} are reserved and must not be used outside of official GraphQL Foundation specifications. Identifiers beginning with the prefix {"graphql.rfc."} are reserved for RFC -proposals. Identifiers beginning with the prefix {"example."} are reserved and -should only be used for documentation purposes. +proposals. + +Any identifiers beginning with case-insensitive variants of {"graphql."}, +{"org.graphql."} and {"gql."} are also reserved. + +Identifiers beginning with the prefix {"example."} are reserved for usage in +documentation and examples only. Note: Since IANA RFC 2606 reserves the second-level domain names {example.com}, {example.net}, and {example.org} for documentation purposes, the corresponding reverse-domain prefixes {"com.example."}, {"net.example."}, and {"org.example."} are also reserved for documentation purposes. -Any identifiers beginning with case-insensitive variants of {"graphql."}, -{"org.graphql."} and {"gql."} are also reserved. - Implementers should not change the meaning of capability identifiers; instead, a new capability identifier should be used when the meaning changes. Implementers should ensure that capability identifiers remain stable and version-agnostic where possible. Note: Capability versioning, if needed, can be indicated using dot suffixes -(e.g. {"org.example.capability.v2"}). +(e.g. {"example.capability.v2"}). This system enables incremental feature adoption and richer tooling interoperability, while avoiding tight coupling to specific implementations. From e92af2935f5a2b3f7e3b5828c59184dd359dbfcf Mon Sep 17 00:00:00 2001 From: Benjie Gillam Date: Thu, 15 Jan 2026 22:13:46 +0000 Subject: [PATCH 12/13] Format --- spec/Appendix C -- Grammar Summary.md | 4 ++-- spec/Section 3 -- Type System.md | 17 ++++++++++------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/spec/Appendix C -- Grammar Summary.md b/spec/Appendix C -- Grammar Summary.md index 07729ee8c..7913b139e 100644 --- a/spec/Appendix C -- Grammar Summary.md +++ b/spec/Appendix C -- Grammar Summary.md @@ -421,11 +421,11 @@ TypeSystemDirectiveLocation : one of - `INPUT_OBJECT` - `INPUT_FIELD_DEFINITION` -ServiceDefinition : Description? service Directives? { ServiceCapability* } +ServiceDefinition : Description? service Directives? { ServiceCapability\* } ServiceExtension : -- extend service Directives? { ServiceCapability* } +- extend service Directives? { ServiceCapability\* } - extend service Directives [lookahead != `{`] ServiceCapability : diff --git a/spec/Section 3 -- Type System.md b/spec/Section 3 -- Type System.md index 3fb2a505c..607055a43 100644 --- a/spec/Section 3 -- Type System.md +++ b/spec/Section 3 -- Type System.md @@ -2326,14 +2326,15 @@ input UserUniqueCondition @oneOf { ## Service Definition -ServiceDefinition : Description? service Directives? { ServiceCapability* } +ServiceDefinition : Description? service Directives? { ServiceCapability\* } A GraphQL service is defined in terms of the capabilities that it offers which are external to the schema. ### Service Capabilities -ServiceCapability : Description? capability QualifiedName ServiceCapabilityValue? +ServiceCapability : Description? capability QualifiedName +ServiceCapabilityValue? ServiceCapabilityValue : ( StringValue ) @@ -2388,9 +2389,10 @@ Identifiers beginning with the prefix {"example."} are reserved for usage in documentation and examples only. Note: Since IANA RFC 2606 reserves the second-level domain names -{example.com}, {example.net}, and {example.org} for documentation purposes, the -corresponding reverse-domain prefixes {"com.example."}, {"net.example."}, and -{"org.example."} are also reserved for documentation purposes. +{"example.com"}, {"example.net"}, and {"example.org"} for documentation +purposes, the corresponding reverse-domain prefixes {"com.example."}, +{"net.example."}, and {"org.example."} are also reserved for documentation +purposes. Implementers should not change the meaning of capability identifiers; instead, a new capability identifier should be used when the meaning changes. Implementers @@ -2418,13 +2420,14 @@ websockets are supported at the current endpoint). This version of the specification defines the following capabilities: -- {"graphql.operationDescriptions"} - indicates support for descriptions on operations and fragments +- {"graphql.operationDescriptions"} - indicates support for descriptions on + operations and fragments ### Service Extension ServiceExtension : -- extend service Directives? { ServiceCapability* } +- extend service Directives? { ServiceCapability\* } - extend service Directives [lookahead != `{`] Service extensions are used to represent a service which has been extended from From aa7302b6bc19da0b2de82c18adb8945b867baace Mon Sep 17 00:00:00 2001 From: Benjie Gillam Date: Thu, 15 Jan 2026 22:14:50 +0000 Subject: [PATCH 13/13] Typo --- spec/Section 3 -- Type System.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/Section 3 -- Type System.md b/spec/Section 3 -- Type System.md index 607055a43..36f773f93 100644 --- a/spec/Section 3 -- Type System.md +++ b/spec/Section 3 -- Type System.md @@ -2414,7 +2414,7 @@ For example, the capability {"graphql.operationDescriptions"} does not require additional information and thus does not specify a value; whereas a capability such as {"example.transport.ws"} might use the value to indicate the endpoint to use for websocket communications (or might omit a value to indicate that -websockets are supported at the current endpoint). +WebSockets are supported at the current endpoint). **Specified capabilities**