<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
<!ENTITY RFC2119 SYSTEM "https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY RFC7493 SYSTEM "https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7493.xml">
<!ENTITY RFC8174 SYSTEM "https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
<!ENTITY RFC8785 SYSTEM "https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8785.xml">
<!ENTITY I-D.schrock-action-evidence-boundary SYSTEM "https://xml2rfc.ietf.org/public/rfc/bibxml3/reference.I-D.schrock-action-evidence-boundary.xml">
<!ENTITY I-D.schrock-ep-authorization-receipts SYSTEM "https://xml2rfc.ietf.org/public/rfc/bibxml3/reference.I-D.schrock-ep-authorization-receipts.xml">
]>
<rfc submissionType="IETF" docName="draft-wang-ccs-runtime-verification-00" category="info" ipr="trust200902">
	<?rfc strict="yes"?>
	<?rfc compact="yes"?>
	<?rfc subcompact="no"?>
	<?rfc symrefs="yes"?>
	<?rfc sortrefs="yes"?>
	<?rfc text-list-symbols="*o+-"?>
	<?rfc toc="yes"?>
	<front>
	<title abbrev="CCS Runtime Verification Receipt">A Runtime Verification Receipt Format for Agent Auditing</title>
	<author initials="G." surname="Wang" fullname="Guigui Wang">
	<organization>Correctover</organization>
	<address>
	<postal>
	<street>Xiamen, Fujian</street>
	<street>China</street>
	</postal>
	<email>wangguigui@correctover.com</email>
	</address>
	</author>
	<author initials="G." surname="Wang" fullname="Guigui Wang">
	<organization>Correctover</organization>
	<address>
	<postal>
	<street>Xiamen, Fujian</street>
	<street>China</street>
	</postal>
	<email>wgg234114134@163.com</email>
	</address>
	</author>

	<date year="2026" month="August" day="7"/>
	<workgroup>Internet Engineering Task Force</workgroup>
	<abstract>
	<t>The Correctover Conformance Shape (CCS) defines a tamper-evident,
cryptographically bound receipt format that provides runtime verification
for agent tool invocations.  Each CCS receipt captures a seven-dimensional
verification outcome -- Structure, Schema, Latency, Cost, Identity,
Integrity, and Security -- as a single artifact suitable for consumption
by audit, compliance, and observability systems.</t>
	<t>CCS is designed as a pluggable runtime verification infrastructure
layer that complements -- but does not replace -- existing and emerging
agent protocol work at the IETF.  Specifically: (1) the AUDIT effort
(draft-kuehlewind-audit-architecture) defines an auditing architecture
with Action Record and Authorization Transition Record types; a CCS
receipt provides the verifiable, tamper-evident evidence payload that
can populate these record types with cryptographically bound proof of
runtime governance decisions.  (2) The agentproto WG-forming effort
(IETF 126 BoF) addresses agent-to-agent and agent-to-tool communication
protocols; CCS provides per-invocation, sub-millisecond runtime
verification that operates beneath the session/transport layer,
complementing protocol-level context exchange with evidence-level
integrity guarantees.</t>
	<t>Version 1.1 of the CCS receipt comprises 29 fields with full Ed25519
signature coverage, including three causal chain fields (rule_version,
tool_call_id, args_digest) that elevate the Integrity dimension from
behavioral traceability to verifiable decision causality.  The reference
implementation (ccs-verifier v1.1.0, PyPI) passes 154 conformance tests
across all verification dimensions.</t>
	<t>This document specifies the CCS Receipt Schema, the Canonical
Configuration model, the nine binding mechanisms, key management,
transport requirements, verifier source classification, conformance
levels, and negative test cases.  CCS is protocol-agnostic: it is not
bound to Model Context Protocol (MCP), Agent2Agent (A2A), or any other
specific agent protocol, and can be integrated into any runtime that
governs tool invocations.</t>
	</abstract>
	</front>

	<middle>
	<section title="Introduction" anchor="sect-1">
	<t>The Correctover Conformance Shape (CCS) is a receipt-and-binding
specification that produces a single, tamper-evident, cryptographically
bound artifact for every tool invocation decision made by an agent
runtime's governance layer.  A CCS receipt answers: "Given this exact
request, this exact configuration, this exact runtime context, and this
exact set of rules, the verifier decided ALLOW/DENY/ESCALATE, and here
is the proof."</t>

	<t>CCS is defined as a seven-dimensional runtime verification standard:
(1) Structure -- output structural completeness; (2) Schema -- field
value conformance; (3) Latency -- within SLA bounds; (4) Cost -- within
budget; (5) Identity -- correct model version; (6) Integrity -- HMAC
untampered; (7) Security -- RCE/SSRF/credential hijacking interception.
CCS is a general-purpose agent verification framework, not limited to
any specific protocol such as MCP or A2A.</t>

	<t>CCS is not a policy language, an authorization framework, or a
transport protocol.  It is the shape of the evidence that a verifier
produces when it finishes evaluating a command.  This evidence is
intended to be consumed by downstream systems -- including an executor-
side Action Evidence Boundary (AEB) as defined in
<xref target="I-D.schrock-action-evidence-boundary"/> -- as one native
artifact within a larger Authorization Evidence Chain (AEC).</t>

	<t>The reference implementation (ccs-verifier v1.1.0, available on PyPI
under Proprietary Commercial License) provides an in-process verifier
with Ed25519 receipt signing covering all 29 receipt fields, including
the three v1.1 causal chain fields (rule_version, tool_call_id,
args_digest).  The implementation passes 154 conformance tests and
supports both in-process and out-of-process deployment modes.</t>

	<section title="Scope" anchor="sect-1.1">
	<t>CCS specifies:</t>
	<t><list style="symbols">
	<t>A receipt schema (<xref target="sect-3"/>) that binds a verdict to the exact invocation context.</t>
	<t>A canonical configuration model (<xref target="sect-4"/>) that binds the receipt to the exact rule set and policy under which verification occurred.</t>
	<t>Nine binding mechanisms (<xref target="sect-5"/>) that connect the receipt to the request bytes, response bytes, runtime context, action identity, parameter identity, issuer, audience, nonce, and freshness window.</t>
	<t>Key management requirements (<xref target="sect-6"/>).</t>
	<t>Transport requirements (<xref target="sect-7"/>) including fail-closed semantics.</t>
	<t>Verifier source classification (<xref target="sect-8"/>).</t>
	<t>Conformance levels and test vectors (<xref target="sect-9"/> and <xref target="sect-10"/>).</t>
	</list></t>

	<t>CCS does NOT define:</t>
	<t><list style="symbols">
	<t>A new authorization receipt format that replaces or competes with <xref target="I-D.schrock-ep-authorization-receipts"/>.  CCS is a verifier-side decision record, not an organizational authorization artifact.</t>
	<t>A policy language.  Rules are pluggable; CCS specifies how rule outcomes are recorded and bound, not what the rules are.</t>
	<t>A transport protocol for inter-process communication.  The reference implementation uses in-process function calls; the out-of-process transport has been implemented with Unix-socket and TCP with TLS.</t>
	<t>A universal evidence taxonomy.  CCS defines one artifact shape for one class of decision (tool-invocation governance).</t>
	<t>A session management protocol or agent-to-agent communication protocol.  CCS operates at the per-invocation verification layer, beneath session and transport protocols.</t>
	</list></t>
	</section>

	<section title="Relationship to IETF Agent Protocol Work" anchor="sect-1.2">
	<t>Two active areas of IETF work are directly relevant to the problem
