<?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.6.39 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-asdf-sdf-15" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.18.0 -->
  <front>
    <title abbrev="OneDM SDF">Semantic Definition Format (SDF) for Data and Interactions of Things</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-asdf-sdf-15"/>
    <author initials="M." surname="Koster" fullname="Michael Koster" role="editor">
      <organization>PassiveLogic</organization>
      <address>
        <postal>
          <street>524 H Street</street>
          <city>Antioch, CA</city>
          <code>94509</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="2023" month="September" day="04"/>
    <area>Applications</area>
    <workgroup>ASDF</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 121?>

<t>The Semantic Definition Format (SDF) is a format for domain experts to
use in the creation and maintenance of data and interaction models in
the Internet of Things. An SDF specification describes definitions of
SDF Objects 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">A JSON format representation of SDF 1.0 was defined in
version (-00) of this document; version (-05) was designated as an
<em>implementation draft</em>, labeled SDF 1.1, at the IETF110 meeting of
the ASDF WG (2021-03-11).
The present version (-15) adds a number of editorial improvements
and an example for removing an affordance from a target referenced
via <tt>sdfRef</tt>.</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 144?>

<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 in
the Internet of Things. An SDF specification describes definitions of
SDF Objects 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">A JSON format representation of SDF 1.0 was defined in
version (-00) of this document; version (-05) was designated as an
<em>implementation draft</em>, labeled SDF 1.1, at the IETF110 meeting of
the ASDF WG (2021-03-11).
The present version (-15) adds a number of editorial improvements
and an example for removing an affordance from a target referenced
via <tt>sdfRef</tt>.</cref></t>
      <section anchor="terminology-and-conventions">
        <name>Terminology and Conventions</name>
        <dl>
          <dt>Thing:</dt>
          <dd>
            <t>A physical item that is also made available in the Internet of
Things.  The term is used here for Things that are notable for their
interaction with the physical world beyond interaction with humans;
a temperature sensor or a light might be a Thing, but a router that
employs both temperature sensors and indicator lights might exhibit
less Thingness, as the effects of its functioning are mostly on the
digital side.</t>
          </dd>
          <dt>Affordance:</dt>
          <dd>
            <t>An element of an interface offered for interaction, defining its
