<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.43 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-salaheldin-bcnp-00" category="std" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.1 -->
  <front>
    <title>Brain Control Network Protocol (BCNP)</title>
    <seriesInfo name="Internet-Draft" value="draft-salaheldin-bcnp-00"/>
    <author fullname="Mohamed Salaheldin Abouelkhir Attia">
      <organization/>
      <address>
        <email>mohammeds.aboelkher@gmail.com</email>
      </address>
    </author>
    <date year="2026" month="September" day="22"/>
    <area>art</area>
    <workgroup>Individual submission</workgroup>
    <keyword>brain</keyword>
    <keyword>control</keyword>
    <keyword>heterogeneous devices network</keyword>
    <keyword>dynamic configuration</keyword>
    <keyword>application layer</keyword>
    <keyword>binary protocol</keyword>
    <abstract>
      <?line 38?>

<t>The Brain Control Network Protocol (BCNP) is a binary, TCP-based application-layer protocol for discovering, configuring, and commanding networked devices from a single controller using a small, fixed vocabulary of discrete control inputs, such as those produced by a brain-computer interface. A Controller establishes a private wireless network that Devices join, discovers Devices and assigns each a persistent address, discovers and registers the Actions a Device can perform, and subsequently issues short, stateless commands, expressed through that same small input vocabulary, to elicit those Actions. This document specifies BCNP's binary message formats, its Discovery, Pairing, and Command phases, and the reconciliation mechanism used to recover from lost acknowledgments and Devices that change network address.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://mohammedsaboelkher.github.io/bcnp-i-d/draft-salaheldin-bcnp.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-salaheldin-bcnp/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/mohammedsaboelkher/bcnp-i-d"/>.</t>
    </note>
  </front>
  <middle>
    <?line 43?>

