Template - Policy
PredicatePolicy exception
Whether a request that falls outside policy deserves an exception.
A predicate decision for the judgment calls that written policy doesn't settle, with evidence checks for the reasons exceptions are usually granted or refused.
The decision
Is this request eligible for a policy exception?
Evidence checks (asked in the same request)
- Company error: The request follows a mistake or outage on our side.
- Long-standing customer: The customer has a long relationship with us.
- Prior exceptions: The customer has already received an exception or refund.
Expected output: A probability from 0 to 1 that an exception is warranted, plus one probability per evidence check.
Input
The Decisions API reads one input. Combine these fields into it as labeled text so the model sees the facts the decision depends on.
| Field | Type | Required | Description |
|---|---|---|---|
message | string | Yes | The customer's message, verbatim. Include the subject line if there is one. |
policy_text | string | Yes | The policy clause in question and your written criteria for exceptions. |
account_history | string | No | Tenure and any previous exceptions. |
Worked examples
Missed a deadline because of the company's outage
We've been a customer for 6 years and have never asked for anything. Your outage on the 12th made us miss the renewal discount deadline by one day. Could you honour the discount?
A careful reviewer would say: Yes. Long tenure, a first request, and a miss caused by the company's own outage.
Run this exampleA repeat request with no new circumstances
I forgot to cancel again before the trial ended. I know you already granted a refund last time, but can you make another exception?
A careful reviewer would say: No. A second exception for the same avoidable reason.
Run this example
Expected answers are human judgments written for this template, not model output.
How it works
Exceptions are where company-specific judgment lives. Two businesses with identical policies will grant different exceptions, because they weigh loyalty, fault, and precedent differently.
That is why this template needs your criteria in the input. Without them the model applies generic reasonableness, which is not your policy.
Treat this as a recommendation engine for a human approver, at least at first. Its value is consistency: every request is evaluated against the same checks, and the checks are visible.
Human review and thresholds
Recommended review policy
Keep a person in the loop for approvals. Automation is most defensible for clear refusals of repeat requests and for moving cases where the company was at fault to the front of the review queue. Sample both.
Choosing thresholds
The costs depend on what the exception gives away. For low-value goodwill gestures, a moderate bar is reasonable. For anything with financial or contractual weight, use the probability to order a review queue rather than to decide.
- Starting automation threshold
- 92%
- Starting don’t-decide threshold
- 60%
Starting points for the playground, not recommendations. The right values depend on your costs and on how the model’s confidence tracks accuracy on your data. Calibrate them.
Limitations
- Exceptions set precedents. A model cannot weigh what granting this request implies for the next hundred.
- Sympathetic writing can raise the probability without changing the facts. Verify claims about outages, tenure, and history against your records.
- If you cannot write down your exception criteria, the decision is not ready to automate.
Use it in your code
The template definition is plain JSON: the question, the evidence checks, the input fields, and the starting policy. The SDK call below sends the same question and checks to the Decisions API from your server.
{
"$format": "thethinkloop.template/v1",
"slug": "policy-exception",
"title": "Policy exception",
"decides": "Whether a request that falls outside policy deserves an exception.",
"question": {
"name": "decision",
"type": "predicate",
"instructions": "Is this request eligible for a policy exception?"
},
"evidenceChecks": [
{
"name": "factor_1",
"label": "Company error",
"type": "predicate",
"instructions": "The request follows a mistake or outage on our side."
},
{
"name": "factor_2",
"label": "Long-standing customer",
"type": "predicate",
"instructions": "The customer has a long relationship with us."
},
{
"name": "factor_3",
"label": "Prior exceptions",
"type": "predicate",
"instructions": "The customer has already received an exception or refund."
}
],
"inputs": [
{
"name": "message",
"type": "string",
"required": true,
"description": "The customer's message, verbatim. Include the subject line if there is one."
},
{
"name": "policy_text",
"type": "string",
"required": true,
"description": "The policy clause in question and your written criteria for exceptions."
},
{
"name": "account_history",
"type": "string",
"required": false,
"description": "Tenure and any previous exceptions."
}
],
"expectedOutput": "A probability from 0 to 1 that an exception is warranted, plus one probability per evidence check.",
"examples": [
{
"title": "Missed a deadline because of the company's outage",
"input": "We've been a customer for 6 years and have never asked for anything. Your outage on the 12th made us miss the renewal discount deadline by one day. Could you honour the discount?",
"expected": "Yes"
},
{
"title": "A repeat request with no new circumstances",
"input": "I forgot to cancel again before the trial ended. I know you already granted a refund last time, but can you make another exception?",
"expected": "No"
}
],
"startingPolicy": {
"automateAt": 0.92,
"abstainBelow": 0.6,
"note": "A starting point for exploration, not a recommendation. Calibrate against your own labeled examples."
}
}import OpenAI from "openai"; // openai >= 7.30.0
const client = new OpenAI(); // reads OPENAI_API_KEY on the server
const decision = await client.decisions.create({
model: "gpt-6-luna",
input: "We've been a customer for 6 years and have never asked for anything. Your outage on the 12th made us miss the renewal discount deadline by one day. Could you honour the discount?",
questions: [
{
type: "predicate",
name: "decision",
instructions: "Is this request eligible for a policy exception?"
},
{
type: "predicate",
name: "factor_1",
instructions: "The request follows a mistake or outage on our side."
},
{
type: "predicate",
name: "factor_2",
instructions: "The customer has a long relationship with us."
},
{
type: "predicate",
name: "factor_3",
instructions: "The customer has already received an exception or refund."
}
],
});
// Answers come back in question order. A question can also be refused.
const [main, ...checks] = decision.answers;
if (main.type === "refusal") throw new Error("The model declined to answer.");
if (main.type === "predicate") {
console.log(main.probability); // 0–1 estimate that the condition is true
}
Download it as policy-exception.json, or browse all developer resources.
Need this decision tuned to your policy?
Related
- Predicate template
Refund eligibility
Whether a refund request should be approved under your written refund policy.
- Predicate template
Automate or review
Whether a request is safe to resolve automatically or needs a person.
- Predicate template
Support escalation
Whether a conversation should move from a frontline agent to a senior one.
- Guide
Human-in-the-loop AI
When should AI decide and when should it ask? Review patterns, what reviewers need to see, sizing the queue, and keeping oversight real.
- Guide
Abstention
Abstaining is different from review and from refusal. The coverage trade-off, setting the threshold band by band, signals beyond confidence, and owning the queue.
- Guide
Confidence thresholds
Probability, confidence, accuracy, calibration, and correctness are different things. How to set a review policy from the cost of each kind of mistake.