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.
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.
| verb | what it does | exit-1 verdict |
|---|---|---|
| parse | X12 or EDIFACT bytes → lossless canonical JSON (segment order and delimiters preserved) | syntax / envelope error |
| emit | canonical JSON → wire bytes, the byte-exact inverse of parse | non-emittable structure |
| validate | structural validation against a pinned grammar (set × version) | invalid document |
| ack | 997 / 999 / CONTRL from a validate result | — |
| translate | canonical JSON ↔ friendly per-set JSON | mapping failure |
| join | 856 / 850 / 940 / 945 / DESADV → EPCIS 2.0 events, validated against the pinned official schema | events fail EPCIS validation |
| reconcile | an ASN against captured events: typed diff, machine verdict | discrepant |
| pins | print 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/destinationList — owning_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 $?
1Who 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.