<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd">
<rfc 
    xmlns:xi="http://www.w3.org/2001/XInclude"
    category="exp"
    docName="draft-mallick-muacp-02"
    ipr="trust200902"
    submissionType="independent">

  <front>
    <title abbrev="µACP">The Micro Agent Communication Protocol (µACP)</title>

    <author initials="A." surname="Mallick" fullname="Arnab Mallick">
      <organization>Centre for Development of Advanced Computing (CDAC)</organization>
      <address>
        <postal>
          <city>Hyderabad</city>
          <country>IN</country>
        </postal>
        <email>arnabm@cdac.in</email>
      </address>
    </author>

    <author initials="I." surname="Chebolu" fullname="Indraveni Chebolu">
      <organization>Centre for Development of Advanced Computing (CDAC)</organization>
      <address>
        <postal>
          <city>Hyderabad</city>
          <country>IN</country>
        </postal>
        <email>indravenik@cdac.in</email>
      </address>
    </author>

    <date year="2026" month="January" day="18"/>
    <area>Internet</area>
    <workgroup>Independent Submission</workgroup>

    <abstract>
      <t>This document specifies the Micro Agent Communication Protocol (µACP), 
      a resource-efficient messaging protocol for autonomous agents operating on 
      resource-constrained Edge and IoT devices (including Class 1 and Class 2 devices per <xref target="RFC7228"/>). Existing agent 
      communication protocols assume unbounded computational and energy resources; 
      µACP provides bounded resource consumption guarantees with deterministic memory bounds 
      (8-byte header, up to 1024-byte TLV region, up to 65535-byte payload) and bounded processing 
      time per message, while maintaining expressiveness sufficient for finite-state coordination 
      patterns. The protocol defines four core message types, a fixed 64-bit header, 
      TLV-based extensibility, and mandatory OSCORE security binding for operation 
      in adversarial environments.</t>
    </abstract>

    <note title="Status of This Memo">
      <t>This Internet-Draft is submitted in full conformance with the provisions 
      of BCP 78 and BCP 79.</t>
      <t>Internet-Drafts are working documents of the Internet Engineering Task Force 
      (IETF). Note that other groups may also distribute working documents as 
      Internet-Drafts. The list of current Internet-Drafts is at 
      https://datatracker.ietf.org/drafts/current/.</t>
      <t>Internet-Drafts are draft documents valid for a maximum of six months 
      and may be updated, replaced, or obsoleted by other documents at any time. 
      It is inappropriate to use Internet-Drafts as reference material or to cite 
      them other than as "work in progress."</t>
    </note>

    <note title="Copyright Notice">
      <t>Copyright (c) 2026 IETF Trust and the persons identified as the 
      document authors. All rights reserved.</t>
    </note>
  </front>

  <middle>
    
<section title="Introduction" anchor="introduction">
  <t>The Micro Agent Communication Protocol (µACP) is a compact, resource-efficient communication protocol designed for distributed autonomous agents operating on resource-constrained Edge and IoT devices (including Class 1 and Class 2 devices per <xref target="RFC7228"/>). It aims to bridge the gap between resource-light IoT protocols and semantically rich agent communication languages, by offering minimal overhead yet expressive interaction semantics.</t>

  <t>Modern IoT, edge, and embedded environments involve devices with limited RAM, CPU, energy, and unreliable networks. Distributed applications require coordination, state sharing, event subscriptions, and request/response semantics. Traditional agent-communication languages impose heavy overhead unacceptable on microcontroller-class platforms, while standard IoT protocols provide minimal semantics.</t>

  <t>µACP addresses this by defining a wire-efficient, fixed-header, TLV-extensible protocol with four core verbs (PING, TELL, ASK, OBSERVE) sufficient for request/response, publish/subscribe, and liveness checking. The protocol enables lean, deterministic implementations suitable for microcontroller-class devices while supporting structured multi-agent interactions. Formal foundations including resource bounds and safety verification are established in <xref target="MUACP"/>.</t>

  <t>This specification mandates CoAP with OSCORE <xref target="RFC8613"/> as the mandatory-to-implement transport binding, ensuring end-to-end confidentiality, integrity, and replay protection for constrained devices.</t>

  <section title="Goals" anchor="goals">
  <t>µACP aims to: provide minimal, low-overhead communication for constrained agents with structured semantics; ensure deterministic and bounded resource usage; support essential multi-agent patterns (request/response, publish/subscribe, liveness) using four orthogonal primitives; define a secure, interoperable transport binding; enable extensibility via TLV options without breaking compatibility.</t>
  </section>

  <section title="Scope" anchor="scope">
  <t>This specification defines the wire format, core semantics, normative behavior, mandatory transport binding, security constraints, and IANA registries. It does not specify application-level semantics (content encoding, agent ontology, high-level negotiation), which are left to deployment-specific or higher-layer protocols.</t>
  </section>

  <section title="Document Structure" anchor="structure">
    <t>Sections 2-3 define conventions, terminology, and message encoding. Sections 4-5 define protocol semantics and the mandatory CoAP/OSCORE transport binding. Sections 6-7 cover error handling, version negotiation, and IANA registries. Sections 8-9 define state machines and security considerations. Sections 10-11 cover interoperability profiles, wire examples, and conformance tests.</t>
</section>
</section>

<section title="Conventions and Terminology" anchor="conventions">
  <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when they appear in ALL CAPS. These words may also appear in lowercase or mixed case as plain English words, absent their normative meanings.</t>

  <section title="Terminology" anchor="terminology">
    <t>Key terms: <strong>Agent</strong>—autonomous software entity participating in µACP communication; <strong>Verb</strong>—one of four primitives (PING, TELL, ASK, OBSERVE) encoded in 2 bits; <strong>TLV</strong>—Type-Length-Value encoding (8-bit Type, 8-bit Length, variable Value); <strong>Correlation ID</strong>—16-bit identifier grouping messages into a conversation; <strong>Sequence ID</strong>—16-bit monotonically increasing identifier for duplicate detection; <strong>Conversation</strong>—sequence of related messages identified by Correlation ID; <strong>OSCORE</strong>—Object Security for Constrained RESTful Environments <xref target="RFC8613"/>; <strong>CoAP</strong>—Constrained Application Protocol <xref target="RFC7252"/>; <strong>Constrained Device</strong>—device with limited resources per <xref target="RFC7228"/> (Class 1: ~10 KB RAM/100 KB flash; Class 2: ~50 KB RAM/250 KB flash).</t>
  </section>

  <section title="Notation" anchor="notation">
    <t>Notation: hexadecimal values prefixed with "0x"; binary values prefixed with "0b"; network byte order (big-endian) unless otherwise specified; bit positions numbered from 0 (MSB) to n-1 (LSB); message formats shown using ASCII art diagrams.</t>
  </section>

  <section title="Abbreviations" anchor="abbreviations">
    <t>Abbreviations: CBOR (Concise Binary Object Representation <xref target="RFC8949"/>), CID (Correlation ID), CoAP (Constrained Application Protocol), COSE (CBOR Object Signing and Encryption <xref target="RFC8152"/>), EDHOC (Ephemeral Diffie-Hellman Over COSE <xref target="RFC9528"/>), FSM (Finite State Machine), IANA (Internet Assigned Numbers Authority), IoT (Internet of Things), MTI (Mandatory to Implement), OSCORE (Object Security for Constrained RESTful Environments), QoS (Quality of Service), SID (Sequence ID), TLV (Type-Length-Value), URI (Uniform Resource Identifier).</t>
  </section>
</section>

