Internet-Draft JEP Conformance September 2026
Wang Expires 30 March 2027 [Page]
Workgroup:
Network Working Group
Internet-Draft:
draft-wang-jep-conformance-01
Published:
Intended Status:
Experimental
Expires:
Author:
Y. Wang

JEP Conformance and Test Suite

Abstract

This document defines conformance classes, validation-result structure, schema requirements, test-vector categories, reference-validator behavior, and implementation testing guidance for the Judgment Event Protocol (JEP). It is a companion to [JEP].

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.

Status of This Memo

This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.

Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at https://datatracker.ietf.org/drafts/current/.

Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."

This Internet-Draft will expire on 30 March 2027.

▲

Table of Contents

1. Introduction

JEP-Core defines the signed event object, J/D/T/V event semantics, stable Event Identity, Event Hash semantics, validation modes, independent validation checks, and idempotent acceptance requirements.

This document defines how implementations demonstrate conformance to those requirements. It replaces the level-oriented conformance model used by draft-wang-jep-conformance-00 with the independent-check model defined by JEP-Core 0.7.

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, and active profiles.

Where this document and JEP-Core conflict, JEP-Core controls.

2. Requirements Language

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 [RFC2119] [RFC8174] when, and only when, they appear in all capitals.

3. Conformance Model

3.1. Independent Checks

JEP-Core 0.7 does not define cumulative validation levels. A conforming validator reports independent checks.

Core-defined checks are:

  • syntax

  • cryptographic

  • event_identity

  • reference_integrity

  • extension_processing

Trust- or acceptance-profile checks include:

  • actor_binding

  • freshness

  • audience

Companion or external checks include:

  • chain_integrity

  • policy

A check status is one of:

  • pass

  • fail

  • not_checked

  • not_applicable

  • unsupported

  • indeterminate

An implementation MUST NOT report an unperformed check as pass.

3.2. Overall Status

For the requested validation mode and profile, the overall status is one of:

  • valid

  • invalid

  • indeterminate

valid means that all required checks passed or were not applicable. invalid means that at least one required check failed. indeterminate means that no required check failed but at least one required check is unsupported or indeterminate.

3.3. Validation Modes

The initial validation modes are:

  • archival

  • acceptance

  • chain

  • policy

Archival validation is repeatable and MUST NOT consume acceptance state.

Acceptance validation includes JEP-Core Event Identity and idempotent acceptance semantics plus any profile-required actor-binding, freshness, audience, or challenge checks.

Chain and policy modes invoke companion or external semantics. A Core implementation MUST NOT present a chain or policy result as an intrinsic JEP-Core property.

4. Conformance Classes

4.1. JEP-Core-0.7 Producer

A producer conforms to JEP-Core-0.7 Producer if it supports:

  • I-JSON-compatible event construction as defined by RFC 7493 [RFC7493];

  • a stable id for each event instance;

  • all required top-level Core members;

  • J/D/T/V verb-specific Core requirements;

  • JCS canonicalization of the unsigned event as defined by RFC 8785 [RFC8785];

  • signature generation under at least one declared signature conformance class;

  • algorithm-tagged digest strings;

  • ext and ext_crit semantics.

A conforming producer MUST NOT reuse one Event Identity (who,id) for different unsigned event content.

4.2. JEP-Core-0.7 Verifier

A verifier conforms to JEP-Core-0.7 Verifier if it supports:

  • duplicate JSON member rejection;

  • Core field and verb-specific validation;

  • Event Identity validation;

  • JCS canonicalization as defined by RFC 8785 [RFC8785];

  • signature verification under at least one declared signature conformance class, using RFC 7515 [RFC7515] where that class is JWS-based;

  • Event Hash calculation;

  • independent validation checks;

  • structured validation-result objects;

  • unknown critical-extension rejection;

  • archival validation mode.

A Core verifier MUST NOT require an optional identity, credential, attestation, blockchain, AI-platform, agent-framework, challenge, transport, chain, or policy profile.

4.3. JEP-Core-0.7 Acceptance Processor

An implementation claiming JEP-Core-0.7 Acceptance Processor conformance MUST additionally support:

  • a stable acceptance-domain definition;

  • detection of conflicting Event Identity reuse;

  • sufficient acceptance state for the claimed acceptance lifetime;

  • atomic or equivalent first-acceptance processing;

  • accepted, already_accepted, rejected, and indeterminate outcomes;

  • separation of repeated valid delivery from invalid event content.

