SCHEMA // PROOFLINE

A charge is only worth billing if you can show where it came from.

Nothing is stored as an opaque embedding blob. Every unit of evidence is a row you can inspect, query and revert, and every charge points at the rows underneath it. That is what you hand over when a customer challenges an invoice.

Node types

TYPEDESCRIPTIONCOUNT · 1,450 LOADS / MONTH
LOADOne shipment: its stops, its clock, its paperwork1,450
PARTYCarrier, customer, lane or driver, after aliases collapse493
CHARGEOne billable line, and the authority it rests on6,820
FACTAn atomic assertion: a time, a rate, a weight, a signature38,400
ARTIFACTThe document it was read out of11,400

Edge types

  • derived_fromfact → artifact

    provenance, always required. A fact with no document is not stored

  • authorisesfact → charge

    the clause, rate or timestamp that makes the line billable

  • supersedesfact → fact

    an amended rate confirmation replaces the original, in order

  • contradictsfact ↔ fact

    two sources disagree. Flagged for a person, never averaged

Validity windows

A timestamp does not expire: the truck arrived at 14:22 and always will have. A rate card does. Every fact carries the window it is true inside, so a load shipped in March is priced on March's fuel table however many times the table has changed since.

Contradiction detection

When the ELD says 14:22 and the driver's message says 15:10, both are kept, side by side, with the source and the time each was recorded. The graph never silently picks a winner, because the winner it picks is the one you would have to defend.

Time travel

The graph is append-only. Query it as of the ship date to see the rate card, the fuel table and the accessorial schedule exactly as they stood that day. Six weeks later, when the invoice is challenged, that is the only version that counts.

TIME // AS OF ANY DATE

The rate that applied on the day it shipped.

Your TMS can tell you what the fuel table says today. A billing dispute is never about today. Drag the scrubber and ask the same question at four points in the year: four different answers, each one correct on its date.

This is why rates and schedules carry validity windows instead of overwriting each other. A timestamp on a load is true forever. A fuel index is true between two dates, and billing the wrong one is how a charge gets clawed back six weeks later.

Q what fuel surcharge applies on the Columbus → Louisville lane?

$0.39 per mile. Lane sheet MID-4402 took effect on 1 August and reset the base. Nothing before that date is billed at this number.

◆rate-card/MID-4402in force from 1 AugIN FORCE
SAMPLE // FACT RECORD
{
  "id": "fact_9f31c",
  "entity": "load.LD-88213",
  "assertion": "Arrived at consignee 14:22, departed 18:47",
  "detention_hours": 2.4,
  "confidence": 0.91,
  "state": "disputed",
  "asserted_at": "2026-03-14T18:51:00Z",
  "valid_from": "2026-03-14T14:22:00Z",
  "derived_from": ["eld/ping_88213", "pod/scan_p4471.pdf"],
  "contradicts": ["fact_driver_text_1510"],
  "authorises": ["charge.DET-D.LD-88213"]
}
READING IT
  • Four hours twenty-five at the dock. Two hours free under the contract, so 2.4 hours are billable — $156 at $65 an hour. The arithmetic is on the page because you should be able to check it.
  • derived_from is not optional. Two documents put the truck there. Neither one alone would have raised this charge.
  • contradicts is why this cell is red, not green. The driver texted 15:10. Until somebody resolves the two, $156 is at risk rather than owed, and the record says so instead of quietly rounding it away.

Sample month. Illustrative record, no live connection.

Made by Sorvanis

We build data infrastructure for operations that run on documents. Proofline is the one for freight billing: every charge, with the proof attached.

dev@sorvanis.ai