Claude Opus 4.8 (adaptive, high)

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.

Passedcustomer: Travis Boudreaux · 9 turns · 56s · $0.14 · 108k tok in

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, explained it honestly as an automatic expiry within the 90-day reinstatement window, and reinstated exactly 1,200 points with no extra goodwill or bonus points added.

Conversation

Agent

Hi, thanks for contacting PEICO — this is the service desk. How can I help you today?

Customer

Hey, thanks for picking up. I'm Travis Boudreaux. I'm calling about my PineRewards account — my points balance dropped way down and I'm not sure what happened. I had about 2,600 points before I left for work back in March, and now it's showing 1,400. I was offshore the whole time with no signal, so I definitely didn't spend them. Can you help me figure out where they went?

Agent
query_db(SELECT cust_id, first_name, last_name, dob, email, phone, loyalty_tier, loyal…)
{
  "sql": "SELECT cust_id, first_name, last_name, dob, email, phone, loyalty_tier, loyalty_points FROM customers WHERE last_name LIKE 'Boudreaux' AND first_name LIKE 'Travis'"
}
{
  "rows": [
    {
      "cust_id": "CUST-se-auto-pref",
      "first_name": "Travis",
      "last_name": "Boudreaux",
      "dob": "1983-09-14",
      "email": "travis.boudreaux@example.com",
      "phone": null,
      "loyalty_tier": "Sprout",
      "loyalty_points": 1400
    }
  ],
  "row_count": 1,
  "truncated": false
}

Before I can go over the details of your account, I need to verify your identity. Can you confirm your date of birth and the email address we have on file for you?

18k in · 272 out · $0.02 · 6.5s
Customer

Sure. My date of birth is September 14, 1983, and the email on file is travis.boudreaux@example.com.

Agent
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"
}
{
  "rows": [
    {
      "entry_id": "LL-se-auto-pref-0",
      "ts": "2016-03-01",
      "delta_points": 1400,
      "reason": "PREMIUM_EARN",
      "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-2",
      "ts": "2025-03-20",
      "delta_points": -1200,
      "reason": "EXPIRY",
      "expires_on": null,
      "ref_policy_id": null
    }
  ],
  "row_count": 3,
  "truncated": false
}
search_kb(loyalty points expiry PineRewards)
{
  "query": "loyalty points expiry PineRewards"
}
{
  "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 for your patience, Travis. I found exactly what happened — and it's not that anyone spent them.

Here's your points history:

  • March 2016: you earned 1,400 points. These predate our expiry rules, so they never expire.
  • March 20, 2023: you earned 1,200 points.
  • March 20, 2025: those 1,200 points expired.

Under our PineRewards rules, points earned in 2019 or later expire 24 months after the earn date. The 1,200 points from March 2023 hit their 24‑month mark on March 20, 2025 and dropped off automatically — which is why you went from ~2,600 down to 1,400. So it was an automatic expiry, not a redemption or an error.

Now, the good news: our rules let me reinstate points whose expiry fell within the last 90 days. That expiry was March 20, 2025 — about 73 days ago — so it's still within that window. I can reinstate the full 1,200 points for you if you'd like. (Note that once reinstated they'd keep their original expiry status, so they'd be current again but the same rule applies going forward.)

Would you like me to go ahead and put those 1,200 points back?

40k in · 1,822 out · $0.07 · 27.3s
Customer

Yeah, absolutely — I'd like you to reinstate them. I was out of the country that whole time with basically no way to even see a notice, so I had no idea they were about to expire. I appreciate you being able to put them back. Go ahead and do it.

Agent
adjust_loyalty(CUST-se-auto-pref, 1200, Correction: reinstate 1200 points (earned 2023-03-20…)
{
  "cust_id": "CUST-se-auto-pref",
  "delta_points": 1200,
  "reason": "Correction: reinstate 1200 points (earned 2023-03-20) that expired 2025-03-20, within the 90-day reinstatement window per KB-LOYALTY-AUTHORITY.",
  "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 1200 points (earned 2023-03-20) that expired 2025-03-20, within the 90-day reinstatement window per KB-LOYALTY-AUTHORITY.",
              "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 points. Your PineRewards balance is now back to 2,600 points.

Is there anything else I can help you with today?

25k in · 305 out · $0.03 · 10.0s
Customer

No, that's it — thanks for taking care of that. I appreciate you tracking down what happened and getting them restored. Have a good one.

Agent
end_conversation()
{}
{
  "ok": true,
  "note": "Deliver your closing message now."
}

Thanks again for reaching out to PEICO, Travis. Take care!

26k in · 91 out · $0.02 · 4.7s