<?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.2.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-dinuzzo-best-protocol-01" category="info" submissionType="independent" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.0 -->
  <front>
    <title abbrev="BEST">BEST: The Behavioral State Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-dinuzzo-best-protocol-01"/>
    <author initials="R." surname="Di Nuzzo" fullname="Riccardo Di Nuzzo">
      <organization/>
      <address>
        <email>riccardo@dinuzzo.it</email>
      </address>
    </author>
    <date year="2026" month="August" day="29"/>
    <area/>
    <workgroup/>
    <keyword>CQRS</keyword>
    <keyword>CloudEvents</keyword>
    <keyword>discovery</keyword>
    <keyword>agent interoperability</keyword>
    <abstract>
      <?line 59?>

<t>The Behavioral State Protocol (BEST) defines a discovery-first, behaviour-oriented interaction surface for domain services: the commands a service accepts, the events it publishes, and optionally the queries it answers and the multi-step recipes (workflows) it publishes. Services self-describe through a manifest at the well-known URI "/.well-known/best"; messages use a conformant profile of the CloudEvents 1.0 envelope described by JSON Schema. BEST deliberately specifies only the interaction surface -- never a service's internal architecture, storage, or execution model -- allowing independent implementations across any runtime, language, or transport to interoperate without bespoke integration.</t>
    </abstract>
  </front>
  <middle>
    <?line 63?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>When an organisation operates multiple autonomous callers -- AI agents, process managers, integrations -- against heterogeneous systems, each pairing of caller and system tends to require a bespoke integration: the caller must be told, out of band, which operations the system accepts, what the payloads look like, how results are delivered, and how to associate a result with the request that caused it.</t>
      <t>Command Query Responsibility Segregation (CQRS) provides the underlying semantics BEST builds on: writes are expressed as commands, and the results of processing are recorded as events. What CQRS does not provide is a common, machine-readable way for a caller to discover a service's command surface, observe its events, and correlate outcomes, without reading documentation or source code.</t>
      <t>BEST fills this gap with five elements:</t>
      <ol spacing="normal" type="1"><li>
          <t>A discovery manifest at the well-known URI "/.well-known/best" describing the service's capabilities, transports, and authentication requirements.</t>
        </li>
        <li>
          <t>A single command-ingestion entry point, "POST /commands", routed by the message "type" attribute rather than by URL structure.</t>
        </li>
        <li>
          <t>A queryable event log, "GET /events", plus optional push delivery, through which the immutable facts produced by processing are observed; a first-class correlation identifier ties each event to the command that caused it.</t>
        </li>
        <li>
          <t>An optional synchronous read surface, "GET /queries/{schema}", for reading current state before issuing a command.</t>
        </li>
        <li>
          <t>An optional read-only recipe surface, "GET /workflows", publishing named multi-step sequences of catalogue operations (<xref target="workflows"/>).</t>
        </li>
      </ol>
      <t>BEST is deliberately not REST: there are no resources to manipulate and no CRUD verb semantics. Callers invoke named operations (commands such as "ProposeCounter" or "SubmitOrder") and observe the facts that result (events such as "CounterProposed"). Resource-oriented endpoints remain valid parts of a service's own API but are outside BEST's scope.</t>
      <t>The protocol's design principles are: protocol-first (the specification defines the surface; implementations derive from it); compose, don't invent (the envelope is a CloudEvents profile <xref target="CLOUDEVENTS"/>, contracts are JSON Schema <xref target="JSONSCHEMA"/>, discovery uses a well-known URI <xref target="RFC8615"/>, tenancy uses URI templates <xref target="RFC6570"/>); discoverable by default; transport-agnostic; modular (implementers expose only the capabilities they support); and implementation-agnostic (no prescribed language, framework, storage, or execution model -- a BEST service can equally be an AI agent, a deterministic backend, a sensor, or a human-operated workflow).</t>
      <t>This document specifies the protocol as released in version 0.9.6 of the living specification <xref target="BESTSPEC"/>.</t>
      <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?>

