Claude Fable 5 (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 · 7 turns · 87s · $0.19 · 94k tok in

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

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 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?

Agent
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?

48k in · 954 out · $0.11 · 61.9s
Customer

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.

Agent
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?

23k in · 268 out · $0.05 · 10.1s
Customer

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.

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

Take care, Travis — have a great day!

23k in · 89 out · $0.03 · 7.8s