Your rules decide the answer
Relations like total == net + vat aren't a check run afterwards. Tickmarks uses them to choose between candidate values, so the answer you get is one that fits.
An invoice shows two totals, €121 and €112. Tickmarks returns €121, the only one that equals net plus VAT. When no candidate fits, as in the invoice above, you get a conflict instead.
Missing values are worked out, and labelled
If the rules can compute a value the document doesn't state, Tickmarks computes it and says so. You always know what was read and what was derived.
A lease starts on 1 March 2027 and runs 12 months. It never states an end date, but endDate == startDate + duration computes one:
"endDate": {
"status": "resolved",
"source": "derived",
"value": "2028-03-01",
"derived_by": ["d0"]
}
When it doesn't add up, you'll know
If the document contradicts itself, Tickmarks doesn't quietly pick a side. It marks the fields as a conflict and shows what each repair would give, so a person makes the call.
Net €100, VAT €21, total €112: all 3 fields come back conflict, with 3 repairs listed. Try them in the loop.