The same Event Identity MUST NOT apply the same acceptance effect more than once within one acceptance domain.

4.4. JEP-Extension-0.7 Processor

An extension processor conforms to JEP-Extension-0.7 Processor if it can:

  • locate extension objects under ext;

  • process identifiers named by ext_crit;

  • fail extension_processing for unknown critical extensions;

  • ignore unknown non-critical extensions where permitted;

  • detect conflicting critical extensions;

  • preserve JEP-Core member semantics.

4.5. JEP-Baseline-Ed25519-JWS-JCS-0.7

This document defines an interoperable baseline conformance class named JEP-Baseline-Ed25519-JWS-JCS-0.7.

It requires:

  • I-JSON-compatible JSON as defined by RFC 7493 [RFC7493];

  • RFC 8785 JCS canonicalization [RFC8785];

  • detached JWS Compact Serialization as defined by RFC 7515 [RFC7515];

  • the fully specified JOSE alg value Ed25519 defined by RFC 9864 [RFC9864];

  • Ed25519 signature processing as defined by RFC 8032 [RFC8032];

  • algorithm-tagged sha256 digest strings;

  • Event Hash calculation over the full signed event object including sig.

For this baseline, the JWS Payload is exactly the JEP Signing Payload: the UTF-8 octets of the RFC 8785 JCS-canonicalized unsigned event.

The protected JOSE header MUST contain:

{
  "alg": "Ed25519"
}

A kid parameter MAY be present. If present, kid MUST be carried in the protected header. Additional protected parameters MAY be present when allowed by the active trust profile. A verifier MUST process every critical JOSE header parameter that it is required to understand under RFC 7515.

This baseline uses the ordinary base64url-encoded JWS Payload semantics of RFC 7515. Producers MUST NOT use b64:false for this conformance class.

The JWS Signing Input is exactly:

ASCII(
  BASE64URL(UTF8(JWS Protected Header))
  || "."
  || BASE64URL(JEP Signing Payload)
)

The top-level JEP sig member MUST contain the detached JWS Compact Serialization form:

BASE64URL(UTF8(JWS Protected Header))
|| ".."
|| BASE64URL(JWS Signature)

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.

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.

Conformance vectors for this baseline MUST publish:

  • the complete unsigned event;

  • the exact JEP Signing Payload bytes, encoded in a transport-safe form;

  • the protected-header JSON;

  • the protected-header base64url segment;

  • the detached sig string;

  • the resulting full signed event;

  • the Event Hash;

  • the expected validation result.

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.

This baseline is a conformance-class requirement, not a restriction on JEP-Core algorithm agility.

4.6. Profile-Specific Conformance

A profile MAY define additional conformance classes. Such classes MUST state:

  • which validation checks are required;

  • which checks are optional;

  • which identifiers, credentials, or evidence are required;

  • which algorithms are accepted or prohibited;

  • whether freshness, audience, challenge-response, nonce, counter, sequence, ledger, or other replay-related mechanisms are required;

  • how unsupported or indeterminate evidence is reported;

  • any acceptance-domain requirements.

Profiles MUST NOT redefine JEP-Core Event Identity, Event Hash, J/D/T/V, signing-payload, or Core check semantics.

4.7. Historical Decoder Capability

Support for pre--07 JEP draft encodings is OPTIONAL and is not part of JEP-Core-0.7 conformance.

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.

Historical signed events MUST NOT be rewritten or silently upgraded.

5. Validation Result Object

A conforming verifier SHOULD return a structured validation result.

5.1. Valid Archival Example

{
  "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": []
}

5.2. Safe Retry Example

{
  "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": []
}

5.3. Signature Failure Example

{
  "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."
    }
  ]
}

5.4. Result Requirements

A conformance result object MUST distinguish:

  • overall status;

  • requested mode;

  • active profile;

  • Event Identity when available;

  • Event Hash when calculated;

  • independent checks;

  • acceptance outcome when acceptance mode is requested;

  • warnings;

  • errors.

The event_identity member reports the (who,id) values asserted by the parsed event. Its presence in a result does not by itself establish signature validity, actor binding, authority, freshness, or non-conflicting historical use of that Event Identity.

The event_identity check reports only the JEP-Core Event Identity checks actually performed, including conflicting reuse detection when identity state is available. It MUST NOT be used as a substitute for cryptographic or actor_binding.

Similarly, an event_hash 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.