possible uses or making clear how it can or should be used.  The
term is used here for the digital 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 (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 SDF map and in certain nested definitions that
has a Class Name Keyword as its key and a map of definition
entries (Definition Group) as a value.</t>
          </dd>
          <dt>Class Name Keyword:</dt>
          <dd>
            <t>One of sdfThing, sdfObject, sdfProperty, sdfAction,
sdfEvent, or sdfData; 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 on an Object.  (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 Object.</t>
          </dd>
          <dt>Event:</dt>
          <dd>
            <t>An affordance that can potentially be used to obtain information about what happened to an Object.</t>
          </dd>
          <dt>Object:</dt>
          <dd>
            <t>A grouping of Property, Action, and Event definitions; the main
"atom" of reusable semantics for model construction. Objects are
similar to Things but do not allow nesting, i.e., they cannot contain
other Objects or Things. (Note that
JSON maps are often called JSON objects due to JSON's JavaScript
heritage; in this document, the
term Object is specifically reserved for the above grouping, even if
the type name "object" might be 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.</t>
          </dd>
          <dt>Declaration:</dt>
          <dd>
            <t>A definition within an enclosing
definition, intended to create component instances within that
enclosing definition.  Every declaration can also be used as a
definition for reference in a different place.</t>
          </dd>
          <dt>Protocol Binding:</dt>
          <dd>
            <t>A companion document to an SDF specification that defines how to map
the abstract concepts in the specification 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 specification 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 this version of 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>The singular form is chosen as the preferred one for the keywords defined here.</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 Object called "Switch" (<xref target="example1"/>).</t>
        <figure anchor="example1">
          <name>A simple example of an SDF definition file</name>
          <sourcecode type="json"><![CDATA[
{
  "info": {
    "title": "Example file for OneDM 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 instances of this object.
The <tt>sdfProperty</tt> group lists the property affordances described by the model; these represent various perspectives on the state of the object.
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>Objects, the items listed in an <tt>sdfObject</tt> group, are the main "atom" of reusable semantics for model construction.
It 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 <tt>sdfObject</tt> 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, <tt>sdfObject</tt> definitions are meant
to be kept narrow enough in scope to enable broad reuse and
interoperability.
For example, defining a light bulb using separate <tt>sdfObject</tt>
definitions for on/off control, dimming, and color control affordances
will enable interoperable functionality to be configured for diverse
product types.
An <tt>sdfObject</tt> 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 "minItems" and
"maxItems" defines the sdfObject as an array.
(Note: Setting "minItems" to zero and leaving out "maxItems" 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 <tt>sdfObject</tt> instances.</t>
          <t>An instance of <tt>sdfProperty</tt> 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 <tt>sdfProperty</tt>.)</t>
          <t>Definitions in <tt>sdfProperty</tt> groups include the definitions from <tt>sdfData</tt> groups, however, they actually also declare a Property with the given qualities to be potentially present in the containing Object.</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 an instance of
these data, as well as qualities that associate semantics to these
data, for 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 and 7 of the
json-schema.org "JSON Schema"
format (collectively called JSO here), enhanced by qualities that are specific to SDF.
Details about the former are in <xref target="jso-inspired"/>.
For the current version of SDF, data are constrained to be of
simple types (number, string, Boolean),
JSON maps composed of named data ("objects"), and arrays of these types.
Syntax extension points are provided that can be used to provide
richer types in future versions of this specification (possibly more
of which can be borrowed from json-schema.org).</t>
          <t>Note that <tt>sdfProperty</tt> definitions (and <tt>sdfData</tt> 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 "object" 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
<tt>sdfProperty</tt>; 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>Actions may have (or lack) qualities of idempotency and side-effect safety.</t>
          <t>The current version of 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 an instance
of an Object; 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 <tt>sdfEvent</tt> 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>The current version of 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
<tt>sdfProperty</tt> groups to enable common
modeling patterns, data constraints, and semantic anchor concepts to
be factored out for data items that make up <tt>sdfProperty</tt> items and
serve as input and output data for <tt>sdfAction</tt> and <tt>sdfEvent</tt> items.
The <tt>sdfData</tt> definitions only spring to life by being referenced in
one of these contexts (directly or indirectly via some other <tt>sdfData</tt>
definitions).</t>
          <t>It is a common use case for such a data definition to be shared
between an <tt>sdfProperty</tt> item and input or output parameters of an
<tt>sdfAction</tt> or output data provided by an <tt>sdfEvent</tt>.
<tt>sdfData</tt> 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> groups enables definition of models for
complex devices that will use one or more <tt>sdfObject</tt> definitions.
<tt>sdfThing</tt> groups, however, also allow for including interaction
affordances, <tt>sdfData</tt>, as well as <tt>minItems</tt> and <tt>maxItems</tt> qualities.
Therefore, they can be seen as a superset of <tt>sdfObject</tt> groups, additionally
allowing for composition.</t>
          <t>A definition in an <tt>sdfThing</tt> group can refine the metadata of the definitions it
is composed of: other definitions in <tt>sdfThing</tt> groups definitions in <tt>sdfObject</tt> groups.</t>
        </section>
      </section>
      <section anchor="member-names-given-names-and-quality-names">
        <name>Member names: Given Names and Quality Names</name>
        <t>SDF models are JSON objects (maps) that mostly employ JSON objects as
member values, which in turn mostly employ JSON objects as their
member values, and so on.
This nested structure of JSON objects creates a tree, where the edges
are the member names (map keys) used in these JSON objects.
(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 object in an SDF model, the set of member
names that are used is either of:</t>
          <ul spacing="normal">
            <li>A set of "<em>Quality Names</em>", where the entries in the object 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.</li>
            <li>A set of "<em>Given Names</em>", where the entries in the object are separate
entities (definitions, declarations, etc.) that each have names that
are chosen by the SDF model author in order that these names can be
employed by a user of that model.</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 object 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 objects with member names that are
Given Names are defined using the CDDL generic rule reference <tt>named&lt;objectmembers&gt;</tt>,
where <tt>objectmembers</tt> is in turn the structure of the members of the
JSON object that is the value of the member named by the Given Name.
As quality-named objects and given-named objects roughly alternate in
a path down the tree, <tt>objectmembers</tt> is usually an object built from
Quality Names.</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>
        </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 current 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 KebabCase 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.
The current version of 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 model.</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 files.  One or more SDF files can
work together to provide the definitions and declarations that are the
payload of the SDF format.</t>
      <t>An SDF definition file contains a single JSON map (JSON object).
This object 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 meta data for the file 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 files will have policies
that only SDF models 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">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 file.
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 file.</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.
(For models to be handled by the One Data Model liaison group, this 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 namespace map and the defaultNamespace 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 definition file.</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 definition file 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 (object), 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 current definition block. <!-- what exactly does this mean? -->
        </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 Object definition is given in <xref target="exobject"/>:</t>
        <figure anchor="exobject">
          <name>Example Object definition</name>
          <sourcecode type="json"><![CDATA[
"sdfObject": {
  "foo": {
    "sdfProperty": {
      "bar": {
        "type": "boolean"
      }
    }
  }
}
]]></sourcecode>
        </figure>
        <t>This example defines an Object "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>Some of the definitions are also declarations: the definition of the entry "bar" in the property "foo" means that each instance of a "foo" can have zero or one instance of a "bar".  Entries within <tt>sdfProperty</tt>, <tt>sdfAction</tt>, and <tt>sdfEvent</tt>, within <tt>sdfObject</tt> entries, are declarations.  Similarly, entries within an <tt>sdfThing</tt> describe instances of <tt>sdfObject</tt> (or nested <tt>sdfThing</tt>) that form part of instances of the Thing.</t>
      </section>
    </section>
    <section anchor="names-and-namespaces">
      <name>Names and namespaces</name>
      <t>SDF definition files may contribute to a global namespace, and may
reference elements from that global namespace.
(An SDF definition file 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 versions 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.)</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 the present version of this specification, the query part should
not be used (it might be used in later versions).</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
definition file is constructed from a JSON pointer that selects the
element defined for this name in the SDF definition file.</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 definition file.</t>
        <t>E.g., in <xref target="example1"/>, definitions for the following global names are contributed:</t>
        <ul spacing="normal">
          <li>https://example.com/capability/cap#/sdfObject/Switch</li>
          <li>https://example.com/capability/cap#/sdfObject/Switch/sdfProperty/value</li>
          <li>https://example.com/capability/cap#/sdfObject/Switch/sdfAction/on</li>
          <li>https://example.com/capability/cap#/sdfObject/Switch/sdfAction/off</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 definition file 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 definition
file, 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
definition file that does not set a default namespace.</t>
        <t>Name references that point outside the current SDF definition file
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 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>copying elements via sdfRef values</li>
          <li>pointing to elements via sdfRequired value elements</li>
        </ul>
      </section>
      <section anchor="sdfref">
        <name>sdfRef</name>
        <t>In a JSON map establishing a definition, the keyword "sdfRef" 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 "$ref" keyword in <xref target="I-D.handrews-json-schema-validation-01"/>.)</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>The JSON map that contains the sdfRef member is copied into a
variable named "patch".</li>
          <li>The sdfRef member of the copy in "patch" is removed.</li>
          <li>the JSON pointer that is the value of the sdfRef member is
dereferenced and the result is copied into a variable named "original".</li>
          <li>The JSON Merge Patch algorithm <xref target="RFC7396"/> is applied to patch
the contents of "original" with the contents of "patch".</li>
          <li>The result of the Merge Patch is used in place of the value of the
original JSON map.</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 objects 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"><![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 "sdfRequired" is provided to apply a constraint that
defines for which declarations corresponding data are mandatory in an
instance conforming the current definition.</t>
        <t>The value of "sdfRequired" is an array of name references (JSON pointers), each
indicating one declaration that is mandatory to be represented.</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>
      </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">text</td>
              <td align="left">long text (no constraints)</td>
            </tr>
            <tr>
              <td align="left">label</td>
              <td align="left">text</td>
              <td align="left">short text (no constraints)</td>
            </tr>
            <tr>
              <td align="left">$comment</td>
              <td align="left">text</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"/>, applies to qualities of properties, of data)</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="data-qualities">
        <name>Data Qualities</name>
        <t>Data qualities are used in <tt>sdfData</tt> and <tt>sdfProperty</tt> 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">scaleMinimum</td>
              <td align="left">number</td>
              <td align="left">lower limit of value in units given by unit (note 2)</td>
              <td align="left">N/A</td>
            </tr>
            <tr>
              <td align="left">scaleMaximum</td>
              <td align="left">number</td>
              <td align="left">upper limit of value in units given by unit (note 2)</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 3)</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 SDF 1.0.
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; they may be useful to humans, though.
A URI unit name is distinguished from a registered unit name by the
presence of a colon; 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 (e.g.,
<tt>kg</tt> instead of <tt>urn:ietf:params:unit:kg</tt>).</t>
          </li>
          <li>these qualities were included in SDF 1.0, but were not fully
 defined; they are not included in SDF 1.1.  In 1.next, they will
 be replaced by qualities to express scaling that are more aligned
 with the processes that combine ecosystem and instance specific
 information with an SDF model.</li>
          <li>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.</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  "<tt>sdfType</tt>
values" sub-registry in the "SDF Parameters" registry
(<xref target="sdftype-values"/>).
The <tt>sdfType</tt> 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 KebabCase for
names constructed out of multiple words <xref target="KebabCase"/>.</t>
          <t>To aid interworking with <xref target="I-D.handrews-json-schema-validation-01"/> implementations, it is <bcp14>RECOMMENDED</bcp14>
that <tt>sdfType</tt> is always used in conjunction with the <tt>type</tt> quality
inherited from <xref target="I-D.handrews-json-schema-validation-01"/>, in such a way as to yield a common
representation of the type's values in JSON.</t>
          <t>Values for <tt>sdfType</tt> 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 <tt>sdfType</tt> value,
and a conventional JSON representation for values of the type.</t>
          <table anchor="sdftype1">
            <name>Values defined in SDF 1.1 for 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 SDF 1.0, 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 JSON
object used to represent the choice) and a set of dataqualities
(object, the value in the JSON object used to represent the choice).
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="I-D.handrews-json-schema-validation-01"/>:</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 SDF 1.0, 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,
e.g. what would have been  </t>
              <sourcecode type="json"><![CDATA[
"type": "number",
"enum": [1, 2, 3]
]]></sourcecode>
              <t>
in SDF 1.0, 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, e.g., if the actual string value is indeed a crucial
element for the data model.)</t>
            </li>
            <li>
              <t>anyOf  </t>
              <t><xref target="I-D.handrews-json-schema-validation-01"/> provides a type union called <tt>anyOf</tt>, which provides a
choice between anonymous alternatives.  </t>
              <t>
What could have been  </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>
in <xref target="I-D.handrews-json-schema-validation-01"/> 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="I-D.handrews-json-schema-validation-01"/>.</t>
          <t>As a simplification for readers of SDF specifications accustomed to
the <xref target="I-D.handrews-json-schema-validation-01"/> 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 sdfObject keyword denotes a group of zero or more Object definitions.
Object definitions may contain or include definitions of Properties, Actions, Events declared for the object, as well as data types (sdfData group) to be used in this or other Objects.</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 object</td>
            </tr>
            <tr>
              <td align="left">sdfAction</td>
              <td align="left">action</td>
              <td align="left">zero or more named action definitions for this object</td>
            </tr>
            <tr>
              <td align="left">sdfEvent</td>
              <td align="left">event</td>
              <td align="left">zero or more named event definitions for this object</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 sdfObject instances in array</td>
            </tr>
            <tr>
              <td align="left">maxItems</td>
              <td align="left">number</td>
              <td align="left">(array) Maximum number of sdfObject instances in array</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="sdfproperty-1">
        <name>sdfProperty</name>
        <t>The sdfProperty 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 sdfAction 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 "object" 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 sdfEvent 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 "object" 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 sdfData 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>The ability to represent products, standardized product types, and modular products while maintaining the atomicity of Objects.</li>
        <li>The ability to compose a reusable definition block from Objects, for example a single plug unit of an outlet strip with on/off control, energy monitor, and optional dimmer objects, while retaining the atomicity of the individual objects.</li>
        <li>The ability to compose Objects and other definition blocks into a higher level thing that represents a product, while retaining the atomicity of objects.</li>
        <li>The ability to enrich and refine a base definition to have product-specific qualities and quality values, e.g. unit, range, and scale settings.</li>
        <li>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.</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 definition files that are present in 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. There is expected to be an SDF namespace for common SDF definitions used in OneDM.</t>
        <t>The structure of a path in a namespace is defined by the JSON Pointers to the definitions in the files in that namespace. For example, if there is a file defining an object "Switch" with an action "on", then the reference to the action would be "ns:/sdfObject/Switch/sdfAction/on" 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 file or another file) 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 "sdfRef" 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 "sdfRef", new qualities may be added
and existing qualities from the referenced definition may be
overridden.  (Note that JSON maps (objects) 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 (e.g., 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 object declarations that make up the definition of a single socket of an outlet strip could be encapsulated in an sdfThing, and the socket-thing itself could be used in a declaration in the sdfThing definition for the outlet strip
(see <xref target="exa-sdfthing-outlet-strip"/> in {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 <tt>sdfThing</tt> can also contain Interaction Affordances and sdfData 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>An sdfThing may be composed of sdfObjects and other sdfThings.</t>
        <t>The qualities of sdfThing are shown in <xref target="sdfthingqual"/>.</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 sdfThing instances in array</td>
            </tr>
            <tr>
              <td align="left">maxItems</td>
              <td align="left">number</td>
              <td align="left">(array) Maximum number of sdfThing instances 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</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="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, 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>Stability, "stable and permanent";</li>
            <li>Transparency, "readily available", "in sufficient detail" (<xref section="4.6" sectionFormat="of" target="RFC8126"/>).</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 issues are discussed in <xref target="RFC8576"/>.</t>
      <t>(Specifics: TBD.)</t>
    </section>
  </middle>
  <back>
    <displayreference target="RFC8126" to="BCP26"/>
    <references>
      <name>References</name>
      <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="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>
        <name>Informative References</name>
        <reference anchor="I-D.handrews-json-schema-validation-01">
          <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"/>
        </reference>
        <reference anchor="I-D.wright-json-schema">
          <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="16" month="April" year="2017"/>
            <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, ideal for
   annotating existing JSON APIs that would not otherwise have
   hypermedia controls or be machine-readable.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-wright-json-schema-01"/>
        </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="July" year="2023"/>
            <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-12"/>
        </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-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="26" month="April" 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
   in the Internet of Things.  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-02"/>
        </reference>
        <reference anchor="I-D.ietf-jsonpath-iregexp">
          <front>
            <title>I-Regexp: An Interoperable Regexp Format</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <author fullname="Tim Bray" initials="T." surname="Bray">
              <organization>Textuality</organization>
            </author>
            <date day="29" month="June" year="2023"/>
            <abstract>
              <t>   This document specifies I-Regexp, a flavor of regular expressions
   that is limited in scope with the goal of interoperation across many
   different regular-expression libraries.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-jsonpath-iregexp-08"/>
        </reference>
      </references>
    </references>
    <?line 1680?>

<section anchor="syntax">
      <name>Formal Syntax of SDF</name>
      <t>This appendix describes the syntax of SDF using CDDL <xref target="RFC8610"/>.  Note
that this appendix was derived from <contact fullname="Ari Keränen"/>'s "alt-schema" and
<contact fullname="Michael Koster"/>'s "schema", with a view of covering the syntax that
was in use at the time of writing in the One Data Model <tt>playground</tt>
repository.</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"/>.
A feature named "1.0" is used to indicate parts of the syntax being
deprecated towards SDF 1.1, and a feature named "1.1" is used to
indicate new syntax intended for SDF 1.1.
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
 ? 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                   ; for EXTENSION-POINT
       "([a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*"; for EXTENSION-POINT

sdf-pointer = text ; .regexp curie-regexp -- TO DO!
; 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" .feature "1.2") => uint
 ? ("maxItems" .feature "1.2") => 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 (1.2)
objectqualities = {
 commonqualities
 paedataqualities
 arraydefinitionqualities
 EXTENSION-POINT<"object-ext">
}

parameter-list =
  pointer-list .feature (["1.0", "pointerlist-as-parameter"]) /
  dataqualities .feature (["1.1", "dataqualities-as-parameter"])

actionqualities = {
 commonqualities
 ? sdfInputData: parameter-list   ; sdfRequiredInputData applies here
 ? ("sdfRequiredInputData" .feature "1.0") => pointer-list
 ? 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
 ? ("units" .feature "1.0") => text
 ? ("unit" .feature "1.1") => text
 ? ("scaleMinimum" .feature "1.0") => number
 ? ("scaleMaximum" .feature "1.0") => number
 ? nullable: bool
 ? ("subtype" .feature "1.0") => "byte-string" / "unix-time"
            / (text .feature "subtype-ext")         ; EXTENSION-POINT
 ? ("sdfType" .feature "1.1") => "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" .feature "1.1")
  ? required: [+text]
  ? properties: named<dataqualities>
)

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:
 ? ((("sdfChoice" .feature "1.1") => named<dataqualities>)
  // ("enum" => [+ text])) ; limited to text strings in SDF 1.1
 ; the next three should validate against type:
 ? ("enum" .feature "1.0") => [+ allowed-types]
 ? const: allowed-types
 ? default: allowed-types
 ; number/integer constraints
 ? minimum: number
 ? maximum: number
 ? exclusiveMinimum: number
 ? exclusiveMaximum: number
 ? multipleOf: number                   ; ISSUE: Do we need this?
 ; 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: { ;;; ultimately, this will be mostly recursive, but,
            ;;; for now let's find out what we actually need
     ? 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
     ? ((("sdfChoice" .feature "1.1") => named<dataqualities>)
     // ("enum" => [+ text])) ; limited to text strings in SDF 1.1
     ; 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="I-D.handrews-json-schema-validation-01"/>.</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: 2023-07-10T22:16:34Z",
+  "title": "sdf-framework.cddl -- Generated: 2023-07-10T22:16:37Z",
   "$schema": "http://json-schema.org/draft-07/schema#",
   "$ref": "#/definitions/sdf-syntax",
   "definitions": {
     "sdf-syntax": {
       "type": "object",
       "properties": {
         "sdfProperty": {
           "$ref": "#/definitions/sdfProperty-"
         },
         "sdfAction": {
           "$ref": "#/definitions/sdfAction-"
         },
         "sdfEvent": {
           "$ref": "#/definitions/sdfEvent-"
         },
         "sdfData": {
           "$ref": "#/definitions/sdfData-sdfChoice-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"
           }
         }
       },
-      "additionalProperties": false
+      "additionalProperties": {
+      }
     },
     "sdfinfo": {
       "type": "object",
       "properties": {
         "$comment": {
           "type": "string"
         },
         "title": {
           "type": "string"
         },
         "version": {
           "type": "string"
         },
         "copyright": {
           "type": "string"
         },
         "license": {
           "type": "string"
         },
         "modified": {
           "$ref": "#/definitions/modified-date-time"
         },
         "features": {
-          "type": "array",
-          "maxItems": 0
+          "type": "array"
         }
       },
-      "additionalProperties": false
+      "additionalProperties": {
+      }
     },
     "modified-date-time": {
       "type": "string"
     },
     "thingqualities": {
       "type": "object",
       "properties": {
         "minItems": {
           "$ref": "#/definitions/uint"
         },
         "maxItems": {
           "$ref": "#/definitions/uint"
         },
         "sdfProperty": {
           "$ref": "#/definitions/sdfProperty-"
         },
         "sdfAction": {
           "$ref": "#/definitions/sdfAction-"
         },
         "sdfEvent": {
           "$ref": "#/definitions/sdfEvent-"
         },
         "sdfData": {
           "$ref": "#/definitions/sdfData-sdfChoice-properties-"
         },
         "$comment": {
           "type": "string"
         },
         "description": {
           "type": "string"
         },
         "label": {
           "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"
           }
         }
       },
-      "additionalProperties": false
+      "additionalProperties": {
+      }
     },
     "sdf-pointer": {
       "type": "string"
     },
     "pointer-list": {
       "type": "array",
       "items": {
         "$ref": "#/definitions/sdf-pointer"
       }
     },
     "objectqualities": {
       "type": "object",
       "properties": {
         "minItems": {
           "$ref": "#/definitions/uint"
         },
         "maxItems": {
           "$ref": "#/definitions/uint"
         },
         "sdfProperty": {
           "$ref": "#/definitions/sdfProperty-"
         },
         "sdfAction": {
           "$ref": "#/definitions/sdfAction-"
         },
         "sdfEvent": {
           "$ref": "#/definitions/sdfEvent-"
         },
         "sdfData": {
           "$ref": "#/definitions/sdfData-sdfChoice-properties-"
         },
         "$comment": {
           "type": "string"
         },
         "description": {
           "type": "string"
         },
         "label": {
           "type": "string"
         },
         "sdfRef": {
           "$ref": "#/definitions/sdf-pointer"
         },
         "sdfRequired": {
           "$ref": "#/definitions/pointer-list"
         }
       },
-      "additionalProperties": false
+      "additionalProperties": {
+      }
     },
     "propertyqualities": {
       "anyOf": [
         {
           "type": "object",
           "properties": {
             "sdfChoice": {
               "$ref": "#/definitions/sdfData-sdfChoice-properties-"
             },
             "type": {
               "$ref": "#/definitions/type-"
             },
+            "enum": {
+              "$ref": "#/definitions/enum-"
+            },
             "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/items-"
             },
             "$comment": {
               "type": "string"
             },
             "description": {
               "type": "string"
             },
             "label": {
               "type": "string"
             },
             "sdfRef": {
               "$ref": "#/definitions/sdf-pointer"
             },
             "sdfRequired": {
               "$ref": "#/definitions/pointer-list"
             },
+            "units": {
+              "type": "string"
+            },
             "unit": {
               "type": "string"
             },
+            "scaleMinimum": {
+              "type": "number"
+            },
+            "scaleMaximum": {
+              "type": "number"
+            },
             "nullable": {
               "type": "boolean"
             },
+            "subtype": {
+              "$ref": "#/definitions/subtype-"
+            },
             "sdfType": {
               "$ref": "#/definitions/sdfType-"
             },
             "contentFormat": {
               "type": "string"
             },
             "observable": {
               "type": "boolean"
             },
             "readable": {
               "type": "boolean"
             },
             "writable": {
               "type": "boolean"
             }
           },
-          "additionalProperties": false
+          "additionalProperties": {
+          }
         },
         {
           "type": "object",
           "properties": {
             "enum": {
-              "type": "array",
-              "items": {
-                "type": "string"
-              },
-              "minItems": 1
+              "$ref": "#/definitions/enum-"
             },
             "type": {
               "$ref": "#/definitions/type-"
             },
             "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/items-"
             },
             "$comment": {
               "type": "string"
             },
             "description": {
               "type": "string"
             },
             "label": {
               "type": "string"
             },
             "sdfRef": {
               "$ref": "#/definitions/sdf-pointer"
             },
             "sdfRequired": {
               "$ref": "#/definitions/pointer-list"
             },
+            "units": {
+              "type": "string"
+            },
             "unit": {
               "type": "string"
             },
+            "scaleMinimum": {
+              "type": "number"
+            },
+            "scaleMaximum": {
+              "type": "number"
+            },
             "nullable": {
               "type": "boolean"
             },
+            "subtype": {
+              "$ref": "#/definitions/subtype-"
+            },
             "sdfType": {
               "$ref": "#/definitions/sdfType-"
             },
             "contentFormat": {
               "type": "string"
             },
             "observable": {
               "type": "boolean"
             },
             "readable": {
               "type": "boolean"
             },
             "writable": {
               "type": "boolean"
             }
           },
-          "additionalProperties": false
+          "additionalProperties": {
+          }
         },
         {
           "type": "object",
           "properties": {
             "sdfChoice": {
               "$ref": "#/definitions/sdfData-sdfChoice-properties-"
             },
             "type": {
               "type": "string",
               "const": "object"
             },
             "required": {
               "type": "array",
               "items": {
                 "type": "string"
               },
               "minItems": 1
             },
             "properties": {
               "$ref": "#/definitions/sdfData-sdfChoice-properties-"
             },
+            "enum": {
+              "$ref": "#/definitions/enum-"
+            },
             "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/items-"
             },
             "$comment": {
               "type": "string"
             },
             "description": {
               "type": "string"
             },
             "label": {
               "type": "string"
             },
             "sdfRef": {
               "$ref": "#/definitions/sdf-pointer"
             },
             "sdfRequired": {
               "$ref": "#/definitions/pointer-list"
             },
+            "units": {
+              "type": "string"
+            },
             "unit": {
               "type": "string"
             },
+            "scaleMinimum": {
+              "type": "number"
+            },
+            "scaleMaximum": {
+              "type": "number"
+            },
             "nullable": {
               "type": "boolean"
             },
+            "subtype": {
+              "$ref": "#/definitions/subtype-"
+            },
             "sdfType": {
               "$ref": "#/definitions/sdfType-"
             },
             "contentFormat": {
               "type": "string"
             },
             "observable": {
               "type": "boolean"
             },
             "readable": {
               "type": "boolean"
             },
             "writable": {
               "type": "boolean"
             }
           },
-          "additionalProperties": false
+          "additionalProperties": {
+          }
         },
         {
           "type": "object",
           "properties": {
             "enum": {
-              "type": "array",
-              "items": {
-                "type": "string"
-              },
-              "minItems": 1
+              "$ref": "#/definitions/enum-"
             },
             "type": {
               "type": "string",
               "const": "object"
             },
             "required": {
               "type": "array",
               "items": {
                 "type": "string"
               },
               "minItems": 1
             },
             "properties": {
               "$ref": "#/definitions/sdfData-sdfChoice-properties-"
             },
             "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/items-"
             },
             "$comment": {
               "type": "string"
             },
             "description": {
               "type": "string"
             },
             "label": {
               "type": "string"
             },
             "sdfRef": {
               "$ref": "#/definitions/sdf-pointer"
             },
             "sdfRequired": {
               "$ref": "#/definitions/pointer-list"
             },
+            "units": {
+              "type": "string"
+            },
             "unit": {
               "type": "string"
             },
+            "scaleMinimum": {
+              "type": "number"
+            },
+            "scaleMaximum": {
+              "type": "number"
+            },
             "nullable": {
               "type": "boolean"
             },
+            "subtype": {
+              "$ref": "#/definitions/subtype-"
+            },
             "sdfType": {
               "$ref": "#/definitions/sdfType-"
             },
             "contentFormat": {
               "type": "string"
             },
             "observable": {
               "type": "boolean"
             },
             "readable": {
               "type": "boolean"
             },
             "writable": {
               "type": "boolean"
             }
           },
-          "additionalProperties": false
-        }
-      ]
-    },
-    "dataqualities": {
-      "anyOf": [
+          "additionalProperties": {
+          }
+        },
         {
           "type": "object",
           "properties": {
             "sdfChoice": {
               "$ref": "#/definitions/sdfData-sdfChoice-properties-"
             },
             "type": {
-              "$ref": "#/definitions/type-"
+              "type": "string"
+            },
+            "enum": {
+              "$ref": "#/definitions/enum-"
             },
             "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/items-"
             },
             "$comment": {
               "type": "string"
             },
             "description": {
               "type": "string"
             },
             "label": {
               "type": "string"
             },
             "sdfRef": {
               "$ref": "#/definitions/sdf-pointer"
             },
             "sdfRequired": {
               "$ref": "#/definitions/pointer-list"
             },
+            "units": {
+              "type": "string"
+            },
             "unit": {
               "type": "string"
             },
+            "scaleMinimum": {
+              "type": "number"
+            },
+            "scaleMaximum": {
+              "type": "number"
+            },
             "nullable": {
               "type": "boolean"
             },
+            "subtype": {
+              "$ref": "#/definitions/subtype-"
+            },
             "sdfType": {
               "$ref": "#/definitions/sdfType-"
             },
             "contentFormat": {
               "type": "string"
+            },
+            "observable": {
+              "type": "boolean"
+            },
+            "readable": {
+              "type": "boolean"
+            },
+            "writable": {
+              "type": "boolean"
             }
           },
-          "additionalProperties": false
+          "additionalProperties": {
+          }
         },
         {
           "type": "object",
           "properties": {
             "enum": {
-              "type": "array",
-              "items": {
-                "type": "string"
-              },
-              "minItems": 1
+              "$ref": "#/definitions/enum-"
             },
             "type": {
-              "$ref": "#/definitions/type-"
+              "type": "string"
             },
             "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/items-"
             },
             "$comment": {
               "type": "string"
             },
             "description": {
               "type": "string"
             },
             "label": {
               "type": "string"
             },
             "sdfRef": {
               "$ref": "#/definitions/sdf-pointer"
             },
             "sdfRequired": {
               "$ref": "#/definitions/pointer-list"
             },
+            "units": {
+              "type": "string"
+            },
             "unit": {
               "type": "string"
             },
+            "scaleMinimum": {
+              "type": "number"
+            },
+            "scaleMaximum": {
+              "type": "number"
+            },
             "nullable": {
               "type": "boolean"
             },
+            "subtype": {
+              "$ref": "#/definitions/subtype-"
+            },
             "sdfType": {
               "$ref": "#/definitions/sdfType-"
             },
             "contentFormat": {
               "type": "string"
+            },
+            "observable": {
+              "type": "boolean"
+            },
+            "readable": {
+              "type": "boolean"
+            },
+            "writable": {
+              "type": "boolean"
             }
           },
-          "additionalProperties": false
-        },
+          "additionalProperties": {
+          }
+        }
+      ]
+    },
+    "dataqualities": {
+      "anyOf": [
         {
           "type": "object",
           "properties": {
             "sdfChoice": {
               "$ref": "#/definitions/sdfData-sdfChoice-properties-"
             },
             "type": {
-              "type": "string",
-              "const": "object"
-            },
-            "required": {
-              "type": "array",
-              "items": {
-                "type": "string"
-              },
-              "minItems": 1
+              "$ref": "#/definitions/type-"
             },
-            "properties": {
-              "$ref": "#/definitions/sdfData-sdfChoice-properties-"
+            "enum": {
+              "$ref": "#/definitions/enum-"
             },
             "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/items-"
             },
             "$comment": {
               "type": "string"
             },
             "description": {
               "type": "string"
             },
             "label": {
               "type": "string"
             },
             "sdfRef": {
               "$ref": "#/definitions/sdf-pointer"
             },
             "sdfRequired": {
               "$ref": "#/definitions/pointer-list"
             },
+            "units": {
+              "type": "string"
+            },
             "unit": {
               "type": "string"
             },
+            "scaleMinimum": {
+              "type": "number"
+            },
+            "scaleMaximum": {
+              "type": "number"
+            },
             "nullable": {
               "type": "boolean"
             },
+            "subtype": {
+              "$ref": "#/definitions/subtype-"
+            },
             "sdfType": {
               "$ref": "#/definitions/sdfType-"
             },
             "contentFormat": {
               "type": "string"
             }
           },
-          "additionalProperties": false
+          "additionalProperties": {
+          }
         },
         {
           "type": "object",
           "properties": {
             "enum": {
-              "type": "array",
-              "items": {
-                "type": "string"
-              },
-              "minItems": 1
+              "$ref": "#/definitions/enum-"
+            },
+            "type": {
+              "$ref": "#/definitions/type-"
+            },
+            "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/items-"
+            },
+            "$comment": {
+              "type": "string"
+            },
+            "description": {
+              "type": "string"
+            },
+            "label": {
+              "type": "string"
+            },
+            "sdfRef": {
+              "$ref": "#/definitions/sdf-pointer"
+            },
+            "sdfRequired": {
+              "$ref": "#/definitions/pointer-list"
+            },
+            "units": {
+              "type": "string"
+            },
+            "unit": {
+              "type": "string"
+            },
+            "scaleMinimum": {
+              "type": "number"
+            },
+            "scaleMaximum": {
+              "type": "number"
+            },
+            "nullable": {
+              "type": "boolean"
+            },
+            "subtype": {
+              "$ref": "#/definitions/subtype-"
+            },
+            "sdfType": {
+              "$ref": "#/definitions/sdfType-"
+            },
+            "contentFormat": {
+              "type": "string"
+            }
+          },
+          "additionalProperties": {
+          }
+        },
+        {
+          "type": "object",
+          "properties": {
+            "sdfChoice": {
+              "$ref": "#/definitions/sdfData-sdfChoice-properties-"
             },
             "type": {
               "type": "string",
               "const": "object"
             },
             "required": {
               "type": "array",
               "items": {
                 "type": "string"
               },
               "minItems": 1
             },
             "properties": {
               "$ref": "#/definitions/sdfData-sdfChoice-properties-"
             },
+            "enum": {
+              "$ref": "#/definitions/enum-"
+            },
             "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/items-"
             },
             "$comment": {
               "type": "string"
             },
             "description": {
               "type": "string"
             },
             "label": {
               "type": "string"
             },
             "sdfRef": {
               "$ref": "#/definitions/sdf-pointer"
             },
             "sdfRequired": {
               "$ref": "#/definitions/pointer-list"
             },
+            "units": {
+              "type": "string"
+            },
             "unit": {
               "type": "string"
             },
+            "scaleMinimum": {
+              "type": "number"
+            },
+            "scaleMaximum": {
+              "type": "number"
+            },
             "nullable": {
               "type": "boolean"
             },
+            "subtype": {
+              "$ref": "#/definitions/subtype-"
+            },
             "sdfType": {
               "$ref": "#/definitions/sdfType-"
             },
             "contentFormat": {
               "type": "string"
             }
           },
-          "additionalProperties": false
-        }
-      ]
-    },
-    "allowed-types": {
-      "anyOf": [
-        {
-          "type": "number"
+          "additionalProperties": {
+          }
         },
         {
-          "type": "string"
+          "type": "object",
+          "properties": {
+            "enum": {
+              "$ref": "#/definitions/enum-"
+            },
+            "type": {
+              "type": "string",
+              "const": "object"
+            },
+            "required": {
+              "type": "array",
+              "items": {
+                "type": "string"
+              },
+              "minItems": 1
+            },
+            "properties": {
+              "$ref": "#/definitions/sdfData-sdfChoice-properties-"
+            },
+            "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/items-"
+            },
+            "$comment": {
+              "type": "string"
+            },
+            "description": {
+              "type": "string"
+            },
+            "label": {
+              "type": "string"
+            },
+            "sdfRef": {
+              "$ref": "#/definitions/sdf-pointer"
+            },
+            "sdfRequired": {
+              "$ref": "#/definitions/pointer-list"
+            },
+            "units": {
+              "type": "string"
+            },
+            "unit": {
+              "type": "string"
+            },
+            "scaleMinimum": {
+              "type": "number"
+            },
+            "scaleMaximum": {
+              "type": "number"
+            },
+            "nullable": {
+              "type": "boolean"
+            },
+            "subtype": {
+              "$ref": "#/definitions/subtype-"
+            },
+            "sdfType": {
+              "$ref": "#/definitions/sdfType-"
+            },
+            "contentFormat": {
+              "type": "string"
+            }
+          },
+          "additionalProperties": {
+          }
+        },
+        {
+          "type": "object",
+          "properties": {
+            "sdfChoice": {
+              "$ref": "#/definitions/sdfData-sdfChoice-properties-"
+            },
+            "type": {
+              "type": "string"
+            },
+            "enum": {
+              "$ref": "#/definitions/enum-"
+            },
+            "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/items-"
+            },
+            "$comment": {
+              "type": "string"
+            },
+            "description": {
+              "type": "string"
+            },
+            "label": {
+              "type": "string"
+            },
+            "sdfRef": {
+              "$ref": "#/definitions/sdf-pointer"
+            },
+            "sdfRequired": {
+              "$ref": "#/definitions/pointer-list"
+            },
+            "units": {
+              "type": "string"
+            },
+            "unit": {
+              "type": "string"
+            },
+            "scaleMinimum": {
+              "type": "number"
+            },
+            "scaleMaximum": {
+              "type": "number"
+            },
+            "nullable": {
+              "type": "boolean"
+            },
+            "subtype": {
+              "$ref": "#/definitions/subtype-"
+            },
+            "sdfType": {
+              "$ref": "#/definitions/sdfType-"
+            },
+            "contentFormat": {
+              "type": "string"
+            }
+          },
+          "additionalProperties": {
+          }
+        },
+        {
+          "type": "object",
+          "properties": {
+            "enum": {
+              "$ref": "#/definitions/enum-"
+            },
+            "type": {
+              "type": "string"
+            },
+            "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/items-"
+            },
+            "$comment": {
+              "type": "string"
+            },
+            "description": {
+              "type": "string"
+            },
+            "label": {
+              "type": "string"
+            },
+            "sdfRef": {
+              "$ref": "#/definitions/sdf-pointer"
+            },
+            "sdfRequired": {
+              "$ref": "#/definitions/pointer-list"
+            },
+            "units": {
+              "type": "string"
+            },
+            "unit": {
+              "type": "string"
+            },
+            "scaleMinimum": {
+              "type": "number"
+            },
+            "scaleMaximum": {
+              "type": "number"
+            },
+            "nullable": {
+              "type": "boolean"
+            },
+            "subtype": {
+              "$ref": "#/definitions/subtype-"
+            },
+            "sdfType": {
+              "$ref": "#/definitions/sdfType-"
+            },
+            "contentFormat": {
+              "type": "string"
+            }
+          },
+          "additionalProperties": {
+          }
+        }
+      ]
+    },
+    "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
     },
