The reason cancellation agents and plan-change agents are usually tested separately is organizational, not technical. One team owns churn, another owns expansion revenue, and their test suites grow apart. But look at what the two agents actually do to the money: both read a billing period, compute an unused fraction, post a credit, post a charge, and record a net movement. A cancellation is a plan change whose new price is zero. Once you see it that way, one harness serves both, and coverage you build for one keeps testing the other for free.
Two design rules make the shared harness possible. First, both agents must emit ledger entries through the same internal interface, ideally a post(entries) call that accepts a list of debits and credits. Second, both must return a machine-readable result object (period boundaries, proration numerator and denominator, amounts), never just a customer-facing message. If an agent only knows how to send an email and update a status field, you cannot assert anything about money. The controlled-automation framing in Trusted Data's financial services agent guide makes the same point: bounded tasks need a proof of completion, not just a convincing transcript.
If your agents run on different model providers, keep the harness provider-agnostic by mocking the model boundary and letting each agent's tool calls execute against a real sandbox ledger. Running every model behind a single OpenAI-compatible endpoint, as Quanta Inference does, removes one more axis of difference when you compare agents.



