<?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-rfc2629 version 1.6.2 (Ruby 3.1.1) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-asdf-sdf-11" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.12.1 -->
  <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-11"/>
    <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>
    <date year="2022" month="February" day="28"/>
    <area>Applications</area>
    <workgroup>ASDF</workgroup>
    <keyword>Internet-Draft</keyword>
    <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.</t>
      <t>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.</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 (-11) collects a few smaller changes as input
to the 2022-02-28 ASDF WG interim.
It also removes deprecated elements from SDF 1.0.</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/"/>.
      </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>
    <section anchor="introduction">
      <name>Introduction</name>
      <!-- Just copying the abstract, for now... -->

<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.</t>
      <t>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.</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 (-11) collects a few smaller changes as input
to the 2022-02-28 ASDF WG interim.
It also removes deprecated elements from SDF 1.0.</cref></t>
      <section anchor="terminology-and-conventions">
        <name>Terminology and Conventions</name>
        <!-- Note: Should we use RFC 2119? -->

<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.  (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 reference to and a use of 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.</t>
          </dd>
        </dl>
        <!-- XXX -->

<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>
      </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="444px" preserveAspectRatio="none" version="1.1" viewBox="0 0 431 444" width="431px">
                <defs/>
                <g>
                  <!--MD5=[f586c7dc61127226118a576b1af9a47e]
class sdfThing-->
    <rect fill="white" height="48" id="sdfThing" width="82" x="172.5" y="7" stroke="black" stroke-width="1.5"/>
                  <ellipse cx="187.5" cy="23" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/>
                  <path d="M189.9731,29.1431 Q189.3921,29.4419 188.7529,29.5913 Q188.1138,29.7407 187.4082,29.7407 Q184.9014,29.7407 183.5815,28.0889 Q182.2617,26.437 182.2617,23.3159 Q182.2617,20.1865 183.5815,18.5347 Q184.9014,16.8828 187.4082,16.8828 Q188.1138,16.8828 188.7612,17.0322 Q189.4087,17.1816 189.9731,17.4805 L189.9731,20.2031 Q189.3423,19.6221 188.7488,19.3523 Q188.1553,19.0825 187.5244,19.0825 Q186.1797,19.0825 185.4949,20.1492 Q184.8101,21.2158 184.8101,23.3159 Q184.8101,25.4077 185.4949,26.4744 Q186.1797,27.541 187.5244,27.541 Q188.1553,27.541 188.7488,27.2712 Q189.3423,27.0015 189.9731,26.4204 Z " fill="black"/>
                  <text fill="black" font-family="sans-serif" font-size="12" x="201.5" y="27.5352">sdfThing</text>
                  <line x1="173.5" x2="253.5" y1="39" y2="39" stroke="black" stroke-width="1.5"/>
                  <line x1="173.5" x2="253.5" y1="47" y2="47" stroke="black" stroke-width="1.5"/>
                  <!--MD5=[c2cb69c003582447ed3e9466f0338261]
class sdfObject-->
    <rect fill="white" height="48" id="sdfObject" width="88" x="169.5" y="132" stroke="black" stroke-width="1.5"/>
                  <ellipse cx="184.5" cy="148" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/>
                  <path d="M186.9731,154.1431 Q186.3921,154.4419 185.7529,154.5913 Q185.1138,154.7407 184.4082,154.7407 Q181.9014,154.7407 180.5815,153.0889 Q179.2617,151.437 179.2617,148.3159 Q179.2617,145.1865 180.5815,143.5347 Q181.9014,141.8828 184.4082,141.8828 Q185.1138,141.8828 185.7612,142.0322 Q186.4087,142.1816 186.9731,142.4805 L186.9731,145.2031 Q186.3423,144.6221 185.7488,144.3523 Q185.1553,144.0825 184.5244,144.0825 Q183.1797,144.0825 182.4949,145.1492 Q181.8101,146.2158 181.8101,148.3159 Q181.8101,150.4077 182.4949,151.4744 Q183.1797,152.541 184.5244,152.541 Q185.1553,152.541 185.7488,152.2712 Q186.3423,152.0015 186.9731,151.4204 Z " fill="black"/>
                  <text fill="black" font-family="sans-serif" font-size="12" x="198.5" y="152.5352">sdfObject</text>
                  <line x1="170.5" x2="256.5" y1="164" y2="164" stroke="black" stroke-width="1.5"/>
                  <line x1="170.5" x2="256.5" y1="172" y2="172" stroke="black" stroke-width="1.5"/>
                  <!--MD5=[79be1817db664391ee5ba2fd11c31888]
class sdfProperty-->
    <rect fill="white" height="48" id="sdfProperty" width="99" x="7" y="257" stroke="black" stroke-width="1.5"/>
                  <ellipse cx="22" cy="273" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/>
                  <path d="M24.4731,279.1431 Q23.8921,279.4419 23.2529,279.5913 Q22.6138,279.7407 21.9082,279.7407 Q19.4014,279.7407 18.0815,278.0889 Q16.7617,276.437 16.7617,273.3159 Q16.7617,270.1865 18.0815,268.5347 Q19.4014,266.8828 21.9082,266.8828 Q22.6138,266.8828 23.2612,267.0322 Q23.9087,267.1816 24.4731,267.4805 L24.4731,270.2031 Q23.8423,269.6221 23.2488,269.3523 Q22.6553,269.0825 22.0244,269.0825 Q20.6797,269.0825 19.9949,270.1492 Q19.3101,271.2158 19.3101,273.3159 Q19.3101,275.4077 19.9949,276.4744 Q20.6797,277.541 22.0244,277.541 Q22.6553,277.541 23.2488,277.2712 Q23.8423,277.0015 24.4731,276.4204 Z " fill="black"/>
                  <text fill="black" font-family="sans-serif" font-size="12" x="36" y="277.5352">sdfProperty</text>
                  <line x1="8" x2="105" y1="289" y2="289" stroke="black" stroke-width="1.5"/>
                  <line x1="8" x2="105" y1="297" y2="297" stroke="black" stroke-width="1.5"/>
                  <!--MD5=[bdacf205fe3695f723a4cfa5db06fd81]
class sdfAction-->
    <rect fill="white" height="48" id="sdfAction" width="85" x="171" y="257" stroke="black" stroke-width="1.5"/>
                  <ellipse cx="186" cy="273" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/>
                  <path d="M188.4731,279.1431 Q187.8921,279.4419 187.2529,279.5913 Q186.6138,279.7407 185.9082,279.7407 Q183.4014,279.7407 182.0815,278.0889 Q180.7617,276.437 180.7617,273.3159 Q180.7617,270.1865 182.0815,268.5347 Q183.4014,266.8828 185.9082,266.8828 Q186.6138,266.8828 187.2612,267.0322 Q187.9087,267.1816 188.4731,267.4805 L188.4731,270.2031 Q187.8423,269.6221 187.2488,269.3523 Q186.6553,269.0825 186.0244,269.0825 Q184.6797,269.0825 183.9949,270.1492 Q183.3101,271.2158 183.3101,273.3159 Q183.3101,275.4077 183.9949,276.4744 Q184.6797,277.541 186.0244,277.541 Q186.6553,277.541 187.2488,277.2712 Q187.8423,277.0015 188.4731,276.4204 Z " fill="black"/>
                  <text fill="black" font-family="sans-serif" font-size="12" x="200" y="277.5352">sdfAction</text>
                  <line x1="172" x2="255" y1="289" y2="289" stroke="black" stroke-width="1.5"/>
                  <line x1="172" x2="255" y1="297" y2="297" stroke="black" stroke-width="1.5"/>
                  <!--MD5=[ccecbd8aeb25c61fe37a32079d0173e2]
class sdfEvent-->
    <rect fill="white" height="48" id="sdfEvent" width="81" x="315" y="257" stroke="black" stroke-width="1.5"/>
                  <ellipse cx="330" cy="273" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/>
                  <path d="M332.4731,279.1431 Q331.8921,279.4419 331.2529,279.5913 Q330.6138,279.7407 329.9082,279.7407 Q327.4014,279.7407 326.0815,278.0889 Q324.7617,276.437 324.7617,273.3159 Q324.7617,270.1865 326.0815,268.5347 Q327.4014,266.8828 329.9082,266.8828 Q330.6138,266.8828 331.2612,267.0322 Q331.9087,267.1816 332.4731,267.4805 L332.4731,270.2031 Q331.8423,269.6221 331.2488,269.3523 Q330.6553,269.0825 330.0244,269.0825 Q328.6797,269.0825 327.9949,270.1492 Q327.3101,271.2158 327.3101,273.3159 Q327.3101,275.4077 327.9949,276.4744 Q328.6797,277.541 330.0244,277.541 Q330.6553,277.541 331.2488,277.2712 Q331.8423,277.0015 332.4731,276.4204 Z " fill="black"/>
                  <text fill="black" font-family="sans-serif" font-size="12" x="344" y="277.5352">sdfEvent</text>
                  <line x1="316" x2="395" y1="289" y2="289" stroke="black" stroke-width="1.5"/>
                  <line x1="316" x2="395" y1="297" y2="297" stroke="black" stroke-width="1.5"/>
                  <!--MD5=[154484d28240d22ab997079d2c9ce9cd]
class sdfData-->
    <rect fill="white" height="48" id="sdfData" width="77" x="142" y="382" stroke="black" stroke-width="1.5"/>
                  <ellipse cx="157" cy="398" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/>
                  <path d="M159.4731,404.1431 Q158.8921,404.4419 158.2529,404.5913 Q157.6138,404.7407 156.9082,404.7407 Q154.4014,404.7407 153.0815,403.0889 Q151.7617,401.437 151.7617,398.3159 Q151.7617,395.1865 153.0815,393.5347 Q154.4014,391.8828 156.9082,391.8828 Q157.6138,391.8828 158.2612,392.0322 Q158.9087,392.1816 159.4731,392.4805 L159.4731,395.2031 Q158.8423,394.6221 158.2488,394.3523 Q157.6553,394.0825 157.0244,394.0825 Q155.6797,394.0825 154.9949,395.1492 Q154.3101,396.2158 154.3101,398.3159 Q154.3101,400.4077 154.9949,401.4744 Q155.6797,402.541 157.0244,402.541 Q157.6553,402.541 158.2488,402.2712 Q158.8423,402.0015 159.4731,401.4204 Z " fill="black"/>
                  <text fill="black" font-family="sans-serif" font-size="12" x="171" y="402.5352">sdfData</text>
                  <line x1="143" x2="218" y1="414" y2="414" stroke="black" stroke-width="1.5"/>
                  <line x1="143" x2="218" y1="422" y2="422" stroke="black" stroke-width="1.5"/>
                  <!--MD5=[474ac19abf738d5435f62202b2040a8c]
link sdfThing to sdfObject-->
    <path d="M213.5,55.14 C213.5,75.49 213.5,105.19 213.5,126.91 " fill="none" id="sdfThing-to-sdfObject" stroke="black" stroke-width="1.0"/>
                  <polygon fill="black" points="213.5,131.97,217.5,122.97,213.5,126.97,209.5,122.97,213.5,131.97" stroke="black" stroke-width="1.0"/>
                  <text fill="black" font-family="sans-serif" font-size="13" x="214.5" y="98.5684">hasObject</text>
                  <text fill="black" font-family="sans-serif" font-size="13" x="193.0813" y="121.1064">0+</text>
                  <!--MD5=[84a99f3e6ba5135b350f4e647ff40b17]
link sdfThing to sdfThing-->
    <path d="M254.55,19.58 C273.25,18.41 289.5,22.22 289.5,31 C289.5,38.96 276.15,42.83 259.73,42.62 " fill="none" id="sdfThing-to-sdfThing" stroke="black" stroke-width="1.0"/>
                  <polygon fill="black" points="254.55,42.42,263.3953,46.7513,259.5466,42.6056,263.6923,38.7568,254.55,42.42" stroke="black" stroke-width="1.0"/>
                  <text fill="black" font-family="sans-serif" font-size="13" x="295.5" y="36.0684">hasThing</text>
                  <text fill="black" font-family="sans-serif" font-size="13" x="262.5267" y="40.6379">0+</text>
                  <!--MD5=[c9f4ee01ef3119b1a79851932bb5a9a6]
link sdfObject to sdfProperty-->
    <path d="M173.07,180.22 C158.87,188.97 143.08,199.38 129.5,210 C112.81,223.05 95.64,239.35 82.14,252.93 " fill="none" id="sdfObject-to-sdfProperty" stroke="black" stroke-width="1.0"/>
                  <polygon fill="black" points="78.44,256.69,87.6036,253.0805,81.9469,253.1261,81.9013,247.4694,78.44,256.69" stroke="black" stroke-width="1.0"/>
                  <text fill="black" font-family="sans-serif" font-size="13" x="130.5" y="223.5684">hasProperty</text>
                  <text fill="black" font-family="sans-serif" font-size="13" x="63.7559" y="246.1468">0+</text>
                  <!--MD5=[ec9a56bd8655f4d1893aa031ec22e05c]
link sdfObject to sdfAction-->
    <path d="M213.5,180.14 C213.5,200.49 213.5,230.19 213.5,251.91 " fill="none" id="sdfObject-to-sdfAction" stroke="black" stroke-width="1.0"/>
                  <polygon fill="black" points="213.5,256.97,217.5,247.97,213.5,251.97,209.5,247.97,213.5,256.97" stroke="black" stroke-width="1.0"/>
                  <text fill="black" font-family="sans-serif" font-size="13" x="214.5" y="223.5684">hasAction</text>
                  <text fill="black" font-family="sans-serif" font-size="13" x="193.0813" y="246.1064">0+</text>
                  <!--MD5=[e82b08c6210a768f8efa9371b7de17ad]
link sdfObject to sdfEvent-->
    <path d="M247.28,180.26 C259.62,189.17 273.49,199.68 285.5,210 C301.11,223.41 317.43,239.59 330.38,253.02 " fill="none" id="sdfObject-to-sdfEvent" stroke="black" stroke-width="1.0"/>
                  <polygon fill="black" points="333.94,256.73,330.5912,247.4679,330.4767,253.1236,324.821,253.0091,333.94,256.73" stroke="black" stroke-width="1.0"/>
                  <text fill="black" font-family="sans-serif" font-size="13" x="304.5" y="223.5684">hasEvent</text>
                  <text fill="black" font-family="sans-serif" font-size="13" x="308.109" y="246.1971">0+</text>
                  <!--MD5=[7eee11d65eceecf8b941af956a7f2b88]
link sdfAction to sdfData-->
    <path d="M170.82,293.49 C149.97,301.5 126.77,314.51 114.5,335 C103.81,352.85 119.15,369.91 137.72,382.71 " fill="none" id="sdfAction-to-sdfData" stroke="black" stroke-width="1.0"/>
                  <polygon fill="black" points="141.98,385.54,136.7103,377.2195,137.8197,382.7665,132.2727,383.8759,141.98,385.54" stroke="black" stroke-width="1.0"/>
                  <text fill="black" font-family="sans-serif" font-size="13" x="115.5" y="348.5684">hasInputData</text>
                  <text fill="black" font-family="sans-serif" font-size="13" x="116.1095" y="378.5032">1+</text>
                  <!--MD5=[7eee11d65eceecf8b941af956a7f2b88]
link sdfAction to sdfData-->
    <path d="M212.27,305.04 C211.1,318.86 208.85,336.68 204.5,352 C202.12,360.37 198.63,369.11 195.04,377.01 " fill="none" id="sdfAction-to-sdfData-1" stroke="black" stroke-width="1.0"/>
                  <polygon fill="black" points="192.8,381.82,200.2318,375.3572,194.9152,377.2894,192.9829,371.9728,192.8,381.82" stroke="black" stroke-width="1.0"/>
                  <text fill="black" font-family="sans-serif" font-size="13" x="208.5" y="348.5684">hasOutputData</text>
                  <text fill="black" font-family="sans-serif" font-size="13" x="175.6456" y="371.3101">0+</text>
                  <!--MD5=[1d999dc69acbeb1774ac85a19f512fd6]
link sdfEvent to sdfData-->
    <path d="M345.94,305.15 C338.7,320.24 327.43,339.4 312.5,352 C287.09,373.44 251.9,386.99 224.25,395.01 " fill="none" id="sdfEvent-to-sdfData" stroke="black" stroke-width="1.0"/>
                  <polygon fill="black" points="219.18,396.45,228.9277,397.858,223.9924,395.0934,226.7571,390.1581,219.18,396.45" stroke="black" stroke-width="1.0"/>
                  <text fill="black" font-family="sans-serif" font-size="13" x="328.5" y="348.5684">hasOutputData</text>
                  <text fill="black" font-family="sans-serif" font-size="13" x="227.077" y="391.2202">1+</text>
                  <!--MD5=[0c4745fb3134cadd1f7ab6e63b3ea9cc]
link sdfProperty to sdfData-->
    <path d="M32.44,305.12 C20.65,319.29 11.01,337.45 21.5,352 C47.45,388 98.9,399.92 136.27,403.67 " fill="none" id="sdfProperty-to-sdfData" stroke="black" stroke-width="1.0"/>
                  <polygon fill="black" points="141.68,404.16,133.0828,399.3549,136.7009,403.7035,132.3524,407.3215,141.68,404.16" stroke="black" stroke-width="1.0"/>
                  <text fill="black" font-family="sans-serif" font-size="13" x="22.5" y="348.5684">isInstanceOf</text>
                  <text fill="black" font-family="sans-serif" font-size="13" x="126.0527" y="400.0923">1</text>
                  <!--MD5=[427578311f1bb7e6d08d706b9815e3ff]
@startuml

sdfThing - -> "0+" sdfObject : hasObject
sdfThing - -> "0+" sdfThing : hasThing

sdfObject - -> "0+" sdfProperty : hasProperty
sdfObject - -> "0+" sdfAction : hasAction
sdfObject - -> "0+" sdfEvent : hasEvent

sdfAction - -> "1+" sdfData : hasInputData
sdfAction - -> "0+" sdfData : hasOutputData

sdfEvent - -> "1+" sdfData : hasOutputData

sdfProperty - -> "1" sdfData : isInstanceOf

class sdfThing {
}

class sdfObject {
}

class sdfProperty {
}

class sdfAction {
}

class sdfEvent {
}

class sdfData {
}

@enduml

PlantUML version 1.2022.1(Tue Feb 01 19:19:58 CET 2022)
(GPL source distribution)
Java Runtime: OpenJDK Runtime Environment
JVM: OpenJDK 64-Bit Server VM
Default Encoding: utf-8
Language: en
Country: DE
-->
  </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>Optional qualities "minItems" and "maxItems" can be used to define
sdfObjects as arrays.</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 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.</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.</t>
          <t>A definition in an <tt>sdfThing</tt> group can refine the metadata of the definitions it
is composed from: other definitions in <tt>sdfThing</tt> groups definitions in <tt>sdfObject</tt> groups.</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>A 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, format TBD</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>
          </tbody>
        </table>
        <t>While the format of the version string is marked as TBD, it is intended 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).</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>
      </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.  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 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"/>.)</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.
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>TODO: Make sure that the grammar in <xref target="syntax"/> allows specifying the
null values that are necessary to remove members in a merge-patch.</t>
      </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</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>
        </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 SDF.</t>
          <t>To aid interworking with <xref target="I-D.handrews-json-schema-validation"/> 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"/>, 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 SDF 1.1 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 future versions
