Every value should be able to explain itself.

Each lineage document is a graph of where data came from. Append to it as you modify data to never lose track of source and confidence. OpenParser returns lineage with every extraction.

SOURCEinvoicedemo-invoice.pdfsource artifact · PDFSOURCEtax_rate20%source value · workflow inputPARSEparsed_invoice1 page · 35 blocksparse · activity parse + artifact parsed_invoiceEXTRACT0.97amount€1.200,00extract · activity extract_amount + value amount · confidence 0.97EXTRACT0.94descriptionCloud hosting…extract · activity extract_description + value description · confidence 0.94COMPUTEamount_n1200compute · activity normalize_amount + value amount_nINFER0.82categoryIT servicesinfer · activity classify + value category · confidence 0.82COMPUTEtax240compute · activity compute_tax + value taxCOMPUTEtotal1440compute · activity compute_total + value totalOUTPUT/amount1200visual output binding · bound to amount_nOUTPUT/tax240visual output binding · bound to taxOUTPUT/total1440visual output binding · bound to totalOUTPUT/categoryIT servicesvisual output binding · bound to category_reviewed
/total · output · bound to total
example.lineage.json
total
{
"format": "lineage@1",
"id": "invoice-demo-1",
"profiles": [
"https://docs.openparser.dev/lineage/openparser"
],
"entities": {
"invoice": {
"kind": "artifact",
"name": "demo-invoice.pdf",
"locator": {
"uri": "file:demo-invoice.pdf",
"mediaType": "application/pdf"
},
"digest": {
"algorithm": "sha256",
"value": "9f2c…"
}
},
"tax_rate": {
"kind": "value",
"name": "tax_rate",
"value": 0.2,
"path": "/tax_rate",
"attributes": {
"source": "workflow-input"
}
},
"parsed_invoice": {
"kind": "artifact",
"name": "parsed-document.json",
"attributes": {
"pageCount": 1,
"blockCount": 35
}
},
"evid_net_amount": {
"kind": "evidence",
"name": "net_amount region",
"value": "€1.200,00",
"selector": {
"type": "openparser.document-region",
"value": {
"elementId": "net_amount",
"pageNumber": 1,
"bbox": [
473,
409,
529,
425
],
"sourceType": "text",
"granularity": "region"
}
},
"confidence": [
{
"score": 0.99,
"scale": {
"min": 0,
"max": 1
},
"kind": "reported",
"scope": "recognition",
"granularity": "region",
"calibrated": false,
"sources": [
{
"type": "activity",
"id": "parse"
}
]
}
]
},
"evid_description": {
"kind": "evidence",
"name": "description region",
"value": "Cloud hosting subscription",
"selector": {
"type": "openparser.document-region",
"value": {
"elementId": "description",
"pageNumber": 1,
"bbox": [
53,
273,
202,
290
],
"sourceType": "text",
"granularity": "region"
}
},
"confidence": [
{
"score": 0.98,
"scale": {
"min": 0,
"max": 1
},
"kind": "reported",
"scope": "recognition",
"granularity": "region",
"calibrated": false,
"sources": [
{
"type": "activity",
"id": "parse"
}
]
}
]
},
"amount": {
"kind": "value",
"name": "amount",
"value": "€1.200,00",
"path": "/amount",
"confidence": [
{
"score": 0.97,
"scale": {
"min": 0,
"max": 1
},
"kind": "reported",
"scope": "extraction",
"calibrated": false,
"sources": [
{
"type": "activity",
"id": "extract_amount"
}
]
}
]
},
"description": {
"kind": "value",
"name": "description",
"value": "Cloud hosting subscription",
"path": "/description",
"confidence": [
{
"score": 0.94,
"scale": {
"min": 0,
"max": 1
},
"kind": "reported",
"scope": "extraction",
"calibrated": false,
"sources": [
{
"type": "activity",
"id": "extract_description"
}
]
}
]
},
"amount_n": {
"kind": "value",
"name": "amount_n",
"value": 1200,
"path": "/amount"
},
"tax": {
"kind": "value",
"name": "tax",
"value": 240,
"path": "/tax"
},
"total": {
"kind": "value",
"name": "total",
"value": 1440,
"path": "/total"
},
"category": {
"kind": "value",
"name": "category",
"value": "IT services",
"path": "/category",
"confidence": [
{
"score": 0.82,
"scale": {
"min": 0,
"max": 1
},
"kind": "reported",
"scope": "classification",
"calibrated": true,
"sources": [
{
"type": "activity",
"id": "classify"
}
],
"method": "class_probability",
"attributes": {
"distribution": {
"IT services": 0.82,
"Software": 0.11,
"Consulting": 0.05,
"Other": 0.02
}
}
}
]
},
"category_reviewed": {
"kind": "value",
"name": "category_reviewed",
"value": "IT services",
"path": "/category",
"confidence": [
{
"score": 1,
"scale": {
"min": 0,
"max": 1
},
"kind": "assessed",
"scope": "review",
"calibrated": true,
"sources": [
{
"type": "agent",
"id": "reviewer"
}
]
}
],
"attributions": [
{
"agent": "reviewer",
"role": "reviewer"
}
]
}
},
"activities": {
"parse": {
"type": "parse",
"name": "Parse invoice PDF",
"status": "ended",
"implementation": {
"type": "software",
"name": "openparser-parse",
"version": "1.42.0"
},
"associations": [
{
"agent": "parser",
"role": "executor"
}
]
},
"extract_amount": {
"type": "ai.extract",
"name": "Extract amount",
"status": "ended",
"implementation": {
"type": "software",
"name": "openparser-extract",
"version": "1.42.0"
},
"associations": [
{
"agent": "extractor",
"role": "executor"
}
]
},
"extract_description": {
"type": "ai.extract",
"name": "Extract description",
"status": "ended",
"implementation": {
"type": "software",
"name": "openparser-extract",
"version": "1.42.0"
},
"associations": [
{
"agent": "extractor",
"role": "executor"
}
]
},
"normalize_amount": {
"type": "compute",
"name": "Normalize currency",
"status": "ended",
"parameters": {
"expr": "parseCurrency(amount, 'de-DE')"
}
},
"compute_tax": {
"type": "compute",
"name": "Compute tax",
"status": "ended",
"parameters": {
"expr": "amount_n * tax_rate"
},
"associations": [
{
"agent": "billing-service",
"role": "executor"
}
]
},
"compute_total": {
"type": "compute",
"name": "Compute total",
"status": "ended",
"parameters": {
"expr": "amount_n + tax"
}
},
"classify": {
"type": "infer",
"name": "Classify category",
"status": "ended",
"implementation": {
"type": "model",
"name": "classifier",
"version": "finance-v3"
},
"associations": [
{
"agent": "classifier",
"role": "executor"
}
]
},
"review_category": {
"type": "review.confirm",
"name": "Confirm category",
"status": "ended",
"associations": [
{
"agent": "reviewer",
"role": "reviewer"
}
]
}
},
"agents": {
"parser": {
"type": "software",
"name": "openparser-parse@1.42.0"
},
"extractor": {
"type": "software",
"name": "openparser-extract@1.42.0"
},
"classifier": {
"type": "software",
"name": "classifier@finance-v3"
},
"billing-service": {
"type": "software",
"name": "Billing service"
},
"reviewer": {
"type": "person",
"name": "analyst@acme"
}
},
"derivations": [
{
"id": "d-parsed",
"output": "parsed_invoice",
"activity": "parse",
"inputs": [
{
"entity": "invoice",
"role": "document",
"effect": "direct"
}
]
},
{
"id": "d-evid-amount",
"output": "evid_net_amount",
"activity": "parse",
"inputs": [
{
"entity": "invoice",
"role": "document",
"effect": "direct"
},
{
"entity": "parsed_invoice",
"role": "parsed",
"effect": "direct"
}
]
},
{
"id": "d-evid-description",
"output": "evid_description",
"activity": "parse",
"inputs": [
{
"entity": "invoice",
"role": "document",
"effect": "direct"
},
{
"entity": "parsed_invoice",
"role": "parsed",
"effect": "direct"
}
]
},
{
"id": "d-amount",
"output": "amount",
"activity": "extract_amount",
"inputs": [
{
"entity": "evid_net_amount",
"role": "evidence",
"effect": "direct"
},
{
"entity": "parsed_invoice",
"role": "document",
"effect": "indirect"
}
]
},
{
"id": "d-description",
"output": "description",
"activity": "extract_description",
"inputs": [
{
"entity": "evid_description",
"role": "evidence",
"effect": "direct"
},
{
"entity": "parsed_invoice",
"role": "document",
"effect": "indirect"
}
]
},
{
"id": "d-amount-n",
"output": "amount_n",
"activity": "normalize_amount",
"inputs": [
{
"entity": "amount",
"role": "amount",
"effect": "direct"
}
],
"transformation": {
"type": "transformation",
"expression": "parseCurrency(amount, 'de-DE')"
}
},
{
"id": "d-tax",
"output": "tax",
"activity": "compute_tax",
"inputs": [
{
"entity": "amount_n",
"role": "amount",
"effect": "direct"
},
{
"entity": "tax_rate",
"role": "rate",
"effect": "direct"
}
],
"transformation": {
"type": "transformation",
"expression": "amount_n * tax_rate"
}
},
{
"id": "d-total",
"output": "total",
"activity": "compute_total",
"inputs": [
{
"entity": "amount_n",
"role": "amount",
"effect": "direct"
},
{
"entity": "tax",
"role": "tax",
"effect": "direct"
}
],
"transformation": {
"type": "transformation",
"expression": "amount_n + tax"
}
},
{
"id": "d-category",
"output": "category",
"activity": "classify",
"inputs": [
{
"entity": "description",
"role": "text",
"effect": "direct"
}
]
},
{
"id": "d-category-reviewed",
"output": "category_reviewed",
"activity": "review_category",
"inputs": [
{
"entity": "category",
"role": "prior",
"effect": "direct"
}
],
"transformation": {
"type": "identity",
"description": "Human reviewer confirmed the classifier label"
}
}
],
"relations": [],
"outputs": [
"amount_n",
"tax",
"total",
"category_reviewed"
]
}
Source document · /total
demo-invoice.pdf · page 1
full page
Step detail
/total
Operation
compute
Rule
amount_n + tax
Equation
1200 + 240=1440
Inputs
amount_n1200
tax240
[ The whole model ]