+    "sdftype-name": {
+      "type": "string",
+      "pattern": "^[a-z][\\-a-z0-9]*$"
+    },
     "actionqualities": {
       "type": "object",
       "properties": {
         "$comment": {
           "type": "string"
         },
         "description": {
           "type": "string"
         },
         "label": {
           "type": "string"
         },
         "sdfRef": {
           "$ref": "#/definitions/sdf-pointer"
         },
         "sdfRequired": {
           "$ref": "#/definitions/pointer-list"
         },
         "sdfInputData": {
           "$ref": "#/definitions/parameter-list"
         },
+        "sdfRequiredInputData": {
+          "$ref": "#/definitions/pointer-list"
+        },
         "sdfOutputData": {
           "$ref": "#/definitions/parameter-list"
         },
         "sdfData": {
           "$ref": "#/definitions/sdfData-sdfChoice-properties-"
         }
       },
-      "additionalProperties": false
+      "additionalProperties": {
+      }
     },
     "parameter-list": {
-      "$ref": "#/definitions/dataqualities"
+      "anyOf": [
+        {
+          "$ref": "#/definitions/pointer-list"
+        },
+        {
+          "$ref": "#/definitions/dataqualities"
+        }
+      ]
     },
     "eventqualities": {
       "type": "object",
       "properties": {
         "$comment": {
           "type": "string"
         },
         "description": {
           "type": "string"
         },
         "label": {
           "type": "string"
         },
         "sdfRef": {
           "$ref": "#/definitions/sdf-pointer"
         },
         "sdfRequired": {
           "$ref": "#/definitions/pointer-list"
         },
         "sdfOutputData": {
           "$ref": "#/definitions/parameter-list"
         },
         "sdfData": {
           "$ref": "#/definitions/sdfData-sdfChoice-properties-"
         }
       },
-      "additionalProperties": false
+      "additionalProperties": {
+      }
     },
     "items-": {
       "type": "object",
       "properties": {
         "$comment": {
           "type": "string"
         },
         "sdfRef": {
           "$ref": "#/definitions/sdf-pointer"
         },
         "description": {
           "type": "string"
         },
         "minimum": {
           "type": "number"
         },
         "maximum": {
           "type": "number"
         },
         "format": {
           "type": "string"
         },
         "minLength": {
           "$ref": "#/definitions/uint"
         },
         "maxLength": {
           "$ref": "#/definitions/uint"
         }
       },
-      "additionalProperties": false
+      "additionalProperties": {
+      }
     },
     "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"