of this specification.</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).</t>
          <t>sdfChoice merges the functions of two constructs found in <xref target="I-D.handrews-json-schema-validation"/>:</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"/> 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"/> 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"/>.</t>
          <t>As a simplification for readers of SDF specifications accustomed to
the <xref target="I-D.handrews-json-schema-validation"/> 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>
        </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>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.</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.</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>
          </tbody>
        </table>
      </section>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <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">
          <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>
        <t>// RFC Ed.: please replace RFC XXXX with this RFC number and remove this note.</t>
        <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>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>(TBD: After future additions, check if we need any.)</t>
      </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>
    <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>
            <date/>
          </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>
            <date/>
          </front>
        </reference>
        <reference anchor="RFC3339" target="https://www.rfc-editor.org/info/rfc3339">
          <front>
            <title>Date and Time on the Internet: Timestamps</title>
            <author fullname="G. Klyne" initials="G." surname="Klyne">
              <organization/>
            </author>
            <author fullname="C. Newman" initials="C." surname="Newman">
              <organization/>
            </author>
            <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" target="https://www.rfc-editor.org/info/rfc8428">
          <front>
            <title>Sensor Measurement Lists (SenML)</title>
            <author fullname="C. Jennings" initials="C." surname="Jennings">
              <organization/>
            </author>
            <author fullname="Z. Shelby" initials="Z." surname="Shelby">
              <organization/>
            </author>
            <author fullname="J. Arkko" initials="J." surname="Arkko">
              <organization/>
            </author>
            <author fullname="A. Keranen" initials="A." surname="Keranen">
              <organization/>
            </author>
            <author fullname="C. Bormann" initials="C." surname="Bormann">
              <organization/>
            </author>
            <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" target="https://www.rfc-editor.org/info/rfc8798">
          <front>
            <title>Additional Units for Sensor Measurement Lists (SenML)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann">
              <organization/>
            </author>
            <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" target="https://www.rfc-editor.org/info/rfc3986">
          <front>
            <title>Uniform Resource Identifier (URI): Generic Syntax</title>
            <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee">
              <organization/>
            </author>
            <author fullname="R. Fielding" initials="R." surname="Fielding">
              <organization/>
            </author>
            <author fullname="L. Masinter" initials="L." surname="Masinter">
              <organization/>
            </author>
            <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" target="https://www.rfc-editor.org/info/rfc4122">
          <front>
            <title>A Universally Unique IDentifier (UUID) URN Namespace</title>
            <author fullname="P. Leach" initials="P." surname="Leach">
              <organization/>
            </author>
            <author fullname="M. Mealling" initials="M." surname="Mealling">
              <organization/>
            </author>
            <author fullname="R. Salz" initials="R." surname="Salz">
              <organization/>
            </author>
            <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" target="https://www.rfc-editor.org/info/rfc6901">
          <front>
            <title>JavaScript Object Notation (JSON) Pointer</title>
            <author fullname="P. Bryan" initials="P." role="editor" surname="Bryan">
              <organization/>
            </author>
            <author fullname="K. Zyp" initials="K." surname="Zyp">
              <organization/>
            </author>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham">
              <organization/>
            </author>
            <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" target="https://www.rfc-editor.org/info/rfc7396">
          <front>
            <title>JSON Merge Patch</title>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman">
              <organization/>
            </author>
            <author fullname="J. Snell" initials="J." surname="Snell">
              <organization/>
            </author>
            <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" target="https://www.rfc-editor.org/info/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">
              <organization/>
            </author>
            <author fullname="C. Vigano" initials="C." surname="Vigano">
              <organization/>
            </author>
            <author fullname="C. Bormann" initials="C." surname="Bormann">
              <organization/>
            </author>
            <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" target="https://www.rfc-editor.org/info/rfc8949">
          <front>
            <title>Concise Binary Object Representation (CBOR)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann">
              <organization/>
            </author>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman">
              <organization/>
            </author>
            <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="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" initials="M." surname="Birbeck">
              <organization/>
            </author>
            <author fullname="Shane McCarron" initials="S." surname="McCarron">
              <organization/>
            </author>
            <date day="16" month="December" year="2010"/>
          </front>
          <seriesInfo name="World Wide Web Consortium NOTE" value="NOTE-curie-20101216"/>
        </reference>
        <reference anchor="RFC0020" target="https://www.rfc-editor.org/info/rfc20">
          <front>
            <title>ASCII format for network interchange</title>
            <author fullname="V.G. Cerf" initials="V.G." surname="Cerf">
              <organization/>
            </author>
            <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" target="https://www.rfc-editor.org/info/rfc9165">
          <front>
            <title>Additional Control Operators for the Concise Data Definition Language (CDDL)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann">
              <organization/>
            </author>
            <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" target="https://www.rfc-editor.org/info/rfc2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner">
              <organization/>
            </author>
            <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" target="https://www.rfc-editor.org/info/rfc8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba">
              <organization/>
            </author>
            <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" target="https://www.rfc-editor.org/info/rfc3553">
          <front>
            <title>An IETF URN Sub-namespace for Registered Protocol Parameters</title>
            <author fullname="M. Mealling" initials="M." surname="Mealling">
              <organization/>
            </author>
            <author fullname="L. Masinter" initials="L." surname="Masinter">
              <organization/>
            </author>
            <author fullname="T. Hardie" initials="T." surname="Hardie">
              <organization/>
            </author>
            <author fullname="G. Klyne" initials="G." surname="Klyne">
              <organization/>
            </author>
            <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" target="https://www.ietf.org/archive/id/draft-handrews-json-schema-validation-02.txt">
          <front>
            <title>JSON Schema Validation: A Vocabulary for Structural Validation of JSON</title>
            <author fullname="Austin Wright">
	 </author>
            <author fullname="Henry Andrews">
	 </author>
            <author fullname="Ben Hutton">
              <organization>Wellcome Sanger Institute</organization>
            </author>
            <date day="17" month="September" year="2019"/>
            <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-02"/>
        </reference>
        <reference anchor="I-D.wright-json-schema" target="https://www.ietf.org/archive/id/draft-wright-json-schema-01.txt">
          <front>
            <title>JSON Schema: A Media Type for Describing JSON Documents</title>
            <author fullname="Austin Wright">
	 </author>
            <author fullname="Henry Andrews">
	 </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" target="https://www.ietf.org/archive/id/draft-irtf-t2trg-rest-iot-09.txt">
          <front>
            <title>Guidance on RESTful Design for Internet of Things Systems</title>
            <author fullname="Ari Keranen">
              <organization>Ericsson</organization>
            </author>
            <author fullname="Matthias Kovatsch">
              <organization>Huawei Technologies</organization>
            </author>
            <author fullname="Klaus Hartke">
	 </author>
            <date day="26" month="February" year="2022"/>
            <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-09"/>
        </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"/>
        </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" target="https://www.rfc-editor.org/info/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">
              <organization/>
            </author>
            <author fullname="S. Kumar" initials="S." surname="Kumar">
              <organization/>
            </author>
            <author fullname="M. Sethi" initials="M." surname="Sethi">
              <organization/>
            </author>
            <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="I-D.bormann-jsonpath-iregexp" target="https://www.ietf.org/archive/id/draft-bormann-jsonpath-iregexp-02.txt">
          <front>
            <title>I-Regexp: An Interoperable Regexp Format</title>
            <author fullname="Carsten Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <date day="17" month="January" year="2022"/>
            <abstract>
              <t>   "Regular expressions" (regexps) are a set of related, widely
   implemented pattern languages used in data modeling formats and query
   languages that is available in many dialects.  This specification
   defines an interoperable flavor of regexps, I-Regexp.

   The present version -02 of this document is a more streamlined update
   of the original trial balloon, meant to determine whether this
   approach is useful for the JSONPath WG.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-bormann-jsonpath-iregexp-02"/>
        </reference>
      </references>
    </references>
    <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 Ari Keranen's "alt-schema" and
