<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!--
  Internet-Draft: draft-kamimura-scitt-refusal-events-04
  Title: Verifiable AI Refusal Events using SCITT
  Author: TOKACHI KAMIMURA
  Organization: VeritasChain Standards Organization (VSO)
  Target WG: SCITT (Supply Chain Integrity, Transparency, and Trust)

  Revision Notes (-03):
  - Normative reference updated: SCITT Architecture is now RFC 9943
    (published June 2026); [I-D.ietf-scitt-architecture] replaced
    throughout. This removes a normative downref to a work in progress.
  - All bibliographic references inlined; no external XInclude fetches.
  - Added Section 1.x "Relationship to Other Work" positioning this
    document against draft-sabey-refusal-transparency and the VAP
    profile family.
  - Removed a deployment suggestion referring to distributed ledgers;
    anchoring guidance now names only independent time-stamp
    authorities and transparency services.
  - SCRAPI reference updated to the current revision.

  Revision Notes (-02):
  - MAJOR: Restructured as encoding-agnostic claim set specification
  - Removed JSON payload definitions from normative text
  - Added CDDL definitions for CBOR-based claim representation
  - Removed Bronze/Silver/Gold conformance tiers; single baseline with BCP14
  - Moved Evidence Pack to non-normative appendix
  - Moved JSON examples to non-normative appendix
  - Added Deployment Considerations appendix (former tier guidance)
  - Clarified SCITT charter alignment: this defines claim semantics,
    not payload format; encoding is deployment choice
  - Streamlined chapter structure for claim-set readability
  - Added IANA registry considerations for claim keys and event types

  Changes from -01:
  - Grok incident and regulatory context retained in Introduction
  - Completeness Invariant retained as core requirement
  - Risk taxonomy retained as non-normative appendix
  - CAP-SRP alignment maintained in terminology
