<?xml version="1.0" encoding="UTF-8"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     category="info"
     docName="draft-watts-ai-identity-00"
     ipr="trust200902"
     submissionType="IETF"
     version="3">
  <front>
    <title abbrev="AID-1">AID-1: A Cryptographically Bindable Identity and Provenance Architecture for AI Systems</title>
    <seriesInfo name="Internet-Draft" value="draft-watts-ai-identity-00"/>
    <author fullname="Deonte Watts" initials="D." surname="Watts">
      <organization>Independent Researcher</organization>
      <address>
        <email>deonte@goodshyt.fun</email>
        <uri>https://orcid.org/0009-0005-8586-3650</uri>
      </address>
    </author>
    <date year="2026" month="October" day="09"/>
    <area>Security</area>
    <workgroup>Internet Engineering Task Force</workgroup>
    <keyword>AI identity</keyword>
    <keyword>provenance</keyword>
    <keyword>authorization</keyword>
    <keyword>delegation</keyword>
    <keyword>attestation</keyword>
    <keyword>conformance</keyword>
    <abstract>
      <t>
        This document specifies AID-1, a provider-independent architecture for
        representing and verifying cryptographically bindable identity,
        delegation, authorization, action evidence, execution attestation,
        provenance, and governance information associated with AI systems and
        AI-mediated actions.  AID-1 intentionally separates signature
        validity, identity binding, authority, execution evidence, provenance,
        and downstream admissibility.  The specification defines trust domains,
        signed envelopes, external key resolution, delegation credentials,
        authorization decisions, temporal and revocation checks, replay
        protection, typed provenance claims, and a deterministic verification
        order with ALLOW, DENY, and INDETERMINATE outcomes.
      </t>
    </abstract>
  </front>

  <middle>
    <section anchor="intro" numbered="true" toc="include">
      <name>Introduction</name>
      <t>
        AI systems increasingly participate in software development, content
        production, scientific workflows, operational control, and autonomous
        or semi-autonomous execution.  Existing identifiers such as model names,
        deployment IDs, API credentials, or embedded public keys do not by
        themselves establish trusted identity, delegated authority, execution
        context, or provenance.
      </t>
      <t>
        AID-1 defines a compositional verification architecture in which a
        cryptographic signature is only one element of a larger trust chain.
        The architecture is intentionally provider-independent and does not
        require any specific hardware root of trust.
      </t>
      <t>
        The core doctrine is:
      </t>
      <artwork><![CDATA[
Identity != Authority != Action Evidence
      ]]></artwork>
      <t>
        A conforming implementation MUST preserve this separation.
      </t>
    </section>

    <section anchor="conventions">
      <name>Conventions and Terminology</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"/> and <xref target="RFC8174"/>
        when, and only when, they appear in all capitals, as shown here.
      </t>
      <dl>
        <dt>Actor</dt>
        <dd>An identity, human or machine, that is represented as performing or requesting an action.</dd>
        <dt>Trusted Key Registry</dt>
        <dd>An external trust source that resolves a key identifier to key material and binding status.</dd>
        <dt>Delegation</dt>
        <dd>A signed grant permitting one subject to exercise specified capabilities on behalf of another subject.</dd>
        <dt>Authorization</dt>
        <dd>A policy decision determining whether an operation is permitted for a subject, resource, audience, and time.</dd>
        <dt>Attestation</dt>
        <dd>Independently verifiable evidence about an execution environment, workflow, or identity assertion.</dd>
        <dt>Provenance</dt>
        <dd>Evidence describing the origin, transformation, integrity, or lineage of an artifact or action.</dd>
      </dl>
    </section>

    <section anchor="principles">
      <name>Design Principles</name>
      <t>AID-1 implementations MUST preserve the following non-equivalences:</t>
      <artwork><![CDATA[
Signature validity != identity proof
Identity proof != delegation
Delegation != authorization
Authorization != execution attestation
Execution attestation != artifact truth
Artifact integrity != semantic correctness
      ]]></artwork>
      <t>
        Successful verification in one trust domain MUST NOT be treated as
        implicit success in another trust domain.
      </t>
    </section>

    <section anchor="domains">
      <name>Trust Domains</name>

      <section anchor="domain-identity">
        <name>Identity</name>
        <t>
          The identity domain answers "Who is the actor?"  An implementation
          MUST NOT treat self-asserted identity metadata as sufficient trusted
          identity evidence unless policy explicitly allows that trust model.
        </t>
      </section>

      <section anchor="domain-key">
        <name>Key Binding</name>
        <t>
          The key-binding domain answers "Which trusted key represents the
          actor?"  A public key supplied inside the artifact being verified
          MUST NOT be treated as its own trust anchor.
        </t>
      </section>

      <section anchor="domain-delegation">
        <name>Delegation</name>
        <t>
          The delegation domain answers "May this delegate act for the issuer?"
          Delegation MUST be represented and validated independently from the
          underlying signature.
        </t>
      </section>

      <section anchor="domain-authorization">
        <name>Authorization</name>
        <t>
          The authorization domain answers "May this actor perform this
          operation on this resource now?"  Authorization SHOULD bind at least
          the operation, resource, subject, audience, time, delegation state,
          and revocation state.
        </t>
      </section>

      <section anchor="domain-action">
        <name>Action Evidence</name>
        <t>
          Action evidence identifies what was requested or performed, including
          content-addressed inputs, outputs, commit identifiers, environment
          identifiers, and other execution-relevant context.
        </t>
      </section>

      <section anchor="domain-attestation">
        <name>Execution Attestation</name>
        <t>
          Execution attestation answers "Where and under what trusted workflow
          was the action executed?"  Claims copied into a signed payload remain
          signer assertions unless independently verified against the relevant
          attestation authority.
        </t>
      </section>

      <section anchor="domain-governance">
        <name>Governance</name>
        <t>
          Governance determines whether evidence is presently accepted under
          revocation, rotation, supersession, retention, and audit policy.
        </t>
      </section>
    </section>

    <section anchor="objects">
      <name>Core AID-1 Objects</name>

      <section anchor="envelope">
        <name>Signed Envelope</name>
        <sourcecode type="typescript"><![CDATA[
export interface SignedEnvelopeV1 {
  schema: "miseos.signed-envelope/v1";
  algorithm: "Ed25519";
  keyId: string;
  payloadDigest: {
    algorithm: "sha256";
    value: string;
  };
  issuedAt: string;
  expiresAt?: string;
  nonce: string;
  audience: string;
  actionId: string;
  authorizationId: string;
  delegationId?: string;
}

export interface DetachedSignatureV1 {
  envelope: SignedEnvelopeV1;
  signature: string;
}
        ]]></sourcecode>
        <t>
          A signer MUST sign the JSON Canonicalization Scheme (JCS)
          representation of the envelope as specified in
          <xref target="RFC8785"/>.  Ed25519 is specified in
          <xref target="RFC8032"/>.  The signature operation is:
        </t>
        <artwork><![CDATA[
Ed25519.Sign(sk, JCS(envelope))
        ]]></artwork>
        <t>
          The unsigned transport representation MAY include informational public
          key material, but a verifier MUST resolve keyId through an independent
          trusted source before treating the key as trusted.
        </t>
      </section>

      <section anchor="key-registry">
        <name>Trusted Key Record</name>
        <sourcecode type="typescript"><![CDATA[
export interface TrustedKeyRecord {
  keyId: string;
  subjectId: string;
  publicKeyPem: string;
  fingerprintSha256: string;
  status: "active" | "rotated" | "revoked" | "suspended";
  validFrom: string;
  validUntil?: string;
  bindingMethod:
    | "github-oidc"
    | "github-ssh"
    | "github-gpg"
    | "organization-registry"
    | "manual-root-verification";
}
        ]]></sourcecode>
        <t>
          If the required registry cannot be consulted, a verifier MUST NOT
          return ALLOW solely on the basis of an artifact-supplied key.
        </t>
      </section>

      <section anchor="delegation-object">
        <name>Delegation Credential</name>
        <sourcecode type="typescript"><![CDATA[
export interface DelegationCredentialV1 {
  schema: "miseos.delegation/v1";
  delegationId: string;
  issuerSubjectId: string;
  delegateSubjectId: string;
  capabilities: string[];
  resourcePatterns: string[];
  notBefore: string;
  expiresAt: string;
  revocationId: string;
  audience: string;
  maxDelegationDepth: number;
}
        ]]></sourcecode>
      </section>

      <section anchor="authorization-object">
        <name>Authorization Decision</name>
        <sourcecode type="typescript"><![CDATA[
export type Operation =
  | "execute"
  | "delegate"
  | "modify"
  | "publish"
  | "read-evidence"
  | "create-credential";

export interface AuthorizationDecision {
  effect: "allow" | "deny" | "indeterminate";
  operation: Operation;
  reasons: string[];
  evaluatedAt: string;
}
        ]]></sourcecode>
      </section>

      <section anchor="provenance-object">
        <name>Typed Provenance Claims</name>
        <sourcecode type="typescript"><![CDATA[
export type ClaimSource =
  | "signed-by-key"
  | "github-oidc"
  | "git-object"
  | "artifact-digest"
  | "external-attestation"
  | "self-asserted";

interface ProvenanceClaim<T> {
  value: T;
  source: ClaimSource;
  verified: boolean;
  evidenceRef?: string;
  verifier?: string;
  checkedAt?: string;
}
        ]]></sourcecode>
        <t>
          Implementations SHOULD distinguish self-asserted values from
          independently verified evidence.
        </t>
      </section>
    </section>

    <section anchor="canonicalization">
      <name>Canonicalization and Hashing</name>
      <t>
        AID-1 signed JSON objects MUST use JCS as specified in
        <xref target="RFC8785"/> prior to signing or signature verification.
      </t>
      <t>
        Implementations MUST reject non-JSON values before canonicalization.
        Rejected values include undefined values, NaN, infinities, Date
        instances, Map, Set, Buffer, typed arrays, class instances, accessors,
        and cyclic structures.
      </t>
      <t>
        Binary content SHOULD be represented using explicit encodings or,
        preferably, by content digests.
      </t>
      <sourcecode type="typescript"><![CDATA[
export function hashChain(values: JsonValue[]): string {
  return sha256Jcs({
    schema: "miseos.hash-sequence/v1",
    values,
  });
}
      ]]></sourcecode>
    </section>

    <section anchor="temporal">
      <name>Temporal Validation</name>
      <t>
        Time values used for authority-bearing decisions MUST be unambiguous
        instants.  Implementations SHOULD require canonical UTC timestamps.
      </t>
      <sourcecode type="typescript"><![CDATA[
export function parseInstant(value: string): Date | null {
  const date = new Date(value);
  if (
    !Number.isFinite(date.getTime()) ||
    date.toISOString() !== value
  ) {
    return null;
  }
  return date;
}
      ]]></sourcecode>
      <t>
        Unless policy specifies a bounded clock-skew allowance, the required
        relation is:
      </t>
      <artwork><![CDATA[
notBefore <= issuedAt <= verificationTime <= expiresAt
      ]]></artwork>
      <t>
        Invalid or unparsable timestamps MUST NOT fail open.
      </t>
    </section>

    <section anchor="revocation">
      <name>Revocation and Key Status</name>
      <sourcecode type="typescript"><![CDATA[
export interface RevocationRegistry {
  getStatus(
    revocationId: string,
    at: string,
  ): Promise<"valid" | "revoked" | "unknown">;
}
      ]]></sourcecode>
      <t>
        For authority-bearing operations, a required revocation status of
        "unknown" MUST result in either DENY or INDETERMINATE according to
        policy.  It MUST NOT result in ALLOW.
      </t>
      <t>
        Historical verification SHOULD distinguish evidence that was valid when
        issued and later revoked from evidence that had already been revoked at
        the claimed execution time.
      </t>
    </section>

    <section anchor="replay">
      <name>Replay Protection</name>
      <t>
        Authority-bearing AID-1 envelopes MUST include a nonce, stable actionId,
        audience, and bounded validity period.  Where policy requires single-use
        authorization, the verifier MUST reject a previously consumed
        nonce/action pair.
      </t>
      <t>
        Implementations SHOULD bind replay protection to the relevant
        repository, workflow, deployment, environment, or equivalent execution
        scope when such context exists.
      </t>
    </section>

    <section anchor="attestation">
      <name>External Attestation</name>
      <t>
        When GitHub OIDC or another external attestation mechanism is required,
        a verifier MUST validate the attestation against the appropriate issuer,
        expected audience, trusted workflow or workload identity policy, and any
        required repository, workflow reference, workflow SHA, commit SHA,
        triggering actor, environment, and subject constraints.
      </t>
      <t>
        Merely copying those values into an AID-1 signed object proves only that
        the signer asserted them.  It does not independently verify the
        attestation.
      </t>
    </section>

    <section anchor="verification">
      <name>Verification Algorithm</name>
      <t>
        A conforming verifier evaluating an authority-bearing AID-1 object MUST
        perform the following checks in an order that preserves the same
        security dependencies.  An implementation MAY internally optimize
        checks, provided that no optimization can turn a required failed or
        unavailable prerequisite into ALLOW.
      </t>
      <ol>
        <li>Parse input without coercion.</li>
        <li>Validate the applicable wire schema.</li>
        <li>Canonicalize the signed envelope.</li>
        <li>Resolve keyId through an external trusted source.</li>
        <li>Verify key status and identity binding.</li>
        <li>Verify the Ed25519 signature.</li>
        <li>Verify the payload digest.</li>
        <li>Verify issuer and audience constraints.</li>
        <li>Verify external attestation when required.</li>
        <li>Verify the delegation chain and delegation depth.</li>
        <li>Verify operation and resource authorization.</li>
        <li>Verify temporal constraints and clock policy.</li>
        <li>Verify revocation status.</li>
        <li>Verify replay constraints.</li>
        <li>Verify provenance and artifact hashes.</li>
        <li>Return the final verification decision.</li>
      </ol>
    </section>

    <section anchor="decisions">
      <name>Decision Semantics</name>
      <dl>
        <dt>ALLOW</dt>
        <dd>Every trust domain required by policy completed successfully.</dd>
        <dt>DENY</dt>
        <dd>At least one required domain definitively failed.</dd>
        <dt>INDETERMINATE</dt>
        <dd>No definitive failure has been established, but at least one required verification step could not be completed.</dd>
      </dl>
      <t>
        INDETERMINATE MUST NOT be interpreted as ALLOW.
      </t>
      <t>
        Examples include: an unavailable revocation registry, which SHOULD yield
        INDETERMINATE or DENY; an invalid signature, which MUST yield DENY; and
        a trusted key already revoked at the relevant time, which MUST yield
        DENY.
      </t>
    </section>

    <section anchor="failures">
      <name>Failure Taxonomy</name>
      <sourcecode type="typescript"><![CDATA[
export type VerificationFailureCode =
  | "IDENTITY_BINDING_UNVERIFIED"
  | "KEY_NOT_TRUSTED"
  | "KEY_REVOKED"
  | "KEY_SUSPENDED"
  | "SIGNATURE_INVALID"
  | "DELEGATION_MISSING"
  | "DELEGATION_INVALID"
  | "DELEGATION_EXPIRED"
  | "DELEGATION_DEPTH_EXCEEDED"
  | "AUTHORIZATION_DENIED"
  | "TEMPORAL_INVALID"
  | "REVOCATION_UNKNOWN"
  | "REPLAY_DETECTED"
  | "AUDIENCE_MISMATCH"
  | "ATTESTATION_UNVERIFIED"
  | "PROVENANCE_MISMATCH"
  | "SCHEMA_INVALID"
  | "DIGEST_MISMATCH";
      ]]></sourcecode>
      <t>
        Implementations SHOULD return structured per-domain verification status
        and MAY include additional implementation-specific warnings.
      </t>
    </section>

    <section anchor="schemas">
      <name>Wire Schemas</name>
      <t>
        AID-1 deployments SHOULD maintain versioned machine-readable schemas for
        at least the following object families:
      </t>
      <artwork><![CDATA[
schemas/
  developer-identity.v1.schema.json
  trusted-key-record.v1.schema.json
  signature-envelope.v1.schema.json
  delegation-credential.v1.schema.json
  authorization-snapshot.v1.schema.json
  provenance.v1.schema.json
  revocation-event.v1.schema.json
      ]]></artwork>
      <t>
        Schema validation is structural.  Cross-object trust and policy
        constraints MUST be enforced by conformance logic and not assumed from
        schema validity alone.
      </t>
    </section>

    <section anchor="r5">
      <name>Explicit Downstream Admissibility Boundary</name>
      <t>
        AID-1 verifies identity, authority-related evidence, and provenance
        according to the policy applied by an AID-1 verifier.  It does not
        determine scientific truth or downstream scientific admissibility.
      </t>
      <t>
        The following conformance boundary is normative and is referred to as
        replay case R5 by the companion AID-1 conformance specification:
      </t>
      <artwork><![CDATA[
R5

AID-1 verification: VALID
Downstream D6 admissibility: REJECT
      ]]></artwork>
      <t>
        An AID-1 implementation MUST NOT infer downstream scientific
        admissibility solely from successful AID-1 verification.  A downstream
        admissibility system MUST remain free to reject evidence that is
        structurally and cryptographically valid under AID-1.
      </t>
    </section>

    <section anchor="states">
      <name>Operational State and Authorization</name>
      <t>
        Operational state MAY constrain authorization, but state alone MUST NOT
        be treated as a complete permission decision.  A reference state matrix
        is:
      </t>
      <table>
        <name>Reference State Matrix</name>
        <thead>
          <tr>
            <th>State</th><th>Effect</th>
          </tr>
        </thead>
        <tbody>
          <tr><td>SAFE</td><td>Policy-dependent.</td></tr>
          <tr><td>QUIESCING</td><td>No new work or delegation; restricted modification; evidence reads allowed by policy.</td></tr>
          <tr><td>ISOLATED</td><td>No execute, delegate, modify, or publish; restricted evidence access.</td></tr>
          <tr><td>FORENSIC</td><td>No action; evidence access limited to authorized investigators.</td></tr>
          <tr><td>DENY_NEW</td><td>No new work, delegations, or changes; evidence access policy-dependent.</td></tr>
          <tr><td>REVOKED</td><td>No action; audit-only access.</td></tr>
        </tbody>
      </table>
    </section>

    <section anchor="security">
      <name>Security Considerations</name>
      <t>
        The principal security risk addressed by AID-1 is trust-domain collapse:
        treating one valid signal, especially a cryptographic signature, as
        sufficient proof of identity, authority, execution environment,
        provenance, or semantic correctness.
      </t>
      <t>
        Implementations MUST defend against key substitution, confused-deputy
        attacks, audience confusion, cross-resource replay, delegation
        escalation, stale credentials, forged attestations, invalid temporal
        data, unavailable revocation infrastructure, and artifact mutation.
      </t>
      <t>
        Implementations SHOULD use constant-time comparison primitives for
        security-sensitive digest comparisons where applicable.
      </t>
      <t>
        Audit systems SHOULD be append-only or cryptographically chained so that
        deletion, reordering, and mutation can be detected.
      </t>
    </section>

    <section anchor="privacy">
      <name>Privacy Considerations</name>
      <t>
        AID-1 may carry identifiers, repository information, workflow context,
        public keys, delegation relationships, execution metadata, and
        provenance links.  These can enable correlation across systems.
      </t>
      <t>
        Implementations SHOULD minimize collected identity and network context,
        SHOULD avoid embedding unnecessary personal information, SHOULD apply
        data-retention limits, and SHOULD separate public provenance evidence
        from sensitive operational metadata.
      </t>
      <t>
        Pseudonymous identifiers MAY be used when policy does not require
        disclosure of a civil identity, provided that trusted binding and
        revocation requirements remain enforceable.
      </t>
    </section>

    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>
        This document requests no IANA actions at this time.
      </t>
      <t>
        Future revisions may define registries for AID-1 algorithms, claim
        sources, failure codes, schema identifiers, or attestation types if
        interoperability experience demonstrates that shared registries are
        required.
      </t>
    </section>

    <section anchor="conformance">
      <name>Conformance</name>
      <t>
        Implementations claiming AID-1 conformance MUST preserve the trust-domain
        boundaries, decision semantics, external key-resolution rule, fail-closed
        or indeterminate handling of unavailable required trust services, and
        the downstream admissibility boundary defined in this document.
      </t>
      <t>
        Provider-independent conformance vectors and the reference execution
        model are defined in the companion document
        "AID-1 Provider-Independent Conformance Requirements".
      </t>
    </section>

    <section anchor="future">
      <name>Implementation Independence</name>
      <t>
        AID-1 does not mandate TPM, TEE, HSM, secure enclave, or software-only
        key storage.  Implementations MAY use such technologies, but provider
        conformance is determined by externally observable AID-1 behavior rather
        than implementation mechanism.
      </t>
    </section>

    <section anchor="acks">
      <name>Acknowledgements</name>
      <t>
        This document reflects an architecture developed to keep identity,
        authority, action evidence, attestation, provenance, governance, and
        downstream admissibility as independently testable trust domains.
      </t>
    </section>
  </middle>

  <back>
    <references>
      <name>Normative References</name>
      <reference anchor="RFC2119" target="https://www.rfc-editor.org/rfc/rfc2119">
        <front>
          <title>Key words for use in RFCs to Indicate Requirement Levels</title>
          <author initials="S." surname="Bradner" fullname="Scott Bradner"/>
          <date year="1997" month="March"/>
        </front>
        <seriesInfo name="RFC" value="2119"/>
        <seriesInfo name="BCP" value="14"/>
      </reference>
      <reference anchor="RFC8174" target="https://www.rfc-editor.org/rfc/rfc8174">
        <front>
          <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
          <author initials="B." surname="Leiba" fullname="Barry Leiba"/>
          <date year="2017" month="May"/>
        </front>
        <seriesInfo name="RFC" value="8174"/>
        <seriesInfo name="BCP" value="14"/>
      </reference>
      <reference anchor="RFC8785" target="https://www.rfc-editor.org/rfc/rfc8785">
        <front>
          <title>JSON Canonicalization Scheme (JCS)</title>
          <author initials="A." surname="Rundgren" fullname="Anders Rundgren"/>
          <author initials="B." surname="Jordan" fullname="Bryan Jordan"/>
          <author initials="S." surname="Erdtman" fullname="Samuel Erdtman"/>
          <date year="2020" month="June"/>
        </front>
        <seriesInfo name="RFC" value="8785"/>
      </reference>
      <reference anchor="RFC8032" target="https://www.rfc-editor.org/rfc/rfc8032">
        <front>
          <title>Edwards-Curve Digital Signature Algorithm (EdDSA)</title>
          <author initials="S." surname="Josefsson" fullname="Simon Josefsson"/>
          <author initials="I." surname="Liusvaara" fullname="Ilari Liusvaara"/>
          <date year="2017" month="January"/>
        </front>
        <seriesInfo name="RFC" value="8032"/>
      </reference>
    </references>
  </back>
</rfc>
