<?xml version='1.0' encoding='utf-8'?>
<rfc docName="draft-das-child-safe-rendering-finality-00" category="info" ipr="trust200902" submissionType="IETF" version="3" tocInclude="true" tocDepth="3">
  <front>
    <title abbrev="Child-Safe Rendering Finality">Preventing Unauthorized Adult and Age-Restricted Content Rendering to Children Through Hardware-Rooted Execution Finality</title>
    <seriesInfo name="Internet-Draft" value="draft-das-child-safe-rendering-finality-00" />
    <author fullname="Sangam Das" initials="S." surname="Das">
      <organization>Independent Inventor</organization>
      <address><postal><city>Balasore</city><region>Odisha</region><code>756001</code><country>India</country></postal><email>info@sangamdas.com</email></address>
    </author>
    <date year="2026" month="August" day="26" />
    <abstract>
      <t>Online child-safety controls commonly operate before the final rendering boundary.  Platforms may use account-age flags, parental settings, content labels, recommender controls, server-side classification, age-assurance systems, access policies, or application filters to decide whether adult or age-restricted content should be available to a user.  Those controls are important, but an upstream decision does not by itself guarantee that the content cannot later be decrypted, decoded, composited, rendered, forwarded, mirrored, or otherwise materialized through another software or device path.</t>
      <t>This problem is becoming more important as content delivery becomes more distributed, encrypted, AI-mediated, personalized, and dynamically generated.  A modern device may receive content through applications, browsers, content-delivery networks, embedded web views, messaging clients, recommendation systems, generative-AI services, caches, cloud gaming or streaming pipelines, local AI models, or third-party SDKs.  The security question is therefore no longer only whether content was classified or whether an age check occurred upstream.  A later question must also be answered: is this specific protected content authorized to become perceptible to this recipient, on this device, under the current eligibility, policy, and revocation state, at this moment?</t>
      <t>This document defines a protected rendering execution-finality architecture for adult, pornographic, sexually explicit, violent, gambling-related, or otherwise age-restricted content.  A proposed rendering is represented as a Restricted Content Candidate Act and remains in a Non-Renderable State until a Protected Enforcement Domain validates the applicable recipient, content, device, policy, age-or-eligibility, freshness, revocation, and sink predicates.  Protected validation evidence is committed before, or atomically with, release of scoped non-bearer Rendering Finality Authority.</t>
      <t>A Protected Rendering Finality Sink independently verifies that authority immediately before the content becomes perceptible.  Depending on the implementation, the sink may control content-key release, decryption, media-decoder enablement, GPU or compositor access, protected-surface creation, audio output, casting, screen mirroring, display enablement, or an equivalent materialization boundary.  Content bytes may therefore be delivered to a device while remaining technically non-renderable.</t>
      <t>The architecture deliberately does not define a universal age-estimation algorithm, identity system, or content-classification scheme.  Those mechanisms may supply inputs to the Protected Enforcement Domain.  This document defines the consequence-control step that prevents an upstream policy result from becoming merely advisory at the point of rendering.</t>
      <t>UNICEF has warned that pornographic content can harm children and that digital restrictions have not kept pace with technological shifts.  The ITU Child Online Protection programme provides global guidance for safer digital environments, and the United Nations Committee on the Rights of the Child has called for protection of children from harmful content and online risks in the digital environment.  The European Commission has likewise adopted protection-of-minors guidance and a privacy-preserving age-verification approach for adult-restricted content.  These materials motivate the problem addressed here; they do not endorse this particular technical architecture.</t>
      <t>The central protocol principle is: permission to deliver content is not permission to render it.</t>
    </abstract>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>Child-safety systems frequently make policy decisions far from the point at which content becomes visible or audible.  A server may classify content as adult-only.  An account system may determine that a user is under an applicable age threshold.  A parental-control service may deny a content category.  A platform may enforce a regional policy.  Yet the media pipeline may contain many later components: encrypted transport, local cache, decoder, GPU, compositor, protected surface, display controller, speaker path, casting interface, or screen-mirroring function.</t>
      <t>The execution-finality model treats the final materialization of restricted content as a separate consequence.  The relevant security property is not merely that a policy engine produced DENY.  The property is that the protected content cannot become perceptible unless the final rendering boundary verifies current, act-specific authority.</t>
      <t>The narrow scope of this document is adult and age-restricted content rendering.  It does not attempt to standardize child identity, parental consent, age estimation, content moderation, recommender algorithms, or the legal definition of harmful content across jurisdictions.</t>
    </section>
    <section anchor="why-this-is-required-now">
      <name>Why This Is Required Now</name>
      <t>The technical need has intensified because content is no longer delivered through a single predictable application path.  Streaming platforms, browsers, encrypted media pipelines, social applications, short-video feeds, generative AI, multimodal assistants, local models, cloud rendering, game engines, mixed-reality systems, and third-party SDKs can all participate in content selection and materialization.</t>
      <t>AI also changes the scale and dynamism of the problem.  A system can generate or transform sexually explicit or otherwise adult material on demand, select content based on inferred interests, synthesize new variants that were never pre-classified as static files, or route a user through multiple content sources.  An upstream catalogue label alone is therefore less reliable as the sole technical enforcement point.</t>
      <t>This document does not assert that child-safety controls were unnecessary in earlier Internet systems.  The narrower claim is that modern content stacks create more paths between upstream policy and final perception, increasing the value of an independently verified rendering boundary.</t>
    </section>
    <section anchor="international-child-safety-motivation">
      <name>International Child-Safety Motivation</name>
      <t>UNICEF states that pornographic content can harm children and has expressed concern about the large quantity of pornography that is easily accessible online.  UNICEF has also stated that efforts to restrict children's access in digital environments have not kept pace with technological shifts.</t>
      <t>The ITU Child Online Protection initiative provides policy-maker, educator, industry, parent, and child-focused guidance intended to support safer digital environments for children.  Its current child online protection work emphasizes child-centred and rights-based protection mechanisms.</t>
      <t>The United Nations Committee on the Rights of the Child, in General Comment No. 25 (2021), treats the digital environment as encompassing networks, content, services, applications, connected devices, artificial intelligence, robotics, automated systems, algorithms, and data analytics.  The Committee has repeatedly recommended protecting children from harmful content and online risks while respecting their rights and privacy.</t>
      <t>The European Commission's protection-of-minors guidance under the Digital Services Act addresses harmful content and recommends effective age-assurance measures for adult content such as pornography.  The Commission's age-verification approach is designed to let a user prove that an applicable age threshold is met without unnecessarily revealing identity or exact age.</t>
      <t>These sources provide policy and risk context only.  They do not define, require, or endorse the execution-finality mechanism specified in this document.</t>
    </section>
    <section anchor="core-security-distinction">
      <name>Core Security Distinction</name>
      <t>The central distinction is:</t>
      <figure><artwork type="text">