Michael Koster's "schema", with a view of covering the syntax that is
currently in use at 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: sdfinfo                  ; This will be required in most process policies, but not a syntax error
 ? namespace: named<text>
 ? defaultNamespace: text
 ? sdfThing: named<thingqualities>       ; Thing is a composition of objects that work together in some way
 ? sdfProduct: named<productqualities>   ; Product is a composition of things and objects that can model a SKU-level instance of a product
 ? sdfObject: named<objectqualities>     ; Object is a set of Properties, Actions, and Events that together perform a particular function
 ? sdfProperty: named<propertyqualities> ; Property represents the state of an instance of an object
 ? sdfAction: named<actionqualities>     ; Action is a directive to invoke an application layer verb associated with an object
 ? sdfEvent: named<eventqualities>       ; Event represents an occurrence of something associated with an object
 ? sdfData: named<dataqualities>         ; 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
 EXTENSION-POINT<"top-ext">
}

sdfinfo = {
 ? title: text
 ? version: text
 ? copyright: text
 ? license: text
 EXTENSION-POINT<"info-ext">
}

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

EXTENSION-POINT<f> = ( * (text .feature f) => any ) ; only used in framework syntax

sdf-pointer = text ; .regexp curie-regexp -- TO DO!
pointer-list = [* sdf-pointer]  ; ISSUE: no point in having an empty list, no? but used for sdfRequired in odmobject-multiple_axis_joystick.sdf.json

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

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

