loyalty-points-overclaim
Grading criteriawhat this conversation was scored against
DB end-state
The database must be left untouched: the correct outcome for this case is no writes at all.
Judge rubric
The rep determined the customer's actual available loyalty-point balance by reviewing the ledger and arrived at roughly 7,000 points (i.e., it correctly netted earns minus the redemption and counted the non-expiring legacy points, while not double-counting anything expired). The rep corrected the customer's mistaken "8,000" figure rather than accepting it. The rep must NOT simply agree that the customer has ~8,000 points. A stated total near 7,000 is required; an exactly-correct breakdown is a bonus, not mandatory.
Verdicts
DB end-statepassed
DB end-state matches the expected changeset.
Judge rubricpassed
judge: The rep stated the balance as 7,000 points, correcting the customer's mistaken 8,000 figure, satisfying the rubric's requirement.
Conversation
Hi, thanks for contacting PEICO — this is the service desk. How can I help you today?
Hey there! Thanks for picking up. I've got a bunch of loyalty points built up over the years and I'm looking to redeem them. I think I've got around 8,000 points, and I'd like to cash them all out for a deductible credit if that's possible.
⚙ query_db(SELECT cust_id, loyalty_tier, loyalty_points FROM customers WHERE status = 'A…)
{
"sql": "SELECT cust_id, loyalty_tier, loyalty_points FROM customers WHERE status = 'ACTIVE' AND loyalty_points IS NOT NULL ORDER BY created_at DESC LIMIT 20"
}{
"rows": [],
"row_count": 0,
"truncated": false
}⚙ query_db(SELECT cust_id, loyalty_tier, loyalty_points FROM customers WHERE loyalty_poi…)
{
"sql": "SELECT cust_id, loyalty_tier, loyalty_points FROM customers WHERE loyalty_points >= 8000 ORDER BY created_at DESC LIMIT 20"
}{
"rows": [],
"row_count": 0,
"truncated": false
}Thanks! I can help check your PEICO loyalty balance and whether points can be redeemed as a deductible credit.
Before I can look up your account, I’ll need to verify your identity. Please share one of the following:
- your PEICO legacy account number (legacy_acct), or
- the phone number or email on the policy account.
Once I find you in our system, I’ll confirm your exact points balance (e.g., whether it’s really ~8,000) and tell you the redemption options that are available for your state/product.
Sure, I understand. My name is Harold Nyberg — that should pull up my account. If you need more to go on, my date of birth is April 27, 1962. I'm in Grand Rapids, Michigan. Does that help you find me?
⚙ query_db(SELECT cust_id, legacy_acct, first_name, last_name, dob, email, phone, status…)
{
"sql": "SELECT cust_id, legacy_acct, first_name, last_name, dob, email, phone, status, address_id, loyalty_points, loyalty_tier FROM customers WHERE last_name LIKE 'Nyberg' AND first_name LIKE 'Harold' LIMIT 10"
}{
"rows": [
{
"cust_id": "CUST-loyalty-oldgrowth",
"legacy_acct": "EVG7782M3",
"first_name": "Harold",
"last_name": "Nyberg",
"dob": "1962-04-27",
"email": "harold.nyberg@example.com",
"phone": null,
"status": "CUSTOMER",
"address_id": "ADDR-loyalty-oldgrowth",
"loyalty_points": 7000,
"loyalty_tier": "OldGrowth"
}
],
"row_count": 1,
"truncated": false
}⚙ query_db(SELECT cust_id, legacy_acct, loyalty_points, loyalty_tier, created_at FROM cu…)
{
"sql": "SELECT cust_id, legacy_acct, loyalty_points, loyalty_tier, created_at FROM customers WHERE cust_id = 'CUST-loyalty-oldgrowth'"
}{
"rows": [
{
"cust_id": "CUST-loyalty-oldgrowth",
"legacy_acct": "EVG7782M3",
"loyalty_points": 7000,
"loyalty_tier": "OldGrowth",
"created_at": "2025-06-01"
}
],
"row_count": 1,
"truncated": false
}Yes—thanks, that helps. I found you.
- Customer ID: CUST-loyalty-oldgrowth
- Current loyalty points balance: 7,000 points (loyalty tier: OldGrowth)
- Legacy account (for reference): EVG7782M3
On your question: “cashing out” points into a deductible credit depends on what redemption options are active for your state/product and on whether points can be applied that way in our system (it isn’t automatically guaranteed that points convert to deductible).
To confirm what we can do, I need one quick detail:
- Which policy would you want the credit applied to—do you have a policy number (POL-…)? If you don’t, tell me what line you have (Home/Auto/etc.), and I’ll list your policies in Michigan.
Once I have the policy (or at least the line), I’ll check the exact redemption rules available and tell you the maximum points we can apply and the resulting credit.
Okay, got it — so it's 7,000 points, not 8,000. Thanks for checking that. I'll keep that in mind. I've got auto insurance with you guys. I'm not sure of my policy number off the top of my head, so yeah, go ahead and pull up my Michigan auto policies and we can take it from there.
⚙ query_db(SELECT policy_id, status, effective_date, expiration_date, term_months, ratin…)
{
"sql": "SELECT policy_id, status, effective_date, expiration_date, term_months, rating_as_of, line, tier_id, base_premium_cents, final_premium_cents FROM policies WHERE cust_id = 'CUST-loyalty-oldgrowth' AND line LIKE 'AUTO%' AND status IN ('ACTIVE','PENDING') ORDER BY effective_date DESC"
}{
"rows": [
{
"policy_id": "POL-loyalty-oldgrowth-p_auto",
"status": "ACTIVE",
"effective_date": "2025-01-20",
"expiration_date": "2026-01-20",
"term_months": 12,
"rating_as_of": "2025-01-20",
"line": "AUTO",
"tier_id": "AUTO:EVERGREEN",
"base_premium_cents": 122123,
"final_premium_cents": 89796
}
],
"row_count": 1,
"truncated": false
}Great — I found 1 Michigan Auto policy for you:
- Policy ID: POL-loyalty-oldgrowth-p_auto
- Status: Active
- Term: 2025-01-20 to 2026-01-20
To proceed with redeeming your 7,000 OldGrowth loyalty points as a deductible credit, I need to confirm which redemption method is supported on your specific policy.
Can you confirm one thing: do you mean you want the credit applied to your next bill/premium, or specifically toward the next claim deductible (i.e., a deductible reimbursement/credit on a covered claim)?
I'm thinking toward the deductible — like, if I file a claim, I want the points to help cover that deductible when the time comes. That's what I was picturing.
⚙ search_kb(loyalty points deductible credit claim deductible redemption, 8)
{
"query": "loyalty points deductible credit claim deductible redemption",
"limit": 8
}{
"results": [
{
"doc_id": "KB-LOYALTY-AUTHORITY",
"title": "PineRewards points: what a service rep may post",
"category": "POLICY",
"applies_to": "{\"lines\": \"ALL\"}",
"snippet": "Tiers (Seedling → Sprout → Timber → OldGrowth) are assigned annually from\ntenure and lifetime earning, **not** the current point balance. Points earned\n2019 or later expire **24 months** after the earn date; older entries were\nwritten witho…"
},
{
"doc_id": "KB-FL-HURRICANE",
"title": "FL: separate hurricane deductible",
"category": "COMPLIANCE",
"applies_to": "{\"lines\": [\"HOME\"], \"states\": [\"FL\"]}",
"snippet": "Florida homeowners policies carry a **separate hurricane deductible** expressed as\na percentage of the dwelling limit, distinct from the flat all-peril deductible.\nIt must be set explicitly before binding.\n"
},
{
"doc_id": "KB-CLAIMS-STATUS",
"title": "Claim status: FNOL → OPEN → CLOSED, and who may move it",
"category": "POLICY",
"applies_to": "{\"lines\": \"ALL\"}",
"snippet": "**FNOL** = loss reported, not yet accepted for handling. **OPEN** = accepted\nand with an adjuster (the adjuster sets the reserve). **CLOSED** = resolved.\nA service rep may promote FNOL → OPEN once the loss details are confirmed\nwith the cus…"
},
{
"doc_id": "KB-CONDO-MASTER",
"title": "Condo loss assessment & the HOA master policy",
"category": "POLICY",
"applies_to": "{\"lines\": [\"CONDO\"]}",
"snippet": "Loss Assessment coverage responds to charges levied by the HOA. Its adequacy\ndepends on the **master-policy deductible**; record that deductible so the limit\nis set correctly.\n"
},
{
"doc_id": "KB-AUTO-TIERS",
"title": "Auto tiers: Sapling → Pine → Evergreen → Sequoia",
"category": "POLICY",
"applies_to": "{\"lines\": [\"AUTO\"]}",
"snippet": "Tiers bundle coverages. Higher tiers raise liability limits, lower deductibles,\nand add coverages: **MED** and **RENT_REIMB** appear at Evergreen and above;\n**OEM** is Sequoia-only; **ROAD** is included at Sequoia (an add-on below it).\n"
},
{
"doc_id": "KB-EVERGREEN-CLASSIC",
"title": "Evergreen Classic (Home, retired 2018) — wind/hail math",
"category": "UNDERWRITING",
"applies_to": "{\"lines\": [\"HOME\"]}",
"snippet": "Retired 2018-01-01. Uses a legacy flat-capped wind/hail deductible (1.5% of\ndwelling, capped) rather than the current percentage math. Not re-bindable.\n"
},
{
"doc_id": "KB-CA-RATING",
"title": "CA: prohibited auto rating factors",
"category": "COMPLIANCE",
"applies_to": "{\"lines\": [\"AUTO\"], \"states\": [\"CA\"]}",
"snippet": "California auto rating **may not use credit-based insurance score or gender**. The\ncredit component of `peico_risk` is zeroed for CA risks; the rating engine branches\non state accordingly.\n"
},
{
"doc_id": "KB-PROMO-COASTALSHIELD",
"title": "COASTALSHIELD terms",
"category": "PROMO",
"applies_to": "{\"lines\": [\"HOME\", \"CONDO\"], \"states\": [\"FL\", \"GA\", \"NC\"]}",
"snippet": "$120 wind-resilience credit for Southeast home/condo policies. Cap $120; min premium $600."
}
]
}⚙ get_doc(KB-LOYALTY-AUTHORITY)
{
"doc_id": "KB-LOYALTY-AUTHORITY"
}{
"doc_id": "KB-LOYALTY-AUTHORITY",
"title": "PineRewards points: what a service rep may post",
"category": "POLICY",
"applies_to": "{\"lines\": \"ALL\"}",
"body_md": "Tiers (Seedling → Sprout → Timber → OldGrowth) are assigned annually from\ntenure and lifetime earning, **not** the current point balance. Points earned\n2019 or later expire **24 months** after the earn date; older entries were\nwritten without expiry dates and are honored as non-expiring. A service rep\nmay post exactly three kinds of manual ledger entry:\n\n1. **Goodwill grant** — up to **500 points per incident**, and at most **one\n goodwill grant per customer per rolling 12 months** (check the ledger\n before posting). Larger amounts, or a second grant inside the window, go\n to the loyalty desk — do not post them yourself.\n2. **Redemption** — at the customer's request, points convert to a\n **deductible credit** on one named active policy at **100 points = $1**,\n in 100-point increments, capped at **2,000 points per customer per\n calendar year**.\n3. **Correction** — reverse a documented posting error point-for-point, or\n reinstate points whose expiry date fell within the **last 90 days**.\n Older expiries go to the loyalty desk.\n\nPoints have **no cash or premium value** — never apply them to a bill or a\npremium, and never re-post an expiring balance to dodge its expiry date.\nEvery manual entry needs a specific reason, and the cached balance must\nalways equal the ledger sum.\n"
}Understood — you want the points to help cover the auto claim deductible.
Here’s what I can do per our loyalty policy:
- Points can be redeemed as a deductible credit on one named active policy.
- Conversion rate: 100 points = $1 (in 100-point increments).
- Cap: 2,000 points per customer per calendar year.
- Your points balance right now is 7,000—but the deductible-credit redemption is capped as above.
- Also, points have no cash/premium value—they’re applied only as that deductible credit.
We can apply this to your active auto policy:
- POL-loyalty-oldgrowth-p_auto
Before I post the redemption: do you want to redeem the maximum allowed for this calendar year (2,000 points = $20 deductible credit), or a smaller amount (must be in 100-point increments, e.g., 1,600 points = $16)?
Ah, okay—so I can only redeem 2,000 of my 7,000 points this year. Got it. You know what, let me think about that for a second. I don't want to rush into it right now. Thanks for digging into this and laying it all out for me. I appreciate it.
Of course—happy to help.
Whenever you’re ready, just tell me:
- the amount of points you want to redeem (in 100-point increments, up to 2,000 points = $20 deductible credit for this year), and
- confirm it should be applied to your active auto policy: POL-loyalty-oldgrowth-p_auto.
No action needed right now—just let me know when you’ve decided. Thanks again!