of agent runtime verification and auditing.  This section clarifies
how CCS relates to each effort and what gap it fills.</t>

	<t><list style="hanging" hangIndent="4">
	<t hangText="CCS and the AUDIT architecture (draft-kuehlewind-audit-architecture):">
	The AUDIT architecture document (<xref target="I-D.kuehlewind-audit-architecture"/>)
	defines an auditing framework for AI agent delegation and
	interactions, specifying record types including Interaction Records,
	Action Records, Delegation Records, and Authorization Transition
	Records.  The architecture identifies the need for verifiable
	evidence at each action boundary.  CCS provides precisely this
	evidence: a CCS receipt is a tamper-evident, cryptographically
	signed artifact that can serve as the verifiable "action provenance"
	data source within the AUDIT architecture's Action Record.  Where
	the AUDIT architecture defines what data the audit record should
	contain, CCS provides the mechanism to prove that each tool
	invocation was governed, the governance decision was correct, and
	the decision has not been tampered with since issuance.
	</t>
	<t hangText="CCS and the agentproto WG-forming effort:">
	The agentproto effort, which held a WG-forming BoF at IETF 126
	(Vienna, July 2026) (<xref target="IETF126-AGENTPROTO"/>), addresses
	agent-to-agent and agent-to-tool communication protocols including
	session management, context exchange, multimodal transport, and
	discovery.  CCS complements this protocol-layer work by providing
	per-invocation runtime verification at sub-millisecond latency
	(in-process P50 approximately 7.5 microseconds, out-of-process P50
	approximately 133 microseconds).  While agentproto defines how
	agents communicate and manage sessions, CCS verifies that each
	individual tool invocation within those sessions was properly
	governed.  CCS is protocol-agnostic: it can be integrated with MCP,
	A2A, or any future protocol standardized by agentproto, as it
	operates on the verification decision itself rather than on the
	communication protocol carrying the invocation.</t>
	<t hangText="CCS and draft-agentic-ai-usecases-requirements:">
	The use cases and requirements document
	(<xref target="I-D.agentic-ai-usecases"/>, Reddy/Sarker/Yao) derives
	protocol requirements for agentic AI communication systems.  These
	requirements include security, authentication, and error handling
	for agent-to-tool interactions.  CCS addresses the runtime
	verification aspect of these requirements: when an agent invokes
	a tool, CCS produces a cryptographically bound receipt proving the
	invocation was governed, the parameters were validated, and the
	decision was authorized.  This evidence can be propagated alongside
	the session and transport mechanisms defined by agentproto
	protocols.</t>
	</list></t>

	<t>In summary, CCS occupies a distinct layer in the agent protocol
	stack: it is neither a session protocol (like agentproto), nor an
	audit data model (like the AUDIT architecture), nor a communication
	protocol (like MCP or A2A).  It is the runtime verification
	infrastructure layer that produces the tamper-evident receipts that
	both audit systems and protocol implementations can consume as
	proof of governance.</t>
	</section>

	<section title="Relationship to CCS Formal Framework (DOI References)" anchor="sect-1.3">
	<t>This Internet-Draft is a protocol specification derived from and
complementary to the following academic publications:</t>

	<t><list style="symbols">
	<t>DOI: 10.5281/zenodo.21783723 -- "CCS 7-Dimensional Runtime Verification Framework v0.4.1 Three-Endpoint Closed Loop."  This work documents the complete three-endpoint closed loop: IETF Internet-Draft + Zenodo DOI + PyPI ccs-verifier v1.1.0.  It covers the seven-dimensional verification model and its implementation.</t>
	<t>DOI: 10.5281/zenodo.21271910 -- "CCS Formal Framework."  This paper defines the mathematical foundation: the Required(tau) subset of Supported(tau) conformance criterion, the transition model, and the formal proof that fail-closed enforcement satisfies the governance criterion.  This I-D does not reproduce the formal framework; it specifies the wire-level receipt and binding mechanisms that implement it.</t>
	<t>DOI: 10.5281/zenodo.21603250 -- "Action Receipts."  This paper defines the concept of an action receipt as a tamper-evident record binding a decision to a specific action invocation.  The CCS receipt in this I-D is a concrete instantiation of that concept, specialized for tool-invocation governance in agent runtimes.</t>
	</list></t>

	<t>A Palo Alto Networks (PANW) contributor cited CCS DOI in a fork
of Palo-Alto-AI-Research-Lab/semantic-kernel (PR #14199, closed by
Microsoft).  This citation is noted as evidence of external interest
in the CCS DOI; it does not constitute adoption by Microsoft or the
Semantic Kernel project.  Major frameworks including CrewAI and AutoGen
are part of the broader agent ecosystem that CCS is designed to serve;
CCS DOI has been cited in related research contexts.</t>
	</section>

	</section>

	<section title="Terminology" anchor="sect-2">
	<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>

	<t>CCS-specific terms:</t>

	<t>Command: An immutable, structured representation of a tool
invocation request, comprising at minimum: agent_id, tool name,
parameters, timestamp, and trace_id.  The Command is the input to
verification.</t>

	<t>Verifier: A component that evaluates a Command against a set of