-->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     docName="draft-kamimura-scitt-refusal-events-04"
     category="info"
     ipr="trust200902"
     version="3">

  <front>
    <title abbrev="SCITT-Refusal-Events">
      Verifiable AI Refusal Events using SCITT
    </title>

    <seriesInfo name="Internet-Draft"
                value="draft-kamimura-scitt-refusal-events-04"/>

    <author fullname="TOKACHI KAMIMURA" initials="T." surname="Kamimura">
      <organization>VeritasChain Standards Organization</organization>
      <address>
        <postal>
          <country>Japan</country>
        </postal>
        <email>standards@veritaschain.org</email>
        <uri>https://veritaschain.org</uri>
      </address>
    </author>

    <date year="2026" month="October" day="24"/>

    <area>Security</area>
    <workgroup>Supply Chain Integrity, Transparency, and Trust</workgroup>

    <keyword>SCITT</keyword>
    <keyword>AI safety</keyword>
    <keyword>refusal events</keyword>
    <keyword>transparency service</keyword>
    <keyword>audit trail</keyword>
    <keyword>claim set</keyword>
    <keyword>CDDL</keyword>

    <abstract>
      <t>This document defines a claim set for recording AI content
      refusal events. The claim set specifies the semantic content
      and correlation rules for refusal audit trails, independent of
      any particular serialization format. The claims are designed
      to be carried within SCITT Signed Statements and verified using
      SCITT Receipts.</t>

      <t>This specification addresses claim semantics and verification
      requirements; it does not mandate a specific encoding. A CDDL
      definition is provided for CBOR-based implementations, and
      equivalent JSON representations are shown in an appendix for
      illustration.</t>

      <t>This specification provides auditability of logged refusal
      decisions. It does not define content moderation policies,
      classification criteria, or what AI systems should refuse.</t>
    </abstract>

    <note removeInRFC="true">
      <name>About This Document</name>
      <t>The latest version of this document, along with implementation
      resources and examples, can be found at
      &lt;https://github.com/veritaschain/cap-spec&gt;.</t>
      <t>Discussion of this document takes place on the SCITT Working
      Group mailing list (scitt@ietf.org).</t>
    </note>
  </front>

  <middle>
    <!-- ===== Section 1: Introduction ===== -->
    <section anchor="introduction">
      <name>Introduction</name>

      <t>AI systems capable of generating content increasingly implement
      safety mechanisms to refuse requests deemed harmful, illegal, or
      policy-violating. However, these refusal decisions typically leave
      no verifiable audit trail. When a system refuses to generate content,
      the event vanishes--there is no receipt, no log entry accessible to
      external parties, and no mechanism for third-party verification.</t>

      <t>This document defines a claim set for recording such refusal
      events. The claim set specifies:</t>
      <ul>
        <li>The semantic meaning of each claim</li>
        <li>Correlation rules linking attempts to outcomes</li>
        <li>A completeness invariant for audit trail integrity</li>
        <li>Privacy-preserving approaches using cryptographic hashes</li>
      </ul>

      <t>The claims are designed to be carried within SCITT Signed
      Statements <xref target="RFC9943"/> and
      verified using SCITT Receipts. This document does not mandate
      a specific serialization; implementations may use CBOR, JSON,
      or other formats as appropriate for their deployment context.</t>

      <section anchor="motivation">
        <name>Motivation</name>
        <t>The January 2026 Grok incident demonstrated the need for
        verifiable refusal records. The AI system generated millions
        of harmful images while the provider claimed moderation systems
        were functioning. External parties had no mechanism to verify
        whether refusals actually occurred or whether claimed safeguards
        were enforced.</t>

        <t>This creates several problems:</t>
        <ul>
          <li>Regulators cannot independently verify that AI providers
          enforce stated policies</li>
          <li>Providers cannot prove to external auditors that specific
          requests were refused</li>
          <li>Third parties investigating incidents have no way to
          establish refusal without trusting provider claims</li>
        </ul>

        <t>SCITT provides the infrastructure--Signed Statements,
        Transparency Services, and Receipts--to address this gap.
        This document defines the claim semantics for AI refusal
        events that can be carried within that infrastructure.</t>
      </section>

      <section anchor="scope">
        <name>Scope</name>
        <t>This document defines:</t>
        <ul>
          <li>A claim set for ATTEMPT and Outcome events</li>
          <li>Semantic definitions for each claim</li>
          <li>A completeness invariant for correlation</li>
          <li>A CDDL grammar for CBOR representation</li>
          <li>Integration guidance for SCITT Transparency Services</li>
        </ul>

        <t>This document does NOT define:</t>
        <ul>
          <li>Content moderation policies</li>
          <li>Classification algorithms or risk scoring</li>
          <li>Mandatory serialization formats</li>
          <li>Transparency Service behavior beyond standard SCITT</li>
          <li>Regulatory compliance requirements</li>
        </ul>

        <t>This specification is an application profile for SCITT,
        defining domain-specific claim semantics. It does not extend
        or modify SCITT architecture.</t>
      </section>

      <section anchor="limitations">
        <name>Limitations</name>
        <t>This specification provides auditability of refusal decisions
        that are logged, not cryptographic proof that no unlogged
        generation occurred. An AI system that bypasses logging entirely
        cannot be detected by this mechanism alone.</t>

        <t>Transparency Services do not enforce the completeness
        invariant defined in this document; such checks are performed
        by verifiers at the application level using the claim semantics
        defined herein.</t>
      </section>

      <section anchor="related-work">
        <name>Relationship to Other Work</name>
        <t>This document defines claim semantics for the refusal of a
        content generation request. It is scoped to what an AI system
        declined to produce and to the correlation between a request and
        its outcome. It does not define transition semantics for
        agentic systems; <xref target="I-D.sabey-refusal-transparency"/>
        addresses refused agent-system transitions and replay resistance,
        and is complementary to the work here. Deployments concerned with
        both surfaces may record claim sets under both specifications;
        this document does not define a mapping between them.</t>

        <t>This claim set specifies the refusal-event mechanism of the
        Content / Creative AI Profile (CAP) within the Verifiable AI
        Provenance Framework <xref target="I-D.kamimura-vap-framework"/>,
        an architectural framework for making processing records
        tamper-evident, completeness-checkable, and attributable after
        the fact. The framework does not warrant the correctness,
        fairness, or safety of the underlying AI decisions; it concerns
        only the integrity, completeness at anchor granularity, and
        attributability of their records. The same limit applies to this
        document: recording a refusal establishes that a refusal was
        claimed and when, not that the refusal was correct.</t>

        <t>The Evidence Pack format referenced in
        <xref target="appendix-evidence-pack"/> is defined by CAP-SRP
        <xref target="CAP-SRP"/>, a companion specification for content
        and creative AI applications.</t>
      </section>

      <section anchor="changes-from-03">
        <name>Changes from draft-kamimura-scitt-refusal-events-03</name>
        <t>No claim names, CDDL definitions, correlation rules, or completeness
        invariant semantics were changed; -03 claim sets remain valid under
        this revision.</t>
        <ul>
          <li>Replaced the statement that creating ATTEMPT before evaluation
          "prevents" selective logging with a description of what it makes
          detectable, consistent with <xref target="limitations"/>.</li>
          <li>Distinguished the ATTEMPT/Outcome invariant from batch
          completeness after anchoring.</li>
          <li>Reworded the Omission Attacks, threat model, registration
          timing and Regulated Deployment text so that it claims neither
          prevention, guarantees, nor regulatory compliance.</li>
          <li>Stated that this claim set is the refusal-event mechanism of
          CAP within VAP.</li>
          <li>Added an Implementation Status section
          (<xref target="implementation-status"/>).</li>
        </ul>
      </section>

      <section anchor="changes-from-02">
        <name>Changes from draft-kamimura-scitt-refusal-events-02</name>
        <t>The SCITT architecture was published as
        <xref target="RFC9943"/> in June 2026. References to the
        superseded Internet-Draft have been replaced throughout, which
        removes a normative reference to a work in progress. No claim
        names, CDDL definitions, correlation rules, or completeness
        invariant semantics were changed; -02 claim sets remain valid
        under this revision.</t>
        <t>This revision also adds
        <xref target="related-work"/>, updates the SCITT Reference APIs
        citation to its current revision, and revises one non-normative
        deployment suggestion in
        <xref target="appendix-deployment"/>.</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>
      </section>
    </section>

    <!-- ===== Section 2: Terminology ===== -->
    <section anchor="terminology">
      <name>Terminology</name>

      <t>This document uses terminology from
      <xref target="RFC9943"/>. The following
      terms are specific to this specification:</t>

      <dl>
        <dt>Generation Request</dt>
        <dd>A request submitted to an AI system to produce content.</dd>

        <dt>Refusal Event</dt>
        <dd>A decision by an AI system to decline a generation request.</dd>

        <dt>ATTEMPT</dt>
        <dd>A claim set recording that a generation request was received.</dd>

        <dt>DENY</dt>
        <dd>A claim set recording that a generation request was refused.
        References the corresponding ATTEMPT.</dd>

        <dt>GENERATE</dt>
        <dd>A claim set recording successful content generation.
        References the corresponding ATTEMPT.</dd>

        <dt>ERROR</dt>
        <dd>A claim set recording system failure during processing.
        References the corresponding ATTEMPT.</dd>

        <dt>Outcome</dt>
        <dd>Any of DENY, GENERATE, or ERROR.</dd>

        <dt>Completeness Invariant</dt>
        <dd>The property that every logged ATTEMPT has exactly one
        corresponding Outcome.</dd>

        <dt>Verifiable Refusal Record</dt>
        <dd>An ATTEMPT claim set, a DENY claim set, and Receipts
        proving their registration with a Transparency Service.</dd>
      </dl>

      <section anchor="scitt-mapping">
        <name>Mapping to SCITT</name>
        <t>This specification maps directly to SCITT primitives:</t>

        <table>
          <thead>
            <tr>
              <th>This Document</th>
              <th>SCITT Primitive</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>ATTEMPT claim set</td>
              <td>Signed Statement payload</td>
            </tr>
            <tr>
              <td>Outcome claim set</td>
              <td>Signed Statement payload</td>
            </tr>
            <tr>
              <td>AI System</td>
              <td>Issuer</td>
            </tr>
            <tr>
              <td>Inclusion proof</td>
              <td>Receipt</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>

    <!-- ===== Section 3: Claim Set Definition ===== -->
    <section anchor="claim-set">
      <name>Claim Set Definition</name>

      <t>This section defines the claims for refusal events. Claims
      are specified by their semantic meaning; encoding is
      deployment-specific. <xref target="cddl"/> provides a CDDL
      grammar for CBOR representation.</t>

      <section anchor="claim-common">
        <name>Common Claims</name>
        <t>The following claims appear in all event types:</t>

        <dl>
          <dt>event-type (REQUIRED)</dt>
          <dd>One of: "ATTEMPT", "DENY", "GENERATE", "ERROR".
          Identifies the event category.</dd>

          <dt>event-id (REQUIRED)</dt>
          <dd>Unique identifier for this event. UUIDv7
          <xref target="RFC9562"/> is RECOMMENDED for temporal ordering.</dd>

          <dt>timestamp (REQUIRED)</dt>
          <dd>Time of event occurrence. In CBOR, MUST be either
          tag 0 (RFC 3339 date-time string) or tag 1 (epoch-based
          integer/float). Untagged integers representing Unix epoch
          seconds are also permitted.</dd>

          <dt>issuer (REQUIRED)</dt>
          <dd>Identifier of the AI system that created this event.
          SHOULD be a URI.</dd>
        </dl>
      </section>

      <section anchor="claim-attempt">
        <name>ATTEMPT Claims</name>
        <t>An ATTEMPT records receipt of a generation request. It
        MUST be created before any safety evaluation begins.</t>

        <dl>
          <dt>prompt-hash (REQUIRED)</dt>
          <dd>Cryptographic hash of the prompt content. MUST use
          SHA-256 or stronger. The original prompt MUST NOT be stored.</dd>

          <dt>input-type (REQUIRED)</dt>
          <dd>Type of input: "text", "image", "text+image", "audio",
          "video", or "multimodal".</dd>

          <dt>reference-input-hashes (OPTIONAL)</dt>
          <dd>Array of hashes for non-text inputs (images, audio, etc.).</dd>

          <dt>session-id (OPTIONAL)</dt>
          <dd>Session identifier for correlation across requests.</dd>

          <dt>actor-hash (OPTIONAL)</dt>
          <dd>Pseudonymized hash of the requesting entity.</dd>

          <dt>model-id (OPTIONAL)</dt>
          <dd>Identifier of the AI model processing the request.</dd>

          <dt>policy-id (OPTIONAL)</dt>
          <dd>Identifier of the content policy being applied.</dd>
        </dl>

        <t>The requirement to create ATTEMPT before safety evaluation makes
        selective logging, where only "safe" requests are recorded, detectable
        among registered ATTEMPTs: an ATTEMPT without an Outcome is visible
        to a verifier.  It does not reveal requests for which no ATTEMPT was
        registered (<xref target="limitations"/>).</t>
      </section>

      <section anchor="claim-deny">
        <name>DENY Claims</name>
        <t>A DENY records refusal of a generation request.</t>

        <dl>
          <dt>attempt-id (REQUIRED)</dt>
          <dd>The event-id of the corresponding ATTEMPT. This
          establishes the correlation required by the completeness
          invariant.</dd>

          <dt>risk-category (OPTIONAL)</dt>
          <dd>Category of policy violation. Values are
          deployment-specific; <xref target="appendix-risk"/> provides
          a non-normative taxonomy.</dd>

          <dt>risk-score (OPTIONAL)</dt>
          <dd>Confidence score, 0.0 to 1.0.</dd>

          <dt>refusal-reason (OPTIONAL)</dt>
          <dd>Human-readable reason. SHOULD NOT contain prompt content.</dd>

          <dt>human-override (OPTIONAL)</dt>
          <dd>Boolean indicating human reviewer involvement.</dd>
        </dl>
      </section>

      <section anchor="claim-generate">
        <name>GENERATE Claims</name>
        <t>A GENERATE records successful content generation.</t>

        <dl>
          <dt>attempt-id (REQUIRED)</dt>
          <dd>The event-id of the corresponding ATTEMPT.</dd>

          <dt>output-hash (OPTIONAL)</dt>
          <dd>Hash of the generated content, for correlation with
          downstream provenance (e.g., C2PA manifests).</dd>
        </dl>
      </section>

      <section anchor="claim-error">
        <name>ERROR Claims</name>
        <t>An ERROR records system failure, not a policy decision.</t>

        <dl>
          <dt>attempt-id (REQUIRED)</dt>
          <dd>The event-id of the corresponding ATTEMPT.</dd>

          <dt>error-code (OPTIONAL)</dt>
          <dd>Machine-readable error identifier.</dd>

          <dt>error-message (OPTIONAL)</dt>
          <dd>Human-readable error description.</dd>
        </dl>

        <t>ERROR does not indicate policy enforcement. A high ERROR
        rate may indicate operational issues or adversarial inputs.</t>
      </section>

      <section anchor="completeness">
        <name>Completeness Invariant</name>
        <t>The completeness invariant is the core integrity property:</t>

        <t>For every ATTEMPT with event-id A that is registered with
        a Transparency Service, there MUST exist exactly one Outcome
        (DENY, GENERATE, or ERROR) with attempt-id equal to A.</t>

        <t>Formally:</t>
        <artwork><![CDATA[
  |{ATTEMPT}| = |{DENY}| + |{GENERATE}| + |{ERROR}|
]]></artwork>

        <t>where each Outcome references exactly one ATTEMPT, and no
        ATTEMPT is referenced by multiple Outcomes.</t>

        <t>Violations indicate:</t>
        <ul>
          <li>ATTEMPT without Outcome: incomplete logging or in-progress
          request</li>
          <li>Outcome without ATTEMPT: fabricated outcome or logging
          failure</li>
          <li>Multiple Outcomes per ATTEMPT: data integrity failure</li>
        </ul>

        <t>Verifiers SHOULD check this invariant when auditing event
        streams. Transparency Services do not enforce this invariant;
        it is an application-level semantic constraint.</t>

        <t>This invariant concerns the correspondence between registered
        ATTEMPTs and Outcomes.  It is distinct from batch completeness after
        anchoring in the VAP framework <xref target="I-D.kamimura-vap-framework"/>:
        removing an ATTEMPT together with its
        Outcome preserves the invariant.  Detecting such a removal requires a
        commitment to the set of registered statements, such as the
        Transparency Service's log or an anchored batch with a bound event
        count.</t>
      </section>

      <section anchor="claim-timing">
        <name>Timing Requirements</name>
        <t>To maintain audit trail integrity:</t>
        <ul>
          <li>ATTEMPT MUST be created before safety evaluation begins</li>
          <li>Outcome SHOULD be created promptly after decision</li>
          <li>Outcome timestamp MUST be greater than or equal to
          ATTEMPT timestamp</li>
        </ul>

        <t>Some scenarios require delayed outcomes (human review,
        system recovery). Implementations SHOULD document expected
        latency bounds.</t>
      </section>
    </section>

    <!-- ===== Section 4: CDDL Definition ===== -->
    <section anchor="cddl">
      <name>CDDL Definition</name>

      <t>This section provides a CDDL <xref target="RFC8610"/> grammar
      for CBOR-based representation of the claim set. This grammar is
      RECOMMENDED for implementations using CBOR encoding within SCITT
      Signed Statements.</t>

      <t>Implementations using other encodings (e.g., JSON) SHOULD
      maintain semantic equivalence with this definition.</t>

      <sourcecode type="cddl"><![CDATA[
; Refusal Event Claim Set
; draft-kamimura-scitt-refusal-events-03

refusal-event = attempt-event / outcome-event

; Common claims (appear in all events)
common-claims = (
  event-type: event-type-value,
  event-id: uuid,
  timestamp: time,
  issuer: tstr
)

event-type-value = "ATTEMPT" / "DENY" / "GENERATE" / "ERROR"

; ATTEMPT event
attempt-event = {
  common-claims,
  prompt-hash: hash-value,
  input-type: input-type-value,
  ? reference-input-hashes: [+ hash-value],
  ? session-id: uuid,
  ? actor-hash: hash-value,
  ? model-id: tstr,
  ? policy-id: tstr,
  * tstr => any   ; extension point
}

input-type-value = "text" / "image" / "text+image" /
                   "audio" / "video" / "multimodal"

; Outcome events
outcome-event = deny-event / generate-event / error-event

deny-event = {
  common-claims,
  attempt-id: uuid,
  ? risk-category: tstr,
  ? risk-score: float16 .le 1.0,
  ? refusal-reason: tstr,
  ? human-override: bool,
  * tstr => any
}

generate-event = {
  common-claims,
  attempt-id: uuid,
  ? output-hash: hash-value,
  * tstr => any
}

error-event = {
  common-claims,
  attempt-id: uuid,
  ? error-code: tstr,
  ? error-message: tstr,
  * tstr => any
}

; Supporting types
uuid = bstr .size 16 / tstr       ; binary or string representation
hash-value = bstr / tstr          ; raw bytes or prefixed string
time = #6.0(tstr) / #6.1(number) / uint  ; tag 0 (date-time string),
                                         ; tag 1 (epoch), or raw uint
]]></sourcecode>

      <t>Notes on the CDDL definition:</t>
      <ul>
        <li>Extension points (* tstr => any) allow deployment-specific
        claims without breaking interoperability</li>
        <li>UUID may be binary (16 bytes) or string (RFC 9562 format)</li>
        <li>Hash values may be raw bytes or prefixed strings
        (e.g., "sha256:...")</li>
        <li>Timestamps support CBOR tag 0 (RFC 3339 date-time string),
        tag 1 (epoch-based number), or untagged epoch seconds</li>
      </ul>

      <t>The claim names defined in this specification (e.g., "event-type",
      "prompt-hash") represent semantic labels. Implementations MAY use
      alternative key representations (such as short integer labels for
      CBOR efficiency) provided the semantic meaning is preserved and
      documented.</t>
    </section>

    <!-- ===== Section 5: SCITT Integration ===== -->
    <section anchor="scitt-integration">
      <name>SCITT Integration</name>

      <t>This section describes how refusal event claim sets integrate
      with SCITT infrastructure.</t>

      <section anchor="scitt-encoding">
        <name>Encoding as Signed Statements</name>
        <t>A refusal event claim set is carried as the payload of a
        SCITT Signed Statement:</t>
        <ul>
          <li>The claim set is serialized (CBOR RECOMMENDED)</li>
          <li>The serialized bytes become the COSE_Sign1
          <xref target="RFC9052"/> payload</li>
          <li>The Issuer is the AI system's signing identity</li>
          <li>Content-Type SHOULD indicate the claim set format</li>
        </ul>

        <t>For CBOR-encoded claim sets, the Content-Type
        "application/cbor" or a more specific media type MAY be used.</t>
      </section>

      <section anchor="scitt-registration">
        <name>Registration</name>
        <t>After creating a Signed Statement, the Issuer SHOULD
        register it with a SCITT Transparency Service via SCRAPI
        <xref target="I-D.ietf-scitt-scrapi"/>.</t>

        <t>The Transparency Service returns a Receipt proving
        inclusion. Issuers SHOULD store Receipts for future
        verification requests.</t>

        <t>Registration timing affects audit trail integrity:</t>
        <ul>
          <li>Prompt registration provides stronger temporal assurance</li>
          <li>Batched registration may be acceptable for
          non-time-critical audits</li>
        </ul>
      </section>

      <section anchor="scitt-verification">
        <name>Verification</name>
        <t>A Verifiable Refusal Record consists of:</t>
        <ol>
          <li>ATTEMPT Signed Statement and Receipt</li>
          <li>DENY Signed Statement and Receipt</li>
          <li>Verification that attempt-id in DENY equals event-id
          in ATTEMPT</li>
        </ol>

        <t>Verifiers confirm:</t>
        <ul>
          <li>Both Receipts are valid for the Transparency Service</li>
          <li>Both Signed Statements have valid Issuer signatures</li>
          <li>The attempt-id correlation is correct</li>
          <li>Timestamps are consistent (Outcome >= ATTEMPT)</li>
        </ul>

        <t>This demonstrates that a refusal was logged. It does not
        prove that no unlogged generation occurred.</t>
      </section>

      <section anchor="scitt-policy">
        <name>Registration Policy Considerations</name>
        <t>A Transparency Service MAY apply a Registration Policy
        that validates:</t>
        <ul>
          <li>Required claims are present</li>
          <li>Timestamp is within acceptable bounds</li>
          <li>Issuer is authorized (if restricted)</li>
        </ul>

        <t>Transparency Services SHOULD NOT attempt to enforce the
        completeness invariant; this is an application-level
        verification performed by auditors.</t>
      </section>
    </section>

    <!-- ===== Section 6: IANA Considerations ===== -->
    <section anchor="implementation-status">
      <name>Implementation Status</name>
      <t>Note to the RFC Editor: please remove this section before
      publication.</t>
      <t>This section records the status of known implementations at the
      time of posting, following <xref target="RFC7942"/>.  The listing of
      any individual implementation here does not imply endorsement by the
      IETF, and the information presented here has not been verified by the
      IETF.  Other implementations may exist.</t>
      <ul>
        <li>There are no known external implementations of these claim sets
        or of CAP-SRP.</li>
        <li>VSO publishes a first-party proof-of-concept reference
        implementation of CAP Safe Refusal Provenance
        (https://github.com/veritaschain/cap-safe-refusal-provenance).  It
        has not been assessed against the claim sets of this document.</li>
        <li>No Evidence Pack containing these claim sets has been accepted in
        any regulatory, judicial, or audit proceeding.</li>
      </ul>
    </section>

    <section anchor="iana">
      <name>IANA Considerations</name>

      <t>This document has no IANA actions at this time.</t>

      <t>Future revisions may request:</t>
      <ul>
        <li>Registration of a media type for refusal event claim sets</li>
        <li>Establishment of a registry for event-type values</li>
        <li>Establishment of a registry for risk-category values</li>
      </ul>

      <t>The working group should consider whether standardized
      registries would benefit interoperability, or whether
      deployment-specific vocabularies are sufficient.</t>
    </section>

    <!-- ===== Section 7: Security Considerations ===== -->
    <section anchor="security">
      <name>Security Considerations</name>

      <section anchor="security-threat">
        <name>Threat Model</name>
        <t>This specification assumes:</t>
        <ul>
          <li>The AI system (Issuer) is partially trusted: expected to
          log events but may have bugs or be compromised</li>
          <li>The Transparency Service is partially trusted: expected to
          operate an append-only log but may be compromised</li>
          <li>Verifiers are trusted to perform completeness checks</li>
        </ul>

        <t>This specification does NOT protect against:</t>
        <ul>
          <li>An AI system that bypasses logging entirely</li>
          <li>Collusion between Issuer and Transparency Service</li>
        </ul>
      </section>

      <section anchor="security-omission">
        <name>Omission Attacks</name>
        <t>An adversary controlling the AI system might omit events
        to hide policy violations. The completeness invariant provides
        detection for logged events: auditors can identify ATTEMPTs
        without Outcomes.</t>

        <t>However, if an ATTEMPT is never logged, this specification
        cannot detect the omission.  Addressing such omissions requires
        external mechanisms (for example, trusted execution or attestation
        <xref target="RFC9334"/>) outside this specification's scope, and
        those mechanisms do not by themselves establish that every request
        was logged.</t>
      </section>

      <section anchor="security-equivocation">
        <name>Log Equivocation</name>
        <t>A malicious Transparency Service might present different
        views to different parties. Mitigations include:</t>
        <ul>
          <li>Gossiping of Signed Tree Heads between verifiers</li>
          <li>Registration with multiple Transparency Services</li>
          <li>External anchoring to public ledgers</li>
        </ul>
      </section>

      <section anchor="security-replay">
        <name>Replay Attacks</name>
        <t>Replay of old events is mitigated by:</t>
        <ul>
          <li>UUIDv7 temporal ordering</li>
          <li>Timestamp verification against registration time</li>
          <li>Receipt binding to specific log position</li>
        </ul>
      </section>

      <section anchor="security-dictionary">
        <name>Dictionary Attacks on Hashes</name>
        <t>An adversary with a dictionary of prompts could attempt
        to identify which prompt was used by hash comparison.
        Mitigations include:</t>
        <ul>
          <li>Access controls on event queries</li>
          <li>Rate limiting</li>
          <li>Time-limited retention</li>
        </ul>
      </section>
    </section>

    <!-- ===== Section 8: Privacy Considerations ===== -->
    <section anchor="privacy">
      <name>Privacy Considerations</name>

      <section anchor="privacy-content">
        <name>Harmful Content</name>
        <t>Refusal events may be triggered by harmful content. To
        prevent the audit log from becoming a repository of harmful
        content:</t>
        <ul>
          <li>prompt-hash stores only a hash, not the original</li>
          <li>refusal-reason SHOULD NOT quote prompt content</li>
          <li>Reference images are stored as hashes only</li>
        </ul>
      </section>

      <section anchor="privacy-actor">
        <name>Actor Privacy</name>
        <t>actor-hash provides pseudonymization. Implementations
        SHOULD:</t>
        <ul>
          <li>Use pseudonymous identifiers by default</li>
          <li>Maintain separate access-controlled identity mappings</li>
          <li>Support crypto-shredding for data deletion</li>
        </ul>
      </section>

      <section anchor="privacy-correlation">
        <name>Correlation Risks</name>
        <t>Event metadata may enable correlation attacks:</t>
        <ul>
          <li>Timestamps reveal activity patterns</li>
          <li>session-id links requests</li>
          <li>model-id reveals system usage</li>
        </ul>
        <t>Implementations SHOULD apply appropriate access controls.</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 initials="S." surname="Bradner" fullname="Scott Bradner"><organization/></author>
            <date year="1997" month="March"/>
          </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 initials="B." surname="Leiba" fullname="Barry Leiba"><organization/></author>
            <date year="2017" month="May"/>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC8610" target="https://www.rfc-editor.org/info/rfc8610">
          <front>
            <title>Concise Data Definition Language (CDDL): A Notational Convention to Express Concise Binary Object Representation (CBOR) and JSON Data Structures</title>
            <author initials="H." surname="Birkholz" fullname="Henk Birkholz"><organization/></author>
            <author initials="C." surname="Vigano" fullname="Christoph Vigano"><organization/></author>
            <author initials="C." surname="Bormann" fullname="Carsten Bormann"><organization/></author>
            <date year="2019" month="June"/>
          </front>
          <seriesInfo name="RFC" value="8610"/>
          <seriesInfo name="DOI" value="10.17487/RFC8610"/>
        </reference>
        <reference anchor="RFC9052" target="https://www.rfc-editor.org/info/rfc9052">
          <front>
            <title>CBOR Object Signing and Encryption (COSE): Structures and Process</title>
            <author initials="J." surname="Schaad" fullname="Jim Schaad"><organization/></author>
            <date year="2022" month="August"/>
          </front>
          <seriesInfo name="STD" value="96"/>
          <seriesInfo name="RFC" value="9052"/>
          <seriesInfo name="DOI" value="10.17487/RFC9052"/>
        </reference>
        <reference anchor="RFC9562" target="https://www.rfc-editor.org/info/rfc9562">
          <front>
            <title>Universally Unique IDentifiers (UUIDs)</title>
            <author initials="K." surname="Davis" fullname="Kyzer Davis"><organization/></author>
            <author initials="B." surname="Peabody" fullname="Brad Peabody"><organization/></author>
            <author initials="P." surname="Leach" fullname="Paul Leach"><organization/></author>
            <date year="2024" month="May"/>
          </front>
          <seriesInfo name="RFC" value="9562"/>
          <seriesInfo name="DOI" value="10.17487/RFC9562"/>
        </reference>

        <reference anchor="RFC9943" target="https://www.rfc-editor.org/info/rfc9943">
          <front>
            <title>An Architecture for Trustworthy and Transparent Digital Supply Chains</title>
            <author initials="H." surname="Birkholz" fullname="Henk Birkholz"><organization/></author>
            <author initials="A." surname="Delignat-Lavaud" fullname="Antoine Delignat-Lavaud"><organization/></author>
            <author initials="C." surname="Fournet" fullname="Cedric Fournet"><organization/></author>
            <author initials="Y." surname="Deshpande" fullname="Yogesh Deshpande"><organization/></author>
            <author initials="S." surname="Lasker" fullname="Steve Lasker"><organization/></author>
            <date year="2026" month="June"/>
          </front>
          <seriesInfo name="RFC" value="9943"/>
          <seriesInfo name="DOI" value="10.17487/RFC9943"/>
        </reference>

        <reference anchor="I-D.ietf-scitt-scrapi" target="https://datatracker.ietf.org/doc/html/draft-ietf-scitt-scrapi-11">
          <front>
            <title>Supply Chain Integrity, Transparency, and Trust (SCITT) Reference APIs</title>
            <author initials="O." surname="Steele" fullname="Orie Steele"><organization/></author>
            <date year="2026"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-scitt-scrapi-11"/>
        </reference>
      </references>

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

        <reference anchor="RFC6962" target="https://www.rfc-editor.org/info/rfc6962">
          <front>
            <title>Certificate Transparency</title>
            <author initials="B." surname="Laurie" fullname="Ben Laurie"><organization/></author>
            <author initials="A." surname="Langley" fullname="Adam Langley"><organization/></author>
            <author initials="E." surname="Kasper" fullname="Emilia Kasper"><organization/></author>
            <date year="2013" month="June"/>
          </front>
          <seriesInfo name="RFC" value="6962"/>
          <seriesInfo name="DOI" value="10.17487/RFC6962"/>
        </reference>
        <reference anchor="RFC9334" target="https://www.rfc-editor.org/info/rfc9334">
          <front>
            <title>Remote ATtestation procedureS (RATS) Architecture</title>
            <author initials="H." surname="Birkholz" fullname="Henk Birkholz"><organization/></author>
            <author initials="D." surname="Thaler" fullname="Dave Thaler"><organization/></author>
            <author initials="M." surname="Richardson" fullname="Michael Richardson"><organization/></author>
            <author initials="N." surname="Smith" fullname="Ned Smith"><organization/></author>
            <author initials="W." surname="Pan" fullname="Wei Pan"><organization/></author>
            <date year="2023" month="January"/>
          </front>
          <seriesInfo name="RFC" value="9334"/>
          <seriesInfo name="DOI" value="10.17487/RFC9334"/>
        </reference>
        <reference anchor="RFC7942" target="https://www.rfc-editor.org/info/rfc7942">
          <front>
            <title>Improving Awareness of Running Code: The Implementation Status Section</title>
            <author initials="Y." surname="Sheffer" fullname="Yaron Sheffer"><organization/></author>
            <author initials="A." surname="Farrel" fullname="Adrian Farrel"><organization/></author>
            <date year="2016" month="July"/>
          </front>
          <seriesInfo name="BCP" value="205"/>
          <seriesInfo name="RFC" value="7942"/>
          <seriesInfo name="DOI" value="10.17487/RFC7942"/>
        </reference>

        <reference anchor="I-D.sabey-refusal-transparency" target="https://datatracker.ietf.org/doc/html/draft-sabey-refusal-transparency">
          <front>
            <title>Refusal Transparency: Signed, Replay-Resistant Evidence of Refused Agent-System Transitions</title>
            <author initials="" surname="Sabey" fullname="Sabey"><organization/></author>
            <date year="2026"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-sabey-refusal-transparency"/>
        </reference>

        <reference anchor="I-D.kamimura-vap-framework" target="https://datatracker.ietf.org/doc/html/draft-kamimura-vap-framework">
          <front>
            <title>Verifiable AI Provenance Framework (VAP): An Architectural Framework for Auditable AI Decision Trails</title>
            <author initials="T." surname="Kamimura" fullname="Tokachi Kamimura"><organization/></author>
            <date year="2026"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-kamimura-vap-framework"/>
        </reference>

        <reference anchor="CAP-SRP">
          <front>
            <title>CAP-SRP: Content/Creative AI Profile - Safe Refusal Provenance</title>
            <author>
              <organization>VeritasChain Standards Organization</organization>
            </author>
            <date year="2026"/>
          </front>
          <refcontent>https://github.com/veritaschain/cap-spec</refcontent>
        </reference>
      </references>
    </references>

    <!-- ===== Appendix A: Risk Category Taxonomy ===== -->
    <section anchor="appendix-risk" numbered="true" toc="include">
      <name>Risk Category Taxonomy (Non-Normative)</name>

      <t>This appendix provides an example taxonomy for risk-category
      values. This taxonomy is non-normative; deployments MAY use
      different values appropriate to their context.</t>

      <table>
        <thead>
          <tr>
            <th>Category</th>
            <th>Description</th>
          </tr>
        </thead>
        <tbody>
          <tr><td>CSAM_RISK</td><td>Child sexual abuse material</td></tr>
          <tr><td>NCII_RISK</td><td>Non-consensual intimate imagery</td></tr>
          <tr><td>MINOR_SEXUALIZATION</td><td>Sexualization of minors</td></tr>
          <tr><td>REAL_PERSON_DEEPFAKE</td><td>Unauthorized realistic depiction</td></tr>
          <tr><td>VIOLENCE_EXTREME</td><td>Graphic violence</td></tr>
          <tr><td>HATE_CONTENT</td><td>Discriminatory content</td></tr>
          <tr><td>TERRORIST_CONTENT</td><td>Terrorism-related material</td></tr>
          <tr><td>SELF_HARM_PROMOTION</td><td>Self-harm encouragement</td></tr>
          <tr><td>COPYRIGHT_VIOLATION</td><td>Clear IP infringement</td></tr>
          <tr><td>COPYRIGHT_STYLE_MIMICRY</td><td>Artist style imitation</td></tr>
          <tr><td>OTHER</td><td>Other policy violations</td></tr>
        </tbody>
      </table>

      <t>A future revision may define an IANA registry for risk
      categories if interoperability requires standardized values.</t>
    </section>

    <!-- ===== Appendix B: Deployment Considerations ===== -->
    <section anchor="appendix-deployment" numbered="true" toc="include">
      <name>Deployment Considerations (Non-Normative)</name>

      <t>This appendix provides guidance for deployments with varying
      assurance requirements. These are not conformance tiers; all
      deployments MUST satisfy the normative requirements in
      <xref target="claim-set"/>.</t>

      <section anchor="deploy-basic">
        <name>Basic Deployment</name>
        <t>Suitable for voluntary transparency:</t>
        <ul>
          <li>Log ATTEMPT and Outcome events locally</li>
          <li>Register with Transparency Service periodically (daily)</li>
          <li>Retain events for 6+ months</li>
          <li>Provide Evidence Packs on request</li>
        </ul>
      </section>

      <section anchor="deploy-regulated">
        <name>Regulated Deployment</name>
        <t>For deployments subject to regulatory recordkeeping obligations
        (for example, logging obligations under the EU AI Act).  Following
        these practices does not by itself establish compliance with any
        regulation:</t>
        <ul>
          <li>Register events promptly (within minutes)</li>
          <li>Implement continuous completeness monitoring</li>
          <li>Retain events for 2+ years</li>
          <li>Provide programmatic audit API</li>
          <li>Document latency bounds and retention policies</li>
        </ul>
      </section>

      <section anchor="deploy-high-assurance">
        <name>High-Assurance Deployment</name>
        <t>Suitable for maximum accountability:</t>
        <ul>
          <li>Register events in real-time (within seconds)</li>
          <li>Use HSM for signing keys</li>
          <li>Register with multiple Transparency Services</li>
          <li>Anchor to multiple independent targets (e.g., additional
          RFC 3161 time-stamp authorities)</li>
          <li>Retain events for 5+ years</li>
          <li>Support 24-hour incident response</li>
        </ul>
      </section>
    </section>

    <!-- ===== Appendix C: JSON Representation ===== -->
    <section anchor="appendix-json" numbered="true" toc="include">
      <name>JSON Representation Example (Non-Normative)</name>

      <t>This appendix shows equivalent JSON representations of the
      claim sets defined in <xref target="claim-set"/>. These examples
      are for illustration; the normative definition is the CDDL in
      <xref target="cddl"/>.</t>

      <section anchor="json-attempt">
        <name>ATTEMPT Example</name>
        <sourcecode type="json"><![CDATA[
{
  "event-type": "ATTEMPT",
  "event-id": "019467a1-0001-7000-0000-000000000001",
  "timestamp": 1738159425,
  "issuer": "urn:example:ai-service:img-gen-prod",
  "prompt-hash": "sha256:7f83b1657ff1fc53b92dc18148a1d65d...",
  "input-type": "text+image",
  "reference-input-hashes": [
    "sha256:9f86d081884c7d659a2feaa0c55ad015..."
  ],
  "session-id": "019467a1-0001-7000-0000-000000000000",
  "actor-hash": "sha256:e3b0c44298fc1c149afbf4c8996fb924...",
  "model-id": "img-gen-v4.2.1",
  "policy-id": "content-safety-v2"
}
]]></sourcecode>
      </section>

      <section anchor="json-deny">
        <name>DENY Example</name>
        <sourcecode type="json"><![CDATA[
{
  "event-type": "DENY",
  "event-id": "019467a1-0001-7000-0000-000000000002",
  "timestamp": 1738159426,
  "issuer": "urn:example:ai-service:img-gen-prod",
  "attempt-id": "019467a1-0001-7000-0000-000000000001",
  "risk-category": "NCII_RISK",
  "risk-score": 0.94,
  "refusal-reason": "Content policy violation detected"
}
]]></sourcecode>
      </section>
    </section>

    <!-- ===== Appendix D: Evidence Pack ===== -->
    <section anchor="appendix-evidence-pack" numbered="true" toc="include">
      <name>Evidence Pack Format (Non-Normative)</name>

      <t>An Evidence Pack is a self-contained collection of events
      suitable for regulatory submission or third-party audit. This
      format is deployment-specific and not required for conformance.</t>

      <t>A typical Evidence Pack contains:</t>
      <ul>
        <li>Manifest with metadata and checksums</li>
        <li>Serialized events (CBOR or JSON Lines)</li>
        <li>Receipts from Transparency Services</li>
        <li>Completeness verification results</li>
        <li>Public keys for signature verification</li>
      </ul>

      <t>The CAP-SRP specification <xref target="CAP-SRP"/> defines
      a detailed Evidence Pack format for content AI applications.</t>
    </section>

    <!-- ===== Acknowledgements ===== -->
    <section anchor="acknowledgements" numbered="false">
      <name>Acknowledgements</name>
      <t>The authors thank the SCITT Working Group for feedback on
      earlier revisions, particularly regarding SCITT charter scope
      and the distinction between claim semantics and payload formats.</t>
      <t>This work builds upon transparency log concepts from
      Certificate Transparency <xref target="RFC6962"/> and the
      SCITT architecture.</t>
    </section>
  </back>
</rfc>
