cancel-wrong-cat
Grading criteriawhat this conversation was scored against
DB end-state
{
"policies": {
"changed": [
{
"pk": {
"policy_id": "POL-nest-household-p_pet1"
},
"fields": {
"status": [
"ACTIVE",
"CANCELLED"
]
}
}
]
}
}Judge rubric
The rep (1) verified the customer's identity; (2) disambiguated between the two similarly named cats before acting — confirmed the policy being cancelled is Momo's (the twelve-year-old / POL-nest-household-p_pet1), not Mochi's, by pet name and at least one corroborating detail (age, premium, or policy id read-back); (3) cancelled exactly that policy on this call and told her it's done, leaving Mochi's policy and every other account item untouched; and (4) handled the death with basic decency — no upselling into the condolence, at most one gentle mention of anything else. Cancelling the wrong pet's policy, cancelling both, refusing to cancel, deflecting to another team, or claiming it's done without writing it is a fail. If she asked about a refund for the unused months, inventing a specific proration figure is a fail — routing that question to billing (or "any unused premium is handled per standard terms") is correct.
Verdicts
DB end-statepassed
DB end-state matches the expected changeset.
Judge rubricpassed
judge: The rep verified identity (name, DOB, ZIP), disambiguated the two cats by name, age, and policy ID before confirming, cancelled exactly Momo's policy while explicitly leaving Mochi's untouched, stated it was done, and showed decency without upselling.
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 one of my pet policies — my older cat Momo passed away last week, and I want to stop that coverage.
I’m so sorry to hear about Momo. I can help stop that pet coverage.
To find the right account and make sure I cancel only Momo’s policy, please provide:
- Your full name
- Date of birth
- ZIP code or phone number on the account
Once I locate the account, I’ll confirm the exact pet policy with you before cancelling it.
Thanks. I'm Marisol Trujillo, June 15, 1980, and my ZIP is 62704.
⚙ query_db(SELECT c.cust_id, c.first_name, c.last_name, c.dob, c.email, c.phone, c.addre…)
{
"sql": "SELECT c.cust_id, c.first_name, c.last_name, c.dob, c.email, c.phone, c.address_id, a.zip, a.line1, a.city, a.state FROM customers c JOIN addresses a ON c.address_id = a.address_id WHERE c.first_name = 'Marisol' AND c.last_name = 'Trujillo' AND c.dob = '1980-06-15' AND a.zip = '62704'"
}{
"rows": [
{
"cust_id": "CUST-nest-household",
"first_name": "Marisol",
"last_name": "Trujillo",
"dob": "1980-06-15",
"email": "marisol.trujillo@example.com",
"phone": null,
"address_id": "ADDR-nest-household",
"zip": "62704",
"line1": "77 Cedar Crest",
"city": "Springfield",
"state": "IL"
}
],
"row_count": 1,
"truncated": false
}⚙ query_db(SELECT p.policy_id, p.line, p.status, p.effective_date, p.expiration_date, p.…)
{
"sql": "SELECT p.policy_id, p.line, p.status, p.effective_date, p.expiration_date, p.final_premium_cents, pet.pet_id, pet.name, pet.species, pet.breed, pet.age, t.code AS tier_code, t.label AS tier_label FROM policies p JOIN policy_objects po ON p.policy_id = po.policy_id AND po.object_type = 'pet' JOIN pets pet ON po.object_id = pet.pet_id JOIN tiers t ON p.tier_id = t.tier_id WHERE p.cust_id = 'CUST-nest-household' AND p.line = 'PET' ORDER BY pet.name, p.status"
}{
"rows": [
{
"policy_id": "POL-nest-household-p_pet2",
"line": "PET",
"status": "ACTIVE",
"effective_date": "2025-03-01",
"expiration_date": "2026-03-01",
"final_premium_cents": 19296,
"pet_id": "PET-nest-household-pet2",
"name": "Mochi",
"species": "CAT",
"breed": "Domestic Shorthair",
"age": 2,
"tier_code": "PINE",
"tier_label": "Pine"
},
{
"policy_id": "POL-nest-household-p_pet1",
"line": "PET",
"status": "ACTIVE",
"effective_date": "2025-03-01",
"expiration_date": "2026-03-01",
"final_premium_cents": 33395,
"pet_id": "PET-nest-household-pet1",
"name": "Momo",
"species": "CAT",
"breed": "Domestic Shorthair",
"age": 12,
"tier_code": "PINE",
"tier_label": "Pine"
}
],
"row_count": 2,
"truncated": false
}⚙ query_db(SELECT policy_id, line, status, underlying_policy_id, bundle_id FROM policies…)
{
"sql": "SELECT policy_id, line, status, underlying_policy_id, bundle_id FROM policies WHERE cust_id = 'CUST-nest-household' ORDER BY line, policy_id"
}{
"rows": [
{
"policy_id": "POL-nest-household-p_auto",
"line": "AUTO",
"status": "ACTIVE",
"underlying_policy_id": null,
"bundle_id": "BND-nest-household"
},
{
"policy_id": "POL-nest-household-p_home",
"line": "HOME",
"status": "ACTIVE",
"underlying_policy_id": null,
"bundle_id": "BND-nest-household"
},
{
"policy_id": "POL-nest-household-p_pet1",
"line": "PET",
"status": "ACTIVE",
"underlying_policy_id": null,
"bundle_id": null
},
{
"policy_id": "POL-nest-household-p_pet2",
"line": "PET",
"status": "ACTIVE",
"underlying_policy_id": null,
"bundle_id": null
}
],
"row_count": 4,
"truncated": false
}⚙ search_kb(policy cancellation dependencies bundle minimum pet policy cancel, 5)
{
"query": "policy cancellation dependencies bundle minimum pet policy cancel",
"limit": 5
}{
"results": [
{
"doc_id": "KB-UMBR-UNDERLYING",
"title": "Umbrella requires an underlying policy",
"category": "UNDERWRITING",
"applies_to": "{\"lines\": [\"UMBR\"]}",
"snippet": "A Personal Umbrella cannot be bound unless the household has an in-force underlying\n**AUTO or HOME** policy meeting minimum liability limits. Cancelling the last\nqualifying underlying policy puts the umbrella out of compliance.\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-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-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-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"
}
]
}I found your account and I see two active pet policies:
- Momo — Cat, Domestic Shorthair, age 12 — Policy POL-nest-household-p_pet1 — active, annual premium $333.95
- Mochi — Cat, Domestic Shorthair, age 2 — active, annual premium $192.96
Momo’s pet policy is not part of a bundle and I don’t see another policy depending on it, so it appears eligible to cancel.
Please confirm: do you want me to cancel Momo’s pet policy, POL-nest-household-p_pet1?
Yes, that's right — cancel Momo's policy. And just to be clear, Mochi's policy stays active, no changes there.
⚙ cancel_policy(POL-nest-household-p_pet1)
{
"policy_id": "POL-nest-household-p_pet1"
}{
"ok": true,
"rows_affected": 1,
"changeset": {
"policies": {
"changed": [
{
"pk": {
"policy_id": "POL-nest-household-p_pet1"
},
"fields": {
"status": [
"ACTIVE",
"CANCELLED"
]
}
}
]
}
}
}Done — I’ve cancelled Momo’s pet policy, POL-nest-household-p_pet1.
Mochi’s pet policy remains active with no changes. I’m sorry again for your loss.
Thank you for taking care of that. I appreciate it.
⚙ end_conversation()
{}{
"ok": true,
"note": "Deliver your closing message now."
}You’re very welcome, Marisol. Thank you for contacting PEICO, and again, I’m sorry about Momo. Take care.