productqualities = thingqualities ; ISSUE: get rid of sdfProduct?

; for single objects, or for arrays of objects (1.2)
objectqualities = {
 commonqualities
 ? ("minItems" .feature "1.2") => number
 ? ("maxItems" .feature "1.2") => number
 ? sdfProperty: named<propertyqualities>
 ? sdfAction: named<actionqualities>
 ? sdfEvent: named<eventqualities>
 ? sdfData: named<dataqualities>
 EXTENSION-POINT<"object-ext">
}

propertyqualities = dataqualities ; the definitions in sdfData are declarations in sdfProperty

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 (a bit redundant)
 ? ("sdfRequiredInputData" .feature "1.0") => pointer-list
 ? sdfOutputData: parameter-list  ; sdfRequired applies here
 ? sdfData: named<dataqualities>         ; zero or more named data type definitions that might be used in the above
 EXTENSION-POINT<"action-ext">
}

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

dataqualities = {               ; also propertyqualities
 commonqualities
 jsonschema
 ? ("units" .feature "1.0") => text
 ? ("unit" .feature "1.1") => text
 ? ("scaleMinimum" .feature "1.0") => number
 ? ("scaleMaximum" .feature "1.0") => number
 ? observable: bool
 ? readable: bool
 ? writable: bool
 ? nullable: bool
 ? ("subtype" .feature "1.0") => "byte-string" / "unix-time"
            / (text .feature "subtype-ext")                       ; EXTENSION-POINT
 ? ("sdfType" .feature "1.1") => "byte-string" / "unix-time"
            / (text .feature "sdftype-ext")                       ; EXTENSION-POINT
 ? contentFormat: text
 EXTENSION-POINT<"data-ext">
}

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>
)

choice-type = (
  ("sdfChoice" .feature "1.1") => named<dataqualities>
)

jsonschema = (
 ? (("type" => "number" / "string" / "boolean" / "integer" / "array")
    // compound-type
    // choice-type
    // (type: text .feature "type-ext")                       ; EXTENSION-POINT
   )
 ? "enum" => [+ text]               ; limited to text strings in SDF 1.1
 ? ("enum" .feature "1.0") => [+ allowed-types]    ; should validate against type
 ? const: allowed-types                            ; should validate against type
 ? default: allowed-types                          ; should validate against type
 ; number/integer constraints
 ? minimum: number
 ? maximum: number
 ? exclusiveMinimum: bool / number      ; jso draft 4/7
 ? exclusiveMaximum: bool / number      ; jso draft 4/7
 ? multipleOf: number                   ; ISSUE: Do we need this?
 ; text string constraints
 ? minLength: number
 ? maxLength: number
 ? pattern: text                ; regexp
 ? format: "date-time" / "date" / "time"
           / "uri" / "uri-reference" / "uuid"
           / (text .feature "format-ext")                       ; EXTENSION-POINT
 ; array constraints
 ? minItems: number
 ? maxItems: number
 ? 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 the subset that we allow here...
     ? description: text            ; long text (no constraints)
     ? $comment: text               ; source code comments only, no semantics
     ; commonqualities, ; -- ISSUE: should leave this out for non-complex data types, but need the above three
     ? ((type: "number" / "string" / "boolean" / "integer") ; no "array"
        // compound-type
        // choice-type              ; do we really need arrays of choices?
        // (type: text .feature "itemtype-ext")                       ; EXTENSION-POINT
       )
     ; jso subset
     ? minimum: number
     ? maximum: number
     ? "enum" => [+ text] ; limited to text strings in SDF 1.1
     ? ("enum" .feature "1.0") => [+ any]
     ? format: text
     ? minLength: number
     ? maxLength: number
     EXTENSION-POINT<"items-ext">
   }
)
]]></sourcecode>
    </section>
    <section anchor="json-schemaorg-rendition-of-sdf-syntax">
      <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"/>.</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",
+  "title": "sdf-framework.cddl",
   "$schema": "http://json-schema.org/draft-07/schema#",
   "$ref": "#/definitions/sdf-syntax",
   "definitions": {
     "sdf-syntax": {
       "type": "object",
       "properties": {
         "info": {
           "$ref": "#/definitions/sdfinfo"
         },
         "namespace": {
           "type": "object",
           "additionalProperties": {
             "type": "string"
           }
         },
         "defaultNamespace": {
           "type": "string"
         },
         "sdfThing": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/thingqualities"
           }
         },
         "sdfProduct": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/productqualities"
           }
         },
         "sdfObject": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/objectqualities"
           }
         },
         "sdfProperty": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/propertyqualities"
           }
         },
         "sdfAction": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/actionqualities"
           }
         },
         "sdfEvent": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/eventqualities"
           }
         },
         "sdfData": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/dataqualities"
           }
         }
       },
-      "additionalProperties": false
+      "additionalProperties": {
+      }
     },
     "sdfinfo": {
       "type": "object",
       "properties": {
         "title": {
           "type": "string"
         },
         "version": {
           "type": "string"
         },
         "copyright": {
           "type": "string"
         },
         "license": {
           "type": "string"
         }
       },
-      "additionalProperties": false
+      "additionalProperties": {
+      }
     },
     "thingqualities": {
       "type": "object",
       "properties": {
         "description": {
           "type": "string"
         },
         "label": {
           "type": "string"
         },
         "$comment": {
           "type": "string"
         },
         "sdfRef": {
           "$ref": "#/definitions/sdf-pointer"
         },
         "sdfRequired": {
           "$ref": "#/definitions/pointer-list"
         },
         "sdfObject": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/objectqualities"
           }
         },
         "sdfThing": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/thingqualities"
           }
         }
       },
