Purchase orders, ASNs, invoices —
compiled onto the event record.
transactions.dev is the business-transaction layer of the visibility.cloud family. The canonical document is the native form here, and X12 and EDIFACT are its conformant lossy-down projection — the same law the family's spine applies to EPCIS 2.0. Documents in any face compile to bizTransaction context on conformant events using 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.
A business document is a company's claim, and never a unit's record. An 856 asserts that forty-eight cases left on a pallet; nothing in it observed one arriving. Its parties are organizations — an N1 loop resolving to a GLN — and organizations do not scan things. People, agents and devices do, at a dock door, at a time. So the paperwork cannot close its own loop, and the document flow you already run is the event context you are missing.
This layer is that join, and it terminates the rails the join arrives on: not an EDI network, not a VAN, not a mapping consultancy.
Four faces, one digest.
One shipment, recorded once. The page a clerk initials, the 856 a trading partner receives, the structured documents a modern stack speaks, and the square on the pallet — all of them derived from the same record, all of them proving the same digest.
The square does not carry the EPCIS document. It carries the shipment's own fields — GS1 Application Identifiers, in the query string of a Digital Link URI, exactly where the URI syntax puts data attributes. The EPCIS event is what the dock writes when it scans that square, and the two are joined by one digest.
face 1 — the page
The form is cropped by the frame — the page continues.
Composed: the form's header block and its supplemental bar code area, brought together. On the printed landscape form they sit apart.
face 2 — the EDI
ISA*00* *00* *ZZ*NRFCSHIP *ZZ*CGDC14 *260804*1400*U*00401*000000093*0*P*>~
GS*SH*NRFCSHIP*CGDC14*20260804*1400*93*X*004010~
ST*856*0093~
BSN*00*95212300000000093*20260804*1400*0001~
HL*1**S~
TD1*CTN25*18****G*94.35*KG~
TD5*B*2*NRFC*M*LTL-DIRECT.DOCK-14~
REF*BM*GINC-95212-260804-0093~
DTM*011*20260804~
TD3*TL*NRFC*48221~
REF*SN*0951447~
DTM*002*20260806*1800~
N1*ST*CENTRAL-GROCERS-DC-14*UL*0952123000019~
N3*220 INTERMODAL PKWY~
N4*LA VERGNE*TN*37086*US~
N1*SF*NORTHRIDGE-FOODS-CO*UL*0952123000033~
N3*1400 DEPOT RD~
N4*LA VERGNE*TN*37086*US~
N1*BT**UL*0952123000026~
HL*2*1*O~
PRF*PO-4471-0093~
HL*3*2*T~
MAN*GM*009521230000000019~
HL*4*3*I~
LIN*1*UP*952123400001*UK*09521234000013~
SN1**120*EA~
HL*5*3*I~
LIN*2*UP*952123400002*UK*09521234000020~
SN1**96*EA~
HL*6*3*I~
LIN*3*UP*952123400003*UK*09521234000037~
SN1**240*EA~
HL*7*3*I~
LIN*4*UP*952123400004*UK*09521234000044~
SN1**60*EA~
HL*8*3*I~
LIN*5*UP*952123400005*UK*09521234000051~
SN1**180*EA~
HL*9*3*I~
LIN*6*UP*952123400006*UK*09521234000068~
SN1**48*EA~
HL*10*3*I~
LIN*7*UP*952123400007*UK*09521234000075~
SN1**144*EA~
HL*11*3*I~
LIN*8*UP*952123400008*UK*09521234000082~
SN1**72*EA~
HL*12*3*I~
LIN*9*UP*952123400009*UK*09521234000099~
SN1**216*EA~
HL*13*3*I~
LIN*10*UP*952123400010*UK*09521234000105~
SN1**36*EA~
HL*14*3*I~
LIN*11*UP*952123400011*UK*09521234000112~
SN1**108*EA~
HL*15*3*I~
LIN*12*UP*952123400012*UK*09521234000129~
SN1**120*EA~
CTT*12*1440~
SE*59*0093~
GE*1*93~
IEA*1*000000093~
the same shipment as EDIFACT DESADV
UNB+UNOC:3+0952123000033:14+0952123000019:14+260804:1400+93'
UNH+1+DESADV:D:96A:UN:EAN005'
BGM+351+95212300000000093+9'
DTM+11:202608041400:203'
DTM+2:202608061800:203'
RFF+ON:PO-4471-0093'
NAD+SU+0952123000033::9++NORTHRIDGE-FOODS-CO+1400 DEPOT RD+LA VERGNE+TN+37086+US'
NAD+DP+0952123000019::9++CENTRAL-GROCERS-DC-14+220 INTERMODAL PKWY+LA VERGNE+TN+37086+US'
NAD+IV+0952123000026::9'
TDT+20++30++NRFC'
EQD+TE+NRFC-48221++++5'
SEL+0951447+CA'
CPS+1'
PAC+1++201'
MEA+PD+AAB+KGM:94.35'
GIN+BJ+009521230000000019'
LIN+1++09521234000013:SRV'
QTY+12:120:PCE'
LIN+2++09521234000020:SRV'
QTY+12:96:PCE'
LIN+3++09521234000037:SRV'
QTY+12:240:PCE'
LIN+4++09521234000044:SRV'
QTY+12:60:PCE'
LIN+5++09521234000051:SRV'
QTY+12:180:PCE'
LIN+6++09521234000068:SRV'
QTY+12:48:PCE'
LIN+7++09521234000075:SRV'
QTY+12:144:PCE'
LIN+8++09521234000082:SRV'
QTY+12:72:PCE'
LIN+9++09521234000099:SRV'
QTY+12:216:PCE'
LIN+10++09521234000105:SRV'
QTY+12:36:PCE'
LIN+11++09521234000112:SRV'
QTY+12:108:PCE'
LIN+12++09521234000129:SRV'
QTY+12:120:PCE'
CNT+2:12'
CNT+11:1440'
UNT+43+1'
UNZ+1+93'
face 3 — the structured faces
<?xml version="1.0" encoding="UTF-8"?>
<DespatchAdvice xmlns="urn:oasis:names:specification:ubl:schema:xsd:DespatchAdvice-2"
xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2">
<cbc:ID>95212300000000093</cbc:ID>
<cbc:IssueDate>2026-08-04</cbc:IssueDate>
<cbc:DocumentStatusCode>9</cbc:DocumentStatusCode>
<cac:OrderReference><cbc:ID>PO-4471-0093</cbc:ID></cac:OrderReference>
<cac:DespatchSupplierParty><cac:Party>
<cbc:EndpointID schemeID="0088">0952123000033</cbc:EndpointID>
<cac:PartyName><cbc:Name>NORTHRIDGE-FOODS-CO</cbc:Name></cac:PartyName>
</cac:Party></cac:DespatchSupplierParty>
<cac:DeliveryCustomerParty><cac:Party>
<cbc:EndpointID schemeID="0088">0952123000019</cbc:EndpointID>
<cac:PartyName><cbc:Name>CENTRAL-GROCERS-DC-14</cbc:Name></cac:PartyName>
</cac:Party></cac:DeliveryCustomerParty>
<cac:Shipment>
<cbc:ID>009521230000000019</cbc:ID>
<cbc:GrossWeightMeasure unitCode="KGM">94.35</cbc:GrossWeightMeasure>
<cbc:TotalTransportHandlingUnitQuantity>18</cbc:TotalTransportHandlingUnitQuantity>
</cac:Shipment>
<cac:DespatchLineGroup>
<cac:DespatchLine>
<cbc:ID>1</cbc:ID>
<cbc:DeliveredQuantity unitCode="EA">120</cbc:DeliveredQuantity>
<cac:Item><cac:StandardItemIdentification>
<cbc:ID schemeID="GTIN">09521234000013</cbc:ID>
</cac:StandardItemIdentification></cac:Item>
</cac:DespatchLine>
<cac:DespatchLine>
<cbc:ID>2</cbc:ID>
<cbc:DeliveredQuantity unitCode="EA">96</cbc:DeliveredQuantity>
<cac:Item><cac:StandardItemIdentification>
<cbc:ID schemeID="GTIN">09521234000020</cbc:ID>
</cac:StandardItemIdentification></cac:Item>
</cac:DespatchLine>
<cac:DespatchLine>
<cbc:ID>3</cbc:ID>
<cbc:DeliveredQuantity unitCode="EA">240</cbc:DeliveredQuantity>
<cac:Item><cac:StandardItemIdentification>
<cbc:ID schemeID="GTIN">09521234000037</cbc:ID>
</cac:StandardItemIdentification></cac:Item>
</cac:DespatchLine>
<cac:DespatchLine>
<cbc:ID>4</cbc:ID>
<cbc:DeliveredQuantity unitCode="EA">60</cbc:DeliveredQuantity>
<cac:Item><cac:StandardItemIdentification>
<cbc:ID schemeID="GTIN">09521234000044</cbc:ID>
</cac:StandardItemIdentification></cac:Item>
</cac:DespatchLine>
<cac:DespatchLine>
<cbc:ID>5</cbc:ID>
<cbc:DeliveredQuantity unitCode="EA">180</cbc:DeliveredQuantity>
<cac:Item><cac:StandardItemIdentification>
<cbc:ID schemeID="GTIN">09521234000051</cbc:ID>
</cac:StandardItemIdentification></cac:Item>
</cac:DespatchLine>
<cac:DespatchLine>
<cbc:ID>6</cbc:ID>
<cbc:DeliveredQuantity unitCode="EA">48</cbc:DeliveredQuantity>
<cac:Item><cac:StandardItemIdentification>
<cbc:ID schemeID="GTIN">09521234000068</cbc:ID>
</cac:StandardItemIdentification></cac:Item>
</cac:DespatchLine>
<cac:DespatchLine>
<cbc:ID>7</cbc:ID>
<cbc:DeliveredQuantity unitCode="EA">144</cbc:DeliveredQuantity>
<cac:Item><cac:StandardItemIdentification>
<cbc:ID schemeID="GTIN">09521234000075</cbc:ID>
</cac:StandardItemIdentification></cac:Item>
</cac:DespatchLine>
<cac:DespatchLine>
<cbc:ID>8</cbc:ID>
<cbc:DeliveredQuantity unitCode="EA">72</cbc:DeliveredQuantity>
<cac:Item><cac:StandardItemIdentification>
<cbc:ID schemeID="GTIN">09521234000082</cbc:ID>
</cac:StandardItemIdentification></cac:Item>
</cac:DespatchLine>
<cac:DespatchLine>
<cbc:ID>9</cbc:ID>
<cbc:DeliveredQuantity unitCode="EA">216</cbc:DeliveredQuantity>
<cac:Item><cac:StandardItemIdentification>
<cbc:ID schemeID="GTIN">09521234000099</cbc:ID>
</cac:StandardItemIdentification></cac:Item>
</cac:DespatchLine>
<cac:DespatchLine>
<cbc:ID>10</cbc:ID>
<cbc:DeliveredQuantity unitCode="EA">36</cbc:DeliveredQuantity>
<cac:Item><cac:StandardItemIdentification>
<cbc:ID schemeID="GTIN">09521234000105</cbc:ID>
</cac:StandardItemIdentification></cac:Item>
</cac:DespatchLine>
<cac:DespatchLine>
<cbc:ID>11</cbc:ID>
<cbc:DeliveredQuantity unitCode="EA">108</cbc:DeliveredQuantity>
<cac:Item><cac:StandardItemIdentification>
<cbc:ID schemeID="GTIN">09521234000112</cbc:ID>
</cac:StandardItemIdentification></cac:Item>
</cac:DespatchLine>
<cac:DespatchLine>
<cbc:ID>12</cbc:ID>
<cbc:DeliveredQuantity unitCode="EA">120</cbc:DeliveredQuantity>
<cac:Item><cac:StandardItemIdentification>
<cbc:ID schemeID="GTIN">09521234000129</cbc:ID>
</cac:StandardItemIdentification></cac:Item>
</cac:DespatchLine>
</cac:DespatchLineGroup>
</DespatchAdvice>
{
"type": "desadv",
"id": "95212300000000093",
"order": "PO-4471-0093",
"carrierReference": "GINC-95212-260804-0093",
"shipFrom": {
"gln": "0952123000033",
"name": "NORTHRIDGE-FOODS-CO"
},
"shipTo": {
"gln": "0952123000019",
"name": "CENTRAL-GROCERS-DC-14"
},
"billTo": {
"gln": "0952123000026"
},
"shipped": "20260804T140000Z",
"grossWeightKg": 94.35,
"handlingUnits": 18,
"totalUnits": 1440,
"pallets": [
{
"sscc": "009521230000000019",
"lines": [
{
"line": 1,
"gtin": "09521234000013",
"quantity": 120,
"netWeightKg": 15.75
},
{
"line": 2,
"gtin": "09521234000020",
"quantity": 96,
"netWeightKg": 12.84
},
{
"line": 3,
"gtin": "09521234000037",
"quantity": 240,
"netWeightKg": 31.5
},
{
"line": 4,
"gtin": "09521234000044",
"quantity": 60,
"netWeightKg": 8.2
},
{
"line": 5,
"gtin": "09521234000051",
"quantity": 180,
"netWeightKg": 23.6
},
{
"line": 6,
"gtin": "09521234000068",
"quantity": 48,
"netWeightKg": 6.4
},
{
"line": 7,
"gtin": "09521234000075",
"quantity": 144,
"netWeightKg": 18.9
},
{
"line": 8,
"gtin": "09521234000082",
"quantity": 72,
"netWeightKg": 9.6
},
{
"line": 9,
"gtin": "09521234000099",
"quantity": 216,
"netWeightKg": 28.35
},
{
"line": 10,
"gtin": "09521234000105",
"quantity": 36,
"netWeightKg": 4.8
},
{
"line": 11,
"gtin": "09521234000112",
"quantity": 108,
"netWeightKg": 14.16
},
{
"line": 12,
"gtin": "09521234000129",
"quantity": 120,
"netWeightKg": 15.75
}
]
}
]
}
what the receiving scan writes — EPCIS 2.0 AggregationEvent
{
"@context": [
"https://ref.gs1.org/standards/epcis/2.0.0/epcis-context.jsonld"
],
"type": "EPCISDocument",
"schemaVersion": "2.0",
"creationDate": "20260804T140000.000Z",
"epcisBody": {
"eventList": [
{
"type": "AggregationEvent",
"eventTime": "20260804T140000.000Z",
"eventTimeZoneOffset": "-05:00",
"parentID": "urn:epc:id:sscc:0952123.0000000001",
"childEPCs": [
"urn:epc:idpat:sgtin:9521234.00001.*",
"urn:epc:idpat:sgtin:9521234.00002.*",
"urn:epc:idpat:sgtin:9521234.00003.*",
"urn:epc:idpat:sgtin:9521234.00004.*",
"urn:epc:idpat:sgtin:9521234.00005.*",
"urn:epc:idpat:sgtin:9521234.00006.*",
"urn:epc:idpat:sgtin:9521234.00007.*",
"urn:epc:idpat:sgtin:9521234.00008.*",
"urn:epc:idpat:sgtin:9521234.00009.*",
"urn:epc:idpat:sgtin:9521234.00010.*",
"urn:epc:idpat:sgtin:9521234.00011.*",
"urn:epc:idpat:sgtin:9521234.00012.*"
],
"action": "OBSERVE",
"bizStep": "receiving",
"disposition": "in_progress",
"readPoint": {
"id": "urn:epc:id:sgln:0952123.00001.0"
},
"bizTransactionList": [
{
"type": "bol",
"bizTransaction": "urn:epc:id:gdti:sha256:0a27b6ae29c85616e4201bfee5bebf677441d34f59997eb10804a75d27490254"
},
{
"type": "desadv",
"bizTransaction": "urn:epcglobal:cbv:bt:95212300000000093"
},
{
"type": "po",
"bizTransaction": "urn:epcglobal:cbv:bt:PO-4471-0093"
}
]
}
]
}
}
face 4 — the square
the complete address, exactly as it was handed to the encoder
https://barcoding.dev/00/009521230000000019?402=95212300000000093&401=GINC-95212-260804-0093&400=PO-4471-0093&403=LTL-DIRECT.DOCK-14&410=0952123000019&411=0952123000026&412=0952123000033&413=0952123000040&414=0952123000057&415=0952123000064&417=0952123000071&420=37086&422=840&30=18&37=1440&3302=009435&3922=1875500&8008=260804140000&7003=2608061800&90=SCAC.NRFC-CLASS.85-NMFC.156600&91=SHIPFROM.NORTHRIDGE-FOODS-CO.1400-DEPOT-RD.LA-VERGNE.TN.37086.US&92=SHIPTO.CENTRAL-GROCERS-DC-14.220-INTERMODAL-PKWY.LA-VERGNE.TN.37086.US&93=TRAILER.NRFC-48221.SEAL.0951447.APPT.2608041400-2608041800.PREPAID&94=LI.09521234000013.0120.01575&94=LI.09521234000020.0096.01284&94=LI.09521234000037.0240.03150&94=LI.09521234000044.0060.00820&94=LI.09521234000051.0180.02360&94=LI.09521234000068.0048.00640&94=LI.09521234000075.0144.01890&94=LI.09521234000082.0072.00960&94=LI.09521234000099.0216.02835&94=LI.09521234000105.0036.00480&94=LI.09521234000112.0108.01416&94=LI.09521234000129.0120.01575
Same shipment, six encodings, one digest. The smallest is the only one that fits in a square you can print on the pallet — 979 bytes, GS1 Digital Link URI.
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 | — |
Nine laws, and the door refuses the rest.
- 01 The canonical document is the native form; EDI is its projection.
- X12 and EDIFACT are not the source of truth on this layer — each is one conformant, lossy-down face of a canonical business document that is native and versioned (biztx-canonical). It is the same law the family's spine applies to events: the superset form is native, the standard's form is a projection, and the projection is exact or the document is refused. Two canonical forms, and they are not the same object: parse lifts a wire face onto a lossless wire-canonical pivot that emit puts back byte for byte (law 03), and the business document is compiled from that pivot rather than from the bytes.
- 02 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.
- 03 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.
- 04 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.
- 05 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.
- 06 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.
- 07 Reconcile returns a verdict, and the verdict is chargeback defence.
- 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 seat this is written for runs an adversarial process against suppliers in which both sides have data and neither has evidence: vendor compliance, deductions, shortage claims. A document-only tool cannot settle that, because settling it needs attested physical custody the documents never held. The transcript is the acceptance artifact.
- 08 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.
- 09 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. Then the same identifiers against what the dock actually saw. The full walkthrough — fixture, output, and the four spec-sanctioned joins — is the 856 post.
Both are real runs against the pinned fixtures corpus/join/856-ship-notice-01.edi and corpus/reconcile/856-20260728.edi — every character is the tool's, with the CLI's tabs set as spaces and three long lines wrapped, because a tab means nothing on a web page. The provisional line is the join map naming every unratified default the run stood on; it is never applied silently. The published version on the registry is 0.1.0 and predates both verbs, so these run from the package at HEAD (P0-T29).
$ npx transactions.dev join 856-ship-notice-01.edi
joined events=2 document=urn:epcglobal:cbv:bt:0614141000012:SHIP20260730001
context desadv urn:epcglobal:cbv:bt:0614141000012:SHIP20260730001
context po urn:epcglobal:cbv:bt:0724142000017:PO-8812
context bol urn:epcglobal:cbv:bt:0614141000012:BOL-991
event 0 ObjectEvent OBSERVE shipping in_transit epcs=1
event 1 AggregationEvent ADD packing in_progress
parent=https://id.gs1.org/00/006141411234567890 children=2 classes=1
provisional JM-OPEN-3,JM-OPEN-4,JM-OPEN-8 unratified join-map defaults applied
$ npx transactions.dev reconcile 856-20260728.edi --against events-20260728.jsonl
DISCREPANT expected 192 cases · observed 190 · 2 findings
finding class=missing gtin=00614141073467 lot=2026B claimed=48 observed=47
delta=-1 basis=attributed
finding class=missing gtin=00614141073467 lot=2026C claimed=48 observed=47
delta=-1 basis=attributed
$ echo $?
1The first rung will be a copy. There will be a rung below it.
Onboarding is meant to be a routing entry, never an integration project. Neither rung is built. Both are named entries in the open ledger, and this is the shape they will ship in.
tap will register a read-only copy of a document flow you already run — out of the transaction path, nothing rerouted, no cut-over, no window. It will give paper-trail visibility from the day it is registered; physical visibility will join as capture connects. It will be free. Not built (P0-T26): tap is not a verb in the shipped engine — npx transactions.dev tap answers unknown verb — and there is no routing registration, no consent ceremony, no credential custody and no revocation behind it.
Below the tap will be a photograph. A page's barcodes are the transaction's foreign keys rendered optically — the SSCC on a packing list, the carrier PRO on a bill of lading, the order number on a pick ticket — so the transaction graph will rebuild from a picture of the paperwork, with no EDI at all. The tap presumes you already run digital document flows; a photograph presumes nothing. When it ships, decoded symbols will be hard facts and interpreted text will be confidence-graded and marked interpreted, never presented as decoded. Not built (P0-T26): rung zero waits on barcoding.dev's frame interpretation and on that fact grading.
The line, when it publishes (P0-T27): free — parse, validate, translate, and the passive tap; paid — termination, where we become your EDI endpoint, the digest-pinned partner maps, and chargeback-defence operations. No price for the paid line is published, and none may be until the metering unit per verb is settled — per document, per segment, per delivered route, per reconciled period. Every rung is meant to be self-serve; enterprise will not be sold at this door, and the governance and contract ceremony belong to visibility.cloud. What is live today: one price is published, and it is zero. Everything this origin serves answers with no key and no meter, and /pricing says so machine-readably on this door and on all three siblings — {"model":"free","binding":false}, where binding: false is the document telling an agent, in the same words this page uses, that free is our stated intent and not terms you can hold us to. The engine that answers is npx transactions.dev, whose shipped verbs are parse, emit, validate, ack, intake, join, reconcile, pins, version and mcp; translate is recognised and answers NOT_IMPLEMENTED, and tap is not a verb at all. join and reconcile landed after 0.1.0 was published, so the registry lags the engine until the next version publishes (P0-T29). The dated ledger is What ships today.
What ships today.
Four lines a column, out of 14 and 18. The rest of this page is written in the release tense; this is where the delta lives, and it is the account the rest of the site is checked against.
Shipped
- The engine as an npm package — npx transactions.dev; 0.1.0 is the only version on the registry so far
- emit — canonical JSON back to wire bytes; emit --verify reports class=byte-exact on the round trip, so the inverse is checked rather than asserted
- The MCP door, as an npm stdio server: npx -y transactions.dev mcp answers tools/list with parse, validate, ack, intake, join, reconcile
- The AXP machine faces on this origin: /.well-known/agents.json, /openapi.json, /pricing, /documents, /family.json, /icp.json, /index.json, /llms.txt
Open in the launch ledger
- No engine door answers on this origin. POST /parse, /validate, /translate, /tap and /reconcile all return 405; the worker mounts no engine route (P0-T1)
- The registry lags the engine. join and reconcile are built, tested and gated in the package, but the only version published is 0.1.0, which predates them — npx -y transactions.dev@0.1.0 reconcile still answers unknown verb. They reach a bare npx transactions.dev when the next version publishes (P0-T29)
- tap, the passive read-only flow copy: no routing registration, no consent ceremony, no credential custody, no revocation (P0-T26)
- Published prices. No number is published for this door anywhere, and none may be until the metering unit per verb is settled — per document, per segment, per delivered route, per reconciled period (P0-T27)
Four of 14 shipped and four of 18 open. Every open entry names its P0 number and closes by shipping the mechanism, never by softening a sentence.
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.
Defending chargebacks and shortage claims
The ASN says what left; the events say what arrived. Vendor compliance, deductions and shortage claims settled by a machine verdict with evidence behind it, rather than by whichever side's records get believed.
An agent transacts for me
An agent parses, joins, and reconciles over MCP, with the same access a person would use.