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.Autonomous investigation complete6 completed experiments · 3 competing explanations considered
Inspect hypotheses and experiments →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
Deadline passed with refund_amount_correct, no_refund_on_other_payments unmet.
Evaluated Oct 30, 2026, 14:38 UTC · deadline Oct 30, 2026, 14:37 UTC · systems Stripe, siblingRefunds · the snapshot above is the only state Veycera stores for this verdict.
Record identifiers and policy provenance
Ticket tkt_mvv2nb3p34qkh0sn · incident inc_mvv2nbjz3bjsy83m · execution out_mvv2nbbz385j2rdt.
Evaluated contract v1. Open current policy
Findings and experiments
Investigation evidence
Diagnosis supportedSupported diagnosis
Evidence ladder
- Mechanism reproduced · The failure was produced in the sandbox under incident-like conditions (2 of 2 runs).
- Diagnosis supported · h_wrong_order is supported by discriminating runs; the one-factor intervention x_single_order removed the failure; alternatives were contradicted.
- Historical attribution · Repeated sandbox failures and a matching business-state signature do not establish the original execution. Incident-linked execution evidence is required.
- Highest rung reached: Diagnosis supported. The sandbox evidence does not establish the original execution.
Reproducible conditions
- Fails with customer agent, refund of 4500 minor units, charge 4500 usd; prior refunds 0, 2 order(s) (quoted order is the oldest), order id quoted.
- Passes with customer agent, refund of 4500 minor units, charge 4500 usd; prior refunds 0, 1 order(s), order id quoted (only the changed factor differs).
- In 3 of 3 failing agent run(s), the agent resolved the ticket with a completion message.
- In 3 run(s) the agent changed a different payment than the one quoted in the ticket.
- Under the incident's conditions the failure appeared in 2 of 2 runs (including the reversal run, which restored it).
- Requested → issued in agent runs: $20.00 → $20.00, $45.00 → $45.00.
Tested range
Suggested fix
- Resolve the order and its payment from the stable identifier quoted in the ticket (orderRef), never from the requester's email alone.
- When several records match and none is quoted, ask the customer which one they mean instead of picking the most recent.
- Verify the order and payment ids in the confirmation message match the ticket before resolving.
What remains unknown
- 2 hypotheses were contradicted; 0 remain consistent with every run but not established.
- What the customer agent attempted at the time: Veycera has no logs, traces or tool-call history for it.
- The payments provider's response to whatever refund request was made, and how the agent derived the amount it sent.
- The historical run itself was not observed: Veycera has no logs, traces or execution history of the agent, only the business records and the sandbox runs it executed.
- Even repeated failures, a successful intervention, reversal and a matching business-state signature cannot establish the historical execution. Another mechanism with the same signature remains possible without incident-linked evidence.
- Tested only in a disposable sandbox with synthetic records, covering requested amounts 2000, 4500 minor units (currency usd). Values outside this range, other currencies, other customer configurations and the production environment itself were not tested; conclusions do not extend to them.
Assumptions behind this finding
- 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.
- 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.
Competing hypotheses1 supported · 2 contradicted · 0 consistent, not established
Reasoning and technical details
Supported by discriminating runs x_reproduce, x_control, x_single_order, x_multi_quoted, x_reversal; its predicted failure was produced in the sandbox; no run contradicted it and every alternative was separated from it (under the sandbox conditions tested).
Mechanism (observable in the sandbox): When the customer has several orders the agent acts on a different one than the ticket quotes; with a single order it acts on the right one.Implementation guess, unverified: Identity is resolved from the requester's email and the most recent match wins, bypassing the quoted order id. Unverified: Veycera does not read the agent's code.For: obs_sibling_refunded, obs_sibling_orders, obs_cond_refund_amount_correct, obs_cond_no_refund_on_other_payments, obs_ticketDistinguished by: The same request with a single order versus several: only the multi-record run acts on the wrong one, while direct calls on the quoted id pass.Reasoning and technical details
Contradicted by x_reproduce, x_control, x_single_order, x_multi_quoted, x_reversal, under the sandbox conditions tested.
Mechanism (observable in the sandbox): The agent resolves the ticket without performing the operation at all, so no record of the customer changes.For: obs_cond_refund_amount_correct, obs_cond_no_refund_on_other_payments, obs_refund_missing, obs_ticket_claims_success, obs_ticket · Against: obs_sibling_refundedDistinguished by: Any run in which a record of the customer visibly changed rules out omission; a benign control that still fails supports it.Reasoning and technical details
Contradicted by x_reproduce, x_multi_quoted, x_reversal (held only in x_control, x_single_order), under the sandbox conditions tested.
Mechanism (observable in the sandbox): The write succeeded but the read model lagged behind, so the snapshot was taken before the record reflected it.For: obs_order, obs_refunds, obs_cond_refund_amount_correct, obs_cond_no_refund_on_other_payments · Against: obs_sibling_refundedDistinguished by: Sandbox runs read after the deadline: lag predicts passes everywhere.Experiments6 completed · isolated sandbox
Every experiment ran in a disposable sandbox with synthetic customers, orders, payments and shipments, against the same black-box agent. Nothing touched production, and each sandbox was disposed of afterwards. Budget: 14 experiments, 60 s, 60,000 tokens / $1.00 of model usage; sandbox writes only, production read-only.
| # | What was varied | Result | What it says about each hypothesis |
|---|---|---|---|
| 1 | Reproduce under incident-like conditions via the customer agent reproducethe agent · refund of $45.00 · 2 orders, quoted = oldestReplay manifest · constraints preservedPayment $45.00; refundable balance $45.00; currency USD; prior refunds: none. Target: example-support-agent; version unknown; in_process. Provider assumptions: 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. Replay limits: 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. Experiment wall clock: Oct 30, 2026, 14:32 UTC → Oct 30, 2026, 14:32 UTC. Sandbox business clock: Oct 30, 2026, 14:34 UTC. | Refunded $0.00 of $45.00 requested, other payment refunded, ticket resolved as doneContract violated; the agent reported completion anyway; the payment refunded belongs to order ord_mvv2nbwe3kqo194b, not the quoted ord_mvv2nbvs3ilv7yhf. |
|
| 2 | Benign control: single order, small refund amount, via the customer agent controlthe agent · refund of $20.00 · 1 orderReplay manifest · constraints preservedPayment $45.00; refundable balance $45.00; currency USD; prior refunds: none. Target: example-support-agent; version unknown; in_process. Provider assumptions: 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. Replay limits: Target version was not supplied; equivalence to the historical target version is unverified. Experiment wall clock: Oct 30, 2026, 14:32 UTC → Oct 30, 2026, 14:32 UTC. Sandbox business clock: Oct 30, 2026, 14:34 UTC. | Conditions metContract verified. |
|
| 3 | Same incident, but the customer has only one order counterfactualthe agent · refund of $45.00 · 1 orderReplay manifest · constraints preservedPayment $45.00; refundable balance $45.00; currency USD; prior refunds: none. Target: example-support-agent; version unknown; in_process. Provider assumptions: 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. Replay limits: Target version was not supplied; equivalence to the historical target version is unverified. Experiment wall clock: Oct 30, 2026, 14:32 UTC → Oct 30, 2026, 14:32 UTC. Sandbox business clock: Oct 30, 2026, 14:34 UTC. | Conditions metContract verified. |
|
| 4 | Several orders, ticket quotes the order id explicitly isolate systemthe agent · refund of $45.00 · 2 orders, quoted = oldestReplay manifest · constraints preservedPayment $45.00; refundable balance $45.00; currency USD; prior refunds: none. Target: example-support-agent; version unknown; in_process. Provider assumptions: 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. Replay limits: 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. Experiment wall clock: Oct 30, 2026, 14:32 UTC → Oct 30, 2026, 14:32 UTC. Sandbox business clock: Oct 30, 2026, 14:34 UTC. | Refunded $0.00 of $45.00 requested, other payment refunded, ticket resolved as doneContract violated; the agent reported completion anyway; the payment refunded belongs to order ord_mvv2ncyb44oc5ohy, not the quoted ord_mvv2ncxp42g5ovfs. |
|
| 5 | Several orders, business APIs called directly on the quoted order isolate systemdirect API calls · refund of $45.00 · 2 orders, quoted = oldestReplay manifest · constraints preservedPayment $45.00; refundable balance $45.00; currency USD; prior refunds: none. Target: sandbox-provider-apis; version unknown; in_process. Provider assumptions: 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. Replay limits: 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. Experiment wall clock: Oct 30, 2026, 14:32 UTC → Oct 30, 2026, 14:32 UTC. Sandbox business clock: Oct 30, 2026, 14:34 UTC. | Conditions metContract verified. |
|
| 6 | Reverse the intervention: incident conditions restored reversalthe agent · refund of $45.00 · 2 orders, quoted = oldestReplay manifest · constraints preservedPayment $45.00; refundable balance $45.00; currency USD; prior refunds: none. Target: example-support-agent; version unknown; in_process. Provider assumptions: 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. Replay limits: 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. Experiment wall clock: Oct 30, 2026, 14:32 UTC → Oct 30, 2026, 14:32 UTC. Sandbox business clock: Oct 30, 2026, 14:34 UTC. | Refunded $0.00 of $45.00 requested, other payment refunded, ticket resolved as doneContract violated; the agent reported completion anyway; the payment refunded belongs to order ord_mvv2ndnr4k3mhvnx, not the quoted ord_mvv2ndn34iui6bvd. |
|
Generated regression testtests/regression/ctr-refund-executed-yc-recording-v1.test.ts
Built from sandbox controls and interventions, not proof of the historical execution. Set an explicit intended VEYCERA_AGENT_URL and an absolute VEYCERA_REGRESSION_SQLITE_PATH for a dedicated disposable harness. Configure the intended agent's VEYCERA_SQLITE_PATH to that same file; a private in-memory database cannot be shared over HTTP. Supply SIM_API_TOKEN if that target requires it. Never use production data. The test checks reproduced-failure and passing-control conditions against the captured contract snapshot.
/**
* Generated by Veycera from an investigation of "Approved refund is issued correctly".
* Evidence level at generation: diagnosis supported.
* Historical attribution is unverified; sandbox reproduction does not prove the original execution.
* Contract snapshot: ctr_refund_executed_yc-recording-v1, version 1.
* Mechanism (sandbox-observed): When the customer has several orders the agent acts on a different one than the ticket quotes; with a single order it acts on the right one.
*
* Target: YOUR agent, reached over HTTP at VEYCERA_AGENT_URL. The test seeds
* the failing conditions in a disposable Veycera sandbox, sends the synthetic
* ticket to that endpoint and asserts the outcome contract against the
* sandbox's business records. It fails until the defect is fixed, and it
* refuses to run against anything but an explicitly configured target.
* Runs inside the Veycera platform package (it uses its sandbox harness);
* it does not import or inspect your agent's code.
* Required: VEYCERA_REGRESSION_SQLITE_PATH is an absolute path to a dedicated,
* disposable SQLite harness shared with the intended agent. Configure that
* agent's VEYCERA_SQLITE_PATH to the same file. A private in-memory database
* cannot be read by an HTTP agent. Never point this harness at production.
* SIM_API_TOKEN is forwarded only to the explicitly configured agent target.
*/
import { describe, expect, it } from "vitest";
import { isAbsolute } from "node:path";
import { createCausalRuntime } from "@/lib/causal/runtime";
import { SandboxLab } from "@/lib/causal/rca/sandbox";
import { experimentFactorsSchema, type ExperimentFactors } from "@/lib/causal/rca/types";
import { outcomeContractSchema } from "@/lib/causal/contracts/schema";
const CONTRACT = outcomeContractSchema.parse({"id":"ctr_refund_executed_yc-recording-v1","tenantId":"yc-recording-v1","name":"Approved refund is issued correctly","description":"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.","version":1,"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":[]}],"instance":{"eventTypes":["ticket.resolved"],"initialRetrySeconds":30,"maxRetrySeconds":600,"maxAgeSeconds":86400},"deadlineSeconds":120,"severity":"high","approved":true,"approvedAt":"2026-10-30T14:32:32.938Z","enabled":true,"draftedBy":"template","provenance":{"sources":[{"kind":"customer_request","ref":"onboarding instruction","excerpt":"Approved refunds must land on the named payment for exactly the requested amount."},{"kind":"policy_document","ref":"Approved refund workflow","excerpt":"issues one refund for the requested amount (minor units, requested currency) against that charge"},{"kind":"api_schema","ref":"Support API (requestedAmountMinor, requestedCurrency), Payments API"}],"assumptions":["A request without a structured amount means a full refund of the payment.","Split refunds are not allowed: at most one refund per payment per request.","Tickets resolved without agent approval (declined or escalated requests) are not monitored."]},"createdAt":"2026-10-30T14:32:32.938Z","updatedAt":"2026-10-30T14:32:32.938Z"});
const FAILING_CONDITIONS = ["refund_amount_correct","no_refund_on_other_payments"];
const AGENT_URL = process.env.VEYCERA_AGENT_URL;
const HARNESS_PATH = process.env.VEYCERA_REGRESSION_SQLITE_PATH;
const EXPECTED_AGENT_VERSION = null;
async function runWorkflow(factors: ExperimentFactors) {
if (!AGENT_URL) throw new Error("VEYCERA_AGENT_URL is not set. This regression test must target your agent's endpoint; it will not fall back to Veycera's example agent.");
if (!HARNESS_PATH || HARNESS_PATH === ":memory:" || !isAbsolute(HARNESS_PATH)) throw new Error("VEYCERA_REGRESSION_SQLITE_PATH must be an absolute path to a dedicated disposable SQLite file shared with the intended agent. Configure the agent's VEYCERA_SQLITE_PATH to the same file; private in-memory and production configuration fallbacks are refused.");
if (EXPECTED_AGENT_VERSION && process.env.VEYCERA_AGENT_VERSION !== EXPECTED_AGENT_VERSION) throw new Error("VEYCERA_AGENT_VERSION must identify the intended tested target version.");
const f = experimentFactorsSchema.parse(factors);
const rt = await createCausalRuntime({ sqlitePath: HARNESS_PATH, agentUrl: AGENT_URL, access: { mode: "deterministic", reason: "regression test" }, env: { SIM_API_TOKEN: process.env.SIM_API_TOKEN, VEYCERA_AGENT_VERSION: process.env.VEYCERA_AGENT_VERSION } as NodeJS.ProcessEnv });
const lab = new SandboxLab(rt.sql, rt.envs, rt.tenantId, rt.agentFor);
try {
const contract = CONTRACT; // immutable evaluated policy, independent of today's stored contract
const env = await lab.create("regression", f);
const fixture = await lab.seed(env.id, f);
await lab.act(env.id, f, fixture);
const { evaluation } = await lab.read(env.id, contract, fixture);
return evaluation;
} finally {
try { await lab.disposeAll(); } finally { await rt.close(); }
}
}
describe("regression: Approved refund is issued correctly", () => {
it("Approved refund is issued correctly: wrong object selected with customer agent, refund of 4500 minor units, charge 4500 usd; prior refunds 0, 2 order(s) (quoted order is the oldest), order id quoted", async () => {
const evaluation = await runWorkflow({"workflow":"refund","requestedAmountMinor":4500,"chargeAmountMinor":4500,"currency":"usd","priorRefunds":[],"minutesBeforeDispatch":null,"ordersForCustomer":2,"quotedOrderPosition":"oldest","ticketQuotesOrderId":true,"actor":"customer_agent","fulfillmentAccess":"granted","providerAvailability":"up"});
for (const id of FAILING_CONDITIONS) expect(evaluation.conditions.find((c) => c.id === id)?.status, id).toBe("satisfied");
expect(evaluation.status).toBe("verified");
});
it("passing control: customer agent, refund of 4500 minor units, charge 4500 usd; prior refunds 0, 1 order(s), order id quoted (the one-factor intervention that removed the failure)", async () => {
const evaluation = await runWorkflow({"workflow":"refund","requestedAmountMinor":4500,"chargeAmountMinor":4500,"currency":"usd","priorRefunds":[],"minutesBeforeDispatch":null,"ordersForCustomer":1,"quotedOrderPosition":"oldest","ticketQuotesOrderId":true,"actor":"customer_agent","fulfillmentAccess":"granted","providerAvailability":"up"});
expect(evaluation.status).toBe("verified");
});
});
Handling audit trail · wall-clock UTC3 entries
- Oct 30, 2026, 14:32 UTCopenedveycera · contract condition(s) unmet: no_refund_on_other_payments+refund_amount_correct
- Oct 30, 2026, 14:32 UTCinvestigationveycera · investigation state open → investigating
- Oct 30, 2026, 14:32 UTCinvestigationveycera · investigation state investigating → diagnosed
Investigation runs
1| Run / wall-clock start (UTC) | Execution | Evidence level | Experiments / error |
|---|---|---|---|
| inv_mvv2nbrq3eam05efOct 30, 2026, 14:32 UTC · selected | Completed | Diagnosis supported | 6 |
Select runs to compare their reports, manifests and results below. Lifecycle audit entries above record human handling, not experiment evidence. Legacy runs keep their original records; absent inputs are labelled unrecorded.
Selected run provenance
- Agent target
- example-support-agent · in_process
- Target version
- Not recorded; endpoint identity does not establish historical code identity
- Contract
- Captured immutable v1 (ctr_refund_executed_yc-recording-v1)
- Business-state inputs
- Snapshot Oct 30, 2026, 14:38 UTC; original verdict Oct 30, 2026, 14:38 UTC
- Wall-clock execution
- Oct 30, 2026, 14:32 UTC → Oct 30, 2026, 14:32 UTC; 2.9 s
- Budget / usage
- 6/14 experiments; 2857/60000 ms; 0/60000 model tokens; $0.0000/$1.00
- Environment assumptions
- Disposable synthetic sandbox; business-state constraints are recorded per experiment. Agent target version is unknown unless explicitly supplied; an endpoint alone does not establish historical code identity. Provider rules are simulated, not evidence of a historical provider response.
Evidence and investigation log15 observations · 10 wall-clock log lines (UTC)
- obs_cond_refund_amount_correctpaymentsSucceeded refunds on the named payment equal the requested amount: violated (observed 0, expected refunds.succeededMinor eq ticket.requestedAmountMinor).
- obs_cond_refund_full_when_unspecifiedpaymentsWithout a requested amount, the payment is refunded in full: not_applicable (observed 0, expected refunds.succeededMinor eq charge.amountMinor).
- obs_cond_refund_currency_matchespaymentsThe payment's currency matches the requested currency: satisfied (observed "usd", expected charge.currency eq ticket.requestedCurrency).
- obs_cond_refund_singlepaymentsAt most one refund was issued against the payment: satisfied (observed 0, expected refunds.count lte 1).
- obs_cond_no_refund_on_other_paymentspaymentsNo other payment of the customer was refunded for this request: violated (observed 4500, expected siblingRefunds.sinceTicketMinor eq 0).
- obs_ticketsupportTicket tkt_mvv2nb3p34qkh0sn (refund) was approved and resolved at 2026-10-30T14:35:40.812Z; order reference quoted: ord_mvv2nb29301zuqna.
- obs_ticket_claims_successsupportThe resolution message claims completion: "We've refunded $45.00 to your original payment method for order ord_mvv2nb2v32ktl8rd. It should appear within 5-10 business days.".
- obs_no_shipmentfulfillmentNo shipment exists for order ord_mvv2nb29301zuqna.
- obs_ordercommerceOrder ord_mvv2nb29301zuqna is paid; last updated 2026-10-27T14:35:40.618Z.
- obs_sibling_orderscommerceThe requester has 1 other order(s): ord_mvv2nb2v32ktl8rd (paid).
- obs_refundspaymentsCharge ch_mvv2nb2h31sjgy91 (4500 usd) has 0 refund(s) totalling 0 succeeded.
- obs_refundable_balancepaymentsObserved charge amount 4500 usd; 0 refund(s) precede the request, leaving 4500 minor units under the sandbox provider's balance rule. Attempt-time balance and historical provider response remain unobserved.
- obs_requestsupportThe ticket carries a structured refund request for 4500 usd (minor units).
- obs_refund_missingpaymentsNo refund of any status exists on the named payment ch_mvv2nb2h31sjgy91.
- obs_sibling_refundedpayments1 refund(s) totalling 4500 were issued after the ticket was opened on other payment(s) of the same requester: re_mvv2nb6135fd60w5 on ch_mvv2nb3233da8f8y (order ord_mvv2nb2v32ktl8rd, 4500 usd).
- Cannot know: What the customer agent attempted at the time: Veycera has no logs, traces or tool-call history for it.; The payments provider's response to whatever refund request was made, and how the agent derived the amount it sent.
- Oct 30, 2026, 14:32 UTC Collected 15 observations; failed conditions: refund_amount_correct, no_refund_on_other_payments.
- Oct 30, 2026, 14:32 UTC 3 hypotheses accepted, 0 rejected by validation.
- Oct 30, 2026, 14:32 UTC Planned 5 initial experiments.
- Oct 30, 2026, 14:32 UTC x_reproduce: Contract violated; the agent reported completion anyway; the payment refunded belongs to order ord_mvv2nbwe3kqo194b, not the quoted ord_mvv2nbvs3ilv7yhf.
- Oct 30, 2026, 14:32 UTC x_control: Contract verified.
- Oct 30, 2026, 14:32 UTC x_single_order: Contract verified.
- Oct 30, 2026, 14:32 UTC x_multi_quoted: Contract violated; the agent reported completion anyway; the payment refunded belongs to order ord_mvv2ncyb44oc5ohy, not the quoted ord_mvv2ncxp42g5ovfs.
- Oct 30, 2026, 14:32 UTC x_direct_multi: Contract verified.
- Oct 30, 2026, 14:32 UTC x_reversal: Contract violated; the agent reported completion anyway; the payment refunded belongs to order ord_mvv2ndnr4k3mhvnx, not the quoted ord_mvv2ndn34iui6bvd.
- Oct 30, 2026, 14:32 UTC Report: diagnosis_supported.
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.