-      "additionalProperties": false
+      "additionalProperties": {
+      }
     },
     "sdf-pointer": {
       "type": "string"
     },
     "pointer-list": {
       "type": "array",
       "items": {
         "$ref": "#/definitions/sdf-pointer"
       }
     },
     "objectqualities": {
       "type": "object",
       "properties": {
         "description": {
           "type": "string"
         },
         "label": {
           "type": "string"
         },
         "$comment": {
           "type": "string"
         },
         "sdfRef": {
           "$ref": "#/definitions/sdf-pointer"
         },
         "sdfRequired": {
           "$ref": "#/definitions/pointer-list"
         },
         "minItems": {
           "type": "number"
         },
         "maxItems": {
           "type": "number"
         },
         "sdfProperty": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/propertyqualities"
           }
         },
         "sdfAction": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/actionqualities"
           }
         },
         "sdfEvent": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/eventqualities"
           }
         },
         "sdfData": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/dataqualities"
           }
         }
       },
-      "additionalProperties": false
+      "additionalProperties": {
+      }
     },
     "propertyqualities": {
       "$ref": "#/definitions/dataqualities"
     },
     "dataqualities": {
       "anyOf": [
         {
           "type": "object",
           "properties": {
             "type": {
               "type": "string",
               "enum": [
                 "number",
                 "string",
                 "boolean",
                 "integer",
                 "array"
               ]
             },
             "enum": {
               "type": "array",
               "items": {
-                "type": "string"
+                "$ref": "#/definitions/allowed-types"
               },
               "minItems": 1
             },
             "const": {
               "$ref": "#/definitions/allowed-types"
             },
             "default": {
               "$ref": "#/definitions/allowed-types"
             },
             "minimum": {
               "type": "number"
             },
             "maximum": {
               "type": "number"
             },
             "exclusiveMinimum": {
               "anyOf": [
                 {
                   "type": "boolean"
                 },
                 {
                   "type": "number"
                 }
               ]
             },
             "exclusiveMaximum": {
               "anyOf": [
                 {
                   "type": "boolean"
                 },
                 {
                   "type": "number"
                 }
               ]
             },
             "multipleOf": {
               "type": "number"
             },
             "minLength": {
               "type": "number"
             },
             "maxLength": {
               "type": "number"
             },
             "pattern": {
               "type": "string"
             },
             "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"
+                }
               ]
             },
             "minItems": {
               "type": "number"
             },
             "maxItems": {
               "type": "number"
             },
             "uniqueItems": {
               "type": "boolean"
             },
             "items": {
               "anyOf": [
                 {
                   "type": "object",
                   "properties": {
                     "type": {
                       "type": "string",
                       "enum": [
                         "number",
                         "string",
                         "boolean",
                         "integer"
                       ]
                     },
                     "sdfRef": {
                       "$ref": "#/definitions/sdf-pointer"
                     },
                     "description": {
                       "type": "string"
                     },
                     "$comment": {
                       "type": "string"
                     },
                     "minimum": {
                       "type": "number"
                     },
                     "maximum": {
                       "type": "number"
                     },
                     "enum": {
                       "type": "array",
-                      "items": {
-                        "type": "string"
-                      },
                       "minItems": 1
                     },
                     "format": {
                       "type": "string"
                     },
                     "minLength": {
                       "type": "number"
                     },
                     "maxLength": {
                       "type": "number"
                     }
                   },
-                  "additionalProperties": false
+                  "additionalProperties": {
+                  }
                 },
                 {
                   "type": "object",
                   "properties": {
                     "type": {
                       "type": "string",
                       "const": "object"
                     },
                     "required": {
                       "type": "array",
                       "items": {
                         "type": "string"
                       },
                       "minItems": 1
                     },
                     "properties": {
                       "type": "object",
                       "additionalProperties": {
                         "$ref": "#/definitions/dataqualities"
                       }
                     },
                     "sdfRef": {
                       "$ref": "#/definitions/sdf-pointer"
                     },
                     "description": {
                       "type": "string"
                     },
                     "$comment": {
                       "type": "string"
                     },
                     "minimum": {
                       "type": "number"
                     },
                     "maximum": {
                       "type": "number"
                     },
                     "enum": {
                       "type": "array",
-                      "items": {
-                        "type": "string"
-                      },
                       "minItems": 1
                     },
                     "format": {
                       "type": "string"
                     },
                     "minLength": {
                       "type": "number"
                     },
                     "maxLength": {
                       "type": "number"
                     }
                   },
-                  "additionalProperties": false
+                  "additionalProperties": {
+                  }
                 },
                 {
                   "type": "object",
                   "properties": {
                     "sdfChoice": {
                       "type": "object",
                       "additionalProperties": {
                         "$ref": "#/definitions/dataqualities"
                       }
                     },
                     "sdfRef": {
                       "$ref": "#/definitions/sdf-pointer"
                     },
                     "description": {
                       "type": "string"
                     },
                     "$comment": {
                       "type": "string"
                     },
                     "minimum": {
                       "type": "number"
                     },
                     "maximum": {
                       "type": "number"
                     },
                     "enum": {
                       "type": "array",
-                      "items": {
-                        "type": "string"
-                      },
                       "minItems": 1
                     },
                     "format": {
                       "type": "string"
                     },
                     "minLength": {
                       "type": "number"
                     },
                     "maxLength": {
                       "type": "number"
                     }
                   },
-                  "additionalProperties": false
+                  "additionalProperties": {
+                  }
+                },
+                {
+                  "type": "object",
+                  "properties": {
+                    "type": {
+                      "type": "string"
+                    },
+                    "sdfRef": {
+                      "$ref": "#/definitions/sdf-pointer"
+                    },
+                    "description": {
+                      "type": "string"
+                    },
+                    "$comment": {
+                      "type": "string"
+                    },
+                    "minimum": {
+                      "type": "number"
+                    },
+                    "maximum": {
+                      "type": "number"
+                    },
+                    "enum": {
+                      "type": "array",
+                      "minItems": 1
+                    },
+                    "format": {
+                      "type": "string"
+                    },
+                    "minLength": {
+                      "type": "number"
+                    },
+                    "maxLength": {
+                      "type": "number"
+                    }
+                  },
+                  "additionalProperties": {
+                  }
                 }
               ]
             },
             "description": {
               "type": "string"
             },
             "label": {
               "type": "string"
             },
             "$comment": {
               "type": "string"
             },
             "sdfRef": {
               "$ref": "#/definitions/sdf-pointer"
             },
             "sdfRequired": {
               "$ref": "#/definitions/pointer-list"
             },
+            "units": {
+              "type": "string"
+            },
             "unit": {
               "type": "string"
             },
+            "scaleMinimum": {
+              "type": "number"
+            },
+            "scaleMaximum": {
+              "type": "number"
+            },
             "observable": {
               "type": "boolean"
             },
             "readable": {
               "type": "boolean"
             },
             "writable": {
               "type": "boolean"
             },
             "nullable": {
               "type": "boolean"
             },
+            "subtype": {
+              "anyOf": [
+                {
+                  "type": "string",
+                  "const": "byte-string"
+                },
+                {
+                  "type": "string",
+                  "const": "unix-time"
+                },
+                {
+                  "type": "string"
+                }
+              ]
+            },
             "sdfType": {
-              "type": "string",
-              "enum": [
-                "byte-string",
-                "unix-time"
+              "anyOf": [
+                {
+                  "type": "string",
+                  "const": "byte-string"
+                },
+                {
+                  "type": "string",
+                  "const": "unix-time"
+                },
+                {
+                  "type": "string"
+                }
               ]
             },
             "contentFormat": {
               "type": "string"
             }
           },
-          "additionalProperties": false
+          "additionalProperties": {
+          }
         },
         {
           "type": "object",
           "properties": {
             "type": {
               "type": "string",
               "const": "object"
             },
             "required": {
               "type": "array",
               "items": {
                 "type": "string"
               },
               "minItems": 1
             },
             "properties": {
               "type": "object",
               "additionalProperties": {
                 "$ref": "#/definitions/dataqualities"
               }
             },
             "enum": {
               "type": "array",
               "items": {
-                "type": "string"
+                "$ref": "#/definitions/allowed-types"
               },
               "minItems": 1
             },
             "const": {
               "$ref": "#/definitions/allowed-types"
             },
             "default": {
               "$ref": "#/definitions/allowed-types"
             },
             "minimum": {
               "type": "number"
             },
             "maximum": {
               "type": "number"
             },
             "exclusiveMinimum": {
               "anyOf": [
                 {
                   "type": "boolean"
                 },
                 {
                   "type": "number"
                 }
               ]
             },
             "exclusiveMaximum": {
               "anyOf": [
                 {
                   "type": "boolean"
                 },
                 {
                   "type": "number"
                 }
               ]
             },
             "multipleOf": {
               "type": "number"
             },
             "minLength": {
               "type": "number"
             },
             "maxLength": {
               "type": "number"
             },
             "pattern": {
               "type": "string"
             },
             "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"
+                }
               ]
             },
             "minItems": {
               "type": "number"
             },
             "maxItems": {
               "type": "number"
             },
             "uniqueItems": {
               "type": "boolean"
             },
             "items": {
               "anyOf": [
                 {
                   "type": "object",
                   "properties": {
                     "type": {
                       "type": "string",
                       "enum": [
                         "number",
                         "string",
                         "boolean",
                         "integer"
                       ]
                     },
                     "sdfRef": {
                       "$ref": "#/definitions/sdf-pointer"
                     },
                     "description": {
                       "type": "string"
                     },
                     "$comment": {
                       "type": "string"
                     },
                     "minimum": {
                       "type": "number"
                     },
                     "maximum": {
                       "type": "number"
                     },
                     "enum": {
                       "type": "array",
-                      "items": {
-                        "type": "string"
-                      },
                       "minItems": 1
                     },
                     "format": {
                       "type": "string"
                     },
                     "minLength": {
                       "type": "number"
                     },
                     "maxLength": {
                       "type": "number"
                     }
                   },
-                  "additionalProperties": false
+                  "additionalProperties": {
+                  }
                 },
                 {
                   "type": "object",
                   "properties": {
                     "type": {
                       "type": "string",
                       "const": "object"
                     },
                     "required": {
                       "type": "array",
                       "items": {
                         "type": "string"
                       },
                       "minItems": 1
                     },
                     "properties": {
                       "type": "object",
                       "additionalProperties": {
                         "$ref": "#/definitions/dataqualities"
                       }
                     },
                     "sdfRef": {
                       "$ref": "#/definitions/sdf-pointer"
                     },
                     "description": {
                       "type": "string"
                     },
                     "$comment": {
                       "type": "string"
                     },
                     "minimum": {
                       "type": "number"
                     },
                     "maximum": {
                       "type": "number"
                     },
                     "enum": {
                       "type": "array",
-                      "items": {
-                        "type": "string"
-                      },
                       "minItems": 1
                     },
                     "format": {
                       "type": "string"
                     },
                     "minLength": {
                       "type": "number"
                     },
                     "maxLength": {
                       "type": "number"
                     }
                   },
-                  "additionalProperties": false
+                  "additionalProperties": {
+                  }
                 },
                 {
                   "type": "object",
                   "properties": {
                     "sdfChoice": {
                       "type": "object",
                       "additionalProperties": {
                         "$ref": "#/definitions/dataqualities"
                       }
                     },
                     "sdfRef": {
                       "$ref": "#/definitions/sdf-pointer"
                     },
                     "description": {
                       "type": "string"
                     },
                     "$comment": {
                       "type": "string"
                     },
                     "minimum": {
                       "type": "number"
                     },
                     "maximum": {
                       "type": "number"
                     },
                     "enum": {
                       "type": "array",
-                      "items": {
-                        "type": "string"
-                      },
                       "minItems": 1
                     },
                     "format": {
                       "type": "string"
                     },
                     "minLength": {
                       "type": "number"
                     },
                     "maxLength": {
                       "type": "number"
                     }
                   },
-                  "additionalProperties": false
+                  "additionalProperties": {
+                  }
+                },
+                {
+                  "type": "object",
+                  "properties": {
+                    "type": {
+                      "type": "string"
+                    },
+                    "sdfRef": {
+                      "$ref": "#/definitions/sdf-pointer"
+                    },
+                    "description": {
+                      "type": "string"
+                    },
+                    "$comment": {
+                      "type": "string"
+                    },
+                    "minimum": {
+                      "type": "number"
+                    },
+                    "maximum": {
+                      "type": "number"
+                    },
+                    "enum": {
+                      "type": "array",
+                      "minItems": 1
+                    },
+                    "format": {
+                      "type": "string"
+                    },
+                    "minLength": {
+                      "type": "number"
+                    },
+                    "maxLength": {
+                      "type": "number"
+                    }
+                  },
+                  "additionalProperties": {
+                  }
                 }
               ]
             },
             "description": {
               "type": "string"
             },
             "label": {
               "type": "string"
             },
             "$comment": {
               "type": "string"
             },
             "sdfRef": {
               "$ref": "#/definitions/sdf-pointer"
             },
             "sdfRequired": {
               "$ref": "#/definitions/pointer-list"
             },
