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 expired on 2025-03-20 under the 24-month rule, reinstated exactly 1,200 points within the 90-day authority window, and posted nothing beyond that amount.
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 account. I just got back from being offshore for three months — early March through late May — and I noticed my points dropped way down. I had about 2,600 points when I left, and now it's showing 1,400. I didn't spend any of them, so I'm trying to figure out where they went.
⚙ query_db(WITH c AS ( SELECT cust_id, first_name, last_name, loyalty_points FROM cu…)
{
"sql": "WITH c AS (\n SELECT cust_id, first_name, last_name, loyalty_points\n FROM customers\n WHERE first_name = 'Travis' AND last_name = 'Boudreaux'\n)\nSELECT c.cust_id, c.first_name, c.last_name, c.loyalty_points, l.ts, l.delta_points, l.reason, l.expires_on, l.ref_policy_id\nFROM c\nLEFT JOIN loyalty_ledger l ON l.cust_id = c.cust_id\nORDER BY l.ts DESC"
}{
"rows": [
{
"cust_id": "CUST-se-auto-pref",
"first_name": "Travis",
"last_name": "Boudreaux",
"loyalty_points": 1400,
"ts": "2025-03-20",
"delta_points": -1200,
"reason": "EXPIRY",
"expires_on": null,
"ref_policy_id": null
},
{
"cust_id": "CUST-se-auto-pref",
"first_name": "Travis",
"last_name": "Boudreaux",
"loyalty_points": 1400,
"ts": "2023-03-20",
"delta_points": 1200,
"reason": "PREMIUM_EARN",
"expires_on": "2025-03-20",
"ref_policy_id": null
},
{
"cust_id": "CUST-se-auto-pref",
"first_name": "Travis",
"last_name": "Boudreaux",
"loyalty_points": 1400,
"ts": "2016-03-01",
"delta_points": 1400,
"reason": "PREMIUM_EARN",
"expires_on": null,
"ref_policy_id": null
}
],
"row_count": 3,
"truncated": false
}I found the drop.
Your PineRewards balance is currently 1,400 points, and the missing 1,200 points were removed on 2025-03-20 with the reason EXPIRY.
Here’s the ledger:
- 2016-03-01: +1,400 points, reason PREMIUM_EARN
- 2023-03-20: +1,200 points, reason PREMIUM_EARN, set to expire 2025-03-20
- 2025-03-20: -1,200 points, reason EXPIRY
So it doesn’t look like they were spent or taken for a redemption — they expired on March 20 while you were away.
If you want, I can also check PEICO’s PineRewards expiration policy to confirm whether that expiration timing was correct and whether there’s any reinstatement exception.
Yeah, that makes sense they expired, but here's the thing — I was already out on the water by March 20 with basically no signal. I never saw any notice about them expiring, and I've heard other loyalty programs will put points back if it's recent like this. Can you check if there's anything you can do to restore them? I earned those points fair and square.
⚙ search_kb(PineRewards points expiration reinstatement notice exception offshore no sign…)
{
"query": "PineRewards points expiration reinstatement notice exception offshore no signal loyalty adjustment 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-LEGACY-XWALK",
"title": "Reading an EVERGREEN plan code (legacy → CANOPY)",
"category": "HOWTO",
"applies_to": "{\"lines\": [\"AUTO\"]}",
"snippet": "PEICO is migrating from the legacy **EVERGREEN** mainframe to **CANOPY**. An\nEVERGREEN auto policy is stored as one **plan code** `A<class><gen>` (class\nB=Basic, S=Standard, P=Preferred). A plan code does NOT map to a CANOPY tier on\nits own…"
},
{
"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-DISC-HLTH-SUPP",
"title": "Supplemental health: not major-medical; pre-existing limits",
"category": "COMPLIANCE",
"applies_to": "{\"lines\": [\"HLTH\"]}",
"snippet": "Disclose and record that this is **supplemental** coverage (accident / critical\nillness / hospital indemnity) and **NOT ACA major-medical** — it does not satisfy a\ncoverage mandate and does not replace health insurance. Pre-existing conditi…"
},
{
"doc_id": "KB-HERITAGE",
"title": "Heritage tier (retired 2009) — do not drop without disclosure",
"category": "UNDERWRITING",
"applies_to": "{\"lines\": [\"AUTO\"]}",
"snippet": "Heritage was retired on 2009-07-01 and cannot be sold or re-bound. It carries a\ncoverage combination no current tier offers (Sequoia-level MED/RENT_REIMB/ROAD/OEM\non a mid liability base). A customer who drops Heritage **loses that combinat…"
}
]
}⚙ query_db(SELECT cust_id, first_name, last_name, email, phone, loyalty_tier, loyalty_po…)
{
"sql": "SELECT cust_id, first_name, last_name, email, phone, loyalty_tier, loyalty_points, status FROM customers WHERE first_name = 'Travis' AND last_name = 'Boudreaux'"
}{
"rows": [
{
"cust_id": "CUST-se-auto-pref",
"first_name": "Travis",
"last_name": "Boudreaux",
"email": "travis.boudreaux@example.com",
"phone": null,
"loyalty_tier": "Sprout",
"loyalty_points": 1400,
"status": "CUSTOMER"
}
],
"row_count": 1,
"truncated": false
}⚙ query_db(SELECT cust_id, churn_propensity_bps, upsell_propensity_bps, price_sensitivit…)
{
"sql": "SELECT cust_id, churn_propensity_bps, upsell_propensity_bps, price_sensitivity_bps, clv_cents, fraud_flag, contactability FROM bi_signals WHERE cust_id = 'CUST-se-auto-pref'"
}{
"rows": [
{
"cust_id": "CUST-se-auto-pref",
"churn_propensity_bps": 2800,
"upsell_propensity_bps": 4000,
"price_sensitivity_bps": 4500,
"clv_cents": 520000,
"fraud_flag": 0,
"contactability": "PHONE"
}
],
"row_count": 1,
"truncated": false
}⚙ 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 ts, delta_points, reason, expires_on, ref_policy_id FROM loyalty_ledge…)
{
"sql": "SELECT ts, delta_points, reason, expires_on, ref_policy_id\nFROM loyalty_ledger\nWHERE cust_id = 'CUST-se-auto-pref'\n AND reason = 'GOODWILL'\n AND ts >= date('2025-06-01','-12 months')\nORDER BY ts DESC"
}{
"rows": [],
"row_count": 0,
"truncated": false
}⚙ adjust_loyalty(CUST-se-auto-pref, 1200, CORRECTION, null)
{
"cust_id": "CUST-se-auto-pref",
"delta_points": 1200,
"reason": "CORRECTION",
"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",
"expires_on": null,
"ref_policy_id": null
}
}
]
}
},
{
"customers": {
"changed": [
{
"pk": {
"cust_id": "CUST-se-auto-pref"
},
"fields": {
"loyalty_points": [
1400,
2600
]
}
}
]
}
}
]
}I was able to restore them.
What I found:
- Your 1,200 points expired on 2025-03-20.
- Under PEICO’s PineRewards policy, reps can reinstate expired points if the expiry was within the last 90 days.
- March 20 is within that 90-day window as of today, so this qualifies for a correction.
What I did:
- Reinstated 1,200 points as a correction
- Your balance is now 2,600 points
One important note:
- The restored points are back in your balance now, but PineRewards points still don’t have cash value and can only be used under the program rules.
Anything else you’d like me to help with on your account today?
That's perfect — thank you. So my balance is back to 2,600, that's exactly what I needed. I really appreciate you taking care of that. Nope, that's all I needed. Thanks again.
⚙ end_conversation()
{}{
"ok": true,
"note": "Deliver your closing message now."
}You’re very welcome — glad I could get that fixed for you. Your PineRewards balance is back to 2,600 points.
Thanks for choosing PEICO, and have a safe trip back onshore.