<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.39 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-vasters-json-structure-relations-00" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.33.0 -->
  <front>
    <title>JSON Structure: Relations</title>
    <seriesInfo name="Internet-Draft" value="draft-vasters-json-structure-relations-00"/>
    <author fullname="Clemens Vasters">
      <organization>Microsoft Corporation</organization>
      <address>
        <email>clemensv@microsoft.com</email>
      </address>
    </author>
    <date year="2026" month="June" day="08"/>
    <area>Web and Internet Transport</area>
    <workgroup>Building Blocks for HTTP APIs</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 43?>

<t>This document is an extension to JSON Structure Core. It defines keywords for
modeling relationships and associations between objects in JSON Structure
schemas, including the <tt>identity</tt>, <tt>relations</tt>, <tt>targettype</tt>, <tt>cardinality</tt>,
<tt>scope</tt>, and <tt>qualifiertype</tt> keywords.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://json-structure.github.io/relations/draft-vasters-json-structure-relations.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-vasters-json-structure-relations/"/>.
      </t>
      <t>
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/json-structure/relations"/>.</t>
    </note>
  </front>
  <middle>
    <?line 50?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This document is an extension to JSON Structure Core <xref target="JSTRUCT-CORE"/>. It
defines keywords for modeling relationships and associations between objects in
JSON Structure schemas.</t>
      <t>In many data models, objects need to reference other objects to express
relationships such as authorship, ownership, membership, or other associations.
This specification provides a structured way to declare such relationships
within JSON Structure schemas.</t>
      <t>The key concepts introduced are:</t>
      <ul spacing="normal">
        <li>
          <t><strong>Identity</strong>: A mechanism for uniquely identifying object instances based on
one or more property values.</t>
        </li>
        <li>
          <t><strong>Relations</strong>: Declarations that specify how one object type relates to
another, including cardinality and optional qualifiers.</t>
        </li>
      </ul>
    </section>
    <section anchor="conventions">
      <name>Conventions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

</section>
    <section anchor="identity">
      <name>Identity</name>
      <t>The <tt>identity</tt> keyword is used to declare which properties of an object or tuple
uniquely identify instances of that type. The identity declaration serves much
like a primary key in a relational database.</t>
      <section anchor="identity-keyword">
        <name>The <tt>identity</tt> Keyword</name>
        <t>The <tt>identity</tt> keyword <bcp14>MUST</bcp14> be used only with schemas of type <tt>object</tt> or
<tt>tuple</tt>. Its value <bcp14>MUST</bcp14> be an array of strings, where each string is the name of
a property defined in the <tt>properties</tt> map of the type.</t>
        <t>When an object type has an <tt>identity</tt> declaration, any instance of that type <bcp14>MUST</bcp14>
be uniquely identified by the combination of its identity property values. Two
instances with the same identity values <bcp14>MUST NOT</bcp14> exist within the same identity
scope.</t>
        <t>An identity scope is the boundary within which identity values must be unique.
Identity scopes <bcp14>MAY</bcp14> be:</t>
        <ul spacing="normal">
          <li>
            <t>A collection within a document, such as an <tt>array</tt>, <tt>set</tt>, or <tt>map</tt> containing
instances of the type.</t>
          </li>
          <li>
            <t>An entire document when instances are distributed across multiple collections.</t>
          </li>
          <li>
            <t>An external data source, such as a database or service, when the <tt>identity</tt>
property is used to reference instances that exist outside the current
document.</t>
          </li>
        </ul>
        <t>The specific identity scope is determined by the <tt>scope</tt> keyword in the relation
declaration. When <tt>scope</tt> is present, it identifies where in the document
instances of the target type can be found. When <tt>scope</tt> is absent, the identity
scope extends beyond the document to external data sources.</t>
        <t>Example:</t>
        <sourcecode type="json"><![CDATA[
{
  "Author": {
    "type": "object",
    "properties": {
      "id": { "type": "uuid" },
      "name": { "type": "string" }
    },
    "required": ["id", "name"],
    "identity": ["id"]
  }
}
]]></sourcecode>
        <t>For objects with composite identities, multiple properties can be specified:</t>
        <sourcecode type="json"><![CDATA[
{
  "BookEdition": {
    "type": "object",
    "properties": {
      "isbn": { "type": "string" },
      "edition": { "type": "int32" },
      "title": { "type": "string" }
    },
    "required": ["isbn", "edition", "title"],
    "identity": ["isbn", "edition"]
  }
}
]]></sourcecode>
      </section>
    </section>
    <section anchor="relations">
      <name>Relations</name>
      <t>The <tt>relations</tt> keyword is used to declare relationship properties on object and
