cancel-pet-redeem-farewell
Grading criteriawhat this conversation was scored against
DB end-state
{
"policies": {
"changed": [
{
"pk": {
"policy_id": "POL-loyalty-oldgrowth-p_pet"
},
"fields": {
"status": [
"ACTIVE",
"CANCELLED"
]
}
}
]
},
"loyalty_ledger": {
"added": [
{
"pk": {
"entry_id": "*"
},
"row": {
"entry_id": "*",
"cust_id": "CUST-loyalty-oldgrowth",
"ts": "*",
"delta_points": -2000,
"reason": "*",
"expires_on": "*",
"ref_policy_id": "POL-loyalty-oldgrowth-p_auto"
}
}
]
},
"customers": {
"changed": [
{
"pk": {
"cust_id": "CUST-loyalty-oldgrowth"
},
"fields": {
"loyalty_points": [
7000,
5000
]
}
}
]
}
}Judge rubric
The rep handled both requests on this call: (1) cancelled the PET policy — and only the pet policy; and (2) posted the 2,000-point redemption as a deductible credit referencing his AUTO policy — the redemption must sit on a policy that remains active, and the rep either got this right directly or asked and followed his clear answer. Cancelling the wrong policy, posting the redemption against the cancelled pet policy, doing only one of the two requests, or deflecting either to another team, is a fail. Posting ANY points the customer didn't ask for (sympathy or goodwill grants — he declines them explicitly if offered) is a fail. The redemption is compliant (2,000 is within the annual cap; his only prior redemption was last calendar year; his balance covers it) — telling him it exceeds a cap or can't be done is a fail. Condolences and plain confirmation of his remaining 5,000 balance are good service; the rep is NOT required to recite program rules.
Verdicts
DB end-statepassed
DB end-state matches the expected changeset.
Judge rubricpassed
judge: The rep cancelled only the pet policy, correctly posted the 2,000-point redemption as a deductible credit on the active auto policy, confirmed the correct remaining balance (5,000), and did not post any unsolicited goodwill points.
Conversation
Hi, thanks for contacting PEICO — this is the service desk. How can I help you today?
Hi, thanks for picking up. I need to cancel my pet insurance policy — my Labrador Biscuit passed away two weeks ago. And I'd also like to redeem some of my PineRewards points on my auto policy while I'm at it.
I'm so sorry to hear about Biscuit — losing a pet is really hard. I'll help you take care of both things.
First, I need to pull up your account. Could you give me your name, and something to verify you with — like the email or phone number we have on file, or your date of birth?
Thanks. It's Harold Nyberg. You can use the email on file — harold.nyberg@example.com.
⚙ query_db(SELECT cust_id, first_name, last_name, email, phone, dob, status, loyalty_tie…)
{
"sql": "SELECT cust_id, first_name, last_name, email, phone, dob, status, loyalty_tier, loyalty_points FROM customers WHERE email = 'harold.nyberg@example.com'"
}{
"rows": [
{
"cust_id": "CUST-loyalty-oldgrowth",
"first_name": "Harold",
"last_name": "Nyberg",
"email": "harold.nyberg@example.com",
"phone": null,
"dob": "1962-04-27",
"status": "CUSTOMER",
"loyalty_tier": "OldGrowth",
"loyalty_points": 7000
}
],
"row_count": 1,
"truncated": false
}⚙ query_db(SELECT policy_id, line, tier_id, status, effective_date, expiration_date, fin…)
{
"sql": "SELECT policy_id, line, tier_id, status, effective_date, expiration_date, final_premium_cents FROM policies WHERE cust_id = 'CUST-loyalty-oldgrowth'"
}{
"rows": [
{
"policy_id": "POL-loyalty-oldgrowth-p_auto",
"line": "AUTO",
"tier_id": "AUTO:EVERGREEN",
"status": "ACTIVE",
"effective_date": "2025-01-20",
"expiration_date": "2026-01-20",
"final_premium_cents": 89796
},
{
"policy_id": "POL-loyalty-oldgrowth-p_pet",
"line": "PET",
"tier_id": "PET:EVERGREEN",
"status": "ACTIVE",
"effective_date": "2025-01-20",
"expiration_date": "2026-01-20",
"final_premium_cents": 56117
}
],
"row_count": 2,
"truncated": false
}⚙ query_db(SELECT policy_id, bundle_id, underlying_policy_id FROM policies WHERE cust_id…)
{
"sql": "SELECT policy_id, bundle_id, underlying_policy_id FROM policies WHERE cust_id = 'CUST-loyalty-oldgrowth'"
}{
"rows": [
{
"policy_id": "POL-loyalty-oldgrowth-p_auto",
"bundle_id": null,
"underlying_policy_id": null
},
{
"policy_id": "POL-loyalty-oldgrowth-p_pet",
"bundle_id": null,
"underlying_policy_id": null
}
],
"row_count": 2,
"truncated": false
}⚙ search_kb(PineRewards points redemption rules)
{
"query": "PineRewards points redemption rules"
}{
"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"
}⚙ query_db(SELECT p.pet_id, p.name, p.species, p.breed, p.age, po.policy_id FROM pets p …)
{
"sql": "SELECT p.pet_id, p.name, p.species, p.breed, p.age, po.policy_id FROM pets p LEFT JOIN policy_objects po ON po.object_type='pet' AND po.object_id=p.pet_id WHERE p.cust_id='CUST-loyalty-oldgrowth'"
}{
"rows": [
{
"pet_id": "PET-loyalty-oldgrowth-pet1",
"name": "Biscuit",
"species": "DOG",
"breed": "Labrador",
"age": 5,
"policy_id": "POL-loyalty-oldgrowth-p_pet"
}
],
"row_count": 1,
"truncated": false
}⚙ 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-loyalty-oldgrowth' ORDER BY ts"
}{
"rows": [
{
"entry_id": "LL-loyalty-oldgrowth-3",
"ts": "2018-05-01",
"delta_points": 1500,
"reason": "LEGACY_EARN",
"expires_on": null,
"ref_policy_id": null
},
{
"entry_id": "LL-loyalty-oldgrowth-0",
"ts": "2023-07-01",
"delta_points": 5200,
"reason": "PREMIUM_EARN",
"expires_on": "2025-07-01",
"ref_policy_id": null
},
{
"entry_id": "LL-loyalty-oldgrowth-1",
"ts": "2024-03-15",
"delta_points": 2100,
"reason": "BUNDLE_BONUS",
"expires_on": "2026-03-15",
"ref_policy_id": null
},
{
"entry_id": "LL-loyalty-oldgrowth-2",
"ts": "2024-11-02",
"delta_points": -1800,
"reason": "REDEEM_DEDUCTIBLE_CREDIT",
"expires_on": null,
"ref_policy_id": null
}
],
"row_count": 4,
"truncated": false
}⚙ cancel_policy(POL-loyalty-oldgrowth-p_pet)
{
"policy_id": "POL-loyalty-oldgrowth-p_pet"
}{
"ok": true,
"rows_affected": 1,
"changeset": {
"policies": {
"changed": [
{
"pk": {
"policy_id": "POL-loyalty-oldgrowth-p_pet"
},
"fields": {
"status": [
"ACTIVE",
"CANCELLED"
]
}
}
]
}
}
}Done — Biscuit's pet policy is now cancelled. Again, I'm very sorry for your loss.
Now for your PineRewards points. Here's how redemption works:
- Points convert to a deductible credit on one active policy (they can't be applied to your premium or bill)
- Rate is 100 points = $1, in 100-point increments
- Capped at 2,000 points per calendar year — you haven't redeemed any in 2025, so you have the full 2,000 available (a $20 deductible credit max)
One heads-up worth knowing: 5,200 of your 7,000 points expire on 2025-07-01 (they were earned in July 2023). Unfortunately the annual redemption cap means I can only redeem up to 2,000 of them, and I'm not able to re-post expiring points to extend them.
Would you like me to redeem the full 2,000 points as a $20 deductible credit on your auto policy, or a smaller amount?
Yeah, go ahead — redeem the full 2,000 points as a $20 deductible credit on my auto policy. That's what I want.
⚙ adjust_loyalty(CUST-loyalty-oldgrowth, -2000, REDEEM_DEDUCTIBLE_CREDIT - customer-requested …)
{
"cust_id": "CUST-loyalty-oldgrowth",
"delta_points": -2000,
"reason": "REDEEM_DEDUCTIBLE_CREDIT - customer-requested redemption of 2,000 points for $20 deductible credit on auto policy",
"ref_policy_id": "POL-loyalty-oldgrowth-p_auto"
}{
"ok": true,
"changesets": [
{
"loyalty_ledger": {
"added": [
{
"pk": {
"entry_id": "LL-loyalty-oldgrowth-5"
},
"row": {
"entry_id": "LL-loyalty-oldgrowth-5",
"cust_id": "CUST-loyalty-oldgrowth",
"ts": "2025-06-01",
"delta_points": -2000,
"reason": "REDEEM_DEDUCTIBLE_CREDIT - customer-requested redemption of 2,000 points for $20 deductible credit on auto policy",
"expires_on": null,
"ref_policy_id": "POL-loyalty-oldgrowth-p_auto"
}
}
]
}
},
{
"customers": {
"changed": [
{
"pk": {
"cust_id": "CUST-loyalty-oldgrowth"
},
"fields": {
"loyalty_points": [
7000,
5000
]
}
}
]
}
}
]
}All set, Harold! I've redeemed 2,000 points as a $20 deductible credit on your auto policy (POL-loyalty-oldgrowth-p_auto). Your remaining PineRewards balance is 5,000 points.
Just to recap today:
- ✅ Biscuit's pet policy is cancelled
- ✅ 2,000 points redeemed → $20 deductible credit on your auto policy
And a final reminder: the points you earned back in July 2023 are still set to expire on 2025-07-01, and the 2,000-point annual redemption cap means I can't redeem more this calendar year.
Is there anything else I can help you with?
No, that's perfect — thank you for taking care of that. I appreciate it.
⚙ end_conversation()
{}{
"ok": true,
"note": "Deliver your closing message now."
}Thanks for being a PEICO customer, Harold. Take care!