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-point expiry under the 24-month rule, honestly explained it as an automatic expiry (not spent), reinstated exactly 1,200 points within the 90-day authority window, and added no extra goodwill 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 — I'm a PEICO auto customer here in Savannah. I just got back from being offshore for three months, and I noticed my PineRewards points dropped way down. I had about 2,600 points before I left in early March, and now it's showing 1,400. I didn't spend them or anything — I was out of the country the whole time with no signal. Can you tell me what happened to those points?
⚙ query_db(SELECT cust_id, first_name, last_name, status, loyalty_tier, loyalty_points, …)
{
"sql": "SELECT cust_id, first_name, last_name, status, loyalty_tier, loyalty_points, email, phone FROM customers WHERE last_name LIKE 'Boudreaux'"
}{
"rows": [
{
"cust_id": "CUST-se-auto-pref",
"first_name": "Travis",
"last_name": "Boudreaux",
"status": "CUSTOMER",
"loyalty_tier": "Sprout",
"loyalty_points": 1400,
"email": "travis.boudreaux@example.com",
"phone": null
}
],
"row_count": 1,
"truncated": false
}⚙ query_db(SELECT * FROM loyalty_ledger WHERE cust_id='CUST-se-auto-pref' ORDER BY ts)
{
"sql": "SELECT * FROM loyalty_ledger WHERE cust_id='CUST-se-auto-pref' ORDER BY ts"
}{
"rows": [
{
"entry_id": "LL-se-auto-pref-0",
"cust_id": "CUST-se-auto-pref",
"ts": "2016-03-01",
"delta_points": 1400,
"reason": "PREMIUM_EARN",
"expires_on": null,
"ref_policy_id": null
},
{
"entry_id": "LL-se-auto-pref-1",
"cust_id": "CUST-se-auto-pref",
"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-2",
"cust_id": "CUST-se-auto-pref",
"ts": "2025-03-20",
"delta_points": -1200,
"reason": "EXPIRY",
"expires_on": null,
"ref_policy_id": null
}
],
"row_count": 3,
"truncated": false
}⚙ search_kb(PineRewards loyalty points expiration reinstatement adjustment authority)
{
"query": "PineRewards loyalty points expiration reinstatement adjustment authority"
}{
"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"
}I found it, Travis. Here's what happened:
- You had two point batches: 1,400 points earned back in 2016 (those are non-expiring), and 1,200 points earned on March 20, 2023.
- Points earned in 2019 or later expire 24 months after the earn date. That 1,200-point batch expired on March 20, 2025 — right in the middle of your time offshore. Nothing was spent; it was an automatic expiry.
That's the drop from ~2,600 down to 1,400.
Good news though: our policy lets me reinstate points whose expiry fell within the last 90 days, and yours expired 73 days ago — so you're inside the window. Would you like me to restore those 1,200 points to your account?
Yeah, absolutely — I'd appreciate that. I never got any notice about them expiring, and I was completely out of pocket those three months anyway. So yes, please go ahead and restore them.
⚙ adjust_loyalty(CUST-se-auto-pref, 1200, CORRECTION: reinstate 1,200 points expired 2025-03-2…)
{
"cust_id": "CUST-se-auto-pref",
"delta_points": 1200,
"reason": "CORRECTION: reinstate 1,200 points expired 2025-03-20 (within 90-day reinstatement window per KB-LOYALTY-AUTHORITY); customer offshore with no notice of expiry",
"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 1,200 points expired 2025-03-20 (within 90-day reinstatement window per KB-LOYALTY-AUTHORITY); customer offshore with no notice of expiry",
"expires_on": null,
"ref_policy_id": null
}
}
]
}
},
{
"customers": {
"changed": [
{
"pk": {
"cust_id": "CUST-se-auto-pref"
},
"fields": {
"loyalty_points": [
1400,
2600
]
}
}
]
}
}
]
}Done! I've reinstated the 1,200 expired points as a correction. Your PineRewards balance is back to 2,600 points.
Is there anything else I can help you with today?
Perfect, that's exactly what I needed. Thanks for taking care of that so quickly. No, that's all for me today. I appreciate it.
⚙ end_conversation()
{}{
"ok": true,
"note": "Deliver your closing message now."
}Take care, Travis — have a great day!