tuple types. Relations express associations between instances of different
types.</t>
      <section anchor="relations-keyword">
        <name>The <tt>relations</tt> Keyword</name>
        <t>The <tt>relations</tt> keyword <bcp14>MUST</bcp14> be used only with schemas of type <tt>object</tt> or
<tt>tuple</tt>. Its value <bcp14>MUST</bcp14> be a JSON object where each key is a relation name and
each value is a relation declaration.</t>
        <t>Relation names <bcp14>MUST</bcp14> conform to the same identifier rules as property names in
JSON Structure Core. The <tt>relations</tt> and <tt>properties</tt> keywords share a
namespace, meaning a relation name <bcp14>MUST NOT</bcp14> conflict with any property name in
the same type.</t>
        <t>A relation declaration is a JSON object that defines the characteristics of the
relationship. It <bcp14>MUST</bcp14> contain the following properties:</t>
        <ul spacing="normal">
          <li>
            <t><tt>targettype</tt>: Declares the target type that the relation refers to.</t>
          </li>
          <li>
            <t><tt>cardinality</tt>: Declares whether the relationship points to one or more targets
(<tt>single</tt> or <tt>multiple</tt>).</t>
          </li>
        </ul>
        <t>A relation declaration <bcp14>MAY</bcp14> contain:</t>
        <ul spacing="normal">
          <li>
            <t><tt>scope</tt>: Specifies where instances of the target type can be found within the
document.</t>
          </li>
          <li>
            <t><tt>qualifiertype</tt>: Defines a type to qualify the relationship with additional
properties (similar to link properties in graph models).</t>
          </li>
        </ul>
        <t>Example:</t>
        <sourcecode type="json"><![CDATA[
{
  "definitions": {
    "Author": {
      "type": "object",
      "properties": {
        "id": { "type": "uuid" },
        "name": { "type": "string" }
      },
      "required": ["id", "name"],
      "identity": ["id"]
    },
    "Book": {
      "type": "object",
      "properties": {
        "isbn": { "type": "string" },
        "title": { "type": "string" }
      },
      "required": ["isbn", "title"],
      "identity": ["isbn"],
      "relations": {
        "authors": {
          "cardinality": "multiple",
          "targettype": { "$ref": "#/definitions/Author" }
        }
      }
    }
  }
}
]]></sourcecode>
      </section>
      <section anchor="targettype-keyword">
        <name>The <tt>targettype</tt> Keyword</name>
        <t>The <tt>targettype</tt> keyword specifies the target type of a relation. Its value <bcp14>MUST</bcp14>
be a schema containing a <tt>$ref</tt> keyword that points to a type definition with an
<tt>identity</tt> declaration.</t>
        <t>The target type <bcp14>MUST</bcp14> have an <tt>identity</tt> declaration. This identity is used to
establish references between instances.</t>
        <t>Example:</t>
        <sourcecode type="json"><![CDATA[
{
  "targettype": { "$ref": "#/definitions/Author" }
}
]]></sourcecode>
      </section>
      <section anchor="cardinality-keyword">
        <name>The <tt>cardinality</tt> Keyword</name>
        <t>The <tt>cardinality</tt> keyword specifies whether a relation points to a single target
