<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- 
  Internet-Draft: draft-kamimura-scitt-refusal-events-02
  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 (-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-02"
     category="info"
     ipr="trust200902"
     submissionType="IETF"
     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-02"/>

    <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="January" day="30"/>

    <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="I-D.ietf-scitt-architecture"/> 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="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="I-D.ietf-scitt-architecture"/>. 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 
        prevents selective logging where only "safe" requests are recorded.</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>
      </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-02

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 guarantees</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="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: provides 
          append-only guarantees 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. Complete prevention requires 
        external mechanisms (trusted execution, attestation 
        <xref target="RFC9334"/>) outside this specification's scope.</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>
        
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8610.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9052.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9562.xml"/>
        
        <reference anchor="I-D.ietf-scitt-architecture">
          <front>
            <title>An Architecture for Trustworthy and Transparent Digital Supply Chains</title>
            <author fullname="Henk Birkholz"/>
            <author fullname="Antoine Delignat-Lavaud"/>
            <author fullname="Cedric Fournet"/>
            <date year="2025"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-scitt-architecture"/>
        </reference>
        
        <reference anchor="I-D.ietf-scitt-scrapi">
          <front>
            <title>SCITT Reference APIs</title>
            <author fullname="Orie Steele"/>
            <date year="2025"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-scitt-scrapi"/>
        </reference>
      </references>
      
      <references>
        <name>Informative References</name>
        
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6962.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9334.xml"/>
        
        <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>Suitable for regulatory compliance (e.g., EU AI Act):</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>Implement external anchoring (blockchain, multiple TSAs)</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>