Rules and produces a VerificationResult.  The verifier MAY run in-
process (same address space as the agent) or out-of-process (separate
address space, separate crash domain).</t>

	<t>Rule: A pluggable unit of policy evaluation.  A Rule accepts a
Command and returns a RuleResult with a verdict (allow, deny,
escalate), an optional reason string, and a latency measurement.</t>

	<t>VerificationResult: The output of a verification.  Contains the
verdict, signed receipt, rule results, and metadata.</t>

	<t>Receipt: A cryptographically signed digest (HMAC-SHA256 or Ed25519)
that binds the verification context to a signing key, providing
tamper-evident audit.</t>

	<t>Config Hash: A SHA-256 digest of the canonical JSON representation
of the verifier's configuration (rule set, policy version, signing key
identifier).  Binds the receipt to the exact policy under which
verification occurred.</t>

	<t>Fail-closed: A property of the enforcement mechanism whereby any
failure in the verification path -- exception, timeout, missing input,
ambiguous state -- results in the tool invocation being blocked, not
allowed.  This is the opposite of fail-open (CWE-636).</t>

	<t>Conformance Shape: The complete set of fields, bindings, and
semantic constraints that a CCS receipt MUST satisfy to be considered
conformant at a given level.</t>
	</section>

	<section title="CCS Receipt Schema" anchor="sect-3">
	<section title="Field Definitions" anchor="sect-3.1">
	<t>A conforming CCS Receipt is a JSON object conforming to I-JSON
<xref target="RFC7493"/>.  The receipt comprises 29 fields.  Version 1.1
(ccs-verifier v1.1.0) includes all 29 fields with full Ed25519
signature coverage.  Fields marked "Implemented" are present and
operational in ccs-verifier v1.1.0.</t>

	<figure anchor="le-1"><artwork><![CDATA[
+====================+========+===========+===========+=================+
|Field               |Type    |Status     |Required   |Description      |
+====================+========+===========+===========+=================+
|trace_id            |string  |Implemented|MUST       |SHA-256 of       |
|                    |(16-char|           |           |time.time_ns(),  |
|                    |hex)    |           |           |truncated to 16  |
|                    |        |           |           |hex chars.       |
|                    |        |           |           |Uniquely         |
|                    |        |           |           |identifies this  |
|                    |        |           |           |verification     |
|                    |        |           |           |event.           |
+--------------------+--------+-----------+-----------+-----------------+
|verdict             |string  |Implemented|MUST       |One of: "allow", |
|                    |enum    |           |           |"deny",          |
|                    |        |           |           |"escalate".      |
+--------------------+--------+-----------+-----------+-----------------+
|timestamp           |float   |Implemented|MUST       |Unix timestamp   |
|                    |        |           |           |at verdict time. |
+--------------------+--------+-----------+-----------+-----------------+
|tool                |string  |Implemented|MUST       |The tool name    |
|                    |        |           |           |from the Command.|
+--------------------+--------+-----------+-----------+-----------------+
|params_hash         |string  |Implemented|MUST       |SHA-256 of       |
|                    |(16-char|           |           |canonical JSON of|
|                    |hex)    |           |           |Command.params,  |
|                    |        |           |           |truncated to 16. |
+--------------------+--------+-----------+-----------+-----------------+
|rule_summary        |string  |Implemented|MUST       |Pipe-delimited   |
|                    |        |           |           |rule_name=verdict|
|                    |        |           |           |pairs.           |
+--------------------+--------+-----------+-----------+-----------------+
|receipt             |string  |Implemented|MUST       |Ed25519 (or HMAC-|
|                    |(hex)   |           |           |SHA256) signature|
+--------------------+--------+-----------+-----------+-----------------+
|verified_at         |float   |Implemented|MUST       |Unix timestamp of|
|                    |        |           |           |verification.    |
+--------------------+--------+-----------+-----------+-----------------+
|block_reason        |string  |Implemented|Conditional|Reason for deny/ |
|                    |        |           |           |escalate. Empty  |
|                    |        |           |           |for allow.       |
+--------------------+--------+-----------+-----------+-----------------+
|request_hash        |string  |Implemented|MUST       |SHA-256 of       |
|                    |(hex)   |           |           |canonical request|
|                    |        |           |           |bytes.           |
+--------------------+--------+-----------+-----------+-----------------+
|response_hash       |string  |Implemented|SHOULD     |SHA-256 of tool  |
|                    |(hex)   |           |           |response bytes.  |
+--------------------+--------+-----------+-----------+-----------------+
|runtime_context_hash|string |Implemented|SHOULD     |SHA-256 of       |
|                    |(hex)   |           |           |runtime context. |
+--------------------+--------+-----------+-----------+-----------------+
|action              |string  |Implemented|MUST       |CAID-compatible  |
|                    |        |           |           |action identifier|
+--------------------+--------+-----------+-----------+-----------------+
|config_hash         |string  |Implemented|MUST       |SHA-256 of       |
|                    |(hex)   |           |           |canonical config.|
+--------------------+--------+-----------+-----------+-----------------+
|issuer              |string  |Implemented|MUST       |Verifier URI     |
|                    |(URI)   |           |           |identifier.      |
+--------------------+--------+-----------+-----------+-----------------+
|audience            |string  |Implemented|MUST       |Intended consumer|
|                    |(URI)   |           |           |URI identifier.  |
+--------------------+--------+-----------+-----------+-----------------+
|nonce               |string  |Implemented|MUST       |Single-use anti- |
|                    |(hex)   |           |           |replay value.    |
+--------------------+--------+-----------+-----------+-----------------+
|sequence            |integer |Implemented|SHOULD     |Monotonic counter|
|                    |        |           |           |per issuer.      |
+--------------------+--------+-----------+-----------+-----------------+
|issued_at           |float   |Implemented|MUST       |Receipt issuance |
|                    |        |           |           |timestamp.       |
+--------------------+--------+-----------+-----------+-----------------+
|expires_at          |float   |Implemented|MUST       |Receipt expiry   |
|                    |        |           |           |timestamp.       |
+--------------------+--------+-----------+-----------+-----------------+
|max_clock_skew      |float   |Implemented|SHOULD     |Max clock skew   |
|                    |        |           |           |tolerance (sec). |
|                    |        |           |           |Default: 30.0.   |
+--------------------+--------+-----------+-----------+-----------------+
|rule_version        |string  |Implemented|MUST       |Decision rule    |
|                    |        |           |           |version (v1.1).  |
+--------------------+--------+-----------+-----------+-----------------+
|tool_call_id        |string  |Implemented|MUST       |Unique tool call |
|                    |(UUID)  |           |           |ID (v1.1).       |
+--------------------+--------+-----------+-----------+-----------------+
|args_digest         |string  |Implemented|MUST       |SHA-256 of exact |
|                    |(hex)   |           |           |exec args (v1.1).|
+--------------------+--------+-----------+-----------+-----------------+
]]></artwork>
	</figure>
	</section>

	<section title="Signed Bytes" anchor="sect-3.2">
	<t>The receipt field is computed over a signing payload.  In v1.1
