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 and explicitly corrected the customer's mistaken 8,000 estimate, satisfying the rubric.
Conversation
Hi, thanks for contacting PEICO — this is the service desk. How can I help you today?
Hey, thanks for picking up. I'm looking to check my loyalty points balance and redeem them toward a deductible credit. I think I have around 8,000 points built up over the years.
⚙ search_kb(loyalty points deductible credit redemption rules deductible credit points ba…)
{
"query": "loyalty points deductible credit redemption rules deductible credit points balance authority",
"limit": 5
}{
"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-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-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-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"
}
]
}⚙ 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"
}⚙ query_db(SELECT cust_id, first_name, last_name, loyalty_points, email, phone FROM cust…)
{
"sql": "SELECT cust_id, first_name, last_name, loyalty_points, email, phone FROM customers WHERE first_name LIKE '%'+'' LIMIT 1"
}{
"rows": [],
"row_count": 0,
"truncated": false
}I can help with that. I do need to verify which account is yours before I can look up your balance or redeem points.
Please send any two of these:
- full name
- email on file
- phone on file
- date of birth
- legacy account number
Also, for the deductible credit: PEICO points redeem at 100 points = $1, in 100-point increments, and redemptions are capped at 2,000 points per customer per calendar year. Once I verify you, I can check your current available balance and how much of that cap you’ve already used this year.
Got it. I'm Harold Nyberg, and my date of birth is April 27, 1962. That should do it for verification, right?
⚙ query_db(SELECT cust_id, first_name, last_name, dob, loyalty_points, legacy_acct, emai…)
{
"sql": "SELECT cust_id, first_name, last_name, dob, loyalty_points, legacy_acct, email, phone FROM customers WHERE first_name = 'Harold' AND last_name = 'Nyberg' AND dob = '1962-04-27'"
}{
"rows": [
{
"cust_id": "CUST-loyalty-oldgrowth",
"first_name": "Harold",
"last_name": "Nyberg",
"dob": "1962-04-27",
"loyalty_points": 7000,
"legacy_acct": "EVG7782M3",
"email": "harold.nyberg@example.com",
"phone": null
}
],
"row_count": 1,
"truncated": false
}⚙ query_db(WITH ytd AS ( SELECT COALESCE(SUM(-delta_points),0) AS redeemed_points_ytd FR…)
{
"sql": "WITH ytd AS ( SELECT COALESCE(SUM(-delta_points),0) AS redeemed_points_ytd FROM loyalty_ledger WHERE cust_id = 'CUST-loyalty-oldgrowth' AND delta_points < 0 AND reason LIKE 'Redemption%' AND ts >= '2025-01-01' AND ts < '2026-01-01' ), active_pols AS ( SELECT p.policy_id, p.line, p.status, p.effective_date, p.expiration_date FROM policies p WHERE p.cust_id = 'CUST-loyalty-oldgrowth' AND p.status = 'ACTIVE' ) SELECT c.loyalty_points, ytd.redeemed_points_ytd, ap.policy_id, ap.line, ap.effective_date, ap.expiration_date FROM customers c CROSS JOIN ytd LEFT JOIN active_pols ap ON 1=1 WHERE c.cust_id = 'CUST-loyalty-oldgrowth'"
}{
"rows": [
{
"loyalty_points": 7000,
"redeemed_points_ytd": 0,
"policy_id": "POL-loyalty-oldgrowth-p_auto",
"line": "AUTO",
"effective_date": "2025-01-20",
"expiration_date": "2026-01-20"
},
{
"loyalty_points": 7000,
"redeemed_points_ytd": 0,
"policy_id": "POL-loyalty-oldgrowth-p_pet",
"line": "PET",
"effective_date": "2025-01-20",
"expiration_date": "2026-01-20"
}
],
"row_count": 2,
"truncated": false
}Yes — that was enough. I found your account.
Your current PineRewards balance is 7,000 points.
A couple of important notes:
- That’s a little lower than the ~8,000 you estimated.
- You have redeemed 0 points so far in 2025.
- The annual redemption cap is 2,000 points, so the most you can redeem toward a deductible credit right now is 2,000 points = $20.
- You have two active policies eligible to be named for the credit:
- AUTO policy
POL-loyalty-oldgrowth-p_auto - PET policy
POL-loyalty-oldgrowth-p_pet
- AUTO policy
If you want to proceed, tell me:
- which active policy you want the deductible credit applied to, and
- how many points you want to redeem, in 100-point increments, up to 2,000.
Okay, thanks for checking that. Yeah, 7,000 sounds right — I was going off memory. And I didn't realize there was an annual cap like that. Let me think about this for a second before I commit to redeeming anything right now. I appreciate you laying out all the details though. Thanks for your help today.
⚙ end_conversation()
{}{
"ok": true,
"note": "Deliver your closing message now."
}You’re very welcome. Your current balance is 7,000 points, and if you decide later, you can redeem up to 2,000 points this calendar year for a deductible credit on one active policy.
Thanks for choosing PEICO, Harold. Have a great day.