CONTENT DELIVERY
        !=
CONTENT RENDERING AUTHORITY

AGE CHECK
        !=
DISPLAY FINALITY

CONTENT CLASSIFICATION
        !=
DECRYPTION AUTHORITY

SERVER-SIDE ALLOW
        !=
DEVICE-SIDE MATERIALIZATION AUTHORITY
</artwork></figure>
    </section>
    <section anchor="threat-and-failure-model">
      <name>Threat and Failure Model</name>
      <t>A restricted-content system may fail even when an upstream classification or eligibility decision was correct.  Examples include stale age state, revoked parental policy, cache replay, alternate application paths, direct decoder access, a compromised application, a malicious embedded SDK, casting or mirroring, a stale decryption key, sink substitution, modified content metadata, or a generated-content path that bypasses the original classifier.</t>
      <t>A conforming deployment therefore assumes that ordinary application-layer software may be buggy, compromised, overly permissive, or unable to enforce the last consequence boundary by itself.</t>
    </section>
    <section anchor="dual-boundary-architecture">
      <name>Dual-Boundary Architecture</name>
      <t>A deployment MAY use two execution-finality boundaries.</t>
      <t>The first boundary governs DELIVERY: whether protected content may be transported to or retained within a device or protected environment.</t>
      <t>The second boundary governs RENDERING: whether that content may become visible, audible, cast, mirrored, decrypted into a usable representation, or otherwise perceptible.</t>
      <t>The second boundary is the critical boundary defined by this draft.  Content received after successful delivery remains non-renderable until a current Rendering Finality Authority is independently verified.</t>
      <figure><artwork type="text">
Restricted Content
        |
        v
Encrypted / Protected Candidate Payload
        |
        v
Delivery Policy / Delivery PED
        |
        v
Delivery Finality Authority
        |
        v
Device Receives Protected Payload
        |
        v
STILL NON-RENDERABLE
        |
        v
Device-Side Protected Enforcement Domain
        |
        +-- recipient / eligibility state
        +-- content class
        +-- parental / regulatory policy
        +-- device and session state
        +-- policy / revocation epoch
        +-- nonce / freshness
        +-- intended rendering sink
        |
        v
Protected Validation Evidence
        |
        v
Scoped Non-Bearer Rendering Finality Authority
        |
        v
