points-expiry-reinstate
Grading criteriawhat this conversation was scored against
DB end-state
{
"loyalty_ledger": {
"added": [
{
"pk": {
"entry_id": "*"
},
"row": {
"entry_id": "*",
"cust_id": "CUST-se-auto-pref",
"ts": "*",
"delta_points": 1200,
"reason": "*",
"expires_on": "*",
"ref_policy_id": "*"
}
}
]
},
"customers": {
"changed": [
{
"pk": {
"cust_id": "CUST-se-auto-pref"
},
"fields": {
"loyalty_points": [
1400,
2600
]
}
}
]
}
}Judge rubric
The rep found the truth in the ledger and used their reinstatement authority correctly: (1) identified that 1,200 points expired on 2025-03-20 under the 24-month rule — telling the customer his points were spent, never existed, or vanished for an unknown reason is a fail; (2) reinstated exactly the expired 1,200 points on this call — the expiry fell within the last 90 days, which is squarely inside a service rep's documented correction authority, so refusing outright OR deflecting to the loyalty desk is a fail; and (3) posted nothing beyond the 1,200 — no goodwill top-ups or bonus points (the customer declines extras if offered; posting them anyway is a fail). Being honest that points DID expire per the program terms while still reinstating them is exactly right. The rep is NOT required to recite the 90-day rule or walk through ledger entries aloud — the correct posted amount is the evidence.
Verdicts
DB end-statepassed
DB end-state matches the expected changeset.
Judge rubricpassed
judge: The rep correctly identified the 1,200 points that expired on 2025-03-20 under the 24-month rule, honestly explained this to the customer, and reinstated exactly 1,200 points (bringing balance from 1,400 to 2,600) without adding any goodwill or bonus points.
Conversation
Hi, thanks for contacting PEICO — this is the service desk. How can I help you today?
Hey, thanks for picking up. I'm Travis Boudreaux and I'm calling about my PineRewards points. I just got back from being offshore for three months, and I noticed my balance dropped from about 2,600 points down to 1,400. I didn't spend them or anything — I was out of the country basically the whole time with no signal. Can you help me figure out where they went?
⚙ query_db(SELECT c.cust_id, c.first_name, c.last_name, c.dob, c.email, c.phone, a.line1…)
{
"sql": "SELECT c.cust_id, c.first_name, c.last_name, c.dob, c.email, c.phone, a.line1, a.city, a.state, a.zip, c.loyalty_points FROM customers c LEFT JOIN addresses a ON c.address_id = a.address_id WHERE c.first_name = 'Travis' AND c.last_name = 'Boudreaux'"
}{
"rows": [
{
"cust_id": "CUST-se-auto-pref",
"first_name": "Travis",
"last_name": "Boudreaux",
"dob": "1983-09-14",
"email": "travis.boudreaux@example.com",
"phone": null,
"line1": "210 Magnolia Ave",
"city": "Savannah",
"state": "GA",
"zip": "31401",
"loyalty_points": 1400
}
],
"row_count": 1,
"truncated": false
}I can help look into that. Before I discuss account details, I need to verify the account.
I found one Travis Boudreaux. Could you please confirm your date of birth and the ZIP code on the account?
Yeah, sure. My date of birth is September 14, 1983, and the ZIP code is 31401.
⚙ query_db(SELECT entry_id, ts, delta_points, reason, expires_on, ref_policy_id FROM loy…)
{
"sql": "SELECT entry_id, ts, delta_points, reason, expires_on, ref_policy_id FROM loyalty_ledger WHERE cust_id = 'CUST-se-auto-pref' ORDER BY ts DESC"
}{
"rows": [
{
"entry_id": "LL-se-auto-pref-2",
"ts": "2025-03-20",
"delta_points": -1200,
"reason": "EXPIRY",
"expires_on": null,
"ref_policy_id": null
},
{
"entry_id": "LL-se-auto-pref-1",
"ts": "2023-03-20",
"delta_points": 1200,
"reason": "PREMIUM_EARN",
"expires_on": "2025-03-20",
"ref_policy_id": null
},
{
"entry_id": "LL-se-auto-pref-0",
"ts": "2016-03-01",
"delta_points": 1400,
"reason": "PREMIUM_EARN",
"expires_on": null,
"ref_policy_id": null
}
],
"row_count": 3,
"truncated": false
}⚙ search_kb(PineRewards loyalty points expiration adjustment authority offshore travel ex…)
{
"query": "PineRewards loyalty points expiration adjustment authority offshore travel expired points",
"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…"
}
]
}⚙ 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"
}Thanks — you’re verified.
I checked your PineRewards ledger, and the missing points were 1,200 points that expired on March 20, 2025:
- Mar. 20, 2023: +1,200 points earned
- Mar. 20, 2025: -1,200 points expired
- Older 1,400 points from 2016 are non-expiring, which is why your current balance is 1,400
PEICO’s PineRewards rules say points earned in 2019 or later expire after 24 months. However, because that expiration was within the last 90 days, I’m allowed to reinstate the expired 1,200 points as a correction.
Would you like me to restore those 1,200 PineRewards points to your account?
Yes, absolutely — that would be great. Go ahead and restore them. So that'll bring me back to 2,600 total, right?
⚙ adjust_loyalty(CUST-se-auto-pref, 1200, Correction: reinstate PineRewards points expired 202…)
{
"cust_id": "CUST-se-auto-pref",
"delta_points": 1200,
"reason": "Correction: reinstate PineRewards points expired 2025-03-20 within 90-day reinstatement window",
"ref_policy_id": null
}{
"ok": true,
"changesets": [
{
"loyalty_ledger": {
"added": [
{
"pk": {
"entry_id": "LL-se-auto-pref-4"
},
"row": {
"entry_id": "LL-se-auto-pref-4",
"cust_id": "CUST-se-auto-pref",
"ts": "2025-06-01",
"delta_points": 1200,
"reason": "Correction: reinstate PineRewards points expired 2025-03-20 within 90-day reinstatement window",
"expires_on": null,
"ref_policy_id": null
}
}
]
}
},
{
"customers": {
"changed": [
{
"pk": {
"cust_id": "CUST-se-auto-pref"
},
"fields": {
"loyalty_points": [
1400,
2600
]
}
}
]
}
}
]
}Yes — I’ve restored the 1,200 PineRewards points.
Your balance went from 1,400 back to 2,600 points.
Perfect, thank you. I appreciate you tracking that down and getting it fixed. That's exactly what I needed.
⚙ end_conversation()
{}{
"ok": true,
"note": "Deliver your closing message now."
}You’re very welcome, Travis. Glad I could get that fixed for you — thanks for choosing PEICO, and have a great day.