{"$schema":"https://mandateshield.com/conformance/v1/profile-schema.json","profile":"https://mandateshield.com/conformance/v1","version":"1.0.0","canonical_vectors":"https://mandateshield.com/conformance/v1/vectors.json","title":"MandateShield Conformance Profile v1","status":"vendor-profile","certification":false,"deployment_attestation":false,"disclaimer":"Passing these vectors shows behavior against this published vendor profile only. It is not certification, an independent security audit, or proof that any deployment is correctly configured or operated.","token_semantics":{"{{NOW}}":"Materialize as the runner's current ISO 8601 timestamp.","{{NOW+300S}}":"Materialize as an ISO 8601 timestamp exactly 300 seconds after the runner's current time."},"runner_classes":{"offline-policy":"Runs locally without credentials against deterministic envelope policy checks.","strict-api-sequence":"Requires an isolated live or staging account because durable replay state is part of the assertion.","cryptographic-integration":"Requires the implementer to generate test-only keys and signatures from the fixture instructions.","receipt-integration":"Requires a test-only receipt signing key; never reuse a production signing key."},"vectors":[{"id":"fiat-usd-exact-minor-units","title":"Exact USD minor-unit agreement","category":"exact-money","runner":"offline-policy","intent":"accept","description":"The major-unit and integer minor-unit representations agree exactly and remain below the registered cap.","request":{"envelope":{"protocol":"AP2","mandate_id":"mnd_conformance_fiat","agent_id":"agent_conformance","merchant_id":"merchant_conformance","amount":{"value":125.34,"minor_units":12534,"currency":"USD"},"limits":{"max_amount":200,"max_amount_minor":20000,"currencies":["USD"],"merchants":["merchant_conformance"]},"created_at":"{{NOW}}","expires_at":"{{NOW+300S}}","idempotency_key":"conformance_fiat_attempt_1","intent_hash":"sha256:1111111111111111111111111111111111111111111111111111111111111111","user_consent":true,"credential_binding":"issuer:conformance-test","purpose":"Purchase the conformance fixture"},"options":{"registeredAuthority":true}},"expected":{"decision":"ALLOW","finding_codes":{"includes":[],"excludes":["AMOUNT_PRECISION_INVALID","SPEND_CAP_EXCEEDED"]}}},{"id":"fiat-conflicting-minor-units","title":"Conflicting fiat representations","category":"exact-money","runner":"offline-policy","intent":"reject","description":"A large major-unit value cannot be made harmless by attaching a contradictory one-cent minor-unit value.","request":{"envelope":{"protocol":"AP2","mandate_id":"mnd_conformance_fiat","agent_id":"agent_conformance","merchant_id":"merchant_conformance","amount":{"value":1000000,"minor_units":1,"currency":"USD"},"limits":{"max_amount":200,"max_amount_minor":20000,"currencies":["USD"],"merchants":["merchant_conformance"]},"created_at":"{{NOW}}","expires_at":"{{NOW+300S}}","idempotency_key":"conformance_fiat_attempt_1","intent_hash":"sha256:1111111111111111111111111111111111111111111111111111111111111111","user_consent":true,"credential_binding":"issuer:conformance-test","purpose":"Purchase the conformance fixture"},"options":{"registeredAuthority":true}},"expected":{"decision":"BLOCK","finding_codes":{"includes":["AMOUNT_PRECISION_INVALID"]}}},{"id":"fiat-jpy-fractional-major-unit","title":"Fractional zero-decimal currency","category":"exact-money","runner":"offline-policy","intent":"reject","description":"JPY has a zero-decimal executable exponent; a fractional major-unit amount must not be rounded silently.","request":{"envelope":{"protocol":"AP2","mandate_id":"mnd_conformance_fiat","agent_id":"agent_conformance","merchant_id":"merchant_conformance","amount":{"value":125.5,"currency":"JPY"},"limits":{"max_amount":200,"currencies":["JPY"],"merchants":["merchant_conformance"]},"created_at":"{{NOW}}","expires_at":"{{NOW+300S}}","idempotency_key":"conformance_jpy_attempt_1","intent_hash":"sha256:1111111111111111111111111111111111111111111111111111111111111111","user_consent":true,"credential_binding":"issuer:conformance-test","purpose":"Purchase the conformance fixture"},"options":{"registeredAuthority":true}},"expected":{"decision":"BLOCK","finding_codes":{"includes":["AMOUNT_PRECISION_INVALID"]}}},{"id":"x402-exact-beyond-safe-integer","title":"Exact atomic amount beyond Number precision","category":"atomic-assets","runner":"offline-policy","intent":"accept","description":"A canonical decimal string at the exact cap remains executable even when JavaScript Number cannot preserve the integer.","request":{"envelope":{"protocol":"X402","mandate_id":"mnd_conformance_atomic","agent_id":"agent_conformance","merchant_id":"merchant_api","amount":{"atomic_units":"900719925474099312345678901234567890","asset_decimals":18},"asset_id":"eip155:8453/erc20:0xconformance","network":"eip155:8453","resource":"https://api.example.test/v1/conformance/resource-1","limits":{"max_atomic_units":"900719925474099312345678901234567890","asset_decimals":18,"assets":["eip155:8453/erc20:0xconformance"],"networks":["eip155:8453"],"resources":["https://api.example.test/v1/conformance/resource-1"],"merchants":["merchant_api"]},"created_at":"{{NOW}}","expires_at":"{{NOW+300S}}","idempotency_key":"conformance_atomic_attempt_1","intent_hash":"sha256:2222222222222222222222222222222222222222222222222222222222222222","user_consent":true,"credential_binding":"x402:conformance-test","purpose":"Purchase one exact paid API resource"},"options":{"registeredAuthority":true}},"expected":{"decision":"ALLOW","finding_codes":{"includes":[],"excludes":["INVALID_ATOMIC_AMOUNT","ATOMIC_SPEND_CAP_EXCEEDED"]}}},{"id":"x402-one-unit-over-cap","title":"One atomic unit over the cap","category":"atomic-assets","runner":"offline-policy","intent":"reject","description":"The requested integer differs by one at a precision where floating-point conversion loses the distinction.","request":{"envelope":{"protocol":"X402","mandate_id":"mnd_conformance_atomic","agent_id":"agent_conformance","merchant_id":"merchant_api","amount":{"atomic_units":"900719925474099312345678901234567891","asset_decimals":18},"asset_id":"eip155:8453/erc20:0xconformance","network":"eip155:8453","resource":"https://api.example.test/v1/conformance/resource-1","limits":{"max_atomic_units":"900719925474099312345678901234567890","asset_decimals":18,"assets":["eip155:8453/erc20:0xconformance"],"networks":["eip155:8453"],"resources":["https://api.example.test/v1/conformance/resource-1"],"merchants":["merchant_api"]},"created_at":"{{NOW}}","expires_at":"{{NOW+300S}}","idempotency_key":"conformance_atomic_attempt_2","intent_hash":"sha256:2222222222222222222222222222222222222222222222222222222222222222","user_consent":true,"credential_binding":"x402:conformance-test","purpose":"Purchase one exact paid API resource"},"options":{"registeredAuthority":true}},"expected":{"decision":"BLOCK","finding_codes":{"includes":["ATOMIC_SPEND_CAP_EXCEEDED"]}}},{"id":"x402-resource-substitution","title":"Paid-resource substitution","category":"atomic-assets","runner":"offline-policy","intent":"reject","description":"Changing only the paid resource changes the authorized purchase and must fail closed.","request":{"envelope":{"protocol":"X402","mandate_id":"mnd_conformance_atomic","agent_id":"agent_conformance","merchant_id":"merchant_api","amount":{"atomic_units":"900719925474099312345678901234567890","asset_decimals":18},"asset_id":"eip155:8453/erc20:0xconformance","network":"eip155:8453","resource":"https://api.example.test/v1/conformance/resource-2","limits":{"max_atomic_units":"900719925474099312345678901234567890","asset_decimals":18,"assets":["eip155:8453/erc20:0xconformance"],"networks":["eip155:8453"],"resources":["https://api.example.test/v1/conformance/resource-1"],"merchants":["merchant_api"]},"created_at":"{{NOW}}","expires_at":"{{NOW+300S}}","idempotency_key":"conformance_atomic_attempt_3","intent_hash":"sha256:2222222222222222222222222222222222222222222222222222222222222222","user_consent":true,"credential_binding":"x402:conformance-test","purpose":"Purchase one exact paid API resource"},"options":{"registeredAuthority":true}},"expected":{"decision":"BLOCK","finding_codes":{"includes":["RESOURCE_OUT_OF_SCOPE"]}}},{"id":"strict-unknown-constraint-field","title":"Unknown strict constraint","category":"strict-constraints","runner":"offline-policy","intent":"reject","description":"Strict production must reject a constraint it cannot evaluate instead of returning approval while ignoring it.","request":{"envelope":{"protocol":"AP2","mandate_id":"mnd_conformance_fiat","agent_id":"agent_conformance","merchant_id":"merchant_conformance","amount":{"value":125.34,"minor_units":12534,"currency":"USD"},"limits":{"max_amount":200,"max_amount_minor":20000,"currencies":["USD"],"merchants":["merchant_conformance"],"allowed_items":["ticket"]},"created_at":"{{NOW}}","expires_at":"{{NOW+300S}}","idempotency_key":"conformance_unknown_constraint_1","intent_hash":"sha256:1111111111111111111111111111111111111111111111111111111111111111","user_consent":true,"credential_binding":"issuer:conformance-test","purpose":"Purchase the conformance fixture"},"options":{"registeredAuthority":true}},"expected":{"decision":"BLOCK","finding_codes":{"includes":["UNSUPPORTED_CONSTRAINT_FIELD"]}}},{"id":"replay-key-invalid-characters","title":"Unsafe payment-attempt identifier","category":"strict-constraints","runner":"offline-policy","intent":"reject","description":"A replay identifier with whitespace is not a canonical attempt key and cannot enter the strict boundary.","request":{"envelope":{"protocol":"AP2","mandate_id":"mnd_conformance_fiat","agent_id":"agent_conformance","merchant_id":"merchant_conformance","amount":{"value":125.34,"minor_units":12534,"currency":"USD"},"limits":{"max_amount":200,"max_amount_minor":20000,"currencies":["USD"],"merchants":["merchant_conformance"]},"created_at":"{{NOW}}","expires_at":"{{NOW+300S}}","idempotency_key":"duplicate attempt with spaces","intent_hash":"sha256:1111111111111111111111111111111111111111111111111111111111111111","user_consent":true,"credential_binding":"issuer:conformance-test","purpose":"Purchase the conformance fixture"},"options":{"registeredAuthority":true}},"expected":{"decision":"BLOCK","finding_codes":{"includes":["REPLAY_GUARD_INVALID"]}}},{"id":"strict-account-wide-replay-recovery","title":"Account-wide consume-once attempt","category":"replay-state","runner":"strict-api-sequence","intent":"reject-duplicate","description":"A live harness reuses one signed attempt across retries, key rotation and a changed envelope to prove that payment intent is consumed account-wide.","preconditions":["One active registered mandate and pinned issuer key","One fresh signed challenge for the exact envelope","Two live API keys belonging to the same account"],"sequence":[{"step":1,"mutation":"Submit the original request with API key A.","expected":{"http_status":200,"decision":"ALLOW","persisted":true,"enforcement_authorized":true}},{"step":2,"mutation":"Retry the identical request with the same account and idempotency key.","expected":{"behavior":"recover the exact previously committed response","creates_second_authorization":false}},{"step":3,"mutation":"Change the envelope but retain the idempotency key; optionally rotate to API key B.","expected":{"decision":"BLOCK","finding_code":"REPLAY_DETECTED","enforcement_authorized":false}}],"invariant":{"idempotency_scope":"account","credential_rotation_resets_scope":false,"concurrent_duplicate_may_return":"CONCURRENT_REPLAY_DETECTED","persistence_failure_is_executable":false}},{"id":"jws-final-envelope-substitution","title":"JWS final-envelope substitution","category":"protocol-evidence","runner":"cryptographic-integration","intent":"reject","description":"A valid JWS over another canonical purchase digest must not authorize the evaluated envelope.","protocol":"CUSTOM","fixture":{"format":"jws","signed_claims":["iss","aud","nonce","iat","exp","mandateshield_input_digest"],"input_digest":"sha256(canonical-json(original-envelope))"},"mutation":{"envelope_field":"merchant_id","operation":"replace after signing"},"expected":{"status":"REJECTED","signature_valid":true,"authority_valid":false,"finding_code":"SIGNED_INPUT_BINDING_MISMATCH"}},{"id":"ap2-holder-proof-required","title":"AP2 holder proof omitted","category":"protocol-evidence","runner":"cryptographic-integration","intent":"reject","description":"The closed-payment AP2 projection requires an issuer-bound SD-JWT disclosure and RFC 9901 key-binding JWT.","protocol":"AP2","fixture":{"format":"sd-jwt","disclosure_type":"mandate.payment.1","required_bindings":["payment_amount","currency","payee","transaction_id","mandateshield_input_digest"]},"mutation":{"operation":"remove key-binding JWT from SD-JWT+KB presentation"},"expected":{"status":"REJECTED","authority_valid":false,"finding_code":"SD_JWT_KEY_BINDING_REQUIRED"}},{"id":"tap-required-component-omitted","title":"TAP signed component omitted","category":"protocol-evidence","runner":"cryptographic-integration","intent":"reject","description":"The normalized TAP projection must sign method, authority, path and the exact content digest.","protocol":"TAP","fixture":{"format":"http-message-signature","covered_components":["@method","@authority","@path","content-digest"],"required_freshness_seconds_max":900},"mutation":{"operation":"remove content-digest from covered_components"},"expected":{"status":"REJECTED","authority_valid":false,"finding_code":"TAP_REQUIRED_COMPONENT_NOT_SIGNED"}},{"id":"receipt-decision-core-digest-tamper","title":"Receipt decision-core tampering","category":"signed-receipt","runner":"receipt-integration","intent":"reject","description":"Even a newly signed fixture is invalid when decision_core changes without recomputing its bound digest.","fixture":{"format":"application/mandateshield-receipt+jwt","protected_header":{"alg":"ES256","typ":"MSD+JWT"},"required_claims":["decision_core","decision_digest","input_digest","jti","aud"]},"mutation":{"field":"decision_core.decision","from":"BLOCK","to":"ALLOW","recompute_decision_digest":false},"expected":{"valid":false,"verifier_error_contains":"decision digest does not match"}},{"id":"receipt-top-level-decision-contradiction","title":"Receipt binding contradiction","category":"signed-receipt","runner":"receipt-integration","intent":"reject","description":"A self-consistent core digest still fails if top-level decision or execution state contradicts the signed core.","fixture":{"format":"application/mandateshield-receipt+jwt","decision_core_decision":"ALLOW","decision_digest":"sha256(canonical-json(decision_core))"},"mutation":{"top_level_decision":"BLOCK"},"expected":{"valid":false,"verifier_error_contains":"top-level decision bindings do not match the decision core"}}]}