<section anchor="intro">
      <name>Introduction</name>
      <t>Brain-computer interfaces (BCIs) allow a user to control external systems using neural signals, most commonly electroencephalography (EEG), without requiring physical movement. This makes BCIs a valuable input modality for assistive technology, benefiting users with severe motor impairments, as well as an emerging general-purpose input method. A defining constraint of BCI-based input, however, is that only a small number of distinct mental commands can typically be classified reliably; each additional command that a user must learn to produce, and a classifier must learn to distinguish, increases training burden and reduces accuracy.</t>
      <t>The Brain Control Network Protocol (BCNP) is designed around this constraint. Its Controller (a software program with no dedicated user interface assumed, and expected in practice to be driven by an EEG headset's signal classifier) interacts with the protocol through a small, fixed set of "probes": seven control probes (Discover, Hello, Register, Forget, End, Collection, Device) and a configurable number, K, of key probes, where K corresponds to however many distinct classes a given classifier can reliably distinguish. Each probe corresponds to one distinguishable mental command a user can produce.</t>
      <t>BCNP's central design goal is to let this same small vocabulary of K probes control an arbitrary number of Devices and Actions, without requiring dedicated software or a retrained classifier for each new device. This is achieved by making the mapping between probes and real Devices and Actions fully configurable at runtime: a Controller assigns Devices to Collections and Device Keys during a Device Configuration Phase ("Discovery"), and assigns a Device's Actions to Action Keys during an Action Configuration Phase ("Pairing"), after which the same K key probes can elicit different Actions depending on which Device is currently addressed. A user who has learned to reliably produce K distinguishable mental commands can, in principle, control any number of BCNP Devices.</t>
      <t>BCNP is designed for a controller-hosted network: the Controller is responsible for establishing the wireless network Devices join, and BCNP's security properties (<xref target="security">Security Considerations</xref>) depend on that network being the trust boundary. Joining a pre-existing, general-purpose network is out of scope for this document.</t>
      <t>This document specifies:</t>
      <ul spacing="normal">
        <li>
          <t>the BCNP binary header and message formats (<xref target="msgformat">Message Format</xref>),</t>
        </li>
        <li>
          <t>the Device Configuration Phase ("Discovery"), Action Configuration Phase ("Pairing"), and Command phase, including the state machines governing Controller and Device behavior (<xref target="protoop">Protocol Operation</xref>),</t>
        </li>
        <li>
          <t>a reconciliation mechanism for recovering from lost acknowledgments and Devices that have changed network address (<xref target="protoop">Protocol Operation</xref>), and</t>
        </li>
        <li>
          <t>the security properties and residual risks of BCNP's intended deployment model (<xref target="security">Security Considerations</xref>).</t>
        </li>
      </ul>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</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>
      <?line -18?>

<section anchor="terminology">
        <name>Terminology</name>
        <dl>
          <dt>Control Network:</dt>
          <dd>
            <t>A network comprising one Controller and a set of Devices, in which the Controller configures and commands the Devices.</t>
          </dd>
          <dt>Controller:</dt>
          <dd>
            <t>A software program that configures and commands a set of Devices via the Probes defined in this document. This document assumes no specific Controller user interface or input mechanism; see <xref target="intro">Introduction</xref> for the brain-computer interface use case that motivates BCNP's design.</t>
          </dd>
          <dt>Device:</dt>
          <dd>
            <t>A software program that listens for configuration and commands from a Controller.</t>
          </dd>
          <dt>Probe:</dt>
          <dd>
            <t>A single, discrete unit of Controller input, corresponding to one command a Controller's operator can produce. A Controller has seven Control Probes (Discover, Hello, Register, Forget, End, Collection, Device) and K Key Probes, numbered 0 to K-1.</t>
          </dd>
          <dt>K:</dt>
          <dd>
            <t>The number of Key Probes available to a Controller. K is fixed for a given Controller and is expected to correspond to however many distinct inputs its underlying input mechanism can reliably distinguish. K bounds the range of Collection Key, Device Key, Action Key, and Temporary Device Key; it does not bound Root Action Key or Sequence ID. Because these bounded fields are each carried in one byte on the wire (see Message Format), K <bcp14>MUST</bcp14> be an integer from 1 to 256 inclusive.</t>
          </dd>
          <dt>Collection:</dt>
          <dd>
            <t>A group of Devices, identified by a unique Collection Key, known to a Controller.</t>
          </dd>
          <dt>Collection Key:</dt>
          <dd>
            <t>An unsigned integer in the range 0 to K-1, unique among the Collections known to a Controller, used to identify a Collection.</t>
          </dd>
          <dt>Device Key:</dt>
          <dd>
            <t>An unsigned integer in the range 0 to K-1, unique among the Devices within a single Collection, used to identify a Device. Two Devices in different Collections may share the same Device Key.</t>
          </dd>
          <dt>Action:</dt>
          <dd>
            <t>A capability of a Device that a Controller can elicit, for example turning on an LED.</t>
          </dd>
          <dt>Action Key:</dt>
          <dd>
            <t>An unsigned integer in the range 0 to K-1, unique among the Actions registered for a single Device, used to identify an Action once a Controller has Paired with that Device.</t>
          </dd>
          <dt>Root Action Key:</dt>
          <dd>
            <t>An unsigned integer in the range 0 to 255, assigned by a Device to identify one of its own Actions. Unlike Action Key, Root Action Key is not bounded by K: a Device's Root Action Keys need not be contiguous, and a Device may have more Actions than a given Controller's K. See <xref target="protoop">Protocol Operation</xref> for how a Controller addresses a Device's Actions when they outnumber K.</t>
          </dd>
          <dt>Temporary Device Key:</dt>
          <dd>
            <t>An unsigned integer in the range 0 to K-1, assigned by a Controller during the Device Configuration Phase to temporarily identify a Device that has not yet been assigned a Device Key.</t>
          </dd>
          <dt>Device Configuration Phase:</dt>
          <dd>
            <t>Also referred to as "Discovery". The process by which a Controller discovers Devices and assigns each a Collection Key and a Device Key.</t>
          </dd>
          <dt>Action Configuration Phase:</dt>
          <dd>
            <t>Also referred to as "Pairing". The process by which a Controller, having opened a persistent connection to a single Device, discovers that Device's Actions and assigns each an Action Key.</t>
          </dd>
          <dt>Commanding:</dt>
          <dd>
            <t>The process by which a Controller elicits a Device to perform an Action, outside of the Device Configuration Phase or Action Configuration Phase.</t>
          </dd>
          <dt>Temporary Device Map:</dt>
          <dd>
            <t>A construct held in a Controller's volatile memory, mapping each currently assigned Temporary Device Key to the Network ID of the Device holding it, for the duration of a single Device Configuration Phase.</t>
          </dd>
          <dt>Device Map:</dt>
          <dd>
            <t>A construct held in a Controller's persistent storage, mapping each Device Key, within a Collection, to the last known Network ID of the Device holding it. A Device's Network ID is not assumed to remain stable; see <xref target="protoop">Protocol Operation</xref> for the reconciliation mechanism used to recover a Device's current Network ID.</t>
          </dd>
          <dt>Action Map:</dt>
          <dd>
            <t>A construct, held independently in the persistent storage of both a Controller and a Device, mapping each Action Key to the corresponding Root Action Key.</t>
          </dd>
          <dt>Network ID:</dt>
          <dd>
            <t>The address of a Device on the Control Network, for example an IP address.</t>
          </dd>
          <dt>Status Code:</dt>
          <dd>
            <t>A single-byte value, carried in most response messages, indicating the outcome of the request being acknowledged. See <xref target="msgformat">Message Format</xref>.</t>
          </dd>
          <dt>Reconciliation:</dt>
          <dd>
            <t>The process by which a Controller recovers from an operation that failed or timed out, by querying whether a Device holding a specific Collection Key and Device Key pair can still be located. See <xref target="protoop">Protocol Operation</xref>.</t>
          </dd>
        </dl>
      </section>
    </section>
    <section anchor="overview">
      <name>Protocol Overview</name>
      <t>BCNP defines three sequential phases of interaction between a Controller and a Device: a Device Configuration Phase ("Discovery"), an Action Configuration Phase ("Pairing"), and Commanding.</t>
      <t>During Discovery, a Controller broadcasts a request for any Device on its network to announce itself, assigns each responding Device a Temporary Device Key, and then assigns each a permanent Collection Key and Device Key, recording the mapping in its Device Map. A Device transitions from DEV_STATE_UNASSIGNED to DEV_STATE_ASSIGNED as a result.</t>
      <t>During Pairing, a Controller opens a single persistent connection to one already-assigned Device, discovers the Actions that Device can perform, and assigns each an Action Key. The Device transitions to DEV_STATE_PAIRED for the duration of this connection, returning to DEV_STATE_ASSIGNED once it ends.</t>
      <t>During Commanding, a Controller, addressing a Device by Collection Key, Device Key, and Action Key, elicits a single Action. Commanding requires no persistent connection, and no prior phase beyond Discovery, plus Pairing if the desired Action has not already been assigned an Action Key.</t>
      <t>A Controller has a corresponding state machine: CTRL_STATE_IDLE, from which Discovery or Pairing may be entered and Commands may be issued; CTRL_STATE_DISCOVERING, active for the duration of a Device Configuration Phase; and CTRL_STATE_PAIRED, active for the duration of an Action Configuration Phase. <xref target="protoop">Protocol Operation</xref> specifies the complete state machines for both Controller and Device, and the procedures governing every transition.</t>
      <section anchor="deployment-model">
        <name>Deployment Model</name>
        <t>BCNP assumes a Controller establishes its own wireless network, and that Devices join that network through some out-of-band mechanism before engaging in BCNP; the specifics of that mechanism are out of scope for this document. This document further assumes a single Controller per Control Network: a Device holds at most one Collection Key and Device Key at a time, and this document does not define behavior for a second Controller attempting to configure a Device already claimed by another. Both of these are scoping decisions rather than protocol requirements as such; see <xref target="security">Security Considerations</xref> for the trust model this deployment assumption enables.</t>
        <t>Because Collection Key, Device Key, and Action Key are each bounded to the range 0 to K-1 (see "K" in <xref target="terminology"/>), a single Controller can, per Collection, address at most K Devices, each with at most K Actions available for direct addressing, for a system-wide ceiling of K x K addressable Devices. This is a deliberate consequence of BCNP's design (see <xref target="intro">Introduction</xref>), not an oversight.</t>
      </section>
    </section>
    <section anchor="msgformat">
      <name>Message Format</name>
      <t>BCNP depends on a reliable, connection-oriented transport; this document assumes TCP <xref target="RFC9293"/>. All BCNP messages consist of a fixed 6-byte header, optionally followed by a payload whose shape is determined entirely by the Message Type in that header.</t>
      <section anchor="header">
        <name>Header</name>
        <artwork><![CDATA[
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Magic     |    Version    | Message Type  |  Sequence ID  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|        Payload Length         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
        <dl>
          <dt>Magic:</dt>
          <dd>
            <t>Fixed to 0xBC. A receiver <bcp14>MUST</bcp14> discard, without further processing, any message whose Magic byte is not 0xBC.</t>
          </dd>
          <dt>Version:</dt>
          <dd>
            <t>The protocol version in use. A receiver <bcp14>MUST</bcp14> reject a message carrying a Version it does not support, responding where applicable with Status Code ERR_VERSION.</t>
          </dd>
          <dt>Message Type:</dt>
          <dd>
            <t>Identifies the message; see "Message Types" below. A receiver <bcp14>MUST</bcp14> discard, without further processing, any message carrying a Message Type this document does not assign.</t>
          </dd>
          <dt>Sequence ID:</dt>
          <dd>
            <t>Set by the sender of a request. A response <bcp14>MUST</bcp14> echo the same value as the request it answers. BCNP is synchronous: an implementation <bcp14>MUST NOT</bcp14> have more than one request outstanding at a time on a single connection. Under this constraint, wraparound of this one-byte field cannot cause a response to be mismatched to the wrong request.</t>
          </dd>
          <dt>Payload Length:</dt>
          <dd>
            <t>The number of bytes following the header, encoded in network byte order (big-endian), 0 to 65535.</t>
          </dd>
        </dl>
      </section>
      <section anchor="notation">
        <name>Notation</name>
        <t>The tables below describe each message's payload as an ordered sequence of fields. <tt>[field_name:N]</tt> denotes a field occupying exactly N bytes at that position; fields are concatenated with no delimiters, since both sides already know the expected shape from the Message Type. <tt>+ JSON tail</tt> denotes that all remaining bytes, up to Payload Length, are one UTF-8 encoded JSON value (see "JSON Schema" below). <tt>count x [...]</tt> denotes that the bracketed group repeats <tt>count</tt> times.</t>
      </section>
      <section anchor="status-codes">
        <name>Status Codes</name>
        <t>Most response messages carry a one-byte Status Code as the first byte of their payload. Codes of local or synthesized origin are never serialized; they are included here to keep the code space in one place, and are cross-referenced from <xref target="protoop">Protocol Operation</xref>, where the controller behavior that produces them is specified.</t>
        <table>
          <thead>
            <tr>
              <th align="left">Code</th>
              <th align="left">Name</th>
              <th align="left">Origin</th>
              <th align="left">Meaning</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0x00</td>
              <td align="left">OK</td>
              <td align="left">wire</td>
              <td align="left">Success</td>
            </tr>
            <tr>
              <td align="left">0x01</td>
              <td align="left">ERR_LOCAL_NOT_FOUND</td>
              <td align="left">local</td>
              <td align="left">Never serialized; see <xref target="protoop">Protocol Operation</xref></td>
            </tr>
            <tr>
              <td align="left">0x02</td>
              <td align="left">ERR_LOCAL_COLLISION</td>
              <td align="left">local</td>
              <td align="left">Never serialized; see <xref target="protoop">Protocol Operation</xref></td>
            </tr>
            <tr>
              <td align="left">0x03</td>
              <td align="left">ERR_LOCAL_INVALID_STATE</td>
              <td align="left">local</td>
              <td align="left">Never serialized; see <xref target="protoop">Protocol Operation</xref></td>
            </tr>
            <tr>
              <td align="left">0x04</td>
              <td align="left">ERR_TIMEOUT</td>
              <td align="left">synthesized</td>
              <td align="left">Never serialized; see <xref target="protoop">Protocol Operation</xref></td>
            </tr>
            <tr>
              <td align="left">0x05</td>
              <td align="left">ERR_MALFORMED</td>
              <td align="left">wire</td>
              <td align="left">The message's payload does not parse for its Message Type</td>
            </tr>
            <tr>
              <td align="left">0x06</td>
              <td align="left">ERR_VERSION</td>
              <td align="left">wire</td>
              <td align="left">The Version in the request is not supported</td>
            </tr>
            <tr>
              <td align="left">0x07</td>
              <td align="left">ERR_IDENTITY_MISMATCH</td>
              <td align="left">wire</td>
              <td align="left">The responding Device's Collection Key/Device Key does not match the request</td>
            </tr>
            <tr>
              <td align="left">0x08</td>
              <td align="left">ERR_REGISTER_VERIFY_FAILED</td>
              <td align="left">synthesized</td>
              <td align="left">Never serialized; see <xref target="protoop">Protocol Operation</xref></td>
            </tr>
            <tr>
              <td align="left">0x09</td>
              <td align="left">ERR_ACTION_TIMEOUT</td>
              <td align="left">synthesized</td>
              <td align="left">Never serialized; see <xref target="protoop">Protocol Operation</xref></td>
            </tr>
            <tr>
              <td align="left">0x0A</td>
              <td align="left">ERR_ACTION_FAILED</td>
              <td align="left">wire</td>
              <td align="left">The Device attempted the Action and it failed</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="message-types">
        <name>Message Types</name>
        <t>Message Type is one byte, giving 256 possible values. This document assigns 0x01 through 0x1B; the remainder are unassigned, and, per <xref target="iana">IANA Considerations</xref>, this document establishes no registry for allocating them.</t>
        <section anchor="device-configuration-phase">
          <name>Device Configuration Phase</name>
          <table>
            <thead>
              <tr>
                <th align="left">Type</th>
                <th align="left">Message</th>
                <th align="left">Direction</th>
                <th align="left">Payload</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">0x01</td>
                <td align="left">BCNP_DISCOVER</td>
                <td align="left">Controller to Devices (broadcast)</td>
                <td align="left">empty</td>
              </tr>
              <tr>
                <td align="left">0x02</td>
                <td align="left">BCNP_ANNOUNCE</td>
                <td align="left">Device to Controller</td>
                <td align="left">
                  <tt>[has_keys:1]</tt> + if has_keys=1: <tt>[collection_key:1][device_key:1]</tt> + JSON tail</td>
              </tr>
              <tr>
                <td align="left">0x03</td>
                <td align="left">BCNP_DISCOVER_ASSIGN</td>
                <td align="left">Controller to Device</td>
                <td align="left">
                  <tt>[temp_device_key:1]</tt></td>
              </tr>
              <tr>
                <td align="left">0x04</td>
                <td align="left">BCNP_DISCOVER_ACK</td>
                <td align="left">Device to Controller</td>
                <td align="left">
                  <tt>[status:1]</tt></td>
              </tr>
              <tr>
                <td align="left">0x05</td>
                <td align="left">BCNP_REGISTER_DEVICE</td>
                <td align="left">Controller to Device</td>
                <td align="left">
                  <tt>[collection_key:1][temp_device_key:1][new_device_key:1]</tt></td>
              </tr>
              <tr>
                <td align="left">0x06</td>
                <td align="left">BCNP_REGISTER_DEVICE_ACK</td>
                <td align="left">Device to Controller</td>
                <td align="left">
                  <tt>[status:1]</tt></td>
              </tr>
              <tr>
                <td align="left">0x07</td>
                <td align="left">BCNP_FORGET_DEVICE</td>
                <td align="left">Controller to Device</td>
                <td align="left">
                  <tt>[collection_key:1][device_key:1]</tt></td>
              </tr>
              <tr>
                <td align="left">0x08</td>
                <td align="left">BCNP_FORGET_DEVICE_ACK</td>
                <td align="left">Device to Controller</td>
                <td align="left">
                  <tt>[status:1]</tt></td>
              </tr>
              <tr>
                <td align="left">0x09</td>
                <td align="left">BCNP_END_DISCOVER</td>
                <td align="left">Controller to Device</td>
                <td align="left">empty</td>
              </tr>
              <tr>
                <td align="left">0x0A</td>
                <td align="left">BCNP_END_DISCOVER_ACK</td>
                <td align="left">Device to Controller</td>
                <td align="left">
                  <tt>[status:1]</tt></td>
              </tr>
            </tbody>
          </table>
        </section>
        <section anchor="action-configuration-phase">
          <name>Action Configuration Phase</name>
          <table>
            <thead>
              <tr>
                <th align="left">Type</th>
                <th align="left">Message</th>
                <th align="left">Direction</th>
                <th align="left">Payload</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">0x0B</td>
                <td align="left">BCNP_PAIR</td>
                <td align="left">Controller to Device</td>
                <td align="left">
                  <tt>[collection_key:1][device_key:1]</tt></td>
              </tr>
              <tr>
                <td align="left">0x0C</td>
                <td align="left">BCNP_PAIR_ACK</td>
                <td align="left">Device to Controller</td>
                <td align="left">
                  <tt>[status:1]</tt></td>
              </tr>
              <tr>
                <td align="left">0x0D</td>
                <td align="left">BCNP_DISCOVER_ACTION</td>
                <td align="left">Controller to Device</td>
                <td align="left">
                  <tt>[root_action_key:1]</tt></td>
              </tr>
              <tr>
                <td align="left">0x0E</td>
                <td align="left">BCNP_ANNOUNCE_ACTION</td>
                <td align="left">Device to Controller</td>
                <td align="left">
                  <tt>[root_action_key:1]</tt> + JSON tail</td>
              </tr>
              <tr>
                <td align="left">0x0F</td>
                <td align="left">BCNP_DISCOVER_ALL_ACTIONS</td>
                <td align="left">Controller to Device</td>
                <td align="left">empty</td>
              </tr>
              <tr>
                <td align="left">0x10</td>
                <td align="left">BCNP_ANNOUNCE_ALL_ACTIONS</td>
                <td align="left">Device to Controller</td>
                <td align="left">JSON array, no fixed prefix</td>
              </tr>
              <tr>
                <td align="left">0x11</td>
                <td align="left">BCNP_REGISTER_ACTION</td>
                <td align="left">Controller to Device</td>
                <td align="left">
                  <tt>[root_action_key:1][new_action_key:1]</tt></td>
              </tr>
              <tr>
                <td align="left">0x12</td>
                <td align="left">BCNP_REGISTER_ACTION_ACK</td>
                <td align="left">Device to Controller</td>
                <td align="left">
                  <tt>[status:1]</tt></td>
              </tr>
              <tr>
                <td align="left">0x13</td>
                <td align="left">BCNP_FORGET_ACTION</td>
                <td align="left">Controller to Device</td>
                <td align="left">
                  <tt>[action_key:1]</tt></td>
              </tr>
              <tr>
                <td align="left">0x14</td>
                <td align="left">BCNP_FORGET_ACTION_ACK</td>
                <td align="left">Device to Controller</td>
                <td align="left">
                  <tt>[status:1]</tt></td>
              </tr>
              <tr>
                <td align="left">0x15</td>
                <td align="left">BCNP_END_PAIR</td>
                <td align="left">Controller to Device</td>
                <td align="left">empty</td>
              </tr>
              <tr>
                <td align="left">0x16</td>
                <td align="left">BCNP_END_PAIR_ACK</td>
                <td align="left">Device to Controller</td>
                <td align="left">
                  <tt>[status:1]</tt></td>
              </tr>
            </tbody>
          </table>
          <t>Messages 0x0D through 0x16 ride the single persistent connection opened by BCNP_PAIR; none carry Collection Key or Device Key, since the connection itself identifies the Device unambiguously.</t>
        </section>
        <section anchor="command-mode">
          <name>Command Mode</name>
          <table>
            <thead>
              <tr>
                <th align="left">Type</th>
                <th align="left">Message</th>
                <th align="left">Direction</th>
                <th align="left">Payload</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">0x17</td>
                <td align="left">BCNP_COMMAND</td>
                <td align="left">Controller to Device</td>
                <td align="left">
                  <tt>[collection_key:1][device_key:1][action_key:1]</tt></td>
              </tr>
              <tr>
                <td align="left">0x18</td>
                <td align="left">BCNP_COMMAND_ACK</td>
                <td align="left">Device to Controller</td>
                <td align="left">
                  <tt>[status:1]</tt> (final result: OK or ERR_ACTION_FAILED)</td>
              </tr>
              <tr>
                <td align="left">0x19</td>
                <td align="left">BCNP_COMMAND_ACCEPT</td>
                <td align="left">Device to Controller</td>
                <td align="left">
                  <tt>[status:1]</tt> (immediate receipt confirmation)</td>
              </tr>
            </tbody>
          </table>
          <t>BCNP_COMMAND_ACCEPT (0x19) is sent before BCNP_COMMAND_ACK (0x18) in every exchange, despite its higher Type value; 0x18 retained the Type value assigned to the single acknowledgment in an earlier version of this protocol, and 0x19 was appended rather than renumbering it. Both responses to a single BCNP_COMMAND <bcp14>MUST</bcp14> echo that request's Sequence ID.</t>
        </section>
        <section anchor="reconciliation-mode">
          <name>Reconciliation Mode</name>
          <table>
            <thead>
              <tr>
                <th align="left">Type</th>
                <th align="left">Message</th>
                <th align="left">Direction</th>
                <th align="left">Payload</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">0x1A</td>
                <td align="left">BCNP_IDENTITY_CHECK</td>
                <td align="left">Controller to Devices (broadcast)</td>
                <td align="left">
                  <tt>[count:2]</tt> + count x <tt>[collection_key:1][device_key:1]</tt></td>
              </tr>
              <tr>
                <td align="left">0x1B</td>
                <td align="left">BCNP_IDENTITY_CHECK_ACK</td>
                <td align="left">Device to Controller</td>
                <td align="left">
                  <tt>[collection_key:1][device_key:1]</tt></td>
              </tr>
            </tbody>
          </table>
          <t><tt>count</tt> is encoded in network byte order. A Device receiving BCNP_IDENTITY_CHECK <bcp14>MUST</bcp14> validate that <tt>count * 2 + 2</tt> equals Payload Length before iterating the list; it <bcp14>MUST</bcp14> discard the message without further processing if this check fails. A Device sends BCNP_IDENTITY_CHECK_ACK only if one of the pairs in the list matches its own Collection Key and Device Key; a Device that finds no match <bcp14>MUST NOT</bcp14> respond.</t>
        </section>
      </section>
      <section anchor="json-schema">
        <name>JSON Schema</name>
        <t>BCNP_ANNOUNCE, BCNP_ANNOUNCE_ACTION, and BCNP_ANNOUNCE_ALL_ACTIONS each carry a JSON tail, encoded in UTF-8 per <xref target="RFC8259"/>. Two distinct shapes are used.</t>
        <section anchor="device-descriptor">
          <name>Device Descriptor</name>
          <t>Used as the JSON tail of BCNP_ANNOUNCE.</t>
          <table>
            <thead>
              <tr>
                <th align="left">Field</th>
                <th align="left">Type</th>
                <th align="left">Presence</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">name</td>
                <td align="left">string</td>
                <td align="left">
                  <bcp14>REQUIRED</bcp14></td>
              </tr>
              <tr>
                <td align="left">description</td>
                <td align="left">string</td>
                <td align="left">
                  <bcp14>OPTIONAL</bcp14></td>
              </tr>
            </tbody>
          </table>
        </section>
        <section anchor="action-descriptor">
          <name>Action Descriptor</name>
          <t>Used as the JSON tail of BCNP_ANNOUNCE_ACTION, and as each element of the JSON array carried by BCNP_ANNOUNCE_ALL_ACTIONS.</t>
          <table>
            <thead>
              <tr>
                <th align="left">Field</th>
                <th align="left">Type</th>
                <th align="left">Presence</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">name</td>
                <td align="left">string</td>
                <td align="left">
                  <bcp14>REQUIRED</bcp14></td>
              </tr>
              <tr>
                <td align="left">description</td>
                <td align="left">string</td>
                <td align="left">
                  <bcp14>OPTIONAL</bcp14></td>
              </tr>
              <tr>
                <td align="left">duration</td>
                <td align="left">integer</td>
                <td align="left">
                  <bcp14>OPTIONAL</bcp14></td>
              </tr>
              <tr>
                <td align="left">root_action_key</td>
                <td align="left">integer, 0-255</td>
                <td align="left">
                  <bcp14>REQUIRED</bcp14> in BCNP_ANNOUNCE_ALL_ACTIONS array elements only</td>
              </tr>
            </tbody>
          </table>
          <t><tt>duration</tt> is expressed in milliseconds. If absent, a Controller <bcp14>MUST</bcp14> fall back to a default timeout when awaiting the Action's completion, rather than treating its absence as an error (see <xref target="protoop">Protocol Operation</xref>). <tt>root_action_key</tt> <bcp14>MUST NOT</bcp14> be present in BCNP_ANNOUNCE_ACTION's JSON tail, where it is instead carried by the fixed <tt>[root_action_key:1]</tt> field preceding it; its presence is <bcp14>REQUIRED</bcp14> in each element of BCNP_ANNOUNCE_ALL_ACTIONS's array, which has no such fixed prefix.</t>
          <t>Field names use snake_case throughout, matching the naming convention of the fixed binary fields defined elsewhere in this section.</t>
        </section>
      </section>
    </section>
    <section anchor="protoop">
      <name>Protocol Operation</name>
      <section anchor="controller-states">
        <name>Controller States</name>
        <t>A Controller is, at any time, in exactly one of three states.</t>
        <dl>
          <dt>CTRL_STATE_IDLE:</dt>
          <dd>
            <t>The Controller's resting state. A Controller in this state <bcp14>MAY</bcp14> issue a Command, entering no other state as a result once the exchange completes. A Controller in this state <bcp14>MAY</bcp14> enter CTRL_STATE_DISCOVERING by initiating a Device Configuration Phase, or CTRL_STATE_PAIRED by initiating an Action Configuration Phase.</t>
          </dd>
          <dt>CTRL_STATE_DISCOVERING:</dt>
          <dd>
            <t>Active for the duration of a Device Configuration Phase (see "Discovery Procedure" below). A Controller in this state <bcp14>MUST NOT</bcp14> issue a Command, and <bcp14>MUST</bcp14> send and accept only Device Configuration Phase messages. A Controller returns to CTRL_STATE_IDLE once the Device Configuration Phase ends.</t>
          </dd>
          <dt>CTRL_STATE_PAIRED:</dt>
          <dd>
            <t>Active for the duration of an Action Configuration Phase, over the single persistent connection opened by BCNP_PAIR (see "Pairing Procedure" below). A Controller in this state <bcp14>MUST NOT</bcp14> issue a Command, and <bcp14>MUST</bcp14> send and accept only Action Configuration Phase messages on that connection. A Controller returns to CTRL_STATE_IDLE once the persistent connection closes.</t>
          </dd>
        </dl>
      </section>
      <section anchor="device-states">
        <name>Device States</name>
        <t>A Device is, at any time, in exactly one of three states, persisted across restarts except where noted.</t>
        <dl>
          <dt>DEV_STATE_UNASSIGNED:</dt>
          <dd>
            <t>The Device's initial state, and the state a Device returns to after being forgotten. A Device in this state listens for BCNP_DISCOVER and <bcp14>MUST</bcp14> respond with BCNP_ANNOUNCE. A Device in this state <bcp14>MUST</bcp14> evaluate any BCNP_IDENTITY_CHECK it receives (it will never match, holding no Collection Key or Device Key) and <bcp14>MUST</bcp14> silently discard a BCNP_COMMAND. A Device transitions to DEV_STATE_ASSIGNED on receiving a BCNP_REGISTER_DEVICE addressed to its currently held Temporary Device Key.</t>
          </dd>
          <dt>DEV_STATE_ASSIGNED:</dt>
          <dd>
            <t>A Device holding a Collection Key and Device Key. A Device in this state <bcp14>MUST</bcp14> respond to BCNP_COMMAND (see "Command Procedure" below), <bcp14>MUST</bcp14> respond to BCNP_DISCOVER with a BCNP_ANNOUNCE carrying its current Collection Key and Device Key, and <bcp14>MUST</bcp14> evaluate BCNP_IDENTITY_CHECK, responding with BCNP_IDENTITY_CHECK_ACK if the message includes its own Collection Key and Device Key pair. A Device in this state transitions to DEV_STATE_PAIRED on receiving a BCNP_PAIR that matches its held Collection Key and Device Key, and to DEV_STATE_UNASSIGNED on receiving a matching BCNP_FORGET_DEVICE. A Device's handling of a BCNP_REGISTER_DEVICE that does not exactly match its already-held keys is specified under "Idempotency and Retry Safety" below.</t>
          </dd>
          <dt>DEV_STATE_PAIRED:</dt>
          <dd>
            <t>A Device with a single persistent connection open to a Controller, entered by way of a successful BCNP_PAIR. A Device in this state <bcp14>MUST NOT</bcp14> act upon any message other than an Action Configuration Phase message received via its open persistent connection; in particular, it <bcp14>MUST NOT</bcp14> act upon a BCNP_COMMAND, regardless of source. A Device in this state <bcp14>MUST</bcp14> close the connection and return to DEV_STATE_ASSIGNED after receiving BCNP_END_PAIR, or after an idle period with no message received from the Controller exceeding a locally configured threshold; the idle period <bcp14>MUST</bcp14> reset on any message received from the Controller, not merely on connection establishment. A Device <bcp14>MUST NOT</bcp14> persist DEV_STATE_PAIRED across a restart: a restarted Device always begins in DEV_STATE_UNASSIGNED or DEV_STATE_ASSIGNED depending on the Collection Key and Device Key recorded in its persistent storage. A Device's handling of a BCNP_PAIR received on the already-open connection is specified under "Idempotency and Retry Safety" below.</t>
          </dd>
        </dl>
      </section>
      <section anchor="unrecognized-messages">
        <name>Unrecognized Messages</name>
        <t>Except where a Controller or Device state's description above specifies otherwise, an implementation <bcp14>MUST</bcp14> silently discard any message that does not apply to its current state.</t>
      </section>
      <section anchor="local-and-synthesized-errors">
        <name>Local and Synthesized Errors</name>
        <t>Six Status Codes are never carried on the wire: a Controller produces each internally, as its own conclusion, without any corresponding message from a Device. Four are explained here; the remaining two, ERR_REGISTER_VERIFY_FAILED and ERR_ACTION_TIMEOUT, are explained where they naturally arise, under "Register Device Verification" and "Command Procedure" respectively.</t>
        <dl>
          <dt>ERR_LOCAL_NOT_FOUND:</dt>
          <dd>
            <t>Produced when an operation references a Collection Key, Device Key, or Action Key that is not present in the Controller's Device Map or Action Map. Because these maps are authoritative for a Controller operating under the single-Controller assumption in <xref target="overview">Protocol Overview</xref>, this check <bcp14>MUST</bcp14> be performed, and <bcp14>MUST</bcp14> fail, before any message is sent; no Device is contacted.</t>
          </dd>
          <dt>ERR_LOCAL_COLLISION:</dt>
          <dd>
            <t>Produced when a Register operation's target, the new Device Key in BCNP_REGISTER_DEVICE or the new Action Key in BCNP_REGISTER_ACTION, is already occupied in the Controller's Device Map or Action Map. As with ERR_LOCAL_NOT_FOUND, this check <bcp14>MUST</bcp14> be performed locally before any message is sent.</t>
          </dd>
          <dt>ERR_LOCAL_INVALID_STATE:</dt>
          <dd>
            <t>Produced when a Probe is invoked that does not apply to the Controller's current state (for example, a Register Probe invoked while CTRL_STATE_IDLE; see "Controller States" above). No message is sent.</t>
          </dd>
          <dt>ERR_TIMEOUT:</dt>
          <dd>
            <t>Produced when a Controller does not receive an expected response to a message it sent, within its configured timeout for that exchange. Unlike the three codes above, this follows an attempt that did reach the network; see "Reconciliation" below for how a Controller acts on it.</t>
          </dd>
        </dl>
      </section>
      <section anchor="discovery-procedure">
        <name>Discovery Procedure</name>
        <t>A Controller enters CTRL_STATE_DISCOVERING by broadcasting BCNP_DISCOVER to its network, using a broadcast mechanism appropriate to its network layer rather than a connection to each address individually. Every Device in DEV_STATE_UNASSIGNED or DEV_STATE_ASSIGNED that receives this broadcast responds with BCNP_ANNOUNCE, opening its own short-lived connection to do so; a Device in DEV_STATE_PAIRED does not respond. Every message in this phase is sent over its own short-lived connection, opened for that one exchange and closed afterward; a Controller <bcp14>MUST NOT</bcp14> hold a connection open across multiple Discovery-phase exchanges with the same Device.</t>
        <t>For each responding Device, the Controller assigns a Temporary Device Key by sending BCNP_DISCOVER_ASSIGN, recording the Device's Network ID against that key in its Temporary Device Map on receiving BCNP_DISCOVER_ACK.</t>
        <t>Once addressed by its Temporary Device Key, a Controller assigns a Device a permanent Collection Key and Device Key by sending BCNP_REGISTER_DEVICE. On receiving BCNP_REGISTER_DEVICE_ACK with Status Code OK, a Controller <bcp14>MUST</bcp14> verify the registration before recording it in its Device Map, using the mechanism described under "Idempotency and Retry Safety" below, rather than committing on the acknowledgment alone.</t>
        <t>A Controller removes a Device's registration by sending BCNP_FORGET_DEVICE, addressed by that Device's Collection Key and Device Key as currently recorded in its Device Map, removing the corresponding entry on receiving BCNP_FORGET_DEVICE_ACK.</t>
        <t>A Controller ends a Device Configuration Phase by sending BCNP_END_DISCOVER individually to every Device remaining in its Temporary Device Map. Once every such Device has responded with BCNP_END_DISCOVER_ACK, the Controller discards its Temporary Device Map and returns to CTRL_STATE_IDLE.</t>
        <section anchor="key-addressing-and-pagination">
          <name>Key Addressing and Pagination</name>
          <t>Temporary Device Key here, and Root Action Key during Pairing (see "Pairing Procedure" below), may both need to address more candidates than K. Both use the same mechanism: a Controller maintains an ordered list of candidates wider than K, of which only a window of K (one page) is addressable by a Key Probe at a time.</t>
          <t>The Device probe, which selects the current Device context in CTRL_STATE_IDLE, takes on a different meaning in CTRL_STATE_DISCOVERING and during Action discovery within CTRL_STATE_PAIRED: invoked without a Key Probe, it advances to the next page. Paging wraps: invoking it past the last page, whether full or partial, returns to the first page.</t>
          <t>Here, advancing the page reassigns Temporary Device Key values 0 to K-1 to the next page's Devices by sending each a fresh BCNP_DISCOVER_ASSIGN, using the Network ID already learned from that Device's BCNP_ANNOUNCE; a Controller <bcp14>MUST NOT</bcp14> need to re-broadcast BCNP_DISCOVER to advance a page. Devices outside the current page are simply not addressed until the Controller pages back to them.</t>
        </section>
      </section>
      <section anchor="pairing-procedure">
        <name>Pairing Procedure</name>
        <t>A Controller enters CTRL_STATE_PAIRED by sending BCNP_PAIR to a Device already recorded in its Device Map, opening the single persistent connection that remains open for the duration of this phase. BCNP_PAIR carries the Collection Key and Device Key the Controller believes it is addressing; a Device receiving it <bcp14>MUST</bcp14> compare these against its own held Collection Key and Device Key and reject with ERR_IDENTITY_MISMATCH on any mismatch, rather than pairing with whichever Controller happened to reach it.</t>
        <t>Once paired, a Controller queries a single Action by sending BCNP_DISCOVER_ACTION with the Action's Root Action Key, resolved from the current page if pagination is in use (see "Key Addressing and Pagination" above), receiving its metadata back in BCNP_ANNOUNCE_ACTION. A Controller queries every Action a Device offers at once by sending BCNP_DISCOVER_ALL_ACTIONS, receiving the full set back in a single BCNP_ANNOUNCE_ALL_ACTIONS; this exchange is not subject to pagination, since it addresses no single Action Key.</t>
        <t>A Controller assigns an Action Key to a Device's Action by sending BCNP_REGISTER_ACTION, and removes an assignment by sending BCNP_FORGET_ACTION, addressed by the already-assigned Action Key. As with BCNP_REGISTER_DEVICE, a Controller <bcp14>MUST</bcp14> verify a BCNP_REGISTER_ACTION_ACK carrying Status Code OK using the mechanism described under "Idempotency and Retry Safety" below before recording it.</t>
        <t>A Controller ends an Action Configuration Phase by sending BCNP_END_PAIR over the open connection, closing the connection on receiving BCNP_END_PAIR_ACK and returning to CTRL_STATE_IDLE. A Device's own timeout and connection-loss behavior while paired is specified under "Device States" above.</t>
      </section>
      <section anchor="command-procedure">
        <name>Command Procedure</name>
        <t>A Controller in CTRL_STATE_IDLE elicits an Action by sending BCNP_COMMAND, addressed by Collection Key, Device Key, and Action Key, over its own short-lived connection. A Controller <bcp14>MUST NOT</bcp14> issue a further Command, or enter CTRL_STATE_DISCOVERING or CTRL_STATE_PAIRED, until the exchange completes or fails.</t>
        <t>A Device receiving BCNP_COMMAND responds immediately with BCNP_COMMAND_ACCEPT, before performing the Action, to confirm receipt; Status Code OK indicates the Device will attempt the Action, and any other code indicates outright rejection, in which case no further message follows. Once the Action completes, the Device sends BCNP_COMMAND_ACK carrying the outcome: Status Code OK on success, or ERR_ACTION_FAILED if the Action was attempted and did not succeed. Both messages <bcp14>MUST</bcp14> echo the Sequence ID of the BCNP_COMMAND they answer.</t>
        <t>A Controller awaits BCNP_COMMAND_ACCEPT for a short, fixed timeout; failing to receive it is handled as specified under "Idempotency and Retry Safety" below. Once BCNP_COMMAND_ACCEPT has been received, a Controller awaits BCNP_COMMAND_ACK for a duration derived from the Action's declared duration (see "JSON Schema" in Message Format) plus a grace period, or for a locally configured default duration if the Action declared none; failing to receive it within that window is a distinct condition, ERR_ACTION_TIMEOUT, also specified under "Idempotency and Retry Safety" below.</t>
      </section>
      <section anchor="idempotency-and-retry-safety">
        <name>Idempotency and Retry Safety</name>
        <section anchor="idempotent-operations">
          <name>Idempotent Operations</name>
          <t>A repeated BCNP_REGISTER_DEVICE, BCNP_REGISTER_ACTION, BCNP_FORGET_DEVICE, BCNP_FORGET_ACTION, or BCNP_PAIR that exactly matches state a Device already holds <bcp14>MUST</bcp14> be treated as successful and re-acknowledged with Status Code OK, not dropped or treated as an error; a Controller <bcp14>MAY</bcp14> therefore retry any of these operations without first determining whether an earlier attempt succeeded. A request that instead conflicts with state a Device already holds (for example, a BCNP_REGISTER_DEVICE referencing a different Collection Key or new Device Key than one already assigned to the addressed Temporary Device Key) <bcp14>MUST</bcp14> be rejected with ERR_IDENTITY_MISMATCH.</t>
          <t>BCNP_COMMAND is not idempotent: performing an Action twice is not, in general, equivalent to performing it once. A Controller <bcp14>MUST NOT</bcp14> automatically retry a BCNP_COMMAND that has timed out or failed; the decision to reissue it is left to whatever invoked the Controller.</t>
        </section>
        <section anchor="reconciliation">
          <name>Reconciliation</name>
          <t>A Controller recovers from a failed or ambiguous operation by sending BCNP_IDENTITY_CHECK, querying whether a Device holding a specific Collection Key and Device Key pair, or several such pairs batched into a single message, can still be located, regardless of Network ID. A Controller triggers Reconciliation:</t>
          <ul spacing="normal">
            <li>
              <t>on ERR_TIMEOUT or ERR_IDENTITY_MISMATCH while issuing a Command or during Pairing, for the specific Collection Key and Device Key pair involved;</t>
            </li>
            <li>
              <t>on ERR_TIMEOUT while removing a Device's registration with BCNP_FORGET_DEVICE, for the Collection Key and Device Key being removed;</t>
            </li>
            <li>
              <t>on startup, proactively, for every entry in its Device Map at once.</t>
            </li>
          </ul>
          <t>A Controller does not attempt a Device's last-known Network ID again before broadcasting BCNP_IDENTITY_CHECK: the operation that triggered Reconciliation has already served that purpose. A Controller <bcp14>SHOULD</bcp14> retry BCNP_IDENTITY_CHECK up to three times, approximately two seconds apart; the exact retry count and interval are implementation-defined. If BCNP_IDENTITY_CHECK_ACK is received, confirming the Device is still reachable, a Controller <bcp14>MAY</bcp14> retry the operation that triggered Reconciliation, since Register, Forget, and Pair are all idempotent (see "Idempotent Operations" above). If no BCNP_IDENTITY_CHECK_ACK is received after these retries, the Controller removes the corresponding entry from its Device Map, freeing the Device Key for reuse. A subsequent reference to a removed entry is rejected locally with ERR_LOCAL_NOT_FOUND, without generating any further network traffic.</t>
          <t>Reconciliation applies only to operations addressed by Collection Key and Device Key. BCNP_DISCOVER_ASSIGN and BCNP_END_DISCOVER are addressed by Temporary Device Key or by neither, and their timeout is handled without Reconciliation: a Device that does not acknowledge BCNP_DISCOVER_ASSIGN is simply not added to the Controller's Temporary Device Map for this Device Configuration Phase, and a Controller <bcp14>MAY</bcp14> proceed without receiving BCNP_END_DISCOVER_ACK, since no permanent Collection Key or Device Key registration depends on it.</t>
        </section>
        <section anchor="register-device-verification">
          <name>Register Device Verification</name>
          <t>Because Device Key is drawn from a range of only K values, shared across an entire Collection, a registration a Controller believes succeeded but that did not actually persist on the Device (for example, because the Device restarted between sending its acknowledgment and completing the write to its own persistent storage) would otherwise occupy a scarce key indefinitely, undetected. The same uncertainty arises if BCNP_REGISTER_DEVICE_ACK is never received at all: the registration may have succeeded regardless, with only the acknowledgment lost. To guard against both cases, a Controller <bcp14>MUST</bcp14>, before recording a registration in its Device Map, send BCNP_IDENTITY_CHECK for the Collection Key and Device Key just attempted: immediately on receiving BCNP_REGISTER_DEVICE_ACK carrying Status Code OK, or on ERR_TIMEOUT if no acknowledgment arrives at all. If BCNP_IDENTITY_CHECK_ACK confirms them, the Controller records the registration; otherwise, it <bcp14>MUST NOT</bcp14> record it, and <bcp14>MUST</bcp14> report ERR_REGISTER_VERIFY_FAILED. A Controller <bcp14>MAY</bcp14> safely retry BCNP_REGISTER_DEVICE after such a failure, since the operation is idempotent.</t>
          <t>This verification is scoped to BCNP_REGISTER_DEVICE only. BCNP_IDENTITY_CHECK can confirm a Collection Key and Device Key pair, but has no equivalent for an Action Key: there is no message in this document capable of confirming that a Device's Action Map actually holds a given Action Key to Root Action Key mapping. A Controller therefore has no way to verify a BCNP_REGISTER_ACTION_ACK the way it verifies BCNP_REGISTER_DEVICE_ACK; the same phantom-acknowledgment risk described above applies to Action Key, unguarded, and is instead discovered the way a stale BCNP_FORGET_DEVICE entry is: a subsequent Command referencing the affected Action Key fails, triggering the error handling specified in "Command Procedure" above, at which point the Controller and its operator learn the registration did not hold. This is a deliberate asymmetry rather than an oversight: Device Key is shared across an entire Collection and is worth the stronger guarantee; Action Key affects only the single Device it belongs to.</t>
          <t>A BCNP_FORGET_DEVICE or BCNP_FORGET_ACTION whose acknowledgment is lost requires no equivalent verification step: a Device that has genuinely forgotten an entry will not answer a later BCNP_IDENTITY_CHECK for it, so ordinary Reconciliation above already removes the resulting stale Device Map entry on next use.</t>
        </section>
      </section>
    </section>
    <section anchor="security">
      <name>Security Considerations</name>
      <section anchor="trust-model-and-scope">
        <name>Trust Model and Scope</name>
        <t>BCNP's security properties depend entirely on the deployment model described under "Deployment Model" in <xref target="overview">Protocol Overview</xref>: a single Controller establishes its own wireless network, and Devices join that network through an out-of-band mechanism outside the scope of this document. This document treats that network, not any individual BCNP message, as the trust boundary. Every message defined in <xref target="msgformat">Message Format</xref> is unauthenticated and unencrypted at the BCNP layer; whatever confidentiality and access control exist are provided entirely by the wireless network's own link-layer security (for example, WPA2 or WPA3), not by BCNP itself.</t>
        <t>This scoping has a direct consequence: BCNP provides no protection whatsoever against a party who is not on the Controller's wireless network. It relies entirely on that network correctly excluding anyone who has not been given credentials to join it. BCNP also provides no protection against a device that is a legitimate, credentialed member of that network but is compromised or malicious; this residual risk is discussed below.</t>
        <t>BCNP is not designed for, and this document makes no claims about, operation on a network the Controller does not establish and control: for example, a household's existing general-purpose WiFi network shared with other, unrelated devices and users.</t>
        <section anchor="residual-risk-within-the-trust-boundary">
          <name>Residual Risk Within the Trust Boundary</name>
          <t>No message defined in this document carries any credential, and a Device accepts BCNP_PAIR, BCNP_REGISTER_DEVICE, BCNP_REGISTER_ACTION, and BCNP_COMMAND from any sender reachable on the Controller's network, without verifying that sender's identity beyond the checks against Collection Key and Device Key described in <xref target="protoop">Protocol Operation</xref>. Consequently, any device that has joined the Controller's wireless network (including one that is compromised, whether through a firmware vulnerability, a supply-chain issue, or any other means) can impersonate the Controller to another Device, or impersonate a Device to the Controller. This is an accepted risk for the version of BCNP specified in this document, not an oversight: WPA2/WPA3 network membership demonstrates only that a station knows the network's credentials, not that it is specifically the Controller or specifically a particular Device, and this document does not attempt to close that gap at the BCNP layer.</t>
          <t>A future extension to this protocol may add a per-Device shared secret, established during BCNP_REGISTER_DEVICE and used to authenticate subsequent messages to and from that Device (for example, via a keyed hash over each message), closing this gap without requiring a full public-key infrastructure. Such a mechanism would need to be paired with replay protection (for example, a Device rejecting any Sequence ID at or below the last one it accepted from its Controller), since message authentication alone does not prevent a captured, valid message from being replayed verbatim. This document does not specify either mechanism.</t>
        </section>
        <section anchor="denial-of-service">
          <name>Denial of Service</name>
          <t>Two denial-of-service concerns are worth addressing explicitly, closed by the idle timeout and pagination mechanisms specified in <xref target="protoop">Protocol Operation</xref> rather than by any dedicated defense.</t>
          <t>A Device in DEV_STATE_PAIRED rejects Action Configuration Phase messages, and Commands, from any connection other than the one already open. Because BCNP_PAIR carries no credential (see "Residual Risk Within the Trust Boundary" above), any device on the Controller's network can open this connection by impersonating the Controller, and could hold it open indefinitely, denying the legitimate Controller access to a Device it should otherwise be able to reach. The idle timeout specified under "Device States" bounds this exposure: a Device <bcp14>MUST</bcp14> end an Action Configuration Phase after an idle period with no message received, regardless of why that silence occurred, without needing to distinguish a hostile connection from a merely idle legitimate one.</t>
          <t>A Controller's Temporary Device Key space is limited to K entries at a time. Without the pagination mechanism specified under "Key Addressing and Pagination," a Device Configuration Phase in which more than K Devices respond to a single BCNP_DISCOVER would leave the excess Devices permanently unable to obtain a Temporary Device Key. Pagination resolves this by design, not as a security-specific addition: every responding Device eventually becomes addressable as the Controller pages through its full candidate list.</t>
        </section>
      </section>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>BCNP does not request a port number assignment from IANA. TCP port 49400 is used as a suggested default; implementations and deployments <bcp14>MAY</bcp14> configure a different port as needed. BCNP is designed to operate on a closed, controller-hosted local network rather than requiring a globally coordinated well-known port.</t>
      <t>This document defines a fixed set of Message Type values and a fixed set of status/error codes. No IANA registry is established for either; both remain closed and are considered part of this specification rather than open to extension via IANA registration. Any future extension to either set requires revising this document directly.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC8259">
          <front>
            <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
            <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
            <date month="December" year="2017"/>
            <abstract>
              <t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format. It was derived from the ECMAScript Programming Language Standard. JSON defines a small set of formatting rules for the portable representation of structured data.</t>
              <t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="90"/>
          <seriesInfo name="RFC" value="8259"/>
          <seriesInfo name="DOI" value="10.17487/RFC8259"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC9293">
          <front>
            <title>Transmission Control Protocol (TCP)</title>
            <author fullname="W. Eddy" initials="W." role="editor" surname="Eddy"/>
            <date month="August" year="2022"/>
            <abstract>
              <t>This document specifies the Transmission Control Protocol (TCP). TCP is an important transport-layer protocol in the Internet protocol stack, and it has continuously evolved over decades of use and growth of the Internet. Over this time, a number of changes have been made to TCP as it was specified in RFC 793, though these have only been documented in a piecemeal fashion. This document collects and brings those changes together with the protocol specification from RFC 793. This document obsoletes RFC 793, as well as RFCs 879, 2873, 6093, 6429, 6528, and 6691 that updated parts of RFC 793. It updates RFCs 1011 and 1122, and it should be considered as a replacement for the portions of those documents dealing with TCP requirements. It also updates RFC 5961 by adding a small clarification in reset handling while in the SYN-RECEIVED state. The TCP header control bits from RFC 793 have also been updated based on RFC 3168.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="7"/>
          <seriesInfo name="RFC" value="9293"/>
          <seriesInfo name="DOI" value="10.17487/RFC9293"/>
        </reference>
      </references>
    </references>
    <?line 457?>

<section anchor="example-input-mechanisms">
      <name>Example Input Mechanisms</name>
      <t>Any input mechanism capable of producing 7 + K reliably distinguishable signals can drive a BCNP Controller. For a brain-computer interface, this may be a set of K + 7 distinct motor imagery classes (for example, imagining movement of different limbs), or a set of K + 7 distinct imagined-speech classes; nothing in this document assumes one over the other, or assumes a brain-computer interface at all.</t>
    </section>
    <section anchor="example-device-onboarding">
      <name>Example Device Onboarding</name>
      <t>This document assumes Devices join the Controller's wireless network before engaging in BCNP (see "Deployment Model"), but specifies no mechanism for doing so. A Device capable of joining any WPA2 or WPA3 network by ordinary means (for example, WPS, a QR code, or manual credential entry) can join the Controller's network the same way, since it is an ordinary WPA2/WPA3 network from the Device's perspective.</t>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>I thank Professor Abeer T. Khalil, of the Electronics and Communication Department, Faculty of Engineering, Mansoura University, who supervised this work as a graduation project and reviewed the protocol design.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
YXfhmPcg1HceXrS3EkyGb5PmkUsxUyxnK24yzOQILo8QqxINik0YIVu1NdaG
srQQFuiKcbl+xPV8V20vrZxcH1QWFgw7WC6XZkYTuoUxyIL0YdjQUh6smuw5
r6Pe9EEveldeHKQxdIFYN73yM3esJxFA15JjzjL6eLlQbyLN4IoqrCoVfZoO
9rnv5rcFly/Ee4hQZI4E6Xb6H/0FgUDYLkmwQN8JwHgZd0zzbhkE103Hn+uv
4XhIH3/cbTTMD/tT4jc7h/+mkITHhR0xrNO5I1RE+eBsMOosKC9ttUzRKZtJ
qoxc98BFzRRp6Dmb1DTvQhmfSyBCL1gK+jnHvWtAyKWjuLYfeY5Z9UCNrvAe
Btl6k3cLjanJuMgva5obTXiQS3M7HCQ3YPKpH0pV5zZ3HOen/nIph7g/FguG
7bAmabeMtdYZt6A1rP1kXK67pcZJaHPcYIYYVkdFqWhjKZ+iYruNqc42AGGC
+uNIJ5l8dJ7IJcUtc3sqj+f1ALKq56N/oyF7iwpOHMNKQC/CBcYNAhKf+gHL
rer7rFhyTVkv4woKtRsGAnybwmckOrs+1BnsboeMeHT4cl/pqWpXE7kjwyeI
sQdHzpaeGuvVn0LQzZlAiilYi0nx1doZUK4XepPNQOD07jThjqxGKjrx7gUP
V7bY271qgsE+Ta6EOYoG0jaHQw+GGbAH/RqmX+AyXPFK0TgfRmCxKA06QrxT
p+2FjEeBw/PGExA59T2AifKbBsOGrhH8thK67sWhdKao4j1YzoDrJw5p8oni
GxuGo/5RrUusFYLm2OTlYvCwOV/S90QPs+XA9moyEM0CKNz9m8RO5xIsSvmu
Q1fbhCiX2lkH003pHATzi29k0SiAQ8PJZBWkRPG2thxh1hxrierLdGPkO/GZ
kt7VotnWelONoh/yT3VyA/imWSo+lnN/2xQ+ZQnVVT9leje5rVfYylUziqWp
K8KaadZMjSST5HwVNilVtO9akgZ8WQlFbfGemQbDs62kvFq0RDemaSDaJejo
JSE1ZT3op2S4uwY9pT2WYnEjsqKfMIH3lsMk62S+oiRoCbtQhBo9O3bA7Zv2
na4dRhgIWVFZ4JCyvR+i+TteBuCcNgeRE63vch0i6AZPNEHYDkgrSDt12adp
KJeMt2GrxhYlza1UB7TVlG5I7+7jYZi1HlaE8AN0KVxQpoddMrdkZHctHxBW
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
rDb2Rv8PhIvAqMWtAAA=

-->

</rfc>
