Recoup watches failed one-time payments and failing subscriptions, works out why each one failed, then executes a bounded recovery playbook per case — retry, card-update nudge, fresh payment link, or deliberately nothing. It reports the rupees it actually brought back, and the ones it decided to leave alone.
Subscription cases never propose a retry — Razorpay already retries 4× then halts.
Not overridable by the model or by a human. The refusal is audited.
If the model is unreachable, the case falls below the act threshold and routes to a human.
Unambiguous Razorpay error codes resolve from a deterministic table. The LLM is only invoked when the code is missing, vendor-mangled, or contradicts the payload — and its confidence is written to the case.
Quiet hours, value floors, attempt caps, contact-frequency limits, daily send caps and a kill switch. The executor runs strictly after an allow verdict and never re-decides.
Every stage writes one row — actor, verdict, latency, tokens, raw payload. There is no update or delete procedure in the API. Human overrides are appended next to the machine decision.
Batch runs score the classifier against ground truth and surface false positives, false negatives, degraded cases and the full exception list beside the money recovered.