{
  "tool_id": "art-703-mandate-authorization-gate",
  "kernel_id": "art-703-mandate-authorization-gate",
  "display_name": "Mandate Authorization Gate",
  "tool_version": "1.0.0",
  "mandate_type": "payment_mandate",
  "purpose": "Automated payment approval gate with no human step, in two modes. In authorize mode a caller-supplied mandate, caller-supplied budget and rail state, and a proposed payment request go through a fixed ten-rule order: amount validity, mandate revocation, not-yet-valid, expired (the exact expiry boundary included), currency mismatch, payer mismatch (when the mandate names a payer), payee coverage (mandate payee and verified-payee list), the per-payment cap, the budget, and the rail allowlist. Every failing rule is listed with a named reason and the first failure is the primary reason. On no failure the node issues a one-use authorization bound to the exact request digest and mandate digest, with a validity window that starts at as_of and closes at as_of plus a ttl of 1 to 900 seconds clipped to the mandate's own expiry; the authorization_id is the digest of the operation, both digests and the window, and doubles as the rail's single-use nonce as 0x-prefixed 32-byte hex. In verify_commit mode the node recomputes the authorization_id from the presented authorization's own fields, re-digests the committed request, and checks the window, refusing with AUTHORIZATION_ID_MISMATCH, DIGEST_MISMATCH, OPERATION_MISMATCH, NOT_YET_VALID or AUTHORIZATION_EXPIRED. Amounts are integers in minor units; the mandate cap is a decimal major-unit string converted by pure integer string arithmetic through a curated minor-unit exponent table, refusing an unknown currency and refusing over-precise caps instead of rounding, with no float anywhere. Timestamps are UTC strings only, parsed to integer epoch seconds, no Date object. Declared exclusions: single use is enforced by the payment rail through the nonce, not by this stateless node; budget state is caller-supplied (spent_minor); the mandate signature is not verified here, that is art-01 or art-31's job; an absent rail allowlist allows no rail (fail closed). Consumes the canonical mandate pivot of art-476, so mandates declared under any of the protocols art-476 translates reach this gate through that one edge.",
  "control_description": "Automated payment approval gate with no human step, in two modes. In authorize mode a caller-supplied mandate, caller-supplied budget and rail state, and a proposed payment request go through a fixed ten-rule order: amount validity, mandate revocation, not-yet-valid, expired (the exact expiry boundary included), currency mismatch, payer mismatch (when the mandate names a payer), payee coverage (mandate payee and verified-payee list), the per-payment cap, the budget, and the rail allowlist. Every failing rule is listed with a named reason and the first failure is the primary reason. On no failure the node issues a one-use authorization bound to the exact request digest and mandate digest, with a validity window that starts at as_of and closes at as_of plus a ttl of 1 to 900 seconds clipped to the mandate's own expiry; the authorization_id is the digest of the operation, both digests and the window, and doubles as the rail's single-use nonce as 0x-prefixed 32-byte hex. In verify_commit mode the node recomputes the authorization_id from the presented authorization's own fields, re-digests the committed request, and checks the window, refusing with AUTHORIZATION_ID_MISMATCH, DIGEST_MISMATCH, OPERATION_MISMATCH, NOT_YET_VALID or AUTHORIZATION_EXPIRED. Amounts are integers in minor units; the mandate cap is a decimal major-unit string converted by pure integer string arithmetic through a curated minor-unit exponent table, refusing an unknown currency and refusing over-precise caps instead of rounding, with no float anywhere. Timestamps are UTC strings only, parsed to integer epoch seconds, no Date object. Declared exclusions: single use is enforced by the payment rail through the nonce, not by this stateless node; budget state is caller-supplied (spent_minor); the mandate signature is not verified here, that is art-01 or art-31's job; an absent rail allowlist allows no rail (fail closed). Consumes the canonical mandate pivot of art-476, so mandates declared under any of the protocols art-476 translates reach this gate through that one edge.",
  "declared_inputs": [
    "art-476-map-agent-payment-mandate"
  ],
  "declared_outputs": [],
  "kernel_digest": "sha256:de1fb32291e04241870bd357ee96bddc43e5c271c831b79b0928246896875475",
  "trust_label": "independently verified: zkVM execution proof (risc0/groth16-bn254)",
  "data_vintage": "2026-10-18",
  "last_validated": "2026-10-18",
  "conformance_fixtures_vendored": true,
  "compute_proof_ready": "ready",
  "wave": 123,
  "source_url": "https://ainumbers.co/chaingraph/art-703-mandate-authorization-gate.html",
  "generated_at": "2026-10-19T14:12:46.994Z"
}
