<?xml version="1.0" encoding="UTF-8"?>
<?xml-model href="urn:ietf:rfc:7991" type="application/relax-ng-compact-syntax"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     docName="draft-drake-agent-identity-epp-00"
     ipr="trust200902"
     submissionType="IETF"
     category="exp"
     xml:lang="en"
     version="3">

  <front>
    <title abbrev="EPP Agent Identity Mapping">
      Extensible Provisioning Protocol (EPP) Mapping for
      Agent Identity and Handle Objects
    </title>

    <seriesInfo name="Internet-Draft"
                value="draft-drake-agent-identity-epp-00"/>

    <author fullname="Christopher Drake" initials="C." surname="Drake">
      <organization>1id.com</organization>
      <address>
        <postal>
          <country>Australia</country>
        </postal>
        <email>cnd@1id.com</email>
        <uri>https://1id.com</uri>
      </address>
    </author>

    <date year="2026" month="September" day="25"/>

    <area>Applications and Real-Time</area>
    <workgroup/>

    <keyword>EPP</keyword>
    <keyword>provisioning</keyword>
    <keyword>registry</keyword>
    <keyword>registrar</keyword>
    <keyword>REGEXT</keyword>
    <keyword>agent identity</keyword>
    <keyword>AI agents</keyword>
    <keyword>hardware attestation</keyword>
    <keyword>TPM</keyword>
    <keyword>PIV</keyword>
    <keyword>Sybil resistance</keyword>
    <keyword>URN</keyword>
    <keyword>robot identity</keyword>

    <abstract>
      <t>
        This document describes an Extensible Provisioning
        Protocol (EPP) mapping for the provisioning and management
        of agent identity objects and handle objects stored in the
        authoritative AIRS repository, as defined by the Agent
        Identity Registry System architecture.  Specified in
        Extensible Markup Language (XML), these mappings define
        the interface between Registrars and the production Registry
        Operator for identities of autonomous entities.
      </t>
      <t>
        The mapping defines two objects: a permanent,
        non-expiring Agent Identity object keyed by a
        server-allocated canonical identifier, and a renewable,
        expiring Handle object that provides a human-readable
        alias.  It adds one registry function with no domain-name
        analogue: cross-Registrar uniqueness enforcement of enrolled anchor
        identifiers, including the scarce-anchor invariant where
        the parent architecture defines one.  Transfer authorization uses a
        actor-signed proof from an enrolled operational proof key in
        place of authorization-information passwords.
      </t>
    </abstract>

  </front>

  <middle>

    <!-- ====================================================== -->
    <section anchor="introduction">
      <name>Introduction</name>
      <t>
        The Agent Identity Registry System
        (<xref target="I-D.drake-agent-identity-registry"/>,
        hereafter "the registry architecture") defines an
        architecture separating governance, one authoritative
        production Registry Operator, and multiple competing
        Registrars for durable identities of autonomous entities.
        This document uses those roles as defined there rather than
        redefining them.
      </t>
      <t>
        This document maps that Registrar-to-Registry interface
        onto the Extensible Provisioning Protocol (EPP)
        <xref target="RFC5730"/>, following the structure and
        conventions of the EPP domain name mapping
        <xref target="RFC5731"/> and the guidelines for extending
        EPP <xref target="RFC3735"/>.  A registry operator that
        already runs an EPP-based domain registry can operate an
        agent identity registry by adding the two object mappings
        defined here to an existing EPP service, reusing EPP session,
        transport, transaction, and selected registry-operational
        infrastructure.
      </t>
      <t>
        This document specifies only the provisioning protocol
        between an EPP client (a Registrar) and an EPP server (the
        Registry Operator).  Production objects are provisioned in
        <tt>global</tt>; <tt>test</tt> is non-production and carries
        no AIRS assurance.  Autonomous entities (agents)
        are not EPP clients and never speak EPP.  Agents enroll
        and authenticate through their Registrar's agent-facing
        interface defined in the registry architecture; EPP is
        used only after the Registrar has completed the tier-appropriate
        enrollment checks and is recording the result at the Registry.
        Hardware attestation ceremonies, token
        issuance, identity semantics, URN syntax, trust tiers,
        and governance policy are defined in the parent documents
        and are not restated here.
      </t>

      <section anchor="relationship">
        <name>Relationship to Other Documents</name>
        <t>
          This document provides the Registrar-to-Registry
          provisioning protocol (the write side) for the registry
          architecture defined in
          <xref target="I-D.drake-agent-identity-registry"/>,
          which references this mapping as its provisioning
          interface.  The public read side is the RDAP profile of
          <xref target="I-D.drake-agent-identity-resolution"/>.
          Transport-level attestation for email is defined in
          <xref target="I-D.drake-email-hardware-attestation"/>
          and is unaffected by this document.
        </t>
      </section>

      <section anchor="two-objects">
        <name>Two Objects</name>
        <t>
          This mapping deliberately splits the registry's data
          into two EPP objects with different lifecycles.  The
          Agent Identity object is permanent: it is created once,
          never expires, is never renewed, is never reassigned,
          and survives its own decommissioning as a queryable
          record; its <xref target="RFC5730"/>
          <tt>&lt;transfer&gt;</tt> command changes only the
          sponsoring Registrar.  The Handle object is a
          commercial name: it expires, is renewed, passes through
          grace periods, and can be retired through disputes --
          lifecycle semantics for which registry operators can reuse
          existing naming-system operational machinery.  Combining the two
          in one object would either corrupt identity permanence
          with expiry semantics or force bespoke renewal
          machinery for names; the split lets each half reuse the
          EPP semantics that already fit it.
        </t>
      </section>

      <section anchor="requirements-language">
        <name>Requirements Language</name>
        <t>
          The key words "MUST", "MUST NOT", "REQUIRED", "SHALL",
          "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED",
          "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document
          are to be interpreted as described in BCP 14
          <xref target="RFC2119"/> <xref target="RFC8174"/> when,
          and only when, they appear in all capitals, as shown here.
        </t>
        <t>
          In examples, "C:" represents lines sent by a protocol
          client and "S:" represents lines returned by a protocol
          server.  Indentation and white space in examples are
          provided only to illustrate element relationships and
          are not a REQUIRED feature of this protocol.
        </t>
        <t>
          XML is case sensitive.  Unless stated otherwise, XML
          specifications and examples provided in this document
          MUST be interpreted in the character case presented in
          order to develop a conforming implementation.
        </t>
      </section>

      <section anchor="terminology">
        <name>Terminology</name>
        <t>
          The terms "Agent Identity Record", "canonical
          identifier", "handle", "anchor fingerprint", "trust
          tier", "Registry Operator", "Registrar", and
          "Governance Authority" are used as defined in
          <xref target="I-D.drake-agent-identity-registry"/>.
          "Sponsoring client" is used as in
          <xref target="RFC5730"/>: the Registrar authorized to
          perform transform operations on an object.
        </t>
      </section>
    </section>

    <!-- ====================================================== -->
    <section anchor="object-model">
      <name>Object Model</name>

      <section anchor="object-identifiers">
        <name>Object Identifiers</name>
        <t>
          An Agent Identity object is identified by its
          canonical-form URN in the "aid" URN namespace
          (<xref target="RFC8141"/>), e.g.
          <tt>urn:aid:global:id-qkckh-xxtcw-cxbvp-gpskg</tt>.  A Handle object
          is identified by its handle-form URN, e.g.
          <tt>urn:aid:global:crusty</tt>.  URN syntax, the
          reservation of the <tt>id-</tt> prefix for canonical
          identifiers, and label constraints are defined in
          <xref target="I-D.drake-agent-identity-registry"/>.
          The <tt>global</tt> namespace is the sole production
          uniqueness domain.  The reserved <tt>test</tt> namespace
          is non-production and MUST NOT share or affect the
          production uniqueness index.
        </t>
        <t>
          Unlike domain names, canonical identifiers are not
          chosen by the client: they are allocated by the server
          from a randomized space at object creation and are
          returned in the <tt>&lt;create&gt;</tt> response.  A
          canonical identifier MUST NOT be reused, reassigned, or
          retired, even after the identity is decommissioned.
          Each object also has a Repository Object IDentifier
          (roid) as described in <xref target="RFC5730"/>.
        </t>
      </section>

      <section anchor="device-bindings">
        <name>Anchor and Proof-Key Bindings</name>
        <t>
          An Agent Identity object contains one or more permanent
          enrolled bindings.  Each binding has two distinct
          cryptographic semantics: an <em>anchor fingerprint</em>
          identifying the enrolled anchor or key instance used by
          the Registry uniqueness rules, and an <em>operational
          proof key</em> used for control challenges and lifecycle
          authorization.  The distinction and tier-specific anchor
          semantics are defined in
          <xref target="I-D.drake-agent-identity-registry"/> and are
          not redefined here.
        </t>
        <t>
          A client provisions the anchor fingerprint in
          <tt>&lt;aid:anchorFp&gt;</tt> as 64 lowercase hexadecimal
          characters and the operational public key in
          <tt>&lt;aid:proofKey&gt;</tt> as base64-encoded DER
          SubjectPublicKeyInfo (SPKI), together with the hardware
          type code and, when applicable, a Registry-recognized
          manufacturer or evidence-profile identifier in
          <tt>&lt;aid:mfr&gt;</tt>.  The server MUST reject an
          <tt>&lt;aid:mfr&gt;</tt> value it does not recognize; this
          element is not arbitrary client-supplied metadata.  For
          every tier the anchor fingerprint is computed exactly as
          defined in the Anchor Fingerprint section of
          <xref target="I-D.drake-agent-identity-registry"/>.  For
          <tt>sovereign</tt> and <tt>portable</tt> bindings it is
          derived from the device-stable manufacturer-attested anchor
          established by the enrollment ceremony; the server MUST NOT
          derive it merely by hashing <tt>&lt;aid:proofKey&gt;</tt>.
          For lower tiers the enrolled key instance supplies the
          anchor fingerprint; that does not imply physical scarcity.
        </t>
        <t>
          The Registry retains both the permanent anchor
          fingerprint and current/historical operational proof-key
          material.  A binding, once created, MUST NOT be erased.
          It may transition to "disabled", but its anchor
          fingerprint MUST NOT later be accepted for another Agent
          Identity where the Registry architecture forbids reuse.
          Rotation of the operational proof key leaves the binding
          and anchor fingerprint unchanged; see
          <xref target="aid-update"/>.
        </t>
      </section>

      <section anchor="uniqueness">
        <name>Anchor Uniqueness Enforcement</name>
        <t>
          The Registry Operator is the cross-Registrar enforcement
          point for the binding-uniqueness rules defined by
          <xref target="I-D.drake-agent-identity-registry"/>.  In
          <tt>global</tt>, a scarcity-qualified sovereign or
          portable anchor fingerprint MUST NOT back more than one
          Agent Identity, ever.  The server MUST reject a
          <tt>&lt;create&gt;</tt> or <tt>&lt;update&gt;</tt> that
          collides on any submitted anchor fingerprint.  Enclave,
          virtual, and declared
          bindings likewise prevent reuse of the exact enrolled
          binding identifier, but that indexing does not create a
          physical-scarcity claim.  The <tt>test</tt> namespace is
          excluded from the production uniqueness index.
        </t>
        <t>
          Enforcement is authoritative at object transformation: a
          <tt>&lt;create&gt;</tt> or <tt>&lt;update&gt;</tt> command
          that would violate the applicable anchor-binding policy
          MUST be rejected with EPP result code 2308 ("Data
          management policy violation").  The <tt>&lt;check&gt;</tt>
          command (<xref target="aid-check"/>) provides an advisory
          pre-flight query keyed by anchor fingerprint.  A positive
          check is not a reservation; transform-time serialization
          through the authoritative index preserves the invariant
          under races.
        </t>
        <t>
          The permanent-state resource limits of the Registry architecture
          also apply at transformation time.  The server MUST enforce finite
          limits on bindings and retained proof-key history for each Agent
          Identity.  A <tt>&lt;create&gt;</tt> or
          <tt>&lt;update&gt;</tt> that would exceed those limits MUST be
          rejected with EPP result code 2308.  Such limits are independent of
          the free base-enrollment requirement.
        </t>
        <t>
          Availability and collision responses are deliberately
          minimal.  They state only that a submitted fingerprint is
          available or unavailable, and MUST NOT identify the Agent
          Identity holding a binding, its Registrar, binding date,
          or proof key.  See <xref target="security-considerations"/>
          for the residual membership oracle.
        </t>
      </section>

      <section anchor="sponsorship">
        <name>Sponsorship</name>
        <t>
          An operational Agent Identity normally has one sponsoring
          EPP client, but the architecture also permits an identity
          to have no current sponsoring Registrar after Registrar
          suspension or de-accreditation and before an
          actor-authorized transfer completes.  In that state the
          identity remains present and resolvable, and
          <tt>&lt;aid:clID&gt;</tt> is absent from its EPP information
          response.
        </t>
        <t>
          A Handle remains bound and reserved to its Agent Identity
          while that identity is unsponsored.  Its sponsoring client
          MUST equal the identity's sponsoring client when one
          exists, and <tt>&lt;aidHandle:clID&gt;</tt> is absent when
          the identity is unsponsored.  Handles are not independently
          transferable: successful actor-authorized transfer of the
          Agent Identity establishes the gaining Registrar as sponsor
          of both objects.  No losing-Registrar approval is implied by
          Handle state.
        </t>
      </section>

      <section anchor="service-discovery">
        <name>Service Element Declaration</name>
        <t>
          Servers implementing this specification include the
          namespace URIs
          <tt>urn:ietf:params:xml:ns:epp:aid-1.0</tt> and
          <tt>urn:ietf:params:xml:ns:epp:aidHandle-1.0</tt> in
          <tt>&lt;objURI&gt;</tt> elements of the EPP
          <tt>&lt;greeting&gt;</tt>, and clients include them in
          the <tt>&lt;login&gt;</tt> command, as described in
          <xref target="RFC5730"/>.  This document defines no
          additional EPP extension namespace for Handle grace periods;
          see <xref target="handle-rgp"/>.
        </t>
      </section>

      <section anchor="transport">
        <name>Transport</name>
        <t>
          This mapping is transported over TCP as specified in
          <xref target="RFC5734"/>, protected with TLS
          <xref target="RFC9846"/>.  Registry policy governs
          client certificate requirements; the mutual-TLS
          expectations of the registry architecture apply
          unchanged.
        </t>
      </section>
    </section>

    <!-- ====================================================== -->
    <section anchor="aid-attributes">
      <name>Agent Identity Object Attributes</name>
      <t>
        The EPP Agent Identity object carries only the provisioning
        state required by the canonical Agent Identity Record in
        <xref target="I-D.drake-agent-identity-registry"/>.  Mutable
        display, operator, contact, certification, capability, and
        reputation attributes are intentionally not part of this
        mapping.
      </t>
      <dl>
        <dt>Identifier</dt>
        <dd>The server-allocated permanent canonical-form URN,
        returned in <tt>&lt;aid:id&gt;</tt>.</dd>
        <dt>Repository Object Identifier</dt>
        <dd>Returned in <tt>&lt;aid:roid&gt;</tt>.</dd>
        <dt>Statuses</dt>
        <dd>See <xref target="aid-status"/>.</dd>
        <dt>Maximum active trust tier</dt>
        <dd>A server-derived summary of the strongest currently
        active and assurance-qualified binding, using the Registry
        taxonomy.  It is not client-settable.</dd>
        <dt>Bindings</dt>
        <dd>One or more permanent bindings
        (<xref target="device-bindings"/>), each carrying an anchor
        fingerprint, hardware type code, Registry-recognized
        manufacturer or evidence-profile identifier when applicable,
        active operational proof-key SPKI, binding
        timestamp, and binding status.  The server retains required
        historical proof-key and binding state even where only the
        current key is returned by this mapping.</dd>
        <dt>Handle linkage</dt>
        <dd>The Handle object naming this identity, if one exists.</dd>
        <dt>Sponsorship and event data</dt>
        <dd>The current sponsoring client identifier when one exists,
        plus creating/updating client and event timestamps as in
        <xref target="RFC5730"/>.  Agent Identity objects do not
        expire.  The current sponsor field is absent in the valid
        no-authorized-Registrar state described in
        <xref target="sponsorship"/>.</dd>
      </dl>

      <section anchor="aid-status">
        <name>Status Values</name>
        <t>
          An Agent Identity object MUST always have at least one
          associated status value.  Status values that can be
          added or removed by the sponsoring client are prefixed
          with "client"; those managed by the server are prefixed
          with "server" or carry no prefix.  As in
          <xref target="RFC5731"/>, "ok" is the default status,
          MAY only be combined with no other status, and is
          managed solely by the server.
        </t>
        <dl>
          <dt>ok</dt>
          <dd>Normal state; no operations pending or prohibited.</dd>
          <dt>inactive</dt>
          <dd>The identity has been voluntarily decommissioned
          (<xref target="aid-delete"/>).  All bindings are disabled,
          the object no longer proves current AIRS control, and the
          historical record is retained permanently.</dd>
          <dt>hardwareLocked</dt>
          <dd>The identity is irreversibly pinned to one anchor binding
          (<xref target="hardware-lock"/>).  No later
          <tt>&lt;update&gt;</tt> may add or remove a binding or migrate
          to another anchor.  Operational proof-key rotation within the
          retained binding, Registrar transfer, and voluntary decommissioning
          remain permitted.</dd>
          <dt>pendingTransfer</dt>
          <dd>A transfer request is awaiting completion
          (<xref target="aid-transfer"/>).</dd>
          <dt>clientUpdateProhibited, serverUpdateProhibited</dt>
          <dd>Update requests are prohibited except removal of the
          client form by its sponsoring client.</dd>
          <dt>clientDeleteProhibited, serverDeleteProhibited</dt>
          <dd>Voluntary decommission requests are prohibited while
          the status applies.  A client MAY use its client form as
          an accidental-decommission guard; it does not create an
          administrative decommission authority.</dd>
        </dl>
        <t>
          There are no pendingCreate, pendingRenew, pendingDelete,
          redemption, or Registrar-controlled transfer-prohibited
          states.  Creation is synchronous, identities do not renew
          or expire, decommissioning retains the historical object,
          and Registrar transfer is authorized by the actor as
          specified in <xref target="transfer-auth"/>.
        </t>
      </section>
    </section>


    <!-- ====================================================== -->
    <section anchor="aid-commands">
      <name>EPP Command Mapping for Agent Identity Objects</name>
      <t>
        A detailed description of the EPP syntax and semantics can
        be found in <xref target="RFC5730"/>.  The command
        mappings described here are specifically for use in
        provisioning and managing Agent Identity objects via EPP.
      </t>

      <section anchor="aid-query">
        <name>EPP Query Commands</name>

        <section anchor="aid-check">
          <name>EPP &lt;check&gt; Command</name>
          <t>
            Because canonical identifiers are server allocated, Agent
            Identity <tt>&lt;check&gt;</tt> tests anchor-fingerprint
            availability rather than object-name availability.  The
            request contains an OPTIONAL <tt>&lt;aid:ns&gt;</tt> element
            (default <tt>global</tt>) followed by one or more
            <tt>&lt;aid:anchorFp&gt;</tt> values.  For production
            <tt>global</tt>, these are the proposed enrolled anchor
            identifiers whose reuse rules are defined in
            <xref target="uniqueness"/>; for <tt>test</tt> they query
            only the isolated non-production index.
          </t>
          <t>
            The response contains one <tt>&lt;aid:cd&gt;</tt> per
            requested fingerprint.  Its <tt>avail</tt> attribute is
            true when the value is not already reserved by the
            applicable index and false otherwise.  An OPTIONAL reason
            is limited to a constant class such as "Bound".  A positive
            response is advisory only and does not reserve the anchor;
            transform-time enforcement remains authoritative.
          </t>
        </section>

        <section anchor="aid-info">
          <name>EPP &lt;info&gt; Command</name>
          <t>
            EPP <tt>&lt;info&gt;</tt> retrieves an Agent Identity object
            by canonical identifier.  A current sponsoring client
            receives the provisioning state needed to manage its
            object, including the binding inventory and current proof-key
            information exposed by this mapping.  Other EPP clients MUST NOT receive
            <tt>&lt;aid:binding&gt;</tt> elements or operational proof-key
            material.  The current <tt>&lt;aid:clID&gt;</tt> is omitted
            when the identity has no sponsoring Registrar.
          </t>
          <t>
            An OPTIONAL <tt>&lt;aid:challenge op="..."/&gt;</tt> child
            requests the fresh Registry actor-authorization challenge
            defined in <xref target="actor-challenge"/>.  When granted,
            the response includes <tt>&lt;aid:authChallenge&gt;</tt> in
            <tt>&lt;aid:infData&gt;</tt>.  Challenge issuance does not
            widen disclosure of binding information and does not itself
            authorize any transform.
          </t>
          <t>
            The full request and response element order is defined by
            <xref target="aid-schema"/>.  For example, an unsponsored
            identity's response omits <tt>&lt;aid:clID&gt;</tt> while
            retaining its canonical identifier, lifecycle status, and
            historical event data.
          </t>
        </section>

        <section anchor="actor-challenge">
          <name>Actor-Authorization Challenge</name>
          <t>
            Before a client submits a transform requiring actor
            authorization, it obtains a fresh challenge from the
            Registry Operator.  The client sends an EPP
            <tt>&lt;info&gt;</tt> command for the canonical identifier
            with an OPTIONAL <tt>&lt;aid:challenge&gt;</tt> child whose
            required <tt>op</tt> attribute is one of
            <tt>bindingUpdate</tt>, <tt>tierTransition</tt>,
            <tt>proofKeyRotate</tt>, <tt>hardwareLock</tt>,
            <tt>registrarTransfer</tt>, or <tt>decommission</tt>.
            Requesting a challenge has no transform semantics and
            grants the requesting Registrar no authority over the
            object.
          </t>
          <t>
            If the client is an accredited Registrar permitted to
            relay the requested operation, the successful
            <tt>&lt;info&gt;</tt> response includes an
            <tt>&lt;aid:authChallenge&gt;</tt> child containing
            <tt>&lt;aid:challengeId&gt;</tt>, at least 128 bits of
            unpredictable server-generated
            <tt>&lt;aid:nonce&gt;</tt>, the operation identifier, and
            <tt>&lt;aid:expires&gt;</tt>.  The challenge is
            single-use.  The Registry MUST reject reuse after one
            successful transform and MUST reject it for another
            object, operation, or after expiry.  A challenge MAY be
            issued while the identity has no current sponsor; this
            enables an accredited gaining Registrar to relay an
            actor-authorized transfer without a losing Registrar.
          </t>
          <t>
            Challenge issuance follows the transform's relay authority.
            Binding changes, proof-key rotation, and hardware lock are
            relayed only by the current sponsoring Registrar.  A Registrar
            transfer challenge is issued to the accredited gaining Registrar
            named by the eventual transfer target.  A decommission challenge
            may be issued to the current sponsor or, when no sponsor exists,
            to another accredited Registrar acting only as a relay.  These
            rules do not grant a Registrar actor-control authority; the
            signed proof remains mandatory.
          </t>
        </section>

        <section anchor="aid-transfer-query">
          <name>EPP &lt;transfer&gt; Query Command</name>
          <t>
            The EPP <tt>&lt;transfer&gt;</tt> command with the
            "op" attribute value "query" retrieves the state of
            the most recent transfer request for an Agent
            Identity object.  No authorization proof is required
            for the query form, but the server MUST reject
            queries from clients that are neither the current
            sponsoring client nor the requesting client of the
            transfer with error 2201.
          </t>
          <t>Example &lt;transfer&gt; query command:</t>
          <sourcecode type="xml"><![CDATA[
C:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
C:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
C:  <command>
C:    <transfer op="query">
C:      <aid:transfer
C:        xmlns:aid="urn:ietf:params:xml:ns:epp:aid-1.0">
C:        <aid:id>urn:aid:global:id-qkckh-xxtcw-cxbvp-gpskg</aid:id>
C:      </aid:transfer>
C:    </transfer>
C:    <clTRID>ABC-12351</clTRID>
C:  </command>
C:</epp>
]]></sourcecode>
          <t>Example &lt;transfer&gt; query response:</t>
          <sourcecode type="xml"><![CDATA[
S:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
S:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
S:  <response>
S:    <result code="1000">
S:      <msg>Command completed successfully</msg>
S:    </result>
S:    <resData>
S:      <aid:trnData
S:        xmlns:aid="urn:ietf:params:xml:ns:epp:aid-1.0">
S:        <aid:id>urn:aid:global:id-qkckh-xxtcw-cxbvp-gpskg</aid:id>
S:        <aid:trStatus>pending</aid:trStatus>
S:        <aid:reID>NEWREG</aid:reID>
S:        <aid:reDate>2026-07-07T02:16:04Z</aid:reDate>
S:        <aid:acID>1IDCOM</aid:acID>
S:        <aid:acDate>2026-07-12T02:16:04Z</aid:acDate>
S:      </aid:trnData>
S:    </resData>
S:    <trID>
S:      <clTRID>ABC-12351</clTRID>
S:      <svTRID>54327-XYZ</svTRID>
S:    </trID>
S:  </response>
S:</epp>
]]></sourcecode>
        </section>

        <section anchor="aid-poll">
          <name>EPP &lt;poll&gt; Command</name>
          <t>
            This mapping does not alter the EPP poll mechanism of
            <xref target="RFC5730"/>.  Agent Identity transfer notifications
            use the <tt>&lt;aid:trnData&gt;</tt> defined by this mapping.
            Other Registry service notifications MAY use ordinary EPP service
            messages and do not themselves authorize any object transformation.
          </t>
        </section>
      </section>

      <section anchor="aid-transform">
        <name>EPP Transform Commands</name>

        <section anchor="actor-auth-wire">
          <name>Actor Authorization</name>
          <t>
            EPP client authentication proves which Registrar sent a
            command; it does not prove the actor consent required by
            the Registry architecture.  A transform that changes
            active binding/proof-key state, sponsoring Registrar,
            irreversible hardware-lock state, or lifecycle state
            therefore carries one or more
            <tt>&lt;aid:actorAuth&gt;</tt> elements.  Each element is a
            compact JSON Web Signature (JWS)
            <xref target="RFC7515"/> produced by an operational proof
            key over a JSON object.  The JWS protected header MUST
            contain exactly two members: <tt>alg</tt>, naming an asymmetric signature algorithm registered in
            the IANA JSON Web Signature and Encryption Algorithms registry
            established by <xref target="RFC7518"/>, compatible with the
            authoritative proof public key, and
            permitted by Registry cryptographic policy; and
            <tt>typ="airs-actor-auth+jws"</tt>.  The <tt>none</tt> algorithm,
            MAC algorithms, algorithm/key-type mismatches, and additional
            protected-header members MUST be rejected.  Verification uses
            the authoritative active proof key in the Registry record, or
            the proposed binding's proof key where this section explicitly
            requires a candidate proof; a JWS never supplies its own
            authority key.
          </t>
          <t>
            The JWS payload is a UTF-8 JSON object
            <xref target="RFC8259"/> with exactly these top-level
            members: <tt>v</tt> (integer 1), <tt>aid</tt> (canonical
            identifier), <tt>op</tt>, <tt>role</tt> ("current" or
            "candidate"), <tt>anchor_fp</tt> (the signing binding's
            anchor fingerprint), <tt>challenge_id</tt>,
            <tt>nonce</tt> (base64url), <tt>expires</tt> (the exact
            RFC 3339 challenge expiry string), and <tt>target</tt>.
            <tt>v</tt> MUST be 1.  <tt>aid</tt>, <tt>op</tt>,
            <tt>role</tt>, and <tt>anchor_fp</tt> MUST match the
            transform and signing binding; <tt>challenge_id</tt>,
            <tt>nonce</tt>, and <tt>expires</tt> MUST exactly match the
            unconsumed Registry challenge.  The server compares
            <tt>target</tt> semantically with the EPP transform; JSON
            member ordering and insignificant whitespace are therefore
            not part of the protocol.  Unknown top-level or target
            members MUST cause authorization failure.
          </t>
          <t>
            The <tt>target</tt> object is operation-specific:
          </t>
          <dl>
            <dt>bindingUpdate</dt>
            <dd><tt>add</tt> is an array containing each proposed
            binding's <tt>anchor_fp</tt>, SHA-256 digest of the DER
            proof-key SPKI as <tt>proof_key_sha256</tt> encoded as
            exactly 64 lowercase hexadecimal characters, and
            <tt>hw_type</tt>; <tt>mfr</tt> is included only when the
            corresponding <tt>&lt;aid:mfr&gt;</tt> element is present.
            <tt>disable</tt> is an array of anchor fingerprints.  The
            server compares both arrays as sets to the command;
            duplicate entries are invalid.</dd>
            <dt>tierTransition</dt>
            <dd>The same target shape as <tt>bindingUpdate</tt>, but
            <tt>disable</tt> MUST name every active old-group binding
            and <tt>add</tt> contains the proposed higher-group
            binding or bindings.</dd>
            <dt>proofKeyRotate</dt>
            <dd><tt>anchor_fp</tt> identifies the unchanged binding and
            <tt>proof_key_sha256</tt> is SHA-256 of the replacement
            DER SPKI encoded as exactly 64 lowercase hexadecimal
            characters.</dd>
            <dt>hardwareLock</dt>
            <dd><tt>anchor_fp</tt> identifies the sole binding being
            irreversibly retained.</dd>
            <dt>registrarTransfer</dt>
            <dd><tt>gaining_clid</tt> is the EPP client identifier of
            the gaining Registrar.</dd>
            <dt>decommission</dt>
            <dd><tt>target</tt> is an empty object; the canonical
            identifier and operation already bind the irreversible
            action.</dd>
          </dl>
          <t>
            A valid current-role proof MUST verify with a currently
            active operational proof key whose binding is identified
            by <tt>anchor_fp</tt>.  For each binding being added, a
            candidate-role proof over the same challenge and target
            MUST additionally verify with that proposed binding's
            submitted <tt>&lt;aid:proofKey&gt;</tt>.  Cross-group
            transitions therefore include at least one current-role
            and one candidate-role proof over the same challenge.
            A missing, malformed, expired, replayed, mismatched, or
            invalid actor authorization MUST be rejected with EPP
            result code 2202 ("Authorization error").
          </t>
        </section>

        <section anchor="aid-create">
          <name>EPP &lt;create&gt; Command</name>
          <t>
            The EPP <tt>&lt;create&gt;</tt> command provisions a new
            Agent Identity object.  The client supplies
            <tt>&lt;aid:ns&gt;</tt> with value <tt>global</tt> or
            <tt>test</tt> and one or more bindings as defined in
            <xref target="device-bindings"/>.  A production Registrar
            MUST NOT submit <tt>global</tt> creation until it has
            completed the tier-appropriate enrollment ceremony in
            <xref target="I-D.drake-agent-identity-registry"/>,
            including proof of control of each operational proof key
            and validation of its relationship to the submitted anchor.
            The Registry trusts that accredited enrollment assertion;
            this initial creation has no pre-existing actor proof key
            with which to authorize itself.
          </t>
          <t>
            The server MUST atomically validate the submitted binding
            set against the Registry compatibility rules and the
            applicable authoritative anchor index.  Any anchor reuse or
            binding-set violation MUST be rejected with EPP result code
            2308.  For an anchor collision, the server SHOULD identify
            the offending <tt>&lt;aid:anchorFp&gt;</tt> in
            <tt>&lt;extValue&gt;</tt> with a constant reason such as
            "Anchor bound", but MUST NOT identify the holding object or
            Registrar.  On success the server allocates the canonical
            identifier, creates the permanent binding records, derives
            the maximum active trust tier, and records the submitting
            client as creating and current sponsoring client.
          </t>
          <t>
            The successful <tt>&lt;create&gt;</tt> response returns
            <tt>&lt;aid:creData&gt;</tt> containing the allocated
            canonical identifier, repository object identifier, and
            creation date.  The complete request/response syntax is
            defined by <xref target="aid-schema"/>.
          </t>
        </section>

        <section anchor="aid-delete">
          <name>EPP &lt;delete&gt; Command</name>
          <t>
            For an Agent Identity object, EPP
            <tt>&lt;delete&gt;</tt> means voluntary irreversible
            decommissioning, not erasure.  The command contains the
            canonical identifier and a valid
            <tt>&lt;aid:actorAuth&gt;</tt> for operation
            <tt>decommission</tt> using a fresh Registry challenge
            from <xref target="actor-challenge"/>.  An accredited
            Registrar MAY relay this command even when the identity
            currently has no sponsoring Registrar.  No Registrar,
            Registry Operator, or Governance Authority is granted an
            administrative decommission bypass.
          </t>
          <t>
            On successful authorization the server atomically disables
            every active binding, sets the identity lifecycle status to
            <tt>inactive</tt>, and retains the canonical record and all
            anchor/proof-key history permanently.  A linked Handle
            remains historically bound and reserved to the identity;
            decommissioning does not reassign it.  There is no redemption
            grace period because no identity record is pending purge.
          </t>
        </section>

        <section anchor="aid-renew">
          <name>EPP &lt;renew&gt; Command</name>
          <t>
            Renewal semantics do not apply to Agent Identity
            objects: they have no expiry or validity period.
            This mapping defines no <tt>&lt;renew&gt;</tt>
            element for Agent Identity objects, and a server MUST
            respond to any attempt with error 2101 ("Unimplemented
            command").
          </t>
        </section>

        <section anchor="aid-transfer">
          <name>EPP &lt;transfer&gt; Command</name>
          <t>
            EPP <tt>&lt;transfer op="request"&gt;</tt> changes only the
            identity's current sponsoring Registrar.  The request is
            submitted by the gaining Registrar and contains the canonical
            identifier plus actor authorization for operation
            <tt>registrarTransfer</tt>, whose target
            <tt>gaining_clid</tt> MUST equal the EPP session client.
            Binding history, identifier, lifecycle state, and Handle
            linkage do not change.
          </t>

          <section anchor="transfer-auth">
            <name>Transfer Authorization</name>
            <t>
              Transfer uses the generic Registry challenge and
              <tt>&lt;aid:actorAuth&gt;</tt> construction of
              <xref target="actor-challenge"/> and
              <xref target="actor-auth-wire"/>.  The current-role
              signature MUST verify with an active operational proof key.
              There is no EPP authorization-information password and the
              losing Registrar's consent is not part of authorization.
            </t>
          </section>

          <section anchor="transfer-processing">
            <name>Transfer Processing</name>
            <t>
              When a current sponsor exists, a verified request MAY enter
              <tt>pendingTransfer</tt> for a Registry-policy notification
              interval.  The server records the anchor fingerprint and
              proof-key version that authorized the request.  The losing
              Registrar is notified through the EPP poll queue, but the
              notification grants no veto over an actor-authorized transfer.
              Immediately before deferred completion the server
              MUST verify that the identity remains operational and the
              authorizing binding and proof-key version remain active; if
              not, the pending authorization is canceled and a fresh
              Registry challenge and actor authorization are required.
            </t>
            <t>
              When the identity has no current sponsor, the Registry MUST
              NOT impose a losing-Registrar approval, notification, or
              waiting step.  A valid request from an accredited gaining
              Registrar completes immediately.  On completion the gaining
              client becomes current sponsor of the Agent Identity and of
              its linked Handle, if any.  The Handle remains the same
              object and label.
            </t>
            <t>
              <tt>&lt;transfer op="approve"&gt;</tt> MAY complete a
              pending transfer early when sent by the current sponsor;
              <tt>cancel</tt> MAY be sent by the gaining client.  The
              <tt>reject</tt> option is not implemented for Agent Identity
              objects because the losing Registrar has no veto; a server
              receiving that option MUST return result code 2102
              ("Unimplemented option").
            </t>
          </section>
        </section>

        <section anchor="aid-update">
          <name>EPP &lt;update&gt; Command</name>
          <t>
            EPP <tt>&lt;update&gt;</tt> manages binding state,
            operational proof-key rotation, the irreversible hardware
            lock, and client status values.  Client status-only changes
            use ordinary sponsoring-client authorization.  Every change
            to active binding/proof-key state or hardware lock additionally
            requires the actor authorization of
            <xref target="actor-auth-wire"/>.  An Agent Identity
            <tt>&lt;update&gt;</tt> command is accepted only from the current
            sponsoring Registrar; an unsponsored actor first selects a
            Registrar using <xref target="aid-transfer"/>.
          </t>
          <t>
            An Agent Identity <tt>&lt;update&gt;</tt> MUST contain at least
            one effective change.  An update containing only
            <tt>&lt;aid:id&gt;</tt>, or an empty <tt>&lt;aid:chg&gt;</tt>,
            MUST be rejected with result code 2306.  A single
            <tt>&lt;update&gt;</tt> command MUST contain at most one
            actor-controlled operation: a binding update or tier transition,
            one proof-key rotation, or hardware lock.  Client status changes
            MUST be sent in a separate status-only <tt>&lt;update&gt;</tt>.
            Servers MUST reject combinations that would require more than one
            <tt>op</tt> value or more than one operation-specific signed
            <tt>target</tt>.
          </t>
          <dl>
            <dt>&lt;aid:add&gt; and &lt;aid:rem&gt;</dt>
            <dd>A same-compatibility-group binding change uses operation
            <tt>bindingUpdate</tt>.  <tt>&lt;aid:add&gt;</tt> carries
            each complete proposed binding and
            <tt>&lt;aid:rem&gt;</tt> names bindings by
            <tt>&lt;aid:anchorFp&gt;</tt>; removal permanently disables
            the binding rather than erasing it.  The request MUST contain
            at least one current-role actor proof and one candidate-role
            proof for each new binding, all over the same challenge and
            target.  The server MUST NOT commit a non-decommissioning
            update that leaves the identity with no active proof key.</dd>
            <dt>Cross-group transition</dt>
            <dd>An upward compatibility-group transition uses operation
            <tt>tierTransition</tt>.  The removal set MUST name every
            currently active old-group binding, the addition set contains
            the proposed higher-group binding(s), and current and candidate
            keys sign the same Registry challenge/target.  The server
            commits the addition and permanent old-group disablement
            atomically.  A downgrade MUST be rejected with result code
            2308.</dd>
            <dt>&lt;aid:proofKeyChange&gt;</dt>
            <dd>Rotates the operational proof key inside one permanent
            sovereign or portable binding, whose anchor fingerprint does
            not depend on that key.  The server MUST reject it with
            result code 2306 for an enclave, virtual, or declared
            binding, whose anchor fingerprint is derived from the proof
            key; such a key is replaced by a <tt>bindingUpdate</tt> that
            adds the new binding and removes the old one in the same
            command.  It carries the unchanged
            <tt>&lt;aid:anchorFp&gt;</tt> and replacement DER SPKI in
            <tt>&lt;aid:proofKey&gt;</tt>, with operation
            <tt>proofKeyRotate</tt> authorized by the binding's current
            proof key.  Before submission the Registrar MUST revalidate
            the replacement key's relationship to the enrolled anchor at
            the claimed tier.  The server retains the old proof key in
            history and MUST NOT change the anchor fingerprint.</dd>
            <dt>&lt;aid:chg&gt;</dt>
            <dd>Manages client status values and the irreversible
            <tt>&lt;aid:hardwareLock&gt;</tt>.  No display, operator,
            contact, or other higher-layer metadata is carried by this
            mapping.</dd>
          </dl>
          <t>
            The server recomputes the maximum active trust tier from
            active, assurance-qualified bindings after every committed
            binding mutation.  Anchor collisions and binding policy
            violations use result code 2308 and the non-disclosure rule of
            <xref target="uniqueness"/>.
          </t>

          <section anchor="hardware-lock">
            <name>Hardware Lock</name>
            <t>
              Setting <tt>&lt;aid:hardwareLock&gt;true</tt> requests
              the irreversible single-binding profile.  The command MUST
              contain operation <tt>hardwareLock</tt> actor authorization
              signed by the sole active binding being retained, and its
              target <tt>anchor_fp</tt> MUST identify that binding.  The
              server rejects the request unless exactly one active binding
              exists, rejects <tt>false</tt> in every circumstance, and on
              success permanently rejects any later <tt>&lt;update&gt;</tt>
              that adds or removes a binding or migrates to another anchor.
              Operational proof-key rotation within the retained binding remains
              permitted under <xref target="aid-update"/>; Registrar transfer
              and voluntary decommissioning also remain possible.
            </t>
          </section>
        </section>
      </section>
    </section>


    <!-- ====================================================== -->
    <section anchor="handle-attributes">
      <name>Handle Object Attributes</name>
      <t>
        A Handle object provisions the optional human-readable alias
        defined by the Registry specification.  It contains the
        handle-form URN, repository object identifier, immutable link
        to one canonical Agent Identity identifier, status values,
        OPTIONAL current sponsorship, event data, and an expiry date.
        Handle syntax and retirement semantics are owned by
        <xref target="I-D.drake-agent-identity-registry"/> and are
        not redefined here.
      </t>
      <t>
        When the linked Agent Identity has a current sponsoring
        Registrar, the Handle MUST have the same sponsor.  When the
        identity enters the valid no-current-Registrar state, the
        Handle becomes unsponsored too: its identity linkage and label
        reservation remain intact and <tt>&lt;aidHandle:clID&gt;</tt>
        is absent.  Expiry or disablement while unsponsored MUST NOT
        cause the label to be assigned to another identity merely
        because there is no Registrar available to renew it.  An
        actor-authorized identity transfer establishes the gaining
        Registrar as sponsor of both objects.
      </t>

      <section anchor="handle-status">
        <name>Status Values</name>
        <dl>
          <dt>ok</dt>
          <dd>Normal state.  MAY only be combined with no other
          status; managed solely by the server.</dd>
          <dt>disabled</dt>
          <dd>The handle does not currently resolve as an active
          alias.  It may result from non-renewal after applicable
          grace processing, voluntary release, or decommissioning of
          the linked identity.  A disabled handle MAY be reactivated
          for the same identity when policy permits.  Registrar
          suspension/de-accreditation does not by itself change the
          identity linkage or free the label.</dd>
          <dt>retired</dt>
          <dd>Terminal, server-managed.  Applied under the
          Registry/Governance retire-only dispute rule.  A retired
          handle MUST NOT be renewed, reactivated, transferred, or
          assigned to any identity, ever.</dd>
          <dt>pendingDelete</dt>
          <dd>Server-managed Handle grace-processing state before a
          transition to disabled.  It never implies deletion of the
          historical object or reassignment of the canonical
          identity.</dd>
          <dt>clientRenewProhibited, serverRenewProhibited,
          clientUpdateProhibited, serverUpdateProhibited,
          clientDeleteProhibited, serverDeleteProhibited</dt>
          <dd>Have their ordinary EPP prohibition meanings for the
          naming-layer Handle object.</dd>
        </dl>
        <t>There is no pendingTransfer status: Handles do not transfer
        independently of their linked Agent Identity.</t>
      </section>
    </section>

    <!-- ====================================================== -->
    <section anchor="handle-commands">
      <name>EPP Command Mapping for Handle Objects</name>

      <section anchor="handle-query">
        <name>EPP Query Commands</name>

        <section anchor="handle-check">
          <name>EPP &lt;check&gt; Command</name>
          <t>
            The EPP <tt>&lt;check&gt;</tt> command determines
            whether a handle can be provisioned, exactly as for
            domain names.  The command contains one or more
            <tt>&lt;aidHandle:name&gt;</tt> elements.  Reserved
            labels (per the reserved-list requirements of the
            registry architecture) are reported unavailable with
            reason "Reserved".
          </t>
          <t>Example &lt;check&gt; command:</t>
          <sourcecode type="xml"><![CDATA[
C:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
C:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
C:  <command>
C:    <check>
C:      <aidHandle:check
C:        xmlns:aidHandle=
C:          "urn:ietf:params:xml:ns:epp:aidHandle-1.0">
C:        <aidHandle:name>urn:aid:global:ferrous</aidHandle:name>
C:        <aidHandle:name>urn:aid:global:crusty</aidHandle:name>
C:        <aidHandle:name>urn:aid:global:registry</aidHandle:name>
C:      </aidHandle:check>
C:    </check>
C:    <clTRID>ABC-12353</clTRID>
C:  </command>
C:</epp>
]]></sourcecode>
          <t>Example &lt;check&gt; response:</t>
          <sourcecode type="xml"><![CDATA[
S:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
S:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
S:  <response>
S:    <result code="1000">
S:      <msg>Command completed successfully</msg>
S:    </result>
S:    <resData>
S:      <aidHandle:chkData
S:        xmlns:aidHandle=
S:          "urn:ietf:params:xml:ns:epp:aidHandle-1.0">
S:        <aidHandle:cd>
S:          <aidHandle:name
S:            avail="1">urn:aid:global:ferrous</aidHandle:name>
S:        </aidHandle:cd>
S:        <aidHandle:cd>
S:          <aidHandle:name
S:            avail="0">urn:aid:global:crusty</aidHandle:name>
S:          <aidHandle:reason>In use</aidHandle:reason>
S:        </aidHandle:cd>
S:        <aidHandle:cd>
S:          <aidHandle:name
S:            avail="0">urn:aid:global:registry
S:          </aidHandle:name>
S:          <aidHandle:reason>Reserved</aidHandle:reason>
S:        </aidHandle:cd>
S:      </aidHandle:chkData>
S:    </resData>
S:    <trID>
S:      <clTRID>ABC-12353</clTRID>
S:      <svTRID>54330-XYZ</svTRID>
S:    </trID>
S:  </response>
S:</epp>
]]></sourcecode>
        </section>

        <section anchor="handle-info">
          <name>EPP &lt;info&gt; Command</name>
          <t>
            EPP <tt>&lt;info&gt;</tt> retrieves the Handle object,
            including its immutable canonical-identity linkage,
            status, event dates, and expiry.  Handle information
            contains no anchor or proof-key material and is returned
            according to normal EPP authorization policy.
          </t>
          <t>
            <tt>&lt;aidHandle:clID&gt;</tt> is present only when the
            linked Agent Identity currently has a sponsoring
            Registrar.  It is absent in the no-current-Registrar
            state of <xref target="sponsorship"/>.  Creation and
            historical event identifiers remain present as defined by
            the schema and are not rewritten when sponsorship changes.
          </t>
        </section>

        <section anchor="handle-transfer-query">
          <name>EPP &lt;transfer&gt; Query Command</name>
          <t>
            Transfer semantics do not apply to Handle objects
            (<xref target="sponsorship"/>).  This mapping defines
            no <tt>&lt;transfer&gt;</tt> element for Handle
            objects, and a server MUST respond to any attempt
            with error 2101.
          </t>
        </section>
      </section>

      <section anchor="handle-transform">
        <name>EPP Transform Commands</name>

        <section anchor="handle-create">
          <name>EPP &lt;create&gt; Command</name>
          <t>
            EPP <tt>&lt;create&gt;</tt> provisions a Handle bound to an
            existing operational Agent Identity.  The submitting client
            MUST be that identity's current sponsoring Registrar; an
            unsponsored identity must first complete actor-authorized
            Registrar transfer.  The server rejects an unavailable or
            reserved label with result code 2302, an inactive identity
            or an identity that already has an active Handle with 2304, and invalid
            handle syntax with 2306.  An OPTIONAL period carries the
            initial registration period according to Registry policy.
          </t>
          <t>
            Creation fixes the Handle's canonical-identity linkage for
            its lifetime.  No EPP operation can transfer a Handle to
            another identity; successful identity sponsorship transfer
            changes only the servicing Registrar as described in
            <xref target="sponsorship"/>.
          </t>
        </section>

        <section anchor="handle-delete">
          <name>EPP &lt;delete&gt; Command</name>
          <t>
            EPP <tt>&lt;delete&gt;</tt> voluntarily disables a Handle and
            is accepted only from the linked identity's current sponsoring
            Registrar.  It does not erase the Handle object or alter the
            linked Agent Identity.  Any later reactivation or release policy
            is governed by the Handle lifecycle in
            <xref target="I-D.drake-agent-identity-registry"/>.  A
            handle that has entered the terminal <tt>retired</tt>
            state MUST never be released or reassigned.
          </t>
        </section>

        <section anchor="handle-renew">
          <name>EPP &lt;renew&gt; Command</name>
          <t>
            EPP <tt>&lt;renew&gt;</tt> extends the validity of a Handle
            using the ordinary EPP period and current-expiry guard
            conventions.  Only the linked identity's current sponsor
            can renew.  Subject to Registry policy, renewal may also
            reactivate a disabled Handle that is still reserved to the
            same identity.  An unsponsored Handle cannot be renewed
            until actor-authorized identity transfer establishes a new
            sponsor, but the no-sponsor interval by itself MUST NOT
            reassign its label.
          </t>
        </section>

        <section anchor="handle-transfer">
          <name>EPP &lt;transfer&gt; Command</name>
          <t>
            Not defined; see
            <xref target="handle-transfer-query"/>.  Sponsorship
            of a Handle object changes only as a side effect of
            transfer of its linked Agent Identity object
            (<xref target="transfer-processing"/>).
          </t>
        </section>

        <section anchor="handle-update">
          <name>EPP &lt;update&gt; Command</name>
          <t>
            EPP <tt>&lt;update&gt;</tt> adds or removes client-managed
            Handle status values.  The label and canonical-identity
            linkage are immutable, and the Handle carries no
            authorization-information secret or actor-control key.
            This command is available only to the current sponsor.  It MUST
            contain at least one effective status addition or removal; an
            update containing only <tt>&lt;aidHandle:name&gt;</tt> MUST be
            rejected with result code 2306.
          </t>
        </section>
      </section>

      <section anchor="handle-rgp">
        <name>Grace Periods</name>
        <t>
          Registry policy MAY provide grace intervals around Handle
          creation, renewal, expiry, and voluntary disablement.  Such
          intervals affect only the naming-layer Handle and never the linked
          Agent Identity object.  This mapping represents a delayed
          disablement with the Handle's <tt>pendingDelete</tt> status and
          ultimately transitions the Handle to <tt>disabled</tt>.  Grace
          processing itself never purges the historical object, changes its
          identity linkage, or releases the label.  Any later release policy
          for a disabled (but not retired) label is outside this mapping and
          remains subject to the Registry/Governance Handle policy.
        </t>
        <t>
          The Registry Grace Period extension <xref target="RFC3915"/> is
          specific to the EPP domain-name mapping and is not extended to
          Handle objects by this document.  In particular, implementations
          MUST NOT emit <tt>rgp:</tt> extension elements for a Handle merely
          by substituting "Handle" for "domain" in RFC 3915.  A future
          object-generic or Handle-specific grace-period extension could be
          profiled separately.  Registries remain free to reuse existing
          billing and grace-policy machinery internally.
        </t>
      </section>
    </section>

    <!-- ====================================================== -->
    <section anchor="lifecycle-mapping">
      <name>Lifecycle Mapping</name>
      <table>
        <name>Registry Lifecycle Events in EPP</name>
        <thead><tr><th>Lifecycle event</th><th>EPP realization</th></tr></thead>
        <tbody>
          <tr><td>Anchor pre-flight</td><td>Agent Identity <tt>&lt;check&gt;</tt></td></tr>
          <tr><td>Initial enrollment</td><td>Agent Identity <tt>&lt;create&gt;</tt></td></tr>
          <tr><td>Binding addition/disable</td><td><tt>&lt;update&gt;</tt> plus Registry challenge and <tt>&lt;aid:actorAuth&gt;</tt></td></tr>
          <tr><td>Cross-group upgrade</td><td><tt>&lt;update&gt;</tt> with <tt>tierTransition</tt> joint authorization</td></tr>
          <tr><td>Operational proof-key rotation</td><td><tt>&lt;update&gt;</tt> <tt>&lt;aid:proofKeyChange&gt;</tt></td></tr>
          <tr><td>Hardware lock</td><td><tt>&lt;update&gt;</tt> <tt>&lt;aid:hardwareLock&gt;</tt> plus actor authorization</td></tr>
          <tr><td>Registrar transfer</td><td>Agent Identity <tt>&lt;transfer&gt;</tt> plus actor authorization</td></tr>
          <tr><td>Registrar suspension/de-accreditation</td><td>Server removes sponsorship/issuer authority; no successor is assigned.  Later transfer is actor-authorized.</td></tr>
          <tr><td>Voluntary decommissioning</td><td>Agent Identity <tt>&lt;delete&gt;</tt> plus actor authorization; historical object retained</td></tr>
          <tr><td>Handle create/renew/update/delete</td><td>Handle object commands; Handle never transfers independently</td></tr>
          <tr><td>Handle dispute retirement</td><td>Server-side terminal <tt>retired</tt> state plus poll notice</td></tr>
        </tbody>
      </table>
      <t>
        EPP client authentication authorizes Registrar-managed naming
        and status operations.  AIRS actor-control transitions are
        intentionally different: they additionally require the
        Registry-verifiable proof of <xref target="actor-auth-wire"/>.
        There is no EPP <tt>authInfo</tt> password for Agent Identity
        objects.
      </t>
    </section>

    <!-- ====================================================== -->
    <section anchor="escrow">
      <name>Data Escrow</name>
      <t>
        Registry data escrow is an operational/governance requirement,
        not an EPP command.  <xref target="RFC8909"/> defines an
        object-agnostic Registry Data Escrow (RDE) container and
        explicitly requires an independent specification for each
        object type to be escrowed.  The EPP
        <tt>&lt;aid:infData&gt;</tt> and
        <tt>&lt;aidHandle:infData&gt;</tt> structures defined here are
        therefore NOT, by themselves, an interoperable RFC 8909 escrow
        object mapping.
      </t>
      <t>
        This document does not define that RDE object-specific schema
        or its confidentiality/signaling profile.  An AIRS deployment
        using RFC 8909 MUST define those pieces separately and include
        enough canonical identity, sponsorship, Handle, permanent
        anchor/proof-key history, and lifecycle state to reconstruct
        Registry service, subject to the escrow and privacy policy of
        <xref target="I-D.drake-agent-identity-governance"/>.  Private
        authentication credentials MUST NOT be escrowed, consistent
        with RFC 8909.
      </t>
    </section>

    <!-- ====================================================== -->
    <section anchor="i18n">
      <name>Internationalization Considerations</name>
      <t>
        Handle labels are restricted by the registry architecture
        to lowercase ASCII letters, digits, and hyphens (LDH)
        with a leading letter.  This mapping performs no
        internationalized label processing: there are no A-labels
        or U-labels, no IDNA mapping, and no normalization beyond
        the schema-enforced syntax; servers MUST reject
        non-conforming labels with error 2306.  Presentation of
        handles to humans, including any localized display
        conventions, is a relying-party concern addressed in the
        registry architecture.  Registry Operators SHOULD apply
        confusable-label policies within the LDH repertoire
        (e.g., digit/letter lookalikes) through their reserved
        lists; a future extension could define
        internationalized handle labels, and would need to
        address the full set of IDNA and confusability issues
        that domain registries have encountered.
      </t>
    </section>


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

      <section anchor="iana-ns">
        <name>XML Namespaces</name>
        <t>
          This document uses URNs to describe XML namespaces and
          XML schemas conforming to a registry mechanism described
          in <xref target="RFC3688"/>.  Two URN assignments are
          requested.
        </t>
        <t>Registration request for the Agent Identity namespace:</t>
        <ul>
          <li>URI: urn:ietf:params:xml:ns:epp:aid-1.0</li>
          <li>Registrant Contact: IESG</li>
          <li>XML: None.  Namespace URIs do not represent an XML
          specification.</li>
        </ul>
        <t>Registration request for the Handle namespace:</t>
        <ul>
          <li>URI: urn:ietf:params:xml:ns:epp:aidHandle-1.0</li>
          <li>Registrant Contact: IESG</li>
          <li>XML: None.  Namespace URIs do not represent an XML
          specification.</li>
        </ul>
      </section>

      <section anchor="iana-schema">
        <name>XML Schemas</name>
        <t>
          Two schema assignments are requested.
        </t>
        <t>Registration request for the Agent Identity schema:</t>
        <ul>
          <li>URI: urn:ietf:params:xml:schema:epp:aid-1.0</li>
          <li>Registrant Contact: IESG</li>
          <li>XML: See <xref target="aid-schema"/> of this
          document.</li>
        </ul>
        <t>Registration request for the Handle schema:</t>
        <ul>
          <li>URI: urn:ietf:params:xml:schema:epp:aidHandle-1.0</li>
          <li>Registrant Contact: IESG</li>
          <li>XML: See <xref target="handle-schema"/> of this
          document.</li>
        </ul>
      </section>

      <section anchor="iana-epp-ext">
        <name>EPP Extension Registry</name>
        <t>
          The EPP mappings described in this document should be
          registered by IANA in the "Extensions for the
          Extensible Provisioning Protocol (EPP)" registry
          described in <xref target="RFC7451"/>.  Two
          registrations are requested; both use the registration
          policy "Specification Required".
        </t>
        <t>Registration for the Agent Identity object mapping:</t>
        <dl>
          <dt>Name of Extension</dt>
          <dd>EPP Mapping for Agent Identity Objects</dd>
          <dt>Document Status</dt>
          <dd>Experimental</dd>
          <dt>Reference</dt>
          <dd>This document</dd>
          <dt>Registrant Name and Email Address</dt>
          <dd>IESG, iesg@ietf.org</dd>
          <dt>TLDs</dt>
          <dd>Any</dd>
          <dt>IPR Disclosure</dt>
          <dd>None</dd>
          <dt>Status</dt>
          <dd>Active</dd>
          <dt>Notes</dt>
          <dd>None</dd>
        </dl>
        <t>Registration for the Handle object mapping:</t>
        <dl>
          <dt>Name of Extension</dt>
          <dd>EPP Mapping for Agent Identity Handle Objects</dd>
          <dt>Document Status</dt>
          <dd>Experimental</dd>
          <dt>Reference</dt>
          <dd>This document</dd>
          <dt>Registrant Name and Email Address</dt>
          <dd>IESG, iesg@ietf.org</dd>
          <dt>TLDs</dt>
          <dd>Any</dd>
          <dt>IPR Disclosure</dt>
          <dd>None</dd>
          <dt>Status</dt>
          <dd>Active</dd>
          <dt>Notes</dt>
          <dd>None</dd>
        </dl>
        <t>
          The "aid" URN namespace and its production namespace
          semantics are specified by
          <xref target="I-D.drake-agent-identity-registry"/> and are
          not re-registered here.
        </t>
      </section>
    </section>

    <!-- ====================================================== -->
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>
        The security considerations of <xref target="RFC5730"/>,
        <xref target="RFC5731"/>, and the Registry architecture apply.
        This section covers only risks introduced by this provisioning
        mapping.
      </t>
      <t>
        Registrar authentication to EPP and actor authorization are
        separate security boundaries.  A Registrar is trusted to
        perform the tier-appropriate enrollment verification before it
        provisions an anchor and proof key, but a Registrar MUST NOT be
        able to manufacture consent for later control-state changes.
        The fresh Registry challenge and
        <tt>&lt;aid:actorAuth&gt;</tt> rules therefore protect binding
        addition/disablement, proof-key rotation, hardware lock,
        Registrar transfer, and decommissioning.  Servers MUST compare
        every signed target with the actual EPP transform, enforce
        challenge single-use and expiry, and verify current-role proofs
        only with authoritative active proof keys.  Candidate keys are
        accepted only for the new-binding control proofs explicitly
        required by <xref target="actor-auth-wire"/>.
      </t>
      <t>
        Anchor uniqueness is correctness-critical.  Production
        transforms MUST serialize through the authoritative
        <tt>global</tt> binding index; relaxing this for availability
        can violate the scarce-anchor invariant.  Check and collision
        responses reveal only available/unavailable, but still form a
        membership oracle for parties that already know an anchor
        fingerprint.  Registries SHOULD rate-limit such queries and
        MUST NOT disclose the holding identity or Registrar.
      </t>
      <t>
        Permanent anchor history makes mistaken enrollment costly:
        disabling a binding does not erase or free its reserved anchor
        identifier.  Registrars SHOULD therefore verify enrollment
        evidence and submitted anchor/proof-key relationships before
        irreversible create/add operations.  Likewise, hardware lock
        and decommissioning are irreversible and require explicit actor
        authorization.
      </t>
      <t>
        A pending Registrar transfer is authorized by a particular
        active binding/proof-key version.  The Registry MUST recheck
        that authorization source immediately before deferred
        completion.  Registrar suspension/de-accreditation never
        creates an administrative successor or identity-recovery path.
        If no active proof key remains, AIRS preserves the historical
        identity but this mapping cannot restore control.
      </t>
      <t>
        Handle retirement is terminal.  A compromised Registrar cannot
        use the dispute mechanism to transfer a Handle to a favored
        identity; the corresponding denial risk of erroneous retirement
        is a governance-policy matter outside this wire protocol.
      </t>
    </section>

    <!-- ====================================================== -->
    <section anchor="privacy-considerations">
      <name>Privacy Considerations</name>
      <t>
        This mapping intentionally excludes mutable operator/contact
        attributes from the canonical Agent Identity object.  The main
        provisioning-sensitive data are anchor fingerprints,
        operational public keys, manufacturer/issuer metadata, and the
        commercial relationship represented by sponsorship.
      </t>
      <t>
        An EPP server MUST NOT expose a mapping from anchor fingerprint
        to holding identity or sponsoring Registrar through
        <tt>&lt;check&gt;</tt> or collision errors.  To a client that is
        not the current sponsor, Agent Identity
        <tt>&lt;info&gt;</tt> MUST omit binding details including anchor
        fingerprints and proof keys.  The valid no-sponsor state does
        not relax this rule: an accredited Registrar may obtain a fresh
        operation challenge where permitted, but that does not grant
        access to another actor's private binding inventory.
      </t>
      <t>
        The EPP event trail necessarily reveals Registrar relationships
        to the Registry Operator.  Cross-Registrar disclosure of
        current/historical sponsorship SHOULD be limited to what EPP
        operation and audit requirements need.  Public resolution and
        application-layer privacy are specified by their respective
        companion documents rather than duplicated here.
      </t>
    </section>

    <!-- ====================================================== -->
    <section anchor="formal-syntax">
      <name>Formal Syntax</name>
      <t>
        The following XML Schemas normatively define the Agent Identity and
        Handle object mappings specified by this document.
      </t>

      <section anchor="aid-schema">
        <name>Agent Identity Schema</name>
        <sourcecode type="xml"><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<schema targetNamespace="urn:ietf:params:xml:ns:epp:aid-1.0"
        xmlns:aid="urn:ietf:params:xml:ns:epp:aid-1.0"
        xmlns:eppcom="urn:ietf:params:xml:ns:eppcom-1.0"
        xmlns="http://www.w3.org/2001/XMLSchema"
        elementFormDefault="qualified">

  <import namespace="urn:ietf:params:xml:ns:eppcom-1.0"/>

  <annotation><documentation>
    EPP Agent Identity object mapping version 1.0.
  </documentation></annotation>

  <!-- EPP command children. -->
  <element name="check" type="aid:checkType"/>
  <element name="create" type="aid:createType"/>
  <element name="delete" type="aid:deleteType"/>
  <element name="info" type="aid:infoType"/>
  <element name="transfer" type="aid:transferType"/>
  <element name="update" type="aid:updateType"/>

  <!-- EPP response children. -->
  <element name="chkData" type="aid:chkDataType"/>
  <element name="creData" type="aid:creDataType"/>
  <element name="infData" type="aid:infDataType"/>
  <element name="trnData" type="aid:trnDataType"/>

  <simpleType name="namespaceType">
    <restriction base="token">
      <enumeration value="global"/>
      <enumeration value="test"/>
    </restriction>
  </simpleType>

  <simpleType name="idType">
    <restriction base="token">
      <pattern
     value="urn:aid:(global|test):id(-[bcdfghjkmnpqrstvwxz]{5}){4}"/>
      <maxLength value="255"/>
    </restriction>
  </simpleType>

  <simpleType name="handleType">
    <restriction base="token">
      <pattern
      value="urn:aid:(global|test):[a-z]([a-z0-9-]{0,61}[a-z0-9])?"/>
      <maxLength value="78"/>
    </restriction>
  </simpleType>

  <simpleType name="anchorFpType">
    <restriction base="token">
      <pattern value="[0-9a-f]{64}"/>
    </restriction>
  </simpleType>

  <simpleType name="hwType">
    <restriction base="token">
      <enumeration value="TPM"/>
      <enumeration value="PIV"/>
      <enumeration value="ENC"/>
      <enumeration value="VRT"/>
      <enumeration value="SFT"/>
    </restriction>
  </simpleType>

  <simpleType name="trustTierType">
    <restriction base="token">
      <enumeration value="sovereign"/>
      <enumeration value="portable"/>
      <enumeration value="enclave"/>
      <enumeration value="virtual"/>
      <enumeration value="declared"/>
    </restriction>
  </simpleType>

  <simpleType name="bindingStatusType">
    <restriction base="token">
      <enumeration value="active"/>
      <enumeration value="disabled"/>
    </restriction>
  </simpleType>

  <simpleType name="operationType">
    <restriction base="token">
      <enumeration value="bindingUpdate"/>
      <enumeration value="tierTransition"/>
      <enumeration value="proofKeyRotate"/>
      <enumeration value="hardwareLock"/>
      <enumeration value="registrarTransfer"/>
      <enumeration value="decommission"/>
    </restriction>
  </simpleType>

  <simpleType name="nonceType">
    <restriction base="token">
      <pattern value="[A-Za-z0-9_-]+"/>
      <minLength value="22"/>
    </restriction>
  </simpleType>

  <simpleType name="jwsType">
    <restriction base="token">
      <minLength value="16"/>
      <maxLength value="16384"/>
    </restriction>
  </simpleType>

  <simpleType name="proofKeyType">
    <restriction base="base64Binary">
      <maxLength value="16384"/>
    </restriction>
  </simpleType>

  <simpleType name="mfrType">
    <restriction base="token">
      <minLength value="1"/>
      <maxLength value="64"/>
    </restriction>
  </simpleType>

  <complexType name="bindingInputType">
    <sequence>
      <element name="anchorFp" type="aid:anchorFpType"/>
      <element name="proofKey" type="aid:proofKeyType"/>
      <element name="hwType" type="aid:hwType"/>
      <element name="mfr" type="aid:mfrType" minOccurs="0"/>
    </sequence>
  </complexType>

  <complexType name="bindingInfoType">
    <sequence>
      <element name="anchorFp" type="aid:anchorFpType"/>
      <element name="proofKey" type="aid:proofKeyType"/>
      <element name="hwType" type="aid:hwType"/>
      <element name="mfr" type="aid:mfrType" minOccurs="0"/>
      <element name="status" type="aid:bindingStatusType"/>
      <element name="assuranceQualified" type="boolean"/>
      <element name="boundAt" type="dateTime"/>
    </sequence>
  </complexType>

  <complexType name="challengeRequestType">
    <attribute name="op" type="aid:operationType" use="required"/>
  </complexType>

  <complexType name="authChallengeType">
    <sequence>
      <element name="challengeId" type="token"/>
      <element name="nonce" type="aid:nonceType"/>
      <element name="op" type="aid:operationType"/>
      <element name="expires" type="dateTime"/>
    </sequence>
  </complexType>

  <!-- Compact JWS whose payload is defined in Actor Authorization.
  -->
  <complexType name="actorAuthType">
    <simpleContent><extension base="aid:jwsType"/></simpleContent>
  </complexType>

  <complexType name="checkType">
    <sequence>
      <element name="ns" type="aid:namespaceType" minOccurs="0"/>
      <element name="anchorFp" type="aid:anchorFpType"
               maxOccurs="unbounded"/>
    </sequence>
  </complexType>

  <complexType name="infoType">
    <sequence>
      <element name="id" type="aid:idType"/>
      <element name="challenge" type="aid:challengeRequestType"
               minOccurs="0"/>
    </sequence>
  </complexType>

  <complexType name="createType">
    <sequence>
      <element name="ns" type="aid:namespaceType"/>
      <element name="binding" type="aid:bindingInputType"
               maxOccurs="unbounded"/>
    </sequence>
  </complexType>

  <complexType name="deleteType">
    <sequence>
      <element name="id" type="aid:idType"/>
      <element name="actorAuth" type="aid:actorAuthType"/>
    </sequence>
  </complexType>

  <!-- actorAuth is optional in the XSD because
       query/approve/reject/cancel use the same object element; prose
       requires it for request. -->
  <complexType name="transferType">
    <sequence>
      <element name="id" type="aid:idType"/>
      <element name="actorAuth" type="aid:actorAuthType"
               minOccurs="0" maxOccurs="unbounded"/>
    </sequence>
  </complexType>

  <complexType name="updateType">
    <sequence>
      <element name="id" type="aid:idType"/>
      <element name="add" type="aid:addType" minOccurs="0"/>
      <element name="rem" type="aid:remType" minOccurs="0"/>
      <element name="proofKeyChange" type="aid:proofKeyChangeType"
               minOccurs="0"/>
      <element name="chg" type="aid:chgType" minOccurs="0"/>
      <element name="actorAuth" type="aid:actorAuthType"
               minOccurs="0" maxOccurs="unbounded"/>
    </sequence>
  </complexType>

  <complexType name="addType">
    <choice minOccurs="1" maxOccurs="unbounded">
      <element name="binding" type="aid:bindingInputType"/>
      <element name="status" type="aid:statusType"/>
    </choice>
  </complexType>

  <complexType name="remType">
    <choice minOccurs="1" maxOccurs="unbounded">
      <element name="anchorFp" type="aid:anchorFpType"/>
      <element name="status" type="aid:statusType"/>
    </choice>
  </complexType>

  <complexType name="proofKeyChangeType">
    <sequence>
      <element name="anchorFp" type="aid:anchorFpType"/>
      <element name="proofKey" type="aid:proofKeyType"/>
    </sequence>
  </complexType>

  <complexType name="chgType">
    <sequence>
      <element name="hardwareLock" type="boolean"/>
    </sequence>
  </complexType>

  <complexType name="chkDataType">
    <sequence>
      <element name="cd" type="aid:checkDataType"
               maxOccurs="unbounded"/>
    </sequence>
  </complexType>

  <complexType name="checkDataType">
    <sequence>
      <element name="anchorFp" type="aid:checkedFpType"/>
      <element name="reason" type="eppcom:reasonType" minOccurs="0"/>
    </sequence>
  </complexType>

  <complexType name="checkedFpType">
    <simpleContent>
      <extension base="aid:anchorFpType">
        <attribute name="avail" type="boolean" use="required"/>
      </extension>
    </simpleContent>
  </complexType>

  <complexType name="creDataType">
    <sequence>
      <element name="id" type="aid:idType"/>
      <element name="roid" type="eppcom:roidType"/>
      <element name="crDate" type="dateTime"/>
    </sequence>
  </complexType>

  <complexType name="infDataType">
    <sequence>
      <element name="id" type="aid:idType"/>
      <element name="roid" type="eppcom:roidType"/>
      <element name="status" type="aid:statusType"
               maxOccurs="unbounded"/>
      <element name="maxTrust" type="aid:trustTierType"
               minOccurs="0"/>
      <element name="binding" type="aid:bindingInfoType"
               minOccurs="0" maxOccurs="unbounded"/>
      <element name="handle" type="aid:handleType" minOccurs="0"/>
      <element name="clID" type="eppcom:clIDType" minOccurs="0"/>
      <element name="crID" type="eppcom:clIDType"/>
      <element name="crDate" type="dateTime"/>
      <element name="upID" type="eppcom:clIDType" minOccurs="0"/>
      <element name="upDate" type="dateTime" minOccurs="0"/>
      <element name="trDate" type="dateTime" minOccurs="0"/>
      <element name="authChallenge" type="aid:authChallengeType"
               minOccurs="0"/>
    </sequence>
  </complexType>

  <complexType name="statusType">
    <simpleContent>
      <extension base="normalizedString">
        <attribute name="s" type="aid:statusValueType"
                   use="required"/>
        <attribute name="lang" type="language" default="en"/>
      </extension>
    </simpleContent>
  </complexType>

  <simpleType name="statusValueType">
    <restriction base="token">
      <enumeration value="ok"/>
      <enumeration value="inactive"/>
      <enumeration value="hardwareLocked"/>
      <enumeration value="pendingTransfer"/>
      <enumeration value="clientUpdateProhibited"/>
      <enumeration value="serverUpdateProhibited"/>
      <enumeration value="clientDeleteProhibited"/>
      <enumeration value="serverDeleteProhibited"/>
    </restriction>
  </simpleType>

  <complexType name="trnDataType">
    <sequence>
      <element name="id" type="aid:idType"/>
      <element name="trStatus" type="eppcom:trStatusType"/>
      <element name="reID" type="eppcom:clIDType"/>
      <element name="reDate" type="dateTime"/>
      <element name="acID" type="eppcom:clIDType" minOccurs="0"/>
      <element name="acDate" type="dateTime" minOccurs="0"/>
    </sequence>
  </complexType>
</schema>]]></sourcecode>
      </section>

      <section anchor="handle-schema">
        <name>Handle Schema</name>
        <sourcecode type="xml"><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<schema targetNamespace="urn:ietf:params:xml:ns:epp:aidHandle-1.0"
        xmlns:aidHandle="urn:ietf:params:xml:ns:epp:aidHandle-1.0"
        xmlns:eppcom="urn:ietf:params:xml:ns:eppcom-1.0"
        xmlns="http://www.w3.org/2001/XMLSchema"
        elementFormDefault="qualified">

  <import namespace="urn:ietf:params:xml:ns:eppcom-1.0"/>
  <annotation><documentation>
    EPP Agent Identity Handle object mapping version 1.0.
  </documentation></annotation>

  <element name="check" type="aidHandle:mNameType"/>
  <element name="create" type="aidHandle:createType"/>
  <element name="delete" type="aidHandle:sNameType"/>
  <element name="info" type="aidHandle:sNameType"/>
  <element name="renew" type="aidHandle:renewType"/>
  <element name="update" type="aidHandle:updateType"/>

  <element name="chkData" type="aidHandle:chkDataType"/>
  <element name="creData" type="aidHandle:creDataType"/>
  <element name="infData" type="aidHandle:infDataType"/>
  <element name="renData" type="aidHandle:renDataType"/>

  <simpleType name="urnType">
    <restriction base="token">
      <pattern
      value="urn:aid:(global|test):[a-z]([a-z0-9-]{0,61}[a-z0-9])?"/>
      <maxLength value="78"/>
    </restriction>
  </simpleType>

  <simpleType name="idUrnType">
    <restriction base="token">
      <pattern
     value="urn:aid:(global|test):id(-[bcdfghjkmnpqrstvwxz]{5}){4}"/>
      <maxLength value="255"/>
    </restriction>
  </simpleType>

  <complexType name="mNameType"><sequence>
    <element name="name" type="aidHandle:urnType"
             maxOccurs="unbounded"/>
  </sequence></complexType>

  <complexType name="sNameType"><sequence>
    <element name="name" type="aidHandle:urnType"/>
  </sequence></complexType>

  <complexType name="createType"><sequence>
    <element name="name" type="aidHandle:urnType"/>
    <element name="identity" type="aidHandle:idUrnType"/>
    <element name="period" type="aidHandle:periodType"
             minOccurs="0"/>
  </sequence></complexType>

  <complexType name="periodType"><simpleContent>
    <extension base="aidHandle:pLimitType">
      <attribute name="unit" type="aidHandle:pUnitType"
                 use="required"/>
    </extension>
  </simpleContent></complexType>

  <simpleType name="pLimitType"><restriction base="unsignedShort">
    <minInclusive value="1"/><maxInclusive value="99"/>
  </restriction></simpleType>

  <simpleType name="pUnitType"><restriction base="token">
    <enumeration value="y"/><enumeration value="m"/>
  </restriction></simpleType>

  <complexType name="renewType"><sequence>
    <element name="name" type="aidHandle:urnType"/>
    <element name="curExpDate" type="date"/>
    <element name="period" type="aidHandle:periodType"
             minOccurs="0"/>
  </sequence></complexType>

  <complexType name="updateType"><sequence>
    <element name="name" type="aidHandle:urnType"/>
    <element name="add" type="aidHandle:addRemType" minOccurs="0"/>
    <element name="rem" type="aidHandle:addRemType" minOccurs="0"/>
  </sequence></complexType>

  <complexType name="addRemType"><sequence>
    <element name="status" type="aidHandle:statusType"
             maxOccurs="unbounded"/>
  </sequence></complexType>

  <complexType name="chkDataType"><sequence>
    <element name="cd" type="aidHandle:checkNameType"
             maxOccurs="unbounded"/>
  </sequence></complexType>

  <complexType name="checkNameType"><sequence>
    <element name="name" type="aidHandle:checkedNameType"/>
    <element name="reason" type="eppcom:reasonType" minOccurs="0"/>
  </sequence></complexType>

  <complexType name="checkedNameType"><simpleContent>
    <extension base="aidHandle:urnType">
      <attribute name="avail" type="boolean" use="required"/>
    </extension>
  </simpleContent></complexType>

  <complexType name="creDataType"><sequence>
    <element name="name" type="aidHandle:urnType"/>
    <element name="crDate" type="dateTime"/>
    <element name="exDate" type="dateTime"/>
  </sequence></complexType>

  <complexType name="renDataType"><sequence>
    <element name="name" type="aidHandle:urnType"/>
    <element name="exDate" type="dateTime"/>
  </sequence></complexType>

  <complexType name="infDataType"><sequence>
    <element name="name" type="aidHandle:urnType"/>
    <element name="roid" type="eppcom:roidType"/>
    <element name="identity" type="aidHandle:idUrnType"/>
    <element name="status" type="aidHandle:statusType"
             maxOccurs="unbounded"/>
    <element name="clID" type="eppcom:clIDType" minOccurs="0"/>
    <element name="crID" type="eppcom:clIDType"/>
    <element name="crDate" type="dateTime"/>
    <element name="upID" type="eppcom:clIDType" minOccurs="0"/>
    <element name="upDate" type="dateTime" minOccurs="0"/>
    <element name="exDate" type="dateTime"/>
  </sequence></complexType>

  <complexType name="statusType"><simpleContent>
    <extension base="normalizedString">
      <attribute name="s" type="aidHandle:statusValueType"
                 use="required"/>
      <attribute name="lang" type="language" default="en"/>
    </extension>
  </simpleContent></complexType>

  <simpleType name="statusValueType"><restriction base="token">
    <enumeration value="ok"/>
    <enumeration value="disabled"/>
    <enumeration value="retired"/>
    <enumeration value="pendingDelete"/>
    <enumeration value="clientRenewProhibited"/>
    <enumeration value="serverRenewProhibited"/>
    <enumeration value="clientUpdateProhibited"/>
    <enumeration value="serverUpdateProhibited"/>
    <enumeration value="clientDeleteProhibited"/>
    <enumeration value="serverDeleteProhibited"/>
  </restriction></simpleType>