or multiple targets. Its value <bcp14>MUST</bcp14> be one of the following strings:</t>
        <ul spacing="normal">
          <li>
            <t><tt>"single"</tt>: The relation refers to exactly one target instance.</t>
          </li>
          <li>
            <t><tt>"multiple"</tt>: The relation refers to zero or more target instances.</t>
          </li>
        </ul>
        <t>Example for a single-cardinality relation:</t>
        <sourcecode type="json"><![CDATA[
{
  "publisher": {
    "cardinality": "single",
    "targettype": { "$ref": "#/definitions/Publisher" }
  }
}
]]></sourcecode>
        <t>Example for a multiple-cardinality relation:</t>
        <sourcecode type="json"><![CDATA[
{
  "authors": {
    "cardinality": "multiple",
    "targettype": { "$ref": "#/definitions/Author" }
  }
}
]]></sourcecode>
      </section>
      <section anchor="scope-keyword">
        <name>The <tt>scope</tt> Keyword</name>
        <t>The <tt>scope</tt> keyword specifies where instances of the target type can be found
within an instance document. When present, it indicates that the relation
references objects contained in the current document. When absent, the relation
references objects that exist in an external context, such as a database,
service, or another document.</t>
        <t>The value of <tt>scope</tt> <bcp14>MUST</bcp14> be either:</t>
        <ul spacing="normal">
          <li>
            <t>A string containing a JSON Pointer (<xref target="RFC6901"/>) to a schema location, or</t>
          </li>
          <li>
            <t>An array of strings, each containing a JSON Pointer to a schema location.</t>
          </li>
        </ul>
        <t>Each JSON Pointer <bcp14>MUST</bcp14> reference a valid location within the same schema
document. The referenced location <bcp14>MUST</bcp14> be one of the following:</t>
        <ul spacing="normal">
          <li>
            <t>A property definition within a type whose value is an <tt>array</tt>, <tt>set</tt>, or
<tt>map</tt> containing items compatible with <tt>targettype</tt>. For example:
<tt>#/definitions/Library/properties/authors</tt>.</t>
          </li>
          <li>
            <t>The document root type (as declared by <tt>$root</tt>) if the root type is an
<tt>array</tt>, <tt>set</tt>, or <tt>map</tt> containing items compatible with <tt>targettype</tt>. In
this case, the scope value is <tt>#</tt> (pointing to the root).</t>
          </li>
        </ul>
        <t>The referenced type is considered compatible with <tt>targettype</tt> if the <tt>items</tt>
type (for <tt>array</tt> or <tt>set</tt>) or <tt>values</tt> type (for <tt>map</tt>) matches <tt>targettype</tt>
or is a subtype of <tt>targettype</tt>.</t>
        <t>When resolving a relation at runtime, the application uses the <tt>scope</tt> to
identify which collections in the document instance contain potential target
objects. The application then searches these collections for an object whose
identity matches the <tt>identity</tt> value in the relation instance. For <tt>map</tt>
types, the application searches the map's values, not its keys.</t>
        <t>Example with a single scope pointing to a property:</t>
        <sourcecode type="json"><![CDATA[
{
  "definitions": {
    "Library": {
      "type": "object",
      "properties": {
        "authors": {
          "type": "array",
          "items": { "$ref": "#/definitions/Author" }
        },
        "books": {
          "type": "array",
          "items": { "$ref": "#/definitions/Book" }
        }
      }
    },
    "Author": {
      "type": "object",
      "properties": {
        "id": { "type": "uuid" },
        "name": { "type": "string" }
      },
      "identity": ["id"]
    },
    "Book": {
      "type": "object",
      "properties": {
        "isbn": { "type": "string" },
        "title": { "type": "string" }
      },
      "identity": ["isbn"],
      "relations": {
        "authors": {
          "cardinality": "multiple",
          "targettype": { "$ref": "#/definitions/Author" },
          "scope": "#/definitions/Library/properties/authors"
        }
      }
    }
  }
}
]]></sourcecode>
        <t>Example with multiple scopes:</t>
        <sourcecode type="json"><![CDATA[
{
  "relations": {
    "contributors": {
      "cardinality": "multiple",
      "targettype": { "$ref": "#/definitions/Person" },
      "scope": [
        "#/definitions/Project/properties/teamMembers",
        "#/definitions/Project/properties/externalContributors"
      ]
    }
  }
}
]]></sourcecode>
        <t>Example of an external relation (no scope):</t>
        <sourcecode type="json"><![CDATA[
{
  "relations": {
    "customer": {
      "cardinality": "single",
      "targettype": { "$ref": "#/definitions/Customer" }
    }
  }
}
]]></sourcecode>
        <t>In this example, the absence of <tt>scope</tt> indicates that <tt>Customer</tt> instances are
