<?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.6 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-asdf-sdf-18" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.20.0 -->
  <front>
    <title abbrev="SDF (Semantic Definition Format)">Semantic Definition Format (SDF) for Data and Interactions of Things</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-asdf-sdf-18"/>
    <author initials="M." surname="Koster" fullname="Michael Koster" role="editor">
      <organization>KTC</organization>
      <address>
        <postal>
          <street>29415 Alderpoint Road</street>
          <city>Blocksburg, CA</city>
          <code>95514</code>
          <country>USA</country>
        </postal>
        <phone>+1-707-502-5136</phone>
        <email>michaeljohnkoster@gmail.com</email>
      </address>
    </author>
    <author initials="C." surname="Bormann" fullname="Carsten Bormann" role="editor">
      <organization ascii="Universitaet Bremen TZI">Universität Bremen TZI</organization>
      <address>
        <postal>
          <street>Postfach 330440</street>
          <city>Bremen</city>
          <code>D-28359</code>
          <country>Germany</country>
        </postal>
        <phone>+49-421-218-63921</phone>
        <email>cabo@tzi.org</email>
      </address>
    </author>
    <author initials="A." surname="Keränen" fullname="Ari Keränen">
      <organization>Ericsson</organization>
      <address>
        <postal>
          <city>Jorvas</city>
          <code>02420</code>
          <country>Finland</country>
        </postal>
        <email>ari.keranen@ericsson.com</email>
      </address>
    </author>
    <date year="2024" month="February" day="29"/>
    <area>Applications</area>
    <workgroup>ASDF</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 142?>

<t>The Semantic Definition Format (SDF) is a format for domain experts to
use in the creation and maintenance of data and interaction models
that describe Things, i.e., physical objects that are available for interaction
over a network. An SDF specification describes definitions of
SDF Objects/SDF Things and their associated interactions (Events, Actions,
Properties), as well as the Data types for the information exchanged
in those interactions. Tools convert this format to database formats
and other serializations as needed.</t>
      <t><cref anchor="status">The present revision (-18) adds security considerations, a