+            "units": {
+              "type": "string"
+            },
             "unit": {
               "type": "string"
             },
+            "scaleMinimum": {
+              "type": "number"
+            },
+            "scaleMaximum": {
+              "type": "number"
+            },
             "observable": {
               "type": "boolean"
             },
             "readable": {
               "type": "boolean"
             },
             "writable": {
               "type": "boolean"
             },
             "nullable": {
               "type": "boolean"
             },
+            "subtype": {
+              "anyOf": [
+                {
+                  "type": "string",
+                  "const": "byte-string"
+                },
+                {
+                  "type": "string",
+                  "const": "unix-time"
+                },
+                {
+                  "type": "string"
+                }
+              ]
+            },
             "sdfType": {
-              "type": "string",
-              "enum": [
-                "byte-string",
-                "unix-time"
+              "anyOf": [
+                {
+                  "type": "string",
+                  "const": "byte-string"
+                },
+                {
+                  "type": "string",
+                  "const": "unix-time"
+                },
+                {
+                  "type": "string"
+                }
               ]
             },
             "contentFormat": {
               "type": "string"
             }
           },
-          "additionalProperties": false
+          "additionalProperties": {
+          }
         },
         {
           "type": "object",
           "properties": {
             "sdfChoice": {
               "type": "object",
               "additionalProperties": {
                 "$ref": "#/definitions/dataqualities"
               }
             },
             "enum": {
               "type": "array",
               "items": {
-                "type": "string"
+                "$ref": "#/definitions/allowed-types"
               },
               "minItems": 1
             },
             "const": {
               "$ref": "#/definitions/allowed-types"
             },
             "default": {
               "$ref": "#/definitions/allowed-types"
             },
             "minimum": {
               "type": "number"
             },
             "maximum": {
               "type": "number"
             },
             "exclusiveMinimum": {
               "anyOf": [
                 {
                   "type": "boolean"
                 },
                 {
                   "type": "number"
                 }
               ]
             },
             "exclusiveMaximum": {
               "anyOf": [
                 {
                   "type": "boolean"
                 },
                 {
                   "type": "number"
                 }
               ]
             },
             "multipleOf": {
               "type": "number"
             },
             "minLength": {
               "type": "number"
             },
             "maxLength": {
               "type": "number"
             },
             "pattern": {
               "type": "string"
             },
             "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"
+                }
               ]
             },
             "minItems": {
               "type": "number"
             },
             "maxItems": {
               "type": "number"
             },
             "uniqueItems": {
               "type": "boolean"
             },
             "items": {
               "anyOf": [
                 {
                   "type": "object",
                   "properties": {
                     "type": {
                       "type": "string",
                       "enum": [
                         "number",
                         "string",
                         "boolean",
                         "integer"
                       ]
                     },
                     "sdfRef": {
                       "$ref": "#/definitions/sdf-pointer"
                     },
                     "description": {
                       "type": "string"
                     },
                     "$comment": {
                       "type": "string"
                     },
                     "minimum": {
                       "type": "number"
                     },
                     "maximum": {
                       "type": "number"
                     },
                     "enum": {
                       "type": "array",
-                      "items": {
-                        "type": "string"
-                      },
                       "minItems": 1
                     },
                     "format": {
                       "type": "string"
                     },
                     "minLength": {
                       "type": "number"
                     },
                     "maxLength": {
                       "type": "number"
                     }
                   },
-                  "additionalProperties": false
+                  "additionalProperties": {
+                  }
                 },
                 {
                   "type": "object",
                   "properties": {
                     "type": {
                       "type": "string",
                       "const": "object"
                     },
                     "required": {
                       "type": "array",
                       "items": {
                         "type": "string"
                       },
                       "minItems": 1
                     },
                     "properties": {
                       "type": "object",
                       "additionalProperties": {
                         "$ref": "#/definitions/dataqualities"
                       }
                     },
                     "sdfRef": {
                       "$ref": "#/definitions/sdf-pointer"
                     },
                     "description": {
                       "type": "string"
                     },
                     "$comment": {
                       "type": "string"
                     },
                     "minimum": {
                       "type": "number"
                     },
                     "maximum": {
                       "type": "number"
                     },
                     "enum": {
                       "type": "array",
-                      "items": {
-                        "type": "string"
-                      },
                       "minItems": 1
                     },
                     "format": {
                       "type": "string"
                     },
                     "minLength": {
                       "type": "number"
                     },
                     "maxLength": {
                       "type": "number"
                     }
                   },
-                  "additionalProperties": false
+                  "additionalProperties": {
+                  }
                 },
                 {
                   "type": "object",
                   "properties": {
                     "sdfChoice": {
                       "type": "object",
                       "additionalProperties": {
                         "$ref": "#/definitions/dataqualities"
                       }
                     },
                     "sdfRef": {
                       "$ref": "#/definitions/sdf-pointer"
                     },
                     "description": {
                       "type": "string"
                     },
                     "$comment": {
                       "type": "string"
                     },
                     "minimum": {
                       "type": "number"
                     },
                     "maximum": {
                       "type": "number"
                     },
                     "enum": {
                       "type": "array",
-                      "items": {
-                        "type": "string"
-                      },
                       "minItems": 1
                     },
                     "format": {
                       "type": "string"
                     },
                     "minLength": {
                       "type": "number"
                     },
                     "maxLength": {
                       "type": "number"
                     }
                   },
-                  "additionalProperties": false
+                  "additionalProperties": {
+                  }
+                },
+                {
+                  "type": "object",
+                  "properties": {
+                    "type": {
+                      "type": "string"
+                    },
+                    "sdfRef": {
+                      "$ref": "#/definitions/sdf-pointer"
+                    },
+                    "description": {
+                      "type": "string"
+                    },
+                    "$comment": {
+                      "type": "string"
+                    },
+                    "minimum": {
+                      "type": "number"
+                    },
+                    "maximum": {
+                      "type": "number"
+                    },
+                    "enum": {
+                      "type": "array",
+                      "minItems": 1
+                    },
+                    "format": {
+                      "type": "string"
+                    },
+                    "minLength": {
+                      "type": "number"
+                    },
+                    "maxLength": {
+                      "type": "number"
+                    }
+                  },
+                  "additionalProperties": {
+                  }
                 }
               ]
             },
             "description": {
               "type": "string"
             },
             "label": {
               "type": "string"
             },
             "$comment": {
               "type": "string"
             },
             "sdfRef": {
               "$ref": "#/definitions/sdf-pointer"
             },
             "sdfRequired": {
               "$ref": "#/definitions/pointer-list"
             },