not expected to be found in the document. The application must resolve the
reference through external means.</t>
      </section>
      <section anchor="qualifiertype-keyword">
        <name>The <tt>qualifiertype</tt> Keyword</name>
        <t>The <tt>qualifiertype</tt> keyword allows a relation to carry additional properties
that qualify the relationship itself, similar to link properties in graph
databases.</t>
        <t>The value of <tt>qualifiertype</tt> <bcp14>MUST</bcp14> be a reference to a reusable type using the
<tt>$ref</tt> keyword.</t>
        <t>Example:</t>
        <sourcecode type="json"><![CDATA[
{
  "definitions": {
    "Person": {
      "type": "object",
      "properties": {
        "id": { "type": "uuid" },
        "name": { "type": "string" }
      },
      "required": ["id", "name"],
      "identity": ["id"]
    },
    "ContributorQualifier": {
      "type": "object",
      "properties": {
        "role": { "type": "string" },
        "startDate": { "type": "date" },
        "endDate": { "type": "date" }
      },
      "required": ["role"]
    },
    "Project": {
      "type": "object",
      "properties": {
        "projectId": { "type": "string" },
        "name": { "type": "string" }
      },
      "required": ["projectId", "name"],
      "identity": ["projectId"],
      "relations": {
        "contributors": {
          "cardinality": "multiple",
          "targettype": { "$ref": "#/definitions/Person" },
          "qualifiertype": { "$ref": "#/definitions/ContributorQualifier" }
        }
      }
    }
  }
}
]]></sourcecode>
      </section>
    </section>
    <section anchor="relation-instance-structure">
      <name>Relation Instance Structure</name>
      <t>In JSON document instances, relations are represented as properties of the
containing object. The structure of a relation instance depends on its
cardinality.</t>
      <section anchor="single-cardinality-relations">
        <name>Single-Cardinality Relations</name>
        <t>A single-cardinality relation is represented as a JSON object with the following
properties:</t>
        <ul spacing="normal">
          <li>
            <t><tt>identity</tt>: A value or tuple of values that match the identity of the target
object.</t>
          </li>
        </ul>
        <t>If the relation has a <tt>qualifiertype</tt>, the qualifier properties are included
in a <tt>qualifier</tt> property within the relation object.</t>
        <t>Example:</t>
        <sourcecode type="json"><![CDATA[
{
  "isbn": "978-0-123456-78-9",
  "title": "Example Book",
  "publisher": {
    "identity": "550e8400-e29b-41d4-a716-446655440000"
  }
}
]]></sourcecode>
        <t>With qualifier properties:</t>
        <sourcecode type="json"><![CDATA[
{
  "isbn": "978-0-123456-78-9",
  "title": "Example Book",
  "editor": {
    "identity": "650e8400-e29b-41d4-a716-446655440001",
    "qualifier": {
      "role": "Chief Editor",
      "startDate": "2020-01-15"
    }
  }
}
]]></sourcecode>
      </section>
      <section anchor="multiple-cardinality-relations">
        <name>Multiple-Cardinality Relations</name>
        <t>A multiple-cardinality relation is represented as a JSON array. Each element of
the array is a relation object with the same structure as a single-cardinality
relation.</t>
        <t>Example:</t>
        <sourcecode type="json"><![CDATA[
{
  "isbn": "978-0-123456-78-9",
  "title": "Example Book",
  "authors": [
    { "identity": "123e4567-e89b-12d3-a456-426614174000" },
    { "identity": "223e4567-e89b-12d3-a456-426614174001" }
  ]
}
]]></sourcecode>
        <t>With qualifier properties:</t>
        <sourcecode type="json"><![CDATA[
{
  "projectId": "proj-123",
  "name": "Example Project",
  "contributors": [
    {
      "identity": "323e4567-e89b-12d3-a456-426614174002",
      "qualifier": {
        "role": "Developer",
        "startDate": "2020-06-01"
      }
    },
    {
      "identity": "423e4567-e89b-12d3-a456-426614174003",
      "qualifier": {
        "role": "Designer",
        "startDate": "2020-06-15",
        "endDate": "2021-12-31"
      }
    }
  ]
}
]]></sourcecode>
      </section>
      <section anchor="identity-values">
        <name>Identity Values</name>
        <t>The <tt>identity</tt> property in a relation object contains the identity value(s) of