+        }
+      ]
+    },
+    "subtype-": {
+      "anyOf": [
+        {
+          "type": "string",
+          "const": "byte-string"
+        },
+        {
+          "type": "string",
+          "const": "unix-time"
+        },
+        {
+          "type": "string"
+        }
+      ]
+    },
+    "enum-": {
+      "type": "array",
+      "items": {
+        "$ref": "#/definitions/allowed-types"
+      },
+      "minItems": 1
+    },
     "sdfData-sdfChoice-properties-": {
       "type": "object",
       "additionalProperties": {
         "$ref": "#/definitions/dataqualities"
       }
     },
     "type-": {
       "type": "string",
       "enum": [
         "number",
         "string",
         "boolean",
         "integer",
         "array"
       ]
     },
     "sdfEvent-": {
       "type": "object",
       "additionalProperties": {
         "$ref": "#/definitions/eventqualities"
       }
     },
     "sdfAction-": {
       "type": "object",
       "additionalProperties": {
         "$ref": "#/definitions/actionqualities"
       }
     },
     "sdfProperty-": {
       "type": "object",
       "additionalProperties": {
         "$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="I-D.handrews-json-schema-validation-01"/>.
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 something.</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
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 are available 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.
Note that the previous version of the present document 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 restored).</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 constrain 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>characters;</li>
          <li>character classes in square brackets, including ranges; their complements;</li>
          <li>simple quantifiers <tt>*</tt>, <tt>+</tt>, <tt>?</tt>, and range quantifiers <tt>{n}</tt>,
<tt>{n,m}</tt>, and <tt>{n,}</tt>;</li>
          <li>grouping parentheses;</li>
          <li>the choice operator <tt>|</tt>;</li>
          <li>and anchors (beginning-of-input <tt>^</tt> and end-of-input <tt>$</tt>).</li>
        </ul>
        <t>Note that this subset is somewhat similar to the subset introduced by
iregexps <xref target="I-D.ietf-jsonpath-iregexp"/>, 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>"<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.</li>
          <li>"<tt>uri</tt>", "<tt>uri-reference</tt>":
An <xref target="RFC3986"/> URI or URI Reference, respectively.</li>
          <li>"<tt>uuid</tt>": An <xref target="RFC4122"/> UUID.</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 ("objects").</t>
        <t>The additional quality "<tt>properties</tt>" is a map the entries of which
describe entries in the specified JSON object: The key gives an
allowable map key for the specified JSON object, and the value is a
map with a named set of data qualities giving the type for the
corresponding value in the specified JSON object.</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>E.g., <xref target="OCF"/> is based on Swagger 2.0 which appears to be based on
"draft-4" <xref target="I-D.wright-json-schema"/> (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>
        <t>TBD: add any useful implementation notes we can find for other
ecosystems that use JSO.</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">
          <artwork><![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
        }
      }
    }
  }
}
]]></artwork>
        </figure>
      </section>
      <section anchor="fridge-freezer-example">
        <name>Refrigerator-Freezer Example</name>
        <figure anchor="exa-sdfthing-fridge-freezer">
          <artwork><![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"
    }
  }
}
]]></artwork>
        </figure>
      </section>
    </section>
    <section numbered="false" anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>This draft is based on <tt>sdf.md</tt> and <tt>sdf-schema.json</tt> in the old
