Purchase orders, ASNs, invoices —
compiled onto the event record.

transactions.dev is the business-transaction layer of the visibility.cloud family: X12, EDIFACT/EANCOM, and API-native documents in; conformant EPCIS 2.0 events carrying bizTransaction context out. The join is the standard's own machinery — CBV 2.0 wrote po and desadv as first-class vocabulary — so the context lands where every conformant consumer already looks.

The document flow you have is the event context you are missing. Nobody in the developer-EDI field compiles to EPCIS; the EPCIS field treats the paperwork as someone else's problem. This layer is the join between them, and only the join: not an EDI network, not a VAN, not a mapping consultancy.

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.

po850 / ORDERSdesadv856 / DESADVbizTransactionListCBV §8.5sourceListN1 → GLNrecadvshipped vs seen

documents inconformant events outthe context lands on core fields

Illustrative. One band: the compile. Every station is a core CBV vocabulary entry, not an extension.

The verbs.

One CLI contract, shared with the family: payload on stdout, typed errors on stderr, verdicts as exit codes, --json everywhere. npx transactions.dev runs the whole engine on your bench; the MCP door exposes the same verbs to an agent through the same core.

The engine's grammars are self-authored data files pinned by digest; the corpus is synthetic and license-tagged, fixture by fixture. The pins print with transactions.dev pins.

verbwhat it doesexit-1 verdict
parseX12 or EDIFACT bytes → lossless canonical JSON (segment order and delimiters preserved)syntax / envelope error
emitcanonical JSON → wire bytes, the byte-exact inverse of parsenon-emittable structure
validatestructural validation against a pinned grammar (set × version)invalid document
ack997 / 999 / CONTRL from a validate result
translatecanonical JSON ↔ friendly per-set JSONmapping failure
join856 / 850 / 940 / 945 / DESADV → EPCIS 2.0 events, validated against the pinned official schemaevents fail EPCIS validation
reconcilean ASN against captured events: typed diff, machine verdictdiscrepant
pinsprint grammar and corpus digests

Eight laws, and the door refuses the rest.

01 The compile target is the standard's own vocabulary.
po, desadv, inv, recadv — plus bol, rma and prodorder where a system emits them — are CBV 2.0 §7.3 business-transaction types, and bizTransactionList rides on every EPCIS event type (§8.5). Nothing this layer writes needs an extension namespace.
02 Byte-exact or refused.
emit(parse(x)) === x, byte-compared, on every document — the canonical JSON is lossless, segment-order-preserving, delimiter-aware. A document the round-trip cannot hold is refused with a typed error, never silently normalised.
03 Superset, and conformant — always together.
Where a document carries more than the standard models, the extra context rides along; and every emitted event validates against the pinned official EPCIS 2.0 JSON schema before it leaves the tool. A superset that stops validating is a fork; this one never ships an event the standard would refuse.
04 The ASN's tree becomes the aggregation tree.
The 856 HL hierarchy — Shipment, Order, Tare, Pack, Item — compiles to AggregationEvents: SSCC parents from MAN, children from LIN/SN1, serial-grain when serials are present, lot-grain when they are not. The worked example is a page of its own.
05 Parties land as parties, grain intact.
N1-loop GLNs compile to sourceList/destinationListowning_party, possessing_party, location, CBV §7.4 — the company grain the standard already solves. The worker-and-agent grain — who, the attested observer — belongs to the capture door and is never faked from a document; capturedBy, the warrantor account, is the gateway's stamp, and the two are never collapsed.
06 Reconcile returns a verdict.
What the ASN claimed against what the events observed: a typed diff and an exit code — 0 agree, 1 discrepant — wireable into a go-live gate or a nightly cron. The transcript is the acceptance artifact.
07 X12 is linked, never republished.
Element-level X12 detail is licensed content. This surface writes original prose, self-authored fixtures and its own schemas, and deep-links the canonical public X12 reference for segment detail; EDIFACT and EANCOM — open content — are vendored and pinned by digest.
08 One door for people and agents.
Every verb is an MCP tool through the same core — parse, join, reconcile re-dispatch through the same code path a person's shell uses. An agent integrates without a sales conversation, with the same access a person would use.

One worked run.

An ASN in, the aggregation tree out, the paperwork riding as context. The full walkthrough — fixture, output, and the four spec-sanctioned joins — is the 856 post.

$ npx transactions.dev join 856-one-pallet.edi --json

{ "type": "AggregationEvent",
  "parentID": "urn:epc:id:sscc:0614141.1234567890",
  "bizTransactionList": [
    { "type": "desadv", "bizTransaction": "urn:epc:id:gdti:0614141.00001.8560001" },
    { "type": "po",     "bizTransaction": "urn:epc:id:gdti:0614141.00001.4500123" } ],
  ... }

$ npx transactions.dev reconcile 856-20260728.edi --against events.jsonl
DISCREPANT  expected 192 cases · observed 190 · 2 findings
$ echo $?
1

Who this is for.

Five shapes of work, and the access flow asks which is yours — after the address, never before it.

Compiling EDI I already exchange

X12 850/856/810 or EDIFACT ORDERS/DESADV/INVOIC in; conformant EPCIS 2.0 events with bizTransaction context out.

Joining a system of record

Orders, fulfillments, and receipts from an ecommerce platform, an ERP, or a 3PL's WMS, compiled to po / desadv / recadv references.

Embedding the layer in my product

You ship software to supply-chain customers and want the transaction join as a dependency, not a department.

Reconciling shipped against seen

The ASN says what left; the events say what arrived. You want the difference as a machine verdict.

An agent transacts for me

An agent parses, joins, and reconciles over MCP, with the same access a person would use.