(ccs-verifier v1.1.0), Ed25519 is used with the following payload:</t>

	<figure><artwork><![CDATA[
v1.1_payload = "{trace_id}:{verdict}:{timestamp}:{tool}:{params_hash}:{rule_summary}:{rule_version}:{tool_call_id}:{args_digest}"
]]></artwork>
	</figure>
	<t>The Ed25519 signature is computed over UTF-8 encoding of this payload.
The full 64-byte Ed25519 signature is included in the receipt field.</t>

	<t>Extended signing payload (for full AEC mapping with all 29 fields):</t>

	<figure><artwork><![CDATA[
extended_payload = "{trace_id}:{verdict}:{timestamp}:{tool}:{params_hash}:{rule_summary}:{request_hash}:{response_hash}:{runtime_context_hash}:{action}:{config_hash}:{issuer}:{audience}:{nonce}:{sequence}:{issued_at}:{expires_at}:{rule_version}:{tool_call_id}:{args_digest}"
]]></artwork>
	</figure>

	<t>Critical property: The signed bytes cover the full verification
context.  Any change to any signed field invalidates the receipt.</t>
	</section>

	<section title="Receipt JSON Example" anchor="sect-3.3">
	<t>The following is an example CCS receipt as produced by ccs-verifier
v1.1.0 with all 29 fields populated and Ed25519 signature:</t>

	<figure><artwork><![CDATA[
{
  "trace_id": "a1b2c3d4e5f67890",
  "verdict": "allow",
  "timestamp": 1722384000.123456,
  "tool": "search_web",
  "params_hash": "1234567890abcdef",
  "rule_summary": "ssrf_protection=allow|rce_protection=allow|credential_leak=allow",
  "receipt": "ed25519:<64-byte-hex-signature>",
  "verified_at": 1722384000.123890,
  "block_reason": "",
  "request_hash": "sha256:e3b0c44298fc1c149afbf4c8996fb924...",
  "response_hash": "",
  "runtime_context_hash": "sha256:7d865e959b2466918c180089...",
  "action": "ccs:tool-invoke:search_web:sha256:1234567890abcdef",
  "config_hash": "sha256:aabbccdd0011223344556677...",
  "issuer": "https://verifier.example.com/ccs/v1",
  "audience": "https://executor.example.com/aeb",
  "nonce": "f47ac10b58cc4372a5670e02b2c3d479",
  "sequence": 42,
  "issued_at": 1722384000.123000,
  "expires_at": 1722384060.123000,
  "max_clock_skew": 30.0,
  "rule_version": "1.1.0",
  "tool_call_id": "550e8400-e29b-41d4-a716-446655440000",
  "args_digest": "sha256:9f86d081884c7d659a2feaa0c55ad015..."
}
]]></artwork>
	</figure>
	</section>

	</section>

	<section title="Causal Chain Fields (v1.1)" anchor="sect-3.4">
	<t>Version 1.1 introduces three fields that extend the CCS Integrity
dimension from "behavioral traceability" to "verifiable decision
causality chains."  These fields address two attack scenarios:</t>

	<t>Scenario 1: Legitimate chain masking garbage decisions.  An attacker
constructs a valid CCS receipt chain where each receipt passes
cryptographic verification, but the underlying decision rules are
systematically degraded.  Without rule_version binding, the chain
appears valid despite decisions being produced by different rules.</t>

	<t>Scenario 2: Silent-Drop (approval-execution decoupling).  An attacker
obtains a valid approval, silently drops the approved invocation, and
substitutes a different invocation with different arguments.  Without
tool_call_id and args_digest, the executor cannot detect the swap.</t>

	<t>rule_version: A version identifier identifying the specific version
of the decision rule set that produced this verdict.  Enables detection
of rule drift.</t>

	<t>tool_call_id: A UUID (RFC 4122) uniquely identifying a single tool
invocation instance from dispatch.  Creates an unbreakable link
between the approval decision and the specific execution.  The
executor MUST verify that the tool_call_id in the CCS receipt matches
the invocation being executed.</t>

	<t>args_digest: SHA-256 of the exact arguments passed to the tool at
execution time (hex string).  Distinct from params_hash: params_hash
captures pre-verification parameters as seen by governance; args_digest
captures post-approval execution-time arguments as seen by the
executor.  Divergence indicates argument modification between approval
and execution.</t>

	<t>Signing requirement: All three fields MUST be included in the
Ed25519 signature scope (see <xref target="sect-3.2"/>).</t>

	<t>Backward compatibility: The three new fields are OPTIONAL for
existing Level 0-2 implementations.  Implementations targeting
Level 3 or claiming v1.1 conformance MUST include all three fields.</t>
	</section>

	<section title="Canonical Configuration" anchor="sect-4">
	<section title="Canonical Config Fields" anchor="sect-4.1">
	<t>A CCS Canonical Configuration is a JSON object that describes the
exact state of the verifier at the time a receipt was issued.  It
MUST contain:</t>

	<figure anchor="le-2"><artwork><![CDATA[
 +==================+==========+==========+=======================+
 | Field            | Type     | Required | Description           |
 +==================+==========+==========+=======================+
 | rules            | array of | MUST     | Ordered list of rule  |
 |                  | strings  |          | names as registered.  |
 +------------------+----------+----------+-----------------------+
 | policy_version   | string   | MUST     | Version identifier of |
 |                  |          |          | the policy.           |
 +------------------+----------+----------+-----------------------+
 | signing_key_id   | string   | MUST     | Identifier of the     |
 |                  |          |          | signing key.          |
 +------------------+----------+----------+-----------------------+
 | verifier_version | string   | MUST     | Software version of   |
 |                  |          |          | the verifier.         |
 +------------------+----------+----------+-----------------------+
 | schema_version   | string   | MUST     | CCS receipt schema    |
 |                  |          |          | version (e.g. "1.1"). |
 +------------------+----------+----------+-----------------------+
 | deployment_mode  | string   | MUST     | "in-process" or "out- |
 |                  | enum     |          | of-process".          |
 +------------------+----------+----------+-----------------------+
]]></artwork>
	</figure>
	</section>

	<section title="Canonicalization Algorithm" anchor="sect-4.2">
	<t>The canonical configuration MUST be serialized using JSON