An error object SHOULD contain a JEP failure code, the associated check when applicable, and an explanatory message.

A result MUST NOT contain a cumulative validation level.

5.5. Acceptance Outcome Consistency

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:

Table 1
Acceptance outcome Overall status effect_applied
accepted valid true
already_accepted valid false
rejected invalid false
indeterminate indeterminate false

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.

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.

rejected means at least one required validation check failed.

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.

effect_applied MUST be true only for accepted. A verifier MUST NOT report already_accepted as a cryptographic or syntax failure.

For non-acceptance modes, the acceptance member SHOULD be absent unless a companion result format explicitly carries a separately labeled acceptance observation.

6. JSON Schema Requirements

The conformance suite SHOULD provide:

  • jep-event-0.7.schema.json

  • jep-ref-0.7.schema.json

  • jep-extension-0.7.schema.json

  • jep-validation-result-0.7.schema.json

  • schemas for any baseline signature or profile objects defined by the suite

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.

6.1. Minimal Event Schema Seed

The following schema is a structural seed. It intentionally does not attempt to encode every JEP semantic rule.

{
  "$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"]
          }
        }
      }
    }
  ]
}

The schema does not make nonce a Core field. A nonce or equivalent mechanism MAY appear inside a registered extension or profile-defined object.

6.2. Typed JEP Event Reference Seed

A logical JEP event reference SHOULD use Event Identity:

{
  "type": "jep:event",
  "value": {
    "who": "did:example:actor-123",
    "id": "urn:uuid:018f4f8d-7c63-7c2e-9b43-4ef657eec1c0"
  }
}

An exact signed artifact MAY additionally be pinned:

{
  "type": "jep:event",
  "value": {
    "who": "did:example:actor-123",
    "id": "urn:uuid:018f4f8d-7c63-7c2e-9b43-4ef657eec1c0"
  },
  "hash": "sha256:..."
}

The value identifies the logical event. The optional hash identifies an exact signed artifact.

7. Reference Validation Flow

A reference validator SHOULD process an event in the following order:

validate_event(event, mode, trust_profile, acceptance_domain=None):
    parse JSON
    reject duplicate member names
    validate required Core fields
    validate jep, id, verb, who, and when
    validate verb-specific 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

An implementation MUST perform cryptographic validation before writing new authoritative Event Identity or acceptance state for untrusted input.

When the active acceptance profile requires actor binding, an implementation MUST NOT commit authoritative Event Identity or acceptance state until actor_binding has passed.

A verifier MUST NOT treat a transport retry as creation of a new event.

8. Test Vector Categories

8.1. Valid Core Event Vectors

The suite SHOULD include:

  • valid/J-basic.json

  • valid/D-basic.json

  • valid/T-basic.json

  • valid/V-basic.json

  • valid/event-reference-logical.json

  • valid/event-reference-exact-artifact.json

8.2. Syntax and Core-Field Vectors

The suite SHOULD include:

  • invalid/invalid-json.json

  • invalid/duplicate-member.json

  • invalid/missing-id.json

  • invalid/invalid-id.json

  • invalid/missing-what.json

  • invalid/unknown-verb.json

  • invalid/invalid-timestamp.json

  • invalid/D-missing-delegatee.json

  • invalid/D-missing-scope.json

  • invalid/T-missing-ref.json

  • invalid/T-missing-termination-scope.json

  • invalid/V-missing-ref.json

  • invalid/V-missing-verification-scope.json

  • invalid/V-missing-result.json

8.3. Cryptographic Vectors

The suite SHOULD include:

  • invalid/invalid-signature.json

  • invalid/signature-over-wrong-payload.json

  • invalid/unsupported-signature-alg.json

  • invalid/prohibited-signature-alg.json

  • invalid/alg-key-type-mismatch.json

  • invalid/alg-profile-mismatch.json

  • invalid/canonicalization-failed.json

  • invalid/canonicalization-version-unsupported.json

8.4. Event Identity and Delivery Vectors

Event Identity behavior is stateful. A single isolated JSON event cannot by itself demonstrate conflicting reuse or prior acceptance.

The suite SHOULD therefore include stateful sequence manifests such as:

  • stateful/event-identity-retransmission.json

  • stateful/event-identity-resign-same-content.json

  • stateful/event-id-conflict.json

  • stateful/same-id-different-who.json

A stateful manifest SHOULD declare the identity or acceptance state visible to the harness, the ordered steps, and the expected result for each step.

Example:

{
  "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
      }
    }
  ]
}