<section title="Message Model and Encoding Rules" anchor="message-model">
  <t>This section defines the normative wire-level encoding of µACP messages, including the fixed header, TLV format, payload processing rules, byte ordering, and OSCORE protection boundaries. All compliant implementations MUST follow these encoding rules exactly unless otherwise specified.</t>

  <section title="Message Structure" anchor="msg-structure">
    <t>A µACP message consists of three components encoded in the following order:</t>

    <figure anchor="msg-layout">
      <name>Figure 1: µACP Message Layout</name>
      <artwork><![CDATA[
+----------------------+----------------------+-------------------------+
|     Header (64b)     |   TLVs (0..1024 B)   | Payload (0..65535 B)    |
+----------------------+----------------------+-------------------------+
      ]]></artwork>
    </figure>

    <t>The header format is fixed-length and MUST always appear. TLVs and payloads are optional. Messages MUST NOT exceed transport-imposed size limits; for CoAP/OSCORE, these limits are determined by underlying MTU constraints and CoAP Blockwise Transfer <xref target="RFC7959"/> if used.</t>

    <t>All fields are encoded in network byte order (big-endian).</t>
  </section>

  <section title="Header Format" anchor="header-format">
    <t>The µACP header consists of 64 bits arranged as follows:</t>

    <figure anchor="header-diagram">
      <name>Figure 2: µACP Header Bit Layout</name>
      <artwork><![CDATA[
  0                   7 8                 15 16                23
 +---------------------+---------------------+--------------------+
 |     Sequence ID     |    Correlation ID   | QoS |Verb| Flags  |
 +---------------------+---------------------+--------------------+
 24                                                        63
 +--------------------------------------------------------------+
 |                       Reserved (24 bits)                      |
 +--------------------------------------------------------------+

Byte 0-1:   Sequence ID (16 bits, big-endian)
Byte 2-3:   Correlation ID (16 bits, big-endian)
Byte 4:     Bits 0-1: QoS (2 bits)
            Bits 2-3: Verb (2 bits)  
            Bits 4-7: Flags (4 bits)
Byte 5-7:   Reserved (24 bits, all zeros)
      ]]></artwork>
    </figure>

    <t><strong>Sequence ID (16 bits, bytes 0-1):</strong>  
      Monotonically increasing identifier used for duplicate detection and replay-window tracking.  
      Sequence ID is per-sender (per OSCORE security context) and monotonically increases within each sender's message stream. MUST wrap modulo 2^16. Sequence ID SHOULD be initialized to a random value (not 0) to prevent predictability and traffic analysis. Initialization to 0 is acceptable only when: (1) establishing a new OSCORE security context, (2) no prior communication history exists with the peer, and (3) the initialization is synchronized with the establishment of the new OSCORE context. In all other cases, Sequence IDs MUST be initialized to a random value. Sequence IDs MUST be unpredictable if security-sensitive traffic requires preventing traffic analysis.</t>

    <t><strong>Correlation ID (16 bits, bytes 2-3):</strong>  
      Identifies all messages belonging to the same conversation.  
      Correlation ID MUST be unique among active conversations from the same sender (same OSCORE security context). Different senders may independently use the same Correlation ID values, as conversations are scoped per OSCORE security context.  
      SHOULD be randomly generated in security-sensitive deployments.</t>

    <t><strong>QoS (2 bits, byte 4 bits 0-1):</strong>  
      Encodes transmission semantics (fire-and-forget, at-least-once, at-most-once).  
      Values are defined in the IANA Considerations section.</t>

    <t><strong>Verb (2 bits, byte 4 bits 2-3):</strong>  
      Identifies one of the four µACP operations: PING(0), TELL(1), ASK(2), OBSERVE(3).</t>

    <t><strong>Flags (4 bits, byte 4 bits 4-7):</strong>  
      Control bits reserved for protocol-level features such as fragmentation, retransmission hints, or message cancellation.  
      Future specifications MAY define additional meanings.</t>

    <t><strong>Reserved (24 bits, bytes 5-7):</strong>  
      MUST be set to zero on transmission and ignored by receivers. Reserved bits MAY be repurposed by future µACP versions but MUST NOT change meaning in this version.</t>
  </section>

  <section title="TLV Encoding" anchor="tlv-encoding">
    <t>TLVs (Type–Length–Value structures) convey optional metadata and extensibility information. They appear immediately after the header and MUST appear in Type-increasing order to allow binary search and deterministic parsing.</t>

    <figure anchor="tlv-format">
      <name>Figure 3: TLV Encoding</name>
      <artwork><![CDATA[
  0        7 8        15
 +----------+-----------+------------------------------+
 |  Type    |  Length   |    Value (Length octets)     |
 +----------+-----------+------------------------------+
      ]]></artwork>
    </figure>

    <t><strong>Type (8 bits):</strong>  
      TLV identifier. The meaning of each Type is defined in the IANA registry.  
      Types 0–31 are reserved and governed by Standards Action.  
      Types 32–127 require IETF Review.  
      Types 128–255 are vendor-specific.</t>

    <t><strong>Length (8 bits):</strong>  
      Specifies the number of octets in the Value field (0-255). The Length field MUST NOT exceed 255. Receivers MUST validate that the declared Length does not exceed the remaining message buffer before reading the Value field. Each individual TLV's Value field MUST NOT exceed 255 octets. The total TLV region (sum of all TLV lengths plus their Type and Length fields) MUST NOT exceed 1024 bytes. Implementations MUST validate both constraints: individual TLV length ≤ 255 and total TLV region ≤ 1024 bytes.</t>

    <t><strong>Value:</strong>  
      Encoded according to Type. For Types other than 0x00 (Raw Octets), the Value is subject to OSCORE protection (<xref target="transport-mti"/>).</t>

    <t><strong>Critical TLVs:</strong>  
      A future TLV Type range MAY designate critical TLVs.  
      Receiving an unknown critical TLV MUST cause message rejection.</t>

    <section title="TLV Processing Rules" anchor="tlv-processing">
      <t>Receivers MUST apply the following rules when processing TLVs:</t>
      <ul>
        <li>TLVs MUST be parsed strictly in order.</li>
        <li>If Length exceeds remaining buffer size, the message MUST be discarded.</li>
        <li>Unknown TLV Types MUST be ignored unless they are designated critical.</li>
        <li>TLV order MUST be strictly increasing by Type; violating this is a format error.</li>
        <li>TLV Type 0x00 (Raw Octets) MUST NOT appear in encrypted messages; its use is restricted to unencrypted PING messages.</li>
      </ul>
    </section>
  </section>

  <section title="Payload Encoding" anchor="payload">
    <t>The µACP payload is an optional octet string of 0–65535 bytes used for application data, action parameters, event notifications, or encoded content (CBOR, JSON). Payloads MUST be OSCORE-protected unless the message Verb is PING. Payload sizes MUST be validated before allocation. If encoded using CBOR (Type=0x03), receivers MUST treat it as a single CBOR data item. If JSON (Type=0x02), it MUST be UTF-8 encoded.</t>
  </section>

  <section title="Byte Ordering" anchor="byte-order">
    <t>All multi-octet integer fields in µACP (Sequence ID, Correlation ID, header composites) MUST be encoded in network byte order (big-endian). TLV and payload content MAY use other encoding rules (e.g., CBOR or UTF-8) as determined by their Types.</t>
  </section>

  <section title="Fragmentation (Optional Feature)" anchor="fragmentation">
    <t>µACP does not mandate fragmentation. TLV Type 0x10 is reserved for future fragmentation specification but MUST NOT be used until fully specified. Deployments using CoAP Blockwise Transfer <xref target="RFC7959"/> SHOULD avoid µACP-level fragmentation.</t>
  </section>

  <section title="OSCORE Protection Boundaries" anchor="oscore-boundaries">
    <t>When µACP is transported over CoAP with OSCORE, the OSCORE-protected CoAP payload MUST contain the complete µACP message (Header | TLVs | Payload). OSCORE MUST protect: all TLVs except those in unencrypted PING messages, the entire payload, and header fields other than those needed for outer CoAP routing. Implementations MUST NOT leak semantics (e.g., Verb, QoS) through the CoAP outer header beyond what OSCORE permits.</t>
  </section>

  <section title="Canonical Encoding Rules" anchor="canonical-encoding">
    <t>Canonical encoding rules: fields MUST NOT be padded; TLVs MUST be sorted by ascending Type; no two TLVs MAY share the same Type unless explicitly defined; payload MUST begin immediately after the last TLV; implementations MUST normalize line endings, whitespace, or internal representations before hashing or signing application content.</t>
  </section>
</section>
<section title="Protocol Semantics" anchor="semantics">
  <t>This section defines the normative semantics of the four µACP verbs: PING, TELL, ASK, and OBSERVE. Each verb represents a fundamental communication primitive intended to support higher-level agent behaviors, including liveness detection, request/response interactions, state dissemination, and event-driven notification.</t>

  <t>Agents MUST implement all four verbs.  
     Agents MUST apply OSCORE protection to all messages except PING, unless an application explicitly operates in an unauthenticated environment.</t>

  <t>For each verb, this section defines sender behavior, receiver behavior, state-machine interactions, mandatory error cases, and expected processing-time bounds.</t>

  <!-- ========================= -->
  <!-- 4.1 PING                  -->
  <!-- ========================= -->

  <section title="PING" anchor="verb-ping">
    <t>PING provides low-cost reachability and liveness detection. PING messages SHOULD be sent unencrypted by default to remain lightweight. Implementations MAY support OSCORE-protected PING for authenticated deployments, but unencrypted PING MUST be accepted by all receivers. Sender: MAY emit PING at any time; MUST increment Sequence ID; SHOULD use unique Correlation ID; MUST rate-limit (≤1 per 10 seconds per peer). Receiver: SHOULD reply with TELL; MUST NOT require OSCORE for unencrypted PING; MUST accept both unencrypted and OSCORE-protected PING; SHOULD rate-limit PING processing. Unencrypted PING may leak topology/presence information; implementations SHOULD use rate limiting and randomization. For authenticated liveness, use ASK/TELL with OSCORE or OSCORE-protected PING.</t>
  </section>

  <section title="TELL" anchor="verb-tell">
    <t>TELL conveys information, updates, or asynchronous notifications, and responds to ASK messages. TELL messages MUST be OSCORE-protected unless deployment explicitly allows unauthenticated mode. Sender: MUST include payload or meaningful TLV set; MUST increment Sequence ID; when responding to ASK, MUST use same Correlation ID. Receiver: MUST validate OSCORE; MUST associate via Correlation ID; MUST incorporate content per application policy. Errors: TELL without OSCORE MUST be rejected (unless non-secure mode); malformed TLVs MUST cause discard.</t>
  </section>

  <section title="ASK" anchor="verb-ask">
    <t>ASK initiates a request for information or action and typically elicits a TELL response. ASK messages MUST be OSCORE-protected. Sender: MUST allocate new conversation entry indexed by Correlation ID; MUST increment Sequence ID; MUST start request timer (default timeout of 30 seconds is RECOMMENDED for constrained devices, with exponential backoff for retransmissions when QoS=1); MUST enforce conversation limits. Receiver: MUST validate OSCORE; MUST associate ASK with Correlation ID; MUST generate TELL response with result or error TLV. Errors: malformed TLVs → TELL(error); security validation failure → silent discard; correlation-table limits exceeded → resource exhaustion error.</t>
  </section>

  <section title="OBSERVE" anchor="verb-observe">
    <t>OBSERVE establishes a subscription for future notifications, scoped to a single peer. OBSERVE messages MUST be OSCORE-protected. Sender: MUST allocate/update subscription state indexed by Correlation ID; MUST validate subscription limits; MUST increment Sequence ID; MAY include subscription parameter TLVs (topic, conditions); MUST send periodic TELL notifications while active. Receiver: MUST validate OSCORE; MUST establish/refresh subscription state; MUST enforce expiration and resource ceilings; when conditions met, MUST send event notifications as TELL. Cancellation: TELL or OBSERVE with Cancel-Subscription TLV (Type=0xFF) → receiver MUST delete state, stop notifications. Errors: subscription limits exceeded → TELL(error); OSCORE validation failure → drop.</t>
  </section>

  <section title="Summary of Normative Requirements" anchor="verb-summary">
    <t>Summary: PING—liveness probe, SHOULD NOT require OSCORE (unencrypted by default), implementations MAY support OSCORE-protected PING; TELL—update/response/notification, MUST use OSCORE except in explicitly insecure deployments; ASK—request, MUST use OSCORE, MUST generate TELL response; OBSERVE—subscription, MUST use OSCORE, MUST create or update subscription state. Agents MUST NOT overload verbs with incompatible semantics.</t>
  </section>
