<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>

<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

]>

<rfc xmlns:xi="http://www.w3.org/2001/XInclude" version="3" ipr="trust200902" docName="draft-ietf-asdf-sdf-nonaffordance-06" category="std" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="SDF Extension for Non-Affordance Info">Semantic Definition Format (SDF) Extension for Non-Affordance Information</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-asdf-sdf-nonaffordance-06"/>

    <author fullname="Jungha Hong" role="editor" initials="J." surname="Hong">
      <organization abbrev="ETRI">Electronics and Telecommunications Research Institute</organization>
      <address>
          <postal>
              <street>218 Gajeong-ro, Yuseong-gu</street>
              <city>Daejeon</city>
              <code>34129</code>
              <country>South Korea</country>
          </postal>
          <phone>+82 42 860 0926</phone>
          <email>jhong@etri.re.kr</email>
      </address>
    </author>
    <author fullname="Hyunjeong Lee" initials="H." surname="Lee">
        <organization abbrev="ETRI">Electronics and Telecommunications Research Institute</organization>
        <address>
            <postal>
                <street>218 Gajeong-ro, Yuseong-gu</street>
                <city>Daejeon</city>
                <code>34129</code>
                <country>South Korea</country>
            </postal>
            <phone>+82 42 860 1213</phone>
            <email>hjlee294@etri.re.kr</email>
        </address>
    </author>

  <area>ART</area>
  <workgroup>ASDF</workgroup>
  <keyword>Internet-Draft</keyword>
  <abstract>
    <t>
      This document describes an extension to the Semantic Definition Format (SDF)
      for representing non-affordance information of Things, such as physical,
      contextual, and descriptive metadata. This extension introduces a new
      Class Name Keyword, <tt>sdfContext</tt>, that enables comprehensive modeling of
      Things and improves semantic clarity.
    </t>
  </abstract>
</front>