Canonicalization Scheme (JCS) as defined in <xref target="RFC8785"/>:</t>

	<figure><artwork><![CDATA[
def canonical_config(config: dict) -> bytes:
    """Serialize config to canonical JSON per RFC 8785 (JCS)."""
    return json.dumps(
        config,
        sort_keys=True,
        separators=(",", ":"),
        ensure_ascii=True,
        allow_nan=False
    ).encode("utf-8")
]]></artwork>
	</figure>
	<t>Key properties: keys sorted lexicographically, no whitespace between
tokens (compact form), ASCII-only encoding, NaN and Infinity not
permitted.</t>
	</section>

	<section title="Config Hash" anchor="sect-4.3">
	<t>The config_hash is computed as:</t>
	<figure><artwork><![CDATA[
config_hash = hashlib.sha256(canonical_config(config)).hexdigest()
]]></artwork>
	</figure>
	<t>The config_hash MUST be included in the extended signing payload
(<xref target="sect-3.2"/>) when the extended fields are in use.</t>
	</section>
	</section>

	<section title="Bindings" anchor="sect-5">
	<t>This section defines the nine binding mechanisms that connect a CCS
receipt to the various elements of the invocation lifecycle.</t>

	<section title="request_hash Binding" anchor="sect-5.1">
	<t>Purpose: Bind the receipt to the exact request bytes as received by
the verifier.</t>
	<figure><artwork><![CDATA[
def canonical_bytes(command) -> bytes:
    return json.dumps({
        "agent_id": command.agent_id,
        "tool": command.tool,
        "params": command.params,
        "timestamp": command.timestamp,
        "trace_id": command.trace_id,
    }, sort_keys=True, separators=(",", ":")).encode("utf-8")

request_hash = "sha256:" + hashlib.sha256(canonical_bytes(command)).hexdigest()
]]></artwork>
	</figure>
	</section>

	<section title="response_hash Binding" anchor="sect-5.2">
	<t>Purpose: Bind the receipt to the exact response produced by the
tool invocation.</t>
	<figure><artwork><![CDATA[
response_hash = "sha256:" + hashlib.sha256(response_bytes).hexdigest()
]]></artwork>
	</figure>
	<t>Timing: Computed after tool invocation completes (post-hoc binding).</t>
	</section>

	<section title="runtime_context_hash Binding" anchor="sect-5.3">
	<t>Purpose: Bind the receipt to the runtime execution environment.</t>
	<figure><artwork><![CDATA[
context_bytes = json.dumps(context, sort_keys=True,
    separators=(",", ":")).encode("utf-8")
runtime_context_hash = "sha256:" + hashlib.sha256(context_bytes).hexdigest()
]]></artwork>
	</figure>
	</section>

	<section title="action Binding" anchor="sect-5.4">
	<t>Purpose: Provide a CAID-compatible action identifier.</t>
	<figure><artwork><![CDATA[
action = "ccs:tool-invoke:{tool_name}:{params_hash}"
]]></artwork>
	</figure>
	<t>The source media type is "application/x-ccs-receipt+json".</t>
	</section>

	<section title="params_hash Binding" anchor="sect-5.5">
	<t>Purpose: Bind the receipt to the exact tool parameters.</t>
	<figure><artwork><![CDATA[
def params_hash(params: dict) -> str:
    return hashlib.sha256(
        json.dumps(params, sort_keys=True,
            separators=(",", ":")).encode()
    ).hexdigest()[:16]
]]></artwork>
	</figure>
	<t>Implementations targeting Level 2+ SHOULD use full SHA-256 digest.</t>
	</section>

	<section title="issuer Binding" anchor="sect-5.6">
	<t>Purpose: Identify the verifier that produced the receipt.  The URI
MUST be stable across key rotations and covered by the signature.</t>
	</section>

	<section title="audience Binding" anchor="sect-5.7">
	<t>Purpose: Identify the intended consumer.  A receipt whose audience
does not match the consumer MUST be rejected.</t>
	</section>

	<section title="nonce/sequence Binding" anchor="sect-5.8">
	<t>Purpose: Prevent replay.  The consumer MUST maintain a replay cache
of seen (issuer, nonce) pairs.  A previously-seen nonce MUST be
rejected.  The cache MUST persist across restarts.</t>
	</section>

	<section title="freshness Binding" anchor="sect-5.9">
	<t>Purpose: Bound the temporal validity of the receipt.</t>
	<figure><artwork><![CDATA[
def check_freshness(receipt, local_time, max_clock_skew=30.0):
    skew = receipt.max_clock_skew or 30.0
    if local_time < receipt.issued_at - skew:
        return False
    if local_time > receipt.expires_at + skew:
        return False
    return True
]]></artwork>
	</figure>
	<t>Recommended expiry: issued_at + 60 seconds for tool-invocation
governance.</t>
	</section>
	</section>

	<section title="Key Management" anchor="sect-6">
	<section title="Key Generation" anchor="sect-6.1">
	<t>HMAC-SHA256 (backward compatible): signing_key = secrets.token_bytes(32).
The key MUST NOT be derived from predictable sources.</t>
	<t>Ed25519 (implemented in ccs-verifier v1.1.0):</t>
	<figure><artwork><![CDATA[
from cryptography.hazmat.primitives.asymmetric.ed25519 import (
    Ed25519PrivateKey, Ed25519PublicKey
)
private_key = Ed25519PrivateKey.generate()
public_key = private_key.public_key()
]]></artwork>
	</figure>
	</section>

	<section title="Key Enrollment" anchor="sect-6.2">
	<t>HMAC: shared secret via secure channel.  Ed25519: public key pinned
via out-of-band mechanism.</t>
	</section>

	<section title="Key Rotation" anchor="sect-6.3">
	<t>Phased: Announce -> Dual-sign -> Cutover -> Retire.  Overlap window