the target object.</t>
        <ul spacing="normal">
          <li>
            <t>If the target type's <tt>identity</tt> declaration specifies a single property, the
<tt>identity</tt> value is a scalar matching that property's type.</t>
          </li>
          <li>
            <t>If the target type's <tt>identity</tt> declaration specifies multiple properties
(composite identity), the <tt>identity</tt> value is a JSON array containing the
values in the same order as declared in the <tt>identity</tt> keyword.</t>
          </li>
        </ul>
        <t>Example with single-property identity:</t>
        <sourcecode type="json"><![CDATA[
{
  "identity": "550e8400-e29b-41d4-a716-446655440000"
}
]]></sourcecode>
        <t>Example with composite identity:</t>
        <sourcecode type="json"><![CDATA[
{
  "identity": ["978-0-123456-78-9", 2]
}
]]></sourcecode>
      </section>
      <section anchor="reference-resolution">
        <name>Reference Resolution</name>
        <t>A relationship is established through the <tt>identity</tt> property in a relation
instance, which contains the identity value(s) of the target object.</t>
        <t>The resolution mechanism depends on whether the relation declaration includes a
<tt>scope</tt>:</t>
        <ul spacing="normal">
          <li>
            <t><strong>With <tt>scope</tt></strong>: The application uses the schema pointers in <tt>scope</tt> to
identify the corresponding collections in the document instance. It searches
these collections for an object whose identity matches the <tt>identity</tt> value.
For <tt>map</tt> collections, the search is performed on the map's values.</t>
          </li>
          <li>
            <t><strong>Without <tt>scope</tt></strong>: The relation references an object that exists outside
the document. The application must resolve the reference through external
means, such as querying a database or service.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="complete-example">
      <name>Complete Example</name>
      <t>This example demonstrates a library schema with books and authors:</t>
      <sourcecode type="json"><![CDATA[
{
  "$schema": "https://json-structure.org/meta/core/v0/#",
  "$id": "https://example.com/library",
  "$root": "#/definitions/Library",
  "definitions": {
    "Library": {
      "type": "object",
      "properties": {
        "name": { "type": "string" },
        "authors": {
          "type": "array",
          "items": { "$ref": "#/definitions/Author" }
        },
        "books": {
          "type": "array",
          "items": { "$ref": "#/definitions/Book" }
        }
      },
      "required": ["name", "authors", "books"]
    },
    "Author": {
      "type": "object",
      "properties": {
        "id": { "type": "uuid" },
        "name": { "type": "string" }
      },
      "required": ["id", "name"],
      "identity": ["id"]
    },
    "Book": {
      "type": "object",
      "properties": {
        "isbn": { "type": "string" },
        "title": { "type": "string" }
      },
      "required": ["isbn", "title"],
      "identity": ["isbn"],
      "relations": {
        "authors": {
          "cardinality": "multiple",
          "targettype": { "$ref": "#/definitions/Author" },
          "scope": "#/definitions/Library/properties/authors"
        }
      }
    }
  }
}
]]></sourcecode>
      <t>Example instance document:</t>
      <sourcecode type="json"><![CDATA[
{
  "$schema": "https://example.com/library",
  "name": "City Central Library",
  "authors": [
    {
      "id": "123e4567-e89b-12d3-a456-426614174000",
      "name": "Alice Smith"
    },
    {
      "id": "223e4567-e89b-12d3-a456-426614174001",
      "name": "Bob Jones"
    }
  ],
  "books": [
    {
      "isbn": "978-0-123456-78-9",
      "title": "The Great Novel",
      "authors": [
        { "identity": "123e4567-e89b-12d3-a456-426614174000" }
      ]
    },
    {
      "isbn": "978-0-987654-32-1",
      "title": "Another Great Book",
      "authors": [
        { "identity": "123e4567-e89b-12d3-a456-426614174000" },
        { "identity": "223e4567-e89b-12d3-a456-426614174001" }
      ]
    }
  ]
}
]]></sourcecode>
    </section>
    <section anchor="reserved-keywords">
      <name>Reserved Keywords</name>
      <t>This specification adds the following keywords to the JSON Structure reserved
