Docs

Versioning & drift

Two kinds of change exist on this surface and they never share a channel. Surface drift is the toolkit evolving — new verbs, new doors, better prose. Normative drift is the standard's own bytes moving — a new official schema, a revised context document. The first rides npm semver; the second rides sha256 pins that change only by journaled human ruling. An agent audits both with commands, not diffs of prose.

The version, from the thing itself

$ npx epcis.dev version --json
{
  "package": "epcis.dev",
  "version": "0.1.0",
  "epcis": "2.0.1",
  "cbv": "2.0.1",
  "suite": "0.4.0"
}

Four version axes, deliberately separate: the npm package, the EPCIS standard pinned, the CBV standard pinned, and the conformance suite. The public registry agrees:

$ npm view epcis.dev@0.1.0 version dist.tarball
version = '0.1.0'
dist.tarball =
  'https://registry.npmjs.org/epcis.dev/-/epcis.dev-0.1.0.tgz'

What is stable across releases

  • Exit codes0 ok · 1 fail · 2 usage · 3 not-found · 4 internal. A release that changed a meaning would be a breaking change under semver.
  • Error code strings on stderr and epcisException:* types on every door. Match on code, never on prosetitle and detail are worded for humans and may be rephrased in any release.
  • The verb set is closed. A new verb is a minor release; a removed or reshaped verb is a major one.
  • --json output shapes. Fields are added, never repurposed.

What moves only by ruling

The five official GS1 artefacts are vendored bytes with sha256 pins — the pins page lists them. The shipped vendor/gs1/PINS.json states the law in its own first sentence: "Pins change only by journaled human ruling." To detect normative drift between two installs, diff the pins, not the prose:

$ npx epcis.dev pins --json | \
    node -e "let s='';process.stdin.on('data',d=>s+=d)
      .on('end',()=>{const p=JSON.parse(s).artefacts;
      for(const k in p)console.log(p[k].sha256,k)})"
3d33792c… openapi.json
0f46ff69… epcis-json-schema.json
5056c65f… epcis-context.jsonld
4b5583c9… query-schema.json
7db2547a… epcis-shacl.ttl

(Digests truncated for width; the full 64-hex values are on the pins page and in the run's output.)

Two installs whose pin sets match produce byte-identical verdicts. That is why the CI page says to pin the package version: npx -y epcis.dev@0.1.0 freezes both drift axes at once.

The journal is append-only about itself

The launch journal follows the same law as the event record it documents: entries are never edited after their date — a correction is a new entry that names what it corrects. What you cite from a dated entry stays citable; the fix arrives beside it, not over it. The dated build-state ledger at /what-ships-today/ is the authoritative structured fact for what answers on this origin today — treat its open column as open, not live.

Pin epcis.dev@0.1.0, match on codes, diff the pins, cite dated entries. That is the whole drift contract.

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.