OpenChainGraph Suite · ART-701

Three Way Invoice Match

Matches one invoice against its purchase order and its goods receipt and decides whether it can be paid. Every invoice line pairs to an unused PO line by declared po_line, then exact sku, then a free same-number PO line; there is no fuzzy text matching. Totals, tax and duplicate-invoice checks all run in integer minor units.

Three-Way MatchInteger Minor UnitsZero PIIClient-side only
🔒 All inputs are processed locally in your browser. No data is transmitted. Do not enter real personal data — use synthetic or anonymised inputs only.
Scope & reliance
Each paired line takes the first verdict that applies in a fixed order: quantity over received, receipt missing (a two-way match, reported as a flag rather than a failure), quantity over ordered, or unit price outside the declared basis-point tolerance, where a variance exactly at the tolerance passes. Totals are recomputed from the line sum, half-up tax at one declared rate, and the total from those two. Prior invoices from the same vendor are screened on the normalized invoice number, same total inside the declared day window, or the same PO. Fractional quantities and sub-minor-unit prices are refused with a named reason, never rounded; one currency per invoice; no tax-jurisdiction logic; day differences come from integer days-from-civil arithmetic with no clock. No formal correctness proof exists for this node yet (compute_proof_ready: deferred); see the proof-status note below the results.
Invoice under test
Edit any field and run. The sample is fixture F1, the clean-match seal vector from the conformance set.
Result
Proof status
This node ships compute_proof_ready: deferred. No formal correctness proof has been produced for this kernel; the result above is a deterministic recompute, verified by a property-test floor, not a proven one.
Execution Hash & §4 Artifact
SHA-256 execution hash (JCS canonical, RFC 8785):

      

Ask your agent

Copy this paragraph into Claude, OpenClaw, or any MCP-aware agent to run this exact tool, with this sample, and verify the artifact.

Run the AINumbers MCP tool `match_invoice_three_way`. Task: Matches an invoice against its purchase order and goods receipt in integer minor units, with explicit line pairing (declared po_line, then exact sku, then a free same-number PO line), a fixed first-apply line-verdict order, half-up tax from one declared rate, and same-vendor duplicate screening on the normalized invoice number, same total inside the day window, or same PO.
Call it with arguments: {"policy_parameters":{"currency":"USD","invoice":{"invoice_number":"INV-0042","issue_date":"2026-09-30","vendor_id":"V-1","po_number":"PO-7","subtotal_minor":170000,"tax_minor":14025,"total_minor":184025,"lines":[{"line":1,"po_line":1,"sku":"A-100","qty":10,"unit_price_minor":12000,"amount_minor":120000},{"line":2,"po_line":2,"sku":"B-200","qty":5,"unit_price_minor":4000,"amount_minor":20000},{"line":3,"po_line":3,"sku":"C-300","qty":2,"unit_price_minor":15000,"amount_minor":30000}]},"purchase_order":{"po_number":"PO-7","lines":[{"line":1,"sku":"A-100","qty":10,"unit_price_minor":12000},{"line":2,"sku":"B-200","qty":5,"unit_price_minor":4000},{"line":3,"sku":"C-300","qty":2,"unit_price_minor":15000}]},"goods_receipt":{"receipt_id":"GR-3","lines":[{"po_line":1,"qty_received":10},{"po_line":2,"qty_received":5},{"po_line":3,"qty_received":2}]},"vendor_terms":{"price_tolerance_bp":200,"tax_rate_bp":825,"tax_rounding":"half_up"},"prior_invoices":[],"duplicate_window_days":14}}
Verify before trusting: call `verify_execution_hash` on mcp.ainumbers.co (https://mcp.ainumbers.co/mcp) with the parameter `claimed_hash` set to the returned `execution_hash`, passing the full artifact the run returned (the object containing `policy_parameters` + `output_payload` + `execution_hash`; equivalently `policy_parameters` + `output_payload` with `claimed_hash`), not the bare hash string, or re-run the in-page WebMCP tool `match_invoice_three_way`.
Return the ledger link https://ledger.ainumbers.co/ so a human can re-verify without contacting us.
PII rule: All inputs are processed locally in your browser. No data is transmitted. Do not enter real personal data — use synthetic or anonymised inputs only.
Open the tool with the sample prefilled: https://ainumbers.co/chaingraph/art-701-three-way-invoice-match.html#p=v1.H4sIAAAAAAAA_wHEAzv8eyJjdXJyZW5jeSI6IlVTRCIsImludm9pY2UiOnsiaW52b2ljZV9udW1iZXIiOiJJTlYtMDA0MiIsImlzc3VlX2RhdGUiOiIyMDI2LTA5LTMwIiwidmVuZG9yX2lkIjoiVi0xIiwicG9fbnVtYmVyIjoiUE8tNyIsInN1YnRvdGFsX21pbm9yIjoxNzAwMDAsInRheF9taW5vciI6MTQwMjUsInRvdGFsX21pbm9yIjoxODQwMjUsImxpbmVzIjpbeyJsaW5lIjoxLCJwb19saW5lIjoxLCJza3UiOiJBLTEwMCIsInF0eSI6MTAsInVuaXRfcHJpY2VfbWlub3IiOjEyMDAwLCJhbW91bnRfbWlub3IiOjEyMDAwMH0seyJsaW5lIjoyLCJwb19saW5lIjoyLCJza3UiOiJCLTIwMCIsInF0eSI6NSwidW5pdF9wcmljZV9taW5vciI6NDAwMCwiYW1vdW50X21pbm9yIjoyMDAwMH0seyJsaW5lIjozLCJwb19saW5lIjozLCJza3UiOiJDLTMwMCIsInF0eSI6MiwidW5pdF9wcmljZV9taW5vciI6MTUwMDAsImFtb3VudF9taW5vciI6MzAwMDB9XX0sInB1cmNoYXNlX29yZGVyIjp7InBvX251bWJlciI6IlBPLTciLCJsaW5lcyI6W3sibGluZSI6MSwic2t1IjoiQS0xMDAiLCJxdHkiOjEwLCJ1bml0X3ByaWNlX21pbm9yIjoxMjAwMH0seyJsaW5lIjoyLCJza3UiOiJCLTIwMCIsInF0eSI6NSwidW5pdF9wcmljZV9taW5vciI6NDAwMH0seyJsaW5lIjozLCJza3UiOiJDLTMwMCIsInF0eSI6MiwidW5pdF9wcmljZV9taW5vciI6MTUwMDB9XX0sImdvb2RzX3JlY2VpcHQiOnsicmVjZWlwdF9pZCI6IkdSLTMiLCJsaW5lcyI6W3sicG9fbGluZSI6MSwicXR5X3JlY2VpdmVkIjoxMH0seyJwb19saW5lIjoyLCJxdHlfcmVjZWl2ZWQiOjV9LHsicG9fbGluZSI6MywicXR5X3JlY2VpdmVkIjoyfV19LCJ2ZW5kb3JfdGVybXMiOnsicHJpY2VfdG9sZXJhbmNlX2JwIjoyMDAsInRheF9yYXRlX2JwIjo4MjUsInRheF9yb3VuZGluZyI6ImhhbGZfdXAifSwicHJpb3JfaW52b2ljZXMiOltdLCJkdXBsaWNhdGVfd2luZG93X2RheXMiOjE0fXU-Hy7EAwAA