<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE rfc>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-wang-jep-conformance-02" category="exp" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <front>
    <title abbrev="JEP Conformance">JEP Conformance and Test Suite</title>
    <seriesInfo name="Internet-Draft" value="draft-wang-jep-conformance-02"/>
    <author initials="Y." surname="Wang" fullname="Yuqiang Wang">
      <organization/>
      <address>
        <email>signal@humanjudgment.org</email>
        <uri>https://github.com/hjs-spec</uri>
      </address>
    </author>
    <date year="2026" month="September" day="30"/>
    <keyword>JEP</keyword>
    <keyword>conformance</keyword>
    <keyword>interoperability</keyword>
    <keyword>test vectors</keyword>
    <keyword>judgment events</keyword>
    <abstract>
      <t>This document defines conformance classes, validation-result structure, schema requirements, test-vector categories, conformance assertions, reference-validator behavior, implementation disclosure, and interoperability testing guidance for the Judgment Event Protocol (JEP). It is a companion to JEP-Core 0.7.</t>
      <t>This document does not redefine JEP-Core semantics. Its purpose is to make JEP-Core 0.7 implementations testable and interoperable across languages, platforms, trust profiles, and deployment environments. Conformance artifacts described by this document are derived from applicable normative specifications; tests, schemas, examples, and reference implementations do not independently create JEP-Core semantics.</t>
    </abstract>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>JEP-Core <xref target="JEP"/> defines the signed event object, J/D/T/V event semantics, stable Event Identity, Event Hash semantics, validation modes, independent validation checks, extension processing, and idempotent acceptance requirements.</t>
      <t>This document defines how implementations demonstrate conformance to those requirements. It retains the independent-check conformance model introduced for JEP-Core 0.7 and makes the relationship between normative specifications, executable assertions, test artifacts, and reference implementations explicit.</t>
      <t>Conformance does not mean that an implementation has made a legal, policy, factual, authorization, causal, or external-target determination. It means that the implementation processes JEP events according to the declared JEP-Core version, validation mode, conformance class, explicitly active profiles, and applicable normative requirements.</t>
      <t>Where this document and JEP-Core conflict, JEP-Core controls.</t>
      <section anchor="normative-precedence">
        <name>Normative Precedence and Derived Artifacts</name>
        <t>JEP-Core is the normative source for JEP-Core semantics. This document defines conformance structures and testing conventions for evaluating those semantics; it does not independently redefine JEP-Core.</t>
        <t>Schemas, conformance assertions, test vectors, executable test suites, examples, reference implementations, command-line tools, generated reports, and interoperability reports are derived artifacts.</t>
        <t>A derived artifact MUST NOT introduce a JEP-Core normative requirement that is absent from the applicable normative specification. A derived artifact MAY encode, exercise, or operationalize an existing normative requirement.</t>
        <t>A test assertion SHOULD identify the normative specification source from which its expected behavior is derived.</t>
        <t>A reference implementation MUST NOT be treated as an independent source of JEP-Core semantics. Where a derived artifact conflicts with the applicable normative specification, the normative specification controls.</t>
        <t>Implementation behavior, even when shared by multiple implementations, does not by itself create a new JEP-Core requirement. Profile-specific behavior is normative only within the explicitly selected profile or profile composition that defines that behavior.</t>
      </section>
    </section>
    <section anchor="requirements-language">
      <name>Requirements Language</name>
      <t>The key words <bcp14>MUST</bcp14>, <bcp14>MUST NOT</bcp14>, <bcp14>REQUIRED</bcp14>, <bcp14>SHALL</bcp14>, <bcp14>SHALL NOT</bcp14>, <bcp14>SHOULD</bcp14>, <bcp14>SHOULD NOT</bcp14>, <bcp14>RECOMMENDED</bcp14>, <bcp14>NOT RECOMMENDED</bcp14>, <bcp14>MAY</bcp14>, and <bcp14>OPTIONAL</bcp14> in this document are to be interpreted as described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they appear in all capitals, as shown here.</t>
    </section>
    <section anchor="conformance-model">
      <name>Conformance Model</name>
      <section anchor="independent-checks">
        <name>Independent Checks</name>
        <t>JEP-Core 0.7 does not define cumulative validation levels. A conforming validator reports independent checks.</t>
        <t>Core-defined checks are:</t>
        <ul spacing="normal">
          <li>
            <t>
              <tt>syntax</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>cryptographic</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>event_identity</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>reference_integrity</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>extension_processing</tt>
            </t>
          </li>
        </ul>
        <t>Trust- or acceptance-profile checks include:</t>
        <ul spacing="normal">
          <li>
            <t>
              <tt>actor_binding</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>freshness</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>audience</tt>
            </t>
          </li>
        </ul>
        <t>Companion or external checks include:</t>
        <ul spacing="normal">
          <li>
            <t>
              <tt>chain_integrity</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>policy</tt>
            </t>
          </li>
        </ul>
        <t>A check status is one of:</t>
        <ul spacing="normal">
          <li>
            <t>
              <tt>pass</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>fail</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>not_checked</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>not_applicable</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>unsupported</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>indeterminate</tt>
            </t>
          </li>
        </ul>
        <t>An implementation <bcp14>MUST NOT</bcp14> report an unperformed check as <tt>pass</tt>.</t>
        <t>An implementation <bcp14>MUST NOT</bcp14> convert <tt>unsupported</tt>, <tt>indeterminate</tt>, or <tt>not_checked</tt> into <tt>pass</tt> merely to produce a successful overall result.</t>
      </section>
      <section anchor="overall-status">
        <name>Overall Status</name>
        <t>For the requested validation mode and active profile set, the overall status is one of:</t>
        <ul spacing="normal">
          <li>
            <t>
              <tt>valid</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>invalid</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>indeterminate</tt>
            </t>
          </li>
        </ul>
        <t><tt>valid</tt> means that all checks required by the active validation context passed or were not applicable.</t>
        <t><tt>invalid</tt> means that at least one required check failed.</t>
        <t><tt>indeterminate</tt> means that no required check failed, but at least one required check could not produce a determinate result because it was unsupported, lacked required evidence or state, or otherwise remained indeterminate.</t>
        <t>Checks not required by the requested mode or active profile set <bcp14>MAY</bcp14> be <tt>not_checked</tt>.</t>
        <t>A successful <tt>cryptographic</tt> check alone <bcp14>MUST NOT</bcp14> cause the overall result to be <tt>valid</tt> when another required check has failed or is indeterminate.</t>
      </section>
      <section anchor="validation-modes">
        <name>Validation Modes</name>
        <t>The initial validation modes are:</t>
        <ul spacing="normal">
          <li>
            <t>
              <tt>archival</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>acceptance</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>chain</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>policy</tt>
            </t>
          </li>
        </ul>
        <t>Archival validation is repeatable and <bcp14>MUST NOT</bcp14> consume acceptance state.</t>
        <t>Acceptance validation includes JEP-Core Event Identity and idempotent acceptance semantics plus any profile-required actor-binding, freshness, audience, challenge, or equivalent checks.</t>
        <t>Chain and policy modes invoke companion or external semantics. A Core implementation <bcp14>MUST NOT</bcp14> present a chain or policy result as an intrinsic JEP-Core property.</t>
        <t>When profile selection is governed by the JEP profile model <xref target="JEP-PROFILES"/>, the active profile set for a validation operation <bcp14>MUST</bcp14> be explicit. A validator <bcp14>MUST NOT</bcp14> silently substitute a different profile merely because validation under the explicitly selected profile failed.</t>
      </section>
    </section>
    <section anchor="conformance-classes">
      <name>Conformance Classes</name>
      <section anchor="producer">
        <name>JEP-Core-0.7 Producer</name>
        <t>A producer conforms to JEP-Core-0.7 Producer if it supports:</t>
        <ul spacing="normal">
          <li>
            <t>I-JSON-compatible event construction as defined by <xref target="RFC7493"/>;</t>
          </li>
          <li>
            <t>a stable <tt>id</tt> for each event instance;</t>
          </li>
          <li>
            <t>all required top-level Core members;</t>
          </li>
          <li>
            <t>J/D/T/V verb-specific Core requirements;</t>
          </li>
          <li>
            <t>JCS canonicalization of the unsigned event as defined by <xref target="RFC8785"/>;</t>
          </li>
          <li>
            <t>signature generation under at least one declared signature conformance class;</t>
          </li>
          <li>
            <t>algorithm-tagged digest strings;</t>
          </li>
          <li>
            <t><tt>ext</tt> and <tt>ext_crit</tt> semantics.</t>
          </li>
        </ul>
        <t>A conforming producer <bcp14>MUST NOT</bcp14> reuse one Event Identity <tt>(who,id)</tt> for different unsigned event content.</t>
        <t>A producer <bcp14>MUST NOT</bcp14> present Event Hash as the stable Event Identity.</t>
      </section>
      <section anchor="verifier">
        <name>JEP-Core-0.7 Verifier</name>
        <t>A verifier conforms to JEP-Core-0.7 Verifier if it supports:</t>
        <ul spacing="normal">
          <li>
            <t>duplicate JSON member rejection;</t>
          </li>
          <li>
            <t>Core field and verb-specific validation;</t>
          </li>
          <li>
            <t>Event Identity validation;</t>
          </li>
          <li>
            <t>JCS canonicalization as defined by <xref target="RFC8785"/>;</t>
          </li>
          <li>
            <t>signature verification under at least one declared signature conformance class, using <xref target="RFC7515"/> where that class is JWS-based;</t>
          </li>
          <li>
            <t>Event Hash calculation;</t>
          </li>
          <li>
            <t>independent validation checks;</t>
          </li>
          <li>
            <t>structured validation-result objects;</t>
          </li>
          <li>
            <t>unknown critical-extension rejection;</t>
          </li>
          <li>
            <t>archival validation mode.</t>
          </li>
        </ul>
        <t>A Core verifier <bcp14>MUST NOT</bcp14> require an optional identity, credential, attestation, blockchain, AI-platform, agent-framework, challenge, transport, chain, policy, archival, or vendor-specific profile for Core conformance.</t>
        <t>A verifier <bcp14>MUST NOT</bcp14> claim a check passed if the operation represented by that check was not performed.</t>
      </section>
      <section anchor="acceptance-processor">
        <name>JEP-Core-0.7 Acceptance Processor</name>
        <t>An implementation claiming JEP-Core-0.7 Acceptance Processor conformance MUST additionally support:</t>
        <ul spacing="normal">
          <li>
            <t>a stable acceptance-domain definition;</t>
          </li>
          <li>
            <t>detection of conflicting Event Identity reuse;</t>
          </li>
          <li>
            <t>sufficient acceptance state for the claimed acceptance lifetime;</t>
          </li>
          <li>
            <t>atomic or equivalent first-acceptance processing;</t>
          </li>
          <li>
            <t><tt>accepted</tt>, <tt>already_accepted</tt>, <tt>rejected</tt>, and <tt>indeterminate</tt> outcomes;</t>
          </li>
          <li>
            <t>separation of repeated valid delivery from invalid event content.</t>
          </li>
        </ul>
        <t>The same Event Identity <bcp14>MUST NOT</bcp14> apply the same acceptance effect more than once within one acceptance domain.</t>
        <t>A repeated valid event <bcp14>MUST NOT</bcp14> be converted into a cryptographic or syntax failure solely because it was previously accepted.</t>
        <t>If the processor cannot reliably determine whether an Event Identity has already produced the protected effect, it <bcp14>MUST NOT</bcp14> claim a fresh <tt>accepted</tt> outcome.</t>
      </section>
      <section anchor="extension-processor">
        <name>JEP-Extension-0.7 Processor</name>
        <t>An extension processor conforms to JEP-Extension-0.7 Processor if it can:</t>
        <ul spacing="normal">
          <li>
            <t>locate extension objects under <tt>ext</tt>;</t>
          </li>
          <li>
            <t>process identifiers named by <tt>ext_crit</tt>;</t>
          </li>
          <li>
            <t>fail <tt>extension_processing</tt> for unknown critical extensions;</t>
          </li>
          <li>
            <t>ignore unknown non-critical extensions where Core permits this;</t>
          </li>
          <li>
            <t>detect conflicting critical extensions;</t>
          </li>
          <li>
            <t>preserve JEP-Core member semantics.</t>
          </li>
        </ul>
        <t>An implementation <bcp14>MUST NOT</bcp14> treat an unknown critical extension as a warning while continuing to report the applicable <tt>extension_processing</tt> requirement as successful.</t>
      </section>
      <section anchor="baseline">
        <name>JEP-Baseline-Ed25519-JWS-JCS-0.7</name>
        <t>This document defines an interoperable baseline conformance class named <tt>JEP-Baseline-Ed25519-JWS-JCS-0.7</tt>.</t>
        <t>It requires:</t>
        <ul spacing="normal">
          <li>
            <t>I-JSON-compatible JSON as defined by <xref target="RFC7493"/>;</t>
          </li>
          <li>
            <t>JCS canonicalization as defined by <xref target="RFC8785"/>;</t>
          </li>
          <li>
            <t>detached JWS Compact Serialization as defined by <xref target="RFC7515"/>;</t>
          </li>
          <li>
            <t>the fully specified JOSE <tt>alg</tt> value <tt>Ed25519</tt> defined by <xref target="RFC9864"/>;</t>
          </li>
          <li>
            <t>Ed25519 signature processing as defined by <xref target="RFC8032"/>;</t>
          </li>
          <li>
            <t>algorithm-tagged <tt>sha256</tt> digest strings;</t>
          </li>
          <li>
            <t>Event Hash calculation over the full signed event object including <tt>sig</tt>.</t>
          </li>
        </ul>
        <t>For this baseline, the JWS Payload is exactly the JEP Signing Payload: the UTF-8 octets of the RFC 8785 JCS-canonicalized unsigned event.</t>
        <t>The protected JOSE header MUST contain:</t>
        <sourcecode type="json"><![CDATA[{
  "alg": "Ed25519"
}]]></sourcecode>
        <t>A <tt>kid</tt> parameter <bcp14>MAY</bcp14> be present. If present, <tt>kid</tt> <bcp14>MUST</bcp14> be carried in the protected header. Additional protected parameters <bcp14>MAY</bcp14> be present when allowed by the active trust profile. A verifier <bcp14>MUST</bcp14> process every critical JOSE header parameter that it is required to understand under <xref target="RFC7515"/>.</t>
        <t>This baseline uses the ordinary base64url-encoded JWS Payload semantics of <xref target="RFC7515"/>. Producers <bcp14>MUST NOT</bcp14> use <tt>b64:false</tt> for this conformance class.</t>
        <t>The JWS Signing Input is exactly:</t>
        <sourcecode><![CDATA[ASCII(
  BASE64URL(UTF8(JWS Protected Header))
  || "."
  || BASE64URL(JEP Signing Payload)
)]]></sourcecode>
        <t>The top-level JEP sig member MUST contain the detached JWS Compact Serialization form:</t>
        <sourcecode><![CDATA[BASE64URL(UTF8(JWS Protected Header))
|| ".."
|| BASE64URL(JWS Signature)]]></sourcecode>
        <t>The middle payload segment is empty only in the transmitted detached serialization. During verification, the verifier reconstructs the signing input using the exact JEP Signing Payload. Base64url segments MUST use the RFC 7515 encoding rules, including omission of = padding and absence of whitespace.</t>
        <t>The JWS Compact Serialization has no unprotected JOSE header. This baseline therefore does not permit security-relevant signature parameters to be carried outside the protected header.</t>
        <t>Conformance vectors for this baseline MUST publish:</t>
        <ul spacing="normal">
          <li>
            <t>the complete unsigned event;</t>
          </li>
          <li>
            <t>the exact JEP Signing Payload bytes, encoded in a transport-safe form;</t>
          </li>
          <li>
            <t>the protected-header JSON;</t>
          </li>
          <li>
            <t>the protected-header base64url segment;</t>
          </li>
          <li>
            <t>the detached <tt>sig</tt> string;</t>
          </li>
          <li>
            <t>the resulting full signed event;</t>
          </li>
          <li>
            <t>the Event Hash;</t>
          </li>
          <li>
            <t>the expected validation result.</t>
          </li>
        </ul>
        <t>A producer is not required to serialize semantically equivalent protected-header JSON into identical bytes outside a vector that explicitly claims byte-for-byte reproduction. A verifier MUST verify the exact protected-header segment carried by the JWS.</t>
        <t>This baseline is a conformance-class requirement, not a restriction on JEP-Core algorithm agility.</t>
      </section>
      <section anchor="profile-specific">
        <name>Profile-Specific Conformance</name>
        <t>A profile MAY define additional conformance classes. Such classes MUST state:</t>
        <ul spacing="normal">
          <li>
            <t>which validation checks are required;</t>
          </li>
          <li>
            <t>which checks are optional;</t>
          </li>
          <li>
            <t>which identifiers, credentials, attestations, or evidence are required;</t>
          </li>
          <li>
            <t>which algorithms are accepted or prohibited;</t>
          </li>
          <li>
            <t>whether freshness, audience, challenge-response, nonce, counter, sequence, transaction, ledger, or other replay-related mechanisms are required;</t>
          </li>
          <li>
            <t>how unsupported or indeterminate evidence is reported;</t>
          </li>
          <li>
            <t>any acceptance-domain requirements.</t>
          </li>
        </ul>
        <t>Profiles MUST NOT redefine JEP-Core Event Identity, Event Hash, J/D/T/V, signing-payload, or Core check semantics.</t>
        <t>When an implementation claims conformance to the explicit profile-selection model defined by <xref target="JEP-PROFILES"/>, failure under one explicitly selected profile <bcp14>MUST NOT</bcp14> cause a verifier or test harness to silently retry another profile and report success under the original validation request.</t>
      </section>
      <section anchor="historical-decoder">
        <name>Historical Decoder Capability</name>
        <t>Support for JEP encodings predating Core -07 is OPTIONAL and is not part of JEP-Core-0.7 conformance.</t>
        <t>An implementation advertising a historical decoder MUST name that decoder explicitly. It MUST NOT select a historical decoder by first failing JEP-Core 0.7 validation and then inferring an older draft format solely from field presence.</t>
        <t>Historical signed events MUST NOT be rewritten or silently upgraded.</t>
      </section>
    </section>
    <section anchor="validation-result">
      <name>Validation Result Object</name>
      <t>A conforming verifier SHOULD return a structured validation result.</t>
      <section anchor="valid-archival">
        <name>Valid Archival Example</name>
        <sourcecode type="json"><![CDATA[{
  "status": "valid",
  "mode": "archival",
  "profile": "jep-core-0.7",
  "conformance_class": "JEP-Core-0.7 Verifier",
  "event_identity": {
    "who": "did:example:agent-789",
    "id": "urn:uuid:018f4f8d-7c63-7c2e-9b43-4ef657eec1c0"
  },
  "event_hash": "sha256:...",
  "checks": {
    "syntax": "pass",
    "cryptographic": "pass",
    "actor_binding": "not_checked",
    "freshness": "not_checked",
    "audience": "not_checked",
    "event_identity": "pass",
    "reference_integrity": "not_applicable",
    "extension_processing": "pass",
    "chain_integrity": "not_checked",
    "policy": "not_checked"
  },
  "warnings": [],
  "errors": []
}]]></sourcecode>
      </section>
      <section anchor="safe-retry-example">
        <name>Safe Retry Example</name>
        <sourcecode type="json"><![CDATA[{
  "status": "valid",
  "mode": "acceptance",
  "profile": "jep-core-0.7",
  "event_identity": {
    "who": "did:example:agent-789",
    "id": "urn:uuid:018f4f8d-7c63-7c2e-9b43-4ef657eec1c0"
  },
  "event_hash": "sha256:...",
  "checks": {
    "syntax": "pass",
    "cryptographic": "pass",
    "event_identity": "pass"
  },
  "acceptance": {
    "outcome": "already_accepted",
    "effect_applied": false
  },
  "warnings": [],
  "errors": []
}]]></sourcecode>
      </section>
      <section anchor="signature-failure">
        <name>Signature Failure Example</name>
        <sourcecode type="json"><![CDATA[{
  "status": "invalid",
  "mode": "archival",
  "profile": "jep-core-0.7",
  "event_identity": {
    "who": "did:example:agent-789",
    "id": "urn:uuid:018f4f8d-7c63-7c2e-9b43-4ef657eec1c0"
  },
  "event_hash": null,
  "checks": {
    "syntax": "pass",
    "cryptographic": "fail",
    "event_identity": "not_checked",
    "reference_integrity": "not_checked",
    "extension_processing": "not_checked"
  },
  "warnings": [],
  "errors": [
    {
      "code": "ERR_SIGNATURE_INVALID",
      "check": "cryptographic",
      "message": "The signature does not verify over the JEP Signing Payload."
    }
  ]
}]]></sourcecode>
      </section>
      <section anchor="result-requirements">
        <name>Result Requirements</name>
        <t>A conformance result object MUST distinguish:</t>
        <ul spacing="normal">
          <li>
            <t>overall <tt>status</tt>;</t>
          </li>
          <li>
            <t>requested <tt>mode</tt>;</t>
          </li>
          <li>
            <t>active profile or explicitly selected profile set;</t>
          </li>
          <li>
            <t>Event Identity when available;</t>
          </li>
          <li>
            <t>Event Hash when calculated;</t>
          </li>
          <li>
            <t>independent checks;</t>
          </li>
          <li>
            <t>acceptance outcome when acceptance mode produces an outcome;</t>
          </li>
          <li>
            <t>warnings;</t>
          </li>
          <li>
            <t>errors.</t>
          </li>
        </ul>
        <t>The <tt>event_identity</tt> member reports the <tt>(who,id)</tt> values asserted by the parsed event. Its presence does not by itself establish signature validity, actor binding, authority, freshness, or non-conflicting historical use of that Event Identity.</t>
        <t>The <tt>event_identity</tt> check reports only the JEP-Core Event Identity checks actually performed, including conflicting reuse detection when identity state is available. It <bcp14>MUST NOT</bcp14> be used as a substitute for <tt>cryptographic</tt> or <tt>actor_binding</tt>.</t>
        <t>Similarly, an <tt>event_hash</tt> member reports the digest calculated for an exact signed artifact. Its presence does not establish actor binding, substantive truth, authorization, policy acceptance, or external effect.</t>
        <t>An error object SHOULD contain a JEP failure code, the associated check when applicable, and an explanatory message.</t>
        <t>A result <bcp14>MUST NOT</bcp14> contain a cumulative validation level.</t>
      </section>
      <section anchor="acceptance-consistency">
        <name>Acceptance Outcome Consistency</name>
        <t>When mode is acceptance, the result MUST contain an acceptance object once the acceptance processor has produced an outcome. The outcome and overall status MUST be consistent as follows:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Acceptance outcome</th>
              <th align="left">Overall status</th>
              <th align="left">effect_applied</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">accepted</td>
              <td align="left">valid</td>
              <td align="left">true</td>
            </tr>
            <tr>
              <td align="left">already_accepted</td>
              <td align="left">valid</td>
              <td align="left">false</td>
            </tr>
            <tr>
              <td align="left">rejected</td>
              <td align="left">invalid</td>
              <td align="left">false</td>
            </tr>
            <tr>
              <td align="left">indeterminate</td>
              <td align="left">indeterminate</td>
              <td align="left">false</td>
            </tr>
          </tbody>
        </table>
        <t>accepted means all checks required by the active acceptance context passed or were not applicable and the acceptance effect is applied for the first time.</t>
        <t>already_accepted means the event is valid for the active acceptance context but the same Event Identity has already applied that effect in the same acceptance domain.</t>
        <t>rejected means at least one required validation check failed.</t>
        <t>indeterminate means no required validation check failed, but the acceptance processor could not complete a required determination because required evidence, implementation support, durable state, or atomicity guarantees were unavailable.</t>
        <t>effect_applied MUST be true only for accepted. A verifier MUST NOT report already_accepted as a cryptographic or syntax failure.</t>
        <t>For non-acceptance modes, the acceptance member SHOULD be absent unless a companion result format explicitly carries a separately labeled acceptance observation.</t>
      </section>
    </section>
    <section anchor="json-schema">
      <name>JSON Schema Requirements</name>
      <t>The conformance suite SHOULD provide:</t>
      <ul spacing="normal">
        <li>
          <t>
            <tt>jep-event-0.7.schema.json</tt>
          </t>
        </li>
        <li>
          <t>
            <tt>jep-ref-0.7.schema.json</tt>
          </t>
        </li>
        <li>
          <t>
            <tt>jep-extension-0.7.schema.json</tt>
          </t>
        </li>
        <li>
          <t>
            <tt>jep-validation-result-0.7.schema.json</tt>
          </t>
        </li>
        <li>
          <t>schemas for any baseline signature or profile objects defined by the suite</t>
        </li>
      </ul>
      <t>JSON Schema validation does not prove cryptographic validity, actor binding, freshness, reference resolution, policy compliance, or external truth. Duplicate-member rejection occurs before ordinary parsed-object schema validation.</t>
      <t>Schemas are derived artifacts. A schema MUST NOT intentionally impose a JEP-Core requirement absent from JEP-Core. Where a schema and the applicable normative specification conflict, the normative specification controls.</t>
      <section anchor="minimal-schema">
        <name>Minimal Event Schema Seed</name>
        <t>The following schema is a structural seed. It intentionally does not attempt to encode every JEP semantic rule.</t>
        <sourcecode type="json"><![CDATA[{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://jep.org/schemas/jep-event-0.7.schema.json",
  "title": "JEP-Core 0.7 Event",
  "type": "object",
  "required": [
    "jep",
    "id",
    "verb",
    "who",
    "when",
    "what",
    "sig"
  ],
  "properties": {
    "jep": {
      "type": "string",
      "const": "1"
    },
    "id": {
      "type": "string",
      "minLength": 1,
      "description": "Non-empty ASCII Event ID; semantic validation is performed by the Core validator."
    },
    "verb": {
      "type": "string",
      "enum": [
        "J",
        "D",
        "T",
        "V"
      ]
    },
    "who": {
      "type": "string",
      "minLength": 1
    },
    "when": {
      "type": "integer"
    },
    "what": {},
    "aud": {},
    "ref": {
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "object"
        }
      ]
    },
    "ext": {
      "type": "object"
    },
    "ext_crit": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "uniqueItems": true
    },
    "sig": {
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "object"
        }
      ]
    }
  },
  "allOf": [
    {
      "if": {
        "properties": {
          "verb": {
            "const": "D"
          }
        }
      },
      "then": {
        "properties": {
          "what": {
            "type": "object",
            "required": [
              "delegatee",
              "scope"
            ]
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "verb": {
            "const": "T"
          }
        }
      },
      "then": {
        "required": [
          "ref"
        ],
        "properties": {
          "what": {
            "type": "object",
            "required": [
              "termination_scope"
            ]
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "verb": {
            "const": "V"
          }
        }
      },
      "then": {
        "required": [
          "ref"
        ],
        "properties": {
          "what": {
            "type": "object",
            "required": [
              "verification_scope",
              "result"
            ]
          }
        }
      }
    }
  ]
}]]></sourcecode>
        <t>The schema does not make nonce a Core field. A nonce or equivalent mechanism MAY appear in a registered extension, profile-defined object, transport binding, or other non-Core layer.</t>
      </section>
      <section anchor="typed-ref">
        <name>Typed JEP Event Reference Seed</name>
        <t>A logical JEP event reference SHOULD use Event Identity:</t>
        <sourcecode type="json"><![CDATA[{
  "type": "jep:event",
  "value": {
    "who": "did:example:actor-123",
    "id": "urn:uuid:018f4f8d-7c63-7c2e-9b43-4ef657eec1c0"
  }
}]]></sourcecode>
        <t>An exact signed artifact MAY additionally be pinned:</t>
        <sourcecode type="json"><![CDATA[{
  "type": "jep:event",
  "value": {
    "who": "did:example:actor-123",
    "id": "urn:uuid:018f4f8d-7c63-7c2e-9b43-4ef657eec1c0"
  },
  "hash": "sha256:..."
}]]></sourcecode>
        <t>The value identifies the logical event. The optional hash identifies one exact signed artifact. Event Hash MUST NOT replace Event Identity where logical event identity is required.</t>
      </section>
    </section>
    <section anchor="validation-flow">
      <name>Reference Validation Flow</name>
      <t>A reference validator SHOULD process an event in an order equivalent to:</t>
      <sourcecode><![CDATA[validate_event(event, mode, active_profiles, acceptance_domain=None):
    parse JSON
    reject duplicate member names
    validate 0.7 Core shape
    validate J/D/T/V Core requirements
    unsigned = event without sig
    signing_payload = UTF8(JCS(unsigned))
    verify signature under the active signature profile
    compute Event Hash when needed
    evaluate Event Identity consistency if identity state is available
    resolve actor/key and actor binding if required
    validate audience if required
    evaluate freshness if required
    validate reference syntax and exact-artifact pins if requested
    process critical extensions
    invoke chain checks only if requested from a companion chain system
    invoke policy checks only if requested from an external policy system
    if mode == acceptance:
        atomically determine and record the acceptance outcome
    return structured validation result]]></sourcecode>
      <t>An implementation MUST perform cryptographic validation before writing new authoritative Event Identity or acceptance state for untrusted input.</t>
      <t>When the active acceptance profile requires actor binding, an implementation MUST NOT commit authoritative Event Identity or acceptance state until actor_binding has passed.</t>
      <t>A verifier MUST NOT treat a transport retry as creation of a new event.</t>
      <t>A verifier operating under an explicit profile-selection model MUST NOT select a different trust or acceptance profile merely because validation under the explicitly active profile produced failure, unsupported, or indeterminate results.</t>
    </section>
    <section anchor="test-vectors">
      <name>Test Vector Categories</name>
      <section anchor="valid-vectors">
        <name>Valid Core Event Vectors</name>
        <t>The suite SHOULD include:</t>
        <ul spacing="normal">
          <li>
            <t>
              <tt>valid/J-basic.json</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>valid/D-basic.json</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>valid/T-basic.json</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>valid/V-basic.json</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>valid/event-reference-logical.json</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>valid/event-reference-exact-artifact.json</tt>
            </t>
          </li>
        </ul>
      </section>
      <section anchor="syntax-vectors">
        <name>Syntax and Core-Field Vectors</name>
        <t>The suite SHOULD include:</t>
        <ul spacing="normal">
          <li>
            <t>
              <tt>invalid/invalid-json.json</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>invalid/duplicate-member.json</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>invalid/missing-id.json</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>invalid/invalid-what.json</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>invalid/unknown-verb.json</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>invalid/invalid-timestamp.json</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>invalid/D-missing-delegatee.json</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>invalid/D-missing-scope.json</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>invalid/T-missing-ref.json</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>invalid/T-missing-termination-scope.json</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>invalid/V-missing-ref.json</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>invalid/V-missing-verification-scope.json</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>invalid/V-missing-result.json</tt>
            </t>
          </li>
        </ul>
      </section>
      <section anchor="crypto-vectors">
        <name>Cryptographic Vectors</name>
        <t>The suite SHOULD include:</t>
        <ul spacing="normal">
          <li>
            <t>
              <tt>invalid/invalid-signature.json</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>invalid/signature-over-wrong-payload.json</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>invalid/unsupported-signature-alg.json</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>invalid/prohibited-signature-alg.json</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>invalid/alg-key-type-mismatch.json</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>invalid/alg-profile-mismatch.json</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>invalid/canonicalization-failed.json</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>invalid/canonicalization-version-unsupported.json</tt>
            </t>
          </li>
        </ul>
      </section>
      <section anchor="identity-vectors">
        <name>Event Identity and Delivery Vectors</name>
        <t>Event Identity behavior is stateful. A single isolated JSON event cannot by itself demonstrate conflicting reuse or prior acceptance.</t>
        <t>The suite SHOULD therefore include stateful sequence manifests such as:</t>
        <ul spacing="normal">
          <li>
            <t>
              <tt>stateful/event-identity-retransmission.json</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>stateful/event-identity-resign-same-content.json</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>stateful/event-id-conflict.json</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>stateful/same-id-different-who.json</tt>
            </t>
          </li>
        </ul>
        <t>A stateful manifest SHOULD declare the identity or acceptance state visible to the harness, the ordered steps, and the expected result for each step.</t>
        <sourcecode type="json"><![CDATA[{
  "name": "event-id-conflict",
  "mode": "acceptance",
  "profile": "jep-core-0.7",
  "acceptance_domain": "example-domain-a",
  "initial_state": "empty",
  "steps": [
    {
      "input": "stateful/fixtures/J-first.json",
      "expected_status": "valid",
      "expected_checks": {
        "event_identity": "pass"
      },
      "expected_acceptance": {
        "outcome": "accepted",
        "effect_applied": true
      }
    },
    {
      "input": "stateful/fixtures/J-conflicting-reuse.json",
      "expected_status": "invalid",
      "expected_checks": {
        "event_identity": "fail"
      },
      "expected_error_codes": [
        "ERR_EVENT_ID_CONFLICT"
      ],
      "expected_acceptance": {
        "outcome": "rejected",
        "effect_applied": false
      }
    }
  ]
}]]></sourcecode>
        <t>The second event in the example uses the same (who,id) but different JCS-canonicalized unsigned event content.</t>
        <t>The suite SHOULD also verify:</t>
        <ul spacing="normal">
          <li>
            <t>retransmission of byte-identical signed content;</t>
          </li>
          <li>
            <t>re-signing of identical unsigned content with the same Event Identity;</t>
          </li>
          <li>
            <t>use of the same id string under a different who;</t>
          </li>
          <li>
            <t>conflicting reuse of one Event Identity with different unsigned content.</t>
          </li>
        </ul>
        <t>Conflicting reuse MUST produce ERR_EVENT_ID_CONFLICT. A valid repeated event MUST NOT be reported as a cryptographic failure.</t>
      </section>
      <section anchor="acceptance-vectors">
        <name>Acceptance Vectors</name>
        <t>Acceptance behavior is stateful. The suite SHOULD include:</t>
        <ul spacing="normal">
          <li>
            <t>
              <tt>stateful/accept-first.json</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>stateful/accept-safe-retry.json</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>stateful/accept-state-unavailable.json</tt>
            </t>
          </li>
          <li>
            <t>
              <tt>stateful/accept-atomicity-unavailable.json</tt>
            </t>
          </li>
          <li>
            <t>a concurrent first-delivery test</t>
          </li>
        </ul>
        <t>A safe-retry sequence SHOULD demonstrate that the first valid delivery yields accepted with effect_applied: true and a later valid delivery of the same Event Identity in the same acceptance domain yields already_accepted with effect_applied: false.</t>
        <t>If required acceptance state is unavailable, the result MUST NOT claim a fresh accepted outcome. It MUST be indeterminate or rejected when an active profile explicitly requires fail-closed rejection.</t>
        <t>If required atomicity cannot be provided, the implementation MUST NOT claim accepted. When represented as a JEP failure code, the suite SHOULD exercise ERR_ACCEPTANCE_ATOMICITY_UNAVAILABLE.</t>
        <t>The concurrent first-delivery test SHOULD submit multiple equivalent deliveries of the same Event Identity against one acceptance domain and assert that exactly one state-changing acceptance effect is applied. All other valid deliveries MUST be reported without a second effect, normally as already_accepted.</t>
        <t>Nonce, challenge, sequence-number, counter, ledger, or similar replay tests belong to the profile that requires that mechanism and MUST NOT be presented as universal JEP-Core requirements.</t>
      </section>
      <section anchor="reference-vectors">
        <name>Reference Vectors</name>
        <t>The suite SHOULD include:</t>
        <ul spacing="normal">
          <li>
            <t>logical Event Identity resolution;</t>
          </li>
          <li>
            <t>exact-artifact hash success;</t>
          </li>
          <li>
            <t>exact-artifact hash mismatch;</t>
          </li>
          <li>
            <t>Event Identity mismatch;</t>
          </li>
          <li>
            <t>unresolved references when a requested check requires resolution.</t>
          </li>
        </ul>
      </section>
      <section anchor="extension-vectors">
        <name>Extension Vectors</name>
        <t>The suite SHOULD include:</t>
        <ul spacing="normal">
          <li>
            <t>known critical extension success;</t>
          </li>
          <li>
            <t>unknown critical extension failure;</t>
          </li>
          <li>
            <t>unknown non-critical extension tolerance;</t>
          </li>
          <li>
            <t>extension schema failure;</t>
          </li>
          <li>
            <t>conflicting critical extensions.</t>
          </li>
        </ul>
        <t>A vector for an unknown critical extension MUST NOT expect extension_processing: pass. A test harness MUST NOT convert an unknown critical extension into a successful Core result merely because the implementation emitted only a warning.</t>
      </section>
      <section anchor="canonicalization-vectors">
        <name>Canonicalization and Hash Vectors</name>
        <t>The suite SHOULD include:</t>
        <ul spacing="normal">
          <li>
            <t>equivalent JSON inputs producing identical JCS bytes;</t>
          </li>
          <li>
            <t>UTF-16 property-order edge cases required by JCS;</t>
          </li>
          <li>
            <t>
              <tt>numeric serialization edge cases allowed by I-JSON/JCS;</tt>
            </t>
          </li>
          <li>
            <t>full signed Event Hash calculation;</t>
          </li>
          <li>
            <t>unsigned JEP Signing Payload calculation;</t>
          </li>
          <li>
            <t>proof that changing sig can change Event Hash without changing Event Identity.</t>
          </li>
        </ul>
      </section>
      <section anchor="companion-vectors">
        <name>Companion and External Check Vectors</name>
        <t>Chain and policy fixtures MAY be included for integration testing, but they MUST identify the companion profile, companion specification, or external evaluator that owns the semantics. They MUST NOT be labeled as Core-only conformance failures.</t>
        <t>External truth, legal effect, authority, policy, or causal conclusions MUST NOT be inferred solely from successful Core conformance.</t>
      </section>
      <section anchor="historical-vectors">
        <name>Historical Compatibility Vectors</name>
        <t>If a product advertises a historical pre--07 decoder, the suite SHOULD include:</t>
        <ul spacing="normal">
          <li>
            <t>explicit historical decoder selection;</t>
          </li>
          <li>
            <t>historical signature verification without rewriting bytes;</t>
          </li>
          <li>
            <t>refusal to silently fall back from 0.7 based solely on field presence.</t>
          </li>
        </ul>
        <t>The suite SHOULD include a case in which Core 0.7 validation fails but the harness MUST NOT automatically retry a historical decoder.</t>
      </section>
      <section anchor="profile-selection-vectors">
        <name>Profile Selection and Downgrade Vectors</name>
        <t>For implementations that claim the explicit profile-selection behavior defined by <xref target="JEP-PROFILES"/>, the suite <bcp14>SHOULD</bcp14> include:</t>
        <ul spacing="normal">
          <li>
            <t>explicit profile selection;</t>
          </li>
          <li>
            <t>unsupported explicitly selected profile;</t>
          </li>
          <li>
            <t>failed explicitly selected profile;</t>
          </li>
          <li>
            <t>multiple explicitly composed profiles where composition is defined;</t>
          </li>
          <li>
            <t>conflicting profile requirements;</t>
          </li>
          <li>
            <t>prohibited algorithm under the active profile;</t>
          </li>
          <li>
            <t>failure under one profile without silent fallback to another profile;</t>
          </li>
          <li>
            <t>event content that could heuristically suggest a different profile but for which that profile was not explicitly selected.</t>
          </li>
        </ul>
        <t>A conforming profile-aware verifier MUST NOT infer successful validation under a different profile merely because who resembles an identifier associated with that profile, a credential associated with another profile is present, aud resembles another deployment, a nonce-like or challenge-like extension is present, or the explicitly selected profile failed.</t>
        <t>A profile-selection test MUST identify the profile-selection input visible to the implementation. The suite MUST distinguish profile-selection behavior from JEP-Core event semantics.</t>
      </section>
    </section>
    <section anchor="seed-shapes">
      <name>Seed J/D/T/V Event Shapes</name>
      <t>The following examples use placeholder signatures. They are examples and are not substitutes for signed conformance vectors.</t>
      <section anchor="j-basic">
        <name>J-basic</name>
        <sourcecode type="json"><![CDATA[{
  "jep": "1",
  "id": "urn:uuid:018f4f8d-7c63-7c2e-9b43-4ef657eec1c0",
  "verb": "J",
  "who": "did:example:agent-789",
  "when": 1742345678,
  "what": {
    "claim": "approve-result"
  },
  "sig": "PLACEHOLDER_DETACHED_JWS"
}]]></sourcecode>
      </section>
      <section anchor="d-basic">
        <name>D-basic</name>
        <sourcecode type="json"><![CDATA[{
  "jep": "1",
  "id": "urn:uuid:018f4f8d-8ad2-7baf-b752-e529e79bc88a",
  "verb": "D",
  "who": "did:example:human-123",
  "when": 1742345681,
  "what": {
    "delegatee": "did:example:agent-789",
    "scope": "summarize-document",
    "constraints": [
      "no-external-send"
    ]
  },
  "sig": "PLACEHOLDER_DETACHED_JWS"
}]]></sourcecode>
      </section>
      <section anchor="t-basic">
        <name>T-basic</name>
        <sourcecode type="json"><![CDATA[{
  "jep": "1",
  "id": "urn:uuid:018f4f8d-91c1-7d50-8f7a-c7b0fd8d95d0",
  "verb": "T",
  "who": "did:example:human-123",
  "when": 1742345690,
  "what": {
    "termination_scope": "delegation"
  },
  "ref": {
    "type": "jep:event",
    "value": {
      "who": "did:example:human-123",
      "id": "urn:uuid:018f4f8d-8ad2-7baf-b752-e529e79bc88a"
    }
  },
  "sig": "PLACEHOLDER_DETACHED_JWS"
}]]></sourcecode>
      </section>
      <section anchor="v-basic">
        <name>V-basic</name>
        <sourcecode type="json"><![CDATA[{
  "jep": "1",
  "id": "urn:uuid:018f4f8d-a1d5-7633-9b6c-63d4928819e2",
  "verb": "V",
  "who": "did:example:verifier-123",
  "when": 1742345700,
  "what": {
    "verification_scope": "cryptographic",
    "result": "pass"
  },
  "ref": {
    "type": "jep:event",
    "value": {
      "who": "did:example:agent-789",
      "id": "urn:uuid:018f4f8d-7c63-7c2e-9b43-4ef657eec1c0"
    },
    "hash": "sha256:..."
  },
  "sig": "PLACEHOLDER_DETACHED_JWS"
}]]></sourcecode>
      </section>
    </section>
    <section anchor="assertions">
      <name>Conformance Test Assertions</name>
      <t>A stateless test assertion SHOULD name:</t>
      <ul spacing="normal">
        <li>
          <t>a stable assertion identifier;</t>
        </li>
        <li>
          <t>the input event;</t>
        </li>
        <li>
          <t>the requested validation mode;</t>
        </li>
        <li>
          <t>the explicitly active profile or profile set;</t>
        </li>
        <li>
          <t>the applicable normative source or sources;</t>
        </li>
        <li>
          <t>the expected overall status;</t>
        </li>
        <li>
          <t>the expected independent checks;</t>
        </li>
        <li>
          <t>expected warnings and errors;</t>
        </li>
        <li>
          <t>the expected Event Hash when applicable.</t>
        </li>
      </ul>
      <t>An assertion_id identifies an assertion within a conformance suite. An assertion identifier does not itself create a protocol requirement.</t>
      <t>An assertion SHOULD identify the normative specification section from which the expected behavior is derived.</t>
      <sourcecode type="json"><![CDATA[{
  "assertion_id": "JEP-A-SIG-004",
  "requirements": [
    {
      "document": "JEP-Core-0.7",
      "section": "Signing and Validation"
    }
  ],
  "name": "invalid-signature",
  "input": "invalid/invalid-signature.json",
  "mode": "archival",
  "profile": "jep-core-0.7",
  "expected_status": "invalid",
  "expected_checks": {
    "syntax": "pass",
    "cryptographic": "fail"
  },
  "expected_error_codes": [
    "ERR_SIGNATURE_INVALID"
  ]
}]]></sourcecode>
      <t>A stateful test MUST declare the state scope and ordered operations required to obtain the expected result. It SHOULD use an explicit steps array rather than imply state through a filename.</t>
      <sourcecode type="json"><![CDATA[{
  "assertion_id": "JEP-A-ACC-002",
  "requirements": [
    {
      "document": "JEP-Core-0.7",
      "section": "Idempotent Acceptance"
    }
  ],
  "name": "safe-retry",
  "mode": "acceptance",
  "profile": "jep-core-0.7",
  "acceptance_domain": "example-domain-a",
  "initial_state": "empty",
  "steps": [
    {
      "input": "stateful/fixtures/J-retry.json",
      "expected_status": "valid",
      "expected_acceptance": {
        "outcome": "accepted",
        "effect_applied": true
      }
    },
    {
      "input": "stateful/fixtures/J-retry.json",
      "expected_status": "valid",
      "expected_acceptance": {
        "outcome": "already_accepted",
        "effect_applied": false
      }
    }
  ]
}]]></sourcecode>
      <t>A concurrency assertion SHOULD additionally declare the number of concurrent deliveries and MUST assert the number of state-changing effects observed by the harness.</t>
      <t>Test assertions MUST NOT use expected_level for JEP-Core 0.7.</t>
      <t>A conformance harness MUST distinguish:</t>
      <ul spacing="normal">
        <li>
          <t>validation output returned by the verifier;</t>
        </li>
        <li>
          <t>state supplied to the verifier;</t>
        </li>
        <li>
          <t>state committed by the acceptance processor;</t>
        </li>
        <li>
          <t>externally observed effect count used to test atomicity.</t>
        </li>
      </ul>
      <t>This distinction prevents a test harness from reporting at-most-once acceptance merely because it deduplicated test inputs before invoking the implementation under test.</t>
      <section anchor="normative-coverage">
        <name>Normative Coverage</name>
        <t>A conformance suite SHOULD document its coverage of machine-testable normative requirements.</t>
        <t>For each machine-testable normative requirement that the suite claims to cover, the suite SHOULD identify one or more assertions exercising that requirement.</t>
        <t>A coverage record MAY classify requirements as covered, partially_covered, not_machine_testable, or out_of_scope.</t>
        <t>A requirement MUST NOT be labeled covered solely because a related example or implementation test exists.</t>
        <t>Where part of a requirement depends on external truth, policy, trust, resolver behavior, or other semantics outside Core, the Core-testable portion SHOULD be distinguished from the external portion.</t>
        <t>A requirement that is not machine-testable at the Core layer SHOULD be identified as such rather than represented by a misleading executable test. Test count by itself is not evidence of normative coverage.</t>
        <t>A suite claiming complete machine-testable Core coverage SHOULD disclose the number of applicable machine-testable requirements, covered requirements, partially covered requirements, and uncovered requirements. A suite SHOULD NOT claim complete machine-testable coverage when an applicable machine-testable normative requirement remains uncovered.</t>
      </section>
      <section anchor="assertion-stability">
        <name>Assertion Stability</name>
        <t>An assertion identifier SHOULD remain stable across suite releases when the semantic assertion is unchanged.</t>
        <t>If expected normative behavior changes because the applicable specification changes, the suite SHOULD issue a new or versioned assertion rather than silently changing the meaning of an existing published assertion. Editorial corrections that do not change expected behavior MAY retain the assertion identifier.</t>
      </section>
    </section>
    <section anchor="reference-cli">
      <name>Reference CLI Behavior</name>
      <t>A reference implementation is non-normative. Its purpose is to demonstrate one implementation of the applicable specifications and to execute public conformance artifacts.</t>
      <t>Implementation-specific behavior MUST NOT become a JEP-Core conformance requirement unless that requirement is independently specified by an applicable normative specification.</t>
      <t>A reference implementation SHOULD provide equivalent operations to:</t>
      <sourcecode><![CDATA[jep-validate event.json --mode archival
jep-validate event.json --mode acceptance --acceptance-domain DOMAIN
jep-explain event.json
jep-check-profile event.json --profile PROFILE
jep-run-tests test-vectors/]]></sourcecode>
      <t>A chain-specific command MAY be provided by a companion validator. Its result MUST remain distinguishable from JEP-Core validation.</t>
      <t>CLI output SHOULD use the structured result object defined in this document.</t>
      <t>If reference implementation behavior conflicts with the applicable normative specification, the implementation behavior is a defect or requires specification clarification; it does not silently amend the specification.</t>
    </section>
    <section anchor="interop-reports">
      <name>Implementation Disclosure and Interoperability Reports</name>
      <t>A conforming implementation SHOULD document:</t>
      <ul spacing="normal">
        <li>
          <t>supported JEP-Core release;</t>
        </li>
        <li>
          <t>supported conformance classes;</t>
        </li>
        <li>
          <t>supported validation modes;</t>
        </li>
        <li>
          <t>supported independent checks;</t>
        </li>
        <li>
          <t>supported signature algorithms and canonicalization rules;</t>
        </li>
        <li>
          <t>supported hash algorithms;</t>
        </li>
        <li>
          <t>supported trust and acceptance profiles;</t>
        </li>
        <li>
          <t>supported extensions;</t>
        </li>
        <li>
          <t>acceptance-state durability and atomicity assumptions;</t>
        </li>
        <li>
          <t>historical decoder capabilities, if any;</t>
        </li>
        <li>
          <t>conformance-suite identity;</t>
        </li>
        <li>
          <t>conformance-suite version;</t>
        </li>
        <li>
          <t>conformance-suite digest;</t>
        </li>
        <li>
          <t>test-vector results.</t>
        </li>
      </ul>
      <t>An interoperability report MAY use:</t>
      <sourcecode type="json"><![CDATA[{
  "implementation": "example-jep-validator",
  "version": "0.3.0",
  "jep_core": "0.7",
  "wire_major": "1",
  "conformance_classes": [
    "JEP-Core-0.7 Verifier",
    "JEP-Core-0.7 Acceptance Processor",
    "JEP-Baseline-Ed25519-JWS-JCS-0.7"
  ],
  "modes": [
    "archival",
    "acceptance"
  ],
  "checks": [
    "syntax",
    "cryptographic",
    "event_identity",
    "reference_integrity",
    "extension_processing"
  ],
  "conformance_suite": {
    "name": "jep-core-0.7-conformance",
    "version": "1.0.0",
    "digest": "sha256:..."
  },
  "tests_passed": 0,
  "tests_failed": 0,
  "tests_skipped": 0,
  "date": "2026-09-30"
}]]></sourcecode>
      <t>The suite digest identifies the exact suite artifact or suite manifest used by the report. Two reports SHOULD NOT be treated as directly comparable merely because they report the same number of passing tests.</t>
      <t>For direct comparison, reports SHOULD identify the same applicable JEP-Core version, conformance class, suite version, suite digest, validation mode, and profile set.</t>
      <t>A report MUST NOT imply support for checks, profiles, modes, extensions, or conformance classes that were not actually exercised or otherwise demonstrated.</t>
      <t>A report MUST NOT present successful Core conformance as proof of external truth, legal validity, authorization validity, policy compliance, causality, or external effect.</t>
      <t>A suite digest establishes artifact identity. It does not establish that the suite itself is correct or normative.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>A conformance suite can detect specified classes of implementation divergence but cannot prove deployment security.</t>
      <t>Implementations MUST verify untrusted cryptographic input before committing authoritative Event Identity or acceptance state. When actor binding is required for acceptance, actor binding MUST pass before such state is committed.</t>
      <t>Acceptance processors MUST provide atomic or equivalent concurrency guarantees for first acceptance. A check-then-apply-then-mark sequence that can race is non-conforming.</t>
      <t>Acceptance-state retention MUST be sufficient for the period during which an event remains eligible to produce the protected effect.</t>
      <t>Event IDs are not secrets, bearer tokens, authorization grants, or freshness proofs.</t>
      <t>A valid signature does not prevent repeated delivery. Deployments requiring current liveness, strict ordering, server challenge freshness, or single-use authority SHOULD use an appropriate profile mechanism in addition to JEP-Core.</t>
      <t>Implementations MUST reject algorithms prohibited by the active profile and MUST NOT silently downgrade to weaker algorithms.</t>
      <t>Profile-aware validators MUST NOT silently switch profiles after failure of an explicitly active profile when the applicable profile model requires explicit selection.</t>
      <t>Unknown critical extensions MUST NOT be converted into successful validation merely because the implementation can otherwise continue processing.</t>
      <t>Test keys and test credentials MUST NOT be used in production.</t>
      <t>Incorrect test artifacts can cause false conformance conclusions. Test-suite maintainers therefore SHOULD preserve provenance between assertions and the normative requirements they exercise.</t>
      <t>Reference implementations and test suites SHOULD be independently reviewable. No reference implementation, test suite, registry, vendor product, or maintainer is by itself a source of JEP-Core semantics.</t>
    </section>
    <section anchor="privacy-considerations">
      <name>Privacy Considerations</name>
      <t>Test vectors SHOULD use synthetic identifiers and non-sensitive claims.</t>
      <t>Event IDs, Event Hashes, actor identifiers, references, validation reports, profile identifiers, and interoperability reports can enable correlation. Conformance fixtures SHOULD avoid unnecessary stable real-world identifiers.</t>
      <t>Exact-artifact hashes may permit correlation or confirmation attacks. Sensitive evidence SHOULD be represented using profile-appropriate privacy mechanisms rather than copied into public conformance vectors.</t>
      <t>Conformance reports SHOULD disclose only the implementation metadata required to establish the interoperability claim being made.</t>
      <t>Normative-source references and assertion identifiers SHOULD NOT embed personal or deployment-secret information.</t>
    </section>
    <section anchor="versioning">
      <name>Versioning and Historical Compatibility</name>
      <t>The conformance suite MAY version its executable artifacts independently from the Internet-Draft revision.</t>
      <sourcecode><![CDATA[JEP-Core:          0.7
Conformance draft: -02
Executable suite:  1.0.0]]></sourcecode>
      <t>A new executable suite release does not by itself create a new JEP-Core version.</t>
      <t>Artifacts claiming JEP-Core 0.7 conformance MUST use the JEP-Core 0.7 event model and validation model defined by this document and the companion Core draft.</t>
      <t>The wire major remains jep: "1" for JEP-Core 0.7. Pre--07 Internet-Draft encodings that also used jep: "1" are historical draft artifacts and MUST NOT be selected by heuristic fallback.</t>
      <t>Historical signed bytes MUST NOT be rewritten to satisfy a newer conformance suite.</t>
      <t>A new conformance-suite version MAY add assertions for existing normative requirements, improve coverage, add adversarial cases, fix incorrect derived artifacts, or add interoperability metadata. A suite update MUST NOT silently change a JEP-Core normative requirement.</t>
      <t>If an earlier test assertion is discovered to contradict the applicable normative specification, the suite SHOULD correct the assertion and document the correction. Such correction does not modify the normative specification.</t>
      <t>A future Core revision that changes stable Event Identity, signing-input, canonicalization, or required Core-field semantics after real-world wire adoption may require a new wire major as specified by JEP-Core.</t>
    </section>
    <section anchor="changes-from-01">
      <name>Changes from -01</name>
      <t>Major changes from draft-wang-jep-conformance-01:</t>
      <ul spacing="normal">
        <li>
          <t>clarified normative precedence between JEP-Core, this conformance specification, derived test artifacts, and reference implementations;</t>
        </li>
        <li>
          <t>explicitly stated that test suites, schemas, examples, reference implementations, and interoperability reports do not independently create JEP-Core semantics;</t>
        </li>
        <li>
          <t>required derived artifacts not to introduce JEP-Core requirements absent from the applicable normative specification;</t>
        </li>
        <li>
          <t>added stable conformance assertion identifiers and normative-source references to the assertion model;</t>
        </li>
        <li>
          <t>added normative coverage guidance for machine-testable requirements and clarified that test count alone is not evidence of normative coverage;</t>
        </li>
        <li>
          <t>added guidance for assertion stability across executable suite releases;</t>
        </li>
        <li>
          <t>explicitly stated that reference implementations are non-normative;</t>
        </li>
        <li>
          <t>added profile-selection and downgrade vectors for implementations claiming the explicit profile-selection model;</t>
        </li>
        <li>
          <t>strengthened guidance for unknown critical extensions, unperformed checks, historical decoder fallback, and profile inference;</t>
        </li>
        <li>
          <t>added conformance-suite name, version, and digest to the recommended interoperability report and clarified when reports are directly comparable;</t>
        </li>
        <li>
          <t>clarified that a suite digest establishes artifact identity but not normative authority;</t>
        </li>
        <li>
          <t>retained the JEP-Core 0.7 wire model, Event Identity, Event Hash, J/D/T/V semantics, validation-check model, extension semantics, baseline signing class, and idempotent acceptance semantics unchanged.</t>
        </li>
      </ul>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document requests no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>Normative References</name>
      <reference anchor="JEP" target="https://datatracker.ietf.org/doc/html/draft-wang-jep-judgment-event-protocol-07">
        <front>
          <title>Judgment Event Protocol (JEP)</title>
          <author initials="Y." surname="Wang" fullname="Yuqiang Wang"/>
          <date year="2026" month="September" day="26"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-wang-jep-judgment-event-protocol-07"/>
      </reference>
      <reference anchor="JEP-PROFILES" target="https://datatracker.ietf.org/doc/html/draft-wang-jep-profiles-01">
        <front>
          <title>JEP Profiles and Interoperability</title>
          <author initials="Y." surname="Wang" fullname="Yuqiang Wang"/>
          <date year="2026" month="September" day="26"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-wang-jep-profiles-01"/>
      </reference>
      <reference anchor="RFC2119" target="https://www.rfc-editor.org/rfc/rfc2119">
        <front>
          <title>Key words for use in RFCs to Indicate Requirement Levels</title>
          <author initials="S." surname="Bradner" fullname="Scott Bradner"/>
          <date year="1997" month="March"/>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="2119"/>
      </reference>
      <reference anchor="RFC7493" target="https://www.rfc-editor.org/rfc/rfc7493">
        <front>
          <title>The I-JSON Message Format</title>
          <author initials="T." surname="Bray" fullname="Tim Bray"/>
          <date year="2015" month="March"/>
        </front>
        <seriesInfo name="RFC" value="7493"/>
      </reference>
      <reference anchor="RFC7515" target="https://www.rfc-editor.org/rfc/rfc7515">
        <front>
          <title>JSON Web Signature (JWS)</title>
          <author initials="M." surname="Jones" fullname="Michael Jones"/>
          <author initials="J." surname="Bradley" fullname="John Bradley"/>
          <author initials="N." surname="Sakimura" fullname="Nat Sakimura"/>
          <date year="2015" month="May"/>
        </front>
        <seriesInfo name="RFC" value="7515"/>
      </reference>
      <reference anchor="RFC8032" target="https://www.rfc-editor.org/rfc/rfc8032">
        <front>
          <title>Edwards-Curve Digital Signature Algorithm (EdDSA)</title>
          <author initials="S." surname="Josefsson" fullname="Simon Josefsson"/>
          <author initials="I." surname="Liusvaara" fullname="Ilari Liusvaara"/>
          <date year="2017" month="January"/>
        </front>
        <seriesInfo name="RFC" value="8032"/>
      </reference>
      <reference anchor="RFC8174" target="https://www.rfc-editor.org/rfc/rfc8174">
        <front>
          <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
          <author initials="B." surname="Leiba" fullname="Barry Leiba"/>
          <date year="2017" month="May"/>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="8174"/>
      </reference>
      <reference anchor="RFC8785" target="https://www.rfc-editor.org/rfc/rfc8785">
        <front>
          <title>JSON Canonicalization Scheme (JCS)</title>
          <author initials="A." surname="Rundgren" fullname="Anders Rundgren"/>
          <author initials="B." surname="Jordan" fullname="Bradley Jordan"/>
          <author initials="S." surname="Erdtman" fullname="Samuel Erdtman"/>
          <date year="2020" month="June"/>
        </front>
        <seriesInfo name="RFC" value="8785"/>
      </reference>
      <reference anchor="RFC9864" target="https://www.rfc-editor.org/rfc/rfc9864">
        <front>
          <title>Fully-Specified Algorithms for JSON Object Signing and Encryption (JOSE) and CBOR Object Signing and Encryption (COSE)</title>
          <author initials="M.B." surname="Jones" fullname="Michael B. Jones"/>
          <author initials="O." surname="Steele" fullname="Orie Steele"/>
          <date year="2025" month="October"/>
        </front>
        <seriesInfo name="RFC" value="9864"/>
      </reference>
    </references>
    <section anchor="acknowledgments" numbered="false">
      <name>Acknowledgments</name>
      <t>The author thanks implementers and reviewers who provided interoperability, security, and deployment feedback on earlier JEP drafts and conformance revisions.</t>
    </section>
  </back>
</rfc>