+            "units": {
+              "type": "string"
+            },
             "unit": {
               "type": "string"
             },
+            "scaleMinimum": {
+              "type": "number"
+            },
+            "scaleMaximum": {
+              "type": "number"
+            },
             "observable": {
               "type": "boolean"
             },
             "readable": {
               "type": "boolean"
             },
             "writable": {
               "type": "boolean"
             },
             "nullable": {
               "type": "boolean"
             },
-            "sdfType": {
-              "type": "string",
-              "enum": [
-                "byte-string",
-                "unix-time"
-              ]
-            },
+            "subtype": {
+              "anyOf": [
+                {
+                  "type": "string",
+                  "const": "byte-string"
+                },
+                {
+                  "type": "string",
+                  "const": "unix-time"
+                },
+                {
+                  "type": "string"
+                }
+              ]
+            },
+            "sdfType": {
+              "anyOf": [
+                {
+                  "type": "string",
+                  "const": "byte-string"
+                },
+                {
+                  "type": "string",
+                  "const": "unix-time"
+                },
+                {
+                  "type": "string"
+                }
+              ]
+            },
             "contentFormat": {
               "type": "string"
             }
           },
-          "additionalProperties": false
+          "additionalProperties": {
+          }
+        },
+        {
+          "type": "object",
+          "properties": {
+            "type": {
+              "type": "string"
+            },
+            "enum": {
+              "type": "array",
+              "items": {
+                "$ref": "#/definitions/allowed-types"
+              },
+              "minItems": 1
+            },
+            "const": {
+              "$ref": "#/definitions/allowed-types"
+            },
+            "default": {
+              "$ref": "#/definitions/allowed-types"
+            },
+            "minimum": {
+              "type": "number"
+            },
+            "maximum": {
+              "type": "number"
+            },
+            "exclusiveMinimum": {
+              "anyOf": [
+                {
+                  "type": "boolean"
+                },
+                {
+                  "type": "number"
+                }
+              ]
+            },
+            "exclusiveMaximum": {
+              "anyOf": [
+                {
+                  "type": "boolean"
+                },
+                {
+                  "type": "number"
+                }
+              ]
+            },
+            "multipleOf": {
+              "type": "number"
+            },
+            "minLength": {
+              "type": "number"
+            },
+            "maxLength": {
+              "type": "number"
+            },
+            "pattern": {
+              "type": "string"
+            },
+            "format": {
+              "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"
+                }
+              ]
+            },
+            "minItems": {
+              "type": "number"
+            },
+            "maxItems": {
+              "type": "number"
+            },
+            "uniqueItems": {
+              "type": "boolean"
+            },
+            "items": {
+              "anyOf": [
+                {
+                  "type": "object",
+                  "properties": {
+                    "type": {
+                      "type": "string",
+                      "enum": [
+                        "number",
+                        "string",
+                        "boolean",
+                        "integer"
+                      ]
+                    },
+                    "sdfRef": {
+                      "$ref": "#/definitions/sdf-pointer"
+                    },
+                    "description": {
+                      "type": "string"
+                    },
+                    "$comment": {
+                      "type": "string"
+                    },
+                    "minimum": {
+                      "type": "number"
+                    },
+                    "maximum": {
+                      "type": "number"
+                    },
+                    "enum": {
+                      "type": "array",
+                      "minItems": 1
+                    },
+                    "format": {
+                      "type": "string"
+                    },
+                    "minLength": {
+                      "type": "number"
+                    },
+                    "maxLength": {
+                      "type": "number"
+                    }
+                  },
+                  "additionalProperties": {
+                  }
+                },
+                {
+                  "type": "object",
+                  "properties": {
+                    "type": {
+                      "type": "string",
+                      "const": "object"
+                    },
+                    "required": {
+                      "type": "array",
+                      "items": {
+                        "type": "string"
+                      },
+                      "minItems": 1
+                    },
+                    "properties": {
+                      "type": "object",
+                      "additionalProperties": {
+                        "$ref": "#/definitions/dataqualities"
+                      }
+                    },
+                    "sdfRef": {
+                      "$ref": "#/definitions/sdf-pointer"
+                    },
+                    "description": {
+                      "type": "string"
+                    },
+                    "$comment": {
+                      "type": "string"
+                    },
+                    "minimum": {
+                      "type": "number"
+                    },
+                    "maximum": {
+                      "type": "number"
+                    },
+                    "enum": {
+                      "type": "array",
+                      "minItems": 1
+                    },
+                    "format": {
+                      "type": "string"
+                    },
+                    "minLength": {
+                      "type": "number"
+                    },
+                    "maxLength": {
+                      "type": "number"
+                    }
+                  },
+                  "additionalProperties": {
+                  }
+                },
+                {
+                  "type": "object",
+                  "properties": {
+                    "sdfChoice": {
+                      "type": "object",
+                      "additionalProperties": {
+                        "$ref": "#/definitions/dataqualities"
+                      }
+                    },
+                    "sdfRef": {
+                      "$ref": "#/definitions/sdf-pointer"
+                    },
+                    "description": {
+                      "type": "string"
+                    },
+                    "$comment": {
+                      "type": "string"
+                    },
+                    "minimum": {
+                      "type": "number"
+                    },
+                    "maximum": {
+                      "type": "number"
+                    },
+                    "enum": {
+                      "type": "array",
+                      "minItems": 1
+                    },
+                    "format": {
+                      "type": "string"
+                    },
+                    "minLength": {
+                      "type": "number"
+                    },
+                    "maxLength": {
+                      "type": "number"
+                    }
+                  },
+                  "additionalProperties": {
+                  }
+                },
+                {
+                  "type": "object",
+                  "properties": {
+                    "type": {
+                      "type": "string"
+                    },
+                    "sdfRef": {
+                      "$ref": "#/definitions/sdf-pointer"
+                    },
+                    "description": {
+                      "type": "string"
+                    },
+                    "$comment": {
+                      "type": "string"
+                    },
+                    "minimum": {
+                      "type": "number"
+                    },
+                    "maximum": {
+                      "type": "number"
+                    },
+                    "enum": {
+                      "type": "array",
+                      "minItems": 1
+                    },
+                    "format": {
+                      "type": "string"
+                    },
+                    "minLength": {
+                      "type": "number"
+                    },
+                    "maxLength": {
+                      "type": "number"
+                    }
+                  },
+                  "additionalProperties": {
+                  }
+                }
+              ]
+            },
+            "description": {
+              "type": "string"
+            },
+            "label": {
+              "type": "string"
+            },
+            "$comment": {
+              "type": "string"
+            },
+            "sdfRef": {
+              "$ref": "#/definitions/sdf-pointer"
+            },
+            "sdfRequired": {
+              "$ref": "#/definitions/pointer-list"
+            },
+            "units": {
+              "type": "string"
+            },
+            "unit": {
+              "type": "string"
+            },
+            "scaleMinimum": {
+              "type": "number"
+            },
+            "scaleMaximum": {
+              "type": "number"
+            },
+            "observable": {
+              "type": "boolean"
+            },
+            "readable": {
+              "type": "boolean"
+            },
+            "writable": {
+              "type": "boolean"
+            },
+            "nullable": {
+              "type": "boolean"
+            },
+            "subtype": {
+              "anyOf": [
+                {
+                  "type": "string",
+                  "const": "byte-string"
+                },
+                {
+                  "type": "string",
+                  "const": "unix-time"
+                },
+                {
+                  "type": "string"
+                }
+              ]
+            },
+            "sdfType": {
+              "anyOf": [
+                {
+                  "type": "string",
+                  "const": "byte-string"
+                },
+                {
+                  "type": "string",
+                  "const": "unix-time"
+                },
+                {
+                  "type": "string"
+                }
+              ]
+            },
+            "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": {
           }
