Language-agnostic conformance test suite for EVP/1. Run any issuer or consumer implementation against this corpus to certify compliance.
The separated conformance suite for EVP/1 — modeled on sigstore/sigstore-conformance and json-schema-org/JSON-Schema-Test-Suite. The protocol spec lives in etymolt/evp-spec; the test vectors that prove compliance live here.
Two conformance dimensions:
- Issuer conformance — does your
POST /v1/verifyendpoint return a verdict that validates against the EVP/1 schema and signs correctly? - Consumer conformance — does your consumer surface render the disclaimer verbatim, surface temporal validity correctly, and reject malformed signatures?
.
├── issuer-conformance/
│ ├── README.md
│ ├── runner.py # The harness: hits your /v1/verify, validates results
│ └── checks/ # Per-axis check definitions
├── consumer-conformance/
│ ├── README.md
│ ├── runner.py # The harness: feeds your consumer test vectors
│ └── vectors/ # Inputs the consumer must handle correctly
└── test_vectors/ # Mirrors the canonical set from evp-spec
├── valid/ # plus additional edge cases
├── invalid/
├── canonicalization/
├── key_rotation/
└── temporal_validity/
git clone https://github.com/etymolt/conformance.git
cd conformance
pip install -r requirements.txt
# Issuer conformance against api.etymolt.com (reference issuer)
python issuer-conformance/runner.py --endpoint https://api.etymolt.com/v1/verify
# Consumer conformance against your implementation
python consumer-conformance/runner.py --consumer-cmd "node my-render.js"Pass the full suite, get a conformance badge. Add to your README:
(Badge issuance pending; for now self-attest by linking your conformance run output.)
This suite is early. The initial test vectors mirror the canonical set in evp-spec/test_vectors/; the issuer + consumer runners are scaffolded but minimal. Contributions welcome — see CONTRIBUTING.md.
Per the json-schema-org pattern: conformance test suites that live next to spec language end up versioning awkwardly. A separate repo lets the suite evolve faster than the spec, lets third-party issuers and consumers run CI against a stable URL, and lets the test corpus be language-agnostic by design.
Apache-2.0 for the runner code and harness. The test vectors are CC-BY-4.0. The "Etymolt" name and logo are trademarks of Etymolt Inc. and are not licensed under either.
The fixtures/evp-1.1/ directory carries public-comment-candidate test vectors for the EVP/1.1 schema currently at https://github.com/etymolt/evp-spec/blob/main/spec/evp-1.1.schema.json. v1.1 is a non-breaking superset of v1 that adds goods/class scoping, valid_until / ttl_seconds, per-jurisdiction trademark sources, and freshness telemetry.
fixtures/evp-1.1/example-valid.json-- complete v1.1 verdict with all required blocks (goods.nice_classes_source=inferred_text, sources.trademark.{us,eu,uk,common_law}, freshness). Validates clean against the published schema.fixtures/evp-1.1/example-missing-goods.json-- v1 verdict reissued under v1.1 envelope withgoods.nice_classes_source: "missing". The forward-compat path: a legacy v1 verdict can be re-emitted under v1.1 with explicitmissingprovenance, signaling to consumers that the verdict was not scoped to specific Nice classes and should be downgraded accordingly.
Validate locally:
curl -sL https://raw.githubusercontent.com/etymolt/evp-spec/main/spec/evp-1.1.schema.json -o evp-1.1.schema.json
python3 -c "import json,jsonschema; jsonschema.validate(json.load(open("fixtures/evp-1.1/example-valid.json")), json.load(open("evp-1.1.schema.json")))"