few editorial cleanups, discusses JSON pointer encodings, and adds
sockets to the CDDL for easier future extension.</cref></t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-asdf-sdf/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        A Semantic Definition Format for Data and Interactions of Things (ASDF) Working Group mailing list (<eref target="mailto:asdf@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/asdf/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/asdf/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/ietf-wg-asdf/SDF"/>.</t>
    </note>
  </front>
  <middle>
    <?line 162?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The Semantic Definition Format (SDF) is a format for domain experts to
use in the creation and maintenance of data and interaction models
that describe Things, i.e., physical objects that are available for interaction
over a network. An SDF specification describes definitions of
SDF Objects/SDF Things and their associated interactions (Events, Actions,
Properties), as well as the Data types for the information exchanged
in those interactions. Tools convert this format to database formats
and other serializations as needed.</t>
      <t><cref anchor="status_1">The present revision (-18) adds security considerations, a
few editorial cleanups, discusses JSON pointer encodings, and adds
sockets to the CDDL for easier future extension.</cref></t>
      <t>SDF is designed to be an extensible format.
The present document constitutes the base specification for SDF; we
speak of "base SDF" for short.
In addition, SDF extensions can be defined, some of which may make use
of extension points specifically defined for this in base SDF.
One area for such extensions would be refinements of SDF's abstract
interaction models into protocol bindings for specific ecosystems
(e.g., <xref target="I-D.bormann-asdf-sdf-mapping"/>).
For other extensions, it may be necessary to indicate in the SDF
document that a specific extension is in effect; see
<xref target="information-block"/> for details of the <tt>features</tt> quality that can be
used for such indications.
With extension points and feature indications available,
base SDF does not define a "version" concept for the SDF format itself
(as opposed to version indications within SDF documents indicating
their own evolution, see <xref target="information-block"/>).</t>
      <section anchor="terminology-and-conventions">
        <name>Terminology and Conventions</name>
        <dl>
          <dt>Thing:</dt>
          <dd>
            <t>A physical item that is also available for interaction over a network.</t>
          </dd>
          <dt>Grouping:</dt>
          <dd>
            <t>An sdfThing or sdfObject, i.e., (directly or indirectly) a combination of Affordances.</t>
          </dd>
          <dt>sdfThing:</dt>
          <dd>
            <t>A grouping of Groupings as well as potentially Affordance
declarations (Property, Action, and Event declarations).</t>
          </dd>
          <dt>Affordance:</dt>
          <dd>
            <t>An element of an interface offered for interaction, for which
information is available (directly or indirectly) that indicates how
it can or should be used.
The term is used here for the digital (network-directed) interfaces
of a Thing only; it
might also have physical affordances such as buttons, dials, and
displays.</t>
          </dd>
          <dt>Quality:</dt>
          <dd>
            <t>A metadata item in a definition or declaration which says something
about that definition or declaration.  A quality is represented in
SDF as an entry in a JSON map (JSON object) that serves as a definition
or declaration.</t>
          </dd>
          <dt>Entry:</dt>
          <dd>
            <t>A key-value pair in a map. (In JSON maps, sometimes also called "member".)</t>
          </dd>
          <dt>Block:</dt>
          <dd>
            <t>One or more entries in a JSON map that is part of an SDF
specification; these entries together serve a specific function.</t>
          </dd>
          <dt>Group:</dt>
          <dd>
            <t>An entry in the main JSON map representing the SDF document, and in
certain nested definitions, that
has a Class Name Keyword as its key and a map of named definition
entries (Definition Group) as a value.</t>
          </dd>
          <dt>Class Name Keyword:</dt>
          <dd>
            <t>One of <tt>sdfThing</tt>, <tt>sdfObject</tt>, <tt>sdfProperty</tt>, <tt>sdfAction</tt>,
<tt>sdfEvent</tt>, or <tt>sdfData</tt>; the Classes for these type keywords are
capitalized and prefixed with <tt>sdf</tt>.</t>
          </dd>
          <dt>Class:</dt>
          <dd>
            <t>Abstract term for the information that is contained in groups
identified by a Class Name Keyword.</t>
          </dd>
          <dt>Property:</dt>
          <dd>
            <t>An affordance that can potentially be used to read, write, and/or
observe state (current/stored information) on an sdfObject.
(Note that Entries are often called
properties in other environments; in this document, the term
Property is specifically reserved for affordances, even if the map
key "properties" might be imported from a data definition language
with the other semantics.)</t>
          </dd>
          <dt>Action:</dt>
          <dd>
            <t>An affordance that can potentially be used to perform a named operation on an sdfObject.</t>
          </dd>
          <dt>Event:</dt>
          <dd>
            <t>An affordance that can potentially be used to obtain information about what happened to an sdfObject.</t>
          </dd>
          <dt>Object, sdfObject:</dt>
          <dd>
            <t>A grouping containing only Affordance declarations (Property, Action, and Event declarations); the main
"atom" of reusable semantics for model construction. sdfObjects are
similar to sdfThings but do not allow nesting, i.e., they cannot contain
other Groupings (sdfObjects or sdfThings). (Note that
JSON maps are often called JSON objects due to JSON's JavaScript
heritage; in the context of SDF, the term Object as the colloquial shorthand for sdfObject, is specifically reserved for the
above grouping, even if
the type name <tt>"object"</tt> is imported from a data definition
language with the other semantics.)</t>
          </dd>
          <dt>Element:</dt>
          <dd>
            <t>A part or an aspect of something abstract; used here in its usual English definition.
(Occasionally, also used specifically for the elements of JSON arrays.)</t>
          </dd>
          <dt>Definition:</dt>
          <dd>
            <t>An entry in a Definition Group; the entry creates a new semantic
term for use in SDF models and associates it with a set of
qualities.
Unless it is also a Declaration, a definition just defines a term,
it does not create a component item within the enclosing definition.</t>
          </dd>
          <dt>Declaration:</dt>
          <dd>
            <t>A definition within an enclosing
definition, intended to create a component item within that
enclosing definition.  Every declaration can also be used as a
definition for reference in a different place.</t>
          </dd>
          <dt>SDF Document:</dt>
          <dd>
            <t>Container for SDF Definitions, together with data
about the SDF Document itself (information block).
Represented as a JSON text representing a single JSON map, which is
built from nested maps.</t>
          </dd>
          <dt>SDF Model:</dt>
          <dd>
            <t>Definitions and declarations that model the digital interaction
opportunities offered by one or more kinds of Things, represented
by sdfObjects and sdfThings.
An SDF Model can be fully contained in a single SDF Document, or it
can be built from an SDF Document that references definitions and
declarations from additional SDF documents.</t>
          </dd>
          <dt>Protocol Binding:</dt>
          <dd>
            <t>A companion document to an SDF Model that defines how to map
the abstract concepts in the model into the protocols in use
in a specific ecosystem.  Might supply URL components, numeric IDs,
and similar details.  Protocol Bindings are one case of an
Augmentation Mechanism.</t>
          </dd>
          <dt>Augmentation Mechanism:</dt>
          <dd>
            <t>A companion document to a base SDF Model that provides additional
information ("augments" the base specification), possibly for use in
a specific ecosystem or with a specific protocol ("Protocol Binding").
No specific Augmentation Mechanisms are defined in base SDF.
A simple mechanism for such augmentations has been discussed as a
"mapping file" <xref target="I-D.bormann-asdf-sdf-mapping"/>.</t>
          </dd>
        </dl>
        <t>The term "byte" is used in its now-customary sense as a synonym for
"octet".</t>
        <t>Conventions:</t>
        <ul spacing="normal">
          <li>
            <t>The singular form is chosen as the preferred one for the keywords defined here.</t>
          </li>
        </ul>
        <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>
    <section anchor="overview">
      <name>Overview</name>
      <section anchor="example-definition">
        <name>Example Definition</name>
        <t>We start with an example for the SDF definition of a simple sdfObject called "Switch" (<xref target="example1"/>).</t>
        <figure anchor="example1">
          <name>A simple example of an SDF document</name>
          <sourcecode type="json" name="example1.sdf.json"><![CDATA[
{
  "info": {
    "title": "Example document for SDF (Semantic Definition Format)",
    "version": "2019-04-24",
    "copyright": "Copyright 2019 Example Corp. All rights reserved.",
    "license": "https://example.com/license"
  },
  "namespace": {
    "cap": "https://example.com/capability/cap"
  },
  "defaultNamespace": "cap",
  "sdfObject": {
    "Switch": {
      "sdfProperty": {
        "value": {
          "description":
"The state of the switch; false for off and true for on.",
          "type": "boolean"
        }
      },
      "sdfAction": {
        "on": {
          "description":
"Turn the switch on; equivalent to setting value to true."
        },
        "off": {
          "description":
"Turn the switch off; equivalent to setting value to false."
        },
        "toggle": {
          "description":
"Toggle the switch; equivalent to setting value to its complement."
        }
      }
    }
  }
}
]]></sourcecode>
        </figure>
        <t>This is a model of a switch.
The state <tt>value</tt> declared in the <tt>sdfProperty</tt> group, represented by a Boolean, will be true for "on" and will be false for "off".
The actions <tt>on</tt> or <tt>off</tt> declared in the <tt>sdfAction</tt> group are redundant with setting the <tt>value</tt> and are in the example to illustrate that there are often different ways of achieving the same effect.
The action <tt>toggle</tt> will invert the value of the sdfProperty value, so that 2-way switches can be created; having such action will avoid the need for first retrieving the current value and then applying/setting the inverted value.</t>
        <t>The <tt>sdfObject</tt> group lists the affordances of Things modeled by this sdfObject.
The <tt>sdfProperty</tt> group lists the property affordances described by the model; these represent various perspectives on the state of the sdfObject.
Properties can have additional qualities to describe the state more precisely.
Properties can be annotated to be read, write or read/write; how this is actually done by the underlying transfer protocols is not described in the SDF model but left to companion protocol bindings.
Properties are often used with RESTful paradigms <xref target="I-D.irtf-t2trg-rest-iot"/>, describing state.
The <tt>sdfAction</tt> group is the mechanism to describe other interactions in terms of their names, input, and output data (no data are used in the example), as in a POST method in REST or in a remote procedure call.
The example <tt>toggle</tt> is an Action that
changes the state based on the current state of the Property named <tt>value</tt>.
(The third type of affordance is Events, which are not described in this example.)</t>
        <t>In the JSON representation, note how (with the exception of the <tt>info</tt>
group) maps that have keys taken from the SDF vocabulary (<tt>info</tt>,
<tt>namespace</tt>, <tt>sdfObject</tt>) alternate in nesting with maps that have keys
that are freely defined by the model writer (<tt>Switch</tt>, <tt>value</tt>, <tt>on</tt>,
etc.); the latter usually use the <tt>named&lt;&gt;</tt> production in the <xref target="syntax">formal
syntax of SDF</xref>, while the former SDF-defined vocabulary items
are often, but not always, called <em>qualities</em>.</t>
      </section>
      <section anchor="elements-of-an-sdf-model">
        <name>Elements of an SDF model</name>
        <t>The SDF language uses six predefined Class Name Keywords for modeling connected
Things which are illustrated in <xref target="fig-class-2"/>.</t>
        <figure anchor="fig-class-2">
          <name>Main classes used in SDF models</name>
          <artset>
            <artwork type="svg"><svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" height="437px" preserveAspectRatio="none" version="1.1" viewBox="0 0 542 437" width="542px">
                <defs/>
                <g>
                  <!--class sdfThing-->
    <g id="elem_sdfThing">
                    <rect fill="white" height="48" id="sdfThing" rx="2.5" ry="2.5" width="93" x="136.13" y="7" stroke="black" stroke-width="0.5"/>
                    <ellipse cx="151.13" cy="23" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/>
                    <path d="M153.6031,29.1431 Q153.0221,29.4419 152.3829,29.5913 Q151.7438,29.7407 151.0382,29.7407 Q148.5314,29.7407 147.2115,28.0889 Q145.8917,26.437 145.8917,23.3159 Q145.8917,20.1865 147.2115,18.5347 Q148.5314,16.8828 151.0382,16.8828 Q151.7438,16.8828 152.3912,17.0322 Q153.0387,17.1816 153.6031,17.4805 L153.6031,20.2031 Q152.9723,19.6221 152.3788,19.3523 Q151.7853,19.0825 151.1544,19.0825 Q149.8097,19.0825 149.1249,20.1492 Q148.4401,21.2158 148.4401,23.3159 Q148.4401,25.4077 149.1249,26.4744 Q149.8097,27.541 151.1544,27.541 Q151.7853,27.541 152.3788,27.2712 Q152.9723,27.0015 153.6031,26.4204 Z " fill="black"/>
                    <text fill="black" font-family="sans-serif" font-size="14" x="165.13" y="28.291">sdfThing</text>
                    <line x1="137.13" x2="228.13" y1="39" y2="39" stroke="black" stroke-width="0.5"/>
                    <line x1="137.13" x2="228.13" y1="47" y2="47" stroke="black" stroke-width="0.5"/>
                  </g>
                  <!--class sdfObject-->
    <g id="elem_sdfObject">
                    <rect fill="white" height="48" id="sdfObject" rx="2.5" ry="2.5" width="97" x="205.13" y="132" stroke="black" stroke-width="0.5"/>
                    <ellipse cx="220.13" cy="148" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/>
                    <path d="M222.6031,154.1431 Q222.0221,154.4419 221.3829,154.5913 Q220.7438,154.7407 220.0382,154.7407 Q217.5314,154.7407 216.2115,153.0889 Q214.8917,151.437 214.8917,148.3159 Q214.8917,145.1865 216.2115,143.5347 Q217.5314,141.8828 220.0382,141.8828 Q220.7438,141.8828 221.3912,142.0322 Q222.0387,142.1816 222.6031,142.4805 L222.6031,145.2031 Q221.9723,144.6221 221.3788,144.3523 Q220.7853,144.0825 220.1544,144.0825 Q218.8097,144.0825 218.1249,145.1492 Q217.4401,146.2158 217.4401,148.3159 Q217.4401,150.4077 218.1249,151.4744 Q218.8097,152.541 220.1544,152.541 Q220.7853,152.541 221.3788,152.2712 Q221.9723,152.0015 222.6031,151.4204 Z " fill="black"/>
                    <text fill="black" font-family="sans-serif" font-size="14" x="234.13" y="153.291">sdfObject</text>
                    <line x1="206.13" x2="301.13" y1="164" y2="164" stroke="black" stroke-width="0.5"/>
                    <line x1="206.13" x2="301.13" y1="172" y2="172" stroke="black" stroke-width="0.5"/>
                  </g>
                  <!--class sdfProperty-->
    <g id="elem_sdfProperty">
                    <rect fill="white" height="48" id="sdfProperty" rx="2.5" ry="2.5" width="111" x="29.13" y="257" stroke="black" stroke-width="0.5"/>
                    <ellipse cx="44.13" cy="273" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/>
                    <path d="M46.6031,279.1431 Q46.0221,279.4419 45.3829,279.5913 Q44.7438,279.7407 44.0382,279.7407 Q41.5314,279.7407 40.2115,278.0889 Q38.8917,276.437 38.8917,273.3159 Q38.8917,270.1865 40.2115,268.5347 Q41.5314,266.8828 44.0382,266.8828 Q44.7438,266.8828 45.3912,267.0322 Q46.0387,267.1816 46.6031,267.4805 L46.6031,270.2031 Q45.9723,269.6221 45.3788,269.3523 Q44.7853,269.0825 44.1544,269.0825 Q42.8097,269.0825 42.1249,270.1492 Q41.4401,271.2158 41.4401,273.3159 Q41.4401,275.4077 42.1249,276.4744 Q42.8097,277.541 44.1544,277.541 Q44.7853,277.541 45.3788,277.2712 Q45.9723,277.0015 46.6031,276.4204 Z " fill="black"/>
                    <text fill="black" font-family="sans-serif" font-size="14" x="58.13" y="278.291">sdfProperty</text>
                    <line x1="30.13" x2="139.13" y1="289" y2="289" stroke="black" stroke-width="0.5"/>
                    <line x1="30.13" x2="139.13" y1="297" y2="297" stroke="black" stroke-width="0.5"/>
                  </g>
                  <!--class sdfAction-->
    <g id="elem_sdfAction">
                    <rect fill="white" height="48" id="sdfAction" rx="2.5" ry="2.5" width="97" x="363.13" y="257" stroke="black" stroke-width="0.5"/>
                    <ellipse cx="378.13" cy="273" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/>
                    <path d="M380.6031,279.1431 Q380.0221,279.4419 379.3829,279.5913 Q378.7438,279.7407 378.0382,279.7407 Q375.5314,279.7407 374.2115,278.0889 Q372.8917,276.437 372.8917,273.3159 Q372.8917,270.1865 374.2115,268.5347 Q375.5314,266.8828 378.0382,266.8828 Q378.7438,266.8828 379.3912,267.0322 Q380.0387,267.1816 380.6031,267.4805 L380.6031,270.2031 Q379.9723,269.6221 379.3788,269.3523 Q378.7853,269.0825 378.1544,269.0825 Q376.8097,269.0825 376.1249,270.1492 Q375.4401,271.2158 375.4401,273.3159 Q375.4401,275.4077 376.1249,276.4744 Q376.8097,277.541 378.1544,277.541 Q378.7853,277.541 379.3788,277.2712 Q379.9723,277.0015 380.6031,276.4204 Z " fill="black"/>
                    <text fill="black" font-family="sans-serif" font-size="14" x="392.13" y="278.291">sdfAction</text>
                    <line x1="364.13" x2="459.13" y1="289" y2="289" stroke="black" stroke-width="0.5"/>
                    <line x1="364.13" x2="459.13" y1="297" y2="297" stroke="black" stroke-width="0.5"/>
                  </g>
                  <!--class sdfEvent-->
    <g id="elem_sdfEvent">
                    <rect fill="white" height="48" id="sdfEvent" rx="2.5" ry="2.5" width="90" x="175.63" y="257" stroke="black" stroke-width="0.5"/>
                    <ellipse cx="190.63" cy="273" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/>
                    <path d="M193.1031,279.1431 Q192.5221,279.4419 191.8829,279.5913 Q191.2438,279.7407 190.5382,279.7407 Q188.0314,279.7407 186.7115,278.0889 Q185.3917,276.437 185.3917,273.3159 Q185.3917,270.1865 186.7115,268.5347 Q188.0314,266.8828 190.5382,266.8828 Q191.2438,266.8828 191.8912,267.0322 Q192.5387,267.1816 193.1031,267.4805 L193.1031,270.2031 Q192.4723,269.6221 191.8788,269.3523 Q191.2853,269.0825 190.6544,269.0825 Q189.3097,269.0825 188.6249,270.1492 Q187.9401,271.2158 187.9401,273.3159 Q187.9401,275.4077 188.6249,276.4744 Q189.3097,277.541 190.6544,277.541 Q191.2853,277.541 191.8788,277.2712 Q192.4723,277.0015 193.1031,276.4204 Z " fill="black"/>
                    <text fill="black" font-family="sans-serif" font-size="14" x="204.63" y="278.291">sdfEvent</text>
                    <line x1="176.63" x2="264.63" y1="289" y2="289" stroke="black" stroke-width="0.5"/>
                    <line x1="176.63" x2="264.63" y1="297" y2="297" stroke="black" stroke-width="0.5"/>
                  </g>
                  <!--class sdfData-->
    <g id="elem_sdfData">
                    <rect fill="white" height="48" id="sdfData" rx="2.5" ry="2.5" width="84" x="236.63" y="382" stroke="black" stroke-width="0.5"/>
                    <ellipse cx="251.63" cy="398" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/>
                    <path d="M254.1031,404.1431 Q253.5221,404.4419 252.8829,404.5913 Q252.2438,404.7407 251.5382,404.7407 Q249.0314,404.7407 247.7115,403.0889 Q246.3917,401.437 246.3917,398.3159 Q246.3917,395.1865 247.7115,393.5347 Q249.0314,391.8828 251.5382,391.8828 Q252.2438,391.8828 252.8912,392.0322 Q253.5387,392.1816 254.1031,392.4805 L254.1031,395.2031 Q253.4723,394.6221 252.8788,394.3523 Q252.2853,394.0825 251.6544,394.0825 Q250.3097,394.0825 249.6249,395.1492 Q248.9401,396.2158 248.9401,398.3159 Q248.9401,400.4077 249.6249,401.4744 Q250.3097,402.541 251.6544,402.541 Q252.2853,402.541 252.8788,402.2712 Q253.4723,402.0015 254.1031,401.4204 Z " fill="black"/>
                    <text fill="black" font-family="sans-serif" font-size="14" x="265.63" y="403.291">sdfData</text>
                    <line x1="237.63" x2="319.63" y1="414" y2="414" stroke="black" stroke-width="0.5"/>
                    <line x1="237.63" x2="319.63" y1="422" y2="422" stroke="black" stroke-width="0.5"/>
                  </g>
                  <!--link sdfThing to sdfObject-->
    <g id="link_sdfThing_sdfObject">
                    <path d="M196.16,55.42 C207.75,75.52 224.51,104.54 236.94,126.08 " fill="none" id="sdfThing-to-sdfObject" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="239.41,130.35,238.3726,120.5559,236.9093,126.0203,231.445,124.557,239.41,130.35" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="222.63" y="98.5684">hasObject</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="216.4021" y="121.1091">0+</text>
                  </g>
                  <!--link sdfThing to sdfThing-->
    <g id="link_sdfThing_sdfThing">
                    <path d="M229.53,19.35 C248.35,18.69 264.13,22.58 264.13,31 C264.13,38.44 251.83,42.33 236,42.69 " fill="none" id="sdfThing-to-sdfThing" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="231.05,42.66,240.027,46.7114,236.0499,42.6886,240.0727,38.7115,231.05,42.66" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="270.13" y="36.0684">hasThing</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="237.0416" y="40.7969">0+</text>
                  </g>
                  <!--link sdfThing to sdfProperty-->
    <g id="link_sdfThing_sdfProperty">
                    <path d="M136,47.85 C99.23,63.1 50.46,90.1 27.63,132 C6,171.7 35.57,221.37 59.56,251.88 " fill="none" id="sdfThing-to-sdfProperty" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="62.41,255.43,59.8985,245.9068,59.2813,251.5298,53.6582,250.9127,62.41,255.43" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="28.63" y="161.0684">hasProperty</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="37.9817" y="246.443">0+</text>
                  </g>
                  <!--link sdfThing to sdfAction-->
    <g id="link_sdfThing_sdfAction">
                    <path d="M229.41,49.61 C250.34,58.6 274.73,70.67 294.63,85 C357.14,129.99 385.89,138.55 414.63,210 C419.75,222.7 419.78,237.77 418.22,250.67 " fill="none" id="sdfThing-to-sdfAction" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="417.55,255.31,422.7961,246.9746,418.2651,250.3614,414.8783,245.8304,417.55,255.31" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="400.63" y="161.0684">hasAction</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="398.4969" y="246.285">0+</text>
                  </g>
                  <!--link sdfThing to sdfEvent-->
    <g id="link_sdfThing_sdfEvent">
                    <path d="M164.06,55.38 C136.18,93.53 90.16,170.57 123.63,227 C129.23,236.43 149.15,248 169.5,257.92 " fill="none" id="sdfThing-to-sdfEvent" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="173.87,260.02,167.4833,252.5226,169.3613,257.8587,164.0252,259.7366,173.87,260.02" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="121.63" y="161.0684">hasEvent</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="149.5914" y="254.3466">0+</text>
                  </g>
                  <!--link sdfObject to sdfProperty-->
    <g id="link_sdfObject_sdfProperty">
                    <path d="M204.71,177.95 C186.9,186.64 167.11,197.61 150.63,210 C134.71,221.98 119.28,238.01 107.36,251.7 " fill="none" id="sdfObject-to-sdfProperty" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="104.12,255.48,113.0049,251.2306,107.3657,251.6767,106.9196,246.0374,104.12,255.48" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="151.63" y="223.5684">hasProperty</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="87.5644" y="246.0715">0+</text>
                  </g>
                  <!--link sdfObject to sdfAction-->
    <g id="link_sdfObject_sdfAction">
                    <path d="M283.72,180.42 C310.19,201.03 348.73,231.03 376.58,252.71 " fill="none" id="sdfObject-to-sdfAction" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="380.46,255.73,375.8181,247.0436,376.5155,252.6573,370.9019,253.3548,380.46,255.73" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="342.63" y="223.5684">hasAction</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="353.6739" y="246.1091">0+</text>
                  </g>
                  <!--link sdfObject to sdfEvent-->
    <g id="link_sdfObject_sdfEvent">
                    <path d="M247.35,180.42 C242,200.34 234.3,229.05 228.54,250.53 " fill="none" id="sdfObject-to-sdfEvent" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="227.29,255.2,233.4711,247.5323,228.5765,250.3684,225.7404,245.4738,227.29,255.2" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="239.63" y="223.5684">hasEvent</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="208.2004" y="246.1091">0+</text>
                  </g>
                  <!--link sdfAction to sdfData-->
    <g id="link_sdfAction_sdfData">
                    <path d="M380.17,305.36 C368.69,314.29 355.78,324.78 344.63,335 C330.27,348.17 315.29,363.87 303.24,377.07 " fill="none" id="sdfAction-to-sdfData" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="299.96,380.69,308.97,376.7126,303.3198,376.9871,303.0453,371.3369,299.96,380.69" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="345.63" y="348.5684">hasInputData</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="283.8382" y="371.2976">0+</text>
                  </g>
                  <!--link sdfAction to sdfData-->
    <g id="link_sdfAction_sdfData">
                    <path d="M429.32,305.37 C437.95,319.82 444.54,338.17 434.63,352 C410.38,385.85 363.27,398.34 327.13,402.82 " fill="none" id="sdfAction-to-sdfData-1" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="322.48,403.35,331.8779,406.2961,327.4473,402.779,330.9644,398.3484,322.48,403.35" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="439.63" y="348.5684">hasOutputData</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="328.522" y="399.6454">0+</text>
                  </g>
                  <!--link sdfEvent to sdfData-->
    <g id="link_sdfEvent_sdfData">
                    <path d="M209.17,305.42 C203.95,319.53 200.38,337.53 207.63,352 C213.04,362.77 221.78,371.92 231.32,379.42 " fill="none" id="sdfEvent-to-sdfData" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="235.15,382.28,230.3303,373.691,231.1431,379.2892,225.545,380.102,235.15,382.28" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="208.63" y="348.5684">hasOutputData</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="210.5093" y="376.1409">0+</text>
                  </g>
                  <!--link sdfProperty to sdfData-->
    <g id="link_sdfProperty_sdfData">
                    <path d="M89.02,305.4 C93.01,320.6 100.38,339.79 113.63,352 C145.64,381.48 194.15,394.57 230.3,400.38 " fill="none" id="sdfProperty-to-sdfData" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="234.94,401.08,226.6344,395.7868,229.9955,400.3369,225.4455,403.698,234.94,401.08" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="114.63" y="348.5684">isInstanceOf</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="220.5011" y="396.8099">1</text>
                  </g>
                  <!--SRC=[ZP7D2i8m48Jl-nIXLoderOCWwC5JFVW2CKrjHTBItGeYlhisc_u45knjTlYIcMKnBovbvMugJNSgMQyIXNcHNU_MaDggKYDhG8bZnsDUojIvhHlRqel1OPBPlQ6gTaoobhdZqxfGq4k0gVQoR06MmmLGJ0-lvzn1asRiv9gE-l4lcNKqe316BKB7NJszcSFLhm2ITiPc1O1vQCJfVc_upBomRcoENyTsM2GskN7i-HgzzGK0]-->
  </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[                  ,--------.           
                  |sdfThing|           
                  |--------|           
                  `--------'           
                                       
                                       
            ,---------.                
            |sdfObject|                
            |---------|                
            `---------'                
                                       
,-----------.  ,---------.   ,--------.
|sdfProperty|  |sdfAction|   |sdfEvent|
|-----------|  |---------|   |--------|
`-----------'  `---------'   `--------'
                    |                  
                                       
                ,-------.              
                |sdfData|              
                |-------|              
                `-------'              
]]></artwork>
          </artset>
        </figure>
        <t>The six main Class Name Keywords are discussed below.</t>
        <section anchor="sdfobject">
          <name>sdfObject</name>
          <t>sdfObjects, the items listed in an <tt>sdfObject</tt> definition group, are
the main "atom" of reusable semantics for model construction.
The concept aligns in scope with common definition items from many IoT modeling
systems, for example ZigBee Clusters <xref target="ZCL"/>, OMA SpecWorks LwM2M
Objects <xref target="OMA"/>, and
OCF Resource Types <xref target="OCF"/>.</t>
          <t>An sdfObject definition contains a set of <tt>sdfProperty</tt>, <tt>sdfAction</tt>, and
<tt>sdfEvent</tt> definitions that describe the interaction affordances
associated with some scope of functionality.</t>
          <t>For the granularity of definition, sdfObject definitions are meant
to be kept narrow enough in scope to enable broad reuse and
interoperability.
For example, defining a light bulb using separate sdfObject
definitions for on/off control, dimming, and color control affordances
will enable interoperable functionality to be configured for diverse
product types.
An sdfObject definition for a common on/off control may be used to
control may different kinds of Things that require on/off control.</t>
          <t>The presence of one or both of the optional qualities "<tt>minItems</tt>" and
"<tt>maxItems</tt>" defines the sdfObject as an array, i.e., all the
affordances defined for the sdfObject exist a number of times, indexed
by a number constrained to be between <tt>minItems</tt> and <tt>maxItems</tt>,
inclusive, if given.
(Note: Setting "<tt>minItems</tt>" to zero and leaving out "<tt>maxItems</tt>" puts the
minimum constraints on that array.)</t>
        </section>
        <section anchor="sdfproperty">
          <name>sdfProperty</name>
          <t><tt>sdfProperty</tt> is used to model elements of state within Things modeled
by the enclosing grouping.</t>
          <t>A named definition entry in an sdfProperty may be associated with some protocol
affordance to enable the application to obtain the state variable and,
optionally, modify the state variable.
Additionally, some protocols provide for in-time reporting of state
changes.
(These three aspects are described by the qualities <tt>readable</tt>,
<tt>writable</tt>, and <tt>observable</tt> defined for an sdfProperty.)</t>
          <t>Definitions in <tt>sdfProperty</tt> groups include the definitions from
<tt>sdfData</tt> groups, however, they actually also declare that a Property
with the given qualities potentially is present in the containing sdfObject.</t>
          <t>For definitions in <tt>sdfProperty</tt> and <tt>sdfData</tt>, SDF provides qualities that can
constrain the structure and values of data allowed in the interactions
modeled by them, as well as qualities that associate semantics to these
data, such as engineering units and unit scaling information.</t>
          <t>For the data definition within <tt>sdfProperty</tt> or <tt>sdfData</tt>, SDF borrows
some vocabulary proposed for the drafts 4 <xref target="JSO4"/> <xref target="JSO4V"/> and 7
<xref target="JSO7"/> <xref target="JSO7V"/> of the json-schema.org "JSON Schema" format
(collectively called JSO here), enhanced by qualities that are
specific to SDF.
Details about the JSO-inspired vocabulary are in <xref target="jso-inspired"/>.
For base SDF, data are constrained to be of
simple types (number, string, Boolean),
JSON maps composed of named data, and arrays of these types.
Syntax extension points are provided that can be used to provide
richer types in a future extension of this specification (possibly more
of which can be borrowed from json-schema.org).</t>
          <t>Note that sdfProperty definitions (and sdfData definitions in
general) are not intended to constrain the formats of data used for
communication over network interfaces.
Where needed, data definitions for payloads of protocol messages are
expected to be part of the protocol binding.</t>
        </section>
        <section anchor="sdfaction-overview">
          <name>sdfAction</name>
          <t>The <tt>sdfAction</tt> group contains declarations of Actions, model affordances that, when triggered,
have more effect than just reading, updating, or observing Thing
state, often resulting in some outward physical effect (which, itself,
cannot be modeled in SDF).  From a programmer's perspective, they
might be considered to be roughly analogous to method calls.</t>
          <t>Actions may have data parameters; these are modeled as a single item of input
data and output data, each.  (Where multiple parameters need to be
modeled, an <tt>"object"</tt> type can be used to combine these parameters into one.)
<!-- (using `sdfData` definitions, i.e., the same entries as for `sdfProperty` declarations). -->
Actions may be long-running, that is to say that the effects may not
take place immediately as would be expected for an update to an
sdfProperty; the effects may play out over time and emit action
results.
Actions may also not always complete and may result in application
errors, such as an item blocking the closing of an automatic door.</t>
          <t>One idiom for giving an action initiator status and control about the
ongoing action is to provide a URI for an ephemeral "action resource"
in the sdfAction output data, allowing the action to deliver
immediate feedback (including errors that prevent the action from
starting) and the action initiator to use the action resource
for further observation or modification of the ongoing action
(including canceling it).
Base SDF does not provide any tailored support for describing such
action resources; an extension for modeling links in more detail
(for instance, <xref target="I-D.bormann-asdf-sdftype-link"/>) may be all that is needed to fully enable modeling
them.</t>
          <t>Actions may have (or lack) qualities of idempotence and side-effect safety.</t>
          <t>Base SDF only provides data constraint modeling and semantics for the input and output data of definitions in <tt>sdfAction</tt> groups.
Again, data definitions for payloads of protocol messages, and
detailed protocol settings for invoking the action, are expected to be
part of the protocol binding.</t>
        </section>
        <section anchor="sdfevent-overview">
          <name>sdfEvent</name>
          <t>The <tt>sdfEvent</tt> group contains declarations of Events, which can model
affordances that inform about "happenings" associated with a Thing
modeled by the enclosing sdfObject; these may result in a signal being
stored or emitted as a result.</t>
          <t>Note that there is a trivial overlap with sdfProperty state changes,
which may also be defined as events but are not generally required to
be defined as such.
However, Events may exhibit certain ordering, consistency, and
reliability requirements that are expected to be supported in various
implementations of sdfEvent that do distinguish sdfEvent from
sdfProperty.
For instance, while a state change may simply be superseded by another
state change, some events are "precious" and need to be preserved even
if further events follow.</t>
          <t>Base SDF only provides data constraint modeling and
semantics for the output data of Event affordances.
Again, data definitions for payloads of protocol messages, and
detailed protocol settings for invoking the action, are expected to be
part of the protocol binding.</t>
        </section>
        <section anchor="sdfdata">
          <name>sdfData</name>
          <t>Definitions in <tt>sdfData</tt> groups do not themselves specify affordances.
These definitions
are provided separately from those in
sdfProperty groups to enable common
modeling patterns, data constraints, and semantic anchor concepts to
be factored out for data items that make up sdfProperty items and
serve as input and output data for sdfAction and sdfEvent items.
The sdfData definitions only spring to life by being referenced in
one of these contexts (directly or indirectly via some other sdfData
definitions).</t>
          <t>It is a common use case for such a data definition to be shared
between an sdfProperty item and input or output parameters of an
sdfAction or output data provided by an sdfEvent.
sdfData definitions also enable factoring out extended application
data types such as mode and machine state enumerations to be reused
across multiple definitions that have similar basic characteristics
and requirements.</t>
        </section>
        <section anchor="sdfthing">
          <name>sdfThing</name>
          <t>Back at the top level, the <tt>sdfThing</tt> group enables definition of models for
complex devices that will use one or more sdfObject definitions.
Like sdfObject, sdfThing groups also allow for including interaction
affordances, sdfData, as well as "<tt>minItems</tt>" and "<tt>maxItems</tt>" qualities.
Therefore, they can be seen as a superset of sdfObject groups, additionally
allowing for composition.</t>
          <t>As a result, an sdfThing directly or indirectly contains a set of sdfProperty, sdfAction, and
sdfEvent definitions that describe the interaction affordances
associated with some scope of functionality.</t>
          <t>A definition in an sdfThing group can refine the metadata of the definitions it
is composed of: other definitions in sdfThing groups or definitions in sdfObject groups.</t>
        </section>
      </section>
      <section anchor="member-names-given-names-and-quality-names">
        <name>Member names: Given Names and Quality Names</name>
        <t>SDF documents are JSON maps that mostly employ JSON maps as
member values, which in turn mostly employ JSON maps as their
member values, and so on.
This nested structure of JSON maps creates a tree, where the edges
are the member names (map keys) used in these JSON maps.
(In certain cases, where member names are not needed, JSON arrays may
be interspersed in this tree.)</t>
        <section anchor="given-names-and-quality-names">
          <name>Given Names and Quality Names</name>
          <t>For any particular JSON map in an SDF document, the set of member
names that are used is either of:</t>
          <ul spacing="normal">
            <li>
              <t>A set of "<em>Quality Names</em>", where the entries in the map are
Qualities.  Quality Names are defined by the present specification
and its extensions, together with specific semantics to be
associated with the member value given with a certain Quality Name.</t>
            </li>
            <li>
              <t>A set of "<em>Given Names</em>", where the entries in the map are separate
entities (definitions, declarations, etc.) that each have names that
are chosen by the SDF document author in order that these names can be
employed by a user of that model.</t>
            </li>
          </ul>
          <t>In a path from the root of the tree to any leaf, Quality Names and
Given Names roughly alternate (with the information block,
<xref target="information-block"/>, as a prominent exception).</t>
          <t>The meaning of the JSON map that is the member value associated
with a Given Name is derived from the Quality Name that was used as
the member name associated to the parent.
In the CDDL grammar given in <xref target="syntax"/>, JSON maps with member names that are
Given Names are defined using the CDDL generic rule reference <tt>named&lt;membervalues&gt;</tt>,
where <tt>membervalues</tt> is in turn the structure of the member values of the
JSON map, i.e., the value of the member named by the Given Name.
As quality-named maps and given-named maps roughly alternate in
a path down the tree, <tt>membervalues</tt> is usually a map built from
Quality Names as keys.</t>
        </section>
        <section anchor="hierarchical-names">
          <name>Hierarchical Names</name>
          <t>From the outside of a specification, Given Names are usually used as
part of a hierarchical name that looks like a JSON pointer <xref target="RFC6901"/>,
itself generally rooted in (used as the fragment identifier in) an
outer namespace that looks like an <tt>https://</tt> URL (see <xref target="names-and-namespaces"/>).</t>
          <t>As Quality Names and Given Names roughly alternate in a path into the
model, the JSON pointer part of the hierarchical name also alternates
between Quality Names and Given Names.</t>
          <t>Note that the actual Given Names may need to be encoded when specified
via the JSON pointer fragment identifier syntax, and that there are
two layers of such encoding: tilde encoding of <tt>~</tt> and <tt>/</tt> as per
<xref section="3" sectionFormat="of" target="RFC6901"/>, and then percent encoding of the
tilde-encoded name into a valid URI fragment as per <xref section="6" sectionFormat="of" target="RFC6901"/>.
For example, when a model is using the Given Name</t>
          <artwork><![CDATA[
   warning/danger alarm
]]></artwork>
          <t>(with an embedded slash and a space) for an
sdfObject, that sdfObject may need to be referenced as</t>
          <artwork><![CDATA[
   #/sdfObject/warning~1danger%20alarm
]]></artwork>
          <t>To sidestep potential interoperability problems, it is probably wise
to avoid characters in Given Names that need such encoding (Quality
Names are already defined in such a way that they never do).</t>
        </section>
        <section anchor="gnqn">
          <name>Extensibility of Given Names and Quality Names</name>
          <t>In SDF, both Quality Names and Given Names are <em>extension points</em>.
This is more obvious for Quality Names: Extending SDF is mostly done
by defining additional qualities.  To enable non-conflicting third
party extensions to SDF, qualified names (names with an embedded
colon) can be used as Quality Names.</t>
          <t>A nonqualified Quality Name is composed of ASCII letters, digits, and
<tt>$</tt> signs, starting with a lower case letter or a <tt>$</tt> sign (i.e.,
using a pattern of "⁠<tt>[a-z$][A-Za-z$0-9]*</tt>").
Names with <tt>$</tt> signs are intended to be used for functions separate
from most other names; for instance, in this specification <tt>$comment</tt>
is used for the comment quality (the presence or absence of a
<tt>$comment</tt> quality does not change the meaning of the SDF model).
Names that are composed of multiple English words can use the
"lowerCamelCase" convention <xref target="CamelCase"/> for indicating the word
boundaries; no other use is intended for upper case letters in quality
names.</t>
          <t>A qualified Quality Name is composed of a Quality Name Prefix, a <tt>:</tt>
(colon) character, and a nonqualified Quality Name.
Quality Name Prefixes are registered in the "Quality Name Prefixes"
sub-registry in the "SDF Parameters" registry (<xref target="qnp"/>); they are
composed of lower case ASCII letters and digits, starting with a lower
case ASCII letter (i.e., using a pattern of "⁠<tt>[a-z][a-z0-9]*</tt>").</t>
          <t>Given Names are not restricted by the formal SDF syntax.
To enable non-surprising name translations in tools, combinations of
ASCII alphanumeric characters and <tt>-</tt> (ASCII hyphen/minus) are preferred,
typically employing kebab-case for names constructed out of multiple
words <xref target="KebabCase"/>.  ASCII hyphen/minus can then unambiguously be
translated to an ASCII <tt>_</tt> underscore character and back depending on
the programming environment.
Some styles also allow a dot <tt>.</tt> in given names.
Given Names are often sufficiently self-explanatory that they can be
used in place of the <tt>label</tt> quality if that is not given.
In turn, if a given name turns out too complicated, a more elaborate
<tt>label</tt> can be given and the given name kept simple.
Base SDF does not address internationalization of
given names.</t>
          <t>Further, to enable Given Names to have a more powerful role in building
global hierarchical names, an extension is planned that makes use of
qualified names for Given Names.
So, until that extension is defined, Given Names with (one or more)
embedded colons are reserved and <bcp14>MUST NOT</bcp14> be used in an SDF document.</t>
          <t>All names in SDF are case-sensitive.</t>
        </section>
      </section>
    </section>
    <section anchor="sdf-structure">
      <name>SDF structure</name>
      <t>SDF definitions are contained in SDF documents, together with data
about the SDF document itself (information block).
Definitions and declarations from additional SDF documents can be
referenced; together with the definitions and declarations in the
referencing SDF document they build the SDF model expressed by that
SDF document.</t>
      <t>Each SDF document is represented as a single JSON map.
This map has three blocks: the information block, the namespaces block, and the definitions block.</t>
      <section anchor="information-block">
        <name>Information block</name>
        <t>The information block contains generic metadata for the SDF document
itself and all included definitions.
To enable tool integration, the information block is optional in the grammar
of SDF; most processes for working with SDF documents will have policies
that only SDF documents with an info block can be processed.
It is therefore <bcp14>RECOMMENDED</bcp14> that SDF validator tools emit a warning
when no information block is found.</t>
        <t>The keyword (map key) that defines an information block is "info". Its
value is a JSON map in turn, with a set of entries that represent qualities that apply to the included definition.</t>
        <t>Qualities of the information block are shown in <xref target="infoblockqual"/>.</t>
        <table anchor="infoblockqual">
          <name>Qualities of the Information Block</name>
          <thead>
            <tr>
              <th align="left">Quality</th>
              <th align="left">Type</th>
              <th align="left">Required</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">title</td>
              <td align="left">string</td>
              <td align="left">no</td>
              <td align="left">A short summary to be displayed in search results, etc.</td>
            </tr>
            <tr>
              <td align="left">description</td>
              <td align="left">string</td>
              <td align="left">no</td>
              <td align="left">Long-form text description (no constraints)</td>
            </tr>
            <tr>
              <td align="left">version</td>
              <td align="left">string</td>
              <td align="left">no</td>
              <td align="left">The incremental version of the definition</td>
            </tr>
            <tr>
              <td align="left">modified</td>
              <td align="left">string</td>
              <td align="left">no</td>
              <td align="left">Time of the latest modification</td>
            </tr>
            <tr>
              <td align="left">copyright</td>
              <td align="left">string</td>
              <td align="left">no</td>
              <td align="left">Link to text or embedded text containing a copyright notice</td>
            </tr>
            <tr>
              <td align="left">license</td>
              <td align="left">string</td>
              <td align="left">no</td>
              <td align="left">Link to text or embedded text containing license terms</td>
            </tr>
            <tr>
              <td align="left">features</td>
              <td align="left">array of strings</td>
              <td align="left">no</td>
              <td align="left">List of extension features used</td>
            </tr>
            <tr>
              <td align="left">$comment</td>
              <td align="left">string</td>
              <td align="left">no</td>
              <td align="left">Source code comments only, no semantics</td>
            </tr>
          </tbody>
        </table>
        <t>The version quality is used to indicate version information about the
set of definitions in the SDF document.
The version is <bcp14>RECOMMENDED</bcp14> to be lexicographically increasing over the life of a model: a newer model always has a version string that string-compares higher than all previous versions.
This is easily achieved by following the convention to start the version with an <xref target="RFC3339"/> <tt>date-time</tt> or, if new versions are generated less frequently than once a day, just the <tt>full-date</tt> (i.e., YYYY-MM-DD); in many cases, that will be all that is needed (see <xref target="example1"/> for an example).
This specification does not give a strict definition for the format of the version string but each using system or organization should define internal structure and semantics to the level needed for their use.
If no further details are provided, a <tt>date-time</tt> or <tt>full-date</tt> in
this field can be assumed to indicate the latest update time of the
definitions in the SDF document.</t>
        <t>The modified quality can be used with a value using <xref target="RFC3339"/> <tt>date-time</tt> (with <tt>Z</tt> for time-zone) or <tt>full-date</tt> format to express time of the latest revision of the definitions.</t>
        <t>The license string is preferably either a URI that points to a web page with an unambiguous definition of the license, or an <xref target="SPDX"/> license identifier.
(As an example, for models to be handled by the One Data Model liaison
group, this license identifier will typically be "BSD-3-Clause".)</t>
        <t>The <tt>features</tt> quality can be used to list names of critical (i.e., cannot be safely ignored) SDF extension features that need to be understood for the definitions to be properly processed.
Extension feature names will be specified in extension documents.</t>
      </section>
      <section anchor="namespaces-block">
        <name>Namespaces block</name>
        <t>The namespaces block contains the <tt>namespace</tt> map and the <tt>defaultNamespace</tt> setting.</t>
        <t>The namespace map is a map from short names for URIs to the namespace URIs
themselves.</t>
        <t>The defaultNamespace setting selects one of the entries in the
namespace map by giving its short name.  The associated URI (value of
this entry) becomes the default namespace for the SDF document.</t>
        <table anchor="nssec">
          <name>Namespaces Block</name>
          <thead>
            <tr>
              <th align="left">Quality</th>
              <th align="left">Type</th>
              <th align="left">Required</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">namespace</td>
              <td align="left">map</td>
              <td align="left">no</td>
              <td align="left">Defines short names mapped to namespace URIs, to be used as identifier prefixes</td>
            </tr>
            <tr>
              <td align="left">defaultNamespace</td>
              <td align="left">string</td>
              <td align="left">no</td>
              <td align="left">Identifies one of the prefixes in the namespace map to be used as a default in resolving identifiers</td>
            </tr>
          </tbody>
        </table>
        <t>The following example declares a set of namespaces and defines <tt>cap</tt>
as the default namespace.
By convention, the values in the namespace map contain full URIs
without a fragment identifier, and the fragment identifier is then
added, if needed, where the namespace entry is used.</t>
        <sourcecode type="json"><![CDATA[
"namespace": {
  "cap": "https://example.com/capability/cap",
  "zcl": "https://zcl.example.com/sdf"
},
"defaultNamespace": "cap"
]]></sourcecode>
        <t>If no defaultNamespace setting is given, the SDF document does not
contribute to a global namespace (all definitions remain local to the
model and are not accessible for re-use by other models).
As the defaultNamespace is set by giving a
namespace short name, its presence requires a namespace map that contains a
mapping for that namespace short name.</t>
        <t>If no namespace map is given, no short names for namespace URIs are
set up, and no defaultNamespace can be given.</t>
      </section>
      <section anchor="definitions-block">
        <name>Definitions block</name>
        <t>The Definitions block contains one or more groups, each identified by a Class Name Keyword (there can only be one group per keyword; the actual grouping is just a shortcut and does not carry any specific semantics).
The value of each group is a JSON map, the keys of which serve for naming the individual definitions in this group, and the corresponding values provide a set of qualities (name-value pairs) for the individual definition.
(In short, we speak of the map entries as "named sets of qualities".)</t>
        <t>Each group may contain zero or more definitions.
Each identifier defined creates a new type and term in the target namespace.
Declarations have a scope of the definition block they are
directly contained in.</t>
        <t>A definition may in turn contain other definitions. Each definition is a named set of qualities, i.e., it consists of the newly defined identifier and a set of key-value pairs that represent the defined qualities and contained definitions.</t>
        <t>An example for an sdfObject definition is given in <xref target="exobject"/>:</t>
        <figure anchor="exobject">
          <name>Example sdfObject definition</name>
          <sourcecode type="json"><![CDATA[
"sdfObject": {
  "foo": {
    "sdfProperty": {
      "bar": {
        "type": "boolean"
      }
    }
  }
}
]]></sourcecode>
        </figure>
        <t>This example defines an sdfObject "foo" that is defined in the default namespace (full address: <tt>#/sdfObject/foo</tt>), containing a property that can be addressed as
<tt>#/sdfObject/foo/sdfProperty/bar</tt>, with data of type boolean.
<!-- we could define a URN-style namespace that looks exactly that way -->
        </t>
        <t>Often, definitions are also declarations: the definition of the
entry "bar" in the property "foo" means that data corresponding to the
"foo" property in a property interaction offered by Thing can have zero or
one components modeled by "bar".  Entries within <tt>sdfProperty</tt>,
<tt>sdfAction</tt>, and <tt>sdfEvent</tt>, in turn within <tt>sdfObject</tt> or <tt>sdfThing</tt> entries, are
declarations; entries within <tt>sdfData</tt> are not.
Similarly, <tt>sdfObject</tt> or <tt>sdfThing</tt> entries within an sdfThing
definition specify that the
interactions offered by a Thing modeled by this sdfThing include the
interactions modeled by the nested <tt>sdfObject</tt> or <tt>sdfThing</tt>.</t>
      </section>
      <section anchor="top-level-affordances-and-sdfdata">
        <name>Top-level Affordances and sdfData</name>
        <t>Besides their placement within an sdfObject or sdfThing, affordances
(i.e., <tt>sdfProperty</tt>, <tt>sdfAction</tt>, and <tt>sdfEvent</tt>) as well as <tt>sdfData</tt> can
also be placed at the top level of an SDF document.
Since they are not associated with an sdfObject or sdfThing, these kinds of
definitions are intended to be re-used via the <tt>sdfRef</tt> mechanism
(see <xref target="sdfref"/>).</t>
      </section>
    </section>
    <section anchor="names-and-namespaces">
      <name>Names and namespaces</name>
      <t>SDF documents may contribute to a global namespace, and may
reference elements from that global namespace.
(An SDF document that does not set a defaultNamespace does not
contribute to a global namespace.)</t>
      <section anchor="structure">
        <name>Structure</name>
        <t>Global names look exactly like <tt>https://</tt> URIs with attached fragment identifiers.</t>
        <t>There is no intention to require that these URIs can be dereferenced.
<!-- Looking things up there is a convenience -->
(However, as future extensions of SDF might find a use for dereferencing
global names, the URI should be chosen in such a way that this may
become possible in the future.
See also <xref target="I-D.bormann-t2trg-deref-id"/> for a discussion of dereferenceable identifiers.)</t>
        <t>The absolute URI of a global name should be a URI as per <xref section="3" sectionFormat="of" target="RFC3986"/>, with a scheme of "https" and a path (<tt>hier-part</tt> in <xref target="RFC3986"/>).
For base SDF, the query part should
not be used (it might be used in extensions).</t>
        <t>The fragment identifier is constructed as per <xref section="6" sectionFormat="of" target="RFC6901"/>.</t>
      </section>
      <section anchor="contributing-global-names">
        <name>Contributing global names</name>
        <t>The fragment identifier part of a global name defined in an SDF
document is constructed from a JSON pointer that selects the
element defined for this name in the SDF document.</t>
        <t>The absolute URI part is a copy of the default namespace, i.e., the
default namespace is always the target namespace for a name for which
a definition is contributed.
When emphasizing that name definitions are contributed to the default namespace,
we therefore also call it the "target namespace" of the SDF document.</t>
        <t>For instance, in <xref target="example1"/>, definitions for the following global names are contributed:</t>
        <ul spacing="normal">
          <li>
            <t>https://example.com/capability/cap#/sdfObject/Switch</t>
          </li>
          <li>
            <t>https://example.com/capability/cap#/sdfObject/Switch/sdfProperty/value</t>
          </li>
          <li>
            <t>https://example.com/capability/cap#/sdfObject/Switch/sdfAction/on</t>
          </li>
          <li>
            <t>https://example.com/capability/cap#/sdfObject/Switch/sdfAction/off</t>
          </li>
        </ul>
        <t>Note the <tt>#</tt>, which separates the absolute-URI part (<xref section="4.3" sectionFormat="of" target="RFC3986"/>) from the fragment identifier part.</t>
      </section>
      <section anchor="referencing-global-names">
        <name>Referencing global names</name>
        <t>A name reference takes the form of the production <tt>curie</tt> in
<xref target="W3C.NOTE-curie-20101216"/> (note that this excludes the production <tt>safe-curie</tt>),
but also limiting the IRIs involved in that production to URIs as per <xref target="RFC3986"/>
and the prefixes to ASCII characters <xref target="RFC0020"/>.</t>
        <t>A name that is contributed by the current SDF document can be
referenced by a Same-Document Reference as per <xref section="4.4" sectionFormat="of" target="RFC3986"/>.
As there is little point in referencing the entire SDF document, this will be a <tt>#</tt> followed by a JSON pointer.
This is the only kind of name reference to itself that is possible in an SDF
document that does not set a default namespace.</t>
        <t>Name references that point outside the current SDF document
need to contain curie prefixes.  These then reference namespace
declarations in the namespaces block.</t>
        <t>For example, if a namespace prefix is defined:</t>
        <sourcecode type="json"><![CDATA[
"namespace": {
  "foo": "https://example.com/"
}
]]></sourcecode>
        <t>Then this reference to that namespace:</t>
        <sourcecode type="json"><![CDATA[
"sdfRef": "foo:#/sdfData/temperatureData"
]]></sourcecode>
        <t>references the global name:</t>
        <sourcecode type="json"><![CDATA[
"https://example.com/#/sdfData/temperatureData"
]]></sourcecode>
        <t>Note that there is no way to provide a URI scheme name in a curie, so
all references to outside of the document need to go through the
namespace map.</t>
        <t>Name references occur only in specific elements of the syntax of SDF:</t>
        <ul spacing="normal">
          <li>
            <t>copying elements via sdfRef values</t>
          </li>
          <li>
            <t>pointing to elements via sdfRequired value elements</t>
          </li>
        </ul>
      </section>
      <section anchor="sdfref">
        <name>sdfRef</name>
        <t>In a JSON map establishing a definition, the keyword <tt>sdfRef</tt> is used
to copy all of the qualities and enclosed definitions of the referenced definition, indicated
by the included name reference, into the newly formed definition.
(This can be compared to the processing of the <tt>$ref</tt> keyword in <xref target="JSO7"/>.)</t>
        <t>For example, this reference:</t>
        <sourcecode type="json"><![CDATA[
"temperatureProperty": {
  "sdfRef": "#/sdfData/temperatureData"
}
]]></sourcecode>
        <t>creates a new definition "temperatureProperty" that contains all of the qualities defined in the definition at /sdfData/temperatureData.</t>
        <t>The sdfRef member need not be the only member of a map.
Additional members may be present with the intention to override parts
of the referenced map or to add new qualities or definitions.</t>
        <t>When processing sdfRef, if the target definition contains also sdfRef (i.e., is based on yet another definition), that <bcp14>MUST</bcp14> be processed as well.</t>
        <t>More formally, for a JSON map that contains an
sdfRef member, the semantics is defined to be as if the following steps were performed:</t>
        <ol spacing="normal" type="1"><li>
            <t>The JSON map that contains the sdfRef member is copied into a
variable named "patch".</t>
          </li>
          <li>
            <t>The sdfRef member of the copy in "patch" is removed.</t>
          </li>
          <li>
            <t>the JSON pointer that is the value of the sdfRef member is
dereferenced and the result is copied into a variable named "original".</t>
          </li>
          <li>
            <t>The JSON Merge Patch algorithm <xref target="RFC7396"/> is applied to patch
the contents of "original" with the contents of "patch".</t>
          </li>
          <li>
            <t>The result of the Merge Patch is used in place of the value of the
original JSON map.</t>
          </li>
        </ol>
        <t>Note that the formal syntaxes given in Appendices <xref format="counter" target="syntax"/> and <xref format="counter" target="jso"/>
generally describe the <em>result</em> of applying a merge-patch; the notations
are not powerful enough to describe, for instance, the effect of null
values given with the sdfRef to remove members of JSON maps from
the referenced target.  Nonetheless, the syntaxes also give the syntax
of the sdfRef itself, which vanishes during the resolution; in many
cases therefore even merge-patch inputs will validate with these
formal syntaxes.</t>
        <t>Given the example (<xref target="example1"/>), and the following definition:</t>
        <sourcecode type="json"><![CDATA[
{
  "info": {
    "title": "Example light switch using sdfRef"
  },
  "namespace": {
    "cap": "https://example.com/capability/cap"
  },
  "defaultNamespace": "cap",
  "sdfObject": {
    "BasicSwitch": {
      "sdfRef": "cap:#/sdfObject/Switch",
      "sdfAction": {
        "toggle": null
      }
    }
  }
}
]]></sourcecode>
        <t>The resulting definition of the "BasicSwitch" sdfObject would be identical to the definition of the "Switch" sdfObject except it would not contain the "toggle" Action.</t>
        <sourcecode type="json" name="example1-without-toggle.sdf.json"><![CDATA[
{
  "info": {
    "title": "Example light switch using sdfRef"
  },
  "namespace": {
    "cap": "https://example.com/capability/cap"
  },
  "defaultNamespace": "cap",
  "sdfObject": {
    "BasicSwitch": {
      "sdfProperty": {
        "value": {
          "description":
"The state of the switch; false for off and true for on.",
          "type": "boolean"
        }
      },
      "sdfAction": {
        "on": {
          "description":
"Turn the switch on; equivalent to setting value to true."
        },
        "off": {
          "description":
"Turn the switch off; equivalent to setting value to false."
        }
      }
    }
  }
}
]]></sourcecode>
        <section anchor="resolved-models">
          <name>Resolved models</name>
          <t>A model where all sdfRef references are processed as described in <xref target="sdfref"/> is called a resolved model.</t>
          <t>For example, given the following sdfData definitions:</t>
          <sourcecode type="json"><![CDATA[
"sdfData": {
  "Coordinate" : {
    "type": "number", "unit": "m"
  },
  "X-Coordinate" : {
    "sdfRef" : "#/sdfData/Coordinate",
    "description":
"Distance from the base of the Thing along the X axis."
  },
  "Non-neg-X-Coordinate" : {
    "sdfRef": "#/sdfData/X-Coordinate",
    "minimum": 0
  }
}
]]></sourcecode>
          <t>After resolving the definitions would look as follows:</t>
          <sourcecode type="json"><![CDATA[
"sdfData": {
  "Coordinate" : {
    "type": "number", "unit": "m"
  },
  "X-Coordinate" : {
    "description":
"Distance from the base of the Thing along the X axis.",
    "type": "number", "unit": "m"
  },
  "Non-neg-X-Coordinate" : {
    "description":
"Distance from the base of the Thing along the X axis.",
    "minimum": 0, "type": "number", "unit": "m"
  }
}
]]></sourcecode>
        </section>
      </section>
      <section anchor="sdfrequired">
        <name>sdfRequired</name>
        <t>The keyword <tt>sdfRequired</tt> is provided to apply a constraint that
defines for which declarations the corresponding data are mandatory in a
Thing modeled by the current definition.</t>
        <t>The value of <tt>sdfRequired</tt> is an array of references, each indicating
one or more declarations that are mandatory to be represented.</t>
        <t>References in this array can be SDF names (JSON Pointers), or one of
two abbreviated reference formats:</t>
        <ul spacing="normal">
          <li>
            <t>a text string with a "referenceable-name", i.e., an affordance name or grouping name.
All affordance declarations that are directly (i.e., not nested further in another grouping) in the same grouping and that
carry this name (there can be multiple ones, one per affordance type)
are declared to be mandatory to be represented. The same applies for
groupings made mandatory within groupings containing them.</t>
          </li>
          <li>
            <t>the Boolean value <tt>true</tt>.
The affordance/grouping itself that carries the <tt>sdfRequired</tt> keyword is declared
to be mandatory to be represented.</t>
          </li>
        </ul>
        <t>Note that referenceable-names are not
subject to the encoding JSON pointers require as discussed in <xref target="hierarchical-names"/>.
To ensure that referenceable-names are reliably distinguished from JSON pointers,
they are defined such that they cannot contain ":" or
"#" characters (see rule <tt>referenceable-name</tt> in <xref target="syntax"/>).
(If these characters are indeed contained in a Given Name, a JSON
pointer needs to be formed instead in order to reference it in "sdfRequired",
potentially requiring further path elements as well as JSON pointer
encoding.  The need for this is best avoided by choosing Given Names
without these characters.)</t>
        <t>The example in <xref target="example-req"/> shows two required elements in the sdfObject definition for "temperatureWithAlarm", the sdfProperty "currentTemperature", and the sdfEvent "overTemperatureEvent". The example also shows the use of JSON pointer with "sdfRef" to use a pre-existing definition in this definition, for the "alarmType" data (sdfOutputData) produced by the sdfEvent "overTemperatureEvent".</t>
        <figure anchor="example-req">
          <name>Using sdfRequired</name>
          <sourcecode type="json"><![CDATA[
"sdfObject": {
  "temperatureWithAlarm": {
    "sdfRequired": [
"#/sdfObject/temperatureWithAlarm/sdfProperty/currentTemperature",
"#/sdfObject/temperatureWithAlarm/sdfEvent/overTemperatureEvent"
    ],
    "sdfData":{
       "temperatureData": {
        "type": "number"
      }
    },
    "sdfProperty": {
      "currentTemperature": {
"sdfRef": "#/sdfObject/temperatureWithAlarm/sdfData/temperatureData"
      }
    },
    "sdfEvent": {
      "overTemperatureEvent": {
       "sdfOutputData": {
          "type": "object",
          "properties": {
            "alarmType": {
              "sdfRef": "cap:#/sdfData/alarmTypes/quantityAlarms",
              "const": "OverTemperatureAlarm"
            },
            "temperature": {
"sdfRef": "#/sdfObject/temperatureWithAlarm/sdfData/temperatureData"
            }
          }
        }
      }
    }
  }
}
]]></sourcecode>
        </figure>
        <t>In <xref target="example-req"/>, the same sdfRequired can also be represented in
short form:</t>
        <sourcecode type="json"><![CDATA[
    "sdfRequired": ["currentTemperature", "overTemperatureEvent"]
]]></sourcecode>
        <t>Or, for instance "overTemperatureEvent" could carry</t>
        <sourcecode type="json"><![CDATA[
      "overTemperatureEvent": {
        "sdfRequired": [true],
        "...": "..."
      }
]]></sourcecode>
      </section>
      <section anchor="common-qualities">
        <name>Common Qualities</name>
        <t>Definitions in SDF share a number of qualities that provide metadata for
them.  These are listed in <xref target="tbl-common-qualities"/>.  None of these
qualities are required or have default values that are assumed if the
quality is absent.
If a label is required for an application and no label is given in the SDF model, the
last part (<tt>reference-token</tt>, <xref section="3" sectionFormat="of" target="RFC6901"/>) of the JSON
pointer to the definition can be used.</t>
        <table anchor="tbl-common-qualities">
          <name>Common Qualities</name>
          <thead>
            <tr>
              <th align="left">Quality</th>
              <th align="left">Type</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">description</td>
              <td align="left">string</td>
              <td align="left">long text (no constraints)</td>
            </tr>
            <tr>
              <td align="left">label</td>
              <td align="left">string</td>
              <td align="left">short text (no constraints)</td>
            </tr>
            <tr>
              <td align="left">$comment</td>
              <td align="left">string</td>
              <td align="left">source code comments only, no semantics</td>
            </tr>
            <tr>
              <td align="left">sdfRef</td>
              <td align="left">sdf-pointer</td>
              <td align="left">(see <xref target="sdfref"/>)</td>
            </tr>
            <tr>
              <td align="left">sdfRequired</td>
              <td align="left">pointer-list</td>
              <td align="left">(see <xref target="sdfrequired"/>, used in affordances or groupings)</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="data-qualities">
        <name>Data Qualities</name>
        <t>Data qualities are used in sdfData and sdfProperty definitions,
which are named sets of data qualities (abbreviated as <tt>named-sdq</tt>).</t>
        <t><xref target="jso-inspired"/> lists data qualities inspired by the various
proposals at json-schema.org; the
intention is that these (information model level) qualities are
compatible with the (data model) semantics from the
versions of the json-schema.org proposal they were imported from.</t>
        <t><xref target="sdfdataqual2"/> lists data qualities defined specifically for the
present specification.</t>
        <table anchor="sdfdataqual2">
          <name>SDF-defined Qualities of sdfData</name>
          <thead>
            <tr>
              <th align="left">Quality</th>
              <th align="left">Type</th>
              <th align="left">Description</th>
              <th align="left">Default</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">(common)</td>
              <td align="left"> </td>
              <td align="left">
                <xref target="common-qualities"/></td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">unit</td>
              <td align="left">string</td>
              <td align="left">unit name (note 1)</td>
              <td align="left">N/A</td>
            </tr>
            <tr>
              <td align="left">nullable</td>
              <td align="left">boolean</td>
              <td align="left">indicates a null value is available for this type</td>
              <td align="left">true</td>
            </tr>
            <tr>
              <td align="left">contentFormat</td>
              <td align="left">string</td>
              <td align="left">content type (IANA media type string plus parameters), encoding (note 2)</td>
              <td align="left">N/A</td>
            </tr>
            <tr>
              <td align="left">sdfType</td>
              <td align="left">string (<xref target="sdftype"/>)</td>
              <td align="left">sdfType enumeration (extensible)</td>
              <td align="left">N/A</td>
            </tr>
            <tr>
              <td align="left">sdfChoice</td>
              <td align="left">named set of data qualities (<xref target="sdfchoice"/>)</td>
              <td align="left">named alternatives</td>
              <td align="left">N/A</td>
            </tr>
            <tr>
              <td align="left">enum</td>
              <td align="left">array of strings</td>
              <td align="left">abbreviation for string-valued named alternatives</td>
              <td align="left">N/A</td>
            </tr>
          </tbody>
        </table>
        <ol spacing="normal" type="1"><li>
            <t>Note that the quality <tt>unit</tt> was called <tt>units</tt> in earlier drafts
of SDF.
The unit name <bcp14>SHOULD</bcp14> be as
per the <xref section="SenML Units" relative="#senml-units" sectionFormat="bare" target="RFC8428"/> Registry
or the <xref section="Secondary Units" relative="#secondary-units" sectionFormat="bare" target="RFC8798"/> Registry in <xref target="IANA.senml"/>
as specified by
Sections <xref target="RFC8428" section="4.5.1" sectionFormat="bare"/> and <xref target="RFC8428" section="12.1" sectionFormat="bare"/> of <xref target="RFC8428"/> and <xref section="3" sectionFormat="of" target="RFC8798"/>, respectively.  </t>
            <t>
Exceptionally, if a registration in these registries cannot be
obtained or would be inappropriate, the unit name can also be a URI
that is pointing to a definition of the unit.  Note that SDF
processors are not expected to (and normally <bcp14>SHOULD NOT</bcp14>)
dereference these URIs (see also <xref target="I-D.bormann-t2trg-deref-id"/>); they may be useful to
humans, though.
A URI unit name is distinguished from a registered unit name by the
presence of a colon; any registered unit names that contain a colon (at
the time of writing, none) can therefore not be used in SDF.  </t>
            <t>
For use by translators into ecosystems that require URIs for unit
names, the URN sub-namespace "urn:ietf:params:unit" is provided
(<xref target="unit-urn"/>); URNs from this sub-namespace <bcp14>MUST NOT</bcp14> be used in a
<tt>unit</tt> quality, in favor of simply notating the unit name (such as
<tt>kg</tt> instead of <tt>urn:ietf:params:unit:kg</tt>).</t>
          </li>
          <li>
            <t>The <tt>contentFormat</tt> quality follows the Content-Format-Spec as defined in
<xref section="6" sectionFormat="of" target="RFC9193"/>, allowing for expressing both numeric and string
based Content-Formats.</t>
          </li>
        </ol>
        <section anchor="sdftype">
          <name>sdfType</name>
          <t>SDF defines a number of basic types beyond those provided by JSON or
JSO.  These types are identified by the <tt>sdfType</tt> quality, which
is a text string from a set of type names defined by the  "sdfType
values" sub-registry in the "SDF Parameters" registry
(<xref target="sdftype-values"/>).
The sdfType name is composed of lower case ASCII letters, digits,
and <tt>-</tt> (ASCII hyphen/minus) characters, starting
with a lower case ASCII letter (i.e., using a pattern of
"⁠<tt>[a-z][-a-z0-9]*</tt>"), typically employing kebab-case for
names constructed out of multiple words <xref target="KebabCase"/>.</t>
          <t>To aid interworking with JSO implementations, it is <bcp14>RECOMMENDED</bcp14>
that sdfType is always used in conjunction with the <tt>type</tt> quality
inherited from <xref target="JSO7V"/>, in such a way as to yield a common
representation of the type's values in JSON.</t>
          <t>Values for sdfType that are defined in this specification are shown in
<xref target="sdftype1"/>.
This table also gives a description of the semantics of the sdfType,
the conventional value for <tt>type</tt> to be used with the sdfType value,
and a conventional JSON representation for values of the type.</t>
          <table anchor="sdftype1">
            <name>Values defined in base SDF for the sdfType quality</name>
            <thead>
              <tr>
                <th align="left">sdfType</th>
                <th align="left">Description</th>
                <th align="left">type</th>
                <th align="left">JSON Representation</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">byte-string</td>
                <td align="left">A sequence of zero or more bytes</td>
                <td align="left">string</td>
                <td align="left">base64url without padding (<xref section="3.4.5.2" sectionFormat="of" target="RFC8949"/>)</td>
              </tr>
              <tr>
                <td align="left">unix-time</td>
                <td align="left">A point in civil time (note 1)</td>
                <td align="left">number</td>
                <td align="left">POSIX time (<xref section="3.4.2" sectionFormat="of" target="RFC8949"/>)</td>
              </tr>
            </tbody>
          </table>
          <t>(1) Note that the definition of <tt>unix-time</tt> does not imply the
capability to represent points in time that fall on leap seconds.
More date/time-related sdfTypes are likely to be added in the sdfType
value registry.</t>
          <t>(In earlier drafts of this specification, a similar concept was called <tt>subtype</tt>.)</t>
        </section>
        <section anchor="sdfchoice">
          <name>sdfChoice</name>
          <t>Data can be a choice of named alternatives, called <tt>sdfChoice</tt>.
Each alternative is identified by a name (string, key in the outer JSON
map used to represent the overall choice) and a set of dataqualities
(each in an inner JSON map, the value used to represent the
individual alternative in the outer JSON map).
Dataqualities that are specified at the same level as the sdfChoice
apply to all choices in the sdfChoice, except those specific choices
where the dataquality is overridden at the choice level.</t>
          <t>sdfChoice merges the functions of two constructs found in <xref target="JSO7V"/>:</t>
          <ul spacing="normal">
            <li>
              <t><tt>enum</tt>  </t>
              <t>
What would have been  </t>
              <sourcecode type="json"><![CDATA[
"enum": ["foo", "bar", "baz"]
]]></sourcecode>
              <t>
in earlier drafts of this specification, is often best represented as:  </t>
              <sourcecode type="json"><![CDATA[
"sdfChoice": {
  "foo": { "description": "This is a foonly"},
  "bar": { "description":
"As defined in the second world congress"},
  "baz": { "description": "From zigbee foobaz"}
}
]]></sourcecode>
              <t>
This allows the placement of other dataqualities such as
<tt>description</tt> in the example.  </t>
              <t>
If an enum needs to use a data type different from text string,
what would for instance have been:  </t>
              <sourcecode type="json"><![CDATA[
"type": "number",
"enum": [1, 2, 3]
]]></sourcecode>
              <t>
in earlier drafts of this specification, is represented as:  </t>
              <sourcecode type="json"><![CDATA[
"type": "number",
"sdfChoice": {
  "a-better-name-for-alternative-1": { "const": 1 },
  "alternative-2": { "const": 2 },
  "the-third-alternative": { "const": 3 }
}
]]></sourcecode>
              <t>
where the string names obviously would be chosen in a way that is
descriptive for what these numbers actually stand for; sdfChoice
also makes it easy to add number ranges into the mix.  </t>
              <t>
(Note that <tt>const</tt> can also be used for strings as in the previous
example, for instance, if the actual string value is indeed a crucial
element for the data model.)</t>
            </li>
            <li>
              <t>anyOf  </t>
              <t>
JSO provides a type union called <tt>anyOf</tt>, which provides a
choice between anonymous alternatives.  </t>
              <t>
What could have been in JSO:  </t>
              <sourcecode type="json"><![CDATA[
"anyOf": [
  {"type": "array", "minItems": 3, "maxItems": "3",
   "items": {"$ref": "#/sdfData/rgbVal"}},
  {"type": "array", "minItems": 4, "maxItems": "4",
   "items": {"$ref": "#/sdfData/cmykVal"}}
]
]]></sourcecode>
              <t>
can be more descriptively notated in SDF as:  </t>
              <sourcecode type="json"><![CDATA[
"sdfChoice": {
  "rgb": {"type": "array", "minItems": 3, "maxItems": "3",
          "items": {"sdfRef": "#/sdfData/rgbVal"}},
  "cmyk": {"type": "array", "minItems": 4, "maxItems": "4",
           "items": {"sdfRef": "#/sdfData/cmykVal"}}
}
]]></sourcecode>
            </li>
          </ul>
          <t>Note that there is no need in SDF for the type intersection construct
<tt>allOf</tt> or the peculiar type-xor construct <tt>oneOf</tt> found in <xref target="JSO7V"/>.</t>
          <t>As a simplification for users of SDF models who are accustomed to
the JSO enum keyword, this is retained, but limited to a choice
of text string values, such that</t>
          <sourcecode type="json"><![CDATA[
"enum": ["foo", "bar", "baz"]
]]></sourcecode>
          <t>is syntactic sugar for</t>
          <sourcecode type="json"><![CDATA[
"sdfChoice": {
  "foo": { "const": "foo"},
  "bar": { "const": "bar"},
  "baz": { "const": "baz"}
}
]]></sourcecode>
          <t>In a single definition, the keyword <tt>enum</tt> cannot be used at the same
time as the keyword <tt>sdfChoice</tt>, as the former is just syntactic
sugar for the latter.</t>
        </section>
      </section>
    </section>
    <section anchor="keywords-for-definition-groups">
      <name>Keywords for definition groups</name>
      <t>The following SDF keywords are used to create definition groups in the target namespace.
All these definitions share some common qualities as discussed in <xref target="common-qualities"/>.</t>
      <section anchor="sdfobject-1">
        <name>sdfObject</name>
        <t>The <tt>sdfObject</tt> keyword denotes a group of zero or more sdfObject definitions.
sdfObject definitions may contain or include definitions of Properties, Actions, Events declared for the sdfObject, as well as data types (sdfData group) to be used in this or other sdfObjects.</t>
        <t>The qualities of an sdfObject include the common qualities, additional qualities are shown in <xref target="sdfobjqual"/>.
None of these
qualities are required or have default values that are assumed if the
quality is absent.</t>
        <table anchor="sdfobjqual">
          <name>Qualities of sdfObject</name>
          <thead>
            <tr>
              <th align="left">Quality</th>
              <th align="left">Type</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">(common)</td>
              <td align="left"> </td>
              <td align="left">
                <xref target="common-qualities"/></td>
            </tr>
            <tr>
              <td align="left">sdfProperty</td>
              <td align="left">property</td>
              <td align="left">zero or more named property definitions for this sdfObject</td>
            </tr>
            <tr>
              <td align="left">sdfAction</td>
              <td align="left">action</td>
              <td align="left">zero or more named action definitions for this sdfObject</td>
            </tr>
            <tr>
              <td align="left">sdfEvent</td>
              <td align="left">event</td>
              <td align="left">zero or more named event definitions for this sdfObject</td>
            </tr>
            <tr>
              <td align="left">sdfData</td>
              <td align="left">named-sdq</td>
              <td align="left">zero or more named data type definitions that might be used in the above</td>
            </tr>
            <tr>
              <td align="left">minItems</td>
              <td align="left">number</td>
              <td align="left">(array) Minimum number of multiplied affordances in array</td>
            </tr>
            <tr>
              <td align="left">maxItems</td>
              <td align="left">number</td>
              <td align="left">(array) Maximum number of multiplied affordances in array</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="sdfproperty-1">
        <name>sdfProperty</name>
        <t>The <tt>sdfProperty</tt> keyword denotes a group of zero or more Property definitions.</t>
        <t>Properties are used to model elements of state.</t>
        <t>The qualities of a Property definition include the data qualities (and
thus the common qualities), see <xref target="data-qualities"/>, additional qualities are shown in <xref target="sdfpropqual"/>.</t>
        <table anchor="sdfpropqual">
          <name>Qualities of sdfProperty</name>
          <thead>
            <tr>
              <th align="left">Quality</th>
              <th align="left">Type</th>
              <th align="left">Description</th>
              <th align="left">Default</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">(data)</td>
              <td align="left"> </td>
              <td align="left">
                <xref target="data-qualities"/></td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">readable</td>
              <td align="left">boolean</td>
              <td align="left">Reads are allowed</td>
              <td align="left">true</td>
            </tr>
            <tr>
              <td align="left">writable</td>
              <td align="left">boolean</td>
              <td align="left">Writes are allowed</td>
              <td align="left">true</td>
            </tr>
            <tr>
              <td align="left">observable</td>
              <td align="left">boolean</td>
              <td align="left">flag to indicate asynchronous notification is available</td>
              <td align="left">true</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="sdfaction">
        <name>sdfAction</name>
        <t>The <tt>sdfAction</tt> keyword denotes a group of zero or more Action definitions.</t>
        <t>Actions are used to model commands and methods which are invoked. Actions have parameter data that are supplied upon invocation.</t>
        <t>The qualities of an Action definition include the common qualities, additional qualities are shown in <xref target="sdfactqual"/>.</t>
        <table anchor="sdfactqual">
          <name>Qualities of sdfAction</name>
          <thead>
            <tr>
              <th align="left">Quality</th>
              <th align="left">Type</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">(common)</td>
              <td align="left"> </td>
              <td align="left">
                <xref target="common-qualities"/></td>
            </tr>
            <tr>
              <td align="left">sdfInputData</td>
              <td align="left">map</td>
              <td align="left">data qualities of the input data for an Action</td>
            </tr>
            <tr>
              <td align="left">sdfOutputData</td>
              <td align="left">map</td>
              <td align="left">data qualities of the output data for an Action</td>
            </tr>
            <tr>
              <td align="left">sdfData</td>
              <td align="left">named-sdq</td>
              <td align="left">zero or more named data type definitions that might be used in the above</td>
            </tr>
          </tbody>
        </table>
        <t><tt>sdfInputData</tt> defines the input data of the action.  <tt>sdfOutputData</tt>
defines the output data of the action.
As discussed in <xref target="sdfaction-overview"/>, a set of data qualities with
type <tt>"object"</tt> can be used to substructure either data item, with
optionality indicated by the data quality <tt>required</tt>.</t>
      </section>
      <section anchor="sdfevent">
        <name>sdfEvent</name>
        <t>The <tt>sdfEvent</tt> keyword denotes zero or more Event definitions.</t>
        <t>Events are used to model asynchronous occurrences that may be communicated proactively. Events have data elements which are communicated upon the occurrence of the event.</t>
        <t>The qualities of sdfEvent include the common qualities, additional qualities are shown in <xref target="sdfevqual"/>.</t>
        <table anchor="sdfevqual">
          <name>Qualities of sdfEvent</name>
          <thead>
            <tr>
              <th align="left">Quality</th>
              <th align="left">Type</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">(common)</td>
              <td align="left"> </td>
              <td align="left">
                <xref target="common-qualities"/></td>
            </tr>
            <tr>
              <td align="left">sdfOutputData</td>
              <td align="left">map</td>
              <td align="left">data qualities of the output data for an Event</td>
            </tr>
            <tr>
              <td align="left">sdfData</td>
              <td align="left">named-sdq</td>
              <td align="left">zero or more named data type definitions that might be used in the above</td>
            </tr>
          </tbody>
        </table>
        <t><tt>sdfOutputData</tt> defines the output data of the action.
As discussed in <xref target="sdfevent-overview"/>, a set of data qualities with
type <tt>"object"</tt> can be used to substructure the output data item, with
optionality indicated by the data quality <tt>required</tt>.</t>
      </section>
      <section anchor="sdfdata-1">
        <name>sdfData</name>
        <t>The <tt>sdfData</tt> keyword denotes a group of zero or more named data type
definitions (named-sdq).</t>
        <t>An sdfData definition provides a reusable semantic identifier for a
type of data item and describes the constraints on the defined type.
It is not itself a declaration, i.e., it does not cause any of these
data items to be included in an affordance definition.</t>
        <t>The qualities of sdfData include the data qualities (and thus the common qualities), see <xref target="data-qualities"/>.</t>
      </section>
    </section>
    <section anchor="high-level-composition">
      <name>High Level Composition</name>
      <t>The requirements for high level composition include the following:</t>
      <ul spacing="normal">
        <li>
          <t>The ability to represent products, standardized product types, and modular products while maintaining the atomicity of sdfObjects.</t>
        </li>
        <li>
          <t>The ability to compose a reusable definition block from sdfObjects, for example a single plug unit of an outlet strip with on/off control, energy monitor, and optional dimmer sdfObjects, while retaining the atomicity of the individual sdfObjects.</t>
        </li>
        <li>
          <t>The ability to compose sdfObjects and other definition blocks into a higher level sdfThing that represents a product, while retaining the atomicity of sdfObjects.</t>
        </li>
        <li>
          <t>The ability to enrich and refine a base definition to have
product-specific qualities and quality values, such as unit, range, and scale settings.</t>
        </li>
        <li>
          <t>The ability to reference items in one part of a complex definition from another part of the same definition, for example to summarize the energy readings from all plugs in an outlet strip.</t>
        </li>
      </ul>
      <section anchor="paths-in-the-model-namespaces">
        <name>Paths in the model namespaces</name>
        <t>The model namespace is organized according to terms that are defined
in the SDF documents that contribute to the namespace. For example, definitions that originate from an organization or vendor are expected to be in a namespace that is specific to that organization or vendor.</t>
        <t>The structure of a path in a namespace is defined by the JSON Pointers
to the definitions in the SDF documents in that namespace.
For example, if there is an SDF document defining an sdfObject "<tt>Switch</tt>"
with an action "<tt>on</tt>", then the reference to the action would be
"<tt>ns:/sdfObject/Switch/sdfAction/on</tt>" where <tt>ns</tt> is the namespace prefix
(short name for the namespace).</t>
      </section>
      <section anchor="modular-composition">
        <name>Modular Composition</name>
        <t>Modular composition of definitions enables an existing definition
(could be in the same or another SDF document) to become part of a new definition by including a reference to the existing definition within the model namespace.</t>
        <section anchor="use-of-the-sdfref-keyword-to-re-use-a-definition">
          <name>Use of the "sdfRef" keyword to re-use a definition</name>
          <t>An existing definition may be used as a template for a new definition, that is, a new definition is created in the target namespace which uses the defined qualities of some existing definition. This pattern will use the keyword <tt>sdfRef</tt> as a quality of a new definition with a value consisting of a reference to the existing definition that is to be used as a template.</t>
          <t>In the definition that uses <tt>sdfRef</tt>, new qualities may be added
and existing qualities from the referenced definition may be
overridden.  (Note that JSON maps do not have a defined
order, so the SDF processor may see these overrides before seeing the
<tt>sdfRef</tt>.)</t>
          <t>Note that if the referenced definition contains qualities or
definitions that are not valid in the context where the sdfRef is used
(for instance, if an sdfThing definition would be added in an sdfObject definition), the resulting model, when resolved, may be invalid.</t>
          <t>As a convention, overrides are intended to be used only for further restricting
the set of data values, as shown in <xref target="exa-sdfref"/>:  any value for a
<tt>cable-length</tt> also is a valid value for a <tt>length</tt>, with the
additional restriction that the length cannot be smaller than 5 cm.
(This is labeled as a convention as it cannot be checked in the
general case; a quality of implementation consideration for a tool
might be to provide at least some form of checking.)
Note that a description is provided that overrides the description of
the referenced definition; as this quality is intended for human
consumption there is no conflict with the intended goal.</t>
          <figure anchor="exa-sdfref">
            <artwork><![CDATA[
"sdfData":
  "length" : {
    "type": "number",
    "minimum": 0,
    "unit": "m"
    "description": "There can be no negative lengths."
  }
...
  "cable-length" : {
    "sdfRef": "#/sdfData/length"
    "minimum": 5e-2,
    "description": "Cables must be at least 5 cm."
  }
]]></artwork>
          </figure>
        </section>
      </section>
      <section anchor="sdfthing-1">
        <name>sdfThing</name>
        <t>An sdfThing is a set of declarations and qualities that may be part of
a more complex model. For example, the sdfObject declarations that make
up the definition of a single socket of an outlet strip could be
encapsulated in an sdfThing, which itself could be used in a declaration in the sdfThing definition for the outlet strip
(see <xref target="exa-sdfthing-outlet-strip"/> in <xref target="outlet-strip-example"/> for an example SDF model).</t>
        <t>sdfThing definitions carry semantic meaning, such as a defined refrigerator compartment and a defined freezer compartment, making up a combination refrigerator-freezer product.
An sdfThing may be composed of sdfObjects and other sdfThings.
It can also contain sdfData definitions, as well as declarations of interaction affordances itself, such
as a status (on/off) for the refrigerator-freezer as a whole (see
<xref target="exa-sdfthing-fridge-freezer"/> in <xref target="fridge-freezer-example"/> for an example SDF
model illustrating these aspects).</t>
        <t>The qualities of sdfThing are shown in <xref target="sdfthingqual"/>.
Analogous to sdfObject, the presence of one or both of the optional
qualities "<tt>minItems</tt>" and "<tt>maxItems</tt>" defines the sdfThing as an
array.</t>
        <table anchor="sdfthingqual">
          <name>Qualities of sdfThing</name>
          <thead>
            <tr>
              <th align="left">Quality</th>
              <th align="left">Type</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">(common)</td>
              <td align="left"> </td>
              <td align="left">
                <xref target="common-qualities"/></td>
            </tr>
            <tr>
              <td align="left">sdfThing</td>
              <td align="left">thing</td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">sdfObject</td>
              <td align="left">object</td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">sdfProperty</td>
              <td align="left">property</td>
              <td align="left">zero or more named property definitions for this thing</td>
            </tr>
            <tr>
              <td align="left">sdfAction</td>
              <td align="left">action</td>
              <td align="left">zero or more named action definitions for this thing</td>
            </tr>
            <tr>
              <td align="left">sdfEvent</td>
              <td align="left">event</td>
              <td align="left">zero or more named event definitions for this thing</td>
            </tr>
            <tr>
              <td align="left">sdfData</td>
              <td align="left">named-sdq</td>
              <td align="left">zero or more named data type definitions that might be used in the above</td>
            </tr>
            <tr>
              <td align="left">minItems</td>
              <td align="left">number</td>
              <td align="left">(array) Minimum number of multiplied affordances in array</td>
            </tr>
            <tr>
              <td align="left">maxItems</td>
              <td align="left">number</td>
              <td align="left">(array) Maximum number of multiplied affordances in array</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <t><cref anchor="replace-xxxx">RFC Ed.: throughout this section, please replace RFC XXXX with this RFC number, and remove this note.</cref></t>
      <section anchor="media-type">
        <name>Media Type</name>
        <t>IANA is requested to add the following Media-Type to the "Media Types" registry.</t>
        <table align="left">
          <name>Media Type Registration for SDF</name>
          <thead>
            <tr>
              <th align="left">Name</th>
              <th align="left">Template</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">sdf+json</td>
              <td align="left">application/sdf+json</td>
              <td align="left">RFC XXXX, <xref target="media-type"/></td>
            </tr>
          </tbody>
        </table>
        <dl spacing="compact">
          <dt>Type name:</dt>
          <dd>
            <t>application</t>
          </dd>
          <dt>Subtype name:</dt>
          <dd>
            <t>sdf+json</t>
          </dd>
          <dt>Required parameters:</dt>
          <dd>
            <t>none</t>
          </dd>
          <dt>Optional parameters:</dt>
          <dd>
            <t>none</t>
          </dd>
          <dt>Encoding considerations:</dt>
          <dd>
            <t>binary (JSON is UTF-8-encoded text)</t>
          </dd>
          <dt>Security considerations:</dt>
          <dd>
            <t><xref target="seccons"/> of RFC XXXX</t>
          </dd>
          <dt>Interoperability considerations:</dt>
          <dd>
            <t>none</t>
          </dd>
          <dt>Published specification:</dt>
          <dd>
            <t><xref target="media-type"/> of RFC XXXX</t>
          </dd>
          <dt>Applications that use this media type:</dt>
          <dd>
            <t>Tools for data and interaction modeling in the Internet of Things
and related environments</t>
          </dd>
          <dt>Fragment identifier considerations:</dt>
          <dd>
            <t>A JSON Pointer fragment identifier may be used, as defined in
<xref section="6" sectionFormat="of" target="RFC6901"/>.</t>
          </dd>
          <dt>Additional information:</dt>
          <dd>
            <dl>
              <dt>Magic number(s):</dt>
              <dd>
                <t>n/a</t>
              </dd>
              <dt>File extension(s):</dt>
              <dd>
                <t>.sdf.json</t>
              </dd>
              <dt>Windows Clipboard Name:</dt>
              <dd>
                <t>"Semantic Definition Format (SDF) for Data and Interactions of Things"</t>
              </dd>
              <dt>Macintosh file type code(s):</dt>
              <dd>
                <t>n/a</t>
              </dd>
              <dt>Macintosh Universal Type Identifier code:</dt>
              <dd>
                <t>org.ietf.sdf-json<br/>
conforms to public.text</t>
              </dd>
            </dl>
          </dd>
          <dt>Person &amp; email address to contact for further information:</dt>
          <dd>
            <t>ASDF WG mailing list (asdf@ietf.org),
or IETF Applications and Real-Time Area (art@ietf.org)</t>
          </dd>
          <dt>Intended usage:</dt>
          <dd>
            <t>COMMON</t>
          </dd>
          <dt>Restrictions on usage:</dt>
          <dd>
            <t>none</t>
          </dd>
          <dt>Author/Change controller:</dt>
          <dd>
            <t>IETF</t>
          </dd>
          <dt>Provisional registration:</dt>
          <dd>
            <t>no</t>
          </dd>
        </dl>
      </section>
      <section anchor="content-format">
        <name>Content-Format</name>
        <t>This document adds the following Content-Format to the "CoAP Content-Formats",
within the "Constrained RESTful Environments (CoRE) Parameters"
registry, where TBD1 comes from the "IETF Review" 256-999 range.</t>
        <table align="left">
          <name>SDF Content-format Registration</name>
          <thead>
            <tr>
              <th align="left">Content Type</th>
              <th align="left">Content Coding</th>
              <th align="left">ID</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">application/sdf+json</td>
              <td align="left">-</td>
              <td align="left">TBD1</td>
              <td align="left">RFC XXXX</td>
            </tr>
          </tbody>
        </table>
        <t>// RFC Ed.: please replace TBD1 with the assigned ID, remove the
requested range, and remove this note.<br/>
// RFC Ed.: please replace RFC XXXX with this RFC number and remove this note.</t>
      </section>
      <section anchor="unit-urn">
        <name>IETF URN Sub-namespace for Unit Names (urn:ietf:params:unit)</name>
        <t>IANA is requested to register the following value in the "<xref section="IETF URN Sub-namespace for Registered Protocol Parameter Identifiers" relative="#params-1" sectionFormat="bare" target="IANA.params"/>" registry in <xref target="IANA.params"/>, following the template in
<xref target="RFC3553"/>:</t>
        <dl>
          <dt>Registry name:</dt>
          <dd>
            <t>unit</t>
          </dd>
          <dt>Specification:</dt>
          <dd>
            <t>RFC XXXX</t>
          </dd>
          <dt>Repository:</dt>
          <dd>
            <t>combining the symbol values from the <xref section="SenML Units" relative="#senml-units" sectionFormat="bare" target="IANA.senml"/> Registry and the <xref section="Secondary Units" relative="#secondary-units" sectionFormat="bare" target="IANA.senml"/> Registry in <xref target="IANA.senml"/> as specified by Sections <xref target="RFC8428" section="4.5.1" sectionFormat="bare"/> and <xref target="RFC8428" section="12.1" sectionFormat="bare"/> of <xref target="RFC8428"/> and <xref section="3" sectionFormat="of" target="RFC8798"/>,
respectively (which by the registration policy are guaranteed to be
non-overlapping).</t>
          </dd>
          <dt>Index value:</dt>
          <dd>
            <t>Percent-encoding (<xref section="2.1" sectionFormat="of" target="RFC3986"/>) is required of
any characters in unit names as required by ABNF rule "pchar" in
<xref section="3.3" sectionFormat="of" target="RFC3986"/>, specifically at the time of writing for the
unit names "%" (deprecated in favor of "/"), "%RH", "%EL".</t>
          </dd>
        </dl>
      </section>
      <section anchor="registries">
        <name>Registries</name>
        <t>IANA is requested to create an "SDF Parameters" registry, with the
sub-registries defined in this Section.</t>
        <section anchor="qnp">
          <name>Quality Name Prefixes</name>
          <t>IANA is requested to create a "Quality Name Prefixes" sub-registry in
the "SDF Parameters" registry, with the following template:</t>
          <dl>
            <dt>Prefix:</dt>
            <dd>
              <t>A name composed of lower case ASCII letters and digits, starting
with a lower case ASCII letter (i.e., using a pattern of "⁠<tt>[a-z][a-z0-9]*</tt>").</t>
            </dd>
            <dt>Contact:</dt>
            <dd>
              <t>A contact point for the organization that assigns quality names with
this prefix.</t>
            </dd>
          </dl>
          <t>Quality Name Prefixes are intended to be registered by organizations
that intend to define quality names constructed with an
organization-specifix prefix (<xref target="gnqn"/>).</t>
          <t>The registration policy is Expert Review as per <xref section="4.5" sectionFormat="of" target="RFC8126"/>.
The instructions to the Expert are to ascertain that the organization
will handle quality names constructed using their prefix in a way that
roughly achieves the objectives for an IANA registry that support
interoperability of SDF models employing these quality names,
including:</t>
          <ul spacing="normal">
            <li>
              <t>Stability, "stable and permanent";</t>
            </li>
            <li>
              <t>Transparency, "readily available", "in sufficient detail" (<xref section="4.6" sectionFormat="of" target="RFC8126"/>).</t>
            </li>
          </ul>
          <t>The Expert will take into account that other organizations operate in
different ways than the IETF, and that as a result some of these
overall objectives will be achieved in a different way and to a
different level of comfort.</t>
          <t>The "Quality Name Prefixes" sub-registry starts out empty.</t>
        </section>
        <section anchor="sdftype-values">
          <name>sdfType Values</name>
          <t>IANA is requested to create a "sdfType values" sub-registry in
the "SDF Parameters" registry, with the following template:</t>
          <dl>
            <dt>Name:</dt>
            <dd>
              <t>A name composed of lower case ASCII letters, digits and <tt>-</tt> (ASCII
hyphen/minus) characters, starting with a lower case ASCII letter
(i.e., using a pattern of "⁠<tt>[a-z][-a-z0-9]*</tt>").</t>
            </dd>
            <dt>Description:</dt>
            <dd>
              <t>A short description of the information model level structure and semantics</t>
            </dd>
            <dt>type:</dt>
            <dd>
              <t>The value of the quality "type" to be used with this sdfType</t>
            </dd>
            <dt>JSON Representation</dt>
            <dd>
              <t>A short description of a JSON representation that can be used for
this sdfType.  This <bcp14>MUST</bcp14> be consistent with the type.</t>
            </dd>
            <dt>Reference:</dt>
            <dd>
              <t>A more detailed specification of meaning and use of sdfType.</t>
            </dd>
          </dl>
          <t>sdfType values are intended to be registered to enable modeling additional
SDF-specific types (see <xref target="sdftype"/>).</t>
          <t>The registration policy is Specification Required as per <xref section="4.6" sectionFormat="of" target="RFC8126"/>.  The instructions to the Expert are to ascertain that the
specification provides enough detail to enable interoperability
between implementations of the sdfType being registered, and that
names are chosen with enough specificity that ecosystem-specific
sdfTypes will not be confused with more generally applicable ones.</t>
          <t>The initial set of registrations is described in <xref target="sdftype-r"/>.</t>
          <table anchor="sdftype-r">
            <name>Initial set of sdfType values</name>
            <thead>
              <tr>
                <th align="left">Name</th>
                <th align="left">Description</th>
                <th align="left">type</th>
                <th align="left">JSON Representation</th>
                <th align="left">Reference</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">byte-string</td>
                <td align="left">A sequence of zero or more bytes</td>
                <td align="left">string</td>
                <td align="left">base64url without padding</td>
                <td align="left">
                  <xref section="3.4.5.2" sectionFormat="of" target="RFC8949"/></td>
              </tr>
              <tr>
                <td align="left">unix-time</td>
                <td align="left">A point in civil time</td>
                <td align="left">number</td>
                <td align="left">POSIX time</td>
                <td align="left">
                  <xref section="3.4.2" sectionFormat="of" target="RFC8949"/></td>
              </tr>
            </tbody>
          </table>
        </section>
      </section>
    </section>
    <section anchor="seccons">
      <name>Security Considerations</name>
      <t>Some wider security considerations applicable to Things are discussed
in <xref target="RFC8576"/>.
<xref section="5" sectionFormat="of" target="RFC8610"/> gives an overview over security considerations
that arise when formal description techniques are used to govern
interoperability; analogs of these security considerations can apply
to SDF.</t>
      <t>The security considerations of underlying building blocks such as
those detailed in <xref section="10" sectionFormat="of" target="RFC3629"/> apply.
SDF uses JSON as a representation language; for a number of
cases <xref target="RFC8259"/> indicates that implementation behavior for certain constructs
allowed by the JSON grammar is unpredictable.
Implementations need to be robust against invalid or unpredictable
cases on input, preferably by rejecting input that is invalid or
that would lead to unpredictable behavior, and need to avoid generating
these cases on output.</t>
      <t>Implementations of model languages may also exhibit
performance-related availability issues when the attacker can control
the input, see <xref section="4.1" sectionFormat="of" target="I-D.ietf-jsonpath-base"/> for a brief discussion.</t>
      <t>SDF may be used in two processes that are often security relevant:
model-based <em>validation</em> of data that is intended to be described by SDF models, and
model-based <em>augmentation</em> of these data with information obtained from the SDF
models that apply.</t>
      <t>Implementations need to ascertain the provenance and applicability of
the SDF models they employ operationally in such security relevant ways.
Implementations that make use of the composition mechanisms defined in this
document need to do this for each of the components they combine
into the SDF models they employ.
Essentially, this process needs to undergo the same care and scrutiny
as any other introduction of source code into a build environment; the
possibility of supply-chain attacks on the modules imported needs to
be considered.</t>
      <t>Specifically, implementations might rely on model-based input
validation for enforcing certain properties of the data structure
ingested (which, if not validated, could lead to malfunctions such as
crashes and remote code execution).
These implementations need to be particularly careful
about the data models they apply, including their provenance and
potential changes of these properties that upgrades to the referenced
modules may (inadvertently or as part of an attack) cause.
More generally speaking, implementations should strive to be robust
against expected and unexpected limitations of the model-based input
validation mechanisms and their implementations.</t>
      <t>Similarly, implementations that rely on model-based augmentation may
generate false data from their inputs; this is an integrity violation
in any case but also can possibly be exploited for further attacks.</t>
      <t>In applications that dynamically acquire models and obtain modules
from module references in these, the security considerations of
dereferenceable identifiers apply (see <xref target="I-D.bormann-t2trg-deref-id"/> for a more extensive
discussion of dereferenceable identifiers).</t>
      <t>There may be confidentiality requirements on SDF models, both on their
content and on the fact that a specific model is used in a particular
Thing or environment.
The present specification does not discuss model discovery or define
an access control model for SDF models, nor does it define a way to
obtain selective disclosure where that may be required.
It is likely that these definitions require additional context from
underlying ecosystems and the characteristics of the protocols
employed there; this is therefore left as future work (e.g., for
documents such as <xref target="I-D.bormann-asdf-sdf-mapping"/>).</t>
    </section>
  </middle>
  <back>
    <displayreference target="RFC8126" to="BCP26"/>
    <references>
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="IANA.senml" target="https://www.iana.org/assignments/senml">
          <front>
            <title>Sensor Measurement Lists (SenML)</title>
            <author>
              <organization>IANA</organization>
            </author>
          </front>
        </reference>
        <reference anchor="IANA.params" target="https://www.iana.org/assignments/params">
          <front>
            <title>Uniform Resource Name (URN) Namespace for IETF Use</title>
            <author>
              <organization>IANA</organization>
            </author>
          </front>
        </reference>
        <reference anchor="RFC3339">
          <front>
            <title>Date and Time on the Internet: Timestamps</title>
            <author fullname="G. Klyne" initials="G." surname="Klyne"/>
            <author fullname="C. Newman" initials="C." surname="Newman"/>
            <date month="July" year="2002"/>
            <abstract>
              <t>This document defines a date and time format for use in Internet protocols that is a profile of the ISO 8601 standard for representation of dates and times using the Gregorian calendar.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="3339"/>
          <seriesInfo name="DOI" value="10.17487/RFC3339"/>
        </reference>
        <reference anchor="RFC8428">
          <front>
            <title>Sensor Measurement Lists (SenML)</title>
            <author fullname="C. Jennings" initials="C." surname="Jennings"/>
            <author fullname="Z. Shelby" initials="Z." surname="Shelby"/>
            <author fullname="J. Arkko" initials="J." surname="Arkko"/>
            <author fullname="A. Keranen" initials="A." surname="Keranen"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This specification defines a format for representing simple sensor measurements and device parameters in Sensor Measurement Lists (SenML). Representations are defined in JavaScript Object Notation (JSON), Concise Binary Object Representation (CBOR), Extensible Markup Language (XML), and Efficient XML Interchange (EXI), which share the common SenML data model. A simple sensor, such as a temperature sensor, could use one of these media types in protocols such as HTTP or the Constrained Application Protocol (CoAP) to transport the measurements of the sensor or to be configured.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8428"/>
          <seriesInfo name="DOI" value="10.17487/RFC8428"/>
        </reference>
        <reference anchor="RFC8798">
          <front>
            <title>Additional Units for Sensor Measurement Lists (SenML)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="June" year="2020"/>
            <abstract>
              <t>The Sensor Measurement Lists (SenML) media type supports the indication of units for a quantity represented. This short document registers a number of additional unit names in the IANA registry for units in SenML. It also defines a registry for secondary units that cannot be in SenML's main registry, as they are derived by linear transformation from units already in that registry.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8798"/>
          <seriesInfo name="DOI" value="10.17487/RFC8798"/>
        </reference>
        <reference anchor="RFC3986">
          <front>
            <title>Uniform Resource Identifier (URI): Generic Syntax</title>
            <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee"/>
            <author fullname="R. Fielding" initials="R." surname="Fielding"/>
            <author fullname="L. Masinter" initials="L." surname="Masinter"/>
            <date month="January" year="2005"/>
            <abstract>
              <t>A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource. This specification defines the generic URI syntax and a process for resolving URI references that might be in relative form, along with guidelines and security considerations for the use of URIs on the Internet. The URI syntax defines a grammar that is a superset of all valid URIs, allowing an implementation to parse the common components of a URI reference without knowing the scheme-specific requirements of every possible identifier. This specification does not define a generative grammar for URIs; that task is performed by the individual specifications of each URI scheme. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="66"/>
          <seriesInfo name="RFC" value="3986"/>
          <seriesInfo name="DOI" value="10.17487/RFC3986"/>
        </reference>
        <reference anchor="RFC4122">
          <front>
            <title>A Universally Unique IDentifier (UUID) URN Namespace</title>
            <author fullname="P. Leach" initials="P." surname="Leach"/>
            <author fullname="M. Mealling" initials="M." surname="Mealling"/>
            <author fullname="R. Salz" initials="R." surname="Salz"/>
            <date month="July" year="2005"/>
            <abstract>
              <t>This specification defines a Uniform Resource Name namespace for UUIDs (Universally Unique IDentifier), also known as GUIDs (Globally Unique IDentifier). A UUID is 128 bits long, and can guarantee uniqueness across space and time. UUIDs were originally used in the Apollo Network Computing System and later in the Open Software Foundation\'s (OSF) Distributed Computing Environment (DCE), and then in Microsoft Windows platforms.</t>
              <t>This specification is derived from the DCE specification with the kind permission of the OSF (now known as The Open Group). Information from earlier versions of the DCE specification have been incorporated into this document. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4122"/>
          <seriesInfo name="DOI" value="10.17487/RFC4122"/>
        </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="RFC7396">
          <front>
            <title>JSON Merge Patch</title>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
            <author fullname="J. Snell" initials="J." surname="Snell"/>
            <date month="October" year="2014"/>
            <abstract>
              <t>This specification defines the JSON merge patch format and processing rules. The merge patch format is primarily intended for use with the HTTP PATCH method as a means of describing a set of modifications to a target resource's content.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7396"/>
          <seriesInfo name="DOI" value="10.17487/RFC7396"/>
        </reference>
        <reference anchor="RFC3629">
          <front>
            <title>UTF-8, a transformation format of ISO 10646</title>
            <author fullname="F. Yergeau" initials="F." surname="Yergeau"/>
            <date month="November" year="2003"/>
            <abstract>
              <t>ISO/IEC 10646-1 defines a large character set called the Universal Character Set (UCS) which encompasses most of the world's writing systems. The originally proposed encodings of the UCS, however, were not compatible with many current applications and protocols, and this has led to the development of UTF-8, the object of this memo. UTF-8 has the characteristic of preserving the full US-ASCII range, providing compatibility with file systems, parsers and other software that rely on US-ASCII values but are transparent to other values. This memo obsoletes and replaces RFC 2279.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="63"/>
          <seriesInfo name="RFC" value="3629"/>
          <seriesInfo name="DOI" value="10.17487/RFC3629"/>
        </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="RFC8610">
          <front>
            <title>Concise Data Definition Language (CDDL): A Notational Convention to Express Concise Binary Object Representation (CBOR) and JSON Data Structures</title>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
            <author fullname="C. Vigano" initials="C." surname="Vigano"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="June" year="2019"/>
            <abstract>
              <t>This document proposes a notational convention to express Concise Binary Object Representation (CBOR) data structures (RFC 7049). Its main goal is to provide an easy and unambiguous way to express structures for protocol messages and data formats that use CBOR or JSON.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8610"/>
          <seriesInfo name="DOI" value="10.17487/RFC8610"/>
        </reference>
        <reference anchor="RFC8949">
          <front>
            <title>Concise Binary Object Representation (CBOR)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
            <date month="December" year="2020"/>
            <abstract>
              <t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation. These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t>
              <t>This document obsoletes RFC 7049, providing editorial improvements, new details, and errata fixes while keeping full compatibility with the interchange format of RFC 7049. It does not create a new version of the format.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="94"/>
          <seriesInfo name="RFC" value="8949"/>
          <seriesInfo name="DOI" value="10.17487/RFC8949"/>
        </reference>
        <reference anchor="RFC9193">
          <front>
            <title>Sensor Measurement Lists (SenML) Fields for Indicating Data Value Content-Format</title>
            <author fullname="A. Keränen" initials="A." surname="Keränen"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Sensor Measurement Lists (SenML) media types support multiple types of values, from numbers to text strings and arbitrary binary Data Values. In order to facilitate processing of binary Data Values, this document specifies a pair of new SenML fields for indicating the content format of those binary Data Values, i.e., their Internet media type, including parameters as well as any content codings applied.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9193"/>
          <seriesInfo name="DOI" value="10.17487/RFC9193"/>
        </reference>
        <reference anchor="RFC8126">
          <front>
            <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
            <author fullname="M. Cotton" initials="M." surname="Cotton"/>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <author fullname="T. Narten" initials="T." surname="Narten"/>
            <date month="June" year="2017"/>
            <abstract>
              <t>Many protocols make use of points of extensibility that use constants to identify various protocol parameters. To ensure that the values in these fields do not have conflicting uses and to promote interoperability, their allocations are often coordinated by a central record keeper. For IETF protocols, that role is filled by the Internet Assigned Numbers Authority (IANA).</t>
              <t>To make assignments in a given registry prudently, guidance describing the conditions under which new values should be assigned, as well as when and how modifications to existing values can be made, is needed. This document defines a framework for the documentation of these guidelines by specification authors, in order to assure that the provided guidance for the IANA Considerations is clear and addresses the various issues that are likely in the operation of a registry.</t>
              <t>This is the third edition of this document; it obsoletes RFC 5226.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="26"/>
          <seriesInfo name="RFC" value="8126"/>
          <seriesInfo name="DOI" value="10.17487/RFC8126"/>
        </reference>
        <reference anchor="W3C.NOTE-curie-20101216" target="https://www.w3.org/TR/2010/NOTE-curie-20101216/">
          <front>
            <title>CURIE Syntax 1.0</title>
            <author fullname="Mark Birbeck" role="editor"/>
            <author fullname="Shane McCarron" role="editor"/>
            <date day="16" month="December" year="2010"/>
          </front>
          <seriesInfo name="W3C NOTE" value="NOTE-curie-20101216"/>
          <seriesInfo name="W3C" value="NOTE-curie-20101216"/>
        </reference>
        <reference anchor="RFC0020">
          <front>
            <title>ASCII format for network interchange</title>
            <author fullname="V.G. Cerf" initials="V.G." surname="Cerf"/>
            <date month="October" year="1969"/>
          </front>
          <seriesInfo name="STD" value="80"/>
          <seriesInfo name="RFC" value="20"/>
          <seriesInfo name="DOI" value="10.17487/RFC0020"/>
        </reference>
        <reference anchor="SPDX" target="https://spdx.org/licenses/">
          <front>
            <title>SPDX License List</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="RFC9165">
          <front>
            <title>Additional Control Operators for the Concise Data Definition Language (CDDL)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="December" year="2021"/>
            <abstract>
              <t>The Concise Data Definition Language (CDDL), standardized in RFC 8610, provides "control operators" as its main language extension point.</t>
              <t>The present document defines a number of control operators that were not yet ready at the time RFC 8610 was completed:,, and for the construction of constants; / for including ABNF (RFC 5234 and RFC 7405) in CDDL specifications; and for indicating the use of a non-basic feature in an instance.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9165"/>
          <seriesInfo name="DOI" value="10.17487/RFC9165"/>
        </reference>
        <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="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="RFC3553">
          <front>
            <title>An IETF URN Sub-namespace for Registered Protocol Parameters</title>
            <author fullname="M. Mealling" initials="M." surname="Mealling"/>
            <author fullname="L. Masinter" initials="L." surname="Masinter"/>
            <author fullname="T. Hardie" initials="T." surname="Hardie"/>
            <author fullname="G. Klyne" initials="G." surname="Klyne"/>
            <date month="June" year="2003"/>
            <abstract>
              <t>This document describes a new sub-delegation for the 'ietf' URN namespace for registered protocol items. The 'ietf' URN namespace is defined in RFC 2648 as a root for persistent URIs that refer to IETF- defined resources. 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="73"/>
          <seriesInfo name="RFC" value="3553"/>
          <seriesInfo name="DOI" value="10.17487/RFC3553"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="JSO7">
          <front>
            <title>JSON Schema: A Media Type for Describing JSON Documents</title>
            <author fullname="Austin Wright" initials="A." surname="Wright">
         </author>
            <author fullname="Henry Andrews" initials="H." surname="Andrews">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <date day="19" month="March" year="2018"/>
            <abstract>
              <t>   JSON Schema defines the media type "application/schema+json", a JSON-
   based format for describing the structure of JSON data.  JSON Schema
   asserts what a JSON document must look like, ways to extract
   information from it, and how to interact with it.  The "application/
   schema-instance+json" media type provides additional feature-rich
   integration with "application/schema+json" beyond what can be offered
   for "application/json" documents.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-handrews-json-schema-01"/>
          <annotation>This is the base specification for json-schema.org "draft 7".</annotation>
        </reference>
        <reference anchor="JSO7V">
          <front>
            <title>JSON Schema Validation: A Vocabulary for Structural Validation of JSON</title>
            <author fullname="Austin Wright" initials="A." surname="Wright">
         </author>
            <author fullname="Henry Andrews" initials="H." surname="Andrews">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <author fullname="Geraint Luff" initials="G." surname="Luff">
         </author>
            <date day="19" month="March" year="2018"/>
            <abstract>
              <t>   JSON Schema (application/schema+json) has several purposes, one of
   which is JSON instance validation.  This document specifies a
   vocabulary for JSON Schema to describe the meaning of JSON documents,
   provide hints for user interfaces working with JSON data, and to make
   assertions about what a valid document must look like.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-handrews-json-schema-validation-01"/>
          <annotation>This is the validation specification for json-schema.org "draft 7".</annotation>
        </reference>
        <reference anchor="JSO4">
          <front>
            <title>JSON Schema: core definitions and terminology</title>
            <author fullname="Francis Galiegue" initials="F." surname="Galiegue">
         </author>
            <author fullname="Kris Zyp" initials="K." surname="Zyp">
              <organization>SitePen (USA)</organization>
            </author>
            <author fullname="Gary Court" initials="G." surname="Court">
         </author>
            <date day="31" month="January" year="2013"/>
            <abstract>
              <t>   JSON Schema defines the media type "application/schema+json", a JSON
   based format for defining the structure of JSON data.  JSON Schema
   provides a contract for what JSON data is required for a given
   application and how to interact with it.  JSON Schema is intended to
   define validation, documentation, hyperlink navigation, and
   interaction control of JSON data.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-zyp-json-schema-04"/>
          <annotation>This is the base specification for json-schema.org "draft 4".</annotation>
        </reference>
        <reference anchor="JSO4V">
          <front>
            <title>JSON Schema: interactive and non interactive validation</title>
            <author fullname="Kris Zyp" initials="K." surname="Zyp">
              <organization>SitePen (USA)</organization>
            </author>
            <author fullname="Gary Court" initials="G." surname="Court">
         </author>
            <date day="31" month="January" year="2013"/>
            <abstract>
              <t>   JSON Schema (application/schema+json) has several purposes, one of
   which is instance validation.  The validation process may be
   interactive or non interactive.  For instance, applications may use
   JSON Schema to build a user interface enabling interactive content
   generation in addition to user input checking, or validate data
   retrieved from various sources.  This specification describes schema
   keywords dedicated to validation purposes.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-fge-json-schema-validation-00"/>
          <annotation>This is the validation specification for json-schema.org "draft 4".</annotation>
        </reference>
        <reference anchor="I-D.irtf-t2trg-rest-iot">
          <front>
            <title>Guidance on RESTful Design for Internet of Things Systems</title>
            <author fullname="Ari Keränen" initials="A." surname="Keränen">
              <organization>Ericsson</organization>
            </author>
            <author fullname="Matthias Kovatsch" initials="M." surname="Kovatsch">
              <organization>Siemens</organization>
            </author>
            <author fullname="Klaus Hartke" initials="K." surname="Hartke">
         </author>
            <date day="25" month="January" year="2024"/>
            <abstract>
              <t>   This document gives guidance for designing Internet of Things (IoT)
   systems that follow the principles of the Representational State
   Transfer (REST) architectural style.  This document is a product of
   the IRTF Thing-to-Thing Research Group (T2TRG).

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-t2trg-rest-iot-13"/>
        </reference>
        <reference anchor="ZCL">
          <front>
            <title>The ZigBee Cluster Library</title>
            <author>
              <organization/>
            </author>
            <date year="2008"/>
          </front>
          <seriesInfo name="Zigbee Wireless Networking" value="pp. 239-271"/>
          <seriesInfo name="DOI" value="10.1016/b978-0-7506-8597-9.00006-9"/>
          <refcontent>Elsevier</refcontent>
        </reference>
        <reference anchor="OMA" target="http://www.openmobilealliance.org/wp/omna/lwm2m/lwm2mregistry.html">
          <front>
            <title>OMA LightweightM2M (LwM2M) Object and Resource Registry</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="OCF" target="https://openconnectivity.org/specs/OCF_Resource_Type_Specification.pdf">
          <front>
            <title>OCF Resource Type Specification</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="RFC8576">
          <front>
            <title>Internet of Things (IoT) Security: State of the Art and Challenges</title>
            <author fullname="O. Garcia-Morchon" initials="O." surname="Garcia-Morchon"/>
            <author fullname="S. Kumar" initials="S." surname="Kumar"/>
            <author fullname="M. Sethi" initials="M." surname="Sethi"/>
            <date month="April" year="2019"/>
            <abstract>
              <t>The Internet of Things (IoT) concept refers to the usage of standard Internet protocols to allow for human-to-thing and thing-to-thing communication. The security needs for IoT systems are well recognized, and many standardization steps to provide security have been taken -- for example, the specification of the Constrained Application Protocol (CoAP) secured with Datagram Transport Layer Security (DTLS). However, security challenges still exist, not only because there are some use cases that lack a suitable solution, but also because many IoT devices and systems have been designed and deployed with very limited security capabilities. In this document, we first discuss the various stages in the lifecycle of a thing. Next, we document the security threats to a thing and the challenges that one might face to protect against these threats. Lastly, we discuss the next steps needed to facilitate the deployment of secure IoT systems. This document can be used by implementers and authors of IoT specifications as a reference for details about security considerations while documenting their specific security challenges, threat models, and mitigations.</t>
              <t>This document is a product of the IRTF Thing-to-Thing Research Group (T2TRG).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8576"/>
          <seriesInfo name="DOI" value="10.17487/RFC8576"/>
        </reference>
        <reference anchor="ECMA-262" target="https://www.ecma-international.org/wp-content/uploads/ECMA-262.pdf">
          <front>
            <title>ECMAScript 2020 Language Specification</title>
            <author>
              <organization>Ecma International</organization>
            </author>
            <date year="2020" month="June"/>
          </front>
          <seriesInfo name="ECMA" value="Standard ECMA-262, 11th Edition"/>
        </reference>
        <reference anchor="CamelCase" target="http://wiki.c2.com/?CamelCase">
          <front>
            <title>Camel Case</title>
            <author>
              <organization/>
            </author>
            <date year="2014" month="December"/>
          </front>
        </reference>
        <reference anchor="KebabCase" target="http://wiki.c2.com/?KebabCase">
          <front>
            <title>Kebab Case</title>
            <author>
              <organization/>
            </author>
            <date year="2014" month="August"/>
          </front>
        </reference>
        <reference anchor="I-D.bormann-asdf-sdftype-link">
          <front>
            <title>An sdfType for Links</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <date day="3" month="December" year="2023"/>
            <abstract>
              <t>   This document defines and registers an sdfType "link" for the
   Semantic Definition Format (SDF) for Data and Interactions of Things
   (draft-ietf-asdf-sdf).

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-bormann-asdf-sdftype-link-02"/>
        </reference>
        <reference anchor="I-D.bormann-asdf-sdf-mapping">
          <front>
            <title>Semantic Definition Format (SDF): Mapping files</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <author fullname="Jan Romann" initials="J." surname="Romann">
              <organization>Universität Bremen</organization>
            </author>
            <date day="3" month="December" year="2023"/>
            <abstract>
              <t>   The Semantic Definition Format (SDF) is a format for domain experts
   to use in the creation and maintenance of data and interaction models
   that describe Things, i.e., physical objects that are available for
   interaction over a network.  It was created as a common language for
   use in the development of the One Data Model liaison organization
   (OneDM) definitions.  Tools convert this format to database formats
   and other serializations as needed.

   An SDF specification often needs to be augmented by additional
   information that is specific to its use in a particular ecosystem or
   application.  SDF mapping files provide a mechanism to represent this
   augmentation.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-bormann-asdf-sdf-mapping-03"/>
        </reference>
        <reference anchor="I-D.bormann-t2trg-deref-id">
          <front>
            <title>The "dereferenceable identifier" pattern</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <author fullname="Christian Amsüss" initials="C." surname="Amsüss">
         </author>
            <date day="19" month="December" year="2023"/>
            <abstract>
              <t>   In a protocol or an application environment, it is often important to
   be able to create unambiguous identifiers for some meaning (concept
   or some entity).

   Due to the simplicity of creating URIs, these have become popular for
   this purpose.  Beyond the purpose of identifiers to be uniquely
   associated with a meaning, some of these URIs are in principle
   _dereferenceable_, so something can be placed that can be retrieved
   when encountering such a URI.


   // The present -01 version is a stub to draw some attention to the
   // opportunity that this pattern would benefit from a common
   // description, documenting its benefits and pitfalls, and some
   // mitigations for the latter.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-bormann-t2trg-deref-id-02"/>
        </reference>
        <reference anchor="RFC9485">
          <front>
            <title>I-Regexp: An Interoperable Regular Expression Format</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <author fullname="T. Bray" initials="T." surname="Bray"/>
            <date month="October" year="2023"/>
            <abstract>
              <t>This document specifies I-Regexp, a flavor of regular expression that is limited in scope with the goal of interoperation across many different regular expression libraries.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9485"/>
          <seriesInfo name="DOI" value="10.17487/RFC9485"/>
        </reference>
        <reference anchor="I-D.ietf-jsonpath-base">
          <front>
            <title>JSONPath: Query expressions for JSON</title>
            <author fullname="Stefan Gössner" initials="S." surname="Gössner">
              <organization>Fachhochschule Dortmund</organization>
            </author>
            <author fullname="Glyn Normington" initials="G." surname="Normington">
         </author>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <date day="24" month="September" year="2023"/>
            <abstract>
              <t>   JSONPath defines a string syntax for selecting and extracting JSON
   (RFC 8259) values from a JSON value.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-jsonpath-base-21"/>
        </reference>
      </references>
    </references>
    <?line 1943?>

<section anchor="syntax">
      <name>Formal Syntax of SDF</name>
      <t>This appendix describes the syntax of SDF using CDDL <xref target="RFC8610"/>.</t>
      <t>This appendix shows the framework syntax only, i.e., a syntax with liberal extension points.
Since this syntax is nearly useless in finding typos in an SDF
specification, a second syntax, the validation syntax, is defined that
does not include the extension points.
The validation syntax can be generated from the framework syntax by
leaving out all lines containing the string <tt>EXTENSION-POINT</tt>; as this
is trivial, the result is not shown here.</t>
      <t>This appendix makes use of CDDL "features" as defined in <xref section="4" sectionFormat="of" target="RFC9165"/>.
Features whose names end in "-ext" indicate extension points for
further evolution.</t>
      <sourcecode type="cddl"><![CDATA[
start = sdf-syntax

sdf-syntax = {
 ; info will be required in most process policies
 ? info: sdfinfo
 ? namespace: named<text>
 ? defaultNamespace: text
 ; Thing is a composition of objects that work together in some way
 ? sdfThing: named<thingqualities>
 ; Object is a set of Properties, Actions, and Events that together
 ; perform a particular function
 ? sdfObject: named<objectqualities>
 ; Includes Properties, Actions, and Events as well as sdfData
 paedataqualities
 EXTENSION-POINT<"top-ext">
}

sdfinfo = {
 ? title: text
 ? description: text
 ? version: text
 ? copyright: text
 ? license: text
 ? modified: modified-date-time
 ? features: [
               * (any .feature "feature-name") ; EXTENSION-POINT
             ]
 optional-comment
 EXTENSION-POINT<"info-ext">
}

; Shortcut for a map that gives names to instances of X
; (has keys of type text and values of type X)
named<X> = { * text => X }

; EXTENSION-POINT is only used in framework syntax
EXTENSION-POINT<f> = ( * (quality-name .feature f) => any )
quality-name = text .regexp "([a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*"

sdf-pointer = global / same-object / true
global = text .regexp ".*[:#].*" ; rough CURIE or JSON Pointer syntax
same-object = referenceable-name
referenceable-name = text .regexp "[^:#]*"

; per se no point in having an empty list, but used for sdfRequired
; in odmobject-multiple_axis_joystick.sdf.json
pointer-list = [* sdf-pointer]

optional-comment = (
 ? $comment: text       ; source code comments only, no semantics
)

commonqualities = (
 ? description: text    ; long text (no constraints)
 ? label: text          ; short text (no constraints); default to key
 optional-comment
 ? sdfRef: sdf-pointer
 ; applies to qualities of properties, of data:
 ? sdfRequired: pointer-list
)

arraydefinitionqualities = (
 ? "minItems" => uint
 ? "maxItems" => uint
)

paedataqualities = (
 ; Property represents the state of an instance of an object
 ? sdfProperty: named<propertyqualities>
 ; Action invokes an application layer verb associated with an object
 ? sdfAction: named<actionqualities>
 ; Event represents an occurrence of event associated with an object
 ? sdfEvent: named<eventqualities>
 ; Data represents a piece of information that can be the state of a
 ; property or a parameter to an action or a signal in an event
 ? sdfData: named<dataqualities>

)

; for building hierarchy
thingqualities = {
 commonqualities
 ? sdfObject: named<objectqualities>
 ? sdfThing: named<thingqualities>
 paedataqualities
 arraydefinitionqualities
 EXTENSION-POINT<"thing-ext">
}

; for single objects, or for arrays of objects
objectqualities = {
 commonqualities
 paedataqualities
 arraydefinitionqualities
 EXTENSION-POINT<"object-ext">
}

parameter-list = dataqualities

actionqualities = {
 commonqualities
 ? sdfInputData: parameter-list   ; sdfRequiredInputData applies here
 ? sdfOutputData: parameter-list  ; sdfRequired applies here
 ; zero or more named data type definitions that might be used above
 ? sdfData: named<dataqualities>
 EXTENSION-POINT<"action-ext">
}

eventqualities = {
 commonqualities
 ? sdfOutputData: parameter-list  ; sdfRequired applies here
 ; zero or more named data type definitions that might be used above
 ? sdfData: named<dataqualities>
 EXTENSION-POINT<"event-ext">
}

sdftype-name = text .regexp "[a-z][-a-z0-9]*"       ; EXTENSION-POINT

dataqualities = {
 commonqualities
 jsonschema
 ? "unit" => text
 ? nullable: bool
 ? "sdfType" => "byte-string" / "unix-time"
            / (sdftype-name .feature "sdftype-ext") ; EXTENSION-POINT
 ? contentFormat: text
 EXTENSION-POINT<"data-ext">
}

propertyqualities = {
 ? observable: bool
 ? readable: bool
 ? writable: bool
 ~dataqualities
}

allowed-types = number / text / bool / null
              / [* number] / [* text] / [* bool]
              / {* text => any}
              / (any .feature "allowed-ext")        ; EXTENSION-POINT

compound-type = (
  "type" => "object"
  ? required: [+text]
  ? properties: named<dataqualities>
)

optional-choice = (
 ? (("sdfChoice" => named<dataqualities>)
  // ("enum" => [+ text])) ; limited to text strings
)

jsonschema = (
 ? (("type" => "number" / "string" / "boolean" / "integer" / "array")
    // compound-type
    // (type: text .feature "type-ext")             ; EXTENSION-POINT
   )
 ; if present, all other qualities apply to all choices:
 optional-choice
 ; the next three should validate against type:
 ? const: allowed-types
 ? default: allowed-types
 ; number/integer constraints
 ? minimum: number
 ? maximum: number
 ? exclusiveMinimum: number
 ? exclusiveMaximum: number
 ? multipleOf: number
 ; text string constraints
 ? minLength: uint
 ? maxLength: uint
 ? pattern: text                ; regexp
 ? format: "date-time" / "date" / "time"
           / "uri" / "uri-reference" / "uuid"
           / (text .feature "format-ext")           ; EXTENSION-POINT
 ; array constraints
 ? minItems: uint
 ? maxItems: uint
 ? uniqueItems: bool
 ? items: jso-items
)

jso-items = {
     ? sdfRef: sdf-pointer ; import limited to subset allowed here...
     ? description: text   ; long text (no constraints)
     optional-comment
     ; leave commonqualities out for non-complex data types,
     ; but need the above three.
     ; no further nesting: no "array"
     ? ((type: "number" / "string" / "boolean" / "integer")
        // compound-type
        // (type: text .feature "itemtype-ext")     ; EXTENSION-POINT
       )
     ; if present, all other qualities apply to all choices
     optional-choice
     ; jso subset
     ? minimum: number
     ? maximum: number
     ? format: text
     ? minLength: uint
     ? maxLength: uint
     EXTENSION-POINT<"items-ext">
   }

modified-date-time = text .abnf modified-dt-abnf
modified-dt-abnf = "modified-dt" .det rfc3339z

; RFC 3339 sans time-numoffset, slightly condensed
rfc3339z = '
   date-fullyear   = 4DIGIT
   date-month      = 2DIGIT  ; 01-12
   date-mday       = 2DIGIT  ; 01-28, 01-29, 01-30, 01-31 based on
                             ; month/year
   time-hour       = 2DIGIT  ; 00-23
   time-minute     = 2DIGIT  ; 00-59
   time-second     = 2DIGIT  ; 00-58, 00-59, 00-60 based on leap sec
                             ; rules
   time-secfrac    = "." 1*DIGIT
   DIGIT           =  %x30-39 ; 0-9

   partial-time    = time-hour ":" time-minute ":" time-second
                     [time-secfrac]
   full-date       = date-fullyear "-" date-month "-" date-mday

   modified-dt     = full-date ["T" partial-time "Z"]
'
]]></sourcecode>
    </section>
    <section anchor="jso">
      <name>json-schema.org Rendition of SDF Syntax</name>
      <t>This appendix describes the syntax of SDF defined in <xref target="syntax"/>, but
using a version of the description techniques advertised on
json-schema.org <xref target="JSO7"/> <xref target="JSO7V"/>.</t>
      <t>The appendix shows both the validation and the framework syntax.
Since most of the lines are the same between these two files, those lines are shown only once, with a leading space, in the form of a unified diff.
Lines leading with a <tt>-</tt> are part of the validation syntax, and lines leading with a <tt>+</tt> are part of the framework syntax.</t>
      <sourcecode type="jso.json"><![CDATA[
 {
-  "title": "sdf-validation.cddl -- Generated: 2024-02-29T07:42:35Z",
+  "title": "sdf-framework.cddl -- Generated: 2024-02-29T07:42:52Z",
   "$schema": "http://json-schema.org/draft-07/schema#",
   "$ref": "#/definitions/sdf-syntax",
   "definitions": {
     "sdf-syntax": {
       "type": "object",
       "properties": {
         "info": {
           "$ref": "#/definitions/sdfinfo"
         },
         "namespace": {
           "type": "object",
           "additionalProperties": {
             "type": "string"
           }
         },
         "defaultNamespace": {
           "type": "string"
         },
         "sdfThing": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/thingqualities"
           }
         },
         "sdfObject": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/objectqualities"
           }
         },
         "sdfProperty": {
           "$ref": "#/definitions/sdfProperty-"
         },
         "sdfAction": {
           "$ref": "#/definitions/sdfAction-"
         },
         "sdfEvent": {
           "$ref": "#/definitions/sdfEvent-"
         },
         "sdfData": {
           "$ref": "#/definitions/sdfData-sdfChoice-properties-"
         }
       },
+      "patternProperties": {
+        "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {
+        }
+      },
       "additionalProperties": false
     },
     "sdfinfo": {
       "type": "object",
       "properties": {
         "title": {
           "type": "string"
         },
         "description": {
           "type": "string"
         },
         "version": {
           "type": "string"
         },
         "copyright": {
           "type": "string"
         },
         "license": {
           "type": "string"
         },
         "modified": {
           "$ref": "#/definitions/modified-date-time"
         },
         "features": {
-          "type": "array",
-          "maxItems": 0
+          "type": "array"
         },
         "$comment": {
           "type": "string"
         }
       },
+      "patternProperties": {
+        "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {
+        }
+      },
       "additionalProperties": false
     },
     "modified-date-time": {
       "type": "string"
     },
     "thingqualities": {
       "type": "object",
       "properties": {
         "description": {
           "type": "string"
         },
         "label": {
           "type": "string"
         },
         "$comment": {
           "type": "string"
         },
         "sdfRef": {
           "$ref": "#/definitions/sdf-pointer"
         },
         "sdfRequired": {
           "$ref": "#/definitions/pointer-list"
         },
         "sdfObject": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/objectqualities"
           }
         },
         "sdfThing": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/thingqualities"
           }
         },
         "sdfProperty": {
           "$ref": "#/definitions/sdfProperty-"
         },
         "sdfAction": {
           "$ref": "#/definitions/sdfAction-"
         },
         "sdfEvent": {
           "$ref": "#/definitions/sdfEvent-"
         },
         "sdfData": {
           "$ref": "#/definitions/sdfData-sdfChoice-properties-"
         },
         "minItems": {
           "$ref": "#/definitions/uint"
         },
         "maxItems": {
           "$ref": "#/definitions/uint"
         }
       },
+      "patternProperties": {
+        "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {
+        }
+      },
       "additionalProperties": false
     },
     "sdf-pointer": {
       "anyOf": [
         {
           "$ref": "#/definitions/global"
         },
         {
           "$ref": "#/definitions/same-object"
         },
         {
           "$ref": "#/definitions/true"
         }
       ]
     },
     "global": {
       "type": "string",
       "pattern": "^[^\\n\\r]*[:#][^\\n\\r]*$"
     },
     "same-object": {
       "$ref": "#/definitions/referenceable-name"
     },
     "referenceable-name": {
       "type": "string",
       "pattern": "^[^:#]*$"
     },
     "true": {
       "type": "boolean",
       "const": true
     },
     "pointer-list": {
       "type": "array",
       "items": {
         "$ref": "#/definitions/sdf-pointer"
       }
     },
     "objectqualities": {
       "type": "object",
       "properties": {
         "description": {
           "type": "string"
         },
         "label": {
           "type": "string"
         },
         "$comment": {
           "type": "string"
         },
         "sdfRef": {
           "$ref": "#/definitions/sdf-pointer"
         },
         "sdfRequired": {
           "$ref": "#/definitions/pointer-list"
         },
         "sdfProperty": {
           "$ref": "#/definitions/sdfProperty-"
         },
         "sdfAction": {
           "$ref": "#/definitions/sdfAction-"
         },
         "sdfEvent": {
           "$ref": "#/definitions/sdfEvent-"
         },
         "sdfData": {
           "$ref": "#/definitions/sdfData-sdfChoice-properties-"
         },
         "minItems": {
           "$ref": "#/definitions/uint"
         },
         "maxItems": {
           "$ref": "#/definitions/uint"
         }
       },
+      "patternProperties": {
+        "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {
+        }
+      },
       "additionalProperties": false
     },
     "propertyqualities": {
       "anyOf": [
         {
           "type": "object",
+          "patternProperties": {
+            "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {
+            }
+          },
           "properties": {
             "type": {
               "$ref": "#/definitions/type-"
             },
             "sdfChoice": {
               "$ref": "#/definitions/sdfData-sdfChoice-properties-"
             },
             "observable": {
               "type": "boolean"
             },
             "readable": {
               "type": "boolean"
             },
             "writable": {
               "type": "boolean"
             },
             "description": {
               "type": "string"
             },
             "label": {
               "type": "string"
             },
             "$comment": {
               "type": "string"
             },
             "sdfRef": {
               "$ref": "#/definitions/sdf-pointer"
             },
             "sdfRequired": {
               "$ref": "#/definitions/pointer-list"
             },
             "const": {
               "$ref": "#/definitions/allowed-types"
             },
             "default": {
               "$ref": "#/definitions/allowed-types"
             },
             "minimum": {
               "type": "number"
             },
             "maximum": {
               "type": "number"
             },
             "exclusiveMinimum": {
               "type": "number"
             },
             "exclusiveMaximum": {
               "type": "number"
             },
             "multipleOf": {
               "type": "number"
             },
             "minLength": {
               "$ref": "#/definitions/uint"
             },
             "maxLength": {
               "$ref": "#/definitions/uint"
             },
             "pattern": {
               "type": "string"
             },
             "format": {
               "$ref": "#/definitions/format-"
             },
             "minItems": {
               "$ref": "#/definitions/uint"
             },
             "maxItems": {
               "$ref": "#/definitions/uint"
             },
             "uniqueItems": {
               "type": "boolean"
             },
             "items": {
               "$ref": "#/definitions/jso-items"
             },
             "unit": {
               "type": "string"
             },
             "nullable": {
               "type": "boolean"
             },
             "sdfType": {
               "$ref": "#/definitions/sdfType-"
             },
             "contentFormat": {
               "type": "string"
             }
           },
           "additionalProperties": false
         },
         {
           "type": "object",
+          "patternProperties": {
+            "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {
+            }
+          },
+          "properties": {
+            "type": {
+              "type": "string",
+              "const": "object"
+            },
+            "required": {
+              "type": "array",
+              "items": {
+                "type": "string"
+              },
+              "minItems": 1
+            },
+            "properties": {
+              "$ref": "#/definitions/sdfData-sdfChoice-properties-"
+            },
+            "sdfChoice": {
+              "$ref": "#/definitions/sdfData-sdfChoice-properties-"
+            },
+            "observable": {
+              "type": "boolean"
+            },
+            "readable": {
+              "type": "boolean"
+            },
+            "writable": {
+              "type": "boolean"
+            },
+            "description": {
+              "type": "string"
+            },
+            "label": {
+              "type": "string"
+            },
+            "$comment": {
+              "type": "string"
+            },
+            "sdfRef": {
+              "$ref": "#/definitions/sdf-pointer"
+            },
+            "sdfRequired": {
+              "$ref": "#/definitions/pointer-list"
+            },
+            "const": {
+              "$ref": "#/definitions/allowed-types"
+            },
+            "default": {
+              "$ref": "#/definitions/allowed-types"
+            },
+            "minimum": {
+              "type": "number"
+            },
+            "maximum": {
+              "type": "number"
+            },
+            "exclusiveMinimum": {
+              "type": "number"
+            },
+            "exclusiveMaximum": {
+              "type": "number"
+            },
+            "multipleOf": {
+              "type": "number"
+            },
+            "minLength": {
+              "$ref": "#/definitions/uint"
+            },
+            "maxLength": {
+              "$ref": "#/definitions/uint"
+            },
+            "pattern": {
+              "type": "string"
+            },
+            "format": {
+              "$ref": "#/definitions/format-"
+            },
+            "minItems": {
+              "$ref": "#/definitions/uint"
+            },
+            "maxItems": {
+              "$ref": "#/definitions/uint"
+            },
+            "uniqueItems": {
+              "type": "boolean"
+            },
+            "items": {
+              "$ref": "#/definitions/jso-items"
+            },
+            "unit": {
+              "type": "string"
+            },
+            "nullable": {
+              "type": "boolean"
+            },
+            "sdfType": {
+              "$ref": "#/definitions/sdfType-"
+            },
+            "contentFormat": {
+              "type": "string"
+            }
+          },
+          "additionalProperties": false
+        },
+        {
+          "type": "object",
+          "patternProperties": {
+            "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {
+            }
+          },
+          "properties": {
+            "type": {
+              "type": "string"
+            },
+            "sdfChoice": {
+              "$ref": "#/definitions/sdfData-sdfChoice-properties-"
+            },
+            "observable": {
+              "type": "boolean"
+            },
+            "readable": {
+              "type": "boolean"
+            },
+            "writable": {
+              "type": "boolean"
+            },
+            "description": {
+              "type": "string"
+            },
+            "label": {
+              "type": "string"
+            },
+            "$comment": {
+              "type": "string"
+            },
+            "sdfRef": {
+              "$ref": "#/definitions/sdf-pointer"
+            },
+            "sdfRequired": {
+              "$ref": "#/definitions/pointer-list"
+            },
+            "const": {
+              "$ref": "#/definitions/allowed-types"
+            },
+            "default": {
+              "$ref": "#/definitions/allowed-types"
+            },
+            "minimum": {
+              "type": "number"
+            },
+            "maximum": {
+              "type": "number"
+            },
+            "exclusiveMinimum": {
+              "type": "number"
+            },
+            "exclusiveMaximum": {
+              "type": "number"
+            },
+            "multipleOf": {
+              "type": "number"
+            },
+            "minLength": {
+              "$ref": "#/definitions/uint"
+            },
+            "maxLength": {
+              "$ref": "#/definitions/uint"
+            },
+            "pattern": {
+              "type": "string"
+            },
+            "format": {
+              "$ref": "#/definitions/format-"
+            },
+            "minItems": {
+              "$ref": "#/definitions/uint"
+            },
+            "maxItems": {
+              "$ref": "#/definitions/uint"
+            },
+            "uniqueItems": {
+              "type": "boolean"
+            },
+            "items": {
+              "$ref": "#/definitions/jso-items"
+            },
+            "unit": {
+              "type": "string"
+            },
+            "nullable": {
+              "type": "boolean"
+            },
+            "sdfType": {
+              "$ref": "#/definitions/sdfType-"
+            },
+            "contentFormat": {
+              "type": "string"
+            }
+          },
+          "additionalProperties": false
+        },
+        {
+          "type": "object",
+          "patternProperties": {
+            "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {
+            }
+          },
+          "properties": {
+            "type": {
+              "$ref": "#/definitions/type-"
+            },
+            "enum": {
+              "type": "array",
+              "items": {
+                "type": "string"
+              },
+              "minItems": 1
+            },
+            "observable": {
+              "type": "boolean"
+            },
+            "readable": {
+              "type": "boolean"
+            },
+            "writable": {
+              "type": "boolean"
+            },
+            "description": {
+              "type": "string"
+            },
+            "label": {
+              "type": "string"
+            },
+            "$comment": {
+              "type": "string"
+            },
+            "sdfRef": {
+              "$ref": "#/definitions/sdf-pointer"
+            },
+            "sdfRequired": {
+              "$ref": "#/definitions/pointer-list"
+            },
+            "const": {
+              "$ref": "#/definitions/allowed-types"
+            },
+            "default": {
+              "$ref": "#/definitions/allowed-types"
+            },
+            "minimum": {
+              "type": "number"
+            },
+            "maximum": {
+              "type": "number"
+            },
+            "exclusiveMinimum": {
+              "type": "number"
+            },
+            "exclusiveMaximum": {
+              "type": "number"
+            },
+            "multipleOf": {
+              "type": "number"
+            },
+            "minLength": {
+              "$ref": "#/definitions/uint"
+            },
+            "maxLength": {
+              "$ref": "#/definitions/uint"
+            },
+            "pattern": {
+              "type": "string"
+            },
+            "format": {
+              "$ref": "#/definitions/format-"
+            },
+            "minItems": {
+              "$ref": "#/definitions/uint"
+            },
+            "maxItems": {
+              "$ref": "#/definitions/uint"
+            },
+            "uniqueItems": {
+              "type": "boolean"
+            },
+            "items": {
+              "$ref": "#/definitions/jso-items"
+            },
+            "unit": {
+              "type": "string"
+            },
+            "nullable": {
+              "type": "boolean"
+            },
+            "sdfType": {
+              "$ref": "#/definitions/sdfType-"
+            },
+            "contentFormat": {
+              "type": "string"
+            }
+          },
+          "additionalProperties": false
+        },
+        {
+          "type": "object",
+          "patternProperties": {
+            "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {
+            }
+          },
+          "properties": {
+            "type": {
+              "type": "string",
+              "const": "object"
+            },
+            "required": {
+              "type": "array",
+              "items": {
+                "type": "string"
+              },
+              "minItems": 1
+            },
+            "properties": {
+              "$ref": "#/definitions/sdfData-sdfChoice-properties-"
+            },
+            "enum": {
+              "type": "array",
+              "items": {
+                "type": "string"
+              },
+              "minItems": 1
+            },
+            "observable": {
+              "type": "boolean"
+            },
+            "readable": {
+              "type": "boolean"
+            },
+            "writable": {
+              "type": "boolean"
+            },
+            "description": {
+              "type": "string"
+            },
+            "label": {
+              "type": "string"
+            },
+            "$comment": {
+              "type": "string"
+            },
+            "sdfRef": {
+              "$ref": "#/definitions/sdf-pointer"
+            },
+            "sdfRequired": {
+              "$ref": "#/definitions/pointer-list"
+            },
+            "const": {
+              "$ref": "#/definitions/allowed-types"
+            },
+            "default": {
+              "$ref": "#/definitions/allowed-types"
+            },
+            "minimum": {
+              "type": "number"
+            },
+            "maximum": {
+              "type": "number"
+            },
+            "exclusiveMinimum": {
+              "type": "number"
+            },
+            "exclusiveMaximum": {
+              "type": "number"
+            },
+            "multipleOf": {
+              "type": "number"
+            },
+            "minLength": {
+              "$ref": "#/definitions/uint"
+            },
+            "maxLength": {
+              "$ref": "#/definitions/uint"
+            },
+            "pattern": {
+              "type": "string"
+            },
+            "format": {
+              "$ref": "#/definitions/format-"
+            },
+            "minItems": {
+              "$ref": "#/definitions/uint"
+            },
+            "maxItems": {
+              "$ref": "#/definitions/uint"
+            },
+            "uniqueItems": {
+              "type": "boolean"
+            },
+            "items": {
+              "$ref": "#/definitions/jso-items"
+            },
+            "unit": {
+              "type": "string"
+            },
+            "nullable": {
+              "type": "boolean"
+            },
+            "sdfType": {
+              "$ref": "#/definitions/sdfType-"
+            },
+            "contentFormat": {
+              "type": "string"
+            }
+          },
+          "additionalProperties": false
+        },
+        {
+          "type": "object",
+          "patternProperties": {
+            "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {
+            }
+          },
           "properties": {
             "type": {
-              "type": "string",
-              "const": "object"
+              "type": "string"
             },
-            "required": {
+            "enum": {
               "type": "array",
               "items": {
                 "type": "string"
               },
               "minItems": 1
             },
-            "properties": {
-              "$ref": "#/definitions/sdfData-sdfChoice-properties-"
-            },
-            "sdfChoice": {
-              "$ref": "#/definitions/sdfData-sdfChoice-properties-"
-            },
             "observable": {
               "type": "boolean"
             },
             "readable": {
               "type": "boolean"
             },
             "writable": {
               "type": "boolean"
             },
             "description": {
               "type": "string"
             },
             "label": {
               "type": "string"
             },
             "$comment": {
               "type": "string"
             },
             "sdfRef": {
               "$ref": "#/definitions/sdf-pointer"
             },
             "sdfRequired": {
               "$ref": "#/definitions/pointer-list"
             },
             "const": {
               "$ref": "#/definitions/allowed-types"
             },
             "default": {
               "$ref": "#/definitions/allowed-types"
             },
             "minimum": {
               "type": "number"
             },
             "maximum": {
               "type": "number"
             },
             "exclusiveMinimum": {
               "type": "number"
             },
             "exclusiveMaximum": {
               "type": "number"
             },
             "multipleOf": {
               "type": "number"
             },
             "minLength": {
               "$ref": "#/definitions/uint"
             },
             "maxLength": {
               "$ref": "#/definitions/uint"
             },
             "pattern": {
               "type": "string"
             },
             "format": {
               "$ref": "#/definitions/format-"
             },
             "minItems": {
               "$ref": "#/definitions/uint"
             },
             "maxItems": {
               "$ref": "#/definitions/uint"
             },
             "uniqueItems": {
               "type": "boolean"
             },
             "items": {
               "$ref": "#/definitions/jso-items"
             },
             "unit": {
               "type": "string"
             },
             "nullable": {
               "type": "boolean"
             },
             "sdfType": {
               "$ref": "#/definitions/sdfType-"
             },
             "contentFormat": {
               "type": "string"
             }
           },
           "additionalProperties": false
-        },
+        }
+      ]
+    },
+    "dataqualities": {
+      "anyOf": [
         {
           "type": "object",
+          "patternProperties": {
+            "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {
+            }
+          },
           "properties": {
             "type": {
               "$ref": "#/definitions/type-"
             },
-            "enum": {
-              "type": "array",
-              "items": {
-                "type": "string"
-              },
-              "minItems": 1
-            },
-            "observable": {
-              "type": "boolean"
-            },
-            "readable": {
-              "type": "boolean"
-            },
-            "writable": {
-              "type": "boolean"
+            "sdfChoice": {
+              "$ref": "#/definitions/sdfData-sdfChoice-properties-"
             },
             "description": {
               "type": "string"
             },
             "label": {
               "type": "string"
             },
             "$comment": {
               "type": "string"
             },
             "sdfRef": {
               "$ref": "#/definitions/sdf-pointer"
             },
             "sdfRequired": {
               "$ref": "#/definitions/pointer-list"
             },
             "const": {
               "$ref": "#/definitions/allowed-types"
             },
             "default": {
               "$ref": "#/definitions/allowed-types"
             },
             "minimum": {
               "type": "number"
             },
             "maximum": {
               "type": "number"
             },
             "exclusiveMinimum": {
               "type": "number"
             },
             "exclusiveMaximum": {
               "type": "number"
             },
             "multipleOf": {
               "type": "number"
             },
             "minLength": {
               "$ref": "#/definitions/uint"
             },
             "maxLength": {
               "$ref": "#/definitions/uint"
             },
             "pattern": {
               "type": "string"
             },
             "format": {
               "$ref": "#/definitions/format-"
             },
             "minItems": {
               "$ref": "#/definitions/uint"
             },
             "maxItems": {
               "$ref": "#/definitions/uint"
             },
             "uniqueItems": {
               "type": "boolean"
             },
             "items": {
               "$ref": "#/definitions/jso-items"
             },
             "unit": {
               "type": "string"
             },
             "nullable": {
               "type": "boolean"
             },
             "sdfType": {
               "$ref": "#/definitions/sdfType-"
             },
             "contentFormat": {
               "type": "string"
             }
           },
           "additionalProperties": false
         },
         {
           "type": "object",
+          "patternProperties": {
+            "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {
+            }
+          },
           "properties": {
             "type": {
               "type": "string",
               "const": "object"
             },
             "required": {
               "type": "array",
               "items": {
                 "type": "string"
               },
               "minItems": 1
             },
             "properties": {
               "$ref": "#/definitions/sdfData-sdfChoice-properties-"
             },
-            "enum": {
-              "type": "array",
-              "items": {
-                "type": "string"
-              },
-              "minItems": 1
-            },
-            "observable": {
-              "type": "boolean"
-            },
-            "readable": {
-              "type": "boolean"
-            },
-            "writable": {
-              "type": "boolean"
+            "sdfChoice": {
+              "$ref": "#/definitions/sdfData-sdfChoice-properties-"
             },
             "description": {
               "type": "string"
             },
             "label": {
               "type": "string"
             },
             "$comment": {
               "type": "string"
             },
             "sdfRef": {
               "$ref": "#/definitions/sdf-pointer"
             },
             "sdfRequired": {
               "$ref": "#/definitions/pointer-list"
             },
             "const": {
               "$ref": "#/definitions/allowed-types"
             },
             "default": {
               "$ref": "#/definitions/allowed-types"
             },
             "minimum": {
               "type": "number"
             },
             "maximum": {
               "type": "number"
             },
             "exclusiveMinimum": {
               "type": "number"
             },
             "exclusiveMaximum": {
               "type": "number"
             },
             "multipleOf": {
               "type": "number"
             },
             "minLength": {
               "$ref": "#/definitions/uint"
             },
             "maxLength": {
               "$ref": "#/definitions/uint"
             },
             "pattern": {
               "type": "string"
             },
             "format": {
               "$ref": "#/definitions/format-"
             },
             "minItems": {
               "$ref": "#/definitions/uint"
             },
             "maxItems": {
               "$ref": "#/definitions/uint"
             },
             "uniqueItems": {
               "type": "boolean"
             },
             "items": {
               "$ref": "#/definitions/jso-items"
             },
             "unit": {
               "type": "string"
             },
             "nullable": {
               "type": "boolean"
             },
             "sdfType": {
               "$ref": "#/definitions/sdfType-"
             },
             "contentFormat": {
               "type": "string"
             }
           },
           "additionalProperties": false
-        }
-      ]
-    },
-    "dataqualities": {
-      "anyOf": [
+        },
         {
           "type": "object",
+          "patternProperties": {
+            "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {
+            }
+          },
           "properties": {
             "type": {
-              "$ref": "#/definitions/type-"
+              "type": "string"
             },
             "sdfChoice": {
               "$ref": "#/definitions/sdfData-sdfChoice-properties-"
             },
             "description": {
               "type": "string"
             },
             "label": {
               "type": "string"
             },
             "$comment": {
               "type": "string"
             },
             "sdfRef": {
               "$ref": "#/definitions/sdf-pointer"
             },
             "sdfRequired": {
               "$ref": "#/definitions/pointer-list"
             },
             "const": {
               "$ref": "#/definitions/allowed-types"
             },
             "default": {
               "$ref": "#/definitions/allowed-types"
             },
             "minimum": {
               "type": "number"
             },
             "maximum": {
               "type": "number"
             },
             "exclusiveMinimum": {
               "type": "number"
             },
             "exclusiveMaximum": {
               "type": "number"
             },
             "multipleOf": {
               "type": "number"
             },
             "minLength": {
               "$ref": "#/definitions/uint"
             },
             "maxLength": {
               "$ref": "#/definitions/uint"
             },
             "pattern": {
               "type": "string"
             },
             "format": {
               "$ref": "#/definitions/format-"
             },
             "minItems": {
               "$ref": "#/definitions/uint"
             },
             "maxItems": {
               "$ref": "#/definitions/uint"
             },
             "uniqueItems": {
               "type": "boolean"
             },
             "items": {
               "$ref": "#/definitions/jso-items"
             },
             "unit": {
               "type": "string"
             },
             "nullable": {
               "type": "boolean"
             },
             "sdfType": {
               "$ref": "#/definitions/sdfType-"
             },
             "contentFormat": {
               "type": "string"
             }
           },
           "additionalProperties": false
         },
         {
           "type": "object",
+          "patternProperties": {
+            "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {
+            }
+          },
           "properties": {
             "type": {
-              "type": "string",
-              "const": "object"
+              "$ref": "#/definitions/type-"
             },
-            "required": {
+            "enum": {
               "type": "array",
               "items": {
                 "type": "string"
               },
               "minItems": 1
             },
-            "properties": {
-              "$ref": "#/definitions/sdfData-sdfChoice-properties-"
-            },
-            "sdfChoice": {
-              "$ref": "#/definitions/sdfData-sdfChoice-properties-"
-            },
             "description": {
               "type": "string"
             },
             "label": {
               "type": "string"
             },
             "$comment": {
               "type": "string"
             },
             "sdfRef": {
               "$ref": "#/definitions/sdf-pointer"
             },
             "sdfRequired": {
               "$ref": "#/definitions/pointer-list"
             },
             "const": {
               "$ref": "#/definitions/allowed-types"
             },
             "default": {
               "$ref": "#/definitions/allowed-types"
             },
             "minimum": {
               "type": "number"
             },
             "maximum": {
               "type": "number"
             },
             "exclusiveMinimum": {
               "type": "number"
             },
             "exclusiveMaximum": {
               "type": "number"
             },
             "multipleOf": {
               "type": "number"
             },
             "minLength": {
               "$ref": "#/definitions/uint"
             },
             "maxLength": {
               "$ref": "#/definitions/uint"
             },
             "pattern": {
               "type": "string"
             },
             "format": {
               "$ref": "#/definitions/format-"
             },
             "minItems": {
               "$ref": "#/definitions/uint"
             },
             "maxItems": {
               "$ref": "#/definitions/uint"
             },
             "uniqueItems": {
               "type": "boolean"
             },
             "items": {
               "$ref": "#/definitions/jso-items"
             },
             "unit": {
               "type": "string"
             },
             "nullable": {
               "type": "boolean"
             },
             "sdfType": {
               "$ref": "#/definitions/sdfType-"
             },
             "contentFormat": {
               "type": "string"
             }
           },
           "additionalProperties": false
         },
         {
           "type": "object",
+          "patternProperties": {
+            "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {
+            }
+          },
           "properties": {
             "type": {
-              "$ref": "#/definitions/type-"
+              "type": "string",
+              "const": "object"
+            },
+            "required": {
+              "type": "array",
+              "items": {
+                "type": "string"
+              },
+              "minItems": 1
+            },
+            "properties": {
+              "$ref": "#/definitions/sdfData-sdfChoice-properties-"
             },
             "enum": {
               "type": "array",
               "items": {
                 "type": "string"
               },
               "minItems": 1
             },
             "description": {
               "type": "string"
             },
             "label": {
               "type": "string"
             },
             "$comment": {
               "type": "string"
             },
             "sdfRef": {
               "$ref": "#/definitions/sdf-pointer"
             },
             "sdfRequired": {
               "$ref": "#/definitions/pointer-list"
             },
             "const": {
               "$ref": "#/definitions/allowed-types"
             },
             "default": {
               "$ref": "#/definitions/allowed-types"
             },
             "minimum": {
               "type": "number"
             },
             "maximum": {
               "type": "number"
             },
             "exclusiveMinimum": {
               "type": "number"
             },
             "exclusiveMaximum": {
               "type": "number"
             },
             "multipleOf": {
               "type": "number"
             },
             "minLength": {
               "$ref": "#/definitions/uint"
             },
             "maxLength": {
               "$ref": "#/definitions/uint"
             },
             "pattern": {
               "type": "string"
             },
             "format": {
               "$ref": "#/definitions/format-"
             },
             "minItems": {
               "$ref": "#/definitions/uint"
             },
             "maxItems": {
               "$ref": "#/definitions/uint"
             },
             "uniqueItems": {
               "type": "boolean"
             },
             "items": {
               "$ref": "#/definitions/jso-items"
             },
             "unit": {
               "type": "string"
             },
             "nullable": {
               "type": "boolean"
             },
             "sdfType": {
               "$ref": "#/definitions/sdfType-"
             },
             "contentFormat": {
               "type": "string"
             }
           },
           "additionalProperties": false
         },
         {
           "type": "object",
+          "patternProperties": {
+            "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {
+            }
+          },
           "properties": {
             "type": {
-              "type": "string",
-              "const": "object"
-            },
-            "required": {
-              "type": "array",
-              "items": {
-                "type": "string"
-              },
-              "minItems": 1
-            },
-            "properties": {
-              "$ref": "#/definitions/sdfData-sdfChoice-properties-"
+              "type": "string"
             },
             "enum": {
               "type": "array",
               "items": {
                 "type": "string"
               },
               "minItems": 1
             },
             "description": {
               "type": "string"
             },
             "label": {
               "type": "string"
             },
             "$comment": {
               "type": "string"
             },
             "sdfRef": {
               "$ref": "#/definitions/sdf-pointer"
             },
             "sdfRequired": {
               "$ref": "#/definitions/pointer-list"
             },
             "const": {
               "$ref": "#/definitions/allowed-types"
             },
             "default": {
               "$ref": "#/definitions/allowed-types"
             },
             "minimum": {
               "type": "number"
             },
             "maximum": {
               "type": "number"
             },
             "exclusiveMinimum": {
               "type": "number"
             },
             "exclusiveMaximum": {
               "type": "number"
             },
             "multipleOf": {
               "type": "number"
             },
             "minLength": {
               "$ref": "#/definitions/uint"
             },
             "maxLength": {
               "$ref": "#/definitions/uint"
             },
             "pattern": {
               "type": "string"
             },
             "format": {
               "$ref": "#/definitions/format-"
             },
             "minItems": {
               "$ref": "#/definitions/uint"
             },
             "maxItems": {
               "$ref": "#/definitions/uint"
             },
             "uniqueItems": {
               "type": "boolean"
             },
             "items": {
               "$ref": "#/definitions/jso-items"
             },
             "unit": {
               "type": "string"
             },
             "nullable": {
               "type": "boolean"
             },
             "sdfType": {
               "$ref": "#/definitions/sdfType-"
             },
             "contentFormat": {
               "type": "string"
             }
           },
           "additionalProperties": false
         }
       ]
     },
     "allowed-types": {
       "anyOf": [
         {
           "type": "number"
         },
         {
           "type": "string"
         },
         {
           "type": "boolean"
         },
         {
           "type": "null"
         },
         {
           "type": "array",
           "items": {
             "type": "number"
           }
         },
         {
           "type": "array",
           "items": {
             "type": "string"
           }
         },
         {
           "type": "array",
           "items": {
             "type": "boolean"
           }
         },
         {
           "type": "object",
           "additionalProperties": {
           }
+        },
+        {
         }
       ]
     },
     "uint": {
       "type": "integer",
       "minimum": 0
     },
     "jso-items": {
       "anyOf": [
         {
           "type": "object",
+          "patternProperties": {
+            "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {
+            }
+          },
           "properties": {
             "type": {
               "type": "string",
               "enum": [
                 "number",
                 "string",
                 "boolean",
                 "integer"
               ]
             },
             "sdfChoice": {
               "$ref": "#/definitions/sdfData-sdfChoice-properties-"
             },
             "sdfRef": {
               "$ref": "#/definitions/sdf-pointer"
             },
             "description": {
               "type": "string"
             },
             "$comment": {
               "type": "string"
             },
             "minimum": {
               "type": "number"
             },
             "maximum": {
               "type": "number"
             },
             "format": {
               "type": "string"
             },
             "minLength": {
               "$ref": "#/definitions/uint"
             },
             "maxLength": {
               "$ref": "#/definitions/uint"
             }
           },
           "additionalProperties": false
         },
         {
           "type": "object",
+          "patternProperties": {
+            "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {
+            }
+          },
           "properties": {
             "type": {
               "type": "string",
               "const": "object"
             },
             "required": {
               "type": "array",
               "items": {
                 "type": "string"
               },
               "minItems": 1
             },
             "properties": {
               "$ref": "#/definitions/sdfData-sdfChoice-properties-"
             },
             "sdfChoice": {
               "$ref": "#/definitions/sdfData-sdfChoice-properties-"
             },
             "sdfRef": {
               "$ref": "#/definitions/sdf-pointer"
             },
             "description": {
               "type": "string"
             },
             "$comment": {
               "type": "string"
             },
             "minimum": {
               "type": "number"
             },
             "maximum": {
               "type": "number"
             },
             "format": {
               "type": "string"
             },
             "minLength": {
               "$ref": "#/definitions/uint"
             },
             "maxLength": {
               "$ref": "#/definitions/uint"
             }
           },
           "additionalProperties": false
         },
         {
           "type": "object",
+          "patternProperties": {
+            "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {
+            }
+          },
+          "properties": {
+            "type": {
+              "type": "string"
+            },
+            "sdfChoice": {
+              "$ref": "#/definitions/sdfData-sdfChoice-properties-"
+            },
+            "sdfRef": {
+              "$ref": "#/definitions/sdf-pointer"
+            },
+            "description": {
+              "type": "string"
+            },
+            "$comment": {
+              "type": "string"
+            },
+            "minimum": {
+              "type": "number"
+            },
+            "maximum": {
+              "type": "number"
+            },
+            "format": {
+              "type": "string"
+            },
+            "minLength": {
+              "$ref": "#/definitions/uint"
+            },
+            "maxLength": {
+              "$ref": "#/definitions/uint"
+            }
+          },
+          "additionalProperties": false
+        },
+        {
+          "type": "object",
+          "patternProperties": {
+            "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {
+            }
+          },
           "properties": {
             "type": {
               "type": "string",
               "enum": [
                 "number",
                 "string",
                 "boolean",
                 "integer"
               ]
             },
             "enum": {
               "type": "array",
               "items": {
                 "type": "string"
               },
               "minItems": 1
             },
             "sdfRef": {
               "$ref": "#/definitions/sdf-pointer"
             },
             "description": {
               "type": "string"
             },
             "$comment": {
               "type": "string"
             },
             "minimum": {
               "type": "number"
             },
             "maximum": {
               "type": "number"
             },
             "format": {
               "type": "string"
             },
             "minLength": {
               "$ref": "#/definitions/uint"
             },
             "maxLength": {
               "$ref": "#/definitions/uint"
             }
           },
           "additionalProperties": false
         },
         {
           "type": "object",
+          "patternProperties": {
+            "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {
+            }
+          },
           "properties": {
             "type": {
               "type": "string",
               "const": "object"
             },
             "required": {
               "type": "array",
               "items": {
                 "type": "string"
               },
               "minItems": 1
             },
             "properties": {
               "$ref": "#/definitions/sdfData-sdfChoice-properties-"
             },
             "enum": {
               "type": "array",
               "items": {
                 "type": "string"
               },
               "minItems": 1
             },
             "sdfRef": {
               "$ref": "#/definitions/sdf-pointer"
             },
             "description": {
               "type": "string"
             },
             "$comment": {
               "type": "string"
             },
             "minimum": {
               "type": "number"
             },
             "maximum": {
               "type": "number"
             },
             "format": {
               "type": "string"
             },
             "minLength": {
               "$ref": "#/definitions/uint"
             },
             "maxLength": {
               "$ref": "#/definitions/uint"
             }
           },
           "additionalProperties": false
+        },
+        {
+          "type": "object",
+          "patternProperties": {
+            "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {
+            }
+          },
+          "properties": {
+            "type": {
+              "type": "string"
+            },
+            "enum": {
+              "type": "array",
+              "items": {
+                "type": "string"
+              },
+              "minItems": 1
+            },
+            "sdfRef": {
+              "$ref": "#/definitions/sdf-pointer"
+            },
+            "description": {
+              "type": "string"
+            },
+            "$comment": {
+              "type": "string"
+            },
+            "minimum": {
+              "type": "number"
+            },
+            "maximum": {
+              "type": "number"
+            },
+            "format": {
+              "type": "string"
+            },
+            "minLength": {
+              "$ref": "#/definitions/uint"
+            },
+            "maxLength": {
+              "$ref": "#/definitions/uint"
+            }
+          },
+          "additionalProperties": false
         }
       ]
     },
+    "sdftype-name": {
+      "type": "string",
+      "pattern": "^[a-z][\\-a-z0-9]*$"
+    },
     "actionqualities": {
       "type": "object",
       "properties": {
         "description": {
           "type": "string"
         },
         "label": {
           "type": "string"
         },
         "$comment": {
           "type": "string"
         },
         "sdfRef": {
           "$ref": "#/definitions/sdf-pointer"
         },
         "sdfRequired": {
           "$ref": "#/definitions/pointer-list"
         },
         "sdfInputData": {
           "$ref": "#/definitions/parameter-list"
         },
         "sdfOutputData": {
           "$ref": "#/definitions/parameter-list"
         },
         "sdfData": {
           "$ref": "#/definitions/sdfData-sdfChoice-properties-"
         }
       },
+      "patternProperties": {
+        "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {
+        }
+      },
       "additionalProperties": false
     },
     "parameter-list": {
       "$ref": "#/definitions/dataqualities"
     },
     "eventqualities": {
       "type": "object",
       "properties": {
         "description": {
           "type": "string"
         },
         "label": {
           "type": "string"
         },
         "$comment": {
           "type": "string"
         },
         "sdfRef": {
           "$ref": "#/definitions/sdf-pointer"
         },
         "sdfRequired": {
           "$ref": "#/definitions/pointer-list"
         },
         "sdfOutputData": {
           "$ref": "#/definitions/parameter-list"
         },
         "sdfData": {
           "$ref": "#/definitions/sdfData-sdfChoice-properties-"
         }
       },
+      "patternProperties": {
+        "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {
+        }
+      },
       "additionalProperties": false
     },
     "format-": {
-      "type": "string",
-      "enum": [
-        "date-time",
-        "date",
-        "time",
-        "uri",
-        "uri-reference",
-        "uuid"
+      "anyOf": [
+        {
+          "type": "string",
+          "const": "date-time"
+        },
+        {
+          "type": "string",
+          "const": "date"
+        },
+        {
+          "type": "string",
+          "const": "time"
+        },
+        {
+          "type": "string",
+          "const": "uri"
+        },
+        {
+          "type": "string",
+          "const": "uri-reference"
+        },
+        {
+          "type": "string",
+          "const": "uuid"
+        },
+        {
+          "type": "string"
+        }
+      ]
+    },
+    "sdfType-": {
+      "anyOf": [
+        {
+          "type": "string",
+          "const": "byte-string"
+        },
+        {
+          "type": "string",
+          "const": "unix-time"
+        },
+        {
+          "$ref": "#/definitions/sdftype-name"
+        }
       ]
     },
     "sdfData-sdfChoice-properties-": {
       "type": "object",
       "additionalProperties": {
         "$ref": "#/definitions/dataqualities"
       }
     },
     "type-": {
       "type": "string",
       "enum": [
         "number",
         "string",
         "boolean",
         "integer",
         "array"
       ]
     },
-    "sdfAction-": {
+    "sdfEvent-": {
       "type": "object",
       "additionalProperties": {
-        "$ref": "#/definitions/actionqualities"
+        "$ref": "#/definitions/eventqualities"
       }
     },
-    "sdfProperty-": {
+    "sdfAction-": {
       "type": "object",
       "additionalProperties": {
-        "$ref": "#/definitions/propertyqualities"
+        "$ref": "#/definitions/actionqualities"
       }
     },
-    "sdfEvent-": {
+    "sdfProperty-": {
       "type": "object",
       "additionalProperties": {
-        "$ref": "#/definitions/eventqualities"
+        "$ref": "#/definitions/propertyqualities"
       }
-    },
-    "sdfType-": {
-      "type": "string",
-      "enum": [
-        "byte-string",
-        "unix-time"
-      ]
     }
   }
 }
]]></sourcecode>
    </section>
    <section anchor="jso-inspired">
      <name>Data Qualities inspired by json-schema.org</name>
      <t>Data qualities define data used in SDF affordances at an information
model level.
A popular way to describe JSON data at a data model level is proposed
by a number of drafts on json-schema.org (which collectively are
abbreviated JSO here); for reference to a popular version we will
point here to <xref target="JSO7"/> and <xref target="JSO7V"/>.
As the vocabulary used by JSO is familiar to many JSON modelers, the
present specification borrows some of the terms and ports their
semantics to the information model level needed for SDF.</t>
      <t>The main data quality imported is the "<tt>type</tt>".
In SDF, this can take one of six (text string) values, which are
discussed in the following subsections (note that the JSO type
"<tt>null</tt>" is not supported as a value of this data quality in SDF).</t>
      <t>The additional quality "<tt>const</tt>" restricts the data to one specific
value (given as the value of the <tt>const</tt> quality).</t>
      <t>Similarly, the additional quality "<tt>default</tt>" provides data that can
be used in the absence of the data (given as the value of the <tt>const</tt>
quality); this is mainly documentary and not very well-defined for SDF
as no process is defined that would add default values to an instance
of some interaction data.</t>
      <section anchor="type-number-type-integer">
        <name>type "<tt>number</tt>", type "<tt>integer</tt>"</name>
        <t>The types "<tt>number</tt>" and "<tt>integer</tt>" are associated with floating point
and integer numbers, as they are available in JSON.
A type value of <tt>integer</tt> means that only integer values of JSON
numbers can be used (note that <tt>10.0</tt> is an integer value, even if it
is in a notation that would also allow non-zero decimal fractions).</t>
        <t>The additional data qualities "<tt>minimum</tt>", "<tt>maximum</tt>",
"<tt>exclusiveMinimum</tt>", "<tt>exclusiveMaximum</tt>" provide number values that
serve as inclusive/exclusive lower/upper bounds for the number.
(Note that the Boolean form of
"<tt>exclusiveMinimum</tt>"/"<tt>exclusiveMaximum</tt>" found in earlier JSO drafts <xref target="JSO4V"/>
is not used.)</t>
        <t>The data quality "<tt>multipleOf</tt>" gives a positive number that
constrains the data value to be an integer multiple of the number
given.
(Type "<tt>integer</tt>" can also be expressed as a "<tt>multipleOf</tt>" quality of
value 1, unless another "<tt>multipleOf</tt>" quality is present.)</t>
      </section>
      <section anchor="type-string">
        <name>type "<tt>string</tt>"</name>
        <t>The type "<tt>string</tt>" is associated with Unicode text string values as
they can be represented in JSON.</t>
        <t>The length (as measured in characters) can be constrained by the
additional data qualities "<tt>minLength</tt>" and "<tt>maxLength</tt>", which are
inclusive bounds.</t>
        <t>(More specifically, Unicode text strings as defined in this
specification are sequences of Unicode scalar values, the number of
which is taken as the length of such a text string.
Note that earlier drafts of this specification explained
text string length values in bytes, which however is not meaningful
unless bound to a specific encoding — which could be UTF-8, if this
unusual behavior is to be provided in an extension.)</t>
        <t>The data quality "<tt>pattern</tt>" takes a string value that is interpreted
as an <xref target="ECMA-262"/> regular expression in Unicode mode that constrains the
string (note that these are not anchored by default, so unless <tt>^</tt> and
<tt>$</tt> anchors are employed, ECMA-262 regular expressions match any string that <em>contains</em> a match).
The JSO proposals acknowledge that regular expression support is
rather diverse in various platforms, so the suggestion is to limit
them to:</t>
        <ul spacing="compact">
          <li>
            <t>characters;</t>
          </li>
          <li>
            <t>character classes in square brackets, including ranges; their complements;</t>
          </li>
          <li>
            <t>simple quantifiers <tt>*</tt>, <tt>+</tt>, <tt>?</tt>, and range quantifiers <tt>{n}</tt>,
<tt>{n,m}</tt>, and <tt>{n,}</tt>;</t>
          </li>
          <li>
            <t>grouping parentheses;</t>
          </li>
          <li>
            <t>the choice operator <tt>|</tt>;</t>
          </li>
          <li>
            <t>and anchors (beginning-of-input <tt>^</tt> and end-of-input <tt>$</tt>).</t>
          </li>
        </ul>
        <t>Note that this subset is somewhat similar to the subset introduced by
I-Regexps <xref target="RFC9485"/>, which however are anchored
regular expressions, and which include certain backslash escapes for
characters and character classes.</t>
        <t>The additional data quality "<tt>format</tt>" can take one of the following
values.  Note that, at an information model level, the presence of
this data quality changes the type from being a simple text string to
the abstract meaning of the format given (i.e., the format "date-time"
is less about the specific syntax employed in <xref target="RFC3339"/> than about the usage
as an absolute point in civil time).</t>
        <ul spacing="compact">
          <li>
            <t>"<tt>date-time</tt>", "<tt>date</tt>", "<tt>time</tt>":
An <xref target="RFC3339"/> <tt>date-time</tt>, <tt>full-date</tt>, or <tt>full-time</tt>, respectively.</t>
          </li>
          <li>
            <t>"<tt>uri</tt>", "<tt>uri-reference</tt>":
An <xref target="RFC3986"/> URI or URI Reference, respectively.</t>
          </li>
          <li>
            <t>"<tt>uuid</tt>": An <xref target="RFC4122"/> UUID.</t>
          </li>
        </ul>
      </section>
      <section anchor="type-boolean">
        <name>type "<tt>boolean</tt>"</name>
        <t>The type "<tt>boolean</tt>" can take the values "<tt>true</tt>" or "<tt>false</tt>".</t>
      </section>
      <section anchor="type-array">
        <name>type "<tt>array</tt>"</name>
        <t>The type "<tt>array</tt>" is associated with arrays as they are available in
JSON.</t>
        <t>The additional quality "<tt>items</tt>" gives the type that each of the
elements of the array must match.</t>
        <t>The number of elements in the array can be constrained by the additional
data qualities "<tt>minItems</tt>" and "<tt>maxItems</tt>", which are inclusive
bounds.</t>
        <t>The additional data quality "<tt>uniqueItems</tt>" gives a Boolean value
that, if true, requires the elements to be all different.</t>
      </section>
      <section anchor="type-object">
        <name>type "<tt>object</tt>"</name>
        <t>The type "<tt>object</tt>" is associated with maps, from strings to values, as
they are available in JSON.</t>
        <t>The additional quality "<tt>properties</tt>" is a map the entries of which
describe entries in the specified JSON map: The key gives an
allowable map key for the specified JSON map, and the value is a
map with a named set of data qualities giving the type for the
corresponding value in the specified JSON map.</t>
        <t>All entries specified this way are optional, unless they are listed in
the value of the additional quality "<tt>required</tt>", which is an array of
string values that give the key names of required entries.</t>
        <t>Note that the term "properties" as an additional quality for
defining map entries is unrelated to sdfProperty.</t>
      </section>
      <section anchor="implementation-notes">
        <name>Implementation notes</name>
        <t>JSO-based keywords are also used in the specification techniques of a
number of ecosystems, but some adjustments may be required.</t>
        <t>For instance, <xref target="OCF"/> is based on Swagger 2.0 which appears to be based on
"draft-4" <xref target="JSO4"/><xref target="JSO4V"/> (also called draft-5, but semantically intended to
be equivalent to draft-4).
The "<tt>exclusiveMinimum</tt>" and "<tt>exclusiveMaximum</tt>" keywords use the
Boolean form there, so on import to SDF their values have to be
replaced by the values of the respective "<tt>minimum</tt>"/"<tt>maximum</tt>"
keyword, which are themselves then removed; the reverse transformation
applies on export.</t>
      </section>
    </section>
    <section anchor="composition-examples">
      <name>Composition Examples</name>
      <t>This appendix contains two examples illustrating different composition approaches
using the <tt>sdfThing</tt> quality.</t>
      <section anchor="outlet-strip-example">
        <name>Outlet Strip Example</name>
        <figure anchor="exa-sdfthing-outlet-strip">
          <sourcecode type="json" name="example-sdfthing-outlet-strip.sdf.json"><![CDATA[
{
  "sdfThing": {
    "outlet-strip": {
      "label": "Outlet strip",
      "description": "Contains a number of Sockets",
      "sdfObject": {
        "socket": {
          "description": "An array of sockets in the outlet strip",
          "minItems": 2,
          "maxItems": 10
        }
      }
    }
  }
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="fridge-freezer-example">
        <name>Refrigerator-Freezer Example</name>
        <figure anchor="exa-sdfthing-fridge-freezer">
          <sourcecode type="json" name="example-sdfthing-refrigerator-freezer.sdf.json"><![CDATA[
{
  "sdfThing": {
    "refrigerator-freezer": {
      "description": "A refrigerator combined with a freezer",
      "sdfProperty": {
        "status": {
          "type": "boolean",
          "description":
"Indicates if the refrigerator-freezer is powered"
        }
      },
      "sdfObject": {
        "refrigerator": {
          "description": "A refrigerator compartment",
          "sdfProperty": {
            "temperature": {
              "sdfRef": "#/sdfProproperty/temperature",
              "maximum": 8
            }
          }
        },
        "freezer": {
          "label": "A freezer compartment",
          "sdfProperty": {
            "temperature": {
              "sdfRef": "#/sdfProproperty/temperature",
              "maximum": -6
            }
          }
        }
      }
    }
  },
  "sdfProperty": {
    "temperature": {
      "description": "The temperature for this compartment",
      "type": "number",
      "unit": "Cel"
    }
  }
}
]]></sourcecode>
        </figure>
      </section>
    </section>
    <section numbered="false" anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>This specification is based on work by the One Data Model group.</t>
      <!--  LocalWords:  SDF namespace defaultNamespace instantiation OMA
 -->
<!--  LocalWords:  affordances ZigBee LWM OCF sdfObject sdfThing
 -->
<!--  LocalWords:  Thingness sdfProperty sdfEvent sdfRef
 -->
<!--  LocalWords:  namespaces sdfRequired Optionality sdfAction
 -->
<!--  LocalWords:  dereferenced dereferencing atomicity
 -->
<!--  LocalWords:  interworking
 -->

</section>
    <section anchor="contributors" numbered="false" toc="include" removeInRFC="false">
      <name>Contributors</name>
      <contact initials="J." surname="Romann" fullname="Jan Romann">
        <organization>Universität Bremen</organization>
        <address>
          <email>jan.romann@uni-bremen.de</email>
        </address>
      </contact>
      <contact initials="W." surname="van der Beek" fullname="Wouter van der Beek">
        <organization>Cascoda Ltd.</organization>
        <address>
          <postal>
            <street>Threefield House</street>
            <street>Threefield Lane</street>
            <city>Southampton</city>
            <country>United Kingdom</country>
          </postal>
          <email>w.vanderbeek@cascoda.com</email>
        </address>
      </contact>
    </section>
  </back>
  <!-- ##markdown-source:
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
Oa7rxeHeXgNP9qjG+eDG53v87CN90dVRNkqAPW9/lGbmR1cKmWcszdxDk9NR
BC1Xh7jn5SrbHksT57MifLRuatTaN70whY57zsjZ6m7VrOhH7x3x7Yo5Bn0I
m2N/vVgxoaZtdeW8Wn0G3bhsSB9iWd2QDrWcGy3WaVP/hdNsKEA3naerD7cx
2ukbgzV7JJWnNu6T26/rkQvAbNwhNV/XH+di3bQ7bD1wCo2BP8DBEJEf6xPp
USTOxn5+4kb8287Xh5sYNn8TvnehH/2yVmEPef5FQeOeEo/3o1ZKsd/lHIfZ
Yt+lB2Ea3vFt5y7wju+Lb8E7vq2s2oYI2JZkVnXsvHoO+W5uzYtF137wmzMk
HsY3PIq1XloxpNqBrwCKX8w56QB815EJVuhebtwb73fW3v+8kIX8Hd99hz1u
kFtOKL0htVX10tr+WGG9YafW5L6m11/Kpf3LYIG2rMUm3W3GWgS3h7qDbDYG
Ks1WduVJ/7t09Ysh5JaoWEKc5OfPcJ3G328TOLDn2AqgbrTv3mnsPXpBL7au
7XjVWL1Md83VZW4g3j/87W/f/+2vf83/+tfyFXnE+W+/aV51djl2lO5ptx3i
mv11tHiHyaNPXWuqBLOuzlRP73sjMwT8RM6CYS/BfdLVm/JZ+jxrn7Ir3H8X
jeGb18aWt/j58xbb23CT7ra34b/gNmx5z1ztTmxRGCszXrLi91l1sPLm5q0h
cHbSjcerr1a0sIZOTo3hGLvFw2XzjjfF8c4BvXdT54jNq+yS3tQv6jr6Uo+q
6+hrzX0UdNehfe7orfNueod+Vt1T79BV953Fo1zh3lrdd/f9tWaAFXdY5wjK
Fm3ad+BYdPnek5ngQ3XvK1et3kNx47isJ/ZruIaemj5S19rltc3Se2RdR2fq
6XGFfW7ctt39qqvINffr5Yr3Pfrs93KF6Ylj2AYQ7WRd3nPhqzii9+zWOKJd
x4XRIVytnaJzb9tgntdB79XL+jrWqu7ZV7o8Xm7CzQR+2O+wavu1wZldzps2
X/r5cpzB0OvGdBxn8LhLfdFsoDesc9EOJ9R4oVfa+37VYKqQaP7uz07jl479
brRoTiQkQ/uXzHod7N6Ve14/Ysiu/wsGbLDrq7bGnfzLttmw6+/ZV8Cuv2df
TXb9EnS/pDfPrr9fPwG7/n5dGXZ9Y6Tx7PoGfa85vpuw6+tH8Oz6Zn03+OnL
9t6z6x+ge8uur9pD5Tgv6ckwwu/XUye7fl1dXtssG+z6e3YWsOub7TOzgZdu
ygfp17Lr73f0Dbu+2fQcu34pRB+tunjfD6Afotsmu/6eF8ZKluNydv3SeV4H
vQ/Y9fdcq2XXN748hF2/lK432PWrrXoNW7uWXf+k66Vg8F83u75lMrdMprbe
MpnSw5bJjLdM5pbJbK58y2RumcwV3WyZzC2TaX5Y64VwCWHPLyHmPzvV75Zl
ja9ML7Ys6wYDbFnWLcu6ZVlX9rtlWbcsa+cEtyyr72/Lsm7Ism7dGOJLYLcO
l99d4bvl97f8/pbf3/L78tuW31+73i2/v+X3r6vbLb//zmvd8vu/uEC5Qdz5
g+f3mw3W8/sdGxH8etHocI084FngcICV4dfu95WRApfNrglDeiNggdcvpgHy
JujeSUwYrB0xdET5IAOGXW6DE+MNcDxsvQ1O3GCAbXDiNjjxkvVugxO3wYnX
1e02OPGd1/rrC04cmJc8x68fX/EH/a0XlDexfOs2qcaapBoh3+p4+1XyR0cK
S/rdH7TGLx3I0WjRnESTt1/PaTcY31XzdmdofW8B4/uefQWM76V9tST263Zk
D7rYctZ2lC1nveWst5z1lrPectZbzrqrr18fZ9350q+ZJ27pz5sNWvrz4OcO
Dema+/5npAgPm66D3XXxlVuBwjbfChRbgWIrUFxv91uB4p3XuxUotgLFdXW7
FSjeea2/PoHCq+r14yv+oFxMh3p+oB079bx163ED/5rEks08QeoO16t34U/+
tfmxtxzfluPbcnzX0+WW47uOfrcc35bj65zgluPz/b0rx9f50q+ZV3t/F+z3
cMzY+mP/svyxt8zwlhneMsPX0+WWGb6OfrfM8JYZ7pzglhn2/W2Z4U5oXa/i
cpus5F9kg/8lSAZh0y3bvGWbt2zz9XS5ZZuvo98t27xlmzsnuGWbfX9btrkT
WtehQ77MvdTc978YF9sPof99P2eJLae85ZQvHWDLKW855UvWu+WUt5zydXW7
5ZTfea2/Zk5ZP76Kgk56IYk3M9s8/UWLLl3OlrdWefkr7T28/B1Ejiu90MGv
rToB68jyxYceswNLPviYXYfoSoM6Wcz+uAJ934ajrEjc2J5HE72JYlqs1skg
T3YE2+ZmY/iXG41OPE17p/Pxy5RB47jzh9WhsCIMfd/8IXZHpPVOvLq72CNc
12+6fc2fXl1O4v+17u0fUh65XmHuGoWwn6MosIY7vPLiftYM9vvzCr9SrVoT
pJdStG1w/4ciiVsa3N3blgZvaXDrpZ8vDQ6G/jUWav+Q5VOut/bMNdaM+TlW
LllTzOLKi/tZ1wPZljYIIfcrl0d/eRbELTO1oqctM7Vlpn7mJHEr0G4dpqnp
loiv6GlLxH9mRPwXxtf+qyXiX15h2a1IvaKnrUj9MxOpTQ/ywVuXqRPEZYpd
y5OT4DCvDF0z3k69vzHJ+etfB0p1fiMz984ZE5xcmP6suUdNq/pK/mfdxbyZ
Y0a3v+eG7666yDd8vZtjuRK30u6vm729mh9ns9dH+WJZIy+5abdJCdizQcfP
lvUH6vkKfW7KJ7sjc9HC/VVX8btew+58+2VtcK7dGWtAyR6xbhCEGQkbvaWn
gOLbA/tLOrDbc/VBzpU612KfmrJzVRyL19W6oA5M/JkO6gwu1n7jafCg1WJZ
Zs3vAwB5Wqb5pNFymU0dr9CVTrRbzOgKR/eaFT/tq4gul/d5jd1d8+wQ4Nfa
m9mua+zXbvYVuus4D80Kcs4J2HKA14RO43NAp/ZU3hcYefZmcyRdSbE872uh
FCuUtNtYobSGwm10UV7uK3qFK9tN1c2wdpu4Epr6Q9u21GFT6tDDdtmQ2q6o
sYrtbVgOFJZ3STQwOIcPHyD38b7A9ARyRVBQQygxN033Cw2eqA1+tyiZyXlj
WXatH25dgo7nV1hZCxSrl2a2xq0rXO6HW1lzAy5bVgck3MLC7NwB6XuXW97S
t/+/uWvbcds4w/fzFFNtLtauJB/rOnYP2GxiYIvYRn1AgBYtRJHUijFFqhxy
D9nK6EP0Cfsk/b7/nyFHp7i5KxCsJXLmP5+HVLZy8xCh+h8GH0SLPxvz+fNn
Y04sg4r9c6DUFpVbs0a081v7o4PVuHSZr5Jp3VzauxN5ktuv2Bgje3surcgg
t4wWtnOAUVT2/bevbLJAMZMlSEjOJq1NKtzQ8gbiMqs6y0tbQsjl1JzZdb3u
yqSx18mtbWurNfw8t396//aNgiYI/RRttYWzlHsNvAa0J1YDiq0XNmuSRets
Xe1xdHq9LNKlTeuyhK0UgIOdTW6S+bzJrwrUDRkR2yXy6b2XFkTbPrmSuqQn
9ypvHLix17m9LsrSSPEs+7ju7m4C1JsNeM/8l99ebTbg19l2mdurOk3mhHOr
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

-->

</rfc>