keyword list:</t>
      <ul spacing="normal">
        <li>
          <t><tt>identity</tt></t>
        </li>
        <li>
          <t><tt>relations</tt></t>
        </li>
        <li>
          <t><tt>targettype</tt></t>
        </li>
        <li>
          <t><tt>cardinality</tt></t>
        </li>
        <li>
          <t><tt>scope</tt></t>
        </li>
        <li>
          <t><tt>qualifiertype</tt></t>
        </li>
      </ul>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>Relations create references between objects that may span different parts of a
document or different documents. Implementations <bcp14>MUST</bcp14> ensure that:</t>
      <ul spacing="normal">
        <li>
          <t>Identity values are validated against the expected target type.</t>
        </li>
        <li>
          <t>Circular references are handled appropriately to prevent infinite loops during
traversal.</t>
        </li>
        <li>
          <t>Identity matching across documents does not expose sensitive information
through unintended correlations.</t>
        </li>
      </ul>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-normative-references">
      <name>Normative References</name>
      <reference anchor="RFC2119">
        <front>
          <title>Key words for use in RFCs to Indicate Requirement Levels</title>
          <author fullname="S. Bradner" initials="S." surname="Bradner"/>
          <date month="March" year="1997"/>
          <abstract>
            <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="2119"/>
        <seriesInfo name="DOI" value="10.17487/RFC2119"/>
      </reference>
      <reference anchor="RFC6901">
        <front>
          <title>JavaScript Object Notation (JSON) Pointer</title>
          <author fullname="P. Bryan" initials="P." role="editor" surname="Bryan"/>
          <author fullname="K. Zyp" initials="K." surname="Zyp"/>
          <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
          <date month="April" year="2013"/>
          <abstract>
            <t>JSON Pointer defines a string syntax for identifying a specific value within a JavaScript Object Notation (JSON) document.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="6901"/>
        <seriesInfo name="DOI" value="10.17487/RFC6901"/>
      </reference>
      <reference anchor="RFC8174">
        <front>
          <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
          <author fullname="B. Leiba" initials="B." surname="Leiba"/>
          <date month="May" year="2017"/>
          <abstract>
            <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="8174"/>
        <seriesInfo name="DOI" value="10.17487/RFC8174"/>
      </reference>
      <reference anchor="RFC8259">
        <front>
          <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
          <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
          <date month="December" year="2017"/>
          <abstract>
            <t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format. It was derived from the ECMAScript Programming Language Standard. JSON defines a small set of formatting rules for the portable representation of structured data.</t>
            <t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t>
          </abstract>
        </front>
        <seriesInfo name="STD" value="90"/>
        <seriesInfo name="RFC" value="8259"/>
        <seriesInfo name="DOI" value="10.17487/RFC8259"/>
      </reference>
      <reference anchor="RFC9562">
        <front>
          <title>Universally Unique IDentifiers (UUIDs)</title>
          <author fullname="K. Davis" initials="K." surname="Davis"/>
          <author fullname="B. Peabody" initials="B." surname="Peabody"/>
          <author fullname="P. Leach" initials="P." surname="Leach"/>
          <date month="May" year="2024"/>
          <abstract>
            <t>This specification defines UUIDs (Universally Unique IDentifiers) --
also known as GUIDs (Globally Unique IDentifiers) -- and a Uniform
Resource Name namespace for UUIDs. A UUID is 128 bits long and is
intended to guarantee uniqueness across space and time. UUIDs were
originally used in the Apollo Network Computing System (NCS), later
in the Open Software Foundation's (OSF's) Distributed Computing
Environment (DCE), and then in Microsoft Windows platforms.</t>
            <t>This specification is derived from the OSF DCE specification with the