</section>
<section title="Mandatory Transport Binding: OSCORE/CoAP" anchor="transport-mti">
  <t>This section defines the mandatory-to-implement (MTI) transport binding for µACP: the combination of the Constrained Application Protocol (CoAP) as the transport substrate and OSCORE as the end-to-end object security mechanism. All compliant µACP implementations MUST support this binding.</t>

  <t>Deployments MAY support additional bindings (e.g., DTLS/UDP as specified in <xref target="RFC9147"/> or QUIC) but such bindings are outside the scope of this specification and MUST NOT weaken or replace the OSCORE/CoAP MTI profile.</t>

  <!-- ============================== -->
  <!-- 5.1 CoAP Request/Response Model -->
  <!-- ============================== -->

  <section title="Mapping µACP Messages to CoAP" anchor="coap-mapping">
    <t>Each µACP message (Header | TLVs | Payload) is encoded as a byte string and placed entirely within the CoAP message payload. Only OSCORE-protected CoAP messages may carry µACP messages (except PING, which MAY be unprotected). µACP messages MUST use: Method=POST, URI-Path="muacp" (fixed), Content-Format=application/muacp+binary, Payload=Full µACP message. Each µACP message corresponds to exactly one CoAP POST.</t>

    <figure anchor="coap-envelope">
      <name>Figure 4: CoAP Envelope Carrying a µACP Message</name>
      <artwork><![CDATA[
+-------------------------------+
|  CoAP Header (CON/NON)       |
+-------------------------------+
|  Uri-Path: "muacp"           |
+-------------------------------+
|  Content-Format: muacp+binary|
+-------------------------------+
|  OSCORE Option               |
+-------------------------------+
|  Ciphertext Payload          |
|  (encapsulated µACP message) |
+-------------------------------+
      ]]></artwork>
    </figure>

  </section>

  <!-- ================================== -->
  <!-- 5.2 OSCORE Protection Requirements -->
  <!-- ================================== -->

  <section title="OSCORE Protection Requirements" anchor="oscore-protection">
    <t>All µACP messages except unencrypted PING MUST be protected using OSCORE <xref target="RFC8613"/>, which uses COSE <xref target="RFC8152"/> for cryptographic operations. OSCORE MUST protect: the entire µACP header (except outer CoAP routing metadata), all TLVs except raw TLVs permitted for PING, and the entire µACP payload. OSCORE replay protection MUST be enabled with replay windows configured to match expected message rate and resource constraints. OSCORE MUST use a unique security context per agent-pair.</t>
  </section>

  <!-- ============================== -->
  <!-- 5.3 Establishing OSCORE Context -->
  <!-- ============================== -->

  <section title="Establishing OSCORE Security Contexts" anchor="oscore-context">
    <t>Security contexts for OSCORE MAY be derived by: EDHOC (RECOMMENDED), Pre-Shared Keys (PSK), or out-of-band provisioning. When EDHOC is used, the resulting OSCORE context MUST be bound to the EDHOC handshake transcript to prevent identity misbinding attacks. If a device exhausts its available context storage, it MUST reject new context establishment requests with ERR_RESOURCE_EXHAUSTED. If all OSCORE contexts are active and a new context establishment request arrives, implementations MUST reject it with ERR_RESOURCE_EXHAUSTED. Implementations SHOULD implement context eviction policies (e.g., least-recently-used) for inactive contexts but MUST NOT terminate active conversations. For Class 1 devices, implementations SHOULD limit concurrent OSCORE contexts (e.g., 8-16 contexts).</t>
  </section>

  <!-- ============================== -->
  <!-- 5.4 CoAP Message Types          -->
  <!-- ============================== -->

  <section title="CoAP Message Types and Reliability" anchor="coap-types">
    <t>µACP builds upon CoAP reliability semantics to achieve its QoS model. Implementations MUST map µACP QoS codes to CoAP message types as follows:</t>

    <texttable anchor="qos-map">
      <ttcol>µACP QoS</ttcol>
      <ttcol>Meaning</ttcol>
      <ttcol>CoAP Message Type</ttcol>
      <c>0</c>
      <c>fire-and-forget</c>
      <c>NON (Non-confirmable)</c>
      <c>1</c>
      <c>at-least-once delivery</c>
      <c>CON (Confirmable)</c>
      <c>2</c>
      <c>at-most-once delivery</c>
      <c>NON (Non-confirmable, no retransmission)</c>
    </texttable>

    <t><strong>QoS Semantics:</strong> QoS=0 (fire-and-forget) provides best-effort delivery. QoS=1 (at-least-once) ensures delivery through CoAP retransmissions. QoS=2 (at-most-once) provides a single delivery attempt without retransmission, suitable for idempotent operations. Both QoS=0 and QoS=2 use CoAP NON messages. Implementations MUST NOT retransmit QoS=2 messages at the µACP layer.</t>

    <t>CoAP-level acknowledgments MUST NOT be interpreted as µACP-level responses. Application responses are always encoded as TELL messages.</t>
  </section>

  <!-- ================================= -->
  <!-- 5.5 Request/Response Interactions -->
  <!-- ================================= -->

  <section title="Mapping ASK–TELL to CoAP Request/Response" anchor="ask-tell-mapping">
    <t>ASK messages MUST be sent as CoAP POST requests; TELL responses as CoAP responses. OSCORE MUST protect both directions. The Correlation ID uniquely links ASK with TELL response. CoAP Message IDs MUST NOT be used for application correlation. Receivers MUST respond with TELL even when requests fail, using an Error TLV.</t>

    <figure anchor="ask-tell-seq">
      <name>Figure 5: ASK/TELL Over OSCORE-CoAP</name>
      <artwork><![CDATA[
Agent A                                Agent B
-------                                -------
POST /muacp (ASK, OSCORE)  ---------->
                     <----------   2.04 Changed (TELL, OSCORE)
      ]]></artwork>
    </figure>
  </section>

  <!-- =============================== -->
  <!-- 5.6 OBSERVE Interaction Mapping -->
  <!-- =============================== -->

  <section title="Mapping OBSERVE Subscriptions" anchor="observe-mapping">
    <t>OBSERVE establishes a long-lived subscription. µACP defines its own subscription model, independent of CoAP's Observe extension <xref target="RFC7641"/>. OBSERVE MUST be mapped as: CoAP POST containing µACP OBSERVE message; notifications delivered as CoAP POSTs containing TELL messages. Implementations MUST NOT use CoAP Observe for µACP subscriptions.</t>
  </section>

  <!-- ========================= -->
  <!-- 5.7 Congestion Control     -->
  <!-- ========================= -->

  <section title="Congestion Control Requirements" anchor="congestion">
    <t>All µACP-over-CoAP deployments MUST implement congestion control to prevent network collapse and unfair bandwidth usage. Implementations MUST follow CoAP congestion control mechanisms as specified in <xref target="RFC7252"/> Section 4.7.</t>

    <t>Agents MUST adhere to: exponential backoff on CoAP CON retransmissions (initial timeout ≥2s, max 247s per <xref target="RFC7252"/>); PING rate limiting (≤1 per 10 seconds per peer); OBSERVE throttling when bandwidth pressure is detected; deterministic resource usage; message rate limits per conversation. When Blockwise Transfer <xref target="RFC7959"/> is used, agents MUST ensure block sizes do not exceed memory limits.</t>
  </section>

  <!-- ====================================== -->
  <!-- 5.8 Error Handling at the Transport     -->
  <!-- ====================================== -->

  <section title="Transport-Layer Error Handling" anchor="transport-errors">
    <t>Transport errors (CoAP timeouts, OSCORE decryption failures, missing acknowledgments) MUST be translated into µACP-level behavior. OSCORE decryption failures → drop message. Unacknowledged CoAP CON → apply µACP QoS semantics for retransmission. Repeated timeouts → conversation enters failure state. Malformed CoAP envelopes → discard.</t>
  </section>

  <!-- ============================ -->
  <!-- 5.9 Summary of MTI Binding   -->
  <!-- ============================ -->

  <section title="Summary of MTI Requirements" anchor="transport-summary">
    <t>All compliant µACP implementations MUST: support CoAP POST to fixed path "muacp"; support Content-Format application/muacp+binary; protect all messages except unencrypted PING with OSCORE; enforce OSCORE replay protection; derive OSCORE contexts using EDHOC or equivalent; map QoS codes to CoAP message types; generate TELL responses for all ASK messages; deliver OBSERVE notifications as TELL messages. This binding ensures interoperability and establishes a minimum security baseline.</t>
  </section>

