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

  <front>
    <title abbrev="NHE Authz">NHE Backchannel Authorization: Graduated Autonomy and Intent-Scoped Credentials for Autonomous Agent Actions</title>
    <seriesInfo name="Internet-Draft" value="draft-ruvalcaba-nhe-authz-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>authorization</keyword>
    <keyword>autonomous agent</keyword>
    <keyword>human-in-the-loop</keyword>
    <keyword>OAuth</keyword>
    <keyword>least privilege</keyword>

    <abstract>
      <t>This document specifies how a consequential action attempted by a
      Non-Human Entity (NHE) is authorized at the time it is attempted. A security
      runtime transparently intercepts an entity's outbound action, so the entity
      holds no standing credentials, and classifies it under graduated autonomy as
      autonomous, supervised, or denied. A supervised action triggers a backchannel
      approval flow that presents a human approver with a human-readable rendering
      of the exact operation; on approval the runtime issues an intent-scoped,
      single-use, short-lived credential cryptographically bound to that specific
      action, which an enforcement point verifies against the operation actually
      being forwarded. The same canonical parameter digest scopes the credential
      and appears in the human-facing description, so the approver provably
      authorizes exactly what the credential permits. The flow and credential data
      model are specified here; the wire encoding is deferred to the next revision.</t>
    </abstract>
  </front>

  <middle>

    <section numbered="true"><name>Introduction</name>
      <t>A persistent autonomous entity will attempt actions of widely varying
      consequence, from the trivial to the irreversible. Granting it standing
      credentials broad enough for all of them makes every prompt injection or
      reasoning error a potential catastrophe. This document specifies an
      authorization model in which the entity holds no standing credentials at all:
      a security runtime transparently intercepts each outbound action --- with no
      change to the entity's own logic --- decides, by the action's sensitivity,
      whether it may proceed autonomously, requires human approval, or is denied,
      and, when it proceeds, authorizes it with a credential scoped to that one
      action and no more.</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 action-time realization of
      that model's <strong>bounded-authority</strong> invariant: authority for a
      specific action is conferred as a single-use, scope-bound, short-lived grant,
      and consequential actions require an external human grant. It complements the
      bootstrap protocol <xref target="I-D.ruvalcaba-nhe-bootstrap"/>, which bounds
      what an entity may ever do; this protocol bounds whether a particular action
      is permitted now. The acting entity and the human approver are named by NHE
      identity <xref target="I-D.ruvalcaba-nhe-identity"/>, and the authorization
      flow SHOULD be recorded in the audit chain
      <xref target="I-D.ruvalcaba-nhe-audit"/>.</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>Security runtime:</dt><dd>The component that transparently intercepts an
        entity's outbound actions and drives authorization; the entity is unmodified
        and holds no standing target credentials.</dd>
        <dt>Autonomy mode:</dt><dd>The decision for an action: autonomous,
        supervised, or denied.</dd>
        <dt>Intent-scoped credential:</dt><dd>A short-lived credential cryptographic-
        ally bound to one specific approved action.</dd>
        <dt>Enforcement point:</dt><dd>Where the credential is checked against the
        operation actually being forwarded.</dd>
        <dt>Binding message:</dt><dd>The human-readable rendering of the operation
        shown to the approver.</dd>
        <dt>Approver:</dt><dd>The human (or delegated authority) who grants or denies
        a supervised action.</dd>
      </dl>
    </section>

    <section anchor="graduated" numbered="true"><name>Graduated Autonomy</name>
      <t>The security runtime classifies each intercepted action by a sensitivity
      assessment into one of three autonomy modes: <strong>autonomous</strong> (the
      runtime authorizes it directly), <strong>supervised</strong> (the action
      requires human approval via the backchannel flow of
      <xref target="approval"/>), or <strong>denied</strong> (the action is refused
      outright). The sensitivity assessment is policy; interoperation requires
      agreement on the three-mode outcome and the flow each triggers, not on a
      single classification function.</t>
    </section>

    <section anchor="approval" numbered="true"><name>Backchannel Approval Flow</name>
      <t>A supervised action triggers an out-of-band approval, decoupled from the
      entity's action channel (a backchannel flow in the manner of OAuth 2.0
      <xref target="RFC6749"/> CIBA). The runtime creates an authorization request
      with an authentication-request identifier and routes it to the approver over
      one or more channels, carrying a <strong>binding message</strong>: a
      human-readable rendering of the exact operation to be performed. The approver
      grants or denies; the response MUST carry and be verified against the
      authentication-request identifier, and for link or reply channels MUST carry an
      HMAC-signed, single-use, expiring action token so an approver cannot
      inadvertently approve a different pending request and a response cannot be
      forged. Critical-sensitivity actions MUST use a channel providing
      authenticated delivery confirmation. Absent a positive approval --- on denial,
      delivery failure, approver timeout, or expiry --- the action is denied
      (<xref target="security"/>).</t>
    </section>

    <section anchor="credential" numbered="true"><name>Intent-Scoped Credential</name>
      <t>On authorization (autonomous, or supervised-and-approved), the runtime
      issues a short-lived credential --- for example a JWT <xref target="RFC7519"/>
      --- cryptographically bound to the specific action by carrying, as signed
      claims, the target resource identifier, the operation type, and a
      <strong>digest of the canonicalized operation parameters</strong> (JSON
      Canonicalization Scheme <xref target="RFC8785"/>, hashed with a named function),
      in the spirit of rich, fine-grained authorization
      <xref target="RFC9396"/>. Altering any bound field invalidates the signature.</t>
      <t>The single most important property is the <strong>digest linkage</strong>:
      the same canonicalized-parameter digest that scopes the credential is the
      digest rendered to the approver in the binding message. The human therefore
      provably approves exactly the operation the credential authorizes --- closing
      the confused-deputy gap in which an approver okays one thing while a different
      thing is executed.</t>
    </section>

    <section anchor="enforcement" numbered="true"><name>Enforcement</name>
      <t>An enforcement point MUST verify, before an operation is forwarded, that
      the credential's bound claims match the operation actually being forwarded, and
      MUST reject any presentation whose bound claims do not match. Two modes are
      supported: in <strong>resource-validated</strong> mode a credential-aware
      target validates the credential directly; in <strong>enforcement-point</strong>
      mode --- for targets that cannot validate the credential --- the enforcement
      point verifies it and only then obtains a just-in-time, single-operation
      backend secret, so credential-unaware targets are supported while the runtime
      still holds no standing target credential.</t>
      <t>Authority is single-use and consumed at forward time: the enforcement point
      MUST atomically mark an identifier of the credential consumed <strong>before</strong>
      forwarding, and MUST reject any later presentation of that identifier, using a
      shared, durable, low-latency consumption store so the guarantee holds across
      replicas and restarts (defeating replay and time-of-check/time-of-use races).
      Credential lifetime MUST be measured from issuance and enforced at the
      enforcement point against a synchronized time source with a bounded skew
      tolerance.</t>
    </section>

    <section anchor="wire" numbered="true"><name>Wire Format (to be specified in -01)</name>
      <t>The three-mode autonomy model, the backchannel approval flow, the
      intent-scoped credential's bound-claim structure and its canonicalization, the
      digest linkage to the binding message, and the enforcement semantics
      (bound-claim match, forward-time single-use, fail-closed) are fixed by this
      revision. The concrete encodings of the approval-flow messages and the
      credential profile are deferred to the next revision, reusing existing OAuth
      and JWT encodings where practical.</t>
    </section>

    <section anchor="security" numbered="true"><name>Security Considerations</name>
      <t>The model's purpose is to shrink the blast radius of a compromised or
      misled entity: with no standing credentials and per-action scope, a prompt
      injection can at most attempt one narrowly-scoped, possibly human-gated action
      rather than wield broad authority. The digest linkage (<xref target="credential"/>)
      is the anti-confused-deputy control and MUST be preserved end to end: the
      canonicalization <xref target="RFC8785"/> MUST be identical at binding-message
      construction, credential issuance, and enforcement, or the human sees one
      operation while another is authorized. Replay is defeated only if consumption
      is recorded at forward time in a shared, durable store (<xref target="enforcement"/>);
      an in-memory or after-response revocation list leaves an exploitable window.
      The system MUST fail closed: on authorization-server error, all-channel
      delivery failure, approver timeout, or expiry, the action is denied and the
      denial is logged; no positive approval means no credential means no execution.
      Approval responses MUST be bound to the request identifier and, on reply/link
      channels, to a single-use expiring token, or an attacker or a careless
      approver can authorize the wrong request; unauthenticated channels (for
      example plain SMS) MUST be limited to non-critical actions. The human approval
      is one input to a machine-enforced cryptographic process, not a substitute for
      it.</t>
    </section>

    <section anchor="iana" numbered="true"><name>IANA Considerations</name>
      <t>A future revision will request registries for autonomy modes (autonomous,
      supervised, denied) and for the bound-claim names used in intent-scoped
      credentials, under a Specification Required policy <xref target="RFC8126"/>,
      and will register any new JWT claims via the established JWT claim registry. 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="RFC7519" target="https://www.rfc-editor.org/info/rfc7519">
        <front><title>JSON Web Token (JWT)</title>
        <author initials="M." surname="Jones"/><author initials="J." surname="Bradley"/>
        <author initials="N." surname="Sakimura"/><date year="2015" month="May"/></front>
        <seriesInfo name="RFC" value="7519"/></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-bootstrap">
        <front><title>NHE Constrained Bootstrap</title>
        <author initials="C.X." surname="Ruvalcaba"/><date year="2026" month="August"/></front>
        <seriesInfo name="Internet-Draft" value="draft-ruvalcaba-nhe-bootstrap-00"/></reference>
      <reference anchor="I-D.ruvalcaba-nhe-audit">
        <front><title>NHE Reasoning-Audit Log</title>
        <author initials="C.X." surname="Ruvalcaba"/><date year="2026" month="August"/></front>
        <seriesInfo name="Internet-Draft" value="draft-ruvalcaba-nhe-audit-00"/></reference>
      <reference anchor="RFC6749" target="https://www.rfc-editor.org/info/rfc6749">
        <front><title>The OAuth 2.0 Authorization Framework</title>
        <author initials="D." surname="Hardt"/><date year="2012" month="October"/></front>
        <seriesInfo name="RFC" value="6749"/></reference>
      <reference anchor="RFC9396" target="https://www.rfc-editor.org/info/rfc9396">
        <front><title>OAuth 2.0 Rich Authorization Requests</title>
        <author initials="T." surname="Lodderstedt"/><author initials="J." surname="Richer"/>
        <author initials="B." surname="Campbell"/><date year="2023" month="May"/></front>
        <seriesInfo name="RFC" value="9396"/></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>