MUST be at least 2x maximum receipt lifetime.</t>
	</section>

	<section title="Verifier-Operator Separation" anchor="sect-6.4">
	<t>In-process: shared address space, signing key accessible.
Out-of-process: separate process, signing key protected.
Out-of-process is RECOMMENDED for security-critical applications.</t>
	</section>
	</section>

	<section title="Transport Requirements" anchor="sect-7">
	<section title="Fail-Closed Semantics" anchor="sect-7.1">
	<t>CCS enforcement MUST be fail-closed.  If the verifier raises an
exception, times out, returns ambiguous result, or is unreachable,
the tool invocation MUST be blocked.</t>
	<figure><artwork><![CDATA[
def govern(fn, policy="default"):
    def wrapper(*args, **kwargs):
        try:
            result = verifier.verify(command)
            if not result.allowed:
                raise PermissionError(result.block_reason)
        except Exception:
            raise PermissionError("Verification failed")
        return fn(*args, **kwargs)
    return wrapper
]]></artwork>
	</figure>
	<t>This is the fundamental difference from observer-pattern hooks (which
fail-open per <xref target="CWE-636"/>).</t>
	</section>

	<section title="Timeout Behavior" anchor="sect-7.2">
	<t>Verifier timeout: invocation MUST be blocked.  Receipt timeout:
expired receipts MUST be rejected.  Both are independent and both
MUST be enforced.</t>
	</section>

	<section title="In-Process vs Out-of-Process Deployment" anchor="sect-7.3">
	<figure anchor="le-3"><artwork><![CDATA[
   +==================+==================+=======================+
   | Property         | In-Process       | Out-of-Process        |
   +==================+==================+=======================+
   | Process boundary | None (shared     | Full (separate        |
   |                  | address space)   | process)              |
   +------------------+------------------+-----------------------+
   | Signing key      | Vulnerable to    | Protected             |
   | exposure         | agent compromise |                       |
   +------------------+------------------+-----------------------+
   | Crash isolation  | None             | Full                  |
   +------------------+------------------+-----------------------+
   | Latency          | ~7.5us P50       | ~133us P50            |
   |                  | (ccs-verifier    | (Unix-socket/TCP+TLS) |
   |                  | v1.1.0)          |                       |
   +------------------+------------------+-----------------------+
   | Implementation   | Implemented      | Implemented:          |
   | status           | (v1.1.0)         | Unix-socket + TCP/TLS |
   +------------------+------------------+-----------------------+
   | Conformance      | Level 0-1        | Level 2-3             |
   | level            |                  |                       |
   +------------------+------------------+-----------------------+
]]></artwork>
	</figure>
	<t>Note: P50/P99 latency figures are informational measurements, not
normative requirements.</t>
	</section>
	</section>

	<section title="Verifier Source Classification" anchor="sect-8">
	<section title="Class A: Self-Built Verifier" anchor="sect-8.1">
	<t>Built, operated, and audited by the relying party's own organization.
Assurance: Highest.</t>
	</section>
	<section title="Class B: Audited Verifier" anchor="sect-8.2">
	<t>Built by third party, independently audited.  Assurance: High.</t>
	</section>
	<section title="Class C: Self-Declared Verifier" anchor="sect-8.3">
	<t>Operator claims conformance without independent audit.  Assurance: Low.</t>
	</section>
	</section>

	<section title="Conformance Levels" anchor="sect-9">
	<section title="Level 0-3 Definitions" anchor="sect-9.1">
	<t>Level 0 -- Baseline: Signed receipt covering trace_id, verdict,
timestamp, tool, params_hash, rule_summary.  Fail-closed implemented.</t>

	<t>Level 1 -- Extended Bindings (ccs-verifier v1.1.0): Adds request_hash,
config_hash.  Ed25519 signing.  All 29 fields populated including
v1.1 causal chain fields.  154 tests passed.</t>

	<t>Level 2 -- Full AEC Readiness: Adds response_hash, runtime_context_hash,
action, issuer, audience, nonce, sequence, issued_at, expires_at,
max_clock_skew.</t>

	<t>Level 3 -- Out-of-Process with Full Isolation: Separate process, key
protection, distributed replay prevention.</t>
	</section>

	<section title="Conformance Vectors" anchor="sect-9.2">
	<t>CV-001: Basic ALLOW receipt (Level 0).  CV-002: Basic DENY receipt.
CV-003: Config hash binding (Level 1).  CV-004: Request hash binding.
CV-005: Issuer/audience binding (Level 2).  CV-006: Freshness enforcement.</t>
	<t>ccs-verifier v1.1.0 passes 154 conformance tests across all levels.</t>
	</section>
	</section>

	<section title="Negative Test Cases" anchor="sect-10">
	<t>Ten negative test cases: eight original plus two v1.1.</t>

	<section title="Changed Arguments" anchor="sect-10.1">
	<t>Attacker modifies tool parameters.  params_hash mismatch detects it.
Binding defeated if removed: params_hash binding (<xref target="sect-5.5"/>).</t>
	</section>
	<section title="Changed Response" anchor="sect-10.2">
	<t>Attacker modifies tool response.  response_hash mismatch detects it.
Binding defeated if removed: response_hash binding (<xref target="sect-5.2"/>).</t>
	</section>
	<section title="Replay" anchor="sect-10.3">
	<t>Attacker replays receipt.  Nonce in replay cache detects it.
Binding defeated if removed: nonce/sequence binding (<xref target="sect-5.8"/>).</t>
	</section>
	<section title="Stale Evidence" anchor="sect-10.4">
	<t>Attacker presents old receipt.  expires_at check detects it.
Binding defeated if removed: freshness binding (<xref target="sect-5.9"/>).</t>
	</section>
	<section title="Wrong Audience" anchor="sect-10.5">
	<t>Attacker redirects receipt.  audience mismatch detects it.
Binding defeated if removed: audience binding (<xref target="sect-5.7"/>).</t>
	</section>
	<section title="Key Substitution" anchor="sect-10.6">
	<t>Attacker forges receipt with own key.  Issuer trust check detects it.
Binding defeated if removed: issuer binding (<xref target="sect-5.6"/>).</t>
	</section>
	<section title="Verifier/Runtime Collusion" anchor="sect-10.7">
	<t>Verifier always returns ALLOW.  Statistical monitoring + Class B/A
