<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>

<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>

<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     ipr="trust200902"
     docName="draft-rampalli-pedigree-00"
     category="std"
     submissionType="IETF"
     consensus="true"
     xml:lang="en"
     version="3">

  <front>
    <title abbrev="PEDIGREE">PEDIGREE: Verifiable Delegation Identity for Agentic AI Systems</title>

    <seriesInfo name="Internet-Draft" value="draft-rampalli-pedigree-00"/>

    <author fullname="Karthik Rampalli" initials="K." surname="Rampalli">
      <organization>Glyphzero Labs Inc.</organization>
      <address>
        <email>karthik@phantomcorgi.com</email>
      </address>
    </author>

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

    <area>Security</area>
    <workgroup>Workload Identity in Multi-System Environments</workgroup>

    <keyword>agentic AI</keyword>
    <keyword>delegation</keyword>
    <keyword>identity</keyword>
    <keyword>authorization</keyword>
    <keyword>SPIFFE</keyword>

    <abstract>
      <t>
        This document defines PEDIGREE (Per-Agent Delegation Identity with
        Governance-Enforced Execution), an identity and delegation framework
        for AI agents that extends the workload-identity model of SPIFFE
        (RFC 9542 / draft-ietf-wimse) with cryptographic per-hop delegation,
        monotonic scope attenuation enforced at mint and at verify, and
        dual-layer authority enforcement combining an operator-controlled
        ceiling with per-parent mandate narrowing.
      </t>
      <t>
        PEDIGREE complements AAuth (draft-hardt-aauth-protocol) and AIP
        (draft-prakash-aip) by providing: (a) dual-enforcement semantics
        absent from both, (b) Cedar-policy mandates with static-analysis
        proofs of narrowing, (c) strict cryptographic parent-token
        re-verification that catches parent-swap attacks missed by
        append-only token chains, and (d) a native bridge to existing SPIFFE
        deployments.
      </t>
    </abstract>
  </front>

  <middle>

    <!-- ===== Section 1: Introduction ===== -->
    <section anchor="introduction" numbered="true" toc="default">
      <name>Introduction</name>

      <section anchor="problem" numbered="true" toc="default">
        <name>Problem</name>
        <t>
          Agentic AI systems spawn sub-agents dynamically. Current identity
          frameworks fail three tests:
        </t>
        <ol>
          <li>
            <strong>Attribution</strong>  -- when an orchestrator spawns a
            sub-agent to book flights and another to file expenses, both share
            the orchestrator's ambient credentials. Incident response cannot
            determine which sub-agent took which action.
          </li>
          <li>
            <strong>Attenuation</strong>  -- sub-agents typically inherit
            all parent authority. AAuth explicitly rejects scope attenuation
            (draft-hardt-aauth-protocol-01 Appendix C.3.7). Bearer-token and
            OAuth flows have no delegation narrowing primitive.
          </li>
          <li>
            <strong>Enforcement</strong>  -- even protocols that define
            attenuation (AIP) defer aggregate budget enforcement to "the
            orchestration platform at runtime"
            (draft-prakash-aip-00 Section 7.4), leaving a single-layer guard
            vulnerable to orchestrator compromise.
          </li>
        </ol>
      </section>

      <section anchor="non-goals" numbered="true" toc="default">
        <name>Non-Goals</name>
        <ul>
          <li>
            Replacing SPIFFE/WIMSE workload identity for in-cluster
            service-to-service auth. PEDIGREE is an upper layer that
            delegates from a SPIFFE-bearing root.
          </li>
          <li>
            Defining a user-authentication protocol. OIDC/OAuth flows
            bootstrap the root consent; PEDIGREE governs what happens after.
          </li>
          <li>
            Specifying an authorization policy language. PEDIGREE accepts
            Cedar (<bcp14>RECOMMENDED</bcp14>), Datalog, or Rego as mandate policy formats.
          </li>
        </ul>
      </section>

      <section anchor="related-work" numbered="true" toc="default">
        <name>Related Work</name>
        <t>
          The following table compares PEDIGREE with existing protocols
          across key delegation and enforcement dimensions.
        </t>
        <table anchor="comparison-table">
          <name>Protocol Comparison</name>
          <thead>
            <tr>
              <th>Protocol</th>
              <th>Sub-agent identity</th>
              <th>Scope attenuation</th>
              <th>Per-hop audit</th>
              <th>Dual enforcement</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>AAuth (draft-hardt)</td>
              <td>No</td>
              <td>Explicitly rejected</td>
              <td>Mission-level</td>
              <td>No</td>
            </tr>
            <tr>
              <td>AIP (draft-prakash)</td>
              <td>Yes (aip:key:ed25519:)</td>
              <td>Yes (Biscuit)</td>
              <td>Mandatory context</td>
              <td>No (budget punted)</td>
            </tr>
            <tr>
              <td>SPIFFE SVID</td>
              <td>Per-workload</td>
              <td>None</td>
              <td>Workload-level</td>
              <td>No</td>
            </tr>
            <tr>
              <td>ZeroID (open-source)</td>
              <td>Yes (RFC 8693)</td>
              <td>Yes</td>
              <td>CAEP cascade</td>
              <td>No</td>
            </tr>
            <tr>
              <td>PEDIGREE (this document)</td>
              <td>Yes (parent_chain)</td>
              <td>Yes (Cedar, mint+verify)</td>
              <td>Consent chain + SIEM</td>
              <td>Yes (ceiling intersect mandate)</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>

    <!-- ===== Section 2: Terminology ===== -->
    <section anchor="terminology" numbered="true" toc="default">
      <name>Terminology</name>
      <t>
        The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>",
        "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>",
        "<bcp14>SHALL NOT</bcp14>", "<bcp14>SHOULD</bcp14>",
        "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>",
        "<bcp14>NOT RECOMMENDED</bcp14>", "<bcp14>MAY</bcp14>", and
        "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
        described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/>
        when, and only when, they appear in all capitals, as shown here.
      </t>
      <dl>
        <dt>Root</dt>
        <dd>
          A human principal whose initial consent establishes the delegation
          chain.
        </dd>
        <dt>Primary Agent</dt>
        <dd>
          A long-lived agent holding a signing keypair, directly delegated-to
          by the root.
        </dd>
        <dt>Sub-Agent</dt>
        <dd>
          An ephemeral agent issued a PEDIGREE by a primary or another
          sub-agent.
        </dd>
        <dt>PEDIGREE</dt>
        <dd>
          A signed JWT carrying principal identity, parent chain, mandate
          (policy set), public key, and lifetime.
        </dd>
        <dt>SIT</dt>
        <dd>
          Suradar Identity Token  -- the concrete wire format of a
          PEDIGREE, compatible with RFC 7519.
        </dd>
        <dt>Mandate</dt>
        <dd>
          A typed policy set (Cedar by default) defining what actions an
          agent may perform on which resources.
        </dd>
        <dt>Ceiling</dt>
        <dd>
          The deployment-level policy set defined by the operator; applies to
          all agents regardless of individual mandates.
        </dd>
        <dt>Consent Chain</dt>
        <dd>
          An ordered sequence of principal-issued consents authorizing
          transitive delegation, with optional depth limits.
        </dd>
      </dl>
    </section>

    <!-- ===== Section 3: Identity Model ===== -->
    <section anchor="identity-model" numbered="true" toc="default">
      <name>Identity Model</name>

      <section anchor="identifier-schemes" numbered="true" toc="default">
        <name>Identifier Schemes</name>
        <t>PEDIGREE defines two identifier schemes:</t>
        <dl>
          <dt>Named (registry-backed)</dt>
          <dd>
            <t>Format: <tt>pedigree:name:&lt;deployment&gt;/&lt;agent-id&gt;</tt></t>
            <t>Example: <tt>pedigree:name:glyphzero/trading-orchestrator-7f3a</tt></t>
          </dd>
          <dt>Self-certifying (registry-free)</dt>
          <dd>
            <t>Format: <tt>pedigree:key:ed25519:&lt;multibase-public-key&gt;</tt></t>
            <t>Example: <tt>pedigree:key:ed25519:z6MkpZ...</tt></t>
            <t>RECOMMENDED for sub-agents with lifetimes under 5 minutes.</t>
          </dd>
        </dl>
      </section>

      <section anchor="root-of-trust" numbered="true" toc="default">
        <name>Root of Trust</name>
        <t>
          Each chain terminates at a root principal (human, identified via
          OIDC/OAuth). The primary agent's PEDIGREE carries the root's
          <tt>sub</tt> claim and a signature over the initial consent.
        </t>
      </section>
    </section>

    <!-- ===== Section 4: Token Format ===== -->
    <section anchor="token-format" numbered="true" toc="default">
      <name>Token Format</name>

      <section anchor="header" numbered="true" toc="default">
        <name>Header</name>
        <artwork type="json"><![CDATA[
{
  "alg": "EdDSA",
  "typ": "pedigree+jwt"
}
]]></artwork>
      </section>

      <section anchor="payload" numbered="true" toc="default">
        <name>Payload (SIT Claims)</name>
        <t>
          The following is the set of claims carried in a SIT payload:
        </t>
        <artwork type="json"><![CDATA[
{
  "iss": "<issuer identity>",
  "sub": "<this agent's identity>",
  "jti": "<token uuid>",
  "iat": 1712345678,
  "exp": 1712349278,
  "pedigree_version": "0.1",
  "agent_pub": "<base64url ed25519 pubkey>",
  "parent_chain": ["<parent jti>", "<grandparent jti>"],
  "delegation_depth": 2,
  "scopes": ["read:cal", "write:cal"],
  "mandate": {
    "format": "cedar",
    "policy_set": "permit(principal, action == PedigreeAction::\"read_file\", resource);"
  },
  "consent_chain": ["<consent id>"],
  "ceiling_ref": "sha256:<operator ceiling hash>",
  "completion_bindable": true
}
]]></artwork>
      </section>

      <section anchor="invariants" numbered="true" toc="default">
        <name>Required Invariants</name>
        <ol>
          <li>
            <tt>delegation_depth</tt> == <tt>len(parent_chain)</tt>
          </li>
          <li>
            <tt>scopes</tt> <bcp14>MUST</bcp14> be a subset of the immediate parent's
            scopes.
          </li>
          <li>
            <tt>exp - iat</tt> <bcp14>MUST NOT</bcp14> exceed the parent's remaining
            lifetime.
          </li>
          <li>
            <tt>mandate.policy_set</tt> <bcp14>MUST</bcp14> narrow or equal the parent's
            mandate under the static-analysis check of
            <xref target="mandate-narrowing"/>.
          </li>
        </ol>
      </section>
    </section>

    <!-- ===== Section 5: Delegation ===== -->
    <section anchor="delegation" numbered="true" toc="default">
      <name>Delegation</name>

      <section anchor="mint" numbered="true" toc="default">
        <name>Mint</name>
        <t>To mint a child SIT, the parent:</t>
        <ol>
          <li>Verifies its own SIT is unexpired and not revoked.</li>
          <li>Chooses a subset of its scopes.</li>
          <li>Generates (or receives) the child's public key.</li>
          <li>
            Computes a child mandate that is provably narrower than the
            parent's (see <xref target="mandate-narrowing"/>).
          </li>
          <li>
            Appends its own <tt>jti</tt> to the child's
            <tt>parent_chain</tt>.
          </li>
          <li>Signs the child JWT with its own private key.</li>
        </ol>
      </section>

      <section anchor="verify" numbered="true" toc="default">
        <name>Verify (Strict)</name>
        <t>Verifiers <bcp14>MUST</bcp14>:</t>
        <ol>
          <li>
            Cryptographically verify the leaf SIT against the issuer's
            public key.
          </li>
          <li>
            Retrieve each parent JWT referenced by <tt>parent_chain</tt>
            and cryptographically verify each.
          </li>
          <li>
            Check each parent's <tt>sub</tt> equals the corresponding
            <tt>parent_chain</tt> entry of the descendant.
          </li>
          <li>
            Check each hop's <tt>scopes</tt> is a subset of the prior
            hop's scopes.
          </li>
          <li>
            Check each hop's mandate is a narrowing of the prior hop's
            mandate via static analysis
            (<xref target="mandate-narrowing"/>).
          </li>
          <li>
            Check the leaf's <tt>ceiling_ref</tt> hash matches the
            operator's current ceiling or a published prior version within
            grace period.
          </li>
        </ol>
      </section>

      <section anchor="parent-swap-resistance" numbered="true" toc="default">
        <name>Parent-Swap Resistance</name>
        <t>
          Because verification re-verifies each parent against the issuer's
          public key, an attacker cannot substitute a same-scope parent from
          a different chain. AIP's Biscuit append-only semantics trust block
          signatures and do not re-verify upstream; PEDIGREE's explicit
          re-verification catches this attack class.
        </t>
      </section>
    </section>

    <!-- ===== Section 6: Dual Enforcement ===== -->
    <section anchor="dual-enforcement" numbered="true" toc="default">
      <name>Dual Enforcement</name>
      <t>
        Every authorization decision requires both:
      </t>
      <ol>
        <li>
          <strong>Mandate:</strong> the SIT's <tt>mandate.policy_set</tt>
          permits the action (parent's delegation narrowing).
        </li>
        <li>
          <strong>Ceiling:</strong> the operator-deployed ceiling policy
          permits the action (applies to all agents).
        </li>
      </ol>
      <t>Pseudocode:</t>
      <artwork><![CDATA[
allow = mandate.evaluate(action, resource)
     && ceiling.evaluate(action, resource)
]]></artwork>
      <t>
        The ceiling is identified by <tt>ceiling_ref</tt> (SHA-256 of the
        operator-signed ceiling policy document) and distributed out-of-band
        (or via a well-known URL).
      </t>
      <t>
        This primitive is absent from AAuth, AIP, SPIFFE, and ZeroID.
      </t>
    </section>

    <!-- ===== Section 7: Mandate Narrowing ===== -->
    <section anchor="mandate-narrowing" numbered="true" toc="default">
      <name>Mandate Narrowing</name>

      <section anchor="narrowing-check" numbered="true" toc="default">
        <name>Narrowing Check</name>
        <t>
          A child mandate M_c narrows a parent mandate M_p if and only if:
        </t>
        <artwork><![CDATA[
forall (action, resource).
  M_c.permits(action, resource) => M_p.permits(action, resource)
]]></artwork>
      </section>

      <section anchor="static-analysis" numbered="true" toc="default">
        <name>Static Analysis</name>
        <t>
          When <tt>mandate.format == "cedar"</tt>, implementations <bcp14>MUST</bcp14> emit
          a static-analysis proof that M_c narrows M_p. Cedar's published
          analyzer (AWS 2024) suffices. The proof artifact <bcp14>MAY</bcp14> accompany the
          SIT as a <tt>narrowing_proof</tt> field referencing the proof by
          content hash.
        </t>
        <t>
          This static-proof primitive is absent from AIP (Biscuit semantics
          enforce narrowing imperatively but do not emit a verifiable
          artifact).
        </t>
      </section>
    </section>

    <!-- ===== Section 8: Completion Blocks ===== -->
    <section anchor="completion-blocks" numbered="true" toc="default">
      <name>Completion Blocks</name>

      <section anchor="cb-purpose" numbered="true" toc="default">
        <name>Purpose</name>
        <t>
          A completion block cryptographically binds the outcome of an
          agent's action to the delegation chain that authorized it,
          enabling downstream verifiers to prove a result came from an
          authorized chain without trusting out-of-band audit logs.
        </t>
      </section>

      <section anchor="cb-format" numbered="true" toc="default">
        <name>Format</name>
        <artwork type="json"><![CDATA[
{
  "jti": "<completion jti>",
  "parent_sit": "<sit jti>",
  "status": "completed",
  "result_hash": "sha256:<hex>",
  "verification_status": "self_reported",
  "cost_cents": 1234,
  "timestamp": "<rfc3339>",
  "signing_agent": "<agent identity>"
}
]]></artwork>
        <t>
          The <tt>status</tt> field <bcp14>MUST</bcp14> be one of: "completed", "failed",
          or "partial".
        </t>
        <t>
          The <tt>verification_status</tt> field <bcp14>MUST</bcp14> be one of:
          "self_reported", "tool_verified", "peer_verified", or
          "human_verified".
        </t>
        <t>
          The completion block is signed by the executing agent's private
          key. Verifiers check the signature against <tt>agent_pub</tt> of
          the referenced SIT.
        </t>
      </section>

      <section anchor="cb-chain-binding" numbered="true" toc="default">
        <name>Chain Binding</name>
        <t>
          A downstream agent receiving a result from an upstream agent
          <bcp14>SHOULD</bcp14> require the completion block alongside the result. The
          receiving agent <bcp14>MAY</bcp14> refuse to consume un-bound results.
        </t>
      </section>
    </section>

    <!-- ===== Section 9: Revocation ===== -->
    <section anchor="revocation" numbered="true" toc="default">
      <name>Revocation</name>

      <section anchor="cascade" numbered="true" toc="default">
        <name>Cascade</name>
        <t>
          Revoking a consent or a parent SIT invalidates every descendant in
          the chain. Implementations <bcp14>MUST</bcp14> walk the consent chain when
          evaluating revocation.
        </t>
      </section>

      <section anchor="ssf" numbered="true" toc="default">
        <name>Shared Signals Framework</name>
        <t>
          Implementations <bcp14>SHOULD</bcp14> emit OpenID SSF events
          (credential-change, session-revoked) on revocation to propagate
          to connected IdPs. See draft-rampalli-suradar-bindings for CAEP
          event schema.
        </t>
      </section>
    </section>

    <!-- ===== Section 10: Security Considerations ===== -->
    <section anchor="security-considerations" numbered="true" toc="default">
      <name>Security Considerations</name>
      <dl>
        <dt>Parent-swap</dt>
        <dd>
          Mitigated by strict cryptographic re-verification
          (<xref target="parent-swap-resistance"/>).
        </dd>
        <dt>Scope escalation</dt>
        <dd>
          Mitigated by subset check at mint AND at verify.
        </dd>
        <dt>Ceiling bypass</dt>
        <dd>
          Mitigated by dual enforcement
          (<xref target="dual-enforcement"/>).
        </dd>
        <dt>Audit evasion</dt>
        <dd>
          Mitigated by mandatory context on each delegation block and by
          cryptographic completion blocks
          (<xref target="completion-blocks"/>).
        </dd>
        <dt>Key compromise</dt>
        <dd>
          Ephemeral self-cert keys
          (<xref target="identifier-schemes"/>) limit blast radius to
          their TTL.
        </dd>
        <dt>Replay</dt>
        <dd>
          <tt>jti</tt> uniqueness enforced by nonce store.
        </dd>
        <dt>Transitive consent</dt>
        <dd>
          ConsentChain with TransitiveConsent=false blocks downstream
          delegation.
        </dd>
      </dl>
    </section>

    <!-- ===== Section 11: IANA Considerations ===== -->
    <section anchor="iana-considerations" numbered="true" toc="default">
      <name>IANA Considerations</name>
      <t>This document requests the following registrations:</t>

      <section anchor="iana-jwt-typ" numbered="true" toc="default">
        <name>JWT "typ" Header Value</name>
        <t>
          Registration of the "pedigree+jwt" value in the "JSON Web Token
          Types" sub-registry of the "JSON Web Token (JWT)" registry:
        </t>
        <dl>
          <dt>Type Header Parameter Value</dt>
          <dd>pedigree+jwt</dd>
          <dt>Specification Document</dt>
          <dd>This document, <xref target="header"/></dd>
        </dl>
      </section>

      <section anchor="iana-uri-scheme" numbered="true" toc="default">
        <name>URI Scheme</name>
        <t>
          Provisional registration of the "pedigree" URI scheme with two
          defined forms:
        </t>
        <ul>
          <li><tt>pedigree:name:&lt;deployment&gt;/&lt;agent-id&gt;</tt></li>
          <li><tt>pedigree:key:ed25519:&lt;multibase-public-key&gt;</tt></li>
        </ul>
      </section>

      <section anchor="iana-well-known" numbered="true" toc="default">
        <name>Well-Known URI</name>
        <t>
          Registration of the well-known URI
          <tt>/.well-known/pedigree-agent.json</tt> per RFC 8615.
        </t>
      </section>
    </section>
  </middle>

  <back>

    <!-- ===== References ===== -->
    <references>
      <name>References</name>

      <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 fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </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 fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>

        <reference anchor="RFC7519" target="https://www.rfc-editor.org/info/rfc7519">
          <front>
            <title>JSON Web Token (JWT)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
            <date month="May" year="2015"/>
          </front>
          <seriesInfo name="RFC" value="7519"/>
          <seriesInfo name="DOI" value="10.17487/RFC7519"/>
        </reference>

        <reference anchor="RFC8785" target="https://www.rfc-editor.org/info/rfc8785">
          <front>
            <title>JSON Canonicalization Scheme (JCS)</title>
            <author fullname="A. Rundgren" initials="A." surname="Rundgren"/>
            <author fullname="B. Jordan" initials="B." surname="Jordan"/>
            <author fullname="S. Erdtman" initials="S." surname="Erdtman"/>
            <date month="June" year="2020"/>
          </front>
          <seriesInfo name="RFC" value="8785"/>
          <seriesInfo name="DOI" value="10.17487/RFC8785"/>
        </reference>

        <reference anchor="RFC9421" target="https://www.rfc-editor.org/info/rfc9421">
          <front>
            <title>HTTP Message Signatures</title>
            <author fullname="A. Backman" initials="A." surname="Backman"/>
            <author fullname="J. Richer" initials="J." surname="Richer"/>
            <author fullname="M. Sporny" initials="M." surname="Sporny"/>
            <date month="February" year="2024"/>
          </front>
          <seriesInfo name="RFC" value="9421"/>
          <seriesInfo name="DOI" value="10.17487/RFC9421"/>
        </reference>

        <reference anchor="RFC9542" target="https://www.rfc-editor.org/info/rfc9542">
          <front>
            <title>SPIFFE Identity and Verifiable Identity Document</title>
            <author fullname="E. Gilman" initials="E." surname="Gilman"/>
            <author fullname="E. Baier" initials="E." surname="Baier"/>
            <date month="February" year="2024"/>
          </front>
          <seriesInfo name="RFC" value="9542"/>
          <seriesInfo name="DOI" value="10.17487/RFC9542"/>
        </reference>
      </references>

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

        <reference anchor="I-D.hardt-aauth-protocol">
          <front>
            <title>AAuth Protocol</title>
            <author fullname="D. Hardt" initials="D." surname="Hardt"/>
            <date month="March" year="2026"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-hardt-aauth-protocol-01"/>
        </reference>

        <reference anchor="I-D.prakash-aip">
          <front>
            <title>Agent Interoperability Protocol</title>
            <author fullname="A. Prakash" initials="A." surname="Prakash"/>
            <date month="March" year="2026"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-prakash-aip-00"/>
        </reference>

        <reference anchor="CEDAR">
          <front>
            <title>Cedar: A Language for Expressing Authorization Policies</title>
            <author>
              <organization>Amazon Web Services</organization>
            </author>
            <date year="2023"/>
          </front>
          <refcontent>https://www.cedarpolicy.com/</refcontent>
        </reference>

        <reference anchor="SPIFFE-SPEC">
          <front>
            <title>SPIFFE/SPIRE Specification v1.0</title>
            <author>
              <organization>CNCF SPIFFE Project</organization>
            </author>
            <date year="2023"/>
          </front>
          <refcontent>https://spiffe.io/</refcontent>
        </reference>

        <reference anchor="RFC8615" target="https://www.rfc-editor.org/info/rfc8615">
          <front>
            <title>Well-Known Uniform Resource Identifiers (URIs)</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <date month="May" year="2019"/>
          </front>
          <seriesInfo name="RFC" value="8615"/>
          <seriesInfo name="DOI" value="10.17487/RFC8615"/>
        </reference>
      </references>
    </references>

    <!-- ===== Appendix A ===== -->
    <section anchor="appendix-comparison" numbered="true" toc="default">
      <name>Comparison with AAuth and AIP</name>
      <t>
        A detailed landscape comparison of PEDIGREE, AAuth, and AIP across
        all delegation, enforcement, and audit dimensions is maintained in
        the companion document:
        draft-rampalli-pedigree-landscape-comparison.
      </t>
      <t>
        Key differentiators summarized:
      </t>
      <ul>
        <li>
          AAuth (draft-hardt-aauth-protocol-01) explicitly rejects scope
          attenuation and provides no sub-agent identity primitive.
          PEDIGREE adds both.
        </li>
        <li>
          AIP (draft-prakash-aip-00) provides sub-agent identity and
          Biscuit-based attenuation but defers budget enforcement to the
          orchestration platform and does not emit static-analysis proofs.
          PEDIGREE adds dual enforcement and Cedar-based narrowing proofs.
        </li>
      </ul>
    </section>

    <!-- ===== Appendix B ===== -->
    <section anchor="appendix-implementations" numbered="true" toc="default">
      <name>Reference Implementations</name>
      <dl>
        <dt>Go</dt>
        <dd>
          github.com/glyphzero/suradar  -- production implementation
          covering L1-L3 of the SURADAR stack.
        </dd>
        <dt>Python</dt>
        <dd>Planned.</dd>
        <dt>TypeScript</dt>
        <dd>Planned.</dd>
      </dl>
    </section>

  </back>
</rfc>