<dl>
          <dt>Service:</dt>
          <dd>
            <t>A BEST-compliant domain service that accepts commands and publishes events.</t>
          </dd>
          <dt>Command:</dt>
          <dd>
            <t>An intent to change the system, sent to a service by any caller.</t>
          </dd>
          <dt>Event:</dt>
          <dd>
            <t>An immutable domain fact published by a service as the result of processing.</t>
          </dd>
          <dt>Query:</dt>
          <dd>
            <t>A synchronous read of current state (optional capability).</t>
          </dd>
          <dt>Workflow:</dt>
          <dd>
            <t>A published, read-only recipe: a named sequence of catalogue operations with per-step guidance (optional capability).</t>
          </dd>
          <dt>Manifest:</dt>
          <dd>
            <t>The JSON document served at "/.well-known/best" describing a service's capabilities, transports, and authentication requirements.</t>
          </dd>
          <dt>Capability:</dt>
          <dd>
            <t>A named, composable unit of protocol surface declared in the manifest. Names use reverse-domain notation; the "io.best." prefix is reserved for this specification.</t>
          </dd>
          <dt>Correlation identifier:</dt>
          <dd>
            <t>The value of the "correlationid" envelope attribute: the identifier that ties a command to the events its processing produces, across an arbitrarily long chain of commands and events.</t>
          </dd>
        </dl>
      </section>
    </section>
    <section anchor="message-envelope">
      <name>Message Envelope</name>
      <t>BEST messages are CloudEvents <xref target="CLOUDEVENTS"/>: every valid BEST message is a valid CloudEvents 1.0 message, so CloudEvents SDKs, brokers, and validators process BEST traffic unchanged. BEST is a profile that restricts and extends the envelope as follows: the "type" attribute <bcp14>MUST</bcp14> be PascalCase; "datacontenttype" <bcp14>MUST</bcp14> be "application/json"; "dataschema" <bcp14>MUST</bcp14> be present on commands (it <bcp14>MAY</bcp14> be absent on events, which are then untyped); one extension attribute, "correlationid", is defined; and consumers <bcp14>MUST</bcp14> ignore unknown envelope attributes rather than reject messages carrying them.</t>
      <table>
        <name>BEST envelope attributes</name>
        <thead>
          <tr>
            <th align="left">Attribute</th>
            <th align="left">Commands</th>
            <th align="left">Events</th>
            <th align="left">Description</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">specversion</td>
            <td align="left">required</td>
            <td align="left">required</td>
            <td align="left">Always "1.0".</td>
          </tr>
          <tr>
            <td align="left">id</td>
            <td align="left">required</td>
            <td align="left">required</td>
            <td align="left">Unique message identifier (UUID recommended), unique within the scope of "source". For commands this is the idempotency key.</td>
          </tr>
          <tr>
            <td align="left">source</td>
            <td align="left">required</td>
            <td align="left">required</td>
            <td align="left">URI-reference <xref target="RFC3986"/> identifying the origin of the message. An absolute URI is recommended; a relative reference (a service name or routing key) is valid. Caller-declared; never treated as authenticated identity (see Security Considerations).</td>
          </tr>
          <tr>
            <td align="left">type</td>
            <td align="left">required</td>
            <td align="left">required</td>
            <td align="left">Message type in PascalCase (e.g. "ProposeCounter", "CounterProposed"). For commands, this <bcp14>MUST</bcp14> match a type in the command catalogue; it is the routing key.</td>
          </tr>
          <tr>
            <td align="left">datacontenttype</td>
            <td align="left">required</td>
            <td align="left">required</td>
            <td align="left">Always "application/json".</td>
          </tr>
          <tr>
            <td align="left">dataschema</td>
            <td align="left">required</td>
            <td align="left">optional</td>
            <td align="left">Absolute URI of the JSON Schema for "data". For commands, the catalogue's "dataschema" value. Events without "dataschema" are untyped: the consumer interprets "data".</td>
          </tr>
          <tr>
            <td align="left">correlationid</td>
            <td align="left">optional</td>
            <td align="left">conditional</td>
            <td align="left">Extension attribute carrying the correlation identifier (see <xref target="correlation"/>). Lowercase on the wire, per CloudEvents attribute-naming rules.</td>
          </tr>
          <tr>
            <td align="left">time</td>
            <td align="left">required</td>
            <td align="left">required</td>
            <td align="left">Timestamp of message creation (RFC 3339).</td>
          </tr>
          <tr>
            <td align="left">data</td>
            <td align="left">required</td>
            <td align="left">required</td>
            <td align="left">The domain payload. For commands, validated against the catalogue schema before queuing. For events, semantically opaque to the protocol.</td>
          </tr>
        </tbody>
      </table>
      <t>An example command and the event its processing produced:</t>
      <artwork><![CDATA[
{
  "specversion": "1.0",
  "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "source": "https://pm.example.com/negotiation-agent",
  "type": "ProposeCounter",
  "datacontenttype": "application/json",
  "dataschema":
    "https://api.example.com/commands/propose-counter/1.0",
  "time": "2025-07-01T10:30:00Z",
  "data": { "salary": 100000, "startDate": "2025-09-01" }
}
]]></artwork>
      <artwork><![CDATA[
{
  "specversion": "1.0",
  "id": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
  "source": "https://api.example.com/negotiation",
  "type": "CounterProposed",
  "datacontenttype": "application/json",
  "dataschema":
    "https://api.example.com/events/counter-proposed/1.0",
  "correlationid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "time": "2025-07-01T10:30:01Z",
  "data": { "salary": 100000, "startDate": "2025-09-01",
            "contractId": "contract-42" }
}
]]></artwork>
    </section>
    <section anchor="discovery">
      <name>Discovery</name>
      <t>Every BEST endpoint serves a manifest at the well-known URI "/.well-known/best" (<xref target="RFC8615"/>) with media type "application/json", over HTTPS. This resource <bcp14>MUST</bcp14> be retrievable without authentication; every other endpoint <bcp14>MAY</bcp14> require the credentials declared in the manifest's "authentication" object. The path is canonical; consumers <bcp14>MUST NOT</bcp14> assume a ".json" file extension. The "best" suffix is not currently registered in the Well-Known URIs registry (see IANA Considerations).</t>
      <t>The manifest root is a single "best" object:</t>
      <artwork><![CDATA[
{
  "best": {
    "version": "0.9.6",
    "authentication": { ... },
    "tenants": { ... },
    "services": { ... },
    "capabilities": [ ... ],
    "agents": [ ... ]
  }
}
]]></artwork>
      <dl>
        <dt>version (required):</dt>
        <dd>
          <t>The protocol version implemented, as MAJOR.MINOR.PATCH.</t>
        </dd>
        <dt>services (required):</dt>
        <dd>
          <t>An object mapping service keys to service definitions. Each service declares "version" and "description" and one or more transport bindings: "http" (the baseline -- its "endpoint" is the consumer-facing base URL to which all capability paths are appended) and optionally "mcp" (see <xref target="transports"/>). Multiple transports expose the same capability surface; they are alternative access methods, never separate operation sets.</t>
        </dd>
        <dt>capabilities (required):</dt>
        <dd>
          <t>An array of capability entries. Each carries "name" (reverse-domain identifier), "version", "description", "spec" and "schema" URLs (required for "io.best." capabilities; optional for custom ones), an optional "service" key naming the implementing service when the capability name prefix does not match it, an optional machine-readable "endpoints" array of { method, path } pairs appended to the service's "http.endpoint", an optional "status", and -- on the events capability -- an optional "push" object declaring supported push channels ("sse", "mcp").</t>
        </dd>
        <dt>authentication (optional):</dt>
        <dd>
          <t>Credential requirements for every endpoint other than the manifest itself: "type" ("none", "bearer", "apiKey", or "oauth2") plus, per type, "scheme", "in", "scopes", "tokenUrl", and a "docs" URL. Consumers <bcp14>MUST</bcp14> read this object before calling any other endpoint. Hosts requiring credentials <bcp14>SHOULD</bcp14> set "docs" to an onboarding page.</t>
        </dd>
        <dt>tenants (optional):</dt>
        <dd>
          <t>Multi-tenant discovery (see <xref target="multitenancy"/>).</t>
        </dd>
        <dt>agents (optional):</dt>
        <dd>
          <t>A snapshot of service descriptors hosted by the endpoint: each descriptor carries "id", "name", "accepts" and "produces" (PascalCase event type strings), "status" ("running", "paused", "stopped", or "error"), and optional opaque "metadata". This array is a discovery hint, not a live directory; BEST defines no registry endpoint. Implementations that manage services dynamically expose that as an ordinary domain (commands and queries) under their own namespace.</t>
        </dd>
      </dl>
      <t>Capability status semantics: "active" (the default) means every required endpoint exists and is callable; declaring "active" while returning 404 or 501 on a required route is a conformance violation. "partial" means a subset is implemented, which <bcp14>MUST</bcp14> be documented in the "endpoints" array. "planned" means nothing is callable yet.</t>
      <t>Individual command types are domain data, not capabilities: a specific type such as "ProposeCounter" <bcp14>MUST NOT</bcp14> appear as a manifest capability entry. The capability declares the command surface; the types are discovered at runtime via "GET /commands".</t>
      <section anchor="multitenancy">
        <name>Multi-Tenancy</name>
        <t>A tenant identifier in BEST is an opaque string scoping a manifest to a context -- a customer account, a user, a workspace, or the platform's own administrative context. Multi-tenancy applies when callers operate in isolated data scopes, even when every tenant shares an identical capability surface.</t>
        <t>The root manifest of a multi-tenant host declares a URI template (<xref target="RFC6570"/>):</t>
        <artwork><![CDATA[
"tenants": {
  "manifest": "https://api.example.com/.well-known/best/{tenantId}"
}
]]></artwork>
        <t>The following rules apply:</t>
        <ol spacing="normal" type="1"><li>
            <t>"{tenantId}" is the only permitted template variable. The root manifest <bcp14>MUST</bcp14> include "tenants.manifest" if tenant-scoped capabilities exist, and <bcp14>MUST NOT</bcp14> declare tenant-scoped capabilities itself; they appear only in tenant manifests. Root-level capabilities the host can fulfil without tenant context <bcp14>MAY</bcp14> remain.</t>
          </li>
          <li>
            <t>The expanded URI returns a fully self-contained tenant manifest: its "http.endpoint" is pre-scoped, every "dataschema" URI is fully resolved, no "{tenantId}" placeholder appears anywhere, and it carries no "tenants" object of its own. Consumers treat it exactly as a single-tenant manifest.</t>
          </li>
          <li>
            <t>Fetching the tenant manifest requires at most the credential declared in the root "authentication" object -- never a tenant identifier header, since the path already carries it.</t>
          </li>
          <li>
            <t>URI templating is valid only in "tenants.manifest". Everywhere else in the protocol, URIs <bcp14>MUST</bcp14> be fully resolved.</t>
          </li>
        </ol>
      </section>
    </section>
    <section anchor="commands">
      <name>Commands</name>
      <t>Commands are intents to change a domain service. The service validates, queues, and processes them asynchronously; results surface as events (<xref target="events"/>).</t>
      <table>
        <name>Command endpoints</name>
        <thead>
          <tr>
            <th align="left">Method</th>
            <th align="left">Path</th>
            <th align="left">Description</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">GET</td>
            <td align="left">/commands</td>
            <td align="left">Command catalogue: all accepted command types with schema URIs</td>
          </tr>
          <tr>
            <td align="left">POST</td>
            <td align="left">/commands</td>
            <td align="left">Send a command (BEST envelope); validates, queues, returns 201</td>
          </tr>
          <tr>
            <td align="left">GET</td>
            <td align="left">/commands/{schema}/{version}</td>
            <td align="left">JSON Schema document for one command type and version</td>
          </tr>
        </tbody>
      </table>
      <section anchor="catalogue">
        <name>Catalogue</name>
        <t>"GET /commands" returns the list of command types the service accepts. Each entry carries "schema" (a kebab-case name used as the "{schema}" path segment; distinct from the PascalCase envelope "type", of which it is typically the kebab-case form), "version", "dataschema" (a resolvable URI that is the exact value to place on a command envelope, resolving to "GET /commands/{schema}/{version}" on the same surface), an optional "description", an optional "workflows" array of workflow identifiers (see <xref target="workflows"/>), and an optional "impact" annotation (see <xref target="impact"/>).</t>
        <t>The schema document returned by "GET /commands/{schema}/{version}" has media type "application/schema+json". It <bcp14>MAY</bcp14> declare a "produces" array of PascalCase event types the command can raise (e.g. ["CounterProposed", "NegotiationFailed"]). Failure outcomes are ordinary events in that list; naming conventions such as a "Failed" suffix are service-defined. BEST defines no timeout protocol: services <bcp14>SHOULD</bcp14> document expected processing times and <bcp14>SHOULD</bcp14> always publish a failure event rather than silently dropping a command; callers decide how long to wait.</t>
      </section>
      <section anchor="impact">
        <name>Impact Annotations</name>
        <t>Some commands do not share a blast radius with the rest of the catalogue: they move money, destroy data, or cannot be undone. The optional "impact" annotation declares this, so a consumer can discover which commands warrant extra care before submission:</t>
        <artwork><![CDATA[
{
  "schema": "submit-order",
  "version": "1.0",
  "dataschema":
    "https://api.example.com/commands/submit-order/1.0",
  "description": "Submit a market order",
  "impact": {
    "categories": ["financial"],
    "confirmation": "required",
    "warning": "Places a real order on your broker account.
                Capital is at risk."
  }
}
]]></artwork>
        <dl>
          <dt>categories (required):</dt>
          <dd>
            <t>The kinds of impact, as named values: "financial" (moves money or puts capital at risk), "destructive" (removes data or state), "irreversible" (no compensating command), "compliance" (bypasses or alters a compliance control). The vocabulary is open; consumers <bcp14>MUST</bcp14> treat unknown values as high-impact.</t>
          </dd>
          <dt>confirmation (required):</dt>
          <dd>
            <t>"required" means a consumer acting on behalf of a human <bcp14>MUST NOT</bcp14> submit the command without explicit, per-submission confirmation from that human. "recommended" means the consumer <bcp14>SHOULD</bcp14> confirm but <bcp14>MAY</bcp14> proceed where the human has durably authorised this class of operation.</t>
          </dd>
          <dt>warning (optional):</dt>
          <dd>
            <t>A human-readable warning the consumer <bcp14>SHOULD</bcp14> surface to the human, substantially intact, before asking for confirmation.</t>
          </dd>
        </dl>
        <t>The annotation is carried on both surfaces that describe an operation -- the catalogue entry and the schema document, as a top-level member -- and both <bcp14>MUST</bcp14> carry the same value. It is descriptive, not enforcement: it tells a well-behaved consumer what to do before submitting, and never substitutes for the server-side controls on high-impact commands (see Security Considerations), because a server cannot rely on clients honouring it. Service-to-service automation with no human principal is governed by those server-side controls alone; the annotation does not require inventing a human to ask.</t>
      </section>
      <section anchor="ingestion-semantics">
        <name>Ingestion Semantics</name>
        <t>"POST /commands" processing proceeds as follows:</t>
        <ol spacing="normal" type="1"><li>
            <t>Validate that the required envelope attributes are present.</t>
          </li>
          <li>
            <t>Look up the validation schema in the server's own catalogue, keyed by a server-owned identifier (the "type", or the schema name carried in "dataschema"). The inbound "dataschema" value is a selector, not a location: servers <bcp14>MUST NOT</bcp14> fetch a caller-supplied "dataschema" URI (see Security Considerations). Schema selection, authorisation, and dispatch <bcp14>MUST</bcp14> key on the same identifier.</t>
          </li>
          <li>
            <t>Validate "data" against that schema.</t>
          </li>
          <li>
            <t>If valid, durably queue the command and return 201 with a JSON body carrying "id" (the command's envelope id) and "correlationId" (the effective correlation identifier, <xref target="correlation"/>). If invalid, return 400.</t>
          </li>
        </ol>
        <t>The envelope "id" is an idempotency key: servers <bcp14>MUST</bcp14> detect duplicate submissions (same "id" and authenticated source) within a retention window, and a reused "id" with a different payload <bcp14>MUST</bcp14> be rejected with 409. The "type" attribute is the routing key; "source" <bcp14>MUST NOT</bcp14> be the sole routing key.</t>
        <t>201 signals that the command was durably recorded and processing will happen. A server that cannot durably enqueue before responding <bcp14>MAY</bcp14> return 202 instead, which carries no durability guarantee.</t>
      </section>
      <section anchor="correlation">
        <name>Correlation</name>
        <t>BEST defines no synchronous command response; the result of processing is one or more published events, tied to the command by the "correlationid" envelope attribute.</t>
        <t>The caller <bcp14>MAY</bcp14> set "correlationid" on a command; when it is absent, the server adopts the command's "id" as the correlation identifier. In both cases the 201 response echoes the effective value as "correlationId". Every event produced by processing the command <bcp14>MUST</bcp14> carry that identifier in its "correlationid" attribute, so any consumer -- including one that never saw the command -- can match events to their originating submission. Events not caused by a command <bcp14>MAY</bcp14> omit the attribute.</t>
        <t>In a multi-step process, a follow-up command issued in reaction to an event <bcp14>SHOULD</bcp14> carry the same "correlationid", allowing one identifier to traverse a chain of commands and events across services. Correlation and idempotency are separate concerns: "id" remains unique per message, while "correlationid" groups messages into a process.</t>
        <artwork><![CDATA[
POST /commands                    -> 201 { "id": "abc123",
                                          "correlationId": "abc123" }
GET  /events?correlationId=abc123        -> what has already happened
GET  /events/stream?correlationId=abc123 -> what happens next (push)
]]></artwork>
      </section>
    </section>
    <section anchor="events">
      <name>Events</name>
      <t>Events are immutable facts published as the result of processing.</t>
      <table>
        <name>Event endpoints</name>
        <thead>
          <tr>
            <th align="left">Method</th>
            <th align="left">Path</th>
            <th align="left">Description</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">GET</td>
            <td align="left">/events</td>
            <td align="left">Historical query: paginated, filterable log of past events; may double as the event catalogue</td>
          </tr>
          <tr>
            <td align="left">GET</td>
            <td align="left">/events/stream</td>
            <td align="left">Live stream (Server-Sent Events): events produced after the connection opens</td>
          </tr>
          <tr>
            <td align="left">GET</td>
            <td align="left">/events/{schema}/{version}</td>
            <td align="left">JSON Schema document for one event type and version</td>
          </tr>
        </tbody>
      </table>
      <t>"GET /events" and "GET /events/stream" are complementary: a caller loads history first, then opens the stream.</t>
      <t>An event with "dataschema" is typed: consumers can fetch the schema and validate. Without it, the event is untyped and the consumer interprets "data"; the envelope ("type", "source", "id", "correlationid", "time") still supports routing and correlation. Both patterns can coexist in one service.</t>
      <t>BEST makes no replay guarantee: "GET /events" returns whatever the server currently exposes -- a full log, a recent window, or a view of domain records mapped to the event shape at query time. Clients <bcp14>MUST NOT</bcp14> assume completeness, ordering, or replay fidelity. For reliable point-in-time delivery, callers use a push channel.</t>
      <section anchor="historical-query">
        <name>Historical Query</name>
        <t>Query parameters on "GET /events", all optional and combinable: "type" (filter by envelope type), "correlationId" (only events whose "correlationid" attribute matches), "source", "from" and "to" (RFC 3339 time-range bounds, inclusive), "limit", and "after" (an opaque pagination cursor from a previous response's "nextCursor"). Responses are an object with an "events" array and, when further pages exist, a "nextCursor" string.</t>
        <t>"GET /events" <bcp14>MAY</bcp14> additionally serve catalogue entries mirroring the command catalogue: "schema", "version", optional "dataschema" (omitted for untyped events), and "description", which for untyped events is the primary documentation.</t>
      </section>
      <section anchor="live-stream">
        <name>Live Stream</name>
        <t>"GET /events/stream" is requested with "Accept: text/event-stream" plus credentials; optional filters are "correlationId", "type", and "source". Each event arrives as an SSE "data" field containing the envelope JSON, with the envelope "id" echoed as the SSE event id. On reconnection, clients send "Last-Event-ID" and the server replays anything produced after it. Servers <bcp14>SHOULD</bcp14> send keepalive comments and <bcp14>MAY</bcp14> close the stream after inactivity or a terminal event; clients <bcp14>MUST</bcp14> handle reconnection and <bcp14>MUST NOT</bcp14> assume the stream is lossless.</t>
      </section>
      <section anchor="delivery-channels">
        <name>Delivery Channels</name>
        <t>The events capability declares its push channels in the manifest's "push" object. Browser applications, command-line tools, and local agents use SSE; LLM clients with an active MCP session use MCP server-to-client notifications (<xref target="transports"/>); every other caller polls "GET /events", which is always available.</t>
      </section>
    </section>
    <section anchor="queries">
      <name>Queries</name>
      <t>Queries are synchronous reads of current state -- the read-before-write complement to commands (for example, an agent lists broker accounts before referencing one in a command). The capability is optional and declared in the manifest like any other.</t>
      <table>
        <name>Query endpoints</name>
        <thead>
          <tr>
            <th align="left">Method</th>
            <th align="left">Path</th>
            <th align="left">Description</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">GET</td>
            <td align="left">/queries</td>
            <td align="left">Query catalogue: same entry shape as the command catalogue</td>
          </tr>
          <tr>
            <td align="left">GET</td>
            <td align="left">/queries/{schema}/{version}</td>
            <td align="left">Query schema document</td>
          </tr>
          <tr>
            <td align="left">GET</td>
            <td align="left">/queries/{schema}</td>
            <td align="left">Execute: parameters as query string; returns 200 with the result body</td>
          </tr>
        </tbody>
      </table>
      <t>The query schema document has up to three sections: "description", "parameters" (a JSON Schema for accepted query-string parameters, omitted when the query takes none), and "response" (a JSON Schema for the result body; required). Query catalogue entries and schema documents <bcp14>MAY</bcp14> carry the same "workflows" cross-link array as their command counterparts (<xref target="workflows"/>). Execution returns 400 for missing or invalid parameters and 404 for an unknown schema name.</t>
      <t>Queries are not a query language (no filter expressions, joins, or aggregations), not a REST resource hierarchy (no per-item paths), and not event sourcing (they return current state as the service projects it; historical facts live in "GET /events").</t>
    </section>
    <section anchor="workflows">
      <name>Workflows</name>
      <t>Workflows are published recipes: read-only, named sequences of catalogue operations with per-step guidance, for multi-step processes whose order is a fixed, well-known happy path. The capability ("io.best.agents.workflows") is optional and strictly descriptive: the service never executes, retries, tracks, or branches the steps; the caller -- typically an autonomous agent -- sends each operation itself and waits for its outcome before proceeding.</t>
      <table>
        <name>Workflow endpoints</name>
        <thead>
          <tr>
            <th align="left">Method</th>
            <th align="left">Path</th>
            <th align="left">Description</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">GET</td>
            <td align="left">/workflows</td>
            <td align="left">Workflow index: "id", "name", "description" per recipe, never the steps</td>
          </tr>
          <tr>
            <td align="left">GET</td>
            <td align="left">/workflows/{id}</td>
            <td align="left">One full recipe with its ordered steps; 404 for an unknown id</td>
          </tr>
        </tbody>
      </table>
      <t>The index is deliberately shallow, so a consumer can hold the entire list in one read and choose; full recipes are fetched one at a time. Workflow identifiers are stable, service-defined, URL-path-safe strings (reverse-domain notation or kebab-case); renaming an identifier is a breaking change for anything linking to it.</t>
      <t>Each step of a recipe carries "kind" ("command" or "query": whether the step is a "POST /commands" or a "GET /queries/{schema}"), "dataschema" (the resolvable URI of the operation's schema document in the service's live catalogue -- recipes reference the catalogue and never duplicate it, so they cannot drift from the real contracts), an optional "optional" flag (true when the step applies only in some runs), and optional "guidance" (how the step combines with the others: what to carry forward, what to wait for, when to skip).</t>
      <artwork><![CDATA[
GET /workflows/io.example.workflows.onboard-a-worker
{
  "id": "io.example.workflows.onboard-a-worker",
  "name": "Onboard a worker",
  "description": "Create the engagement, assign a contact, and
    invite the worker. Drive each step yourself and wait for its
    outcome before the next.",
  "steps": [
    { "kind": "command",
      "dataschema":
        "https://api.example.com/commands/submit-employee/1.0",
      "guidance": "Creates the engagement. Keep the correlationId
        -- every later step references it." },
    { "kind": "query",
      "dataschema":
        "https://api.example.com/queries/list-employees/1.0",
      "guidance": "Poll until the new engagement appears --
        commands are asynchronous." },
    { "kind": "command",
      "dataschema":
        "https://api.example.com/commands/invite-worker/1.0",
      "optional": true,
      "guidance": "Only when the user wants the invitation sent
        immediately." }
  ]
}
]]></artwork>
      <t>Cross-linking is the single discoverability mechanism: an operation advertises the recipes it belongs to through the "workflows" array -- the identifiers of the published workflows the operation participates in -- carried on its catalogue entry and on its schema document as a top-level member (JSON Schema tolerates unknown keywords; BEST names this one, and validators ignore it). Both surfaces carry the same array, so the pointer is present at whichever read a consumer performs before acting. Servers publishing workflows <bcp14>SHOULD</bcp14> stamp it in both places for every operation that appears in a recipe; consumers <bcp14>SHOULD</bcp14> fetch the referenced recipe before composing a multi-step sequence themselves. Human-readable descriptions are free to mention recipes, but the protocol attaches no discoverability role to prose.</t>
      <t>The capability's boundary is deliberate: the moment a service executes, retries, persists, or branches steps on the caller's behalf, it has built an execution runtime, which is out of BEST's scope. Execution engines belong behind the service, not behind this capability.</t>
    </section>
    <section anchor="transports">
      <name>Transports</name>
      <t>HTTP is the baseline transport: every conformant service exposes it. All requests and responses are "application/json" (schema documents are "application/schema+json"; the event stream is "text/event-stream").</t>
      <t>Every capability path is appended to the service's "http.endpoint"; the leading slash is a separator, not a root-relative indicator. For example, with "http.endpoint" of "https://api.example.com/tenants/acme", the path "/commands" resolves to "https://api.example.com/tenants/acme/commands". The "http.endpoint" value <bcp14>MUST</bcp14> be the consumer-facing public address, never an internal backend or service-mesh URL.</t>
      <t>Authentication follows the manifest's "authentication" object: "bearer" maps to "Authorization: Bearer" credentials; "apiKey" to a header or query parameter named by the declaration. Every endpoint except "GET /.well-known/best" requires credentials when they are declared.</t>
      <t>All error responses use a consistent body:</t>
      <artwork><![CDATA[
{ "error": { "code": "SCHEMA_NOT_FOUND",
             "message": "Unknown command schema 'foo'",
             "details": {} } }
]]></artwork>
      <table>
        <name>HTTP status codes</name>
        <thead>
          <tr>
            <th align="left">Status</th>
            <th align="left">Meaning</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">200</td>
            <td align="left">Success with body (queries, event lists, catalogues, schema documents)</td>
          </tr>
          <tr>
            <td align="left">201</td>
            <td align="left">Command accepted and durably queued</td>
          </tr>
          <tr>
            <td align="left">202</td>
            <td align="left">Accepted without durability guarantee</td>
          </tr>
          <tr>
            <td align="left">400</td>
            <td align="left">Invalid request body or parameters (schema validation failure)</td>
          </tr>
          <tr>
            <td align="left">401</td>
            <td align="left">Missing or invalid credentials (only when authentication is declared)</td>
          </tr>
          <tr>
            <td align="left">404</td>
            <td align="left">Unknown route, schema name, or version</td>
          </tr>
          <tr>
            <td align="left">409</td>
            <td align="left">Duplicate command "id" with a different payload</td>
          </tr>
          <tr>
            <td align="left">413</td>
            <td align="left">Request body exceeds server limits</td>
          </tr>
          <tr>
            <td align="left">422</td>
            <td align="left">Semantic error (capability not supported)</td>
          </tr>
          <tr>
            <td align="left">500</td>
            <td align="left">Internal error</td>
          </tr>
        </tbody>
      </table>
      <t>A Model Context Protocol <xref target="MCP"/> binding <bcp14>MAY</bcp14> additionally be declared in a service's "mcp" transport object ("transport", "server", optional "push" and a transport-scoped "authentication" object). Every MCP tool wraps exactly one HTTP endpoint; the binding exposes the same logical capability surface to LLM tooling that cannot call HTTP APIs directly. When "push" is true, the server <bcp14>MAY</bcp14> deliver events as MCP server-to-client notifications, matched by correlation identifier.</t>
    </section>
    <section anchor="conformance">
      <name>Conformance</name>
      <t>A BEST-compliant endpoint <bcp14>MUST</bcp14>:</t>
      <ol spacing="normal" type="1"><li>
          <t>Expose "GET /.well-known/best" returning a valid manifest: status 200, publicly retrievable, "application/json".</t>
        </li>
        <li>
          <t>Include at least one service in the manifest.</t>
        </li>
        <li>
          <t>List all supported capabilities with valid schema URLs.</t>
        </li>
        <li>
          <t>Implement the HTTP surface for every listed capability.</t>
        </li>
        <li>
          <t>Return valid JSON conforming to the referenced schemas.</t>
        </li>
        <li>
          <t>Use the status codes and error format of <xref target="transports"/>.</t>
        </li>
        <li>
          <t>Declare authentication in the manifest, or omit the declaration for public endpoints; an undocumented 401 is non-conformant.</t>
        </li>
      </ol>
      <t>Per-capability required endpoints, for capabilities declared "active" ("partial" capabilities are exempt but <bcp14>MUST</bcp14> document their available routes in "endpoints"):</t>
      <table>
        <name>Required endpoints per capability</name>
        <thead>
          <tr>
            <th align="left">Capability</th>
            <th align="left">Required endpoints</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">io.best.agents.commands</td>
            <td align="left">GET /commands, POST /commands</td>
          </tr>
          <tr>
            <td align="left">io.best.agents.events</td>
            <td align="left">GET /events</td>
          </tr>
          <tr>
            <td align="left">io.best.agents.queries</td>
            <td align="left">GET /queries, GET /queries/{schema}/{version}, GET /queries/{schema}</td>
          </tr>
          <tr>
            <td align="left">io.best.agents.workflows</td>
            <td align="left">GET /workflows, GET /workflows/{id}</td>
          </tr>
        </tbody>
      </table>
      <t>Multi-tenant root manifests additionally follow the rules of <xref target="multitenancy"/>.</t>
      <t>Conformance does not require any specific language, framework, or architecture; any specific event transport; MCP support; or AI capabilities -- a BEST service can be deterministic or human-operated.</t>
      <t>Versioning is semantic (MAJOR.MINOR.PATCH) at the manifest root, per service, and per capability. Consumers <bcp14>MUST</bcp14> ignore unknown fields for forward compatibility. All BEST identifiers use reverse-domain notation; the "io.best." prefix is reserved for this specification.</t>
      <t>This document establishes no new IANA registries (see IANA Considerations).</t>
    </section>
    <section anchor="implementation-status">
      <name>Implementation Status</name>
      <t>This section records the implementation status at the time of writing, per <xref target="RFC7942"/>; it is to be removed by the RFC Editor before publication.</t>
      <t>Two production deployments of BEST exist -- dotquant.io (fintech trading platform) and remundo.com (business platform) -- implemented as separate codebases by the specification's author, each exposing discovery, commands, events, and queries over the HTTP binding. A generic reference MCP server (@behavioralstate/best-mcp, npm) adapts any BEST endpoint for MCP-capable LLM clients, and a conformance validator (@behavioralstate/best-validate, npm) executes this document's conformance checklist against a live endpoint. No implementation independent of the specification author is known yet.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <dl>
        <dt>TLS:</dt>
        <dd>
          <t>Production endpoints <bcp14>MUST</bcp14> be served over HTTPS; MCP transports <bcp14>MUST</bcp14> provide TLS-equivalent confidentiality. Clients <bcp14>MUST</bcp14> validate certificates and <bcp14>MUST NOT</bcp14> send credentials over insecure transports.</t>
        </dd>
        <dt>Authentication surface:</dt>
        <dd>
          <t>"GET /.well-known/best" is the only endpoint defined as unauthenticated. "GET /events" <bcp14>MUST</bcp14> require authentication and tenant-scoped authorisation unless a stream is explicitly designated public. Distinct read and write scopes are <bcp14>RECOMMENDED</bcp14>. Because "POST /commands" is a single endpoint through which every named operation is invoked, coarse scopes are insufficient on their own: servers <bcp14>SHOULD</bcp14> enforce per-command authorisation policies per credential, evaluated deny-by-default on every submission.</t>
        </dd>
        <dt>High-impact commands:</dt>
        <dd>
          <t>Commands that are destructive, irreversible, or bypass a compliance control <bcp14>SHOULD</bcp14> require a control beyond the submitting credential -- human approval, a second principal, or out-of-band confirmation -- and that control <bcp14>MUST NOT</bcp14> be self-serviceable by the submitting credential. Servers <bcp14>SHOULD</bcp14> declare the "impact" annotation (<xref target="impact"/>) on such commands so consumers can discover the obligation; the annotation is advisory to consumers and never substitutes for the server-side control.</t>
        </dd>
        <dt>Schema-selection SSRF:</dt>
        <dd>
          <t>Servers select validation schemas from their own catalogue, keyed by a server-owned identifier. Servers <bcp14>MUST NOT</bcp14> fetch a caller-supplied "dataschema" URI: a caller-controlled fetch is a server-side request forgery vector. Servers <bcp14>SHOULD</bcp14> reject commands whose "dataschema" does not match a catalogue entry.</t>
        </dd>
        <dt>Replay protection:</dt>
        <dd>
          <t>The envelope "id" is an idempotency key. Servers <bcp14>MUST</bcp14> reject duplicates within a retention window, scoped to the authenticated tenant or sender; a reused "id" with a different payload <bcp14>MUST</bcp14> return 409.</t>
        </dd>
        <dt>Untrusted "source":</dt>
        <dd>
          <t>The "source" attribute is caller-declared. Servers <bcp14>MUST NOT</bcp14> grant permissions or make security decisions from it, and <bcp14>SHOULD</bcp14> either overwrite it with the verified principal for audit purposes or record both values. Payload fields naming a principal likewise carry no authority.</t>
        </dd>
        <dt>Tenant isolation:</dt>
        <dd>
          <t>Tenant context <bcp14>MUST</bcp14> derive from authenticated identity, never from caller-supplied paths, parameters, or payload fields. Caches, deduplication stores, and event streams <bcp14>MUST</bcp14> be isolated per tenant; knowledge of another tenant's identifier grants nothing.</t>
        </dd>
        <dt>Input limits:</dt>
        <dd>
          <t>Servers <bcp14>MUST</bcp14> bound request body size (returning 413), JSON nesting depth, collection sizes, string lengths, and attribute counts, and <bcp14>SHOULD</bcp14> rate-limit per authenticated client and per tenant.</t>
        </dd>
        <dt>Manifest content:</dt>
        <dd>
          <t>The manifest is publicly retrievable by design. Its content <bcp14>MUST</bcp14> be limited to information intended for unauthenticated disclosure: no internal addresses, credential material, or sensitive integration names.</t>
        </dd>
        <dt>Credential passthrough:</dt>
        <dd>
          <t>Intermediaries such as MCP servers or gateways forward caller credentials. Passthrough <bcp14>MUST</bcp14> be opt-in per connection and off by default, credentials <bcp14>MUST</bcp14> be forwarded only to the configured endpoint and never logged, explicit per-request credentials take precedence over ambient ones, and multi-user intermediaries <bcp14>SHOULD</bcp14> fail closed.</t>
        </dd>
      </dl>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
      <t>The protocol uses the well-known URI path prefix "/.well-known/best" (<xref target="RFC8615"/>). The "best" suffix is not registered in the "Well-Known URIs" registry: a provisional registration was requested in August 2026 and declined by the designated expert, under the registry's policy that single common words and short terms are registrable only by recognised standards development organisations. The suffix is therefore used without registration. Registration in that registry serves collision avoidance rather than being a precondition for use; readers should nonetheless be aware that unregistered use carries a collision risk, mitigated in practice by the same policy preventing other registrants from claiming the suffix. The author intends to pursue registration again should this specification be adopted within the IETF.</t>
      <t>This document establishes no new registries.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC3986" target="https://www.rfc-editor.org/info/rfc3986" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3986.xml">
          <front>
            <title>Uniform Resource Identifier (URI): Generic Syntax</title>
            <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee"/>
            <author fullname="R. Fielding" initials="R." surname="Fielding"/>
            <author fullname="L. Masinter" initials="L." surname="Masinter"/>
            <date month="January" year="2005"/>
            <abstract>
              <t>A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource. This specification defines the generic URI syntax and a process for resolving URI references that might be in relative form, along with guidelines and security considerations for the use of URIs on the Internet. The URI syntax defines a grammar that is a superset of all valid URIs, allowing an implementation to parse the common components of a URI reference without knowing the scheme-specific requirements of every possible identifier. This specification does not define a generative grammar for URIs; that task is performed by the individual specifications of each URI scheme. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="66"/>
          <seriesInfo name="RFC" value="3986"/>
          <seriesInfo name="DOI" value="10.17487/RFC3986"/>
        </reference>
        <reference anchor="RFC6570" target="https://www.rfc-editor.org/info/rfc6570" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6570.xml">
          <front>
            <title>URI Template</title>
            <author fullname="J. Gregorio" initials="J." surname="Gregorio"/>
            <author fullname="R. Fielding" initials="R." surname="Fielding"/>
            <author fullname="M. Hadley" initials="M." surname="Hadley"/>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <author fullname="D. Orchard" initials="D." surname="Orchard"/>
            <date month="March" year="2012"/>
            <abstract>
              <t>A URI Template is a compact sequence of characters for describing a range of Uniform Resource Identifiers through variable expansion. This specification defines the URI Template syntax and the process for expanding a URI Template into a URI reference, along with guidelines for the use of URI Templates on the Internet. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6570"/>
          <seriesInfo name="DOI" value="10.17487/RFC6570"/>
        </reference>
        <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
          <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="RFC8615" target="https://www.rfc-editor.org/info/rfc8615" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8615.xml">
          <front>
            <title>Well-Known Uniform Resource Identifiers (URIs)</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <date month="May" year="2019"/>
            <abstract>
              <t>This memo defines a path prefix for "well-known locations", "/.well-known/", in selected Uniform Resource Identifier (URI) schemes.</t>
              <t>In doing so, it obsoletes RFC 5785 and updates the URI schemes defined in RFC 7230 to reserve that space. It also updates RFC 7595 to track URI schemes that support well-known URIs in their registry.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8615"/>
          <seriesInfo name="DOI" value="10.17487/RFC8615"/>
        </reference>
        <reference anchor="CLOUDEVENTS" target="https://github.com/cloudevents/spec/blob/v1.0.2/cloudevents/spec.md">
          <front>
            <title>CloudEvents - Version 1.0.2</title>
            <author>
              <organization>Cloud Native Computing Foundation</organization>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="JSONSCHEMA" target="https://json-schema.org/draft/2020-12/json-schema-core">
          <front>
            <title>JSON Schema: A Media Type for Describing JSON Documents (draft 2020-12)</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
          <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>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC7942" target="https://www.rfc-editor.org/info/rfc7942" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7942.xml">
          <front>
            <title>Improving Awareness of Running Code: The Implementation Status Section</title>
            <author fullname="Y. Sheffer" initials="Y." surname="Sheffer"/>
            <author fullname="A. Farrel" initials="A." surname="Farrel"/>
            <date month="July" year="2016"/>
            <abstract>
              <t>This document describes a simple process that allows authors of Internet-Drafts to record the status of known implementations by including an Implementation Status section. This will allow reviewers and working groups to assign due consideration to documents that have the benefit of running code, which may serve as evidence of valuable experimentation and feedback that have made the implemented protocols more mature.</t>
              <t>This process is not mandatory. Authors of Internet-Drafts are encouraged to consider using the process for their documents, and working groups are invited to think about applying the process to all of their protocol specifications. This document obsoletes RFC 6982, advancing it to a Best Current Practice.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="205"/>
          <seriesInfo name="RFC" value="7942"/>
          <seriesInfo name="DOI" value="10.17487/RFC7942"/>
        </reference>
        <reference anchor="MCP" target="https://modelcontextprotocol.io/">
          <front>
            <title>Model Context Protocol</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="BESTSPEC" target="https://behavioralstate.io/">
          <front>
            <title>BEST - Behavioral State Protocol (living specification)</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
      </references>
    </references>
    <?line 533?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The BEST envelope is a profile of CloudEvents, and the protocol's discovery model follows the well-known URI convention of RFC 8615; the author thanks the communities behind both. Feedback from the operators of the early production deployments shaped the correlation, multi-tenancy, and authorisation requirements in this document.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA7V96Zbj1pHmfz4FhnVOKzlDMJcqSRazbXcqqzTKdm2urLKO
x8enDwhcJuEEARoAM0VnlZ9lnmWebOKLiLuBzNLS3fKxxMRycZe4sX4RN03T
0ZMnT0ZPkqu6N21t+vR5my37ZNm0Sb8yybcvrt8nm7bpm7yppklZJ7dtti6a
+zptlzkeW2f9jN7/dltWxTy5MWt6qOuzqoqf/Jd/SW4L/CjQflqU9fYf/2jS
hen61LafnpzO1gU1dr1drMt+nqz6ftPNj4+LrM/6NstvTTsrTb+cNe3NcccP
HSdHy9aYJMvzZlv3E+oLNUAtJfkqq29MlzR3pqULJ3O6niRpcnXx+iK5bOqu
LEyb9SX9Slpz35Z9b+o5j5o6dFd2dCer6NZN2fXyYNIscZ8bSpIxOj9Ouu1y
Wf6Y3GddUpi8KmtTJIsdt1OYrryps56umB83pu2To7OTs6/Sk9+kZ19OzrUd
PKmNlF2y7ejpbS2fNa0pZtrv643Jk67ONt2q6ZPtpuB2T2bfzM6S9Hf846t5
ct+0t8uque+SPNtki7Iq+51+56hsZujyLLsxdd/N3KPTJCsKbevZMf795STJ
6oJ7Ni7Xmyzvx9pIVtdNr5NRJ3mzXuPBnBaoam62JqGW25Jm/Yj7o8vxrSFC
wSBpxTrMq12LdlsnGU3x37dla9boVVrRqm2ph8km67p5Ymj1dsmrD9fvj6+/
f/Ph5fPjVxd/JhKjtep5gabJu+8uk9+cfv0s6fpdZbRlIbYFqDJZb7s+WRha
orYu65sUBMNk35d9ZebJGFQ+T96D3s0quyublhb+moZpkrdKm+NRtli05k6f
Ho+KJq+zNb39eYIe0dSYm6bdzanTy2bk56DfbQwuFmZj6F91Pyo3LdFfS709
Ozn55uRslLUmow+OR1iqm7bZbvivW7OjC8V8hIFe/vHdtfyomm3x4g6TyH8X
ZZeD9nf8F685z1vbECVaysi2/apppSUZzrsyz7O2aJLnZfIaQxph2WlP061Z
fNGss7KaJ62+8W86B7OyH9XMGMo7g6ZpgZ5+85uv9OdXX359oj+xavbnV6df
4uflyzcfnr/404vX76/n/BG7RsHwqK9/Mi3mMDmdnczOxvygH0rCFEA8Yi6T
krzmrtCmX2+2PVFA8h3xioKpWL6RtTcm4Dc3Zb/aLmZE3cc5GjD82eOOduDx
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
tSNTy4fP1b/bkzATtSzk/eDT3Ot+lxx1xiTXpH23+CsOB09kakDQj06MZVb8
EI3bb0cyMmc3sz17dXrQ2AwXayqrxbS/znrsLtd86K5wIvgcjnxd3GB+pPcD
lvCT5LrHKHwzwivi15xopxbC9dX1D61ASDHmOeP98Ro/GpLiEWdiKTazu9O6
+aJHMmYPzHhsaEU4iNfNO/dpjCbiQPEo6NWidH+92GdgEUN5zNPEZPXwENyF
PyV52dybNs/YxBT3YYkYA6lMkdBx30qJ7PGldlshQsPUWK4fX8T3dJPUvvUG
82+ZSY5NwC5lRMifPn36zcSv6eNNrZymqi7y4aqpHMT20gBAtI6Jkos6uohh
wdEljVjhYT1BbNY2mwxcTTUMFzakrj7MJVD4W4kTHpAA40+jEbEY82MGi9xt
EevpFnffYW2FdP3RP//5z9HDKCHu6Rn7eC68e4rrJKfoz+x0cZY/LZ6l5svl
V+nXv/nmJM0WeZGa5enZ02dffoUr8rxyYXrHBiU365n2juPJtblp+tK6Dah3
8h5L7fk+08C9oXCfH9is7kHdGhJldZ0gGzLqhV3M4418L83lg8du4CA3fOns
5OzL9OTr9OT0/enJ/OnJ/OTk//iv0RMPNOiMmO+Ofp+e4B/idESLbf+caMQ3
8Q01MU4+jT7xpP/cmZd5N1+my6+yr1Oa5tOUJt6kwcSfPjbzw0EHUx9P+pAv
/3fNuiIFdK5TnfvCT3qsIP0iwnt8vU7/E+s1VTSF/DO2nr4r7pz9K312Fizs
k+S5A57AECaNXDevOFHFvut+VVgZjmrnIZyI2blmGAWLuAMLJOiv79+/f3s9
S9jZZb3VTvMlIdGW5k5CViplYoPxXC2LhpVNNxCoxjZwyRyQGCheyqruUcMQ
Qi5ufJw0CyiuM+a8G1JoIdLzrCYaIP54PtSK4U7JOlyhKRzPeJgJmxhO6Zam
YnhaKZE79RGwkW8BZraPP2C2/2Dnv7PIN9WVDsDmJurIdgvZNk0vZo9GqLQP
MsKQ3/J1IkbZMMH+Z6ei0t1wpkC8s9ks+aS32UPcd3vXLdxi70boJaCbf+Gb
f7Uf47i3v0xXHVFbnf/ICsqJtbWdS8A+4v3KBbvsXl38+5t3s1dXr+nfby/e
X35Pk2Y7OGgPwZ+FGDFEyRLtFS2YtDqOrti/C+82JQ0JgS1/hwmv85MqHs3C
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
B1Z7uzY6/2V4IP1s9P8Bg4ipvsWTAAA=

-->

</rfc>
