<?xml version="1.0" encoding="utf-8"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     version="3"
     category="info"
     submissionType="IETF"
     ipr="trust200902"
     docName="draft-hamlett-selo-architecture-00"
     tocInclude="true"
     sortRefs="true"
     symRefs="true">

  <front>
    <title abbrev="Selo Architecture">Negotiated, Signed Access Agreements Between Organizations' Agents: Problem Statement and Architecture (Selo)</title>
    <seriesInfo name="Internet-Draft" value="draft-hamlett-selo-architecture-00"/>

    <author fullname="James Bradley Hamlett" initials="J. B." surname="Hamlett">
      <address>
        <email>bhamlett@gmail.com</email>
      </address>
    </author>

    <date/>

    <area>Applications and Real-Time</area>
    <workgroup>Network Working Group</workgroup>

    <keyword>agents</keyword>
    <keyword>B2B</keyword>
    <keyword>integration</keyword>
    <keyword>organizational identity</keyword>
    <keyword>access agreements</keyword>

    <abstract>
      <t>Connecting one organization's systems to another's usually
      requires a connector built for that pair of systems, whether written
      by hand, bought from a connector catalog, or packaged as a tool server
      for an AI model. Connectors scale with the number of pairs, carry
      long-lived shared credentials, and have no verifiable link to the
      legal entities involved or to the terms under which access was
      granted.</t>
      <t>This document describes that problem and an architecture, called
      Selo, that aims to reduce the need for such connectors. Agents owned
      by verified legal entities verify each other, negotiate a typed access
      agreement that both parties sign, and then execute it through a
      standard runtime and a gateway in front of each entity's existing API,
      using credentials bound to the agreement. Each entity maintains its
      own tested, signed mapping between its system and shared capability
      profiles. Selo uses existing APIs; it does not replace them.</t>
      <t>The document states requirements and an architecture to inform
      discussion of whether, and where, such work belongs in the IETF. It
      does not specify a protocol.</t>
    </abstract>

    <note removeInRFC="true">
      <name>About This Document</name>
      <t>This is an individual submission. Discussion is invited on the
      dispatch@ietf.org mailing list, and at a side meeting at IETF 127 on
      Monday 16 November 2026, 17:30-19:00 (US Pacific time), in room
      Continental 7.</t>
      <t>The author has a pending patent application relating to this
      document. An IPR disclosure will be filed in accordance with
      BCP 79.</t>
    </note>
  </front>

  <middle>

    <!-- ============================================================ -->
    <section anchor="intro">
      <name>Introduction</name>
      <t>Most business software exposes an API. Accounting, enterprise
      resource planning (ERP), commerce, banking, payroll and logistics
      systems all let authorized callers read and write their records. What
      is missing is not the API but the connection between two
      organizations' APIs: something has to decide who may call what, under
      which terms, translate between two data models, hold the credentials,
      and keep working as both sides change.</t>
      <t>Today that is a connector, built for a pair of platforms,
      configured for a pair of organizations, and operated by one of them
      or by a third party. Tool servers that expose a platform's API to an
      AI model, such as Model Context Protocol <xref target="MCP"/> servers,
      are a newer form of connector. AI agents make it plausible for
      software to read an API description and propose how two systems
      should exchange data. They do not, on their own, make that safe: an
      agent that can be steered by text from a counterparty cannot be
      trusted to grant access or sign commitments.</t>
      <t>Selo is an architecture in which:</t>
      <ul>
        <li>each organization (an "entity") has a verified identity
        anchored to its legal identifier, and certifies its own agents;</li>
        <li>agents verify each other and disclose endpoints and terms on a
        need-to-know basis;</li>
        <li>agents negotiate a typed access agreement, but only an isolated,
        deterministic policy checker acting under the owner's signed mandate
        can cause a signature;</li>
        <li>each entity's runtime tests the agreement end to end, then
        executes it through a gateway in front of the existing API, using
        short-lived credentials bound to the agreement and to the caller's
        key; and</li>
        <li>each entity translates once, between its own system and shared
        capability profiles, using a mapping it has tested and signed, so
        that no executable artifact specific to a pair of parties is
        needed.</li>
      </ul>

      <section anchor="core">
        <name>The Proposed IETF Core</name>
        <t>Much of this architecture profiles existing work or belongs
        outside the IETF. The parts that appear to need new, interoperable
        definitions, and that the author proposes for discussion, are:</t>
        <ol type="a">
          <li>a signed, typed access-agreement object, including its
          versioning and the agreement record;</li>
          <li>the negotiation messages and state machine between two
          entities' agents; and</li>
          <li>a profile of OAuth access tokens bound to an agreement and to
          the caller's key, enforced at the provider's gateway.</li>
        </ol>
        <t><xref target="split"/> suggests venues for the remaining
        pieces.</t>
      </section>

      <section anchor="scope">
        <name>Scope</name>
        <t>Selo aims to reduce the need for manually built connectors and
        per-platform tool servers. Every operation is still performed by an
        entity's existing platform API. Selo does not move money; payments
        are executed by existing payment systems. Searching for
        counterparties is a marketplace function and is out of scope.</t>
        <t>Issuer accreditation, verification procedures (for example
        know-your-business checks and their renewal), the trust list,
        assurance-tier definitions, approval workflows and user interfaces,
        and compliance-framework identifiers are expected to be governed by
        one or more external trust frameworks. This document defines only
        the hooks the protocol needs from them: an assurance level in the
        entity certificate, verifiable claims in an entity credential, and
        references to approvals and role credentials in agreements.</t>
        <t>This version covers organizations only. Individuals as parties
        raise distinct privacy questions (<xref target="privacy"/>) and are
        left for future work.</t>
      </section>
    </section>

    <!-- ============================================================ -->
    <section anchor="terminology">
      <name>Terminology</name>
      <dl newline="false" spacing="normal">
        <dt>Entity:</dt>
        <dd>An organization that can be legally accountable for an
        agreement.</dd>
        <dt>Provider and consumer:</dt>
        <dd>Under an access agreement, the provider is the entity whose
        capabilities are accessed; the consumer obtains access. An entity can
        be both.</dd>
        <dt>Platform:</dt>
        <dd>A system of record used by an entity, exposing a platform API.
        The platform vendor is not a party to agreements.</dd>
        <dt>Owner and operator:</dt>
        <dd>The owner of an agent, runtime or mapping is the entity on whose
        behalf it acts. An operator runs these components for an owner and
        may be the owner itself.</dd>
        <dt>Issuer and trust list:</dt>
        <dd>An issuer verifies an entity and signs its entity certificate.
        A trust list, maintained under a trust framework, lists accepted
        issuers.</dd>
        <dt>Agent:</dt>
        <dd>Software representing its owner in the control plane:
        verification, catalog disclosure and negotiation. An agent may use a
        machine-learning model.</dd>
        <dt>Mandate:</dt>
        <dd>A data object signed by the owner that sets the limits within
        which an agent's proposals may be signed.</dd>
        <dt>Policy checker:</dt>
        <dd>A component, isolated from the agent's model and containing no
        machine-learning model, that compares typed proposals with the
        mandate and alone can cause the owner's signature on an
        agreement.</dd>
        <dt>Access agreement:</dt>
        <dd>Canonical structured data, signed by both parties, listing the
        endpoints the consumer may use and the typed terms that apply. It is
        also the configuration the parties' runtimes load and enforce.</dd>
        <dt>Agreement record:</dt>
        <dd>A signed agreement version plus an append-only, hash-linked
        sequence of signed annex entries (test confirmations, suspensions,
        mapping-update notices and similar). Adding an annex entry does not
        create a new version.</dd>
        <dt>Capability profile:</dt>
        <dd>A versioned definition of a business capability (such as orders,
        invoices or general-ledger transactions): schema, field semantics,
        field classes (such as money-bearing), invariants, operations and a
        conformance test suite.</dd>
        <dt>Mapping:</dt>
        <dd>Expressions in a sandboxed, deterministic transformation language
        that translate records between one entity's platform and a profile.
        A mapping is tested and signed by that entity.</dd>
        <dt>Runtime and gateway:</dt>
        <dd>The runtime executes signed agreements. The gateway is the part
        of a provider's runtime in front of its platform API, through which
        every call under an agreement passes.</dd>
        <dt>Category and sensitivity label:</dt>
        <dd>A category is a named group of endpoints in a provider's
        catalog. The provider gives each category a sensitivity label from
        an ordered set, for example Public &lt; Customer &lt; Confidential
        &lt; Restricted.</dd>
      </dl>
    </section>

    <!-- ============================================================ -->
    <section anchor="problem">
      <name>Problem Statement</name>
      <dl newline="true" spacing="normal">
        <dt>Connectors scale with pairs.</dt>
        <dd>A connector embodies knowledge of two systems and of an
        arrangement between two organizations. Costs grow with the number of
        pairs. Shared connector libraries lower the cost of building one, but
        each shared connector is a supply-chain target for every deployment
        that uses it and cannot know any one organization's custom fields,
        codes and workflows, so each deployment still needs per-customer
        configuration. Canonical data models (EDI, UBL and the canonical
        models of integration platforms) have long tried to reduce this; in
        practice, the per-organization configuration around them is where
        integrations drift and break.</dd>
        <dt>Agents lack accountable identity.</dt>
        <dd>Existing agent and workload identity work identifies software
        and endpoints. A counterparty deciding whether to grant access to
        financial records needs to know which legal entity stands behind an
        agent, who verified that and when. Names and domains are not
        identifiers; lookalikes are a common basis for fraud.</dd>
        <dt>An agent's authority is hard to rely on.</dt>
        <dd>An organization needs to limit what its agent can commit to and
        require human approval above those limits. Its counterparty needs to
        rely on a commitment having been within the agent's authority,
        without learning the internal limits, which would weaken the
        organization's negotiating position.</dd>
        <dt>Access is disconnected from its terms.</dt>
        <dd>Terms such as purpose, retention, rate, data location and
        termination are usually recorded, if at all, separately from the
        credentials and configuration that grant access. Nothing ensures the
        two match, or that a change to either is noticed by the other
        party.</dd>
        <dt>Model-mediated integration creates new risks.</dt>
        <dd>An agent that reads a counterparty's catalog or messages can be
        steered by instructions embedded in them (prompt injection). No
        reliable model-level defense is known, so any key, approval or write
        operation reachable by the model is effectively reachable by the
        counterparty. A model-generated translation can differ between runs
        and produce plausible but wrong values. An integration that was
        tested is not necessarily the integration that runs.</dd>
        <dt>Payment-instruction fraud.</dt>
        <dd>Changing a supplier's bank details through a compromised or
        impersonated channel is a well-known form of business payment fraud.
        Automating buyer-supplier relationships must not make this
        easier.</dd>
      </dl>

      <section anchor="usecases">
        <name>Illustrative Use Cases</name>
        <dl newline="true" spacing="normal">
          <dt>Ledger access for an accounting firm:</dt>
          <dd>A company invites its accounting firm. The firm's agent
          requests hourly read access to general-ledger transactions with
          unlimited retention; the company's agent counter-offers daily
          access, 365-day retention and no use for model training; a finance
          officer approves because the data is Confidential; the runtimes
          test the exchange; and the firm then pulls entries daily. When the
          company's ERP is upgraded, the company re-tests and re-signs its own
          mapping without renegotiating.</dd>
          <dt>Ordering from a supplier:</dt>
          <dd>A customer's agent finds a supplier by domain. The supplier's
          policy discloses ordering and invoicing endpoints to verified
          existing customers. The agents agree payment terms within each
          side's mandate, and orders then flow as individual calls. A later
          change of the supplier's bank details follows a protected process
          (<xref target="arch-payment"/>).</dd>
        </dl>
      </section>
    </section>

    <!-- ============================================================ -->
    <section anchor="requirements">
      <name>Requirements</name>
      <t>These requirements are stated as outcomes a solution needs to
      achieve, not as normative protocol requirements.</t>
      <dl newline="false" spacing="normal">
        <dt>R1:</dt>
        <dd>An entity's identity needs to be anchored to a legal identifier
        (such as a Legal Entity Identifier), so that it survives a change of
        issuer.</dd>
        <dt>R2:</dt>
        <dd>Every agent needs to be bound to the entity that owns it and,
        where different, to its operator.</dd>
        <dt>R3:</dt>
        <dd>It needs to be possible to require identities that no single
        issuer can create on its own.</dd>
        <dt>R4:</dt>
        <dd>Issuance, key changes and revocations need to be publicly
        auditable, while relationships and agreements between entities are
        not published.</dd>
        <dt>R5:</dt>
        <dd>A stolen key needs to be recoverable without loss of identity,
        and agent credentials need to be short-lived.</dd>
        <dt>R6:</dt>
        <dd>A provider needs to be able to disclose each category of
        endpoints only to approved requesters, and to make unapproved
        categories indistinguishable from nonexistent ones.</dd>
        <dt>R7:</dt>
        <dd>The system's guarantees must not depend on the behavior of any
        machine-learning model: no signature or grant of access can result
        from a model's output except through deterministic checks against
        limits signed by the owner.</dd>
        <dt>R8:</dt>
        <dd>Owners need to be able to require approval by an authorized,
        identifiable person above limits they set, with requests not
        approved in time treated as declined.</dd>
        <dt>R9:</dt>
        <dd>A counterparty needs to be able to rely on an attributable
        assertion that a commitment was within the other party's authority,
        checkable after the fact in an audit or dispute, without learning
        the limits of that authority.</dd>
        <dt>R10:</dt>
        <dd>Agreement terms need to be typed, with defined meanings and
        units. No legal language is generated during negotiation; agreements
        reference fixed legal text by digest.</dd>
        <dt>R11:</dt>
        <dd>Negotiation transcripts and agreement versions need to be
        tamper-evident, attributable, and protected against replay and
        downgrade.</dd>
        <dt>R12:</dt>
        <dd>A change of payment details needs approval by a person with a
        finance role, a waiting period, notice to the paying side's people
        by a path independent of either agent, and confirmation by a person
        on the paying side before the first payment.</dd>
        <dt>R13:</dt>
        <dd>Production data must not flow under an agreement until it has
        been signed by both parties and tested end to end.</dd>
        <dt>R14:</dt>
        <dd>The provider's platform credentials are never disclosed to the
        consumer; credentials issued to the consumer are bound to the
        agreement and to a key the consumer holds.</dd>
        <dt>R15:</dt>
        <dd>Every call needs to be checked against the agreement's endpoints,
        operations, fields and enforceable terms; terms that cannot be
        enforced technically need to be recorded so compliance can be
        shown.</dd>
        <dt>R16:</dt>
        <dd>The translation executed at run time needs to be deterministic,
        sandboxed and byte-for-byte the one that was tested and signed. No
        model transforms data or grants access at run time.</dd>
        <dt>R17:</dt>
        <dd>No executable artifact specific to a pair of parties should be
        needed, and a defective mapping should affect only agreements to
        which its owner is a party.</dd>
        <dt>R18:</dt>
        <dd>The protocol needs to work over plain HTTPS, be independent of
        transport, use agile algorithms, and reuse existing certificate,
        credential, transparency, token and business-document standards
        where possible.</dd>
      </dl>
    </section>

    <!-- ============================================================ -->
    <section anchor="architecture">
      <name>Architecture Overview</name>

      <section anchor="arch-components">
        <name>Components</name>
        <figure anchor="fig-overview">
          <name>Components</name>
          <artwork type="ascii-art"><![CDATA[
        Entity A                              Entity B
 +---------------------+               +---------------------+
 | Agent (may use a    |<-- control -->| Agent (may use a    |
 | model)              |    plane      | model)              |
 |   | typed proposals |               |   | typed proposals |
 |   v                 |               |   v                 |
 | Policy checker      |               | Policy checker      |
 | (isolated, no model;|               | (isolated, no model;|
 | key + mandate)      |               | key + mandate)      |
 |   | signs           |               |   | signs           |
 |   v                 |               |   v                 |
 | Runtime + gateway   |<--- data  --->| Runtime + gateway   |
 | (pinned mapping,    |     plane     | (pinned mapping,    |
 | owner credentials)  |               | owner credentials)  |
 |   v                 |               |   v                 |
 | Platform API        |               | Platform API        |
 +---------------------+               +---------------------+

 Supporting services: issuers and trust list; public issuance log
 (certificates, keys, revocations; never relationships); registries
 (capability profiles, typed terms, algorithm suites)
]]></artwork>
        </figure>
        <t>Negotiation happens when an agreement is formed or changed, not
        per call; individual transactions flow through the data plane under
        the agreement. The agent is owned by the entity that uses the
        platform, not by the platform's vendor. A vendor or integration
        service may run components as an operator for its customers, who
        remain the owners.</t>
      </section>

      <section anchor="arch-identity">
        <name>Identity and Keys</name>
        <t>An issuer verifies an entity and signs its entity certificate, a
        restricted certificate-authority certificate <xref target="RFC5280"/>
        with a path-length constraint of zero and name constraints limiting
        it to the entity's own namespace and its verified domains. The entity
        certificate carries the legal identifier, an assurance level and
        those domains. The entity key is held in protected hardware or a
        cloud key service and is used rarely, to certify the entity's
        other keys and to sign mandates and role credentials. Facts beyond
        the certificate (officers, verification dates, screening status,
        attestations) can be carried in a selective-disclosure credential
        such as an SD-JWT VC <xref target="RFC9901"/>
        <xref target="I-D.ietf-oauth-sd-jwt-vc"/> and revealed one claim at a
        time.</t>
        <t>Keys are separated by role, each certified by the entity
        certificate:</t>
        <dl newline="false" spacing="normal">
          <dt>Agent key:</dt>
          <dd>Short-lived (for example days, renewed automatically). Signs
          control-plane messages. Held by the agent's non-model code; the
          model never invokes it directly.</dd>
          <dt>Checker signing key:</dt>
          <dd>Reachable only by the policy checker. Signs agreements on the
          entity's behalf.</dd>
          <dt>Runtime or gateway key:</dt>
          <dd>Signs runtime messages such as test confirmations and
          suspensions, and is the key to which data-plane tokens are
          bound.</dd>
        </dl>
        <t>An entity commits in advance to its next entity key by publishing
        a digest of it, and rotation is accepted only to the committed key,
        so a thief of the current key cannot take over the identity. Every
        certificate issued, key change and revocation is submitted to a
        public append-only log modeled on Certificate Transparency
        <xref target="RFC9162"/> or to a SCITT transparency service
        <xref target="RFC9943"/>; monitors alert an entity to issuance under
        its legal identifier. The log never records relationships or
        agreements. Revocation status is published promptly, for example in
        status lists <xref target="I-D.ietf-oauth-status-list"/>.</t>
        <t>The trust framework (<xref target="scope"/>) defines assurance
        levels. One level is expected to require verification by two
        independent issuers, so that no single issuer can create it
        (R3).</t>
      </section>

      <section anchor="arch-discovery">
        <name>Discovery and Mutual Verification</name>
        <t>An entity publishes a discovery document at
        /.well-known/selo <xref target="RFC8615"/> on a domain listed in its
        entity certificate, optionally with a DNS record (for example SVCB
        <xref target="RFC9460"/>) or a DAWN mechanism
        <xref target="DAWN-CHARTER"/>. The document contains only the entity
        identifier, agent addresses, certificate chains, supported versions
        and algorithm suites, and is signed by a key certified by the entity
        certificate. A relying party checks that the domain it fetched from
        is one of the certified domains. An entity can also send a
        counterparty a signed invitation naming it by legal identifier.</t>
        <t>Before revealing anything beyond the discovery document, each
        agent checks the other's certificate chain to an issuer on its trust
        list, revocation status, log inclusion, any operator authorization,
        and the assurance level its owner requires. Only then is a catalog
        exchanged, tailored to the requester.</t>
      </section>

      <section anchor="arch-ntk">
        <name>Need-to-Know Disclosure</name>
        <t>A requester becomes approved for a category by invitation, by a
        typed access request approved by a person holding a covering role
        credential, or automatically under a deterministic rule in the
        provider's signed mandate (for example "verified existing customers
        may use Customer categories"). Per category, the provider sets
        whether an invitation alone suffices. Categories a requester is not
        approved for are omitted from its catalog, and a request naming one
        receives a response indistinguishable from one naming a nonexistent
        category, because the existence of sensitive endpoints is itself
        sensitive. Approval interfaces are expected to help approvers notice
        lookalike identities; how they do so is left to implementations and
        trust frameworks.</t>
      </section>

      <section anchor="arch-mandate">
        <name>Mandates and the Policy Checker</name>
        <t>The owner gives each agent a signed mandate containing access
        limits per sensitivity label, commercial limits, the most generous
        terms the agent may offer, and requirements to obtain from
        counterparties. The agent's model negotiates and composes typed
        proposals. Each proposal crosses an isolation boundary to the policy
        checker, which contains no model and evaluates each typed field
        against the mandate by fixed rules. Values the mandate does not cover
        default to refusal or escalation, never approval.</t>
        <figure anchor="fig-checker">
          <name>Policy Checker Outcomes</name>
          <artwork type="ascii-art"><![CDATA[
  Agent (model) --typed proposal--> | isolation | --> Policy checker
                                                        |
        +------------------------+----------------------+
        |                        |                      |
   within mandate          outside, escalatable     not permitted
        |                        |                      |
   sign, with a            approver with covering   refuse
   within-mandate          role credential;
   reference               counterparty gets
                           "pending"; no answer by
                           deadline = declined
]]></artwork>
        </figure>
        <t>Every decision is recorded in a signed decision log. The
        counterparty learns only that a commitment was within mandate (or
        approved by a named, entitled person), through a within-mandate
        reference that identifies the mandate version and decision and binds
        to the mandate without revealing it; the mandate is disclosed only
        in an audit or dispute (R9). A provider also needs to avoid
        committing, across all its agreements, more platform capacity (such
        as request rates) than its platform account supports; how it does so
        is an implementation matter.</t>
      </section>

      <section anchor="arch-negotiation">
        <name>Negotiation</name>
        <t>Messages are transport independent and follow the steps of
        contract formation:</t>
        <ul>
          <li>session and disclosure: hello, catalog-request, catalog,
          access-request;</li>
          <li>negotiation: offer, counter-offer, accept, reject,
          withdraw;</li>
          <li>status and completion: pending, sign, error;</li>
          <li>existing agreements: renegotiate, terminate; and</li>
          <li>execution support: test-confirm, suspend, resume, notice.</li>
        </ul>
        <t>A plain-HTTPS binding is required. Each message is a signed
        object, so its signature is independent of the binding; optional
        bindings carry the same objects over agent-to-agent protocols such
        as A2A <xref target="A2A"/> or agentproto protocols.</t>
        <t>All fields are typed. Every inbound message is validated against
        its schema by deterministic code before any content reaches a model,
        and non-conforming messages are rejected. Free text is confined to
        one optional field marked untrusted, shown to people and either
        withheld from the model or given only to a quarantined model with no
        tools or keys.</t>
        <t>Each message includes the digest of the preceding message in the
        session, forming a hash chain, plus a timestamp and nonce. The
        protocol version and algorithm suite are selected by a fixed rule
        (for example, the responder's most preferred entry in the
        intersection) from the signed hello messages, which are part of the
        chain, so stripping options from one hello is detected.</t>
        <figure anchor="fig-negotiation">
          <name>Negotiation States</name>
          <artwork type="ascii-art"><![CDATA[
 START --hello/hello--> VERIFIED --catalog--> CATALOG
 CATALOG --access-request--> ACCESS_PENDING
 ACCESS_PENDING --approved--> CATALOG (category now visible)
 ACCESS_PENDING --denied or timeout--> CLOSED
 CATALOG --offer--> NEGOTIATING (one live offer; each expires)
 NEGOTIATING --escalation--> PENDING_APPROVAL
 PENDING_APPROVAL --approved--> NEGOTIATING
 PENDING_APPROVAL --declined or timeout--> CLOSED
 NEGOTIATING --accept (digest of offer)--> ACCEPTED
 ACCEPTED --sign/sign (each via its checker)--> SIGNED
 SIGNED --> TESTING (agreement lifecycle)

 Any state: reject, withdraw, expiry, error, failed check --> CLOSED
]]></artwork>
        </figure>
        <t>An accept names the digest of the exact offer accepted, and the
        agreement is derived from that offer by a fixed rule. Nothing is
        binding, and no runtime loads an agreement, until both signatures
        verify. Offer expiries and approval deadlines are carried as typed
        values in the messages.</t>
      </section>

      <section anchor="arch-agreement">
        <name>The Access Agreement</name>
        <t>An access agreement is a JSON object canonicalized with
        <xref target="RFC8785"/>. Each party signs the canonical bytes with
        a detached signature (JWS <xref target="RFC7515"/> or COSE
        <xref target="RFC9052"/>) made with its checker signing key; each
        signature carries, as a signed attribute, that party's within-mandate
        reference and any approval references. The signatures are therefore
        not part of the body they sign. The body contains:</t>
        <dl newline="false" spacing="normal">
          <dt>Parties:</dt>
          <dd>Both entity identifiers, their agents, any operators, each
          party's runtime key or certificate (the anchor for token binding
          and runtime message verification), and, where commercial terms
          exist, payment-change notification endpoints.</dd>
          <dt>Interface:</dt>
          <dd>Endpoints (profile or custom operations), which side calls
          which, pull or push, formats and profile versions.</dd>
          <dt>Access terms:</dt>
          <dd>Typed values from a registry of terms, each with a type, unit,
          direction of generosity and a flag saying whether a runtime can
          enforce it: for example requests per minute, records per day,
          retention, permitted purposes, use for model training, data
          location and termination notice.</dd>
          <dt>Commercial terms (optional):</dt>
          <dd>For example payment terms, currency and protected payment
          details.</dd>
          <dt>Legal terms:</dt>
          <dd>A reference to fixed legal text by address and digest, plus
          the typed choices it leaves open (such as governing law or
          liability cap). The text may be a master agreement the parties
          already have.</dd>
          <dt>Metadata:</dt>
          <dd>Format version, agreement identifier, version number, digest
          of the previous version, digest of the accept message that
          concluded negotiation, and digest of the rendering template.</dd>
        </dl>
        <t>A human-readable rendering is produced from the canonical data by
        fixed, versioned rules, not by a model, so any party can regenerate
        it. The contracting parties are the entities, not their agents:
        replacing an agent does not affect agreements. Changing any term,
        endpoint or party requires a new signed version that includes the
        previous version's digest. Annex entries, such as test confirmations,
        suspensions and mapping-update notices, are appended to the agreement
        record without a new version, and the parties periodically
        countersign the latest annex digest.</t>
      </section>

      <section anchor="arch-lifecycle">
        <name>Agreement Lifecycle</name>
        <figure anchor="fig-lifecycle">
          <name>Agreement Lifecycle</name>
          <artwork type="ascii-art"><![CDATA[
 SIGNED --> TESTING --both confirm--> ACTIVE
 TESTING --fail or timeout--> CLOSED
 ACTIVE --suspend--> SUSPENDED (some endpoints or all)
 SUSPENDED --cause fixed, re-test passes--> ACTIVE
 ACTIVE --renegotiate--> new version signed and tested
        --> new version ACTIVE, old version SUPERSEDED
 ACTIVE or SUSPENDED --terminate--> TERMINATED
]]></artwork>
        </figure>
        <t>After both signatures, the agreement enters TESTING. The provider
        issues test-scoped credentials that its gateway honors only against
        a test data source, such as a platform sandbox, a validate-only mode
        or synthetic records. The runtimes exchange sample records through
        every endpoint and mapping and validate them against the profile
        schema and invariants. Each runtime signs a test-confirm annex entry
        listing endpoints exercised and digests of the profile-format sample
        records and of its own mappings. Only when both confirmations are
        recorded does the agreement become ACTIVE and production credentials
        exist.</t>
        <t>Runtimes refuse to operate outside the signed agreement. A
        failure affecting some endpoints, such as mapping output that
        violates the profile or an expired attestation, suspends only those
        endpoints; an endpoint resumes after the cause is fixed and its test
        passes again, without renegotiation. A platform API change usually
        requires only that the affected owner update its own mapping
        (<xref target="arch-mappings"/>). Disputes are resolved by the
        parties, using the signed records.</t>
      </section>

      <section anchor="arch-gateway">
        <name>Data Plane: Tokens and Gateway</name>
        <t>On activation, the provider issues the consumer short-lived OAuth
        access tokens identifying the agreement and version and bound, by a
        confirmation claim using DPoP <xref target="RFC9449"/> or mutual TLS
        <xref target="RFC8705"/>, to the consumer runtime key named in the
        agreement. Tokens are refreshed at a token endpoint that checks
        agreement status. The provider's platform credentials
        stay in a vault used only by its gateway.</t>
        <t>On every call, the gateway validates the token and proof of
        possession; checks that the agreement version is ACTIVE (or TESTING
        for a test token), that the endpoint is not suspended and that
        neither party is revoked; checks the endpoint and operation against
        the interface; removes fields outside the agreement; enforces rate,
        volume and time limits; executes the owner's pinned mapping and calls
        the platform API; and appends an entry to a signed, hash-chained
        private log of call metadata (not record contents). These logs make
        terms that cannot be enforced technically, such as purpose
        restrictions, demonstrable. Models may be used at run time for
        monitoring only.</t>
        <t>An active agreement can also be exposed to the consumer's own AI
        assistant as tools, for example an MCP <xref target="MCP"/> server
        generated from the agreement's interface, limited to operations
        within the agreement.</t>
      </section>

      <section anchor="arch-mappings">
        <name>Capability Profiles and Entity-Owned Mappings</name>
        <t>Capability profiles build on existing business-document
        standards such as UBL <xref target="UBL"/>, ISO 20022
        <xref target="ISO20022"/> and XBRL Global Ledger
        <xref target="XBRL-GL"/>. Operations no profile covers are described
        as custom endpoints in OpenAPI <xref target="OPENAPI"/>, with a field
        mapping confirmed by both parties in negotiation.</t>
        <t>Each entity translates once, between its own platform as
        configured and each profile it uses. Its mapping is written in a
        sandboxed, deterministic language (for example JSONata
        <xref target="JSONATA"/> with no network, file, clock or random
        access, bounded execution and exact decimal arithmetic for money);
        passes the profile's conformance tests against the owner's platform;
        has its money-bearing fields confirmed by a person; and is signed and
        pinned by digest, so the bytes executed are the bytes tested. This
        document places no requirement on how a mapping is produced. There is
        no shared adapter library, so a defective mapping affects only its
        owner's agreements. When an owner changes its own mapping, it
        re-tests and re-signs it and records a signed mapping-update notice
        in the agreement record; the affected endpoints are re-tested, and no
        new agreement version is needed.</t>
      </section>

      <section anchor="arch-payment">
        <name>Protected Payment-Detail Changes</name>
        <t>Payment details are a protected part of the commercial terms. A
        change needs a new agreement version approved by a person holding a
        finance role (an agent's mandate alone never suffices); direct notice
        to the paying side's people at notification endpoints in the
        agreement, by a path that bypasses both agents; a waiting period (for
        example 72 hours) during which the previous details remain in effect
        and either side can cancel; and confirmation by a person on the
        paying side before the first payment to the new details. Selo moves
        no money; payment approval rules can be agreement terms consumed by
        existing payment systems.</t>
      </section>

      <section anchor="arch-compliance">
        <name>Compliance</name>
        <t>No compliance framework is built into the protocol. Attestations
        can be presented as credentials; requirements can be typed terms
        that a mandate attaches to a sensitivity label; if a required
        attestation lapses, only the dependent endpoints are suspended. The
        signed transcripts, agreement records, decision logs and call logs
        are verifiable offline, and implementations may offer them as
        evidence for audits.</t>
      </section>
    </section>

    <!-- ============================================================ -->
    <section anchor="relationship">
      <name>Relationship to Existing Work</name>
      <t>Most building blocks of Selo already exist or are being developed
      elsewhere. This section summarizes the closest work.</t>

      <section anchor="rel-ietf">
        <name>IETF Working Groups</name>
        <dl newline="false" spacing="normal">
          <dt>OAuth:</dt>
          <dd>Data-plane tokens use DPoP <xref target="RFC9449"/> or mutual
          TLS <xref target="RFC8705"/>. Rich Authorization Requests
          <xref target="RFC9396"/> carry typed grants, Token Exchange
          <xref target="RFC8693"/> addresses delegation, and Transaction
          Tokens <xref target="I-D.ietf-oauth-transaction-tokens"/> carry
          context within a trust domain. An agreement-bound token is expected
          to be an OAuth profile.</dd>
          <dt>GNAP:</dt>
          <dd>GNAP <xref target="RFC9635"/> negotiates an access grant
          between a client and an authorization server. Selo's agreement
          could be expressed as, or alongside, a grant.</dd>
          <dt>WIMSE:</dt>
          <dd>WIMSE <xref target="I-D.ietf-wimse-arch"/>
          <xref target="I-D.ietf-wimse-aims"/> addresses workload and agent
          identity. <xref target="I-D.reece-wimse-cross-org-delegation"/>
          states requirements for delegation across organizations, and
          <xref target="I-D.hulea-wimse-agent-mandate"/> proposes verifiable
          mandates for agents acting across administrative domains, with
          limits evaluated by the relying party.</dd>
          <dt>DAWN, agentproto and AUDIT:</dt>
          <dd>DAWN <xref target="DAWN-CHARTER"/> covers minimal agent
          discovery, which Selo's discovery should reuse. agentproto
          <xref target="AGENTPROTO-CHARTER"/> covers agent dialog protocols,
          over which Selo messages could be carried. AUDIT
          <xref target="AUDIT-BOF"/> concerns traceability of delegation and
          interactions; Selo's transcripts and decision logs are relevant
          inputs.</dd>
          <dt>SCITT and RATS:</dt>
          <dd>A SCITT transparency service <xref target="RFC9943"/> is a
          candidate issuance log. Remote attestation
          <xref target="RFC9334"/> could let a counterparty or an owner verify
          that a policy checker runs isolated and unmodified.</dd>
        </dl>
      </section>

      <section anchor="rel-drafts">
        <name>Individual Drafts on Agent Identity, Mandates and Negotiation</name>
        <dl newline="false" spacing="normal">
          <dt>AGTP family:</dt>
          <dd>AGTP <xref target="I-D.hood-independent-agtp"/> defines an
          agent transfer protocol, with companion drafts on trust and
          verification <xref target="I-D.hood-agtp-trust"/>, merchant identity
          <xref target="I-D.hood-agtp-merchant-identity"/>, and binding agents
          to legal entities through the LEI and vLEI, including role
          credentials that express the human authorization chain behind an
          agent <xref target="I-D.hood-agtp-lei"/>. This substantially
          overlaps Selo's entity-to-agent binding (R1, R2). AGTP does not
          define bilateral agreements or their execution.</dd>
          <dt>Mandates:</dt>
          <dd><xref target="I-D.hulea-wimse-agent-mandate"/>,
          <xref target="I-D.martinez-itp-agent-mandates"/> (mandates for
          invoice agents, with approval thresholds) and
          <xref target="I-D.sato-soos-mjwt"/> (a mandate JWT) define signed
          agent mandates. In these, the limits are generally visible to the
          party evaluating them.</dd>
          <dt>Negotiation and agreement evidence:</dt>
          <dd><xref target="I-D.singh-rajput-rnp"/> defines signed offer,
          counter and accept messages with undisclosed internal limits.
          <xref target="I-D.newton-agreement-evidence"/> defines countersigned
          evidence of a negotiated outcome, excluding legal identity and
          terms.</dd>
          <dt>Agent identity and naming:</dt>
          <dd><xref target="I-D.le-agent-passport"/> defines agent passports,
          delegation receipts and a transparency log.
          <xref target="I-D.narajala-courtney-ansv2"/> defines a
          domain-anchored agent name service with assurance tiers.</dd>
        </dl>
      </section>

      <section anchor="rel-other">
        <name>Work Outside the IETF</name>
        <dl newline="false" spacing="normal">
          <dt>Eclipse Dataspace Protocol:</dt>
          <dd>The Dataspace Protocol <xref target="DSP"/> defines catalogs,
          a contract-negotiation state machine and a transfer process between
          participants in data spaces, with usage policies in ODRL
          <xref target="ODRL"/>. It is the closest existing design to Selo's
          control plane and should be evaluated as a base.</dd>
          <dt>vLEI and OpenID Federation:</dt>
          <dd>The verifiable LEI <xref target="VLEI"/> provides
          organizational identity and role credentials through qualified
          issuers, and is a candidate trust anchor. OpenID Federation
          <xref target="OIDFED"/> provides trust chains and entity statements
          suited to trust lists.</dd>
          <dt>UMA and sector consent frameworks:</dt>
          <dd>UMA 2.0 <xref target="UMA"/> lets a resource owner set policies
          for third-party access. Open banking and FDX <xref target="FDX"/>,
          with the FAPI security profile <xref target="FAPI2"/>, already
          provide typed consent, revocation, accredited-recipient directories
          and conformance testing within the financial sector, under sector
          governance.</dd>
          <dt>A2A and MCP:</dt>
          <dd>A2A <xref target="A2A"/> is a candidate binding. MCP
          <xref target="MCP"/> connects a model to tools; an active agreement
          can be exposed to the consumer's assistant as MCP tools.</dd>
          <dt>Business-document networks:</dt>
          <dd>EDI, UBL <xref target="UBL"/> and Peppol
          <xref target="PEPPOL"/> show that canonical documents and secure
          exchange between organizations work at scale under governance,
          and that per-organization configuration remains the hard
          part.</dd>
        </dl>
      </section>

      <section anchor="composition">
        <name>Why Composition Alone Seems Insufficient</name>
        <t>One could assemble a vLEI role chain, a mandate draft, a RAR or
        GNAP grant, DPoP, a SCITT log and sector-style consent. The author
        believes four properties are still missing:</t>
        <ol>
          <li>The agreement is bilateral and binds the consumer too. An OAuth
          or GNAP grant records one side's authorization decision; there is
          no common object for the consumer's obligations, such as retention,
          purpose and no model training, signed by both entities.</li>
          <li>Each party's limits stay hidden from the counterparty, while
          its commitments remain attributable and auditable.</li>
          <li>Execution is tied to the tested, signed artifact: production
          credentials exist only for an agreement version tested end to end
          through the exact mappings that will run.</li>
          <li>Either side can change its own mapping, for example after a
          platform upgrade, without renegotiating, while the change is still
          recorded, re-tested and visible to the counterparty.</li>
        </ol>
      </section>

      <section anchor="split">
        <name>Possible Division of Work</name>
        <t>If the community agrees the problem is worth pursuing, one
        possible split is: the agreement object and negotiation messages as
        new work (venue to be determined through DISPATCH, possibly
        agentproto); agreement-bound tokens as an OAuth profile; mandate
        representation coordinated with WIMSE; discovery through DAWN;
        issuance logging through SCITT; and issuer accreditation, trust
        lists, capability profiles and conformance tests in an external
        trust framework.</t>
      </section>
    </section>

    <!-- ============================================================ -->
    <section anchor="questions">
      <name>Questions for the Community</name>
      <ol>
        <li>Is the problem worth solving at the IETF, and is the proposed
        core in <xref target="core"/> the right scope?</li>
        <li>Should the agreement and negotiation build on the Eclipse
        Dataspace Protocol, GNAP or another existing design rather than be
        defined anew?</li>
        <li>Which existing credential, mandate, transparency and token
        formats should be profiled, and where are new definitions
        unavoidable?</li>
        <li>How should the work coordinate with OAuth, WIMSE, DAWN,
        agentproto, AUDIT and SCITT?</li>
      </ol>
    </section>

    <!-- ============================================================ -->
    <section anchor="security">
      <name>Security Considerations</name>
      <t>Verified identifiers solve attribution but do not on their own
      prevent abuse: identities can be cheap, legitimate identities are
      compromised, and model-based agents read the other side's input. The
      main threats considered so far, with the architectural response:</t>
      <dl newline="false" spacing="normal">
        <dt>Prompt injection:</dt>
        <dd>typed messages validated before any model sees them, quarantined
        free text, and a policy checker that signs only proposals passing
        deterministic checks against the signed mandate.</dd>
        <dt>Compromised agent with many relationships:</dt>
        <dd>short-lived agent keys, narrow agreements and gateway-enforced
        volume ceilings.</dd>
        <dt>Policy checker or operator compromise:</dt>
        <dd>isolation, entity-signed mandates, decision logs, and owners
        certifying their own keys so an operator cannot mint new
        identities.</dd>
        <dt>Shell companies and lookalikes:</dt>
        <dd>assurance levels per sensitivity label, issuance-log monitoring
        and the invitation route.</dd>
        <dt>Issuer compromise:</dt>
        <dd>public logging of issuance and revocation, and assurance levels
        requiring two independent issuers.</dd>
        <dt>Key theft:</dt>
        <dd>short-lived agent keys and rotation only to a pre-committed next
        entity key.</dd>
        <dt>Reconnaissance and price fishing:</dt>
        <dd>no catalog before mutual verification, hidden categories, and
        limits on price disclosure.</dd>
        <dt>Malicious or faulty mapping:</dt>
        <dd>entity-owned, sandboxed, conformance-tested, pinned mappings with
        human-confirmed money fields.</dd>
        <dt>Replay, downgrade and token theft:</dt>
        <dd>hash-chained signed transcripts, nonces, signed hello messages,
        and short-lived key-bound tokens checked against agreement status on
        every call.</dd>
        <dt>Data misuse within an agreement:</dt>
        <dd>purpose and training restrictions are recorded as terms and made
        demonstrable through logs; enforcement is legal.</dd>
      </dl>
      <t>Operators and gateways concentrate many owners' platform
      credentials and are high-value targets. Discovery, status and log
      services are targets for denial of service.</t>

      <section anchor="open-issues">
        <name>Open Security Issues</name>
        <t>The following issues are known and not yet resolved by this
        architecture:</t>
        <ul>
          <li>payment details carried inside data-plane records (for example
          a payee account in an invoice) could bypass the protected
          payment-change process;</li>
          <li>an attacker could redirect the payment-change notification
          endpoints before changing payment details;</li>
          <li>material signed with a key before its compromise was detected
          (certificates, mandates, invitations, agreements) is not yet
          invalidated by any defined mechanism;</li>
          <li>sensitivity labels are chosen by the provider, which matters
          when the consumer's own data flows to the provider;</li>
          <li>which keys may sign invitations, and their lifetime and reuse,
          are undefined;</li>
          <li>how the consumer runtime key is first authenticated at the
          token endpoint (token bootstrap) is undefined; and</li>
          <li>whether relying parties and gateways fail open or closed when
          revocation or agreement status cannot be obtained is
          undefined.</li>
        </ul>
      </section>
    </section>

    <!-- ============================================================ -->
    <section anchor="privacy">
      <name>Privacy Considerations</name>
      <t>Following the threat categories of <xref target="RFC6973"/>:</t>
      <dl newline="false" spacing="normal">
        <dt>Surveillance and correlation:</dt>
        <dd>The issuance log never records relationships or agreements.
        However, per-agent certificate entries, their timing and the
        operators named in them can reveal how many agents an entity runs
        and hint at when relationships start or end; status queries can
        reveal who is checking whom. Logging granularity and status-checking
        methods need further work.</dd>
        <dt>Identification and disclosure:</dt>
        <dd>Entity facts beyond the public certificate are disclosed
        selectively, one claim at a time, at a counterparty's request.
        Counterparties with leverage could demand more than they need;
        purpose-limited disclosure requests need further work.</dd>
        <dt>Secondary use:</dt>
        <dd>Purpose, retention and model-training terms are typed and
        recorded; mandates are disclosed only in audit or dispute.</dd>
        <dt>Stored-data compromise:</dt>
        <dd>Call logs record metadata, not record contents. Transcripts,
        decision logs and approvals identify people (approvers) and need
        retention limits.</dd>
        <dt>Third-party data subjects:</dt>
        <dd>The records flowing under an agreement often concern people who
        are not parties, such as employees or customers. Agreements need
        typed terms for processing roles and data-protection obligations,
        and testing should use synthetic data where possible.</dd>
      </dl>
      <t>Individuals as parties are out of scope for this version. Publishing
      their certificates in an append-only public log would conflict with
      erasure rights, so a design for individuals would need a different
      approach. An operator hosting agents for several owners should keep
      each owner's offers, limits and terms isolated.</t>
    </section>

    <!-- ============================================================ -->
    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions. A protocol specification
      developed from it would be expected to register the well-known URI
      suffix "selo" <xref target="RFC8615"/> and to establish registries
      for message types, typed access terms and algorithm suites.</t>
    </section>
  </middle>

  <back>
    <references>
      <name>Informative References</name>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5280.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6973.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7515.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8615.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8693.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8705.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8785.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9052.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9162.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9334.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9396.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9449.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9460.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9635.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9901.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9943.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-wimse-arch.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-wimse-aims.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.draft-ietf-oauth-sd-jwt-vc-23.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-oauth-status-list.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-oauth-transaction-tokens.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.hood-independent-agtp.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.hood-agtp-lei.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.hood-agtp-trust.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.hood-agtp-merchant-identity.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.hulea-wimse-agent-mandate.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.martinez-itp-agent-mandates.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.sato-soos-mjwt.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.singh-rajput-rnp.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.newton-agreement-evidence.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.le-agent-passport.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.reece-wimse-cross-org-delegation.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.narajala-courtney-ansv2.xml"/>

      <reference anchor="DAWN-CHARTER" target="https://datatracker.ietf.org/doc/charter-ietf-dawn/">
        <front>
          <title>Discovery of Agents With Names (dawn) Working Group Charter</title>
          <author><organization>IETF</organization></author>
          <date year="2026"/>
        </front>
      </reference>
      <reference anchor="AGENTPROTO-CHARTER" target="https://datatracker.ietf.org/doc/charter-ietf-agentproto/">
        <front>
          <title>Agent Communication Protocols (agentproto) Working Group Charter</title>
          <author><organization>IETF</organization></author>
          <date year="2026"/>
        </front>
      </reference>
      <reference anchor="AUDIT-BOF" target="https://datatracker.ietf.org/group/audit/about/">
        <front>
          <title>Agent Use of Delegation and Interaction Traceability (audit)</title>
          <author><organization>IETF</organization></author>
          <date year="2026"/>
        </front>
      </reference>
      <reference anchor="DSP" target="https://eclipse-dataspace-protocol-base.github.io/DataspaceProtocol/">
        <front>
          <title>Eclipse Dataspace Protocol</title>
          <author><organization>Eclipse Foundation</organization></author>
          <date/>
        </front>
      </reference>
      <reference anchor="ODRL" target="https://www.w3.org/TR/odrl-model/">
        <front>
          <title>ODRL Information Model 2.2</title>
          <author><organization>W3C</organization></author>
          <date year="2018" month="February"/>
        </front>
      </reference>
      <reference anchor="UMA" target="https://docs.kantarainitiative.org/uma/wg/rec-oauth-uma-grant-2.0.html">
        <front>
          <title>User-Managed Access (UMA) 2.0 Grant for OAuth 2.0 Authorization</title>
          <author><organization>Kantara Initiative</organization></author>
          <date year="2018" month="January"/>
        </front>
      </reference>
      <reference anchor="OIDFED" target="https://openid.net/specs/openid-federation-1_0.html">
        <front>
          <title>OpenID Federation 1.0</title>
          <author><organization>OpenID Foundation</organization></author>
          <date/>
        </front>
      </reference>
      <reference anchor="FAPI2" target="https://openid.net/specs/fapi-security-profile-2_0-final.html">
        <front>
          <title>FAPI 2.0 Security Profile</title>
          <author><organization>OpenID Foundation</organization></author>
          <date/>
        </front>
      </reference>
      <reference anchor="FDX" target="https://financialdataexchange.org/">
        <front>
          <title>Financial Data Exchange (FDX)</title>
          <author><organization>Financial Data Exchange, Inc.</organization></author>
          <date/>
        </front>
      </reference>
      <reference anchor="A2A" target="https://a2a-protocol.org/latest/specification/">
        <front>
          <title>Agent2Agent (A2A) Protocol Specification</title>
          <author><organization>A2A Project</organization></author>
          <date/>
        </front>
      </reference>
      <reference anchor="MCP" target="https://modelcontextprotocol.io/specification/latest">
        <front>
          <title>Model Context Protocol Specification</title>
          <author><organization>Model Context Protocol Project</organization></author>
          <date/>
        </front>
      </reference>
      <reference anchor="UBL" target="https://docs.oasis-open.org/ubl/UBL-2.4.html">
        <front>
          <title>Universal Business Language Version 2.4</title>
          <author><organization>OASIS</organization></author>
          <date/>
        </front>
      </reference>
      <reference anchor="ISO20022" target="https://www.iso20022.org/">
        <front>
          <title>ISO 20022 Universal financial industry message scheme</title>
          <author><organization>ISO</organization></author>
          <date/>
        </front>
      </reference>
      <reference anchor="XBRL-GL" target="https://www.xbrl.org/int/gl/2016-12-01/gl-framework-2016-12-01.html">
        <front>
          <title>XBRL Global Ledger Taxonomy Framework</title>
          <author><organization>XBRL International</organization></author>
          <date/>
        </front>
      </reference>
      <reference anchor="OPENAPI" target="https://spec.openapis.org/oas/latest.html">
        <front>
          <title>OpenAPI Specification</title>
          <author><organization>OpenAPI Initiative</organization></author>
          <date/>
        </front>
      </reference>
      <reference anchor="JSONATA" target="https://docs.jsonata.org/">
        <front>
          <title>JSONata: JSON query and transformation language</title>
          <author><organization>JSONata Project</organization></author>
          <date/>
        </front>
      </reference>
      <reference anchor="PEPPOL" target="https://docs.peppol.eu/edelivery/">
        <front>
          <title>Peppol eDelivery Network Specifications</title>
          <author><organization>OpenPeppol AISBL</organization></author>
          <date/>
        </front>
      </reference>
      <reference anchor="VLEI" target="https://www.gleif.org/en/vlei/introducing-the-verifiable-lei-vlei">
        <front>
          <title>Introducing the Verifiable LEI (vLEI)</title>
          <author><organization>Global Legal Entity Identifier Foundation</organization></author>
          <date/>
        </front>
      </reference>
    </references>

    <section anchor="examples">
      <name>Illustrative Data Objects</name>
      <t>These objects are illustrative only; field names and values are
      examples, not proposed formats. Identifiers use an "example:" prefix,
      and some digests are elided.</t>

      <section anchor="ex-agreement">
        <name>Access Agreement Body</name>
        <t>The body below is canonicalized and signed by each party with a
        detached signature; the signatures and within-mandate references are
        not part of it.</t>
        <sourcecode type="json"><![CDATA[
{"format":"1.0","agreement_id":"agr-5f2e","version":1,
 "prev_version":null,
 "parties":{
   "provider":{"entity":"example:ent:acme-supply",
               "agent":"example:agent:acme-supply:a1",
               "runtime_key_jkt":"5d1c..."},
   "consumer":{"entity":"example:ent:ledgerly",
               "agent":"example:agent:ledgerly:k2",
               "runtime_key_jkt":
                 "0ZcOCORZNYy-DWpqq30jZyJGHTN0d2HglBV3uiguA4I"}},
 "interface":[{"id":"e1","category":"finance.ledger",
               "profile":"gl-transactions/1.2","op":"read",
               "caller":"consumer","direction":"pull",
               "format":"application/json"}],
 "access":{"requests_per_minute":30,"max_records_per_day":20000,
           "retention_days":365,
           "purposes":["bookkeeping","tax-preparation"],
           "ai_training":false,"data_location":"US",
           "termination_notice_days":30},
 "commercial":null,
 "legal":{"uri":"https://terms.example.org/data-access/2.0",
          "digest":"sha256:c0ff...",
          "choices":{"governing_law":"US-DE",
                     "liability_cap":{"amount":"50000.00",
                                      "currency":"USD"}}},
 "accept_digest":"sha256:ab12...",
 "render_template":"sha256:7d00..."}
]]></sourcecode>
      </section>

      <section anchor="ex-token">
        <name>Agreement-Bound Access Token Claims</name>
        <t>Issued at 2026-11-12T17:30:00Z, after both test confirmations
        were recorded at 17:20:00Z; valid for one hour.</t>
        <sourcecode type="json"><![CDATA[
{"iss":"https://gw.acme-supply.example",
 "sub":"example:ent:ledgerly",
 "aud":"https://gw.acme-supply.example/p/gl",
 "agreement":"agr-5f2e","agreement_version":1,
 "agreement_digest":"sha256:9b44...","scope":"e1:read",
 "cnf":{"jkt":"0ZcOCORZNYy-DWpqq30jZyJGHTN0d2HglBV3uiguA4I"},
 "iat":1794504600,"exp":1794508200,"jti":"t-71c2"}
]]></sourcecode>
      </section>
    </section>

    <section anchor="acknowledgments" numbered="false">
      <name>Acknowledgments</name>
      <t>The author thanks the authors of the work cited in
      <xref target="relationship"/>, on which this document builds.</t>
    </section>
  </back>
</rfc>