one-data-model <tt>language</tt> repository, as well as <contact fullname="Ari Keränen"/>'s
"alt-schema" from the Ericsson Research <tt>ipso-odm</tt> repository (which
is now under subdirectory <tt>sdflint</tt> in the one-data model <tt>tools</tt>
repository).</t>
      <!--  LocalWords:  SDF namespace defaultNamespace instantiation OMA
 -->
<!--  LocalWords:  affordances ZigBee LWM OCF sdfObject sdfThing
 -->
<!--  LocalWords:  idempotency 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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
zlm2Zokjip523Lvans5hYOrtvKzVM8/1W4VY2nVYPnuwu8epOk4f96rD4KDP
k2OQcnlzblXbqO0BYncSTL16ilZOqdtW5PbXAZDUgEnKmO+zfIK5qI9m2WJU
JOWEdhc37L1WKdpVaDZS6G4LaJplzceKVU98rRz2ejjK82SMLqjqRK4LRQJH
CmtC7Np9l2dYDBQmTFvlyEf8ROAryuMB1hXCCWEKUv6bUfkVaYdygQCZ8xZI
X+MBkjIQG/QJk/hfBmaWzZARUWEfvU90XAdWmQauD1H7+P536KIkiqHytFsJ
jP5bAgPg2UbtFHo4evLmqQlIFDH0Kk1m8RvM5zks0wTPmtq9yVuG9PhllRwT
7WLRkpcvcOtbIwz5tm0D3kKHy/qkKHcenaA/TD2Ts7TEFggJRUCfZpVadBx7
4j7w6EGAsfbU66BQFGIDi7IRVYCS0VXKaRvOKFt6Klopr/p/K84FLd/VOByC
VP7exQWPHe9FW2ugfuVKgcHk62JczFwtnsjRU7X9G4RlwJ1eXrqzpu+BQPZv
PWuolso/wf689+mn9yhZ3papU65Nhb2i102G5tjXq5QcGkV5js9Fh9SRqvP5
qJhpYoy1D3fV3ENyl6p5NA2tcmchUk1/Xd29KzsJqu81S+95dfewoxuV3mvX
3cMu/NJ7ZovdDOJNC+rtLQrYX1zx63gJ6wf7R+2sVFVNQgNncMACarfJhj9J
3zNiEe/ADsYYsePqaTrwFHi5hNuv2U4lA9Hi6l04LeVN9XJ0rzVAfvjNi6em
XALr6y3wnV6T498b3HOD9cOyxGJzbVSps9WKjT9u7597ZmuC7vyx2n1s/bbe
DhZn6v3zq99jxuQ/P3mG12S8spUKoyu3pyT6gca/srKVZ0P2KmK1bjmFnmXm
4gJTtZxEu2/1Yu+Lj37MF5dXQGN6nS+3SnKRRfYagPu7Xnb8ATJQ7JaPeS7M
eI2yXBykxJW5XMEtYz605JbxSm55FbcAh4/49GL49CjjyjzWKOc7y9m8XVUg
xzo7NJMQBZUZXiT230L/3evT4d7wKjAC3ftjVlx4i9vz1ZEUGBKO7tcEE+d1
5PeiUSLvrW/54uI4/zGnAmoS3NTmEDCVJ+9RjweWhpF5XZe0f0obEN7m6lgp
6XnlUg5d0UqkF5w46jHVGL4lmecZ8WGNyKsJh/Jktm6avM7wclbaq8X90hAR
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
46W/A5F2TLyLXgNk25cbjOF2hO7d/3mdFUPdcuXiO3TftqvNWf+LnfW35Gxh
DboP4jAYo/PhxzDXzbsmetTet7Y/9nRcs1PfM72m1/+2x/A/hlDzNxQWLIlc
nwEHNND1mh5G+jxrs8Ub0GwT6OZSbw6AzQGwOQD+3gfA34pltUIfgv2f5Ocv
EWgv6PwGrH0Vk1BUNW6yv9YKXItAm+vig3rdsci31O7zk+BVuUv9Iny8sk9s
Dn1+0ugzfFVvQr8uoIHT/CokiP3il+re1Rlud98omHxVTxIEdfuemv7/O+3y
zqB00QZ30Zk69W6wzo3js7tf9Qrecb8S57B25h1Guo6e2MV5A/AkkOEaGO2U
RW458VUizi279QIn1uJUffJXdNchb64Fkd3CV/W6SnAIILzeqq8RIj6gt06B
4gP66RYueO43EDBW990taKwZYIWwISOERxuHv3adbU0srD/OpP79zZEZghOE
0a6DSjlkE6qu7jzufdPuwtYajPthu60BmgTxXl+s0ADdq6DU2NwbUeSbbjko
fDsIur2DrePibu+Cf2nE7l30pbG+H9KX//UytC1fR7Zf1zAglRUGmruS3K3Q
G5vwhzXGc/rdnSONXzroo9Hist2bdyTv3Uz+bvbcCckt9YTw1Y1MbzYy/S07
28j0G5l+I9N/YG8bmd5sZPqNTL+R6bv62sj0/42s8Q2i6rcaqCyts7ySUNaw
1BUeVvv7ylPyKupvA9LUWNZDvW6x7mpBNq6Mdd1v1J4Pnu9G7dmoPXfV7Ubt
uU1vG7XHbNSejdqzUXu6+tqoPf/XujI2Spb5GylZYZcbhchsFKJbdrZRiDYK
0UYh+sDeNgqR2ShEG4VooxB19fX3UIhi14N8fMsftJOw6K6vcnjZGTdXq+yX
/1nepKZmtTZm66bM7y4cJuvnsdEPzEY/uGVnG/1gox9s9IMP7G2jH5iNfrDR
D35Z/WD98jT0g1WLYzG6vrdAP7hlX4F+cGVfwc8bh8k/lsPkTvWI9WNuZH6z
kflv2dlG5t/I/BuZ/wN728j8ZiPzb2T+jczf1dffQ+aPvZduY9nXj2/5g/bW
4VGw1aP+J9Z7WqWq2OCnZoNW8FPQoKmOhMFP/3B6Ud2938MpNlb2etrRFau3
8aas636jWX3wfDea1UazuqtuN5rVbXrbaFZmo1ltNKu/ZbTVh+ocGz/D3foZ
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
c1KrZlHmEDOtC9HiAHM/vMJ/ATvBokoyDAIA

-->

</rfc>
