ART-825 · OpenChainGraph · UCP Checkout Totals Reconciler

UCP Checkout Totals Reconciler

Paste a Universal Commerce Protocol (UCP) cart, checkout or order document and this node recomputes the totals block in integer minor units: price × quantity per line, line subtotals rolled up to the document subtotal, and the breakdown identity subtotal − discounts + fulfillment + tax + fee = total. It returns RECONCILED, MISMATCH or INDETERMINATE and names every finding with its JSON path.

compliance_control server compute UCP 2026-08-25 verify-only, zero network exact integer arithmetic proof deferred

What it checks

The node is a verify-only reconcile: it recomputes arithmetic identities over the pasted document and checks the schema sign rules. It makes no network call, never fetches /.well-known/ucp, never fetches a key and never calls a merchant endpoint.

Recomputed identities
Line identityitem.price × line.quantity steps ÷ 10^scale, rounded at most once under the declared policy
Line roll-upreconciled line subtotals sum to the declared document subtotal entry
Breakdown identitysubtotal + items_discount + discount + fulfillment + tax + fee = total
Sign rulesdiscount and items_discount strictly negative; subtotal, fulfillment, tax and fee zero or positive (total.json)
Refund bound (order mode)net refunded (signed sum of adjustment totals) never exceeds the total paid
Roundingcaller-declared policy, default half_even; the rule applied is named in the output

Lines carrying item.unit_price mark a pricing basis different from the sale basis: the Business rounds that comparator once per its own rules, so the price × quantity identity is not protocol-asserted on such lines and the node skips them with a named code rather than guessing.

Arithmetic consistency is the whole check: the node recomputes identities and sign rules, and leaves the correctness of each tax, fee and discount amount to the Business, since UCP publishes no tax or rounding algorithm to reconcile against. Totals entry types beyond the seven canonical names are Business extensions whose sign semantics the protocol leaves open, so they are reported as indeterminate and left out of the breakdown identity.

Verdicts

RECONCILED

Every identity held: line subtotals match their price × quantity, the roll-up matches, the breakdown sums to the declared total, and in order mode the refund bound holds. A negative declared total still reconciles when the arithmetic holds; it is reported informationally (UCP issue #1025).

MISMATCH

At least one identity failed or a sign rule is violated. Each finding carries its JSON path, a code such as LINE_SUBTOTAL_MISMATCH, TOTALS_IDENTITY_MISMATCH or REFUND_EXCEEDS_TOTAL, and the recomputed value.

INDETERMINATE

Something could not be evaluated: an unknown Business-extension total type, a line without an assertable subtotal, or an input over a declared resource bound. The node never guesses past a bound. Structurally malformed documents refuse the whole call with compliance_flags ["INPUT_REFUSED"] and a named refusal code.

Input manifest

The node is invoked with policy_parameters carrying the pasted document and two optional parameters. Amounts are ISO 4217 minor units, integers within ±9007199254740991 (253−1); quantity is an integer step count of 10−scale of the sale-basis unit, scale 0..15.

policy_parameters
document (required, object)the pasted UCP cart, checkout or order document
mode (optional, string)"checkout" (default) or "order"; order mode adds adjustments reconciliation, the refund bound, and discount attribution reported as NOT_EVALUATED (issue #1026)
rounding (optional, string)half_even (default), half_up, half_down, floor, ceil
Declared resource bounds
line_items≤ 500
totals entries per breakdown≤ 100
order adjustments≤ 200
amountsintegers within ±2^53−1 minor units
document walk≤ 20000 nodes, depth ≤ 64

Refusal codes (whole-call, compliance_flags ["INPUT_REFUSED"]): DOCUMENT_NOT_OBJECT, MODE_INVALID, ROUNDING_INVALID, TOTALS_NOT_ARRAY, TOTALS_CARDINALITY, ENTRY_NOT_OBJECT, ENTRY_TYPE_MISSING, ENTRY_AMOUNT_MISSING, AMOUNT_NOT_INTEGER, LINE_TOTALS_NOT_ARRAY, SCALE_INVALID.

Provenance

Normative basis: the UCP schema and issue material at tag v2026-08-25 of github.com/Universal-Commerce-Protocol/ucp, pinned at commit 7a5daa55313f8b468aba76caf01fb76851d37f84, licensed Apache-2.0. Conformance fixtures for this node derive from that material, including the flower_shop reference storefront example; the protocol's schemas and issues #1025 (negative totals) and #1026 (order discount attribution) shape the verdict rules. This page and the node are CC BY 4.0; the UCP material remains under its own Apache-2.0 license.

Node page authored 2026-11-03 · sha-pinned to the UCP v2026-08-25 tag

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 `reconcile_ucp_checkout_totals`. Task: Recompute a pasted UCP cart, checkout or order totals block in integer minor units: price x quantity per line, line-subtotal roll-up, breakdown identity, sign rules, and in order mode the refund bound over adjustments.
Call it with arguments: {"policy_parameters":{"mode":"checkout","document":{"currency":"USD","line_items":[{"item":{"id":"tulip-bouquet","price":3500},"quantity":2,"totals":[{"type":"subtotal","amount":7000}]}],"discounts":{"applied":[{"code":"WELCOME20","title":"Welcome 20% off","amount":-700}]},"totals":[{"type":"subtotal","amount":7000},{"type":"discount","amount":-700},{"type":"fulfillment","amount":495},{"type":"tax","amount":0},{"type":"fee","amount":0},{"type":"total","amount":6795}]}}}
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.
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.
Over MCP, the run happens on the AINumbers worker. No AINumbers server stores your inputs.
Open the tool with the sample prefilled: https://ainumbers.co/chaingraph/825-reconcile-ucp-checkout-totals.html#p=v1.H4sIAAAAAAAA_wHEATv-eyJtb2RlIjoiY2hlY2tvdXQiLCJkb2N1bWVudCI6eyJjdXJyZW5jeSI6IlVTRCIsImxpbmVfaXRlbXMiOlt7Iml0ZW0iOnsiaWQiOiJ0dWxpcC1ib3VxdWV0IiwicHJpY2UiOjM1MDB9LCJxdWFudGl0eSI6MiwidG90YWxzIjpbeyJ0eXBlIjoic3VidG90YWwiLCJhbW91bnQiOjcwMDB9XX1dLCJkaXNjb3VudHMiOnsiYXBwbGllZCI6W3siY29kZSI6IldFTENPTUUyMCIsInRpdGxlIjoiV2VsY29tZSAyMCUgb2ZmIiwiYW1vdW50IjotNzAwfV19LCJ0b3RhbHMiOlt7InR5cGUiOiJzdWJ0b3RhbCIsImFtb3VudCI6NzAwMH0seyJ0eXBlIjoiZGlzY291bnQiLCJhbW91bnQiOi03MDB9LHsidHlwZSI6ImZ1bGZpbGxtZW50IiwiYW1vdW50Ijo0OTV9LHsidHlwZSI6InRheCIsImFtb3VudCI6MH0seyJ0eXBlIjoiZmVlIiwiYW1vdW50IjowfSx7InR5cGUiOiJ0b3RhbCIsImFtb3VudCI6Njc5NX1dfX1dIPyvxAEAAA