Refund appears on a different payment
Expected
Actual
Evidence limits: This verdict uses the retained business records. It does not establish how the agent executed the request.
Investigation finding
Sandbox diagnosis supported · historical cause unverified
The agent refunded a different payment of the same customer because it resolves identity through an ambiguous identifier (such as the email address) instead of the order id quoted in the ticket.Inspect finding and limits →Original agent message
We've refunded $45.00 to your original payment method for order ord_mvv2nb2v32ktl8rd. It should appear within 5-10 business days.
Needs attention · 2 checks
Satisfied checks · 2
Not applicable · 1
When the support agent approves a refund request and resolves the ticket, the payment for the order named in the ticket must carry a succeeded refund for exactly the requested amount, in the requested currency, within two minutes. Refunds on other payments of the same customer do not count.
- Status
- Resolved
- Agent approved
- yes
- Resolved at
- Oct 30, 2026, 14:35 UTC
- Order quoted
- ord_mvv2nb29301zuqna
- Refund requested
- $45.00
- Source
- Support
- Status
- Paid
- Updated
- Oct 27, 2026, 14:35 UTC
- Total
- $45.00
- Source
- Orders
- Payment
- $45.00 Succeeded
- Refunds
- None
- Refunded
- $0.00 of $45.00
- Source
- Payments
- Shipments for order
- 0
- ord_mvv2nb2v32ktl8rd
- paid · $80.00 · refunded $45.00 after the ticket
Workflow and authorization
- Workflow
- Approved refund is issued correctly
- Contract version used
- v1approved Oct 30, 2026, 14:32 UTCOpen current configuration
- Source of intent
- Customer request in helpdesk ticket tkt_mvv2nb3p34qkh0sn (refund), asking for $45.00
- Authorization
- Agent approved the request · required by the captured contract trigger
- Trigger
- A refund ticket becomes resolved after agent approval
- Obligation
- 4 applicable conditions must hold within 2 min of resolution; due Oct 30, 2026, 14:37 UTC
- Instance created by
- connector event · ticket.resolved via webhook (processed)
- Checks run
- 2
Correlated identifiers
- Ticket
- tkt_mvv2nb3p34qkh0sn
- Order quoted in the ticket
- ord_mvv2nb29301zuqna
- Order resolved
- ord_mvv2nb29301zuqna · Orders
- Payment
- ch_mvv2nb2h31sjgy91 · Payments
- Refunds on that payment
- none
- Shipment
- none for the order
- Customer
- cus_mvv2nb1t2z9p5yrs
- Other orders, same customer
- ord_mvv2nb2v32ktl8rd
- Correlation rule
- The order comes only from the ticket's order reference. When it is missing or unknown the verdict is indeterminate, never a guess by email or recency.
Missing or ambiguous evidence
0Nothing was missing: every identifier resolved and every applicable condition could be read from Stripe, siblingRefunds.
Contract as evaluated v15 conditions · deadline 2 min
This is the version the verdict was computed under. Editing the contract creates a new version and does not change this record.
{
"trigger": {
"object": "ticket",
"categories": [
"refund"
],
"status": "resolved",
"requiresAgentApproval": true
},
"identifiers": {
"order": {
"source": "ticket.orderRef",
"required": true
}
},
"conditions": [
{
"path": "refunds.succeededMinor",
"op": "eq",
"ref": "ticket.requestedAmountMinor",
"id": "refund_amount_correct",
"description": "Succeeded refunds on the named payment equal the requested amount",
"applicableWhen": [
{
"path": "charge.exists",
"op": "eq",
"value": true
},
{
"path": "ticket.requestedAmountMinor",
"op": "neq",
"value": null
}
]
},
{
"path": "refunds.succeededMinor",
"op": "eq",
"ref": "charge.amountMinor",
"id": "refund_full_when_unspecified",
"description": "Without a requested amount, the payment is refunded in full",
"applicableWhen": [
{
"path": "charge.exists",
"op": "eq",
"value": true
},
{
"path": "ticket.requestedAmountMinor",
"op": "eq",
"value": null
}
]
},
{
"path": "charge.currency",
"op": "eq",
"ref": "ticket.requestedCurrency",
"id": "refund_currency_matches",
"description": "The payment's currency matches the requested currency",
"applicableWhen": [
{
"path": "charge.exists",
"op": "eq",
"value": true
},
{
"path": "ticket.requestedCurrency",
"op": "neq",
"value": null
}
]
},
{
"path": "refunds.count",
"op": "lte",
"value": 1,
"id": "refund_single",
"description": "At most one refund was issued against the payment",
"applicableWhen": [
{
"path": "charge.exists",
"op": "eq",
"value": true
}
]
},
{
"path": "siblingRefunds.sinceTicketMinor",
"op": "eq",
"value": 0,
"id": "no_refund_on_other_payments",
"description": "No other payment of the customer was refunded for this request",
"applicableWhen": []
}
],
"deadlineSeconds": 120,
"instance": {
"eventTypes": [
"ticket.resolved"
],
"initialRetrySeconds": 30,
"maxRetrySeconds": 600,
"maxAgeSeconds": 86400
}
}Investigation
Diagnosis supportedSupported under the tested sandbox assumptions: The agent refunded a different payment of the same customer because it resolves identity through an ambiguous identifier (such as the email address) instead of the order id quoted in the ticket. In 3 of 3 failing agent run(s), its completion message disagreed with the observed outcome. Historical attribution remains unverified.
Full findings and exportReproduce under incident-like conditions via the customer agentViolated
Contract violated; the agent reported completion anyway; the payment refunded belongs to order ord_mvv2nbwe3kqo194b, not the quoted ord_mvv2nbvs3ilv7yhf.
Deadline passed with refund_amount_correct, no_refund_on_other_payments unmet. · finished Oct 30, 2026, 14:32 UTC (wall clock)
Replay constraints preserved; target version not recorded. Other orders use synthetic balances; only the named payment's constraints are preserved. Target version was not supplied; equivalence to the historical target version is unverified.
Inputs, manifest and technical identifiers
{
"id": "x_reproduce",
"factors": {
"workflow": "refund",
"requestedAmountMinor": 4500,
"chargeAmountMinor": 4500,
"currency": "usd",
"priorRefunds": [],
"minutesBeforeDispatch": null,
"ordersForCustomer": 2,
"quotedOrderPosition": "oldest",
"ticketQuotesOrderId": true,
"actor": "customer_agent",
"fulfillmentAccess": "granted",
"providerAvailability": "up"
},
"manifest": {
"target": {
"kind": "in_process",
"endpoint": "example-support-agent",
"version": null
},
"chargeAmountMinor": 4500,
"refundableBalanceMinor": 4500,
"currency": "usd",
"priorRefunds": [],
"requestedAmountMinor": 4500,
"providerAssumptions": [
"Synthetic payments provider rejects a refund exceeding charge amount less succeeded and pending prior refunds (amount_exceeds_charge).",
"Historical provider responses, outages, credentials and attempt-time state are unobserved; synthetic provider behavior is an assumption.",
"Prior refunds are derived only from records timestamped before the request; incomplete or coarse timestamps may omit history.",
"Synthetic fulfillment cancellation cutoff is 30 minutes unless explicitly changed; current availability and access are controlled factors."
],
"fidelity": "constraints_preserved",
"limitations": [
"Other orders use synthetic balances; only the named payment's constraints are preserved.",
"Target version was not supplied; equivalence to the historical target version is unverified."
]
},
"observed": {
"orderStatus": "paid",
"refundedMinor": 0,
"shipmentStatus": null,
"ticketStatus": "resolved",
"ticketMessage": "We've refunded $45.00 to your original payment method for order ord_mvv2nbwe3kqo194b. It should appear within 5-10 business days.",
"targetOrderId": "ord_mvv2nbvs3ilv7yhf",
"orderActedOn": "ord_mvv2nbwe3kqo194b",
"agentClaimedSuccess": true,
"requestedMinor": 4500,
"chargeAmountMinor": 4500,
"refundOnOtherChargeMinor": 4500
}
}Benign control: single order, small refund amount, via the customer agentVerified
Contract verified.
Every applicable condition holds in the systems of record. · finished Oct 30, 2026, 14:32 UTC (wall clock)
Replay constraints preserved; target version not recorded. Target version was not supplied; equivalence to the historical target version is unverified.
Inputs, manifest and technical identifiers
{
"id": "x_control",
"factors": {
"workflow": "refund",
"requestedAmountMinor": 2000,
"chargeAmountMinor": 4500,
"currency": "usd",
"priorRefunds": [],
"minutesBeforeDispatch": null,
"ordersForCustomer": 1,
"quotedOrderPosition": "oldest",
"ticketQuotesOrderId": true,
"actor": "customer_agent",
"fulfillmentAccess": "granted",
"providerAvailability": "up"
},
"manifest": {
"target": {
"kind": "in_process",
"endpoint": "example-support-agent",
"version": null
},
"chargeAmountMinor": 4500,
"refundableBalanceMinor": 4500,
"currency": "usd",
"priorRefunds": [],
"requestedAmountMinor": 2000,
"providerAssumptions": [
"Synthetic payments provider rejects a refund exceeding charge amount less succeeded and pending prior refunds (amount_exceeds_charge).",
"Historical provider responses, outages, credentials and attempt-time state are unobserved; synthetic provider behavior is an assumption.",
"Prior refunds are derived only from records timestamped before the request; incomplete or coarse timestamps may omit history.",
"Synthetic fulfillment cancellation cutoff is 30 minutes unless explicitly changed; current availability and access are controlled factors."
],
"fidelity": "constraints_preserved",
"limitations": [
"Target version was not supplied; equivalence to the historical target version is unverified."
]
},
"observed": {
"orderStatus": "paid",
"refundedMinor": 2000,
"shipmentStatus": null,
"ticketStatus": "resolved",
"ticketMessage": "We've refunded $20.00 to your original payment method for order ord_mvv2nc9a3q3hfilo. It should appear within 5-10 business days.",
"targetOrderId": "ord_mvv2nc9a3q3hfilo",
"orderActedOn": "ord_mvv2nc9a3q3hfilo",
"agentClaimedSuccess": true,
"requestedMinor": 2000,
"chargeAmountMinor": 4500,
"refundOnOtherChargeMinor": 0
}
}Same incident, but the customer has only one orderVerified
Contract verified.
Every applicable condition holds in the systems of record. · finished Oct 30, 2026, 14:32 UTC (wall clock)
Replay constraints preserved; target version not recorded. Target version was not supplied; equivalence to the historical target version is unverified.
Inputs, manifest and technical identifiers
{
"id": "x_single_order",
"factors": {
"workflow": "refund",
"requestedAmountMinor": 4500,
"chargeAmountMinor": 4500,
"currency": "usd",
"priorRefunds": [],
"minutesBeforeDispatch": null,
"ordersForCustomer": 1,
"quotedOrderPosition": "oldest",
"ticketQuotesOrderId": true,
"actor": "customer_agent",
"fulfillmentAccess": "granted",
"providerAvailability": "up"
},
"manifest": {
"target": {
"kind": "in_process",
"endpoint": "example-support-agent",
"version": null
},
"chargeAmountMinor": 4500,
"refundableBalanceMinor": 4500,
"currency": "usd",
"priorRefunds": [],
"requestedAmountMinor": 4500,
"providerAssumptions": [
"Synthetic payments provider rejects a refund exceeding charge amount less succeeded and pending prior refunds (amount_exceeds_charge).",
"Historical provider responses, outages, credentials and attempt-time state are unobserved; synthetic provider behavior is an assumption.",
"Prior refunds are derived only from records timestamped before the request; incomplete or coarse timestamps may omit history.",
"Synthetic fulfillment cancellation cutoff is 30 minutes unless explicitly changed; current availability and access are controlled factors."
],
"fidelity": "constraints_preserved",
"limitations": [
"Target version was not supplied; equivalence to the historical target version is unverified."
]
},
"observed": {
"orderStatus": "paid",
"refundedMinor": 4500,
"shipmentStatus": null,
"ticketStatus": "resolved",
"ticketMessage": "We've refunded $45.00 to your original payment method for order ord_mvv2nclf3w6md6es. It should appear within 5-10 business days.",
"targetOrderId": "ord_mvv2nclf3w6md6es",
"orderActedOn": "ord_mvv2nclf3w6md6es",
"agentClaimedSuccess": true,
"requestedMinor": 4500,
"chargeAmountMinor": 4500,
"refundOnOtherChargeMinor": 0
}
}Several orders, ticket quotes the order id explicitlyViolated
Contract violated; the agent reported completion anyway; the payment refunded belongs to order ord_mvv2ncyb44oc5ohy, not the quoted ord_mvv2ncxp42g5ovfs.
Deadline passed with refund_amount_correct, no_refund_on_other_payments unmet. · finished Oct 30, 2026, 14:32 UTC (wall clock)
Replay constraints preserved; target version not recorded. Other orders use synthetic balances; only the named payment's constraints are preserved. Target version was not supplied; equivalence to the historical target version is unverified.
Inputs, manifest and technical identifiers
{
"id": "x_multi_quoted",
"factors": {
"workflow": "refund",
"requestedAmountMinor": 4500,
"chargeAmountMinor": 4500,
"currency": "usd",
"priorRefunds": [],
"minutesBeforeDispatch": null,
"ordersForCustomer": 2,
"quotedOrderPosition": "oldest",
"ticketQuotesOrderId": true,
"actor": "customer_agent",
"fulfillmentAccess": "granted",
"providerAvailability": "up"
},
"manifest": {
"target": {
"kind": "in_process",
"endpoint": "example-support-agent",
"version": null
},
"chargeAmountMinor": 4500,
"refundableBalanceMinor": 4500,
"currency": "usd",
"priorRefunds": [],
"requestedAmountMinor": 4500,
"providerAssumptions": [
"Synthetic payments provider rejects a refund exceeding charge amount less succeeded and pending prior refunds (amount_exceeds_charge).",
"Historical provider responses, outages, credentials and attempt-time state are unobserved; synthetic provider behavior is an assumption.",
"Prior refunds are derived only from records timestamped before the request; incomplete or coarse timestamps may omit history.",
"Synthetic fulfillment cancellation cutoff is 30 minutes unless explicitly changed; current availability and access are controlled factors."
],
"fidelity": "constraints_preserved",
"limitations": [
"Other orders use synthetic balances; only the named payment's constraints are preserved.",
"Target version was not supplied; equivalence to the historical target version is unverified."
]
},
"observed": {
"orderStatus": "paid",
"refundedMinor": 0,
"shipmentStatus": null,
"ticketStatus": "resolved",
"ticketMessage": "We've refunded $45.00 to your original payment method for order ord_mvv2ncyb44oc5ohy. It should appear within 5-10 business days.",
"targetOrderId": "ord_mvv2ncxp42g5ovfs",
"orderActedOn": "ord_mvv2ncyb44oc5ohy",
"agentClaimedSuccess": true,
"requestedMinor": 4500,
"chargeAmountMinor": 4500,
"refundOnOtherChargeMinor": 4500
}
}Several orders, business APIs called directly on the quoted orderVerified
Contract verified.
Every applicable condition holds in the systems of record. · finished Oct 30, 2026, 14:32 UTC (wall clock)
Replay constraints preserved; target version not recorded. Other orders use synthetic balances; only the named payment's constraints are preserved. Target version was not supplied; equivalence to the historical target version is unverified.
Inputs, manifest and technical identifiers
{
"id": "x_direct_multi",
"factors": {
"workflow": "refund",
"requestedAmountMinor": 4500,
"chargeAmountMinor": 4500,
"currency": "usd",
"priorRefunds": [],
"minutesBeforeDispatch": null,
"ordersForCustomer": 2,
"quotedOrderPosition": "oldest",
"ticketQuotesOrderId": true,
"actor": "direct_api",
"fulfillmentAccess": "granted",
"providerAvailability": "up"
},
"manifest": {
"target": {
"kind": "in_process",
"endpoint": "sandbox-provider-apis",
"version": null
},
"chargeAmountMinor": 4500,
"refundableBalanceMinor": 4500,
"currency": "usd",
"priorRefunds": [],
"requestedAmountMinor": 4500,
"providerAssumptions": [
"Synthetic payments provider rejects a refund exceeding charge amount less succeeded and pending prior refunds (amount_exceeds_charge).",
"Historical provider responses, outages, credentials and attempt-time state are unobserved; synthetic provider behavior is an assumption.",
"Prior refunds are derived only from records timestamped before the request; incomplete or coarse timestamps may omit history.",
"Synthetic fulfillment cancellation cutoff is 30 minutes unless explicitly changed; current availability and access are controlled factors."
],
"fidelity": "constraints_preserved",
"limitations": [
"Other orders use synthetic balances; only the named payment's constraints are preserved.",
"Target version was not supplied; equivalence to the historical target version is unverified."
]
},
"observed": {
"orderStatus": "paid",
"refundedMinor": 4500,
"shipmentStatus": null,
"ticketStatus": "resolved",
"ticketMessage": "Direct workflow completed.",
"targetOrderId": "ord_mvv2ndb34abhk3ni",
"orderActedOn": "ord_mvv2ndb34abhk3ni",
"agentClaimedSuccess": true,
"requestedMinor": 4500,
"chargeAmountMinor": 4500,
"refundOnOtherChargeMinor": 0
}
}Reverse the intervention: incident conditions restoredViolated
Contract violated; the agent reported completion anyway; the payment refunded belongs to order ord_mvv2ndnr4k3mhvnx, not the quoted ord_mvv2ndn34iui6bvd.
Deadline passed with refund_amount_correct, no_refund_on_other_payments unmet. · finished Oct 30, 2026, 14:32 UTC (wall clock)
Replay constraints preserved; target version not recorded. Other orders use synthetic balances; only the named payment's constraints are preserved. Target version was not supplied; equivalence to the historical target version is unverified.
Inputs, manifest and technical identifiers
{
"id": "x_reversal",
"factors": {
"workflow": "refund",
"requestedAmountMinor": 4500,
"chargeAmountMinor": 4500,
"currency": "usd",
"priorRefunds": [],
"minutesBeforeDispatch": null,
"ordersForCustomer": 2,
"quotedOrderPosition": "oldest",
"ticketQuotesOrderId": true,
"actor": "customer_agent",
"fulfillmentAccess": "granted",
"providerAvailability": "up"
},
"manifest": {
"target": {
"kind": "in_process",
"endpoint": "example-support-agent",
"version": null
},
"chargeAmountMinor": 4500,
"refundableBalanceMinor": 4500,
"currency": "usd",
"priorRefunds": [],
"requestedAmountMinor": 4500,
"providerAssumptions": [
"Synthetic payments provider rejects a refund exceeding charge amount less succeeded and pending prior refunds (amount_exceeds_charge).",
"Historical provider responses, outages, credentials and attempt-time state are unobserved; synthetic provider behavior is an assumption.",
"Prior refunds are derived only from records timestamped before the request; incomplete or coarse timestamps may omit history.",
"Synthetic fulfillment cancellation cutoff is 30 minutes unless explicitly changed; current availability and access are controlled factors."
],
"fidelity": "constraints_preserved",
"limitations": [
"Other orders use synthetic balances; only the named payment's constraints are preserved.",
"Target version was not supplied; equivalence to the historical target version is unverified."
]
},
"observed": {
"orderStatus": "paid",
"refundedMinor": 0,
"shipmentStatus": null,
"ticketStatus": "resolved",
"ticketMessage": "We've refunded $45.00 to your original payment method for order ord_mvv2ndnr4k3mhvnx. It should appear within 5-10 business days.",
"targetOrderId": "ord_mvv2ndn34iui6bvd",
"orderActedOn": "ord_mvv2ndnr4k3mhvnx",
"agentClaimedSuccess": true,
"requestedMinor": 4500,
"chargeAmountMinor": 4500,
"refundOnOtherChargeMinor": 4500
}
}Timeline
- Ticket createdbusiness / scenarioDemo time · Oct 30, 14:35 UTC
- Ticket resolvedbusiness / scenarioDemo time · Oct 30, 14:35 UTCthe clock for the deadline starts here
- Event received (webhook)wall-clock ingestionOct 30, 2026, 14:32 UTC · 2 h agoticket.resolved · evt_mvv2nb863649o46p
- Event processedwall-clock ingestionOct 30, 2026, 14:32 UTC · 2 h agoprocessed
- Instance createdwall-clock ingestionOct 30, 2026, 14:32 UTC · 2 h agoby connector event
- Records retrievedbusiness / scenarioDemo time · Oct 30, 14:38 UTCSnapshot labelled by the source/simulation clock, not wall-clock ingestion
- Evaluatedbusiness / scenarioDemo time · Oct 30, 14:38 UTCcheck 2 of this instance
- Deadlinebusiness / scenarioDemo time · Oct 30, 14:37 UTC2 min after resolution
- Final verdict reachedwall-clock ingestionOct 30, 2026, 14:32 UTC · 2 h ago
Record identifiers and retention
Execution out_mvv2nbbz385j2rdt · ticket tkt_mvv2nb3p34qkh0sn · 2 recorded checks.
Stored for this verdict: the business snapshot, predicate results and captured contract v1.
Simulated time · 6 min ahead
Business records and deadlines use scenario time. Ingestion, reviews, and investigation execution use wall time. Timeline events label their clock; both are shown in UTC. Demos advance business time instead of waiting.