kind permission of the OSF (now known as "The Open Group"). Information from earlier versions of the OSF DCE specification have
been incorporated into this document. This document obsoletes RFC
4122.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="9562"/>
        <seriesInfo name="DOI" value="10.17487/RFC9562"/>
      </reference>
      <reference anchor="JSTRUCT-CORE" target="https://json-structure.github.io/core/draft-vasters-json-structure-core.html">
        <front>
          <title>JSON Structure Core</title>
          <author fullname="Clemens Vasters">
            <organization/>
          </author>
          <date>n.d.</date>
        </front>
      </reference>
    </references>
    <?line 684?>

<section numbered="false" anchor="changes-from-draft-vasters-json-structure-relations-00">
      <name>Changes from draft-vasters-json-structure-relations-00</name>
      <ul spacing="normal">
        <li>
          <t>Added missing BCP 14 references (RFC 2119, RFC 8174).</t>
        </li>
        <li>
          <t>Improved phrasing of identity keyword description.</t>
        </li>
        <li>
          <t>Fixed modal placement: "<bcp14>MUST</bcp14> only be used" → "<bcp14>MUST</bcp14> be used only".</t>
        </li>
      </ul>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
SlhiBA6eYmUPwF9Tq7Mhtie05hk+uTFtCy3sdmTeo3EKeyjjBX2oi+4Z1+Jj
C0KLs/2Ck4700Pf6vaGAef8emm+jW8Qkil5WLqQlCwEWZlnJvLGUA6hHTsI9
j6R5oMVHZD3iPKuqDy+yHGXhCykkZ+UKClgqCbeA6wZBz8M9vxclpp9PTFx/
5NYYmYmGSdvpHdB5wxV2wDvaIN24RZe63RUU+LF9EBtYBwSRWkTOkdQEfIBb
VWcrw+lSoGxZfk5WpYnUJM7Te2A6V+8qTh1fP4DUN3b2KrHRuHtengIX6QUu
ytMjdei9mibs4VuuKDrxB2r3CF4EKwfIkY5jxMyB1W2BLkI6Q63G9lNQVTTo
0oiScT/csAmwnCP3eUTzLTm6iIXg6M56KFo/jsAWeapcOQUdAVgIlUVCBzOH
g8RQZPIJTQ7GZOnkWgA+noLlBJ+Tp8ZgB3kx1UgMFdEX08Bz8JfVFeLh8Can
75cvTBKoF/PdgIqdPP+jHCImgOh/g7KHNw1ICqXd/kilUxVYDsrt/SxVrYgl
qc2pBGBBGlVooY3idGs18TCQ0RgrxJSXmrBTbTad+1vT3XmxWeDLk24lBxFW
POKaWpXOc6/7mCspyZTp4oULNxDCTZkvckAJZ4A854P/DiC5qPlyrgsoW3c4
SxKZXBVWrT/oeNBVHmKVj7jfj67hSZnnKe7xpiv8qXMg6PS+Cpv7fd46/mw1
StpLBY5s0JW99yYw9fAAVF3hChqh2VM6hMtoSTzyOzn9Vlh8B4qLvTd2PCnZ
0cJhcWIOu8j861ysdlKe6fC8lGvtuim/v/FT0mpnVxUxD7eq03VKETkl5c28
pAPapoigm58Ml7M2WkEd6sZqR8NZpI7cfbjIts75pVide6LLyb2E0UUYkQDj
MytyOXcZxUBwcIdufy4/OzzzDbXHNK+5y7VgRJ9txsR7/tEntzLjmoARGnoT
4GpjPxRukE847zguXWRQxj1W88Zge88GvRJEYeAoIezBuTT7DHnJhDt1WT3H
30RddZzTEI+oPGtQTfzSp5mzx8VlS0IgvIymo80aQW3s1uP6OztrqLAhnAbx
9SDt2p57rM4X2JuejOr80kknNXTlspMfyy9186Z0z53+OWevMt4gnS4z3Csw
6X+Qk3sqbVI9bZtcnUtXB7pL+Jn0XfN5NQcFs02kcSV4GKp5jCJb8UAJUOX6
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
hOKCODeM2tnb52+BgqYnyNh/AyolUiesSQAA

-->

</rfc>