<middle>
    <!--section 1-->
    <section anchor="introduction">
      <name>Introduction</name>
      <t>
        The Semantic Definition Format (SDF) standardizes the representation of
        affordances of Things, namely Properties, Actions,
        and Events <xref target="RFC9880"/>.
        However, SDF does not currently define a way to represent
        non-affordance information, such as location, contextual
        metadata, identifiers, and other descriptive elements that are not directly related
        to device interactions. The absence of such constructs limits the ability
        to model devices and systems in use cases that require both interactive
        behavior and descriptive metadata.
      </t>

      <t>
        This document specifies an extension to SDF to represent non-affordance
        information in a consistent and interoperable way. The extension is
        introduced as a new Class Name Keyword, <tt>sdfContext</tt>, defined alongside
        the existing affordance classes, and provides a mechanism for expressing
        descriptive information that complements interactive definitions.
      </t>

      <t>
        The scope of this document is the SDF model, that is, the class level.
        The values that context entries take for an individual Thing, and the
        messages that report them, are instance information and are out of scope
        here; <xref target="relationship"/> describes how this document relates to
        the other SDF documents that cover those aspects.
      </t>
    </section>
     <!--section 1-->

     <!--section 2-->
    <section anchor="terminology">
      <name>Terminology and Conventions</name>

      <t>
        The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL NOT</bcp14>",
      "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
      "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as described in BCP 14
      <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they appear in all capitals, as shown here.
    </t>

    <t>
      This document uses the SDF terminology defined in Section 1.2 of
      <xref target="RFC9880"/>, in particular the terms Class Name Keyword,
      Class, Quality, Definition, Declaration, Grouping, and Affordance.
      In addition, the following term is used in this document:
    </t>

    <dl spacing="normal">
      <dt>Non-Affordance:</dt>
      <dd>
        information about a Thing that is not directly related to its interactive
        capabilities. Non-affordance information does not define how external
        entities can act upon the Thing, but instead provides descriptive metadata
        useful for interpretation, management, or integration. Examples include
        location, manufacturer details, calibration parameters, or deployment context.
      </dd>
    </dl>

    </section>
    <!--section 2-->

    <!--section 3-->
    <section anchor="motivation-and-use-cases">
      <name>Motivation and Use Cases</name>
     <t>
      The integration of non-affordance information into the Semantic Definition
      Format (SDF) addresses several critical needs in the modeling of Internet
      of Things (IoT) devices. The key motivations and corresponding use cases
      in the following subsections illustrate the importance of this extension.
    </t>

    <section anchor="limitations">
      <name>Limitations of Affordance-only Modeling</name>
     <t>
       In the current SDF framework, the primary focus is on defining affordances
       (interactive elements such as Properties, Actions, and Events). While this
       approach effectively captures the dynamic capabilities of a Thing, it
       overlooks essential non-interactive attributes that are vital for a comprehensive
       device representation. These non-affordance attributes encompass contextual
       information and descriptive metadata, including dimensions, weight, location,
       manufacturer details, and operational constraints. The absence of a standardized
       representation for such static information can lead to fragmented device models,
       hindering interoperability and seamless integration across diverse IoT
       ecosystems. Although it is technically possible to model such information
       using <tt>sdfProperty</tt>, this approach introduces several forms of semantic confusion:
     </t>

     <ol spacing="normal" type="1"><li>
         <t>Users may misinterpret the field as observable or interactive:
           When interactive properties (e.g., sensor readings or actuators) and
           fixed attributes (e.g., a device's physical dimensions or serial number)
           are all represented as properties, it becomes unclear which elements
           are meant to change or be acted upon and which are immutable context.
           This ambiguity forces developers and tools to infer intent manually,
           making models harder to interpret and maintain. Over time, such models
           require extra documentation and care to ensure that static fields are
           not mistakenly treated as dynamic, adding to the maintenance burden.
         </t>
       </li>
       <li>
         <t>Developers may implement unnecessary run-time I/O interfaces: Many IoT
           frameworks and tools automatically create API handlers (e.g., REST
           endpoints or CoAP resources) for each defined Property. If static
           metadata like a device's model name or install location is modeled as
           a property, a tool might erroneously generate read/write accessors for
           it. This is problematic because such metadata is meant to be read-only
           context, not an interactive affordance. The result is superfluous or
           misleading interface endpoints that do not reflect the device's real
           capabilities, potentially causing confusion or security issues. In short,
           using <tt>sdfProperty</tt> for static fields violates the expectation that those
           fields remain non-interactive, since the default affordance treatment
           would imply they can be polled or even written to.
         </t>
       </li>
       <li>
         <t>Tools and UIs may treat static metadata as operational data: SDF is
           meant to clearly convey a Thing's interactive capabilities versus its
           contextual attributes. When both are blended under the same construct,
           developers and automated tools may misinterpret the purpose of a given
           field. For example, a field representing location or manufacturer
           might be misconstrued as an operational parameter rather than
           informative metadata. This blurring of semantics makes it harder to
           build consistent tooling and to map SDF models to platform implementations,
           since one cannot reliably distinguish which elements require interactive
           handling. In essence, the lack of separation between affordances and
           non-affordances dilutes the semantic clarity of SDF models, undermining
           the SDF goal of an unambiguous, self-descriptive device model.
         </t>
       </li>
     </ol>

    <t>
      To address these concerns, this document introduces <tt>sdfContext</tt> as a
      dedicated keyword to define static, descriptive, and non-interactive
      metadata. This construct enables a clear semantic distinction from <tt>sdfProperty</tt>,
      making the data model more expressive, machine-readable, and robust to
      implementation assumptions.
    </t>
   </section>

   <section anchor="use-cases">
     <name>Use Cases</name>
     <t>This section illustrates how non-affordance information modeled with
       <tt>sdfContext</tt> supports interoperability, lifecycle traceability, and
       accurate interpretation of data across domains.</t>

    <t>By integrating non-affordance information into SDF as described in the
      following use cases, a more holistic device model can be achieved: one that
      enhances interoperability, operational efficiency, and compliance across
      diverse IoT applications.</t>

    <section anchor="uc-asset">
      <name>Asset Management and Tracking</name>
      <dl spacing="normal">
        <dt>Scenario:</dt>
        <dd>In logistics and warehouse systems, physical containers and pallets are often equipped with IoT sensors to monitor conditions such as temperature, vibration, and location. In addition, each container possesses immutable physical attributes (such as size, weight, manufacturer, and maximum load capacity) that directly influence deployment, transportation, and regulatory compliance.</dd>
        <dt>Concrete Example:</dt>
        <dd>For instance, a 20-foot shipping container manufactured in August 2025 would be registered with length, width, height, manufacturer name, and maximum permitted load, which never change throughout its lifecycle. These non-affordance data fields are recorded using <tt>sdfContext</tt> and are referenced whenever containers are assigned to shipping routes, loaded with cargo, or inspected by authorities.</dd>
        <dt>Data Flow:</dt>
        <dd>During onboarding, these static attributes are retrieved from the device's digital representation or management registry and stored in the asset management system, enabling automated planning and compliance checks. Because they are immutable, they prevent errors in cargo assignment and support maintenance audits. If placement or ownership changes, the updated values are reported as instance information, without altering the model.</dd>
        <dt>Value of Separation:</dt>
        <dd>By distinguishing non-affordance metadata from dynamic sensor properties, the SDF model ensures that static context is protected against accidental modification, enhancing system reliability and regulatory integrity.</dd>
      </dl>
    </section>

    <section anchor="uc-environment">
      <name>Environmental Context Awareness</name>
      <dl spacing="normal">
        <dt>Scenario:</dt>
        <dd>Environmental sensors in smart buildings, such as temperature sensors or CO2 monitors, are installed across diverse locations (such as underground ventilation ducts or third-floor windows), which dramatically affect how sensor values should be interpreted.</dd>
        <dt>Concrete Example:</dt>
        <dd>A motion sensor installed on the ceiling of a conference room on the third floor would declare <tt>floor: 3</tt>, <tt>mountType: ceiling</tt>, and <tt>indoorOutdoor: indoor</tt> in its <tt>sdfContext</tt>. This static context enables analytics tools to filter and adjust real-time readings, for instance distinguishing between typical fluctuations due to conference room activity versus anomalies that indicate faults.</dd>
        <dt>Data Flow:</dt>
        <dd>At installation, the deployment technician registers this context information; during operation, the context of the installed device is reported to facility management systems as instance information <xref target="I-D.ietf-asdf-instance-information"/>, which enables energy optimization or fault detection algorithms to adjust thresholds and logic based on known placement.</dd>
        <dt>Value of Separation:</dt>
        <dd>Separating static environmental context from dynamic sensor data streamlines calibration, reduces errors in data interpretation, and enables automated system adaptation to environmental changes without manual oversight.</dd>
      </dl>
    </section>

    <section anchor="uc-regulatory">
      <name>Regulatory Compliance and Certification</name>
      <dl spacing="normal">
        <dt>Scenario:</dt>
        <dd>In regulated environments such as healthcare, aviation, or industrial automation, each device must report immutable identification (manufacturer, model, production date) and traceable certification information to governing authorities and compliance systems.</dd>
        <dt>Concrete Example:</dt>
        <dd>Upon commissioning a hospital-grade infusion pump, its <tt>sdfContext</tt> includes <tt>manufacturer</tt>, <tt>model</tt>, <tt>firmwareVersion</tt>, and a set of certification records (for example, FDA certification ID, CE mark, and regulatory region). These remain unchanged during operational use and appear in device management dashboards, audit logs, and automated compliance reporting workflows.</dd>
        <dt>Data Flow:</dt>
        <dd>Identity and certification records are reported during device onboarding and updates, often as the output of a construction or commissioning process, verifying compliance status. Regulatory systems query these static records to check policy enforcement, recall campaigns, and security patch eligibility.</dd>
        <dt>Value of Separation:</dt>
        <dd>Non-affordance identity and certification data, managed as immutable context, guarantee regulatory and operational traceability and prevent unauthorized device modifications, forming the backbone of trustworthy automated compliance.</dd>
      </dl>
    </section>

  </section>

    </section>
    <!--section 3-->

    <!--section 4-->
    <section anchor="sdfcontext-keyword">
      <name>The sdfContext Class Name Keyword</name>

      <t>
        This document introduces a new Class Name Keyword, <tt>sdfContext</tt>.
        Base SDF defines six Class Name Keywords (Section 1.2.3 of
        <xref target="RFC9880"/>); <tt>sdfContext</tt> is added as a peer of the affordance
        keywords <tt>sdfProperty</tt>, <tt>sdfAction</tt>, and <tt>sdfEvent</tt>, and is used to
        represent non-affordance information when authoring the SDF model (i.e., at
        design time). Examples include location, manufacturer details, calibration
        parameters, installation attributes, and static identifiers.
      </t>

     <section anchor="definition-semantics">
       <name>Definition and Semantics</name>
       <t>
         The <tt>sdfContext</tt> keyword denotes a group of zero or more Context
         definitions. A Context definition is a named set of data qualities, as are
         <tt>sdfData</tt> and <tt>sdfProperty</tt> definitions (Section 4.7 of
         <xref target="RFC9880"/>).
       </t>
       <t>
         The <tt>sdfContext</tt> class is intended for non-affordance information that is
         static or metadata-oriented. These are values that are expected to be
         known at design time, provisioned at deployment time, or extracted from
         static documentation or identity stores. Examples include manufacturer
         name, model number, location of deployment, or contact email for support.
       </t>
       <t>
         A Context definition describes what a value means and how it is
         structured; it does not declare an interaction. Entries under
         <tt>sdfContext</tt> are not Affordances, they do not take part in interaction
         protocols, and they are read-only in any generated interface.
       </t>

      <t>
        Practical scenarios where <tt>sdfContext</tt> may be applied include:
      </t>

      <ul spacing="normal">
        <li>
          Asset Management: associating static metadata such as manufacturing
          date, supplier, or warranty information with a device in a fleet.
        </li>
        <li>
          Commissioning Tools: storing parameters injected during deployment
          (e.g., room assignment, installation coordinates) that are not otherwise
          observable through interactive affordances.
        </li>
        <li>
          Calibration Metadata: describing accuracy classes or calibration
          factors used by the device when reporting measurements. These values
          are typically read-only and not exposed via a protocol interface.
        </li>
        <li>
          Identity and Traceability: capturing serial numbers, SKU identifiers,
          or web resource references that uniquely characterize a device but
          remain constant throughout its lifecycle.
        </li>
      </ul>
     </section>

     <section anchor="placement">
       <name>Placement in an SDF Model</name>
      <t>
        An <tt>sdfContext</tt> group can occur in an <tt>sdfObject</tt> definition
        (Section 5.1 of <xref target="RFC9880"/>) and in an <tt>sdfThing</tt> definition
        (Section 6.3 of <xref target="RFC9880"/>), extending the content model of these
        Groupings, which in base SDF contain Affordance declarations only.
        <xref target="fig-placement"/> shows the resulting structure, using the
        notation of Figure 2 of <xref target="RFC9880"/>: it reproduces the classes and
        relations defined there and adds <tt>sdfContext</tt>.
      </t>

      <figure anchor="fig-placement">
        <name>Placement of sdfContext in the SDF Class Structure</name>
        <artset>
          <artwork type="svg" align="center">
          <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" height="436px" preserveAspectRatio="xMidYMid meet" version="1.1" viewBox="0 0 756 436" width="756px">
            <defs/>
            <g>
              <!--class sdfThing-->
              <g>
                <rect fill="#FFFFFF" height="44" id="sdfThing" rx="2.5" ry="2.5" width="88.1836" x="233.5" y="7" stroke="#000000" stroke-width="0.5"/>
                <ellipse cx="246.5" cy="21" fill="#FFFFFF" rx="9" ry="9" stroke="black" stroke-width="1"/>
                <path d="M249.4688,26.6406 Q248.8906,26.9375 248.25,27.0781 Q247.6094,27.2344 246.9063,27.2344 Q244.4063,27.2344 243.0781,25.5938 Q241.7656,23.9375 241.7656,20.8125 Q241.7656,17.6875 243.0781,16.0313 Q244.4063,14.375 246.9063,14.375 Q247.6094,14.375 248.25,14.5313 Q248.9063,14.6875 249.4688,14.9844 L249.4688,17.7031 Q248.8438,17.125 248.25,16.8594 Q247.6563,16.5781 247.0313,16.5781 Q245.6875,16.5781 245,17.6563 Q244.3125,18.7188 244.3125,20.8125 Q244.3125,22.9063 245,23.9844 Q245.6875,25.0469 247.0313,25.0469 Q247.6563,25.0469 248.25,24.7813 Q248.8438,24.5 249.4688,23.9219 L249.4688,26.6406 Z " fill="#000000"/>
                <text fill="#000000" font-family="sans-serif" font-size="14" x="258.5" y="25.8467">sdfThing</text>
                <line x1="234.5" x2="320.6836" y1="35" y2="35" stroke="#000000" stroke-width="0.5"/>
                <line x1="234.5" x2="320.6836" y1="43" y2="43" stroke="#000000" stroke-width="0.5"/>
              </g>
              <!--class sdfObject-->
              <g>
                <rect fill="#FFFFFF" height="44" id="sdfObject" rx="2.5" ry="2.5" width="94.7051" x="230" y="128" stroke="#000000" stroke-width="0.5"/>
                <ellipse cx="243" cy="142" fill="#FFFFFF" rx="9" ry="9" stroke="black" stroke-width="1"/>
                <path d="M245.9688,147.6406 Q245.3906,147.9375 244.75,148.0781 Q244.1094,148.2344 243.4063,148.2344 Q240.9063,148.2344 239.5781,146.5938 Q238.2656,144.9375 238.2656,141.8125 Q238.2656,138.6875 239.5781,137.0313 Q240.9063,135.375 243.4063,135.375 Q244.1094,135.375 244.75,135.5313 Q245.4063,135.6875 245.9688,135.9844 L245.9688,138.7031 Q245.3438,138.125 244.75,137.8594 Q244.1563,137.5781 243.5313,137.5781 Q242.1875,137.5781 241.5,138.6563 Q240.8125,139.7188 240.8125,141.8125 Q240.8125,143.9063 241.5,144.9844 Q242.1875,146.0469 243.5313,146.0469 Q244.1563,146.0469 244.75,145.7813 Q245.3438,145.5 245.9688,144.9219 L245.9688,147.6406 Z " fill="#000000"/>
                <text fill="#000000" font-family="sans-serif" font-size="14" x="255" y="146.8467">sdfObject</text>
                <line x1="231" x2="323.7051" y1="156" y2="156" stroke="#000000" stroke-width="0.5"/>
                <line x1="231" x2="323.7051" y1="164" y2="164" stroke="#000000" stroke-width="0.5"/>
              </g>
              <!--class sdfProperty-->
              <g>
                <rect fill="#FFFFFF" height="44" id="sdfProperty" rx="2.5" ry="2.5" width="108.9033" x="7" y="249" stroke="#000000" stroke-width="0.5"/>
                <ellipse cx="20" cy="263" fill="#FFFFFF" rx="9" ry="9" stroke="black" stroke-width="1"/>
                <path d="M22.9688,268.6406 Q22.3906,268.9375 21.75,269.0781 Q21.1094,269.2344 20.4063,269.2344 Q17.9063,269.2344 16.5781,267.5938 Q15.2656,265.9375 15.2656,262.8125 Q15.2656,259.6875 16.5781,258.0313 Q17.9063,256.375 20.4063,256.375 Q21.1094,256.375 21.75,256.5313 Q22.4063,256.6875 22.9688,256.9844 L22.9688,259.7031 Q22.3438,259.125 21.75,258.8594 Q21.1563,258.5781 20.5313,258.5781 Q19.1875,258.5781 18.5,259.6563 Q17.8125,260.7188 17.8125,262.8125 Q17.8125,264.9063 18.5,265.9844 Q19.1875,267.0469 20.5313,267.0469 Q21.1563,267.0469 21.75,266.7813 Q22.3438,266.5 22.9688,265.9219 L22.9688,268.6406 Z " fill="#000000"/>
                <text fill="#000000" font-family="sans-serif" font-size="14" x="32" y="267.8467">sdfProperty</text>
                <line x1="8" x2="114.9033" y1="277" y2="277" stroke="#000000" stroke-width="0.5"/>
                <line x1="8" x2="114.9033" y1="285" y2="285" stroke="#000000" stroke-width="0.5"/>
              </g>
              <!--class sdfAction-->
              <g>
                <rect fill="#FFFFFF" height="44" id="sdfAction" rx="2.5" ry="2.5" width="93.2012" x="312" y="249" stroke="#000000" stroke-width="0.5"/>
                <ellipse cx="325" cy="263" fill="#FFFFFF" rx="9" ry="9" stroke="black" stroke-width="1"/>
                <path d="M327.9688,268.6406 Q327.3906,268.9375 326.75,269.0781 Q326.1094,269.2344 325.4063,269.2344 Q322.9063,269.2344 321.5781,267.5938 Q320.2656,265.9375 320.2656,262.8125 Q320.2656,259.6875 321.5781,258.0313 Q322.9063,256.375 325.4063,256.375 Q326.1094,256.375 326.75,256.5313 Q327.4063,256.6875 327.9688,256.9844 L327.9688,259.7031 Q327.3438,259.125 326.75,258.8594 Q326.1563,258.5781 325.5313,258.5781 Q324.1875,258.5781 323.5,259.6563 Q322.8125,260.7188 322.8125,262.8125 Q322.8125,264.9063 323.5,265.9844 Q324.1875,267.0469 325.5313,267.0469 Q326.1563,267.0469 326.75,266.7813 Q327.3438,266.5 327.9688,265.9219 L327.9688,268.6406 Z " fill="#000000"/>
                <text fill="#000000" font-family="sans-serif" font-size="14" x="337" y="267.8467">sdfAction</text>
                <line x1="313" x2="404.2012" y1="277" y2="277" stroke="#000000" stroke-width="0.5"/>
                <line x1="313" x2="404.2012" y1="285" y2="285" stroke="#000000" stroke-width="0.5"/>
              </g>
              <!--class sdfEvent-->
              <g>
                <rect fill="#FFFFFF" height="44" id="sdfEvent" rx="2.5" ry="2.5" width="89.2158" x="151" y="249" stroke="#000000" stroke-width="0.5"/>
                <ellipse cx="164" cy="263" fill="#FFFFFF" rx="9" ry="9" stroke="black" stroke-width="1"/>
                <path d="M166.9688,268.6406 Q166.3906,268.9375 165.75,269.0781 Q165.1094,269.2344 164.4063,269.2344 Q161.9063,269.2344 160.5781,267.5938 Q159.2656,265.9375 159.2656,262.8125 Q159.2656,259.6875 160.5781,258.0313 Q161.9063,256.375 164.4063,256.375 Q165.1094,256.375 165.75,256.5313 Q166.4063,256.6875 166.9688,256.9844 L166.9688,259.7031 Q166.3438,259.125 165.75,258.8594 Q165.1563,258.5781 164.5313,258.5781 Q163.1875,258.5781 162.5,259.6563 Q161.8125,260.7188 161.8125,262.8125 Q161.8125,264.9063 162.5,265.9844 Q163.1875,267.0469 164.5313,267.0469 Q165.1563,267.0469 165.75,266.7813 Q166.3438,266.5 166.9688,265.9219 L166.9688,268.6406 Z " fill="#000000"/>
                <text fill="#000000" font-family="sans-serif" font-size="14" x="176" y="267.8467">sdfEvent</text>
                <line x1="152" x2="239.2158" y1="277" y2="277" stroke="#000000" stroke-width="0.5"/>
                <line x1="152" x2="239.2158" y1="285" y2="285" stroke="#000000" stroke-width="0.5"/>
              </g>
              <!--class sdfContext-->
              <g>
                <rect fill="#FFFFFF" height="44" id="sdfContext" rx="2.5" ry="2.5" width="104.2002" x="508.5" y="249" stroke="#000000" stroke-width="0.5"/>
                <ellipse cx="521.5" cy="263" fill="#FFFFFF" rx="9" ry="9" stroke="black" stroke-width="1"/>
                <path d="M524.4688,268.6406 Q523.8906,268.9375 523.25,269.0781 Q522.6094,269.2344 521.9063,269.2344 Q519.4063,269.2344 518.0781,267.5938 Q516.7656,265.9375 516.7656,262.8125 Q516.7656,259.6875 518.0781,258.0313 Q519.4063,256.375 521.9063,256.375 Q522.6094,256.375 523.25,256.5313 Q523.9063,256.6875 524.4688,256.9844 L524.4688,259.7031 Q523.8438,259.125 523.25,258.8594 Q522.6563,258.5781 522.0313,258.5781 Q520.6875,258.5781 520,259.6563 Q519.3125,260.7188 519.3125,262.8125 Q519.3125,264.9063 520,265.9844 Q520.6875,267.0469 522.0313,267.0469 Q522.6563,267.0469 523.25,266.7813 Q523.8438,266.5 524.4688,265.9219 L524.4688,268.6406 Z " fill="#000000"/>
                <text fill="#000000" font-family="sans-serif" font-size="14" x="533.5" y="267.8467">sdfContext</text>
                <line x1="509.5" x2="611.7002" y1="277" y2="277" stroke="#000000" stroke-width="0.5"/>
                <line x1="509.5" x2="611.7002" y1="285" y2="285" stroke="#000000" stroke-width="0.5"/>
              </g>
              <!--class sdfData-->
              <g>
                <rect fill="#FFFFFF" height="44" id="sdfData" rx="2.5" ry="2.5" width="82.5371" x="283" y="370" stroke="#000000" stroke-width="0.5"/>
                <ellipse cx="296" cy="384" fill="#FFFFFF" rx="9" ry="9" stroke="black" stroke-width="1"/>
                <path d="M298.9688,389.6406 Q298.3906,389.9375 297.75,390.0781 Q297.1094,390.2344 296.4063,390.2344 Q293.9063,390.2344 292.5781,388.5938 Q291.2656,386.9375 291.2656,383.8125 Q291.2656,380.6875 292.5781,379.0313 Q293.9063,377.375 296.4063,377.375 Q297.1094,377.375 297.75,377.5313 Q298.4063,377.6875 298.9688,377.9844 L298.9688,380.7031 Q298.3438,380.125 297.75,379.8594 Q297.1563,379.5781 296.5313,379.5781 Q295.1875,379.5781 294.5,380.6563 Q293.8125,381.7188 293.8125,383.8125 Q293.8125,385.9063 294.5,386.9844 Q295.1875,388.0469 296.5313,388.0469 Q297.1563,388.0469 297.75,387.7813 Q298.3438,387.5 298.9688,386.9219 L298.9688,389.6406 Z " fill="#000000"/>
                <text fill="#000000" font-family="sans-serif" font-size="14" x="308" y="388.8467">sdfData</text>
                <line x1="284" x2="364.5371" y1="398" y2="398" stroke="#000000" stroke-width="0.5"/>
                <line x1="284" x2="364.5371" y1="406" y2="406" stroke="#000000" stroke-width="0.5"/>
              </g>
              <!--link sdfProperty to sdfEvent-->
              <!--link sdfEvent to sdfAction-->
              <!--link sdfAction to sdfContext-->
              <!--link sdfThing to sdfThing-->
              <g>
                <path d="M321.77,17.87 C340.52,17.03 356.5,20.74 356.5,29 C356.5,37.26 346.514,41.2385 327.764,40.3985 " fill="none" id="sdfThing-to-sdfThing" stroke="#000000" stroke-width="1"/>
                <polygon fill="#000000" points="321.77,40.13,330.582,44.5288,326.765,40.3538,330.94,36.5368,321.77,40.13" stroke="#000000" stroke-width="1"/>
                <text fill="#000000" font-family="sans-serif" font-size="13" x="362.5" y="33.5669">hasThing</text>
                <text fill="#000000" font-family="sans-serif" font-size="13" x="329.666" y="37.7398">0+</text>
              </g>
              <!--link sdfThing to sdfObject-->
              <g>
                <path d="M277.5,51 C277.5,72.62 277.5,100.12 277.5,121.81 " fill="none" id="sdfThing-to-sdfObject" stroke="#000000" stroke-width="1"/>
                <polygon fill="#000000" points="277.5,127.81,281.5,118.81,277.5,122.81,273.5,118.81,277.5,127.81" stroke="#000000" stroke-width="1"/>
                <text fill="#000000" font-family="sans-serif" font-size="13" x="278.5" y="94.0669">hasObject</text>
                <text fill="#000000" font-family="sans-serif" font-size="13" x="256.0085" y="116.9156">0+</text>
              </g>
              <!--link sdfThing to sdfProperty-->
              <g>
                <path d="M233.29,33.41 C176.24,40.45 79.04,62.02 34.5,128 C9.51,165.02 29.4459,213.9486 45.6659,243.5386 " fill="none" id="sdfThing-to-sdfProperty" stroke="#000000" stroke-width="1"/>
                <polygon fill="#000000" points="48.55,248.8,47.7315,238.9852,46.1466,244.4155,40.7163,242.8306,48.55,248.8" stroke="#000000" stroke-width="1"/>
                <text fill="#000000" font-family="sans-serif" font-size="13" x="35.5" y="154.5669">hasProperty</text>
                <text fill="#000000" font-family="sans-serif" font-size="13" x="23.5515" y="237.9029">0+</text>
              </g>
              <!--link sdfThing to sdfEvent-->
              <g>
                <path d="M242.28,51.05 C214.67,68.89 176.69,96.53 150.5,128 C126.85,156.42 121.19,166.06 112.5,202 C110.72,209.34 108.81,212.41 112.5,219 C120.92,234.06 130.5225,242.3741 145.3825,250.3441 " fill="none" id="sdfThing-to-sdfEvent" stroke="#000000" stroke-width="1"/>
                <polygon fill="#000000" points="150.67,253.18,144.6293,245.4012,146.2637,250.8168,140.8481,252.4512,150.67,253.18" stroke="#000000" stroke-width="1"/>
                <text fill="#000000" font-family="sans-serif" font-size="13" x="151.5" y="154.5669">hasEvent</text>
                <text fill="#000000" font-family="sans-serif" font-size="13" x="123.6864" y="246.5378">0+</text>
              </g>
              <!--link sdfThing to sdfAction-->
              <g>
                <path d="M321.98,47.49 C378.05,72.29 471.77,123.55 510.5,202 C532.32,246.2 463.6182,261.0728 411.3082,266.4828 " fill="none" id="sdfThing-to-sdfAction" stroke="#000000" stroke-width="1"/>
                <polygon fill="#000000" points="405.34,267.1,414.7037,270.1529,410.3135,266.5856,413.8808,262.1954,405.34,267.1" stroke="#000000" stroke-width="1"/>
                <text fill="#000000" font-family="sans-serif" font-size="13" x="490.5" y="154.5669">hasAction</text>
                <text fill="#000000" font-family="sans-serif" font-size="13" x="413.2602" y="262.5731">0+</text>
              </g>
              <!--link sdfThing to sdfContext-->
              <g>
                <path d="M321.59,30.4 C386.84,33.68 507.32,50.55 562.5,128 C588.11,163.94 578.6687,213.3074 569.6187,243.1974 " fill="none" id="sdfThing-to-sdfContext" stroke="#000000" stroke-width="1"/>
                <polygon fill="#000000" points="567.88,248.94,574.3164,241.4853,569.3289,244.1545,566.6597,239.167,567.88,248.94" stroke="#000000" stroke-width="1"/>
                <text fill="#000000" font-family="sans-serif" font-size="13" x="578.5" y="154.5669">hasContext</text>
                <text fill="#000000" font-family="sans-serif" font-size="13" x="548.3053" y="238.0805">0+</text>
              </g>
              <!--link sdfObject to sdfProperty-->
              <g>
                <path d="M229.97,165.09 C203.82,173.85 171.34,186.41 144.5,202 C121.95,215.1 103.6617,230.1543 87.7117,244.7843 " fill="none" id="sdfObject-to-sdfProperty" stroke="#000000" stroke-width="1"/>
                <polygon fill="#000000" points="83.29,248.84,92.6263,245.7042,86.9747,245.4602,87.2187,239.8086,83.29,248.84" stroke="#000000" stroke-width="1"/>
                <text fill="#000000" font-family="sans-serif" font-size="13" x="145.5" y="215.0669">hasProperty</text>
                <text fill="#000000" font-family="sans-serif" font-size="13" x="67.6279" y="237.9536">0+</text>
              </g>
              <!--link sdfObject to sdfEvent-->
              <g>
                <path d="M263.03,172 C248.13,193.62 228.4551,222.1798 213.5051,243.8698 " fill="none" id="sdfObject-to-sdfEvent" stroke="#000000" stroke-width="1"/>
                <polygon fill="#000000" points="210.1,248.81,218.5011,243.6698,212.9376,244.6932,211.9141,239.1297,210.1,248.81" stroke="#000000" stroke-width="1"/>
                <text fill="#000000" font-family="sans-serif" font-size="13" x="242.5" y="215.0669">hasEvent</text>
                <text fill="#000000" font-family="sans-serif" font-size="13" x="192.4636" y="237.9156">0+</text>
              </g>
              <!--link sdfObject to sdfAction-->
              <g>
                <path d="M291.79,172 C306.51,193.62 325.9329,222.1607 340.7029,243.8507 " fill="none" id="sdfObject-to-sdfAction" stroke="#000000" stroke-width="1"/>
                <polygon fill="#000000" points="344.08,248.81,342.3206,239.1196,341.2657,244.6772,335.7081,243.6224,344.08,248.81" stroke="#000000" stroke-width="1"/>
                <text fill="#000000" font-family="sans-serif" font-size="13" x="324.5" y="215.0669">hasAction</text>
                <text fill="#000000" font-family="sans-serif" font-size="13" x="318.6464" y="237.9156">0+</text>
              </g>
              <!--link sdfObject to sdfContext-->
              <g>
                <path d="M325.19,171.05 C376.54,192.65 452.3689,224.5347 504.6989,246.5347 " fill="none" id="sdfObject-to-sdfContext" stroke="#000000" stroke-width="1"/>
                <polygon fill="#000000" points="510.23,248.86,503.4836,241.6846,505.6208,246.9222,500.3832,249.0594,510.23,248.86" stroke="#000000" stroke-width="1"/>
                <text fill="#000000" font-family="sans-serif" font-size="13" x="436.5" y="215.0669">hasContext</text>
                <text fill="#000000" font-family="sans-serif" font-size="13" x="481.3276" y="241.0288">0+</text>
              </g>
              <!--link sdfProperty to sdfData-->
              <g>
                <path d="M70.67,293.29 C78.33,308.57 90.72,328.43 107.5,340 C160.56,376.57 230.4019,386.763 276.9419,389.693 " fill="none" id="sdfProperty-to-sdfData" stroke="#000000" stroke-width="1"/>
                <polygon fill="#000000" points="282.93,390.07,274.1991,385.5124,277.9399,389.7558,273.6965,393.4966,282.93,390.07" stroke="#000000" stroke-width="1"/>
                <text fill="#000000" font-family="sans-serif" font-size="13" x="108.5" y="336.0669">isInstanceOf</text>
                <text fill="#000000" font-family="sans-serif" font-size="13" x="266.5957" y="403.1761">1</text>
              </g>
              <!--link sdfContext to sdfData-->
              <g>
                <path d="M555.07,293.14 C550.09,308.34 541.21,328.17 526.5,340 C480.27,377.17 416.3586,387.2807 372.0886,390.0107 " fill="none" id="sdfContext-to-sdfData" stroke="#000000" stroke-width="1"/>
                <polygon fill="#000000" points="366.1,390.38,375.3291,393.8185,371.0905,390.0722,374.8367,385.8336,366.1,390.38" stroke="#000000" stroke-width="1"/>
                <text fill="#000000" font-family="sans-serif" font-size="13" x="541.5" y="336.0669">isInstanceOf</text>
                <text fill="#000000" font-family="sans-serif" font-size="13" x="373.426" y="403.3946">1</text>
              </g>
              <!--link sdfEvent to sdfData-->
              <g>
                <path d="M193.52,293.08 C193.28,307.67 195.31,326.76 205.5,340 C224.14,364.22 250.7489,375.6063 277.0489,382.3663 " fill="none" id="sdfEvent-to-sdfData" stroke="#000000" stroke-width="1"/>
                <polygon fill="#000000" points="282.86,383.86,275.1391,377.7454,278.0174,382.6153,273.1476,385.4936,282.86,383.86" stroke="#000000" stroke-width="1"/>
                <text fill="#000000" font-family="sans-serif" font-size="13" x="206.5" y="336.0669">hasOutputData</text>
                <text fill="#000000" font-family="sans-serif" font-size="13" x="255.7595" y="378.4449">0+</text>
              </g>
              <!--link sdfAction to sdfData-->
              <g>
                <path d="M402.31,293.25 C421.52,305.62 437.47,322.25 426.5,340 C413.28,361.39 393.7595,372.2049 371.7195,379.5849 " fill="none" id="sdfAction-to-sdfData" stroke="#000000" stroke-width="1"/>
                <polygon fill="#000000" points="366.03,381.49,375.8343,382.4253,370.7713,379.9024,373.2942,374.8393,366.03,381.49" stroke="#000000" stroke-width="1"/>
                <text fill="#000000" font-family="sans-serif" font-size="13" x="430.5" y="336.0669">hasInputData</text>
                <text fill="#000000" font-family="sans-serif" font-size="13" x="373.571" y="375.9214">0+</text>
              </g>
              <!--link sdfAction to sdfData-->
              <g>
                <path d="M336.02,293.3 C328.64,301.75 321.35,312.07 317.5,323 C312.18,338.11 313.0159,350.3666 316.3159,364.0766 " fill="none" id="sdfAction-to-sdfData-1" stroke="#000000" stroke-width="1"/>
                <polygon fill="#000000" points="317.72,369.91,319.5028,360.2238,316.5499,365.0488,311.7249,362.096,317.72,369.91" stroke="#000000" stroke-width="1"/>
                <text fill="#000000" font-family="sans-serif" font-size="13" x="318.5" y="336.0669">hasOutputData</text>
                <text fill="#000000" font-family="sans-serif" font-size="13" x="294.4289" y="359.0424">0+</text>
              </g>
              <!--SRC=[ZP9DJyCm38Rl_HNHhgWI7E60D0f8kp04t127D76Ni2wf79Sn8VuxMRyIjY1sY-sdzlkwTcjj6evympRMMA7GRe0Hjf2vgU8KbtQhpOfLl7PnfUHYlKBR6bdOsYBRAarnNKB5svhkhQ47xXixRbpk07KLGKAZg44MoaU209-urArZbp5IS-VOLyROJNAYprkKW7skh3taStD4k_sTsYivW8XGbot1SUdPYm5BkmQAzDZlI68txB17rWjtidfHVdyXN9Rl82Z4ZsWRGDg5p5oGjYR4TnzWeWyAFma-eyGj9vvbKIkMloej9PWtr2j5UMWoFbB4C7PwfPXnTZRwOdb-pMRdPxF9ARjYYhlUT9Bg5z1ZmpAItEIc8wSr9TdUL0TEHe-fmLU71RV7tE2o1sFBW_JJL2RWbCm4bjQP0FyK6YvXJr_CnZFnf7OBuuWR0SigYthyJmwN4yqVmFsFRAbfgRl4w82IwCASIeQcFm00]-->
            </g>
          </svg>
          </artwork>
          <artwork type="ascii-art" align="center">
  sdfThing
    |
    +-- 0+ hasThing -----> sdfThing
    +-- 0+ hasObject ----> sdfObject
    +-- 0+ hasProperty --> sdfProperty
    +-- 0+ hasEvent -----> sdfEvent
    +-- 0+ hasAction ----> sdfAction
    +-- 0+ hasContext ---> sdfContext

  sdfObject
    |
    +-- 0+ hasProperty --> sdfProperty
    +-- 0+ hasEvent -----> sdfEvent
    +-- 0+ hasAction ----> sdfAction
    +-- 0+ hasContext ---> sdfContext

  sdfProperty
    |
    +-- 1  isInstanceOf --> sdfData

  sdfEvent
    |
    +-- 0+ hasOutputData -> sdfData

  sdfAction
    |
    +-- 0+ hasInputData --> sdfData
    +-- 0+ hasOutputData -> sdfData

  sdfContext
    |
    +-- 1  isInstanceOf --> sdfData
          </artwork>
        </artset>
      </figure>
      <t>
        Context definitions are named in the same way as other SDF definitions, and
        a Context definition can reuse an existing definition through the
        <tt>sdfRef</tt> quality (Section 4.4 of <xref target="RFC9880"/>).
      </t>
      <t>
        An <tt>sdfContext</tt> group occurs only in <tt>sdfObject</tt> and <tt>sdfThing</tt>
        definitions; <tt>sdfContext</tt> is not among the keywords that can be used at the
        top level of a definitions block (Section 3.4 of <xref target="RFC9880"/>).
        A Context definition that is intended for reuse across models is factored out
        as an <tt>sdfData</tt> definition and referenced with <tt>sdfRef</tt>.
      </t>
      <t>
        This document does not define the use of Context definitions in
        <tt>sdfRequired</tt> (Section 4.5 of <xref target="RFC9880"/>).
      </t>
     </section>

     <section anchor="qualities">
       <name>Qualities of sdfContext</name>
      <t>
        The qualities of an <tt>sdfContext</tt> definition are the data qualities defined
        in Section 4.7 ("Data Qualities") of <xref target="RFC9880"/>, which in turn
        include the common qualities of Section 4.6 ("Common Qualities") of
        <xref target="RFC9880"/>. <xref target="sdfContextqual"/> summarizes the qualities
        that are most relevant for non-affordance information. None of these qualities
        are required or have default values that are assumed if the quality is absent.
      </t>

      <table anchor="sdfContextqual">
        <name>SDF-defined Qualities of sdfContext</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">
              See Section 4.6 ("Common Qualities") of <xref target="RFC9880"/>, including description and label </td>
          </tr>
          <tr>
            <td align="left">(data)</td>
            <td align="left">-</td>
            <td align="left">See Section 4.7 ("Data Qualities") of <xref target="RFC9880"/>, including type, unit, contentFormat, sdfType, and enum</td>
          </tr>
          <tr>
            <td align="left">const</td>
            <td align="left">(as per type)</td>
            <td align="left">Fixed value of the context entry, for information that is already known when the model is authored or provisioned</td>
          </tr>
        </tbody>
      </table>
     </section>

     <section anchor="distinction">
       <name>Distinction from sdfProperty</name>

       <t>
         A Context definition and a Property definition are both named sets of data
         qualities, and both may describe characteristics of a Thing. The question of
         which one to use is answered by what the value does, not by how it is
         written. <xref target="sdfContextvsProperty"/> summarizes the difference and
         the criteria for choosing <tt>sdfContext</tt>.
       </t>

       <table anchor="sdfContextvsProperty">
         <name>Comparison of sdfProperty and sdfContext</name>
         <thead>
           <tr>
             <th align="left">Aspect</th>
             <th align="left">sdfProperty</th>
             <th align="left">sdfContext</th>
           </tr>
         </thead>
         <tbody>
           <tr>
             <td align="left">Purpose</td>
             <td align="left">Represents observable or modifiable affordances</td>
             <td align="left">
               Represents static descriptive information </td>
           </tr>
           <tr>
             <td align="left">Mutability</td>
             <td align="left">Typically mutable or changeable over time</td>
             <td align="left">Immutable after deployment</td>
           </tr>
           <tr>
             <td align="left">Migration Criteria</td>
             <td align="left">N/A</td>
             <td align="left">Use if: (1) immutable, (2) non-pollable, (3) descriptive</td>
           </tr>
         </tbody>
       </table>

       <t>
         For example, a sensor's temperature reading should be modeled as an
         <tt>sdfProperty</tt> since it changes over time and clients may want to poll or
         subscribe to it. However, a serial number or installation date should
         be modeled as <tt>sdfContext</tt>, as these are assigned once and do not change
         or require polling.
       </t>

       <t>
         Some values sit between the two. A firmware version does change, but only
         when the device is updated, and clients do not poll it as part of normal
         operation. The criterion is not how often a value changes, but whether a
         client is expected to read or write it through an interface of the Thing:
         where it is, the value is a Property; where it is not, it is context.
         Where both are needed, a model can define a Context entry for the
         descriptive record and a Property for the value that clients interact with.
       </t>
     </section>

     <section anchor="processing">
       <name>Processing Requirements</name>
       <t>
         From an implementation perspective, tools <bcp14>MUST NOT</bcp14> generate GET/PUT
         endpoints for <tt>sdfContext</tt>, and UI frameworks <bcp14>SHOULD</bcp14> render these values
         as static labels or metadata panels. If an existing model contains
         <tt>sdfProperty</tt> entries that are read-only and represent metadata,
         they <bcp14>MAY</bcp14> be migrated to <tt>sdfContext</tt> for semantic clarity.
       </t>
       <t>
         Entries under <tt>sdfContext</tt> are not exposed through run-time protocol
         affordances such as CoAP or HTTP; they enhance the expressiveness of the
         model for tooling, documentation, and system integration purposes.
       </t>
     </section>

  </section>
  <!--section 4-->

   <!--section 5-->
   <section anchor="examples">
     <name>Examples</name>

     <t>
       This section gives examples of non-affordance information modeling using the
       <tt>sdfContext</tt> construct. <xref target="ex-asset"/> to
       <xref target="ex-regulatory"/> correspond to the use cases described in
       <xref target="use-cases"/>, and <xref target="ex-links"/> shows how an entry
       can point to an external resource. Several of the examples use the data
       qualities <tt>properties</tt> and <tt>required</tt> of the type "object", which are
       defined in Appendix C.5 of <xref target="RFC9880"/>; as noted there, the
       quality <tt>properties</tt> is unrelated to <tt>sdfProperty</tt>.
     </t>

     <t>
       The following example is a complete SDF document that defines an
       <tt>sdfObject</tt> containing both an affordance
       and several non-affordance attributes. The affordance is represented as a
       temperature property, which is a numeric value in degrees Celsius.
       The non-affordance attributes are grouped under <tt>sdfContext</tt>. These include
       a serialNumber, which is a factory-assigned identifier; an installationLocation,
       which indicates where the device is deployed within a building;
       and a calibrationOffset, which specifies a correction value applied
       to raw sensor measurements. Together, these definitions illustrate how <tt>sdfContext</tt>
       can capture descriptive metadata that is not directly interactive but still
       essential for interpretation and integration. The examples in the following
       subsections show only the definitions themselves, without the information
       block and the namespaces block.
     </t>

     <figure anchor="fig-sdfcontext-example">
       <name>SDF Document containing a Property and Context entries</name>
       <sourcecode type="json">
{
  "info": {
    "title": "Example document for sdfContext",
    "version": "2026-10-27",
    "copyright": "Copyright 2026 Example Corp. All rights reserved.",
    "license": "https://example.com/license"
  },
  "namespace": {
    "cap": "https://example.com/capability/cap"
  },
  "defaultNamespace": "cap",
  "sdfObject": {
    "deviceWithContext": {
      "sdfProperty": {
        "temperature": {
          "type": "number",
          "unit": "°C"
        }
      },
      "sdfContext": {
        "serialNumber": {
          "type": "string",
          "description": "Unique factory-assigned identifier"
        },
        "installationLocation": {
          "type": "string",
          "description": "Installation location in the building"
        },
        "calibrationOffset": {
          "type": "number",
          "unit": "°C",
          "description": "Offset applied to raw measurements"
        }
      }
    }
  }
}
       </sourcecode>
     </figure>

       <section anchor="ex-asset">
         <name>Asset Management and Tracking</name>
       <t>
         The following example corresponds to the use case in <xref target="uc-asset"/>.
         It models static metadata for a shipping container, including physical
         dimensions and capacity. The entry <tt>physicalSpecs</tt> is an object whose four
         members are all listed in <tt>required</tt>, while the members of <tt>location</tt>
         are not, so that a model can carry the dimensions of a container without
         fixing where it is.
       </t>

       <figure anchor="fig-asset">
         <name>Asset Management and Tracking Example</name>
         <sourcecode type="json">
{
  "sdfObject": {
    "assetContainer": {
      "description": "Shipping container with embedded sensors",
      "sdfContext": {
        "physicalSpecs": {
          "description": "Physical dimensions and capacity",
          "type": "object",
          "properties": {
            "length": { "type": "number", "unit": "m" },
            "width": { "type": "number", "unit": "m" },
            "height": { "type": "number", "unit": "m" },
            "maxLoadKg": { "type": "number", "unit": "kg" }
          },
          "required": ["length", "width", "height", "maxLoadKg"]
        },
        "location": {
          "type": "object",
          "properties": {
            "lat": { "type": "number" },
            "lon": { "type": "number" }
          }
        }
      }
    }
  }
}
         </sourcecode>
       </figure>
       </section>

       <section anchor="ex-environment">
         <name>Environmental Context Awareness</name>
       <t>
         This example corresponds to <xref target="uc-environment"/>. It describes installation-related
         metadata for a building-mounted environmental sensor. The <tt>enum</tt> quality
         restricts how a mounting position and an indoor or outdoor placement can be
         expressed, so that analytics tools can rely on a fixed set of values.
       </t>

       <figure anchor="fig-environment">
         <name>Environmental Context Awareness Example</name>
         <sourcecode type="json">
{
  "sdfObject": {
    "envSensor": {
      "description": "Environmental sensor unit",
      "sdfContext": {
        "installationInfo": {
          "type": "object",
          "properties": {
            "floor": { "type": "integer" },
            "mountType": {
              "type": "string",
              "enum": ["wall", "ceiling", "window"]
            },
            "indoorOutdoor": {
              "type": "string",
              "enum": ["indoor", "outdoor"]
            }
          },
          "required": ["floor", "mountType"]
        }
      }
    }
  }
}
         </sourcecode>
       </figure>
       </section>

       <section anchor="ex-regulatory">
         <name>Regulatory Compliance and Certification</name>
       <t>
         Aligned with <xref target="uc-regulatory"/>, the following SDF model defines immutable
         identity and certification data of a regulated device. Here the information
         describes the device as a whole rather than one of its functional blocks, so
         the <tt>sdfContext</tt> group is placed in an <tt>sdfThing</tt> definition; the
         certification records are modeled as an array of objects, since a device can
         carry several of them.
       </t>

       <figure anchor="fig-regulatory">
         <name>Regulatory Compliance and Certification Example</name>
         <sourcecode type="json">
{
  "sdfThing": {
    "deviceMetadata": {
      "sdfContext": {
        "identity": {
          "type": "object",
          "properties": {
            "manufacturer": { "type": "string" },
            "model": { "type": "string" },
            "firmwareVersion": { "type": "string" }
          }
        },
        "certifications": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "scheme": { "type": "string" },
              "certId": { "type": "string" },
              "region": { "type": "string" }
            }
          }
        }
      }
    }
  }
}
         </sourcecode>
       </figure>
       </section>

       <section anchor="ex-links">
         <name>Referencing External Resources</name>

       <t>
         Some context entries do not carry a value of their own but point to an
         external resource, such as a manufacturer datasheet, a certification
         document, or a digital twin instance hosted on another platform. Such
         entries are modeled with the <tt>sdfType</tt> "link" defined in
         <xref target="I-D.ietf-asdf-sdftype-link"/>, which models an abstract
         serialization of a Web Link <xref target="RFC8288"/> as an SDF data
         definition.
       </t>

       <t>
         As specified in <xref target="I-D.ietf-asdf-sdftype-link"/>, a definition
         using <tt>sdfType</tt> "link" is used with the SDF <tt>type</tt> "object".
         The members of that object are named after the link parameter (attribute)
         names of <xref target="RFC8288"/>, and the special member name <tt>href</tt>
         carries the link target. Only the link parameters that the model constrains
         need to be declared. A context entry that identifies an external resource
         declares <tt>href</tt> alone; further parameters, such as a link relation type
         or a media type, can be added where the model constrains them, and the
         <tt>const</tt> quality can be used to pin a parameter whose value is fixed when
         the model is authored.
       </t>

       <t>
         The following example defines three external references in the
         <tt>sdfContext</tt> of a device. Each entry is an object-typed definition with
         <tt>sdfType</tt> "link" and declares <tt>href</tt> as the link target; the
         <tt>description</tt> quality carries the human-readable explanation of what
         the link points to.
       </t>

       <ul spacing="normal">
         <li>
           <tt>datasheetLink</tt>: the manufacturer's datasheet, which typically contains
           technical specifications, electrical parameters, and physical
           characteristics of the device.
         </li>
         <li>
           <tt>certificationLink</tt>: a publicly accessible certification document such as
           a safety approval (e.g., CE, FCC) or a compliance report.
         </li>
         <li>
           <tt>digitalTwinLink</tt>: an external digital twin instance of the device,
           typically hosted in a cloud-based platform or digital thread system,
           used for visualization, monitoring, or synchronization
           <xref target="I-D.ietf-asdf-digital-twin"/>.
         </li>
       </ul>

       <figure anchor="fig-sdftype-link">
         <name>Examples of using sdfType "link" in sdfContext</name>
         <sourcecode type="json">
{
  "sdfObject": {
    "deviceWithLinks": {
      "description": "Device with references to external resources",
      "sdfContext": {
        "datasheetLink": {
          "type": "object",
          "sdfType": "link",
          "description": "Link to the manufacturer's datasheet",
          "properties": {
            "href": {
              "type": "string"
            }
          }
        },
        "certificationLink": {
          "type": "object",
          "sdfType": "link",
          "description": "Link to the product safety certification",
          "properties": {
            "href": {
              "type": "string"
            }
          }
        },
        "digitalTwinLink": {
          "type": "object",
          "sdfType": "link",
          "description": "Link to an external digital twin",
          "properties": {
            "href": {
              "type": "string"
            }
          }
        }
      }
    }
  }
}
         </sourcecode>
       </figure>

       <t>
         Where an ecosystem already publishes a link definition, the <tt>sdfRef</tt>
         quality (Section 4.4 of <xref target="RFC9880"/>) can be used to reuse that
         definition instead of repeating the link parameters in every model;
         <xref target="I-D.ietf-asdf-sdftype-link"/> gives examples of this pattern.
         Link parameters specific to constrained environments are discussed in
         <xref target="RFC6690"/>.
       </t>
       </section>

   </section>
   <!--section 5-->

   <!--section 6-->
   <section anchor="relationship">
     <name>Relationship to Other SDF Documents</name>

     <t>
       This document defines class-level modeling only. The value that a context
       entry takes for an individual Thing is instance information: it is
       established when the Thing is deployed and can change over its lifetime,
       for example when a device is moved to another room or when a certification
       is renewed. Reporting and updating such values is specified in
       <xref target="I-D.ietf-asdf-instance-information"/>, which defines
       instance-related messages for SDF models. An <tt>sdfContext</tt> definition
       governs the context values carried in those messages: the names and the data
       qualities of the definitions determine what a conforming instance may report.
     </t>

     <t>
       The general semantics of the <tt>sdfType</tt> "link" are specified in
       <xref target="I-D.ietf-asdf-sdftype-link"/>; <xref target="ex-links"/> only
       shows how such a definition is used within an <tt>sdfContext</tt> group.
     </t>

     <t>
       Ecosystem-specific details can alternatively be layered onto an SDF model
       by an Augmentation Mechanism (Section 1.2.3 of <xref target="RFC9880"/>); SDF
       mapping files <xref target="I-D.ietf-asdf-sdf-mapping"/> provide a way to augment
       a base model with additional qualities or metadata. The <tt>sdfContext</tt>
       extension defined in this document complements that approach by providing
       a first-class construct within the model for static context, ensuring
       that such metadata is uniformly available and semantically distinguished
       in the core specification of a Thing. Ecosystem-specific metadata such as
       regulatory certifications, deployment regions, or vendor-specific
       constraints can be included and mapped according to the needs of each
       ecosystem.
     </t>

     <t>
       <xref target="I-D.ietf-asdf-digital-twin"/> describes how non-affordance
       information modeled with <tt>sdfContext</tt> is used in digital twin systems.
     </t>
   </section>
   <!--section 6-->

   <!--section 7-->
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t> TBD </t>
    </section>
    <!--section 7-->

    <!--section 8-->
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t> TBD </t>
    </section>
    <!--section 8-->

  </middle>

  <back>
  <!--section 9-->
  <references anchor="references">
    <name>References</name>

  <references anchor="normative-references">
    <name>Normative References</name>

        <reference anchor='RFC2119' target='https://www.rfc-editor.org/rfc/rfc2119'>
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname='S. Bradner' initials='S.' surname='Bradner'/>
            <date month='March' year='1997'/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification.
      				  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.
      				  This document specifies an Internet Best Current Practices for the Internet Community,
                and requests discussion and suggestions for improvements.
              </t>
            </abstract>
          </front>
          <seriesInfo name='BCP' value='14'/>
          <seriesInfo name='RFC' value='2119'/>
          <seriesInfo name='DOI' value='10.17487/RFC2119'/>
        </reference>

        <reference anchor='RFC8174' target='https://www.rfc-editor.org/rfc/rfc8174'>
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname='B. Leiba' initials='B.' surname='Leiba'/>
            <date month='May' year='2017'/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications.
				  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name='BCP' value='14'/>
          <seriesInfo name='RFC' value='8174'/>
          <seriesInfo name='DOI' value='10.17487/RFC8174'/>
         </reference>

         <reference anchor='RFC9880' target='https://www.rfc-editor.org/rfc/rfc9880'>
           <front>
             <title>Semantic Definition Format (SDF) for Data and Interactions of Things</title>
             <author fullname="Michael Koster" initials="M." surname="Koster" role="editor"/>
             <author fullname="Carsten Bormann" initials="C." surname="Bormann" role="editor"/>
             <author fullname="Ari Keränen" initials="A." surname="Keränen"/>
             <date month="January" year="2026"/>
           </front>
           <seriesInfo name='RFC' value='9880'/>
           <seriesInfo name='DOI' value='10.17487/RFC9880'/>
         </reference>

  </references>

  <references anchor="informative-references">
    <name>Informative References</name>

         <reference anchor='RFC8288' target='https://www.rfc-editor.org/rfc/rfc8288'>
           <front>
             <title>Web Linking</title>
             <author fullname="Mark Nottingham" initials="M." surname="Nottingham"/>
             <date month="October" year="2017"/>
           </front>
           <seriesInfo name='RFC' value='8288'/>
           <seriesInfo name='DOI' value='10.17487/RFC8288'/>
         </reference>

         <reference anchor='RFC6690' target='https://www.rfc-editor.org/rfc/rfc6690'>
           <front>
             <title>Constrained RESTful Environments (CoRE) Link Format</title>
             <author fullname="Zach Shelby" initials="Z." surname="Shelby"/>
             <date month="August" year="2012"/>
           </front>
           <seriesInfo name='RFC' value='6690'/>
           <seriesInfo name='DOI' value='10.17487/RFC6690'/>
         </reference>

         <reference anchor='I-D.ietf-asdf-sdftype-link' target='https://datatracker.ietf.org/doc/html/draft-ietf-asdf-sdftype-link-02'>
           <front>
             <title>An sdfType for Links</title>
             <author fullname="Carsten Bormann" initials="C." surname="Bormann">
               <organization>Universität Bremen TZI</organization>
             </author>
             <author fullname="Ari Keränen" initials="A." surname="Keränen">
               <organization>Ericsson</organization>
             </author>
             <date day="23" month="June" year="2026"/>
           </front>
           <seriesInfo name='Internet-Draft' value='draft-ietf-asdf-sdftype-link-02'/>
         </reference>

         <reference anchor='I-D.ietf-asdf-sdf-mapping' target='https://datatracker.ietf.org/doc/html/draft-ietf-asdf-sdf-mapping-01'>
           <front>
             <title>Semantic Definition Format (SDF): Supplements</title>
             <author fullname="Carsten Bormann" initials="C." surname="Bormann">
               <organization>Universität Bremen TZI</organization>
             </author>
             <author fullname="Jan Romann" initials="J." surname="Romann">
               <organization>Universität Bremen</organization>
             </author>
             <date day="18" month="February" year="2026"/>
           </front>
           <seriesInfo name='Internet-Draft' value='draft-ietf-asdf-sdf-mapping-01'/>
         </reference>

         <reference anchor='I-D.ietf-asdf-instance-information' target='https://datatracker.ietf.org/doc/html/draft-ietf-asdf-instance-information-02'>
           <front>
             <title>Instance Information for SDF</title>
             <author fullname="Jan Romann" initials="J." surname="Romann">
               <organization>Universität Bremen</organization>
             </author>
             <author fullname="Carsten Bormann" initials="C." surname="Bormann">
               <organization>Universität Bremen TZI</organization>
             </author>
             <date day="18" month="February" year="2026"/>
           </front>
           <seriesInfo name='Internet-Draft' value='draft-ietf-asdf-instance-information-02'/>
         </reference>

         <reference anchor='I-D.ietf-asdf-digital-twin' target='https://datatracker.ietf.org/doc/html/draft-ietf-asdf-digital-twin-05'>
           <front>
             <title>Semantic Definition Format (SDF) Modeling for Digital Twin</title>
             <author fullname="Hyunjeong Lee" initials="H." surname="Lee" role="editor">
               <organization abbrev="ETRI">Electronics and Telecommunications Research Institute</organization>
             </author>
             <author fullname="Jungha Hong" initials="J." surname="Hong">
               <organization abbrev="ETRI">Electronics and Telecommunications Research Institute</organization>
             </author>
             <date day="14" month="September" year="2026"/>
           </front>
           <seriesInfo name='Internet-Draft' value='draft-ietf-asdf-digital-twin-05'/>
         </reference>

  </references>

  </references>
  <!--section 9-->

  </back>
</rfc>
