<?xml version="1.0" encoding="utf-8"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     category="std"
     docName="draft-ruvalcaba-nhe-bootstrap-00"
     ipr="trust200902"
     submissionType="IETF"
     consensus="true"
     xml:lang="en"
     tocInclude="true" tocDepth="3" symRefs="true" sortRefs="true" version="3">

  <front>
    <title abbrev="NHE Bootstrap">NHE Constrained Bootstrap: A Self-Describing Capability and Constraint Declaration Protocol for Autonomous Agents</title>
    <seriesInfo name="Internet-Draft" value="draft-ruvalcaba-nhe-bootstrap-00"/>
    <author fullname="Cristian Xavier Ruvalcaba" initials="C.X." surname="Ruvalcaba">
      <organization>Saluca LLC</organization>
      <address><email>cristian@saluca.com</email></address>
    </author>
    <date year="2026" month="August" day="11"/>
    <area>Security</area>
    <workgroup>Individual Submission</workgroup>
    <keyword>autonomous agent</keyword>
    <keyword>bootstrap</keyword>
    <keyword>capability</keyword>
    <keyword>authorization</keyword>
    <keyword>attestation</keyword>

    <abstract>
      <t>This document specifies how a Non-Human Entity (NHE) declares, at
      bootstrap, what it is capable of and is thereby bounded in what it is
      permitted to do. An entity produces a signed, self-describing capability
      manifest through automated introspection; a coordinator classifies the
      manifest into a capability tier that maps to a permission matrix --- the set
      of task types the entity is authorized to perform --- and every subsequent
      task dispatch is gated against that envelope. The result is a verifiable,
      self-describing constraint on an entity established at the moment it joins,
      realizing the bounded-authority invariant of the NHE architecture at boot
      time. The manifest and handshake data model is specified here; the wire
      encoding is deferred to the next revision.</t>
    </abstract>
  </front>

  <middle>

    <section numbered="true"><name>Introduction</name>
      <t>An autonomous entity should not be trusted to do whatever it asks to do;
      it should be bounded to what it is actually capable of and authorized for,
      and that bound should be established verifiably when it joins, not assumed.
      This document specifies a bootstrap in which an entity <strong>describes
      itself</strong> --- its resources, its capabilities, the actions it can
      perform --- in a signed manifest, is classified into a permission envelope on
      that basis, and is thereafter gated so that a task exceeding its declared and
      authorized capability is never dispatched to it. The motivating case is an
      entity that can drive physical actuation: dispatching an actuator task to an
      entity not tier-authorized for it is a safety failure, not merely a routing
      error.</t>
    </section>

    <section numbered="true"><name>Relationship to the NHE Architecture</name>
      <t>This document specifies part of the Governance interface of
      <xref target="I-D.ruvalcaba-nhe-arch"/> and is the boot-time realization of
      that model's <strong>bounded-authority</strong> invariant: authority is
      conferred by classification of a verifiable self-description into a permission
      envelope, and is exercised only within it. The entity is named by its NHE
      identity <xref target="I-D.ruvalcaba-nhe-identity"/>, and the key that signs
      its manifest is bound to that identity, so a capability assertion is tied to
      the entity making it. This protocol governs what an entity may ever do; the
      companion backchannel-authorization protocol
      <xref target="I-D.ruvalcaba-nhe-authz"/> governs whether a specific action is
      permitted at the time it is attempted.</t>
    </section>

    <section numbered="true"><name>Terminology</name>
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHOULD", "MAY", and
      "OPTIONAL" are to be interpreted as described in BCP 14
      <xref target="RFC2119"/> <xref target="RFC8174"/>.</t>
      <dl>
        <dt>Capability manifest:</dt><dd>A self-describing declaration of an
        entity's resources and capabilities, produced by introspection and signed
        by the entity.</dd>
        <dt>Capability tier:</dt><dd>A class assigned by the coordinator from the
        manifest via quantitative thresholds.</dd>
        <dt>Permission matrix:</dt><dd>The set of task types and subtypes a tier is
        authorized to perform.</dd>
        <dt>Constraint manifest:</dt><dd>The capability manifest together with the
        tier-derived permission matrix; the entity's full authorization envelope.</dd>
        <dt>Coordinator:</dt><dd>The party that classifies manifests, registers
        entities, and gates task dispatch.</dd>
      </dl>
    </section>

    <section anchor="manifest" numbered="true"><name>The Capability Manifest</name>
      <t>An entity produces its capability manifest by automated introspection. The
      manifest declares at least: a stable entity identifier bound to the entity's
      identity, an enumeration of computational resources, an enumeration of the
      classes of action the entity can perform (including any that affect the
      physical world), an enumeration of locally available inference capabilities
      with measured throughput, and network characteristics. The specific fields
      are extensible; the requirement is that the manifest be a complete, honest
      self-description sufficient for classification.</t>
      <t>The manifest is signed over its <strong>canonical serialization</strong>
      --- JSON Canonicalization Scheme <xref target="RFC8785"/>, with the signature
      and signature-method fields excluded from the signed content --- so any
      verifier recomputes byte-identical signed input. The signature MAY be a
      symmetric MAC under a coordinator-derived per-entity key (integrity relative
      to a key-holder) or, where non-repudiation is required, an asymmetric
      signature under an entity-generated key whose public half is registered
      (<xref target="handshake"/>).</t>
    </section>

    <section anchor="tiers" numbered="true"><name>Capability Tiers and the Permission Matrix</name>
      <t>The coordinator classifies a manifest into a capability tier by applying
      quantitative thresholds to the declared resources and capabilities. Each tier
      maps to a permission matrix: the task types and subtypes an entity in that
      tier is authorized to perform. The pairing of the capability manifest with the
      tier-derived permission matrix is the entity's constraint manifest --- its
      authorization envelope. Classification is the point at which a
      self-description becomes a bounded authority.</t>
    </section>

    <section anchor="handshake" numbered="true"><name>The Bootstrap Handshake</name>
      <t>The bootstrap is a fixed, non-recursive sequence:</t>
      <ol>
        <li>The entity introspects and builds its capability manifest.</li>
        <li>The entity registers with the coordinator over a mutually authenticated
        transport.</li>
        <li>The coordinator derives a per-entity key --- for example by an HKDF
        <xref target="RFC5869"/> from the entity's identity-bound identifier, giving
        certificate-less identity without PKI provisioning --- and returns it once,
        over the mutually authenticated channel (a trust-on-first-use root),
        together with a scoped namespace and a poll interval calibrated to the
        entity's tier.</li>
        <li>The entity re-signs its manifest with the derived (or its own
        asymmetric) key and returns it.</li>
        <li>The coordinator verifies the re-signed manifest by independently
        re-deriving the key (or checking the registered public key) and recomputing
        the signature.</li>
        <li>The coordinator registers the entity with its verified manifest,
        computed tier, and key identifier.</li>
      </ol>
      <t>Because the per-entity key is derived from the same identity-bound
      identifier that the signed manifest asserts, the capability assertion is
      cryptographically knotted to the entity's derived identity: a manifest cannot
      be presented under one identity but signed as another.</t>
    </section>

    <section anchor="gating" numbered="true"><name>Dispatch Gating and Capability Assurance</name>
      <t>For each proposed task dispatch, the coordinator MUST verify that the task
      type and subtype are permitted by the target entity's permission matrix, that
      the capabilities the task requires are declared present in the target's
      manifest, and that the target is active. A task is enqueued only if all hold;
      otherwise it is rerouted to an entity whose tier and manifest permit it, or
      denied. This is what prevents capability-exceeding dispatch.</t>
      <t>Because a self-description is self-reported and therefore potentially false,
      the coordinator SHOULD perform capability assurance under trust-on-first-use:
      it dispatches a test task exercising a claimed capability and compares the
      result to an expected oracle, demoting or quarantining an entity whose claimed
      capability does not check out. Self-report establishes the envelope; spot-check
      and identity binding keep it honest.</t>
    </section>

    <section anchor="wire" numbered="true"><name>Wire Format (to be specified in -01)</name>
      <t>The manifest content model, its canonical serialization and signature, the
      tier-and-permission-matrix model, the six-step handshake, and the dispatch
      gating rule are fixed by this revision. The concrete encodings of the manifest
      and the handshake messages are deferred to the next revision.</t>
    </section>

    <section anchor="security" numbered="true"><name>Security Considerations</name>
      <t>A capability manifest is self-reported, so its declarations authenticate an
      entity only as strongly as the key that signs it and the assurance that backs
      it. A symmetric-MAC manifest provides integrity relative to a key-holder but
      not non-repudiation, and an identifier derived from semi-public attributes
      does not by itself authenticate hardware; deployments needing non-repudiation
      or hardware assurance MUST use the asymmetric-key variant bound to identity
      <xref target="I-D.ruvalcaba-nhe-identity"/> and/or the hardware-rooted
      attestation profile referenced there, plus spot-check capability assurance
      (<xref target="gating"/>). The derived per-entity key is returned once over the
      mutually authenticated channel; that channel is the trust-on-first-use root
      and MUST be strongly authenticated. Canonicalization <xref target="RFC8785"/>
      MUST be identical at signing and verification, or valid manifests will be
      rejected or, worse, a binding gap will open. Dispatch gating is a safety
      control, not only an authorization one: for actions affecting the physical
      world, a gating bypass can cause physical harm, so gating MUST fail closed ---
      an unclassifiable or unverifiable entity receives no permissions.</t>
    </section>

    <section anchor="iana" numbered="true"><name>IANA Considerations</name>
      <t>A future revision will request registries for capability-manifest field
      identifiers and for task-type/subtype identifiers used in permission matrices,
      under a Specification Required policy <xref target="RFC8126"/>. No IANA action
      is requested by this skeleton revision.</t>
    </section>
  </middle>

  <back>
    <references><name>Normative References</name>
      <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119">
        <front><title>Key words for use in RFCs to Indicate Requirement Levels</title>
        <author initials="S." surname="Bradner"/><date year="1997" month="March"/></front>
        <seriesInfo name="BCP" value="14"/><seriesInfo name="RFC" value="2119"/></reference>
      <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174">
        <front><title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
        <author initials="B." surname="Leiba"/><date year="2017" month="May"/></front>
        <seriesInfo name="BCP" value="14"/><seriesInfo name="RFC" value="8174"/></reference>
      <reference anchor="RFC8785" target="https://www.rfc-editor.org/info/rfc8785">
        <front><title>JSON Canonicalization Scheme (JCS)</title>
        <author initials="A." surname="Rundgren"/><author initials="B." surname="Jordan"/>
        <author initials="S." surname="Erdtman"/><date year="2020" month="June"/></front>
        <seriesInfo name="RFC" value="8785"/></reference>
    </references>
    <references><name>Informative References</name>
      <reference anchor="I-D.ruvalcaba-nhe-arch">
        <front><title>An Architecture for Non-Human Entities (NHE)</title>
        <author initials="C.X." surname="Ruvalcaba"/><date year="2026" month="August"/></front>
        <seriesInfo name="Internet-Draft" value="draft-ruvalcaba-nhe-arch-00"/></reference>
      <reference anchor="I-D.ruvalcaba-nhe-identity">
        <front><title>NHE Identity</title>
        <author initials="C.X." surname="Ruvalcaba"/><date year="2026" month="August"/></front>
        <seriesInfo name="Internet-Draft" value="draft-ruvalcaba-nhe-identity-00"/></reference>
      <reference anchor="I-D.ruvalcaba-nhe-authz">
        <front><title>NHE Backchannel Authorization</title>
        <author initials="C.X." surname="Ruvalcaba"/><date year="2026" month="August"/></front>
        <seriesInfo name="Internet-Draft" value="draft-ruvalcaba-nhe-authz-00"/></reference>
      <reference anchor="RFC5869" target="https://www.rfc-editor.org/info/rfc5869">
        <front><title>HMAC-based Extract-and-Expand Key Derivation Function (HKDF)</title>
        <author initials="H." surname="Krawczyk"/><author initials="P." surname="Eronen"/>
        <date year="2010" month="May"/></front>
        <seriesInfo name="RFC" value="5869"/></reference>
      <reference anchor="RFC8126" target="https://www.rfc-editor.org/info/rfc8126">
        <front><title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
        <author initials="M." surname="Cotton"/><author initials="B." surname="Leiba"/>
        <author initials="T." surname="Narten"/><date year="2017" month="June"/></front>
        <seriesInfo name="BCP" value="26"/><seriesInfo name="RFC" value="8126"/></reference>
    </references>
  </back>
</rfc>