Four primitives, one sentence.

The billing service (agent) ran compute_tax (activity), using amount and tax rate (input entities) to produce tax (an output entity). That complete production record is one derivation.

01

Entities

Values, artifacts, evidence, decisions, and collections.

02

Activities

Operations that use or produce entities, such as parsing or reviewing.

03

Agents

People, organizations, software, services, or models responsible for work.

04

Derivations

One output entity, the activity that produced it, and its exact inputs.

One derivation

Read it like a sentence.

The compute_tax activity produced tax 240 from amount 1200 and tax rate 20%, with a readable transformation expression.

derivation
{
  "id": "d-tax",
  "output": "tax",
  "activity": "compute_tax",
  "inputs": [
    { "entity": "amount_n", "role": "amount", "effect": "direct" },
    { "entity": "tax_rate", "role": "rate", "effect": "direct" }
  ],
  "transformation": {
    "type": "transformation",
    "expression": "amount_n * tax_rate"
  }
}
[ Fields ]

Nothing hidden behind the vocabulary.

A lineage document maps entities, activities, and agents, plus output-centric derivations.

formatProtocol version in the document.
entitiesValues, artifacts, evidence, decisions, and collections.
activitiesProcesses that used and/or generated entities.
agentsPeople, organizations, software, services, or models.
derivationsOutput-centric edges: one activity produced one output from typed inputs.
outputsEntity ids that are the primary results of this document.
profilesOptional URIs declaring domain vocabulary and selectors.
confidenceFirst-class assertions with score, scale, kind, and scope. Never multiplied across steps.

Hard rules

  • IDs are globally unique across entities, activities, agents, and derivations.
  • Every reference resolves; the derivation graph is acyclic.
  • Each derived entity has at most one producer.
  • Entity paths use RFC 6901 JSON Pointer.

Composition rules

  • Services preserve existing entities and append new ones.
  • Services may replace the outputs projection.
  • Confidence assertions stay scoped. They are never multiplied across steps.
  • Profiles extend vocabulary without changing lineage.

Make data explain itself.

Copy the lineage example, pass it to another service, and keep appending.

Read the docs
$10 free credits

Parse one of your PDFs in Studio

Upload a PDF in Studio and inspect blocks, markdown, and extracted JSON. New accounts get $10 in free credits.