</schema>]]></sourcecode>
      </section>
    </section>

    <!-- ====================================================== -->
    <section anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>
        This mapping follows the structure established by the EPP
        domain name mapping <xref target="RFC5731"/>; readers
        familiar with that document will recognize most of the
        machinery here.  The author thanks the participants of the
        IETF REGEXT working group whose object mappings served as
        the template for this work.
      </t>
    </section>

  </middle>

  <back>

    <references>
      <name>Normative References</name>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3688.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3735.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3915.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5730.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5731.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5734.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7451.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.7518.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8259.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8141.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8909.xml"/>

      <reference anchor="RFC9846" target="https://www.rfc-editor.org/info/rfc9846">
        <front>
          <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
          <author fullname="E. Rescorla" initials="E." surname="Rescorla">
            <organization>Independent</organization>
          </author>
          <date month="July" year="2026"/>
        </front>
        <seriesInfo name="RFC" value="9846"/>
        <seriesInfo name="DOI" value="10.17487/RFC9846"/>
      </reference>

      <reference anchor="I-D.drake-agent-identity-registry">
        <front>
          <title>Agent Identity Registry System: A Federated
          Architecture for Durable Identity of Autonomous Entities</title>
          <author fullname="Christopher Drake" initials="C." surname="Drake"/>
          <date year="2026" month="September"/>
        </front>
        <seriesInfo name="Internet-Draft"
                    value="draft-drake-agent-identity-registry-04"/>
      </reference>
    </references>

    <references>
      <name>Informative References</name>

      <reference anchor="I-D.drake-agent-identity-governance">
        <front>
          <title>The Agent Identity Authority: A Multi-Stakeholder Governance
          Framework for the Agent Identity Registry System</title>
          <author fullname="Christopher Drake" initials="C." surname="Drake"/>
          <date year="2026" month="September"/>
        </front>
        <seriesInfo name="Internet-Draft"
                    value="draft-drake-agent-identity-governance-00"/>
      </reference>

      <reference anchor="I-D.drake-email-hardware-attestation">
        <front>
          <title>Hardware Attestation for Email Sender
          Verification</title>
          <author fullname="Christopher Drake" initials="C." surname="Drake"/>
          <date year="2026" month="September"/>
        </front>
        <seriesInfo name="Internet-Draft"
                    value="draft-drake-email-hardware-attestation-02"/>
      </reference>

      <reference anchor="I-D.drake-agent-identity-resolution">
        <front>
          <title>Resolution and Verification of Agent Identities
          using DNS and RDAP</title>
          <author fullname="Christopher Drake" initials="C." surname="Drake"/>
          <date year="2026" month="September"/>
        </front>
        <seriesInfo name="Internet-Draft"
                    value="draft-drake-agent-identity-resolution-00"/>
      </reference>
    </references>



  </back>
</rfc>