The second event in the example uses the same (who,id) but different JCS-canonicalized unsigned event content.

The suite SHOULD also verify:

  • retransmission of byte-identical signed content;

  • re-signing of identical unsigned content with the same Event Identity;

  • use of the same id string under a different who;

  • conflicting reuse of one Event Identity with different unsigned content.

Conflicting reuse MUST produce ERR_EVENT_ID_CONFLICT.

A valid repeated event MUST NOT be reported as a cryptographic failure.

8.5. Acceptance Vectors

Acceptance behavior is also stateful. The suite SHOULD include:

  • stateful/accept-first.json

  • stateful/accept-safe-retry.json

  • stateful/accept-state-unavailable.json

  • stateful/accept-atomicity-unavailable.json

  • a concurrent first-delivery test

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.

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.

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.

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.

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.

8.6. Reference Vectors

The suite SHOULD include:

  • logical Event Identity resolution;

  • exact-artifact hash success;

  • exact-artifact hash mismatch;

  • Event Identity mismatch;

  • unresolved references when a requested check requires resolution.

8.7. Extension Vectors

The suite SHOULD include:

  • known critical extension success;

  • unknown critical extension failure;

  • unknown non-critical extension tolerance;

  • extension schema failure;

  • conflicting critical extensions.

8.8. Canonicalization and Hash Vectors

The suite SHOULD include:

  • equivalent JSON inputs producing identical JCS bytes;

  • UTF-16 property-order edge cases required by JCS;

  • numeric serialization edge cases allowed by I-JSON/JCS;

  • full signed Event Hash calculation;

  • unsigned JEP Signing Payload calculation;

  • proof that changing sig can change Event Hash without changing Event Identity.

8.9. Companion and External Check Vectors

Chain and policy fixtures MAY be included for integration testing, but they MUST identify the companion profile or external evaluator that owns the semantics. They MUST NOT be labeled as Core-only conformance failures.

8.10. Historical Compatibility Vectors

If a product advertises a historical pre--07 decoder, the suite SHOULD include:

  • explicit historical decoder selection;

  • historical signature verification without rewriting bytes;

  • refusal to silently fall back from 0.7 based solely on field presence.

9. Seed J/D/T/V Event Shapes

The following examples use placeholder signatures.

9.1. J-basic

{
  "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"
}

9.2. D-basic

{
  "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"
}

9.3. T-basic

{
  "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"
}

9.4. V-basic

{
  "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"
}

10. Conformance Test Assertions

A stateless test assertion SHOULD name:

  • input event;

  • requested validation mode;

  • active profile;

  • expected overall status;

  • expected independent checks;

  • expected warnings and errors;

  • expected Event Hash when applicable.

Example:

{
  "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"]
}

A stateful test MUST declare the state scope and ordered operations required to obtain the expected result. It SHOULD use a steps array rather than imply state through a filename.

Example safe retry:

{
  "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
      }
    }
  ]
}

A concurrency assertion SHOULD additionally declare the number of concurrent deliveries and MUST assert the number of state-changing effects observed by the harness.

Test assertions MUST NOT use expected_level for JEP-Core 0.7.

A conformance harness MUST distinguish:

  • validation output returned by the verifier;

  • state supplied to the verifier;

  • state committed by the acceptance processor;

  • externally observed effect count used to test atomicity.

This distinction prevents a test harness from reporting at-most-once acceptance merely because it deduplicated test inputs before invoking the implementation under test.

11. Reference CLI Behavior

A reference implementation SHOULD provide equivalent operations to:

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/

A chain-specific command MAY be provided by a JAC-like companion validator. Its result MUST remain distinguishable from JEP-Core validation.

CLI output SHOULD use the structured result object defined in this document.

12. Implementation Disclosure and Interoperability Reports

A conforming implementation SHOULD document:

  • supported JEP-Core release;

  • supported conformance classes;

  • supported validation modes;

  • supported independent checks;

  • supported signature algorithms and canonicalization rules;

  • supported hash algorithms;

  • supported trust and acceptance profiles;

  • supported extensions;

  • acceptance-state durability and atomicity assumptions;

  • historical decoder capabilities, if any;

  • test-vector results.

An interoperability report MAY use:

{
  "implementation": "example-jep-validator",
  "version": "0.2.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"
  ],
  "tests_passed": 0,
  "tests_failed": 0,
  "date": "2026-09-26"
}

