# Translate — ten years of vendor XML, translated

A decade of EPCIS 1.1 and 1.2 XML becomes EPCIS 2.0 JSON-LD, deterministically, with a per-job round-trip fidelity report whose law is: loss may exist, but silence about it may not.

**Proof, not adjectives.** This build could not verify the gateway's test suite green, so no sentence on this page claims a passing run — the last verified run is recorded in the repository's own CI, not here. Live on this origin, no key: POST /translate, /validate, /hash. No conformance attestation has ever been issued. The dated ledger is /what-ships-today/.

## The fidelity report is the contract

Every job returns a report beside the output. roundTripClean is computed by recomputation — every source leaf must be accounted for in the output, and a miss is a translator defect: the job fails and is never delivered. lossyPaths enumerates every source path with no standard 2.0 home, so loss is declared, never silent.

## Three doors, one engine

POST /translate translates and returns — it answers on this origin with no key, because a calculator is not a store; the caller decides whether to capture. POST /capture/xml translates and captures in one door, under the full gateway laws, with your capture key. And translate is an MCP tool with readOnlyHint: true. All three run the same engine. The proof corpus is committed: golden-corpus/xml-translation/ holds source→expected fixture pairs, and the round-trip suite runs in CI.

```
curl -X POST https://epcis.dev/translate \
  -H 'content-type: application/xml' \
  --data-binary @legacy-1.2.xml
```