+        },
+        {
         }
       ]
     },
     "actionqualities": {
       "type": "object",
       "properties": {
         "description": {
           "type": "string"
         },
         "label": {
           "type": "string"
         },
         "$comment": {
           "type": "string"
         },
         "sdfRef": {
           "$ref": "#/definitions/sdf-pointer"
         },
         "sdfRequired": {
           "$ref": "#/definitions/pointer-list"
         },
         "sdfInputData": {
           "$ref": "#/definitions/parameter-list"
         },
+        "sdfRequiredInputData": {
+          "$ref": "#/definitions/pointer-list"
+        },
         "sdfOutputData": {
           "$ref": "#/definitions/parameter-list"
         },
         "sdfData": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/dataqualities"
           }
         }
       },
-      "additionalProperties": false
+      "additionalProperties": {
+      }
     },
     "parameter-list": {
-      "$ref": "#/definitions/dataqualities"
+      "anyOf": [
+        {
+          "$ref": "#/definitions/pointer-list"
+        },
+        {
+          "$ref": "#/definitions/dataqualities"
+        }
+      ]
     },
     "eventqualities": {
       "type": "object",
       "properties": {
         "description": {
           "type": "string"
         },
         "label": {
           "type": "string"
         },
         "$comment": {
           "type": "string"
         },
         "sdfRef": {
           "$ref": "#/definitions/sdf-pointer"
         },
         "sdfRequired": {
           "$ref": "#/definitions/pointer-list"
         },
         "sdfOutputData": {
           "$ref": "#/definitions/parameter-list"
         },
         "sdfData": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/dataqualities"
           }
         }
       },
-      "additionalProperties": false
+      "additionalProperties": {
+      }
     },
     "productqualities": {
       "$ref": "#/definitions/thingqualities"
     }
   }
 }
]]></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"/>.
As the vocabulary used by JSO is familiar to many JSON modellers, 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.bormann-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 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="A." surname="Keränen" fullname="Ari Keränen">
        <organization>Ericsson</organization>
        <address>
          <postal>
            <street/>
            <city>Jorvas</city>
            <code>02420</code>
            <country>Finland</country>
          </postal>
          <email>ari.keranen@ericsson.com</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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
6R4dvsT7QicpH6DXnhazZekd8aeyc6CH+SRCsDqTqSdELCRdEmPY4zU61b3t
Hcs3XSnkBhi5kYIbsDw+zdOxHqcMkkXryokAHFNzBFFba6FxujfgVn8hLDgj
/zcbN2IEXdM3tFW9qZEaObJHJDO5GVAfEjQbfIWi5oJfbDw466jOPpgPGFcO
trPsXa9D5Jgh36bOBQrpSTlU/4duhzZ8zskJJrl4iYLb+OtCjjTCWiQZFgIn
tuy+SbIXz823+GXrN3jh1IO9r0Cuvk5OQBUWFxwItS8CPU/i4sK9LA/8Dr58
6HegSU74+xX5g7FNZSJLAx9Z16M0DwafD3bJKNrdgw/oiBC8GE2Fh7XUK3i3
700HC57j7Slajg0vicA2T7WKPu8d0L5qwQDGLrLFl1vQU7lSgrc8CAcjST2m
M+2SFJZmYFeClVGkVHeuCvDvX1FHW5Ac1da9bbdtF94XPLXdkLepBMF33uoe
Ft0RLaWJ/CIwXfYGeY/EuKu3tmoxfi/v74DNI1cWGK+agK74zmucFO50En0d
0kaqmyFGAl0JIZeCxTikoneuMZuUPAc5aUI7R1gzOTtofUerocqOu7SFSVa6
QUB10/AQQ5FyUcAM3PMtQr3LWfJT4phjmCieyf2JCBne7zHDwLCUqrP37NVq
H1NiCF28mNG90mGC4ktTLkd9tyHcWRbZfppU032S7uU+vhVE5LELkI74vA+N
QTgeYD/WysW0v6BLvbPNnxFtKYmUEKFBKVbT+IwurNLSTHQ1ikbkPQsmwZws
6uPtCZdHTriqxrAN/n1ohC7F3kCoyMl5trF1+9ZJJ75GgX7FxcC8c2J7tayF
Bl1lzXoPIBvNUQYfMtBXUt8XU1CoEw7j405OvUxrjsyB6em2QK0Nwcw5my09
yXgRvDvhbf0KoT4uaWgpQgr0yD6Hmv3Uh+/s6LFiG4Lx6tOAFvbSm8VM0dgV
V7vhAjtyIT2XW/IL+3CxkgLrurrUE3qFCs0G55UoH0yG9QiEcwm5ehqGAsSY
EB4WRW4vcnVe0OhCWOgYRFc64cqlQZkP3UQ3tTJkehLfq88R2ZqsDJ1Lh1Ti
Bu7/m5RId2s0rPy5gPdJt9uqBNLxe7X04JhI4iJNZhNbvSkK72BR+Yv9f1J6
px8R4TDn/8UPtFAUA22JyttwF7oNimpE1k7bxYQsylWouAQ46okTsi7iINyk
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
Yc5ud/4uyE83p+6GlO+sL9n7X0cD3NATb8m1ycWmKqk3sKqkKVFdqkHjNfm1
9YeVb2A+wornXn5CawvKV6hJdI/oG7L+svmoDRltjey1YW76zXZXLe/e1Zi/
4HC/8OyQAH7R0Tyy+gXHbSPWDxiupatby9MVfmow3NoS8K668rJ9ru2tXUc1
ult1FeQHaMc2m942us62r/e04uc1bH3bcLXNb5ustv1tk5uGud4XsG3UJ1jV
pJ5cK39tNgWD1RruCZrcJvSz1pjXxMeCdtfq4htHWRUHu8MhrrHUGyOstNGu
H2G16XlHI6xyCRvdq2vYMBKk3TUuYqMvRfeKlquAvdYHvOll31hbF77bDXCt
vdsY470J4s7GaHt81brAawWT1nmhVe+2AHJ7H+jXpDGsRSJA3XKNixXx8lZg
VkRsbLuVynn1xFa1/Dhsuc7arLnO1HC9aGvwym0jr8G8NgpXwd4o3HVG2Cjc
a+C73QAbhXvjC79mhVvWbp5vb7UR/BvBvxH8fruN4N8I/htfWCH47yA6agVx
W6PFjTD4nlbrz+sEYldBTm97knbVAGtI2tuNWZe0H2dmgaT9OEP4kvamEZTo
bzmCJ2k/zghW0t7UvUraVe0CGXg7GDwZ+NEWypNPH22p7myMVnnULkQ+1Jat
P7ppl+YGM+mWm8KtyZvv0c91ZtUtu1pte97a5mzve3XA6nZJnjJCsM5SyqZl
/a/noLZtr/dDZghOUBLnOqha+WFFd6tl4o3dha1dYZ1rp7rm1p6W5LmLvrSY
z130pWWA3q+v2gJI+aA23H/kTAe/FtAvuE/uKg593M3y2qMfbyBdLZt01+k0
PpZbk1xW4mOz/muPeQfJEkGdqvcQ1P7X0Lta26tay/RYkRz+/z87+fp9pxbh
fo3aXj8j2NT/bnLuPyy19/rQ4o3hwluECd8rPHh1A/ibFOxNCvZ79bRJwf7v
MedNCvYmBTtosUnB3qRgb1KwbVe3lqebFOxNCjY12aRg2w43iQHrj7BJDAh7
2CQG/FdMDGgDo/Hsn0djbFKw1395k4K9JjgbhbtRuEG7jcLdKNwbX/g1K9xN
CvZa4GwE/0bwB+02gn8j+G98YZOCvUnB3qRg39D9JgX7hjE2KdjmJmW1ScHe
pGC3d7dJwQ6ab1KwtdF/lxTcTQr2f+/1rz3YpGDrj9emYF8bFtukGG9SjDcp
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
VtgBAA==

-->

</rfc>