PROTECTED RENDERING FINALITY SINK
        |
        +-- PASS -&gt; permitted rendering
        |
        `-- FAIL -&gt; remain non-renderable
</artwork></figure>
    </section>
    <section anchor="restricted-content-candidate-act">
      <name>Restricted Content Candidate Act</name>
      <t>A Restricted Content Candidate Act represents a proposed materialization of age-restricted content.  It may describe a video frame sequence, image, audio stream, interactive scene, generated media object, XR scene, game asset, webpage media object, or another protected representation.</t>
      <t>The Candidate Act MUST remain non-renderable while required execution-finality validation is incomplete.</t>
    </section>
    <section anchor="json-interoperability-profile">
      <name>JSON Interoperability Profile</name>
      <t>This revision defines a JSON-based interoperability profile so that implementations can evaluate a concrete contract rather than only an abstract policy model.  JSON objects MUST be encoded as UTF-8.  Implementations MUST reject unknown load-bearing fields when the active schema declares additionalProperties=false.</t>
      <t>The JSON profile does not require HTTP as the transport.  The objects may be carried over a local protected IPC mechanism, an operating-system service boundary, a trusted application-to-enclave channel, a platform API, or another authenticated transport.  A future revision may define a media type or explicit transport binding.</t>
    </section>
    <section anchor="restrictedcontentcandidate-json-schema">
      <name>RestrictedContentCandidate JSON Schema</name>
      <figure><artwork type="json">
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "urn:ietf:params:json-schema:child-rendering-candidate:00",
  "title": "RestrictedContentCandidate",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "version",
    "candidate_act_id",
    "act_type",
    "content",
    "recipient_context",
    "policy_context",
    "render_request",
    "freshness",
    "finality_sink"
  ],
  "properties": {
    "version": {
      "type": "string",
      "const": "1.0"
    },
    "candidate_act_id": {
      "type": "string",
      "minLength": 16,
      "maxLength": 128
    },
    "act_type": {
      "type": "string",
      "enum": [
        "RENDER_VIDEO",
        "RENDER_IMAGE",
        "PLAY_AUDIO",
        "RENDER_INTERACTIVE",
        "RENDER_GENERATED_MEDIA",
        "CAST_PROTECTED_CONTENT",
        "MIRROR_PROTECTED_CONTENT"
      ]
    },
    "content": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "content_id",
        "content_digest",
        "content_class",
        "classification_source",
        "protection_state"
      ],
      "properties": {
        "content_id": {
          "type": "string",
          "maxLength": 256
        },
        "content_digest": {
          "type": "string",
          "pattern": "^sha256:[0-9a-fA-F]{64}$"
        },
        "content_class": {
          "type": "string",
          "enum": [
            "ADULT_SEXUAL_CONTENT",
            "SEXUALLY_EXPLICIT_CONTENT",
            "AGE_RESTRICTED_VIDEO",
            "AGE_RESTRICTED_AUDIO",
            "AGE_RESTRICTED_INTERACTIVE",
            "AGE_RESTRICTED_GENERATED_MEDIA",
            "OTHER_RESTRICTED"
          ]
        },
        "classification_source": {
          "type": "string",
          "maxLength": 256
        },
        "classification_confidence": {
          "type": "number",
          "minimum": 0,
          "maximum": 1
        },
        "protection_state": {
          "type": "string",
          "enum": [
            "ENCRYPTED",
            "KEY_WITHHELD",
            "PROTECTED_SURFACE_ONLY",
            "NON_RENDERABLE_BUFFER",
            "OTHER_PROTECTED"
          ]
        },
        "origin_service": {
          "type": "string",
          "maxLength": 256
        },
        "generation_model_id": {
          "type": [
            "string",
            "null"
          ],
          "maxLength": 256
        }
      }
    },
    "recipient_context": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "recipient_context_id",
        "eligibility_state",
        "eligibility_evidence_ref"
      ],
      "properties": {
        "recipient_context_id": {
          "type": "string",
          "maxLength": 256
        },
        "eligibility_state": {
          "type": "string",
          "enum": [
            "ELIGIBLE",
            "NOT_ELIGIBLE",
            "UNKNOWN",
            "EXPIRED",
            "REVOKED"
          ]
        },
        "eligibility_evidence_ref": {
          "type": "string",
          "maxLength": 512
        },
        "age_threshold_claim": {
          "type": [
            "string",
            "null"
          ],
          "enum": [
            "OVER_18",
            "OVER_LOCAL_THRESHOLD",
            null
          ]
        },
        "parental_policy_ref": {
          "type": [
            "string",
            "null"
          ],
          "maxLength": 512
        },
        "privacy_preserving_proof": {
          "type": "boolean"
        }
      }
    },
    "policy_context": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "jurisdiction",
        "policy_id",
        "policy_epoch",
        "revocation_epoch"
      ],
      "properties": {
        "jurisdiction": {
          "type": "string",
          "maxLength": 64
        },
        "policy_id": {
          "type": "string",
          "maxLength": 256
        },
        "policy_epoch": {
          "type": "integer",
          "minimum": 0
        },
        "revocation_epoch": {
          "type": "integer",
          "minimum": 0
        },
        "parental_control_state": {
          "type": "string",
          "enum": [
            "ALLOW",
            "DENY",
            "NOT_APPLICABLE",
            "UNKNOWN"
          ]
        },
        "platform_policy_state": {
          "type": "string",
          "enum": [
            "ALLOW",
            "DENY",
            "REVIEW",
            "UNKNOWN"
          ]
        }
      }
    },
    "render_request": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "device_id",
        "application_id",
        "render_mode",
        "output_targets"
      ],
      "properties": {
        "device_id": {
          "type": "string",
          "maxLength": 256
        },
        "application_id": {
          "type": "string",
          "maxLength": 256
        },
        "component_id": {
          "type": [
            "string",
            "null"
          ],
          "maxLength": 256
        },
        "render_mode": {
          "type": "string",
          "enum": [
            "LOCAL_DISPLAY",
            "LOCAL_AUDIO",
            "XR_DISPLAY",
            "CAST",
            "MIRROR",
            "REMOTE_DISPLAY"
          ]
        },
        "output_targets": {
          "type": "array",
          "minItems": 1,
          "items": {
            "type": "string",
            "enum": [
              "DISPLAY",
              "SPEAKER",
              "HEADSET",
              "XR_COMPOSITOR",
              "CAST_SINK",
              "MIRROR_SINK"
            ]
          }
        },
        "requested_resolution": {
          "type": [
            "string",
            "null"
          ],
          "maxLength": 64
        },
        "requested_audio": {
          "type": "boolean"
        },
        "requested_decryption": {
          "type": "boolean"
        }
      }
    },
    "freshness": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "nonce",
        "created_at",
        "expires_at"
      ],
      "properties": {
        "nonce": {
          "type": "string",
          "minLength": 16,
          "maxLength": 256
        },
        "created_at": {
          "type": "string",
          "format": "date-time"
        },
        "expires_at": {
          "type": "string",
          "format": "date-time"
        },
        "session_id": {
          "type": [
            "string",
            "null"
          ],
          "maxLength": 256
        }
      }
    },
    "finality_sink": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "sink_id",
        "sink_type"
      ],
      "properties": {
        "sink_id": {
          "type": "string",
          "maxLength": 256
        },
        "sink_type": {
          "type": "string",
          "enum": [
            "CONTENT_KEY_RELEASE",
            "DECRYPTION_GATE",
            "MEDIA_DECODER_GATE",
            "GPU_COMPOSITOR_GATE",
            "PROTECTED_SURFACE_GATE",
            "DISPLAY_ENABLE_GATE",
            "AUDIO_OUTPUT_GATE",
            "CAST_GATE",
            "MIRROR_GATE"
          ]
        },
        "attestation_ref": {
          "type": [
            "string",
            "null"
          ],
          "maxLength": 512
        }
      }
    }
  }
}
</artwork></figure>
    </section>
    <section anchor="renderingpolicydecision-json-schema">
      <name>RenderingPolicyDecision JSON Schema</name>
      <figure><artwork type="json">
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "RenderingPolicyDecision",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "candidate_act_id",
    "decision",
    "decision_id",
    "validated_policy_epoch",
    "validated_revocation_epoch",
    "permitted_effects",
    "denial_reasons"
  ],
  "properties": {
    "candidate_act_id": {
      "type": "string"
    },
    "decision": {
      "type": "string",
      "enum": [
        "ALLOW_RENDER",
        "DENY_RENDER",
        "ALLOW_RESTRICTED_MODE",
        "REQUIRE_REVALIDATION"
      ]
    },
    "decision_id": {
      "type": "string"
    },
    "validated_policy_epoch": {
      "type": "integer",
      "minimum": 0
    },
    "validated_revocation_epoch": {
      "type": "integer",
      "minimum": 0
    },
    "permitted_effects": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "RELEASE_CONTENT_KEY",
          "DECRYPT",
          "DECODE",
          "CREATE_PROTECTED_SURFACE",
          "COMPOSITE",
          "DISPLAY",
          "PLAY_AUDIO",
          "CAST",
          "MIRROR"
        ]
      }
    },
    "denial_reasons": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "RECIPIENT_NOT_ELIGIBLE",
          "ELIGIBILITY_UNKNOWN",
          "ELIGIBILITY_EXPIRED",
          "PARENTAL_POLICY_DENY",
          "PLATFORM_POLICY_DENY",
          "CONTENT_CLASS_MISMATCH",
          "POLICY_EPOCH_STALE",
          "REVOCATION_EPOCH_STALE",
          "NONCE_REPLAY",
          "DEVICE_MISMATCH",
          "APPLICATION_MISMATCH",
          "SINK_MISMATCH",
          "OUTPUT_TARGET_NOT_PERMITTED",
          "ATTESTATION_FAILURE",
          "AUTHORITY_EXPIRED"
        ]
      }
    },
    "validation_evidence_ref": {
      "type": "string"
    },
    "decision_expires_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
</artwork></figure>
    </section>
    <section anchor="renderingfinalityauthority-json-schema">
      <name>RenderingFinalityAuthority JSON Schema</name>
      <figure><artwork type="json">
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "RenderingFinalityAuthority",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "authority_id",
    "candidate_act_id",
    "candidate_digest",
    "validation_evidence_ref",
    "permitted_effects",
    "sink_id",
    "policy_epoch",
    "revocation_epoch",
    "nonce",
    "issued_at",
    "expires_at",
    "consumption"
  ],
  "properties": {
    "authority_id": {
      "type": "string"
    },
    "candidate_act_id": {
      "type": "string"
    },
    "candidate_digest": {
      "type": "string",
      "pattern": "^sha256:[0-9a-fA-F]{64}$"
    },
    "validation_evidence_ref": {
      "type": "string"
    },
    "permitted_effects": {
      "type": "array",
      "minItems": 1,
      "items": {
        "type": "string"
      }
    },
    "content_digest": {
      "type": "string",
      "pattern": "^sha256:[0-9a-fA-F]{64}$"
    },
    "recipient_context_id": {
      "type": "string"
    },
    "device_id": {
      "type": "string"
    },
    "application_id": {
      "type": "string"
    },
    "sink_id": {
      "type": "string"
    },
    "sink_type": {
      "type": "string"
    },
    "policy_epoch": {
      "type": "integer"
    },
    "revocation_epoch": {
      "type": "integer"
    },
    "nonce": {
      "type": "string"
    },
    "issued_at": {
      "type": "string",
      "format": "date-time"
    },
    "expires_at": {
      "type": "string",
      "format": "date-time"
    },
    "consumption": {
      "type": "string",
      "enum": [
        "SINGLE_USE",
        "FRAME_WINDOW",
        "SESSION_BOUND"
      ]
    },
    "max_frame_count": {
      "type": [
        "integer",
        "null"
      ],
      "minimum": 1
    },
    "max_duration_ms": {
      "type": [
        "integer",
        "null"
      ],
      "minimum": 1
    },
    "signature_or_mac": {
      "type": "string"
    }
  }
}
</artwork></figure>
    </section>
    <section anchor="rendersinkverify-request-json-schema">
      <name>RenderSinkVerify Request JSON Schema</name>
      <figure><artwork type="json">
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "RenderSinkVerifyRequest",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "candidate",
    "authority",
    "sink_runtime_state"
  ],
  "properties": {
    "candidate": {
      "$ref": "urn:ietf:params:json-schema:child-rendering-candidate:00"
    },
    "authority": {
      "type": "object"
    },
    "sink_runtime_state": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "sink_id",
        "current_policy_epoch",
        "current_revocation_epoch",
        "authority_consumed",
        "device_attestation_state",
        "output_path"
      ],
      "properties": {
        "sink_id": {
          "type": "string"
        },
        "current_policy_epoch": {
          "type": "integer"
        },
        "current_revocation_epoch": {
          "type": "integer"
        },
        "authority_consumed": {
          "type": "boolean"
        },
        "device_attestation_state": {
          "type": "string",
          "enum": [
            "VALID",
            "INVALID",
            "UNKNOWN"
          ]
        },
        "output_path": {
          "type": "string",
          "enum": [
            "DISPLAY",
            "AUDIO",
            "XR",
            "CAST",
            "MIRROR"
          ]
        },
        "screen_capture_active": {
          "type": "boolean"
        },
        "external_display_attached": {
          "type": "boolean"
        }
      }
    }
  }
}
</artwork></figure>
    </section>
    <section anchor="protected-enforcement-domain-validation">
      <name>Protected Enforcement Domain Validation</name>
      <t>The Protected Enforcement Domain (PED) MUST evaluate all predicates required by the applicable deployment before releasing Rendering Finality Authority.  Typical predicates include recipient eligibility, age-threshold evidence, parental policy, content classification, content digest, jurisdiction, platform policy, device identity, application identity, requested output mode, output target, current policy epoch, current revocation epoch, nonce freshness, device attestation, and intended Finality Sink identity.</t>
      <t>A successful upstream age check MUST NOT itself cause decryption or display.  PED validation success authorizes creation of scoped finality authority; it does not complete the rendering consequence.</t>
    </section>
    <section anchor="protected-validation-evidence">
      <name>Protected Validation Evidence</name>
      <t>Before, or atomically with, Rendering Finality Authority issuance, the PED MUST commit protected validation evidence.  The evidence MAY be represented by a protected signed record, MAC, enclave or HSM assertion, sealed state, monotonic-state commitment, append-only protected record, or equivalent protected mechanism.</t>
      <t>A Boolean ALLOW value by itself is not sufficient finality authority.</t>
    </section>
    <section anchor="rendering-finality-authority">
      <name>Rendering Finality Authority</name>
      <t>Rendering Finality Authority MUST be act-bound, content-bound, recipient-bound, device-bound, application-bound where applicable, policy-epoch-bound, revocation-epoch-bound, nonce/freshness-bound, effect-bound, and sink-bound.</t>
      <t>Possession alone MUST NOT be sufficient.  The authority is non-bearer because the Finality Sink independently verifies the protected bindings before enabling the permitted materialization effects.</t>
      <t>An authority for DISPLAY MUST NOT automatically authorize CAST or MIRROR.  An authority for one device MUST NOT automatically authorize another device.  An authority for one content digest MUST NOT authorize modified or substituted content.</t>
    </section>
    <section anchor="where-enforcement-occurs">
      <name>Where Enforcement Occurs</name>
      <t>The most important deployment question is where the final technical gate is placed.  The gate SHOULD control the first boundary at which the protected content becomes perceptible or can be trivially converted into a perceptible representation.</t>
      <t>Possible Protected Rendering Finality Sinks include content-key release, decryption, media-decoder enablement, GPU command submission, protected-surface creation, compositor admission, display-plane enablement, audio-output enablement, XR compositor access, secure-video path enablement, casting, or screen mirroring.</t>
      <t>A server-side policy endpoint alone is not a Protected Rendering Finality Sink unless bypassing it also makes the protected rendering technically impossible.</t>
    </section>
    <section anchor="content-key-and-decryption-enforcement">
      <name>Content-Key and Decryption Enforcement</name>
      <t>Where encrypted or otherwise protected media is used, withholding the usable content key is a strong enforcement point.  The key-release component MAY act as the Finality Sink or as one element of a chained finality path.</t>
      <t>If validation fails, the usable key MUST NOT be released into an unprotected application context.  If a key was previously released under a bounded authority, its validity SHOULD be constrained by session, content, policy epoch, time, frame window, or equivalent protected state.</t>
    </section>
    <section anchor="decoder-gpu-and-compositor-enforcement">
      <name>Decoder, GPU and Compositor Enforcement</name>
      <t>For media that is already locally encrypted or decoded inside a protected pipeline, the Finality Sink MAY be placed at a decoder, GPU, protected-surface, or compositor boundary.  The implementation MUST prevent ordinary application code from converting a denied Candidate Act into a visible frame through an alternate unprotected surface.</t>
      <t>Protected rendering MAY therefore require that decoded frames remain in protected memory or protected surfaces until the compositor verifies current finality authority.</t>
    </section>
    <section anchor="audio-casting-mirroring-and-secondary-outputs">
      <name>Audio, Casting, Mirroring and Secondary Outputs</name>
      <t>Adult or age-restricted content can be materialized through secondary paths even when a local display is controlled.  Audio, HDMI or external displays, wireless casting, screen mirroring, remote-display APIs, accessibility capture paths, and similar outputs MAY therefore require separate consequence classes or sink-bound authority.</t>
      <t>A local-display authority MUST NOT be interpreted as universal authority for every secondary output.</t>
    </section>
    <section anchor="complete-allow-transaction-example">
      <name>Complete Allow Transaction Example</name>
      <t>The following example shows an adult-classified video that remains key-withheld until the device-side protected sink verifies current eligibility, policy, device, content, freshness, and output-path state.</t>
      <figure><artwork type="json">
{
  "candidate": {
    "version": "1.0",
    "candidate_act_id": "rca-8f3d0d0d-20260826-000001",
    "act_type": "RENDER_VIDEO",
    "content": {
      "content_id": "asset-adult-99182",
      "content_digest": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
      "content_class": "ADULT_SEXUAL_CONTENT",
      "classification_source": "platform-classifier-v7",
      "classification_confidence": 0.998,
      "protection_state": "KEY_WITHHELD",
      "origin_service": "media.example",
      "generation_model_id": null
    },
    "recipient_context": {
      "recipient_context_id": "recipient-session-771",
      "eligibility_state": "ELIGIBLE",
      "eligibility_evidence_ref": "ageproof:opaque:44e2...",
      "age_threshold_claim": "OVER_18",
      "parental_policy_ref": null,
      "privacy_preserving_proof": true
    },
    "policy_context": {
      "jurisdiction": "EU",
      "policy_id": "adult-content-policy-eu-v4",
      "policy_epoch": 412,
      "revocation_epoch": 39,
      "parental_control_state": "NOT_APPLICABLE",
      "platform_policy_state": "ALLOW"
    },
    "render_request": {
      "device_id": "device-3dd18",
      "application_id": "app.media.client",
      "component_id": "protected-player",
      "render_mode": "LOCAL_DISPLAY",
      "output_targets": [
        "DISPLAY",
        "SPEAKER"
      ],
      "requested_resolution": "1080p",
      "requested_audio": true,
      "requested_decryption": true
    },
    "freshness": {
      "nonce": "f9014acbe771440ab5208751",
      "created_at": "2026-08-26T17:35:00Z",
      "expires_at": "2026-08-26T17:35:30Z",
      "session_id": "sess-fb211"
    },
    "finality_sink": {
      "sink_id": "render-sink-secure-compositor-01",
      "sink_type": "GPU_COMPOSITOR_GATE",
      "attestation_ref": "attest:device-3dd18:epoch-88"
    }
  },
  "authority": {
    "authority_id": "rfa-d48d7f",
    "candidate_act_id": "rca-8f3d0d0d-20260826-000001",
    "candidate_digest": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
    "validation_evidence_ref": "pve:9f1172",
    "permitted_effects": [
      "RELEASE_CONTENT_KEY",
      "DECRYPT",
      "DECODE",
      "CREATE_PROTECTED_SURFACE",
      "COMPOSITE",
      "DISPLAY",
      "PLAY_AUDIO"
    ],
    "content_digest": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
    "recipient_context_id": "recipient-session-771",
    "device_id": "device-3dd18",
    "application_id": "app.media.client",
    "sink_id": "render-sink-secure-compositor-01",
    "sink_type": "GPU_COMPOSITOR_GATE",
    "policy_epoch": 412,
    "revocation_epoch": 39,
    "nonce": "f9014acbe771440ab5208751",
    "issued_at": "2026-08-26T17:35:01Z",
    "expires_at": "2026-08-26T17:35:30Z",
    "consumption": "FRAME_WINDOW",
    "max_frame_count": 900,
    "max_duration_ms": 30000,
    "signature_or_mac": "base64url:protected-authenticator"
  },
  "sink_runtime_state": {
    "sink_id": "render-sink-secure-compositor-01",
    "current_policy_epoch": 412,
    "current_revocation_epoch": 39,
    "authority_consumed": false,
    "device_attestation_state": "VALID",
    "output_path": "DISPLAY",
    "screen_capture_active": false,
    "external_display_attached": false
  }
}
</artwork></figure>
    </section>
    <section anchor="complete-denial-transaction-example">
      <name>Complete Denial Transaction Example</name>
      <t>The following example shows a denial where the recipient is not eligible and parental policy also denies rendering.  The important result is not merely an error response: all materialization controls remain disabled.</t>
      <figure><artwork type="json">
{
  "candidate_act_id": "rca-minor-session-223",
  "decision": "DENY_RENDER",
  "decision_id": "decision-99831",
  "validated_policy_epoch": 412,
  "validated_revocation_epoch": 39,
  "permitted_effects": [],
  "denial_reasons": [
    "RECIPIENT_NOT_ELIGIBLE",
    "PARENTAL_POLICY_DENY"
  ],
  "validation_evidence_ref": "pve-deny:3882",
  "decision_expires_at": "2026-08-26T17:36:00Z",
  "sink_action": {
    "release_content_key": false,
    "decrypt": false,
    "decode": false,
    "create_protected_surface": false,
    "display": false,
    "play_audio": false,
    "cast": false,
    "mirror": false,
    "result": "CONTENT_REMAINS_NON_RENDERABLE"
  }
}
</artwork></figure>
    </section>
    <section anchor="fail-closed-requirements">
      <name>Fail-Closed Requirements</name>
      <t>If required authority is missing, malformed, expired, stale, replayed, revoked, consumed, content-mismatched, recipient-mismatched, device-mismatched, application-mismatched, policy-mismatched, output-mismatched, or sink-mismatched, the content MUST remain non-renderable.</t>
      <t>Failure MUST NOT be converted into a warning followed by display.  Implementations MUST NOT use 'best effort' rendering for content subject to this protected finality profile when current authority cannot be established.</t>
    </section>
    <section anchor="replay-revocation-and-state-changes">
      <name>Replay, Revocation and State Changes</name>
      <t>Eligibility and parental state may change after content is delivered.  A device may also restore an old application snapshot or replay a previously valid rendering authority.  The Finality Sink SHOULD therefore verify current policy and revocation epochs immediately before materialization and MUST enforce nonce or equivalent anti-replay state.</t>
      <t>An old authorization MUST NOT automatically override a later parental-control change, account-state change, legal-policy change, device revocation, or recipient eligibility change.</t>
    </section>
    <section anchor="generated-and-ai-transformed-content">
      <name>Generated and AI-Transformed Content</name>
      <t>Generative AI may create age-restricted media that has no stable catalogue identifier.  The Candidate Act therefore supports content digests, generation-model identifiers, classification sources, and protected output state.  A generated object SHOULD be bound to the classification and authority actually used for the attempted rendering.</t>
      <t>This draft does not define how AI-generated content is classified.  It defines how a classification or policy decision can be made technically load-bearing at the rendering boundary.</t>
    </section>
    <section anchor="privacy-considerations">
      <name>Privacy Considerations</name>
      <t>Child-safety enforcement can itself create privacy risk if systems unnecessarily expose a child's identity, exact age, browsing history, or content choices.  Implementations SHOULD minimize disclosure and MAY consume privacy-preserving eligibility proofs that state only whether the required threshold or policy condition is satisfied.</t>
      <t>The rendering sink generally needs the validated eligibility result and bindings necessary for effectuation; it does not necessarily need the user's civil identity or exact date of birth.</t>
      <t>Logs and validation evidence SHOULD avoid recording unnecessary content titles, URLs, identity attributes, or detailed viewing history where a digest, opaque identifier, or protected commitment is sufficient.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>Threats include compromised applications, forged age state, stale parental policy, replayed authorities, content substitution after classification, sink substitution, screen-capture bypass, casting bypass, unprotected decoder paths, key extraction, rollback of revocation state, and malicious SDKs.</t>
      <t>Implementations SHOULD place load-bearing checks within protected execution, trusted operating-system, hardware-backed, or equivalently isolated enforcement paths when the threat model includes compromise of ordinary application software.</t>
    </section>
    <section anchor="interoperability-with-existing-age-assurance-and-platform-systems">
      <name>Interoperability with Existing Age-Assurance and Platform Systems</name>
      <t>The execution-finality layer is designed to consume outcomes from existing systems rather than replace them.  Inputs MAY come from privacy-preserving age verification, platform account state, parental-control systems, content classifiers, regulatory policy, trusted identity providers, device policy, or enterprise/family safety services.</t>
      <t>Those systems answer whether a condition is satisfied.  The Finality Sink answers whether the specific protected rendering consequence may now occur.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This version requests no IANA actions.  If a future version standardizes an Internet media type, URI scheme, error registry, or globally interoperable consequence-class registry, the corresponding IANA considerations will be added.</t>
    </section>
    <section anchor="intellectual-property-considerations">
      <name>Intellectual Property Considerations</name>
      <t>Certain concepts described in this document are related to pending patent applications in the DAS Protocols family.  Any disclosure required by an applicable standards-development process should be made separately in accordance with that process.  This section is informational and does not specify licensing terms.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>Informative References</name>
      <reference anchor="UNICEF-PORN" target="https://www.unicef.org/harmful-content-online">
        <front>
          <title>Protection of children from the harmful impacts of pornography</title>
          <author><organization>UNICEF</organization></author>
        </front>
        <annotation>UNICEF states that pornographic content can harm children and that digital restrictions have not kept pace with technological shifts.</annotation>
      </reference>
      <reference anchor="ITU-COP" target="https://www.itu.int/en/ITU-D/Cybersecurity/Pages/COP/COP.aspx">
        <front>
          <title>Child Online Protection</title>
          <author><organization>International Telecommunication Union</organization></author>
        </front>
        <annotation>ITU Child Online Protection programme and guidelines.</annotation>
      </reference>
      <reference anchor="UN-CRC-GC25" target="https://docstore.ohchr.org/SelfServices/FilesHandler.ashx?enc=3ik0d0T8SX%2FpP07DX0nLHD%2Baw%2BVH0KHJ3a1Msix3LkRIphZtOKg5ykXnYtA79MjKsj%2Fql4vDUtT77VibA3Lp4g%3D%3D">
        <front>
          <title>General Comment No. 25 (2021) on children's rights in relation to the digital environment</title>
          <author><organization>United Nations Committee on the Rights of the Child</organization></author>
        </front>
        <annotation>United Nations guidance on children's rights in the digital environment.</annotation>
      </reference>
      <reference anchor="EU-MINORS" target="https://digital-strategy.ec.europa.eu/en/library/commission-publishes-guidelines-protection-minors">
        <front>
          <title>Guidelines on the protection of minors under the Digital Services Act</title>
          <author><organization>European Commission</organization></author>
        </front>
        <annotation>European Commission protection-of-minors guidance.</annotation>
      </reference>
      <reference anchor="EU-AGE" target="https://digital-strategy.ec.europa.eu/en/policies/eu-age-verification">
        <front>
          <title>The EU approach to age verification</title>
          <author><organization>European Commission</organization></author>
        </front>
        <annotation>Privacy-preserving age-verification approach for adult-restricted online content.</annotation>
      </reference>
    </references>
  </back>
</rfc>