</section>
<section title="Error Handling, Version Negotiation, and Extensibility" anchor="errors-and-versioning">
  <t>This section defines normative error-handling rules, version-negotiation mechanism, downgrade protection requirements, and the extensibility framework provided by the TLV architecture.</t>

  <!-- ========================= -->
  <!-- 6.1 Error Code Semantics   -->
  <!-- ========================= -->

  <section title="Error Code TLVs" anchor="error-tlv">
    <t>All protocol-level errors MUST be communicated using a TELL message that includes an Error-Code TLV. Error codes are encoded as unsigned integers and MUST follow the registry defined in the IANA Considerations section.</t>

    <figure anchor="error-tlv-format">
      <name>Figure 6: Error-Code TLV</name>
      <artwork><![CDATA[
Type:   0x22 (Error-Code, see IANA registry)
Length: 1 or 2 octets
Value:  Integer error code
      ]]></artwork>
    </figure>

    <t>The sender MUST set the Correlation ID of the error response to match the ID of the failing message. Receivers MUST interpret the error code as part of the µACP conversation state.</t>
  </section>

  <!-- ===================================== -->
  <!-- 6.2 Standard Error Conditions and Codes-->
  <!-- ===================================== -->

  <section title="Standardized Error Conditions" anchor="standard-errors">
    <t>The following error codes are defined for µACP:</t>

    <texttable anchor="error-codes">
      <ttcol>Code</ttcol>
      <ttcol>Name</ttcol>
      <ttcol>Description</ttcol>

      <c>0x00</c><c>SUCCESS</c>
      <c>No error; operation completed successfully. This code is OPTIONAL. If omitted, successful completion is indicated by the absence of an Error-Code TLV. Receivers MUST treat the absence of an Error-Code TLV as equivalent to SUCCESS (0x00).</c>

      <c>0x01</c><c>ERR_MALFORMED</c>
      <c>Malformed header, TLV, or payload.</c>

      <c>0x02</c><c>ERR_UNSUPPORTED_VERB</c>
      <c>Verb not recognized or not supported by receiver.</c>

      <c>0x03</c><c>ERR_UNSUPPORTED_TLV</c>
      <c>Critical TLV not understood.</c>

      <c>0x04</c><c>ERR_FORBIDDEN</c>
      <c>Operation not permitted due to policy or authorization.</c>

      <c>0x05</c><c>ERR_RESOURCE_EXHAUSTED</c>
      <c>Memory, CPU, or subscription/conversation limits exceeded.</c>

      <c>0x06</c><c>ERR_VERSION_MISMATCH</c>
      <c>Message uses unsupported protocol version.</c>

      <c>0x07</c><c>ERR_TIMEOUT</c>
      <c>Sender or receiver timed out while waiting for a response.</c>

      <c>0x08</c><c>ERR_INTERNAL</c>
      <c>Internal failure not covered by other error categories.</c>
    </texttable>

    <t>Implementations MAY define additional vendor-specific error codes in the vendor range but MUST NOT redefine standardized codes.</t>
  </section>

  <!-- =============================== -->
  <!-- 6.3 Robust Handling of Malformed -->
  <!-- =============================== -->

  <section title="Handling Malformed Messages" anchor="malformed">
    <t>Receivers MUST apply strict validation: if TLV Length exceeds remaining bytes, discard; if TLVs appear out of Type order, discard; if required TLV (future versions) is absent, reject; if header fields contain invalid combinations (e.g., reserved bits set), reject; if OSCORE decryption fails, discard without error signaling. Where feasible, receivers SHOULD send TELL(error) unless doing so would amplify a denial-of-service attack.</t>
  </section>

  <!-- =============================== -->
  <!-- 6.4 Conversation-Lifetime Errors -->
  <!-- =============================== -->

  <section title="Conversation-Lifetime Error Handling" anchor="conversation-errors">
    <t>Conversations MAY fail due to timeouts, resource limits, or message corruption. When such failures occur:</t>
    <ul>
      <li>The agent MUST free associated resources (conversation-table entries).</li>
      <li>The agent SHOULD send an ERR_TIMEOUT or ERR_RESOURCE_EXHAUSTED TELL message.</li>
      <li>For resource exhaustion, an agent MUST NOT attempt recovery that risks violating its resource budget.</li>
    </ul>

    <t>If a Correlation ID collision is detected (a new message arrives with a Correlation ID matching an active conversation from the same sender, as identified by the OSCORE security context), the receiver MUST apply the following deterministic strategy in order:</t>
    <ol>
      <li>If the conversation table is full (all entries occupied), reject the new message with ERR_RESOURCE_EXHAUSTED and maintain the existing conversation.</li>
      <li>If the new message's Sequence ID (from the same sender) is greater than the existing conversation's last observed Sequence ID from that sender, terminate the existing conversation (free its resources), accept the new message, and create a new conversation entry. This handles legitimate Correlation ID reuse after conversation completion or timeout. Note: Sequence IDs are per-sender and monotonically increase within each sender's message stream. To handle Sequence ID wrap-around (modulo 2^16), implementations MUST use sequence number comparison as defined in <xref target="RFC1982"/> Section 3.1: given two Sequence IDs S1 and S2, S1 is considered greater than S2 if (S1 &gt; S2 and S1 - S2 &lt; 2^15) or (S1 &lt; S2 and S2 - S1 &gt; 2^15). This ensures correct ordering even when Sequence IDs wrap from 0xFFFF to 0x0000.</li>
      <li>If the new message's Sequence ID is less than or equal to the existing conversation's last observed Sequence ID from the same sender, reject the new message as a potential replay or out-of-order delivery. The receiver MUST NOT modify the existing conversation state and SHOULD silently discard the new message (or MAY send ERR_MALFORMED if the message appears valid but out-of-order).</li>
    </ol>
    <t>This deterministic strategy ensures interoperability while preventing resource exhaustion and replay attacks. Correlation ID collisions are rare when Correlation IDs are randomly generated with sufficient entropy. Collisions from different senders (different OSCORE contexts) are handled separately, as each OSCORE context maintains its own conversation state. The Sequence ID comparison is secure because Sequence IDs are authenticated and integrity-protected by OSCORE.</t>
    
    <t><strong>Example:</strong> If an active conversation exists with Correlation ID=0x1234 and last observed Sequence ID=0x0010 from sender A (identified by OSCORE context A), and a new message arrives with Correlation ID=0x1234 and Sequence ID=0x0015 from the same sender A, the receiver terminates the old conversation and accepts the new one. If the new message has Sequence ID=0x0005 from sender A, it is rejected as a potential replay. If a message arrives with Correlation ID=0x1234 from sender B (different OSCORE context), it is treated as a separate conversation, as conversations are scoped per OSCORE security context.</t>
  </section>

  <!-- ============================ -->
  <!-- 6.5 Version Negotiation       -->
  <!-- ============================ -->

  <section title="Version Negotiation" anchor="version-negotiation">
    <t>µACP includes a Version-TLV (Type=0x01) that MAY be included in any message to indicate supported protocol versions. If no Version-TLV is present, receivers MUST assume version 0x00 (this specification).</t>
    
    <t>Version negotiation follows these rules:</t>
    <ul>
      <li>If a message includes a Version-TLV that indicates only unsupported versions (i.e., all versions listed in the Version-TLV are higher than the receiver's maximum supported version), the receiver MUST return ERR_VERSION_MISMATCH in a TELL error response.</li>
      <li>If the Version-TLV contains at least one supported version, the receiver MUST use the highest mutually supported version for subsequent messages in the conversation.</li>
      <li>When both parties send Version-TLVs (e.g., in ASK and TELL), each party MUST independently select the highest mutually supported version from the union of both Version-TLV lists. If no common version exists, the receiver MUST return ERR_VERSION_MISMATCH.</li>
      <li>The selected version applies to all messages in the conversation identified by the Correlation ID. Once a version is selected, it MUST NOT be changed for that conversation.</li>
      <li>Version negotiation MUST occur under OSCORE protection. PING messages (which are typically unencrypted) SHOULD NOT carry Version-TLV to maintain lightweight operation. If version negotiation is required before OSCORE context establishment, implementations SHOULD use ASK/TELL with OSCORE or establish the OSCORE context first, then negotiate versions in subsequent messages.</li>
    </ul>

    <figure anchor="version-tlv">
      <name>Figure 7: Version TLV</name>
      <artwork><![CDATA[
Type:   0x01 (Version)
Length: N (number of supported versions, 1-255)
Value:  Sequence of N unsigned 8-bit integers, each representing
        a supported protocol version number (e.g., [0x00] for version 0)
      ]]></artwork>
    </figure>
    
    <t><strong>Encoding:</strong> The Value field of the Version TLV is a sequence of N unsigned 8-bit integers (where N is the Length field value). Each integer represents a protocol version number. For example, a Version TLV indicating support for versions 0x00 and 0x01 would have Length=2 and Value=[0x00, 0x01]. Implementations MUST encode version numbers as single octets (0-255). Receivers MUST parse the Value field as a sequence of Length octets, each interpreted as an unsigned 8-bit version number.</t>
  </section>

  <!-- ============================ -->
  <!-- 6.6 Downgrade Protection      -->
  <!-- ============================ -->

  <section title="Downgrade and Version-Rollback Protection" anchor="downgrade">
    <t>Implementations MUST ensure attackers cannot force a peer to use a lower protocol version when a higher mutually supported version is available. The highest mutually supported version MUST be chosen. Version negotiation MUST occur inside OSCORE-protected messages (except PING). Agents MUST NOT downgrade versions unless a failure condition explicitly requires fallback.</t>
  </section>

  <!-- ============================ -->
  <!-- 6.7 Extensibility Framework   -->
  <!-- ============================ -->

  <section title="Extensibility Framework" anchor="extensibility">
    <t>µACP evolves through TLV-based extensibility. Constraints: receivers MUST ignore unknown non-critical TLVs; implementations MUST NOT reuse TLV Types for different semantics; future versions MAY introduce critical TLVs (unsupported critical TLVs trigger ERR_UNSUPPORTED_TLV); all TLVs MUST be sorted by increasing Type value; Types 128–255 are vendor-specific and require no global registration. Complex extensions SHOULD define new structured TLVs rather than overloading primitive types.</t>
  </section>

  <!-- ================================== -->
  <!-- 6.8 Summary of Normative Behavior  -->
  <!-- ================================== -->

  <section title="Summary of Normative Requirements" anchor="error-summary">
    <t>Malformed messages MUST be rejected and SHOULD trigger TELL(error) unless unsafe. Errors MUST use standardized codes. Version negotiation MUST prefer the highest mutually supported version. Unknown non-critical TLVs MUST be ignored; unknown critical TLVs MUST trigger errors. OSCORE failures MUST cause silent discard. Resource exhaustion MUST lead to conservative cleanup behavior.</t>
  </section>

</section>
<section title="IANA Considerations" anchor="iana">
  <t>This section requests the creation of new registries and assignments required for µACP to function as an interoperable Internet protocol. All registries use the policies defined in <xref target="RFC8126"/>. Unless otherwise stated, values are allocated using the "IETF Review" policy.</t>

  <!-- ========================================== -->
  <!-- 7.1 µACP TLV Types Registry                 -->
  <!-- ========================================== -->

  <section title="µACP TLV Types Registry" anchor="iana-tlv">
    <t>IANA is requested to create a new registry entitled "µACP TLV Types" (8-bit values 0–255). Each entry MUST contain: Value, Name, Description, Value format, Reference. The range is divided as follows:</t>
    <ul>
      <li><strong>0–31:</strong> Standards Action (as defined in <xref target="RFC8126"/> Section 4.1)</li>
      <li><strong>32–127:</strong> IETF Review</li>
      <li><strong>128–255:</strong> Vendor-specific (First Come First Served)</li>
    </ul>
    <t>Initial values:</t>

    <texttable anchor="tlv-initial">
      <ttcol>Value</ttcol><ttcol>Name</ttcol><ttcol>Description</ttcol><ttcol>Format</ttcol><ttcol>Reference</ttcol>

      <c>0x00</c><c>RAW_OCTETS</c><c>Unstructured data; MUST NOT appear in encrypted messages except PING.</c><c>Opaque</c><c>This document</c>

      <c>0x01</c><c>VERSION</c><c>Advertised supported protocol versions.</c><c>Array of integers</c><c>This document</c>

      <c>0x02</c><c>CONTENT_TYPE</c><c>Specifies payload encoding.</c><c>Integer</c><c>This document</c>

      <c>0x03</c><c>CBOR_PAYLOAD</c><c>Payload encoded as CBOR.</c><c>CBOR data item</c><c>This document</c>

      <c>0x10</c><c>RESERVED</c><c>Reserved for future fragmentation specification. Implementations MUST NOT use Type=0x10 until fragmentation is fully specified in a future extension document.</c><c>N/A</c><c>This document</c>

      <c>0x20</c><c>TOPIC</c><c>Subscription topic for OBSERVE.</c><c>UTF-8 string</c><c>This document</c>

      <c>0x21</c><c>CONDITION</c><c>Trigger condition for OBSERVE.</c><c>UTF-8 or CBOR</c><c>This document</c>

      <c>0x22</c><c>ERROR_CODE</c><c>Error code returned in TELL(error).</c><c>Integer</c><c>This document</c>

      <c>0xFF</c><c>CANCEL_SUBSCRIPTION</c><c>Explicit termination of OBSERVE subscription.</c><c>Empty</c><c>This document</c>
    </texttable>

    <t>Future extensions MUST NOT assign new semantics to existing TLV values.</t>
  </section>

  <!-- ========================================== -->
  <!-- 7.2 µACP QoS Codes Registry                 -->
  <!-- ========================================== -->

  <section title="µACP QoS Codes Registry" anchor="iana-qos">
    <t>IANA is requested to create a registry entitled "µACP QoS Codes". QoS is encoded as a 2-bit field in the header (values 0–3).</t>

    <texttable anchor="qos-registry">
      <ttcol>Value</ttcol><ttcol>Name</ttcol><ttcol>Description</ttcol><ttcol>Reference</ttcol>

      <c>0</c><c>FIRE_AND_FORGET</c><c>No reliability; mapped to CoAP NON.</c><c>This document</c>

      <c>1</c><c>AT_LEAST_ONCE</c><c>Retransmissions required; mapped to CoAP CON.</c><c>This document</c>

      <c>2</c><c>AT_MOST_ONCE</c><c>No retransmission; mapped to CoAP NON.</c><c>This document</c>

      <c>3</c><c>RESERVED</c><c>Reserved for future use.</c><c>This document</c>
    </texttable>
  </section>

  <!-- ========================================== -->
  <!-- 7.3 µACP Verb Codes Registry               -->
  <!-- ========================================== -->

  <section title="µACP Verb Codes Registry" anchor="iana-verbs">
    <t>IANA is requested to create a registry entitled "µACP Verb Codes". Verb values occupy 2 bits but are listed numerically (0–3).</t>

    <texttable anchor="verb-registry">
      <ttcol>Value</ttcol><ttcol>Name</ttcol><ttcol>Description</ttcol><ttcol>Reference</ttcol>

      <c>0</c><c>PING</c><c>Liveness probe.</c><c>This document</c>

      <c>1</c><c>TELL</c><c>State update, notification, or response.</c><c>This document</c>

      <c>2</c><c>ASK</c><c>Request for information or action.</c><c>This document</c>

      <c>3</c><c>OBSERVE</c><c>Subscription to events or state changes.</c><c>This document</c>
    </texttable>
  </section>

  <!-- ========================================== -->
  <!-- 7.4 µACP Error Codes Registry               -->
  <!-- ========================================== -->

  <section title="µACP Error Codes Registry" anchor="iana-errors">
    <t>IANA is requested to create a registry entitled "µACP Error Codes" consisting of integers 0–255.</t>

    <t>The initial contents are listed in the Error Handling section. The assignment policy for values 0–127 is IETF Review. Values 128–255 are vendor-specific and use the "First Come First Served" policy.</t>

  </section>

  <!-- ========================================== -->
  <!-- 7.5 CoAP Content-Format Registration        -->
  <!-- ========================================== -->

  <section title="CoAP Content-Format Registration" anchor="iana-coap">
    <t>IANA is requested to register the following CoAP Content-Format:</t>

    <texttable anchor="coap-cf">
      <ttcol>Name</ttcol><ttcol>Media Type</ttcol><ttcol>Encoding</ttcol><ttcol>ID</ttcol><ttcol>Reference</ttcol>

      <c>application/muacp+binary</c>
      <c>application/muacp+binary</c>
      <c>Binary</c>
      <c>TBD (to be assigned by IANA)</c>
      <c>This document</c>
    </texttable>

    <t>This Content-Format is mandatory for all µACP-over-CoAP messages.</t>

    <t><strong>Note:</strong> The Content-Format ID value marked as "TBD" will be assigned by IANA during the IESG review process, prior to publication of this document as an RFC. The assignment will follow the "IETF Review" policy as specified in <xref target="RFC8126"/>.</t>
  </section>

  <!-- ========================================== -->
  <!-- 7.6 Media Type Registration                 -->
  <!-- ========================================== -->

  <section title="Media Type Registration" anchor="iana-media">
    <t>IANA is requested to register the following media type in the "application" registry per <xref target="RFC6838"/>:</t>

<t>
Type name: application<br/>
Subtype name: muacp+binary<br/>
Required parameters: none<br/>
Optional parameters: none<br/>
Encoding considerations: binary<br/>
Security considerations: See Security Considerations section.<br/>
Interoperability considerations: Defined by TLV and header structure.<br/>
Published specification: This document.<br/>
Intended usage: COMMON<br/>
Author/Change controller: IETF<br/>
</t>

  </section>

  <!-- ========================================== -->
  <!-- 7.7 Well-Known URIs for CoAP               -->
  <!-- ========================================== -->

  <section title="Well-Known CoAP Resource" anchor="iana-well-known">
    <t>IANA is requested to register the following CoAP Well-Known URI per <xref target="RFC8615"/> using the "IETF Review" policy:</t>

    <texttable anchor="well-known-muacp">
      <ttcol>URI</ttcol><ttcol>Description</ttcol><ttcol>Reference</ttcol>

      <c>/.well-known/muacp</c>
      <c>Discovery resource indicating µACP support.</c>
      <c>This document</c>
    </texttable>

    <t>A CoAP GET to <tt>/.well-known/muacp</tt> SHOULD return a CBOR structure (Content-Format: application/cbor) describing supported TLVs, maximum sizes, and supported versions as specified in Section 10.5. A successful response (2.05 Content) MUST contain a CBOR map. A 4.04 Not Found response indicates that µACP is not supported by the device. Implementations MUST handle both success and error responses gracefully.</t>
  </section>

  <!-- ========================================== -->
  <!-- 7.8 Summary                                 -->
  <!-- ========================================== -->

  <section title="Summary of IANA Actions" anchor="iana-summary">
    <t>IANA is requested to: create the µACP TLV Types registry and populate initial values; create the µACP QoS Codes registry; create the µACP Verb Codes registry; create the µACP Error Codes registry; register the CoAP Content-Format application/muacp+binary; register the media type application/muacp+binary; register the well-known CoAP resource /.well-known/muacp. These actions enable interoperable deployment and ensure long-term extensibility under IETF governance.</t>
  </section>

</section>
<section title="State Machines and Processing Logic" anchor="state-machines">
  <t>This section defines normative finite-state machines (FSMs) governing µACP conversations. Implementations MUST implement these FSMs for deterministic, interoperable behavior. Agents operate according to: receive message, validate OSCORE (if required), validate header/TLVs/payload, identify conversation via Correlation ID, execute verb-specific FSM transition, emit resulting messages. Agents MUST support at least 64 concurrent conversations and MUST reject new conversations if resource ceilings are exceeded (ERR_RESOURCE_EXHAUSTED).</t>

  <section title="ASK/TELL Conversation State Machine" anchor="ask-tell-fsm">
    <t>ASK initiates a conversation; TELL completes it. States: IDLE → (send ASK) → WAIT_RESP → (recv TELL or timeout) → COMPLETED → cleanup. If timer expires and QoS=1, retransmit ASK. If QoS=0/2, transition to COMPLETED with ERR_TIMEOUT. Receiver MUST emit TELL(error) for errors.</t>

    <figure anchor="fsm-ask-tell">
      <name>Figure 8: ASK/TELL State Machine</name>
      <artwork><![CDATA[
                   +-----------------+
                   |   IDLE          |
                   +-----------------+
                            |
                            | (send ASK)
                            v
                   +-----------------+
                   |   WAIT_RESP     |
                   +-----------------+
                     |        ^
     (recv TELL)     |        | (timeout; QoS=1)
                     v        |
                   +-----------------+
                   |   COMPLETED     |
                   +-----------------+
      (cleanup) --> returns to IDLE
      ]]></artwork>
    </figure>
  </section>

  <section title="PING/TELL State Machine" anchor="ping-fsm">
    <t>PING serves as a minimal liveness check. PING is stateless and does NOT create persistent conversation table entries. States: IDLE → (send PING) → WAIT_PONG → (recv TELL or timeout) → COMPLETED. PING SHOULD NOT require OSCORE (unencrypted by default), implementations MAY support OSCORE-protected PING, MUST NOT modify application state, and MUST NOT cause retransmissions on timeout.</t>

    <figure anchor="fsm-ping">
      <name>Figure 9: PING/TELL Liveness FSM</name>
      <artwork><![CDATA[
        +--------+
        |  IDLE  |
        +--------+
            |
            | send PING
            v
        +--------------+
        | WAIT_PONG    |
        +--------------+
            |        ^
   recv TELL|        | timeout
            v        |
        +--------------+
        |  COMPLETED   |
        +--------------+
      ]]></artwork>
    </figure>
  </section>

  <section title="OBSERVE Subscription State Machine" anchor="observe-fsm">
    <t>OBSERVE establishes a long-lived subscription. States: NO_SUB → (recv OBSERVE) → SUBSCRIBED → (event trigger) → NOTIFY (TELL) → (recv CANCEL_SUB) → TERMINATED → cleanup. Subscriptions MUST expire after configured lifetime and MUST enforce resource ceilings (max subscriptions per peer).</t>

    <figure anchor="fsm-observe">
      <name>Figure 10: OBSERVE Subscription FSM</name>
      <artwork><![CDATA[
                         +----------------+
                         |   NO_SUB       |
                         +----------------+
                                |
                                | (recv OBSERVE)
                                v
                         +----------------+
                         |  SUBSCRIBED    |
                         +----------------+
                                |
                                | (event trigger)
                                v
                         +----------------+
                         | NOTIFY (TELL)  |
                         +----------------+
                                |
                                | (recv CANCEL_SUB)
                                v
                         +----------------+
                         |  TERMINATED    |
                         +----------------+
                          cleanup → NO_SUB
      ]]></artwork>
    </figure>
  </section>

  <section title="Error-State Transitions" anchor="error-fsm">
    <t>Errors MUST transition FSMs to predictable termination states: ERR_MALFORMED → discard, no state; ERR_UNSUPPORTED_TLV → terminate conversation, send error TELL; ERR_TIMEOUT → COMPLETED with error, free resources; ERR_RESOURCE_EXHAUSTED → reject, no new state; OSCORE failure → silent discard, no state update.</t>
  </section>

  <section title="Processing Time and Resource Bounds" anchor="resource-bounds">
    <t>All FSM transitions MUST complete in bounded time and memory. Required limits: conversation table (minimum 64 entries), subscription table (minimum 16 entries), deterministic message buffer sizes (header+1024-byte TLVs+payload), timers without per-message dynamic allocation. Platforms MAY use preallocated memory pools or static tables.</t>
  </section>

</section>
<section title="Security Considerations" anchor="security">
  <t>This section defines the security properties, assumptions, and mandatory mitigations for µACP. The protocol relies on OSCORE and the underlying transport for security. All implementations MUST follow the requirements in this section to avoid exposure to denial-of-service, spoofing, downgrade, replay, or privacy attacks.</t>

  <section title="Threat Model" anchor="threat-model">
    <t>The µACP threat model assumes attackers may: passively eavesdrop; modify, inject, reorder, or replay messages; exhaust memory/CPU/storage/energy/subscription tables; desynchronize state; conduct traffic analysis; attempt version downgrades; exploit weak random number generation or incorrect OSCORE configuration. The protocol provides security <strong>only</strong> when implemented with OSCORE. Attackers are assumed to have full control of the transport layer but not of OSCORE-protected channels.</t>
  </section>

  <section title="Authentication, Integrity, and Confidentiality" anchor="authn">
    <t>All µACP messages except unencrypted PING MUST be authenticated and integrity-protected using OSCORE. OSCORE provides peer authentication (when derived from EDHOC or provisioned credentials), integrity protection over header/TLVs/payload, replay protection, and request/response binding. Implementations MUST use a unique OSCORE security context per communicating peer. TELL, ASK, and OBSERVE messages MUST be encrypted via OSCORE. Authorization MUST be enforced before performing operations triggered by ASK or OBSERVE.</t>
  </section>

  <section title="Replay Prevention and Freshness" anchor="replay">
    <t>µACP relies on OSCORE replay protection. Implementations MUST enable and correctly maintain OSCORE replay windows. Receivers SHOULD maintain a per-peer sliding window of recent Sequence IDs. Subscription-triggered notifications MUST validate freshness. Agents MUST reject delayed or reordered messages if OSCORE replay windows indicate a stale nonce.</t>
  </section>

  <section title="Denial-of-Service and Resource Exhaustion" anchor="dos">
    <t>Implementations MUST enforce: maximum active conversations (minimum 64), maximum OBSERVE subscriptions (minimum 16), rate limits on PING and ASK, TLV region size limits (max 1024 bytes), payload size limits (max 65535 bytes), and static/preallocated memory pools. When limits are exceeded, agents MUST return ERR_RESOURCE_EXHAUSTED or silently drop messages. CoAP-level DoS mitigation (exponential backoff, NON vs CON) MUST also be applied.</t>
  </section>

  <section title="Subscription Security" anchor="sub-hijack">
    <t>OBSERVE and CANCEL_SUB MUST be OSCORE-protected. Subscriptions MUST be bound to an authenticated OSCORE context. Correlation IDs MUST be unpredictable. Subscription deletion MUST require a valid CANCEL_SUB from the same authenticated peer or timeout/resource exhaustion. Agents MUST reject subscription attempts exceeding resource ceilings.</t>
  </section>

  <section title="Downgrade Protection" anchor="downgrade-protection">
    <t>The highest mutually supported version MUST be used. Version negotiation MUST occur under OSCORE (except PING). Agents MUST reject messages advertising only unsupported versions and MUST NOT fall back silently to lower versions.</t>
  </section>

  <section title="Key Management" anchor="key-management">
    <t>Implementations MUST provide: secure key provisioning (EDHOC, PSK, or manufacturing-time injection), rotation of OSCORE master secrets, secure deletion of expired keys, protection against key reuse across peers, and protection against side-channel extraction. Compromise of OSCORE keys compromises all µACP security properties.</t>

    <t><strong>Key Rotation:</strong> OSCORE master secrets SHOULD be rotated periodically (e.g., time-based: 30-90 days, usage-based: after 2^32 messages, or event-based: upon compromise suspicion). Rotation procedures MUST preserve active conversations where possible.</t>
  </section>

  <section title="Side-Channel Attacks" anchor="side-channel">
    <t>Constrained devices may be vulnerable to side-channel attacks (timing, power, electromagnetic). Implementations SHOULD: use constant-time cryptographic operations, minimize observable timing differences, protect against power analysis (HSMs or software countermeasures), avoid leaking information through error timing or resource allocation, use secure random number generators for Correlation IDs and Sequence IDs. While complete side-channel resistance may be impractical on severely constrained devices, implementations SHOULD document their threat model and mitigations.</t>
  </section>

  <section title="Safe Failure Modes" anchor="safe-failure">
    <t>Malformed messages MUST be discarded without modifying state. OSCORE failures MUST be silent and MUST NOT produce error messages usable for oracle attacks. Timeouts MUST clean up state deterministically. Subscription state MUST never persist without authenticated refresh.</t>
  </section>

</section>
<section title="Interoperability and Deployment Profiles" anchor="interop">
  <t>This section defines the minimum feature set required for interoperability between µACP implementations, along with deployment profiles tailored to different classes of devices and networks.</t>

  <section title="Minimum Interoperability Profile (MIP)" anchor="mip">
    <t>All µACP implementations MUST support: the 64-bit header format; all four verbs (PING, TELL, ASK, OBSERVE); TLV processing with ordering and size limits; OSCORE/CoAP transport binding; Content-Format application/muacp+binary; conversation state for at least 64 active Correlation IDs; subscription state for at least 16 active OBSERVE subscriptions; error-handling and state-machine behavior as defined in this specification.</t>
  </section>

  <section title="Constrained Node Profile (CNP)" anchor="cnp">
    <t>CNP targets microcontroller-class devices (ARM Cortex-M, ESP32). Implementations MUST use static/preallocated buffers, enforce strict resource bounds, minimize logging, and restrict payload sizes. Implementations SHOULD prefer PSK/EDHOC-based OSCORE contexts and disable vendor-specific TLVs.</t>
  </section>

  <section title="Infrastructure Node Profile (INP)" anchor="inp">
    <t>INP targets edge gateways and cloud-side collectors. Implementations MUST support full subscription features, extended TLV sets, high-throughput replay windows, EDHOC key exchange, and rate-shaping for constrained peers. INP nodes MAY provide protocol translation and hardware-accelerated crypto.</t>
  </section>

  <section title="Cross-Profile Interoperability" anchor="cross-interop">
    <t>INP nodes MUST respect CNP resource ceilings, MUST NOT exceed CNP size limits, and SHOULD apply traffic shaping. CNP nodes MUST ignore unsupported TLVs. Fallback to MIP MUST always be possible. All profile interactions MUST preserve security properties.</t>
  </section>

  <section title="Feature Negotiation" anchor="feature-negotiation">
    <t>Feature discovery uses GET <tt>/.well-known/muacp</tt>, returning a CBOR map describing the device's µACP capabilities. The response MUST use Content-Format application/cbor and MUST conform to the following CDDL schema:</t>
    
    <figure anchor="feature-negotiation-cddl">
      <name>Feature Negotiation Response Format (CDDL)</name>
      <artwork><![CDATA[
muacp-capabilities = {
  ? "max-tlv-size" => uint,              ; Maximum TLV region size in bytes
  ? "max-payload-size" => uint,          ; Maximum payload size in bytes
  ? "supported-tlv-types" => [*uint],    ; List of supported TLV Type values
  ? "supported-versions" => [*uint],     ; List of supported protocol versions
  ? "congestion-modes" => [*text],        ; Supported congestion control modes
  ? "conversation-limit" => uint,        ; Maximum concurrent conversations
  ? "subscription-limit" => uint         ; Maximum concurrent subscriptions
}
      ]]></artwork>
    </figure>
    
    <t>All fields are optional. If a field is omitted, implementations MUST assume the minimum required value for that capability. Nodes SHOULD cache results until expiration or reboot. If the resource is unavailable (4.04 Not Found), implementations MUST assume default minimum capabilities: max-tlv-size=1024 (minimum required), max-payload-size=65535 (minimum required), supported-versions=[0x00]. These defaults represent minimum required capabilities; implementations MAY advertise higher limits in their feature negotiation responses.</t>
  </section>

</section>

<section title="Wire Examples" anchor="wire-examples">
  <t>This section provides essential normative examples of µACP messages. Additional test vectors are available in the reference implementation repository <xref target="MUACP-IMPL"/>. Byte order is network byte order (big-endian).</t>

  <section title="Minimal PING (unencrypted)" anchor="ping-example">
    <t>A minimal PING contains only the µACP header. The complete 64-bit header is:</t>

    <figure>
      <name>Example 1: PING Message (Hex)</name>
      <artwork><![CDATA[
00 01   # Sequence ID = 0x0001
00 01   # Correlation ID = 0x0001
00      # QoS = 0 (fire-and-forget), Verb = 0 (PING), Flags = 0
00 00 00   # Reserved (24 bits, all zeros)

Total: 8 bytes
      ]]></artwork>
    </figure>

    <t>No TLVs, no payload. This message may be sent unencrypted over CoAP NON.</t>
  </section>

  <section title="ASK/TELL over OSCORE" anchor="ask-tell-oscore">
    <t>ASK messages are sent as CoAP POST requests with OSCORE protection. The unencrypted µACP ASK structure: Header (Sequence ID=0x0002, Correlation ID=0x0003, QoS=1, Verb=2), optional TLVs, optional payload. After OSCORE encryption, the complete µACP message becomes the CoAP payload. TELL responses use the same Correlation ID and are also OSCORE-protected.</t>
    
    <t><strong>Complete Example:</strong> The following shows a complete ASK/TELL exchange:</t>
    
    <figure>
      <name>Example 2: Complete ASK/TELL Exchange</name>
      <artwork><![CDATA[
Step 1: Unencrypted µACP ASK Message (before OSCORE encryption):
  Header (8 bytes):
    00 02              # Sequence ID = 0x0002
    00 03              # Correlation ID = 0x0003
    40                 # QoS = 1 (at-least-once), Verb = 2 (ASK), Flags = 0
    00 00 00           # Reserved (24 bits, all zeros)
  
  TLVs (optional, none in this example):
    [No TLVs]
  
  Payload (optional, CBOR-encoded request):
    A1                  # CBOR map with 1 key-value pair
    66 61 63 74 69 6F 6E  # "action" (UTF-8 string)
    64 72 65 61 64        # "read" (UTF-8 string)
  
  Total µACP message: 8 bytes (header) + 0 bytes (TLVs) + 11 bytes (payload) = 19 bytes

Step 2: CoAP POST with OSCORE (encrypted):
  CoAP Header: 44 02 7A 10  # CON, POST, MID=0x7A10
  CoAP Options:
    0B 6D 75 61 63 70  # Uri-Path: "muacp"
    11 2A              # Content-Format: application/muacp+binary (0x2A, TBD)
    09 XX              # OSCORE Option (flag byte and partial IV)
  
  OSCORE-Protected Payload (encrypted µACP message):
    [Encrypted ciphertext - actual value depends on OSCORE context]
    Note: The complete 19-byte µACP message from Step 1 is encrypted here

Step 3: TELL Response (unencrypted structure before OSCORE):
  Header (8 bytes):
    00 03              # Sequence ID = 0x0003
    00 03              # Correlation ID = 0x0003 (matches ASK)
    10                 # QoS = 0 (fire-and-forget), Verb = 1 (TELL), Flags = 0
    00 00 00           # Reserved (24 bits, all zeros)
  
  TLVs:
    22 01 00           # Error-Code TLV: Type=0x22, Length=1, Value=0x00 (SUCCESS)
  
  Payload (optional, CBOR-encoded result):
    A1                  # CBOR map with 1 key-value pair
    65 76 61 6C 75 65    # "value" (UTF-8 string)
    F9 41 AC             # CBOR half-precision float: 21.5

Step 4: CoAP Response with OSCORE (encrypted):
  CoAP Header: 64 44 7A 10  # ACK, 2.04 Changed, MID=0x7A10
  OSCORE-Protected Payload (encrypted µACP TELL):
    [Encrypted ciphertext - actual value depends on OSCORE context]
      ]]></artwork>
    </figure>
    
    <t>Complete hexdumps of encrypted payloads with actual OSCORE ciphertext are provided in the reference implementation repository, as they depend on specific OSCORE security contexts, nonces, and key material.</t>
  </section>

</section>
<section title="Conformance Tests" anchor="conformance">
  <t>This section defines the normative conformance tests required to validate µACP implementations. A device or software stack MUST pass all tests in this section to be considered µACP-compliant. Detailed test vectors and a complete test suite are available in the reference implementation repository <xref target="MUACP-IMPL"/>.</t>

  <t>Implementations MUST pass tests in the following categories:</t>
  <ul>
    <li><strong>Header and TLV Encoding:</strong> Correct parsing of all header fields, TLV ordering, size limits (1024 bytes TLV region, 65535 bytes payload), and handling of unknown TLVs.</li>
    <li><strong>Parser Robustness:</strong> Safe handling of malformed headers, oversized payloads, invalid TLV lengths, and resource exhaustion conditions.</li>
    <li><strong>State-Machine Behavior:</strong> ASK/TELL conversation lifecycle, OBSERVE subscription management, PING statelessness, and deterministic error transitions.</li>
    <li><strong>OSCORE Security:</strong> Authentication and decryption of protected messages, replay window enforcement, context isolation, and downgrade protection.</li>
    <li><strong>Resource Constraints:</strong> Conversation table limits (minimum 64 entries), subscription limits (minimum 16), and bounded processing time.</li>
    <li><strong>Interoperability:</strong> Successful message exchange between independent implementations under the Minimum Interoperability Profile.</li>
  </ul>

  <t>All test requirements are derived from the normative sections of this specification. Passing these tests validates full compliance with µACP.</t>

</section>
</middle>

<back>
<references title="Normative References" anchor="references-normative">
    <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"/>
        <date month="March" year="1997"/>
      </front>
      <seriesInfo name="BCP" value="14"/>
      <seriesInfo name="RFC" value="2119"/>
    </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"/>
        <date month="May" year="2017"/>
      </front>
      <seriesInfo name="BCP" value="14"/>
      <seriesInfo name="RFC" value="8174"/>
    </reference>

    <reference anchor="RFC7252" target="https://www.rfc-editor.org/rfc/rfc7252">
      <front>
        <title>The Constrained Application Protocol (CoAP)</title>
        <author fullname="Z. Shelby"/>
        <author fullname="K. Hartke"/>
        <author fullname="C. Bormann"/>
        <date month="June" year="2014"/>
      </front>
      <seriesInfo name="RFC" value="7252"/>
    </reference>

    <reference anchor="RFC8152" target="https://www.rfc-editor.org/rfc/rfc8152">
      <front>
        <title>CBOR Object Signing and Encryption (COSE)</title>
        <author fullname="J. Schaad"/>
        <date month="July" year="2017"/>
      </front>
      <seriesInfo name="RFC" value="8152"/>
    </reference>

    <reference anchor="RFC8613" target="https://www.rfc-editor.org/rfc/rfc8613">
      <front>
        <title>OSCORE: Object Security for Constrained RESTful Environments</title>
        <author fullname="G. Selander"/>
        <author fullname="J. Mattsson"/>
        <author fullname="T. Fossati"/>
        <date month="April" year="2019"/>
      </front>
      <seriesInfo name="RFC" value="8613"/>
    </reference>

    <reference anchor="RFC7641" target="https://www.rfc-editor.org/rfc/rfc7641">
      <front>
        <title>Observing Resources in the Constrained Application Protocol (CoAP)</title>
        <author fullname="K. Hartke"/>
        <date month="September" year="2015"/>
      </front>
      <seriesInfo name="RFC" value="7641"/>
    </reference>

    <reference anchor="RFC7959" target="https://www.rfc-editor.org/rfc/rfc7959">
      <front>
        <title>Blockwise Transfers in the Constrained Application Protocol (CoAP)</title>
        <author fullname="C. Bormann"/>
        <author fullname="Z. Shelby"/>
        <date month="August" year="2016"/>
      </front>
      <seriesInfo name="RFC" value="7959"/>
    </reference>

    <reference anchor="RFC6838" target="https://www.rfc-editor.org/rfc/rfc6838">
      <front>
        <title>Media Type Specifications and Registration Procedures</title>
        <author fullname="N. Freed"/>
        <author fullname="J. Klensin"/>
        <author fullname="T. Hansen"/>
        <date month="January" year="2013"/>
      </front>
      <seriesInfo name="BCP" value="13"/>
      <seriesInfo name="RFC" value="6838"/>
    </reference>

    <reference anchor="RFC8615" target="https://www.rfc-editor.org/rfc/rfc8615">
      <front>
        <title>Well-Known Uniform Resource Identifiers (URIs)</title>
        <author fullname="M. Nottingham"/>
        <date month="May" year="2019"/>
      </front>
      <seriesInfo name="RFC" value="8615"/>
    </reference>

    <reference anchor="RFC8949" target="https://www.rfc-editor.org/rfc/rfc8949">
      <front>
        <title>Concise Binary Object Representation (CBOR)</title>
        <author fullname="C. Bormann"/>
        <author fullname="P. Hoffman"/>
        <date month="December" year="2020"/>
      </front>
      <seriesInfo name="STD" value="94"/>
      <seriesInfo name="RFC" value="8949"/>
    </reference>

    <reference anchor="RFC9528" target="https://www.rfc-editor.org/rfc/rfc9528">
      <front>
        <title>Ephemeral Diffie-Hellman Over COSE (EDHOC)</title>
        <author fullname="G. Selander"/>
        <author fullname="J. Mattsson"/>
        <author fullname="M. Furuhed"/>
        <date month="March" year="2024"/>
      </front>
      <seriesInfo name="RFC" value="9528"/>
    </reference>

    <reference anchor="RFC7228" target="https://www.rfc-editor.org/rfc/rfc7228">
      <front>
        <title>Terminology for Constrained-Node Networks</title>
        <author fullname="C. Bormann"/>
        <author fullname="M. Ersue"/>
        <author fullname="A. Keranen"/>
        <date month="May" year="2014"/>
      </front>
      <seriesInfo name="RFC" value="7228"/>
    </reference>

    <reference anchor="RFC8126" target="https://www.rfc-editor.org/rfc/rfc8126">
      <front>
        <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
        <author fullname="M. Cotton"/>
        <author fullname="B. Leiba"/>
        <author fullname="T. Narten"/>
        <date month="June" year="2017"/>
      </front>
      <seriesInfo name="BCP" value="26"/>
      <seriesInfo name="RFC" value="8126"/>
    </reference>

    <reference anchor="RFC1982" target="https://www.rfc-editor.org/rfc/rfc1982">
      <front>
        <title>Serial Number Arithmetic</title>
        <author fullname="R. Elz"/>
        <author fullname="R. Bush"/>
        <date month="August" year="1996"/>
      </front>
      <seriesInfo name="RFC" value="1982"/>
    </reference>

</references>
<references title="Informative References" anchor="references-informative">
    <reference anchor="FIPA-ACL" target="https://www.fipa.org/specs/fipa00061/">
      <front>
        <title>ACL Message Structure Specification</title>
        <author fullname="Foundation for Intelligent Physical Agents (FIPA)"/>
        <date year="1997"/>
      </front>
    </reference>

    <reference anchor="MUACP" target="https://arxiv.org/abs/2601.00219">
      <front>
        <title>µACP: A Formal Calculus for Expressive, Resource-Constrained Agent Communication</title>
        <author fullname="A. Mallick"/>
        <author fullname="I. Chebolu"/>
        <date year="2026"/>
      </front>
      <seriesInfo name="arXiv" value="2601.00219"/>
      <seriesInfo name="archivePrefix" value="arXiv"/>
      <seriesInfo name="primaryClass" value="cs.MA"/>
    </reference>

    <reference anchor="RFC9147" target="https://www.rfc-editor.org/rfc/rfc9147">
      <front>
        <title>The Datagram Transport Layer Security (DTLS) Protocol Version 1.3</title>
        <author fullname="E. Rescorla"/>
        <date month="April" year="2022"/>
      </front>
      <seriesInfo name="RFC" value="9147"/>
    </reference>

    <reference anchor="MUACP-IMPL" target="https://github.com/arnab-m1/miuACP">
      <front>
        <title>µACP Reference Implementation</title>
        <author fullname="A. Mallick"/>
        <date year="2025"/>
      </front>
      <seriesInfo name="GitHub Repository" value="arnab-m1/miuACP"/>
    </reference>

    <reference anchor="AGENT-SURVEY">
      <front>
        <title>A Survey of Agent Communication Languages: Formalisms and Applications</title>
        <author fullname="T. Finin"/>
        <author fullname="Y. Labrou"/>
        <author fullname="J. Mayfield"/>
        <date year="1997"/>
      </front>
      <seriesInfo name="Communications of ACM" value="40(5)"/>
      <seriesInfo name="DOI" value="10.1145/265563.265564"/>
    </reference>

    <reference anchor="IOT-SURVEY">
      <front>
        <title>IoT Protocols for Resource-Constrained Devices: A Comparative Survey</title>
        <author fullname="M. Palattella"/>
        <author fullname="N. Accettura"/>
        <author fullname="X. Vilajosana"/>
        <author fullname="T. Watteyne"/>
        <author fullname="L. Grieco"/>
        <author fullname="G. Boggia"/>
        <author fullname="M. Dohler"/>
        <date year="2016"/>
      </front>
      <seriesInfo name="IEEE Communications Surveys &amp; Tutorials" value="18(3)"/>
      <seriesInfo name="DOI" value="10.1109/COMST.2016.2549528"/>
    </reference>

    <reference anchor="RPL">
      <front>
        <title>RPL: IPv6 Routing Protocol for Low-Power and Lossy Networks</title>
        <author fullname="T. Winter"/>
        <author fullname="P. Thubert"/>
        <date month="March" year="2012"/>
      </front>
      <seriesInfo name="RFC" value="6550"/>
    </reference>


    <reference anchor="DDS">
      <front>
        <title>Data Distribution Service (DDS) for Real-Time Systems, Version 1.4</title>
        <author fullname="Object Management Group"/>
        <date month="April" year="2015"/>
      </front>
      <seriesInfo name="OMG Document" value="formal/15-04-10"/>
    </reference>

    <reference anchor="DT">
      <front>
        <title>Digital Twin—The Simulation Aspect</title>
        <author fullname="S. Boschert"/>
        <author fullname="R. Rosen"/>
        <date year="2016"/>
      </front>
      <seriesInfo name="Mechatronic Futures: Challenges and Solutions for Mechatronic Systems and their Designers" value="Chapter 3"/>
      <seriesInfo name="Publisher" value="Springer"/>
      <seriesInfo name="DOI" value="10.1007/978-3-319-32156-1_3"/>
    </reference>

</references>
<section title="Acknowledgments" anchor="ack" numbered="false">
  <t>The design of µACP benefited from feedback across multiple research and engineering communities working on IoT systems, multi-agent communication, and distributed protocol design. The authors acknowledge the valuable insights provided by early reviewers, prototype implementers, and colleagues who explored µACP in constrained-device testbeds.</t>

  <t>Special thanks are extended to members of the open-source contributors who reviewed early drafts of the µACP calculus and provided implementation reports via the project repository. Their feedback led to refinements in the state machines, TLV model, and transport bindings.</t>

  <t>The authors also thank participants from constrained-network and OSCORE working groups whose discussions influenced the treatment of fragmentation, replay protection, and authentication in this specification.</t>

  <t>This specification incorporates lessons from deployments in microcontroller-based sensing systems, autonomous control nodes, and large-scale telemetry environments. The authors acknowledge these deployments for motivating the resource model and deterministic behavior guarantees underlying µACP.</t>

  <t>This work is an independent contribution and does not represent the views of any organization or government entity.</t>

</section>

  </back>
</rfc>