A report MUST NOT imply support for checks, profiles, or modes that were not actually exercised.

13. Security Considerations

A conformance suite can detect specified classes of implementation divergence but cannot prove deployment security.

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.

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.

Acceptance-state retention MUST be sufficient for the period during which an event remains eligible to produce the protected effect.

Event IDs are not secrets, bearer tokens, authorization grants, or freshness proofs.

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.

Implementations MUST reject algorithms prohibited by the active profile and MUST NOT silently downgrade to weaker algorithms.

Test keys and test credentials MUST NOT be used in production.

14. Privacy Considerations

Test vectors SHOULD use synthetic identifiers and non-sensitive claims.

Event IDs, Event Hashes, actor identifiers, references, and validation reports can enable correlation. Conformance fixtures SHOULD avoid unnecessary stable real-world identifiers.

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.

Conformance reports SHOULD disclose only the implementation metadata required to establish interoperability claims.

15. Versioning and Historical Compatibility

The conformance suite MAY version its executable artifacts independently from the Internet-Draft revision.

Artifacts claiming JEP-Core 0.7 conformance MUST use the JEP-Core 0.7 event model and result model defined by this document and the companion Core draft.

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.

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.

16. Changes from -00

Major changes from draft-wang-jep-conformance-00:

  • aligned the companion specification with JEP-Core 0.7;

  • added required Event ID and Event Identity conformance;

  • removed Core nonce-generation and nonce-replay requirements;

  • replaced cumulative validation levels with independent validation checks;

  • replaced boolean-only validity with valid, invalid, and indeterminate;

  • added accepted, already_accepted, rejected, and indeterminate acceptance outcomes;

  • added acceptance-state lifetime and atomicity conformance;

  • separated logical Event Identity from exact signed-artifact Event Hash;

  • updated reference vectors to typed Event Identity references with optional artifact hashes;

  • moved chain, cascade, cycle, and policy semantics out of Core conformance;

  • tightened D/T/V minimum structural requirements;

  • added Event Identity conflict vectors and safe-retry vectors;

  • made nonce, challenge, sequence, counter, and ledger replay tests profile-specific;

  • added explicit historical-decoder and no-heuristic-fallback tests;

  • updated the baseline JOSE algorithm identifier to fully specified Ed25519;

  • removed expected_level from test assertions and interoperability reports.

  • fully specified the detached JWS Compact Serialization baseline, including protected-header, signing-input, base64url, and detached sig rules;

  • clarified that reported Event Identity and Event Hash values are not by themselves validation conclusions;

  • defined deterministic consistency rules between overall validation status and acceptance outcome;

  • made Event Identity conflict, safe retry, and atomicity fixtures explicitly stateful or concurrent.

17. IANA Considerations

This document requests no IANA actions.

18. Author's Address

Yuqiang Wang Email: signal@humanjudgment.org URI: https://github.com/hjs-spec

19. References

19.1. Normative References

[JEP]
Wang, Y., "Judgment Event Protocol (JEP)", Work in Progress, Internet-Draft, draft-wang-jep-judgment-event-protocol-07, , <https://datatracker.ietf.org/doc/html/draft-wang-jep-judgment-event-protocol-07>.
[RFC2119]
Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, , <https://www.rfc-editor.org/rfc/rfc2119>.
[RFC7493]
Bray, T., "The I-JSON Message Format", RFC 7493, , <https://www.rfc-editor.org/rfc/rfc7493>.
[RFC7515]
Jones, M., Bradley, J., and N. Sakimura, "JSON Web Signature (JWS)", RFC 7515, , <https://www.rfc-editor.org/rfc/rfc7515>.
[RFC8032]
Josefsson, S. and I. Liusvaara, "Edwards-Curve Digital Signature Algorithm (EdDSA)", RFC 8032, , <https://www.rfc-editor.org/rfc/rfc8032>.
[RFC8174]
Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words", BCP 14, RFC 8174, , <https://www.rfc-editor.org/rfc/rfc8174>.
[RFC8785]
Rundgren, A., Jordan, B., and S. Erdtman, "JSON Canonicalization Scheme (JCS)", RFC 8785, , <https://www.rfc-editor.org/rfc/rfc8785>.
[RFC9864]
Jones, M.B. and O. Steele, "Fully-Specified Algorithms for JSON Object Signing and Encryption (JOSE) and CBOR Object Signing and Encryption (COSE)", RFC 9864, , <https://www.rfc-editor.org/rfc/rfc9864>.