Docs

Pins

Every verdict this toolkit produces names the exact bytes it judged against. The five official GS1 EPCIS 2.0.1 artefacts are vendored with sha256 pins — not fetched, not linked, not resolved at run time. A validate verdict carries the schema's pin in its output; the pins verb prints the full set; the conformance harness records evidence under a hash tree and refuses any bundle whose bytes moved. Pins change only by journaled human ruling — that sentence is quoted from the shipped vendor/gs1/PINS.json itself.

The pinned artefacts

artefactsha256role
openapi.json3d33792c520d7a7a…b784d66fcREST binding shapes (Capture + Query interfaces)
epcis-json-schema.json0f46ff694efffd8d…40ae210afdocument/event validation — the projection-invariant schema
epcis-context.jsonld5056c65f991425b1…94713737JSON-LD expansion checks
query-schema.json4b5583c9a0a71532…19355341SimpleEventQuery validation
epcis-shacl.ttl7db2547a7a55e7d6…5c0cc7f42semantic-graph validation (secondary)

Source of the standard: GS1 (ref.gs1.org). The full 64-hex digests are in the transcript below and in vendor/gs1/PINS.json inside the tarball (node_modules/epcis.dev/vendor/gs1/PINS.json).

Read the pins where you already are

$ npx epcis.dev pins
standard  EPCIS 2.0.1
pin  openapi.json
     sha256=3d33792c520d7a7a1d080382d956730bb07021c7dd1cc17229fce27b784d66fc
pin  epcis-json-schema.json
     sha256=0f46ff694efffd8d8ce840a33dfde84228add11b516b8b258f3200740ae210af
pin  epcis-context.jsonld
     sha256=5056c65f991425b1d3a35e35edf4f7d0c7ff56cf688c2912b930f93494713737
pin  query-schema.json
     sha256=4b5583c9a0a715324594617f3cf6744f4f930568484f7df8fb7aa81819355341
pin  epcis-shacl.ttl
     sha256=7db2547a7a55e7d6e6f19c0ad472d1f0987ef19f3d04a43b195bca55c0cc7f42
$ echo $?
0

(Text mode prints one TSV line per pin with its ref.gs1.org source URL; the lines are wrapped here for width only. pins --json prints the PINS record verbatim.)

Every validate verdict names its schema by the same pin:

$ npx epcis.dev validate object-event-shipping.json --json
{
  "valid": true,
  "schema": {
    "artefact": "epcis-json-schema.json",
    "version": "2.0.1",
    "sha256": "0f46ff694efffd8d8ce840a33dfde84228add11b516b8b258f3200740ae210af"
  },
  "errors": []
}

The repository's verify:pins script re-hashes the vendored bytes against these digests on every test run — the differential harness, and the 698-test suite behind the site's verbs gate, ride the same pins.

The harness refuses altered evidence

A conformance run --out run.json records full transcripts of every check under a hash tree (bundle.rootHash over content-addressed objects). Change one byte anywhere inside the evidence and rejudge refuses the whole bundle — it does not re-judge around the damage:

$ npx epcis.dev conformance run --self --out run.json
…
state  passed  passed=18  failed=0  total=18
wrote  run.json

# one byte altered inside a recorded transcript object, then:

$ npx epcis.dev conformance rejudge run.json
signature  none  advisory run — carries no attestation weight
bundle  FAILED  evidence bundle failed verification: TCR-43.1:
  transcript object at address b74e373bc3c836d363db25c10bac54e1a…
  actually hashes to 8da78836f99515b0a138ecb60f2793ea2129…
  — evidence was altered
rejudge  FAILED
$ echo $?
1

Exit 1 is the fail-closed path working, not a crash — the exit-code taxonomy is on the CLI reference.

An advisory run is unsigned and carries no attestation weight; no conformance attestation has ever been issued. What a run is, and how a counterparty replays one offline, is the run & rejudge page.

We answer in writing. We take at most five conversations a month, only when you ask for one, and only after you already have the written read.