audit mitigates.  Not a cryptographic attack.</t>
	</section>
	<section title="Missing Transport" anchor="sect-10.8">
	<t>Transport unavailable, runtime falls back to allow.  Fail-closed
semantics (<xref target="sect-7.1"/>) MUST block the invocation.</t>
	</section>
	<section title="Rule Version Substitution (v1.1)" anchor="sect-10.9">
	<t>Attacker replays receipt from old rule version.  rule_version mismatch
detects it.  Binding defeated if removed: rule_version binding
(<xref target="sect-3.4"/>).</t>
	</section>
	<section title="Silent-Drop Attack (v1.1)" anchor="sect-10.10">
	<t>Attacker substitutes invocation after approval.  tool_call_id and
args_digest mismatch detects it.  Binding defeated if removed:
tool_call_id and args_digest binding (<xref target="sect-3.4"/>).</t>
	</section>
	</section>

	<section title="Security Considerations" anchor="sect-11">
	<t>Truncated hashes: params_hash truncated to 16 hex chars (64 bits) in
0.4.1 HMAC mode.  Cross-deployment SHOULD use full-length.  v1.1 Ed25519
mode uses full 64-byte signatures.</t>

	<t>HMAC key exposure in in-process mode: compromised agent can read
signing key.  Out-of-process mitigates this (Unix-socket and TCP/TLS
implemented in v1.1.0).</t>

	<t>Float timestamp precision: IEEE 754 double provides ~15-17 significant
digits.  Implementations SHOULD use monotonic clocks for latency and
wall clocks for issuance.</t>

	<t>JSON canonicalization: params_hash and config_hash depend on
deterministic serialization per <xref target="sect-3.2"/> and <xref target="sect-4.2"/>.</t>

	<t>Rule evaluation ordering: DENY short-circuits, so rule_summary MAY
differ.  config_hash (Level 1+) binds to exact rule set.</t>

	<t>TOCTOU: runtime_context_hash (Level 2) mitigates environment change
between verification and execution.</t>

	<t>Receipt chaining: not defined.  Use sequence field (<xref target="sect-5.8"/>) or
external chaining.</t>

	<t>Causal chain integrity (v1.1): rule_version, tool_call_id, args_digest
