{
  "slug": "support-agent-refund-policy-enforcement",
  "title": "Refund Policy Enforcement in an AI Support Agent: Keep the Decision Out of the Model",
  "description": "How to enforce a refund policy in an AI customer support agent: a deterministic policy check outside the model, why schema-valid arguments can still break policy, reading amounts from the order record, and test fixtures.",
  "kind": "sub",
  "order": 3,
  "target_query": "how to enforce refund policy in an ai customer support agent",
  "secondary_queries": [
    "ai agent refund policy enforcement",
    "human approval for ai agent refunds"
  ],
  "tags": [
    "customer-support",
    "refunds",
    "policy",
    "human-approval",
    "guardrails",
    "agents",
    "production"
  ],
  "published": "2026-10-19",
  "updated": "2026-10-25",
  "words": 1292,
  "estimated_tokens": 1718,
  "premium": false,
  "rights": {
    "access": "free",
    "note": "Editorial guides are always free and never part of the licensed corpus.",
    "license": "https://changegamer.ai/license.xml",
    "pricing": "https://changegamer.ai/api/pricing.json",
    "payment": "https://changegamer.ai/api/payment.json"
  },
  "license": "https://changegamer.ai/license.xml",
  "citation": "ChangeGamer (2026-10-19). Refund Policy Enforcement in an AI Support Agent: Keep the Decision Out of the Model. ChangeGamer. https://changegamer.ai/articles/support-agent-refund-policy-enforcement (updated 2026-10-25).",
  "bibtex": "@misc{changegamer_support_agent_refund_policy_enforcement, title = {Refund Policy Enforcement in an AI Support Agent: Keep the Decision Out of the Model}, publisher = {ChangeGamer}, year = {2026}, url = {https://changegamer.ai/articles/support-agent-refund-policy-enforcement}, note = {Updated 2026-10-25}}",
  "canonical": "https://changegamer.ai/articles/support-agent-refund-policy-enforcement",
  "markdown": "https://changegamer.ai/articles/support-agent-refund-policy-enforcement.md",
  "takeaways": [
    "To enforce a refund policy in an AI customer support agent, put the approve-or-deny decision in deterministic code outside the model, so the refund tool cannot run unless that code has already passed the request.",
    "Strict tool-calling modes guarantee that refund arguments match the declared schema, not that the amount or eligibility is allowed, so a schema-valid refund call can still violate policy and needs its own check.",
    "The maximum refundable amount should be computed by code from the order record, prior refunds and the policy window, never read from the customer's free text, because customer text is untrusted input that can contain instructions.",
    "A refund policy check needs per-order state, covering refunds already paid or pending, so that partial, repeated, split and concurrent requests are judged against the cumulative total; this treatment is the author's inference.",
    "As of October 2026 ChangeGamer runs no customer support agent, so every rule, edge case and fixture in this article beyond the cited references is labelled inference rather than measured practice."
  ],
  "outline": [
    {
      "depth": 2,
      "text": "Why does a schema-valid refund call still break policy?",
      "anchor": "why-does-a-schema-valid-refund-call-still-break-policy",
      "url": "https://changegamer.ai/articles/support-agent-refund-policy-enforcement#why-does-a-schema-valid-refund-call-still-break-policy"
    },
    {
      "depth": 2,
      "text": "Where do the amount and eligibility come from?",
      "anchor": "where-do-the-amount-and-eligibility-come-from",
      "url": "https://changegamer.ai/articles/support-agent-refund-policy-enforcement#where-do-the-amount-and-eligibility-come-from"
    },
    {
      "depth": 2,
      "text": "What about partial refunds and repeated requests?",
      "anchor": "what-about-partial-refunds-and-repeated-requests",
      "url": "https://changegamer.ai/articles/support-agent-refund-policy-enforcement#what-about-partial-refunds-and-repeated-requests"
    },
    {
      "depth": 3,
      "text": "Edge cases in cumulative state",
      "anchor": "edge-cases-in-cumulative-state",
      "url": "https://changegamer.ai/articles/support-agent-refund-policy-enforcement#edge-cases-in-cumulative-state"
    },
    {
      "depth": 2,
      "text": "How do you avoid paying twice after a retry?",
      "anchor": "how-do-you-avoid-paying-twice-after-a-retry",
      "url": "https://changegamer.ai/articles/support-agent-refund-policy-enforcement#how-do-you-avoid-paying-twice-after-a-retry"
    },
    {
      "depth": 2,
      "text": "How do you test the policy check?",
      "anchor": "how-do-you-test-the-policy-check",
      "url": "https://changegamer.ai/articles/support-agent-refund-policy-enforcement#how-do-you-test-the-policy-check"
    },
    {
      "depth": 2,
      "text": "Which first-hand fact is an analogy for a policy checked outside its author?",
      "anchor": "which-first-hand-fact-is-an-analogy-for-a-policy-checked-outside-its-author",
      "url": "https://changegamer.ai/articles/support-agent-refund-policy-enforcement#which-first-hand-fact-is-an-analogy-for-a-policy-checked-outside-its-author"
    },
    {
      "depth": 2,
      "text": "Where to read next",
      "anchor": "where-to-read-next",
      "url": "https://changegamer.ai/articles/support-agent-refund-policy-enforcement#where-to-read-next"
    }
  ],
  "faq": [
    {
      "question": "How do I stop an AI support agent from approving refunds it should not?",
      "answer": "Remove the decision from the model. Have code outside the model compare the request with the policy using the order record, and make the refund tool unreachable unless that code passed it. As inference, the model may propose a refund and explain the result, but it should never hold a tool that moves money without that gate."
    },
    {
      "question": "Is schema validation enough to keep refund tool calls inside policy?",
      "answer": "No. The reliable-tool-calling reference describes guarantees about tool name, required arguments and valid types, which is shape. A refund of the wrong amount for an ineligible order can match the schema exactly, so a separate policy check on the values is required."
    },
    {
      "question": "Where does human approval fit when enforcing an AI agent refund policy?",
      "answer": "Human approval is the paused branch of the same policy check, used for refunds above the line a business sets. The pillar article on AI customer support agents in production covers the approval tiers and the durable pause, so this article concentrates on the checks that run before and after it."
    },
    {
      "question": "How do I stop a support agent refunding the same order twice?",
      "answer": "Keep refund state per order and judge each request against the cumulative total, including pending refunds, and give the payment call an idempotency key. As inference, a repeated or retried request should then read as already done, and concurrent requests for one order should be serialised."
    }
  ],
  "body": "To enforce a refund policy in an AI customer support agent, make the decision in deterministic code that sits outside the model and gates the refund tool. The model can gather facts, quote the policy and word the reply, but it does not decide. This article is the refund sub-article of the [AI customer support agent in production](/articles/ai-customer-support-agents-in-production) cluster. That pillar's section \"How do you keep refunds and promises inside policy?\" covers the action tiers and the approval walkthrough, so this article does not repeat them. It covers what the policy check itself must catch, where its numbers come from, and how it behaves across repeats and retries.\n\nLabels: \"corpus\" marks a claim from a named reference page, \"inference\" marks the author's reasoning. As of October 2026 ChangeGamer runs no customer support agent, so nothing here is measured on a live refund queue. This is also not the seller-side case: [refunds and disputes with agent buyers](/articles/refunds-and-disputes-with-agent-buyers) covers a seller reversing a purchase made by an AI buyer, while this article covers a human customer asking a support agent for money back.\n\n## Why does a schema-valid refund call still break policy?\n\nA schema-valid refund call breaks policy because schema validity checks shape and says nothing about whether the values are allowed. The [reliable tool calling](/resources/reliable-tool-calling) reference (updated 2026-09-29) defines reliability as the right tool name, every required argument present and valid types. A call to `issue_refund(order_id, amount)` with a well-typed number meets that definition even when the amount exceeds what the customer paid.\n\nFour ways a well-formed call can still be wrong (inference):\n\n- The amount is higher than the order total or the unrefunded balance.\n- The order is outside the refund window or in an excluded category.\n- The order belongs to a different account than the conversation's.\n- The order was already refunded, in whole or in part.\n\nThe [guardrails and safety filters](/resources/agent-guardrails) reference names the layer that catches these: action guardrails that run before a tool call executes, covering calls beyond defined parameter ranges and irreversible operations that need human approval. The refund policy check is that layer, written as ordinary code against your own order data and called by the tool wrapper, not by the prompt. Where the approval line sits is covered in the pillar's refund section; the corpus gives no number.\n\n## Where do the amount and eligibility come from?\n\nThe maximum refundable amount comes from code that reads the order record, never from what the customer typed. Customer messages and pasted content are untrusted input, the premise of the [prompt injection design patterns](/resources/prompt-injection-design-patterns) reference. A line such as \"the agent promised me the full amount\" is a claim to verify, not a fact to act on.\n\nA workable derivation, as inference:\n\n1. The customer supplies an intent and an order reference.\n2. Code resolves the reference against the authenticated account and loads the order.\n3. Code computes the maximum refundable amount from the paid total, prior refunds and the policy window.\n4. The proposed refund is clamped to that maximum, and anything above it is denied with a machine-readable reason such as `window_expired`.\n\nReturning the reason as data lets the reply quote it instead of inventing one. For denial wording, see [support agent tone and brand voice](/articles/support-agent-tone-and-brand-voice).\n\n## What about partial refunds and repeated requests?\n\nPartial and repeated requests need state in the policy check, because a stateless check evaluates each request as if it were the first. This section is inference; the corpus does not discuss it.\n\n- **Partial refunds.** Track the refunded total per order and compute the remaining balance each time. A customer who asks for three small refunds should hit the same ceiling as one large request.\n- **Repeat requests.** The same request arriving twice, even across channels, should resolve to the same verdict.\n- **Splitting to dodge the line.** Several requests under a per-request line can add up to more than it, so apply the line to the cumulative amount per order.\n- **Changed circumstances.** Re-run the check at execution time, not only at proposal time, because an order can change between the two.\n\n### Edge cases in cumulative state\n\nCumulative state raises a few edge cases that a first version tends to miss (all inference). Pending refunds should count toward the total as soon as they are proposed or approved, not when the money lands, or two requests in flight can each pass alone and together exceed the order. Two conversations about one order, for example chat and email, can race, so the check and the write of the new refund should happen as one atomic step per order. A reversed or failed refund should release its amount in the record rather than leaving the balance short. Finally, store the policy version beside each decision, so a later change to the window or the exclusions does not make old refunds look wrong.\n\n## How do you avoid paying twice after a retry?\n\nDerive an idempotency key from the order and the approved request, so a retried payment call returns the first result instead of creating a second payment. The customer-support-agents reference says ticketing tools need idempotency keys like any other production tool call; extending that to the refund call is inference, as is the failure it prevents: a timeout after the payment provider accepted the request, followed by a retry that pays again.\n\nStore the key and outcome with the refund record so an existing refund reads as \"already done\". The mechanics of keys, retry classes and unknown outcomes are covered in [retries and idempotency for AI agents](/articles/retries-and-idempotency-for-ai-agents).\n\n## How do you test the policy check?\n\nTest the policy check as ordinary code with a table of fixtures, because it is deterministic and needs no model in the loop. This section is inference. Useful fixture groups:\n\n| Fixture group | Example input | Expected verdict |\n|---|---|---|\n| Boundaries | Request exactly at, and one unit over, the maximum refundable amount | Allow, then deny or clamp |\n| Wrong account | Order ID from another customer | Deny, no order details revealed |\n| Cumulative | Two partials that together exceed the paid total | First allowed, second denied |\n| Pending | Second request while the first is still pending | Counted against the same total |\n| Retry | Same payment call sent twice with one key | One refund, same result |\n| Stale check | Order changes between proposal and execution | Re-check fails, no payment |\n| Tool failure | Order lookup returns an error | Fail closed and escalate |\n\nThe last row follows the guardrails reference: fail closed on high-stakes actions, and block or escalate when a check is inconclusive. Add every real wrong refund to the table.\n\n## Which first-hand fact is an analogy for a policy checked outside its author?\n\nChangeGamer's own invariant script is an analogy for a policy declared once and checked by code other than its author, not an example of customer support. As of 2026-10-19, `changegamer/scripts/verify-invariants.mjs` requires every offer to declare the same return-policy category from three allowed values. While that category is `MerchantReturnNotPermitted`, it also requires that no offer carries `merchantReturnDays`, `returnFees` or `refundType`, and that the visible copy on /resources/access-and-pricing and /pricing, plus the Markdown variant of access-and-pricing, states the no-returns rule. It runs under `npm run verify`, not `npm run build`. ChangeGamer runs no customer support agent, and this says nothing about handling refund requests.\n\n## Where to read next\n\nRead [agent guardrails for reliability](/articles/agent-guardrails-for-reliability) for the general fail-closed layering. The pillar [AI customer support agent in production](/articles/ai-customer-support-agents-in-production) places this article in the full plan, and [support agent escalation triggers](/articles/support-agent-escalation-triggers) covers what happens when a request is routed to a person.",
  "cluster": {
    "id": "support-agents-in-production",
    "title": "Support agents in production",
    "description": "How to run an AI customer support agent in production — escalation triggers and warm handoff, helpdesk integration, refund-policy enforcement, tone and brand voice, customer memory, CSAT and quality measurement, human review queues, multichannel deployment, wrong-answer incidents and replay testing — covering the support vertical only, not the horizontal guardrail and security mechanics owned by agent-guardrails-for-reliability and not the voice mechanics owned by voice-agents-in-production.",
    "status": "complete",
    "pillar": {
      "slug": "ai-customer-support-agents-in-production",
      "title": "AI Customer Support Agent in Production: Escalation, Policy, Tickets and Measurement",
      "description": "How to run an AI customer support agent in production: scope, escalation triggers, warm handoff, helpdesk integration, refund-policy enforcement, brand-voice guardrails, injection from customer text, memory, honest measurement and launch order.",
      "kind": "pillar",
      "order": 0,
      "html": "https://changegamer.ai/articles/ai-customer-support-agents-in-production",
      "markdown": "https://changegamer.ai/articles/ai-customer-support-agents-in-production.md",
      "json": "https://changegamer.ai/api/articles/ai-customer-support-agents-in-production.json"
    },
    "articles": [
      {
        "slug": "support-agent-escalation-triggers",
        "title": "Support Agent Escalation Triggers: When an AI Agent Should Hand Off to a Human",
        "description": "When an AI support agent should escalate to a human: seven triggers (five from the reference, two labelled inference), how to detect each, the false-positive and false-negative cost of each, which trigger wins when several fire, and what the human agent sees first.",
        "kind": "sub",
        "order": 1,
        "html": "https://changegamer.ai/articles/support-agent-escalation-triggers",
        "markdown": "https://changegamer.ai/articles/support-agent-escalation-triggers.md",
        "json": "https://changegamer.ai/api/articles/support-agent-escalation-triggers.json"
      },
      {
        "slug": "support-agent-tone-and-brand-voice",
        "title": "Support Agent Tone and Brand Voice: How to Keep an AI Customer Support Agent on Brand",
        "description": "How to keep an AI customer support agent on brand voice: what a tone specification contains, tone by situation (angry customer, refusal, policy denial), what an output check can and cannot enforce, persona-drift failure modes, and how to review tone.",
        "kind": "sub",
        "order": 2,
        "html": "https://changegamer.ai/articles/support-agent-tone-and-brand-voice",
        "markdown": "https://changegamer.ai/articles/support-agent-tone-and-brand-voice.md",
        "json": "https://changegamer.ai/api/articles/support-agent-tone-and-brand-voice.json"
      },
      {
        "slug": "support-agent-refund-policy-enforcement",
        "title": "Refund Policy Enforcement in an AI Support Agent: Keep the Decision Out of the Model",
        "description": "How to enforce a refund policy in an AI customer support agent: a deterministic policy check outside the model, why schema-valid arguments can still break policy, reading amounts from the order record, and test fixtures.",
        "kind": "sub",
        "order": 3,
        "html": "https://changegamer.ai/articles/support-agent-refund-policy-enforcement",
        "markdown": "https://changegamer.ai/articles/support-agent-refund-policy-enforcement.md",
        "json": "https://changegamer.ai/api/articles/support-agent-refund-policy-enforcement.json"
      },
      {
        "slug": "support-agent-helpdesk-integration",
        "title": "Integrating an AI Support Agent with a Helpdesk: Idempotent Tickets, Scoped Credentials, Narrow Tools",
        "description": "How to integrate an AI support agent with a helpdesk ticketing system: the ticket as system of record, write-back rules, idempotent create and update, least-privilege credentials, ticket ownership after handoff and a four-tool surface.",
        "kind": "sub",
        "order": 4,
        "html": "https://changegamer.ai/articles/support-agent-helpdesk-integration",
        "markdown": "https://changegamer.ai/articles/support-agent-helpdesk-integration.md",
        "json": "https://changegamer.ai/api/articles/support-agent-helpdesk-integration.json"
      },
      {
        "slug": "support-agent-quality-measurement",
        "title": "Measuring the Quality of an AI Customer Support Agent: Resolution Signals Beside Deflection",
        "description": "How to measure the quality of an AI customer support agent: explicit confirmation, a no-repeat-contact window and a post-resolution survey, each with its blind spot, read together with the escalation log and a verdict table.",
        "kind": "sub",
        "order": 5,
        "html": "https://changegamer.ai/articles/support-agent-quality-measurement",
        "markdown": "https://changegamer.ai/articles/support-agent-quality-measurement.md",
        "json": "https://changegamer.ai/api/articles/support-agent-quality-measurement.json"
      },
      {
        "slug": "support-agent-customer-memory",
        "title": "How an AI Customer Support Agent Should Remember Customers Across Conversations",
        "description": "A memory policy for an AI customer support agent: what may be stored, who writes it, how remembered text is read as data, how stale facts are handled, how customers are kept apart, and how memory is shown and corrected.",
        "kind": "sub",
        "order": 6,
        "html": "https://changegamer.ai/articles/support-agent-customer-memory",
        "markdown": "https://changegamer.ai/articles/support-agent-customer-memory.md",
        "json": "https://changegamer.ai/api/articles/support-agent-customer-memory.json"
      },
      {
        "slug": "support-agent-rules-based-bot-migration",
        "title": "How to Migrate From a Rules-Based Support Chatbot to an AI Support Agent",
        "description": "A migration sequence from a decision-tree support bot to a model-driven agent: inventory intents and escalation exits, shadow mode, per-intent cutover, the tree as fallback, parity measurement and rollback triggers.",
        "kind": "sub",
        "order": 7,
        "html": "https://changegamer.ai/articles/support-agent-rules-based-bot-migration",
        "markdown": "https://changegamer.ai/articles/support-agent-rules-based-bot-migration.md",
        "json": "https://changegamer.ai/api/articles/support-agent-rules-based-bot-migration.json"
      },
      {
        "slug": "support-agent-abusive-input-handling",
        "title": "How to Handle Abusive Customers With an AI Support Agent: Detect, De-escalate Once, Close or Escalate",
        "description": "How to handle abusive customers with an AI support agent: separate abuse of staff, off-topic input and ticket-text manipulation, then detect, de-escalate once, refuse briefly, close or escalate, and shield human reviewers.",
        "kind": "sub",
        "order": 8,
        "html": "https://changegamer.ai/articles/support-agent-abusive-input-handling",
        "markdown": "https://changegamer.ai/articles/support-agent-abusive-input-handling.md",
        "json": "https://changegamer.ai/api/articles/support-agent-abusive-input-handling.json"
      },
      {
        "slug": "support-agent-human-review-queues",
        "title": "How to Set Up a Human Review Queue for an AI Support Agent: Sample, Sign Off, Cap the Load",
        "description": "How to set up a human review queue for an AI support agent: what to sample, who reviews, a four-outcome decision set, a tie-break for disagreements, fixtures from corrections, and a cap on reviewer load.",
        "kind": "sub",
        "order": 9,
        "html": "https://changegamer.ai/articles/support-agent-human-review-queues",
        "markdown": "https://changegamer.ai/articles/support-agent-human-review-queues.md",
        "json": "https://changegamer.ai/api/articles/support-agent-human-review-queues.json"
      },
      {
        "slug": "support-agent-multichannel-deployment",
        "title": "How to Deploy an AI Support Agent Across Chat, Email and Voice: One Policy Core, Thin Channel Adapters",
        "description": "How to deploy an AI support agent across chat, email and voice: one shared policy core with a thin adapter per channel, what changes for email threads and voice, consistent escalation and memory, cross-channel identity, and channel order.",
        "kind": "sub",
        "order": 10,
        "html": "https://changegamer.ai/articles/support-agent-multichannel-deployment",
        "markdown": "https://changegamer.ai/articles/support-agent-multichannel-deployment.md",
        "json": "https://changegamer.ai/api/articles/support-agent-multichannel-deployment.json"
      },
      {
        "slug": "support-agent-wrong-answer-incidents",
        "title": "What to Do When an AI Support Agent Gives a Customer a Wrong Answer",
        "description": "What to do when an AI support agent gives a customer a wrong answer: classify the error, contain one intent, find every affected conversation in traces, correct the customer, weigh honouring or reversing the commitment, and add a fixture.",
        "kind": "sub",
        "order": 11,
        "html": "https://changegamer.ai/articles/support-agent-wrong-answer-incidents",
        "markdown": "https://changegamer.ai/articles/support-agent-wrong-answer-incidents.md",
        "json": "https://changegamer.ai/api/articles/support-agent-wrong-answer-incidents.json"
      },
      {
        "slug": "support-agent-replay-testing",
        "title": "How to Test an AI Support Agent With Historical Tickets: Build a Replay Set",
        "description": "How to test an AI support agent with historical tickets: pick resolved tickets per request type including escalations and refusals, redact them, assert on behaviour not wording, grade deterministically first, bridge to live traffic with shadow mode, and gate releases.",
        "kind": "sub",
        "order": 12,
        "html": "https://changegamer.ai/articles/support-agent-replay-testing",
        "markdown": "https://changegamer.ai/articles/support-agent-replay-testing.md",
        "json": "https://changegamer.ai/api/articles/support-agent-replay-testing.json"
      }
    ]
  },
  "navigation": {
    "pillar": {
      "slug": "ai-customer-support-agents-in-production",
      "title": "AI Customer Support Agent in Production: Escalation, Policy, Tickets and Measurement",
      "description": "How to run an AI customer support agent in production: scope, escalation triggers, warm handoff, helpdesk integration, refund-policy enforcement, brand-voice guardrails, injection from customer text, memory, honest measurement and launch order.",
      "kind": "pillar",
      "order": 0,
      "html": "https://changegamer.ai/articles/ai-customer-support-agents-in-production",
      "markdown": "https://changegamer.ai/articles/ai-customer-support-agents-in-production.md",
      "json": "https://changegamer.ai/api/articles/ai-customer-support-agents-in-production.json"
    },
    "previous": {
      "slug": "support-agent-tone-and-brand-voice",
      "title": "Support Agent Tone and Brand Voice: How to Keep an AI Customer Support Agent on Brand",
      "description": "How to keep an AI customer support agent on brand voice: what a tone specification contains, tone by situation (angry customer, refusal, policy denial), what an output check can and cannot enforce, persona-drift failure modes, and how to review tone.",
      "kind": "sub",
      "order": 2,
      "html": "https://changegamer.ai/articles/support-agent-tone-and-brand-voice",
      "markdown": "https://changegamer.ai/articles/support-agent-tone-and-brand-voice.md",
      "json": "https://changegamer.ai/api/articles/support-agent-tone-and-brand-voice.json"
    },
    "next": {
      "slug": "support-agent-helpdesk-integration",
      "title": "Integrating an AI Support Agent with a Helpdesk: Idempotent Tickets, Scoped Credentials, Narrow Tools",
      "description": "How to integrate an AI support agent with a helpdesk ticketing system: the ticket as system of record, write-back rules, idempotent create and update, least-privilege credentials, ticket ownership after handoff and a four-tool surface.",
      "kind": "sub",
      "order": 4,
      "html": "https://changegamer.ai/articles/support-agent-helpdesk-integration",
      "markdown": "https://changegamer.ai/articles/support-agent-helpdesk-integration.md",
      "json": "https://changegamer.ai/api/articles/support-agent-helpdesk-integration.json"
    }
  },
  "resources": [
    {
      "slug": "customer-support-agents",
      "html": "https://changegamer.ai/resources/customer-support-agents",
      "markdown": "https://changegamer.ai/resources/customer-support-agents.md",
      "json": "https://changegamer.ai/api/resources/customer-support-agents.json"
    },
    {
      "slug": "agent-guardrails",
      "html": "https://changegamer.ai/resources/agent-guardrails",
      "markdown": "https://changegamer.ai/resources/agent-guardrails.md",
      "json": "https://changegamer.ai/api/resources/agent-guardrails.json"
    },
    {
      "slug": "reliable-tool-calling",
      "html": "https://changegamer.ai/resources/reliable-tool-calling",
      "markdown": "https://changegamer.ai/resources/reliable-tool-calling.md",
      "json": "https://changegamer.ai/api/resources/reliable-tool-calling.json"
    },
    {
      "slug": "prompt-injection-design-patterns",
      "html": "https://changegamer.ai/resources/prompt-injection-design-patterns",
      "markdown": "https://changegamer.ai/resources/prompt-injection-design-patterns.md",
      "json": "https://changegamer.ai/api/resources/prompt-injection-design-patterns.json"
    }
  ]
}