derive security from Ed25519 scope.  Private key MUST be verifier-only.
rule_version from canonical config.  tool_call_id generated before
approval.  args_digest from exact execution bytes.</t>

	<t>params_hash vs args_digest: params_hash = pre-verification (governance
view); args_digest = post-approval (executor view).  Divergence for
same tool_call_id indicates silent-drop attack (<xref target="sect-10.10"/>).</t>
	</section>

	<section title="IANA Considerations" anchor="sect-12">
	<t>This document does not request any IANA allocations.</t>
	</section>

	</middle>

	<back>
	<references title="Normative References">
	&RFC2119;
	&RFC7493;
	&RFC8174;
	&RFC8785;
	</references>
	<references title="Informative References">
	&I-D.schrock-action-evidence-boundary;
	&I-D.schrock-ep-authorization-receipts;

	<reference anchor="CCS-FORMAL" target="https://doi.org/10.5281/zenodo.21271910">
	<front>
	<title>CCS Formal Framework</title>
	<author initials="G." surname="Wang" fullname="Guigui Wang">
	</author>
	<date year="2026"/>
	</front>
	<seriesInfo name="DOI" value="10.5281/zenodo.21271910"/>
	</reference>

	<reference anchor="CCS-7DIM" target="https://doi.org/10.5281/zenodo.21783723">
	<front>
	<title>CCS 7-Dimensional Runtime Verification Framework v0.4.1 Three-Endpoint Closed Loop</title>
	<author initials="G." surname="Wang" fullname="Guigui Wang">
	</author>
	<date year="2026"/>
	</front>
	<seriesInfo name="DOI" value="10.5281/zenodo.21783723"/>
	</reference>

	<reference anchor="CCS-RECEIPTS" target="https://doi.org/10.5281/zenodo.21603250">
	<front>
	<title>Action Receipts</title>
	<author initials="G." surname="Wang" fullname="Guigui Wang">
	</author>
	<date year="2026"/>
	</front>
	<seriesInfo name="DOI" value="10.5281/zenodo.21603250"/>
	</reference>

	<reference anchor="I-D.kuehlewind-audit-architecture" target="https://datatracker.ietf.org/doc/draft-kuehlewind-audit-architecture/">
	<front>
	<title>An Architecture for Auditing AI Agent Delegation and Interactions</title>
	<author initials="M." surname="Kuehlewind" fullname="Mirja Kuehlewind">
	<organization>Ericsson</organization>
	</author>
	<author initials="H." surname="Birkholz" fullname="Henk Birkholz">
	<organization>Fraunhofer SIT</organization>
	</author>
	<date year="2026" month="May"/>
	</front>
	<seriesInfo name="Internet-Draft" value="draft-kuehlewind-audit-architecture-00"/>
	</reference>

	<reference anchor="I-D.agentic-ai-usecases" target="https://datatracker.ietf.org/doc/draft-agentic-ai-usecases-requirements/">
	<front>
	<title>Agentic AI Use Cases and Requirements</title>
	<author initials="T." surname="Reddy" fullname="Tirumaleswar Reddy">
	</author>
	<author initials="Z." surname="Sarker" fullname="Zaheduzzaman Sarker">
	<organization>Nokia</organization>
	</author>
	<author initials="K." surname="Yao" fullname="Kehan Yao">
	<organization>China Mobile</organization>
	</author>
	<date year="2026" month="May"/>
	</front>
	<seriesInfo name="Internet-Draft" value="draft-agentic-ai-usecases-requirements-00"/>
	</reference>

	<reference anchor="IETF126-AGENTPROTO" target="https://datatracker.ietf.org/meeting/126/session/agentproto">
	<front>
	<title>Agent Communication Protocols (agentproto) -- WG-Forming BoF, IETF 126</title>
	<author>
	<organization>IETF</organization>
	</author>
	<date year="2026" month="July"/>
	</front>
	</reference>

	<reference anchor="CWE-636" target="https://cwe.mitre.org/data/definitions/636.html">
	<front>
	<title>CWE-636: Not Failing Securely (Fail Open)</title>
	<author>
	<organization>MITRE</organization>
	</author>
	<date year="2026"/>
	</front>
	</reference>

	<reference anchor="CCS-PYPI" target="https://pypi.org/project/ccs-verifier/">
	<front>
	<title>ccs-verifier 1.1.0 -- PyPI</title>
	<author initials="G." surname="Wang" fullname="Guigui Wang">
	</author>
	<date year="2026"/>
	</front>
	</reference>

	</references>

	<section title="CCS v1.1 Receipt Field Summary Table" anchor="sect-a">
	<figure anchor="le-4"><artwork><![CDATA[
+==+====================+=======+=====+===========+======+============+
|# |Field               |Type   |Level|Status     |Signed|Description |
+==+====================+=======+=====+===========+======+============+
|1 |trace_id            |16-char|0    |Implemented|Yes   |Unique event|
|  |                    |hex    |     |           |      |identifier  |
+--+--------------------+-------+-----+-----------+------+------------+
|2 |verdict             |enum   |0    |Implemented|Yes   |allow / deny|
|  |                    |string |     |           |      |/ escalate  |
+--+--------------------+-------+-----+-----------+------+------------+
|3 |timestamp           |float  |0    |Implemented|Yes   |Verification|
|  |                    |       |     |           |      |time        |
+--+--------------------+-------+-----+-----------+------+------------+
|4 |tool                |string |0    |Implemented|Yes   |Tool name   |
+--+--------------------+-------+-----+-----------+------+------------+
|5 |params_hash         |16-char|0    |Implemented|Yes   |SHA-256 of  |
|  |                    |hex    |     |           |      |params      |
+--+--------------------+-------+-----+-----------+------+------------+
|6 |rule_summary        |string |0    |Implemented|Yes   |Pipe-delimited|
|  |                    |       |     |           |      |rule results|
+--+--------------------+-------+-----+-----------+------+------------+
|7 |receipt             |hex    |0    |Implemented|N/A   |Ed25519 /   |
|  |                    |       |     |           |      |HMAC sig    |
+--+--------------------+-------+-----+-----------+------+------------+
|8 |verified_at         |float  |0    |Implemented|No    |Verification|
|  |                    |       |     |           |      |timestamp   |
+--+--------------------+-------+-----+-----------+------+------------+
|9 |block_reason        |string |0    |Implemented|No    |Deny reason |
+--+--------------------+-------+-----+-----------+------+------------+
|10|request_hash        |hex    |1    |Implemented|Yes   |SHA-256 of  |
|  |                    |string |     |           |      |full request|
+--+--------------------+-------+-----+-----------+------+------------+
|11|config_hash         |hex    |1    |Implemented|Yes   |SHA-256 of  |
|  |                    |string |     |           |      |config      |
+--+--------------------+-------+-----+-----------+------+------------+
|12|response_hash       |hex    |2    |Implemented|Post  |SHA-256 of  |
|  |                    |string |     |           |      |response    |
+--+--------------------+-------+-----+-----------+------+------------+
|13|runtime_context_hash|hex    |2    |Implemented|Yes   |SHA-256 of  |
|  |                    |string |     |           |      |runtime ctx |
+--+--------------------+-------+-----+-----------+------+------------+
|14|action              |string |2    |Implemented|Yes   |CAID action |
|  |                    |       |     |           |      |identifier  |
+--+--------------------+-------+-----+-----------+------+------------+
|15|issuer              |URI    |2    |Implemented|Yes   |Verifier ID |
|  |                    |string |     |           |      |            |
+--+--------------------+-------+-----+-----------+------+------------+
|16|audience            |URI    |2    |Implemented|Yes   |Consumer ID |
|  |                    |string |     |           |      |            |
+--+--------------------+-------+-----+-----------+------+------------+
|17|nonce               |hex    |2    |Implemented|Yes   |Anti-replay |
|  |                    |string |     |           |      |            |
+--+--------------------+-------+-----+-----------+------+------------+
|18|sequence            |integer|2    |Implemented|Yes   |Monotonic   |
|  |                    |       |     |           |      |counter     |
+--+--------------------+-------+-----+-----------+------+------------+
|19|issued_at           |float  |2    |Implemented|Yes   |Issue time  |
+--+--------------------+-------+-----+-----------+------+------------+
|20|expires_at          |float  |2    |Implemented|Yes   |Expiry time |
+--+--------------------+-------+-----+-----------+------+------------+
|21|max_clock_skew      |float  |2    |Implemented|Yes   |Clock skew  |
|  |                    |       |     |           |      |tolerance   |
+--+--------------------+-------+-----+-----------+------+------------+
|22|rule_version        |string |3    |Impl(v1.1) |Yes   |Rule version|
+--+--------------------+-------+-----+-----------+------+------------+
|23|tool_call_id        |UUID   |3    |Impl(v1.1) |Yes   |Tool call ID|
+--+--------------------+-------+-----+-----------+------+------------+
|24|args_digest         |hex    |3    |Impl(v1.1) |Yes   |Exec args   |
|  |                    |string |     |           |      |digest      |
+--+--------------------+-------+-----+-----------+------+------------+
]]></artwork>
	</figure>
	</section>

	<section title="Conformance Test Vector Format" anchor="sect-b">
	<t>Each conformance test vector is encoded as a JSON object:</t>
	<figure><artwork><![CDATA[
{
  "vector_id": "CV-001",
  "description": "Basic ALLOW receipt verification",
  "level": 0,
  "category": "positive",
  "input": {
    "command": {
      "agent_id": "test-agent",
      "tool": "search_web",
      "params": {"query": "weather in Tokyo"},
      "timestamp": 1722384000.0,
      "trace_id": "0000000000000001"
    },
    "rules": ["ssrf_protection", "rce_protection", "credential_leak"],
    "signing_key_hex": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f"
  },
  "expected": {
    "verdict": "allow",
    "block_reason": "",
    "receipt_valid": true,
    "rule_summary_pattern": "ssrf_protection=allow|rce_protection=allow|credential_leak=allow"
  }
}

For negative test vectors:

{
  "vector_id": "NV-001",
  "description": "Changed arguments detected by params_hash mismatch",
  "level": 0,
  "category": "negative",
  "attack": {
    "type": "changed_arguments",
    "modification": "params changed"
  },
  "expected": {
    "detection_point": "params_hash mismatch",
    "verdict": "deny",
    "binding_defeated_if_removed": "params_hash (Section 5.5)"
  }
}
]]></artwork>
	</figure>
	</section>

	</back>

	</rfc>
