new-roof-reprice
Grading criteriawhat this conversation was scored against
DB end-state
{
"dwellings": {
"changed": [
{
"pk": {
"dwelling_id": "DWL-fl-coastal-home-d1"
},
"fields": {
"roof_age": [
6,
0
]
}
}
]
},
"policies": {
"changed": [
{
"pk": {
"policy_id": "POL-fl-coastal-home-p_home"
},
"fields": {
"base_premium_cents": [
574173,
529408
],
"final_premium_cents": [
526797,
485546
],
"premium_breakdown": [
"*",
"*"
]
},
"may_change": {
"rating_as_of": [
"*",
"*"
]
}
}
]
}
}Judge rubric
The rep (1) updated the dwelling record to reflect the brand-new roof (roof age zero); (2) repriced the policy through the rating engine and told her the real outcome: a new premium of about $4,855.46/yr and/or savings of about $412.51/yr off her current $5,267.97 (small rounding or nearby phrasing is fine); and (3) did it on this call. Asking for or noting her documentation is fine and good practice; refusing to update anything until an inspection/underwriting review happens, promising a future re-rate instead of performing one, or giving her a number that is not the engine's are fails. Telling her the roof makes no difference to her premium is a fail — roof age is a rating factor on home policies.
Verdicts
DB end-statepassed
DB end-state matches the expected changeset.
Judge rubricpassed
judge: The rep updated the roof age to 0, repriced through the engine giving the exact matching figures ($4,855.46 new premium, $412.51 savings from $5,267.97), and completed this on the call.
Conversation
Hi, thanks for contacting PEICO — this is the service desk. How can I help you today?
Hi there! I just had my roof completely replaced last week, and my roofer said PEICO gives good credits for a new roof in Florida. I need to get my policy updated to show the new roof and find out what my premium is now.
I can help with that. First I’ll need to locate your account and verify I’m looking at the right policy. Please provide your full name and either your policy number or the email/phone number on file. I can help with that. First I’ll need to locate your account and verify I’m looking at the right policy. Please provide your full name and either your policy number or the email/phone number on file.
My name is Gloria Esposito, and the email on file is gloria.esposito@example.com.
⚙ query_db(SELECT c.cust_id, c.first_name, c.last_name, c.email, c.phone, c.dob, c.addre…)
{
"sql": "SELECT c.cust_id, c.first_name, c.last_name, c.email, c.phone, c.dob, c.address_id, a.state, a.city FROM customers c LEFT JOIN addresses a ON a.address_id = c.address_id WHERE c.first_name = 'Gloria' AND c.last_name = 'Esposito' AND c.email = 'gloria.esposito@example.com'"
}{
"rows": [
{
"cust_id": "CUST-fl-coastal-home",
"first_name": "Gloria",
"last_name": "Esposito",
"email": "gloria.esposito@example.com",
"phone": null,
"dob": "1969-07-19",
"address_id": "ADDR-fl-coastal-home",
"state": "FL",
"city": "Naples"
}
],
"row_count": 1,
"truncated": false
}Thanks, Gloria — I found a matching customer in Naples, Florida.
To verify I’m speaking with the right person, please confirm your date of birth. I have July 19, 1969 on file.
Yes, that's correct — July 19, 1969.
⚙ query_db(WITH cust AS (SELECT 'CUST-fl-coastal-home' AS cust_id) SELECT p.policy_id, p…)
{
"sql": "WITH cust AS (SELECT 'CUST-fl-coastal-home' AS cust_id) SELECT p.policy_id, p.line, p.status, p.effective_date, p.expiration_date, p.term_months, p.tier_id, p.final_premium_cents, p.rating_as_of, d.dwelling_id, d.roof_age, d.year_built, d.replacement_cost_cents, d.protection_class, d.dist_to_coast_mi, a.state, a.city FROM policies p JOIN policy_objects po ON po.policy_id = p.policy_id AND po.object_type = 'dwelling' JOIN dwellings d ON d.dwelling_id = po.object_id JOIN customers c ON c.cust_id = p.cust_id LEFT JOIN addresses a ON a.address_id = c.address_id WHERE p.cust_id = (SELECT cust_id FROM cust) AND p.line = 'HOME' AND p.status = 'ACTIVE'"
}{
"rows": [
{
"policy_id": "POL-fl-coastal-home-p_home",
"line": "HOME",
"status": "ACTIVE",
"effective_date": "2025-04-01",
"expiration_date": "2026-04-01",
"term_months": 12,
"tier_id": "HOME:SEQUOIA",
"final_premium_cents": 526797,
"rating_as_of": "2025-04-01",
"dwelling_id": "DWL-fl-coastal-home-d1",
"roof_age": 6,
"year_built": 1998,
"replacement_cost_cents": 52000000,
"protection_class": 5,
"dist_to_coast_mi": 2,
"state": "FL",
"city": "Naples"
}
],
"row_count": 1,
"truncated": false
}⚙ search_kb(Florida home new roof credit roof age underwriting roof replacement updated d…)
{
"query": "Florida home new roof credit roof age underwriting roof replacement updated dwelling facts reprice",
"limit": 5
}{
"results": [
{
"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…"
},
{
"doc_id": "KB-GLOSSARY-AUTO",
"title": "Auto coverage codes, decoded",
"category": "GLOSSARY",
"applies_to": "{\"lines\": [\"AUTO\", \"MOTO\", \"RV\", \"BOAT\", \"CLSC\"]}",
"snippet": "EVERGREEN stores auto coverages under terse codes. Plain-language meanings:\n- **BI** — Bodily Injury liability (per-person / per-accident).\n- **PD** — Property Damage liability.\n- **UM/UIM** (`UMUIM`) — Uninsured / Underinsured Motorist.\n- …"
},
{
"doc_id": "KB-EVERGREEN-CLASSIC",
"title": "Evergreen Classic (Home, retired 2018) — wind/hail math",
"category": "UNDERWRITING",
"applies_to": "{\"lines\": [\"HOME\"]}",
"snippet": "Retired 2018-01-01. Uses a legacy flat-capped wind/hail deductible (1.5% of\ndwelling, capped) rather than the current percentage math. Not re-bindable.\n"
},
{
"doc_id": "KB-FL-HURRICANE",
"title": "FL: separate hurricane deductible",
"category": "COMPLIANCE",
"applies_to": "{\"lines\": [\"HOME\"], \"states\": [\"FL\"]}",
"snippet": "Florida homeowners policies carry a **separate hurricane deductible** expressed as\na percentage of the dwelling limit, distinct from the flat all-peril deductible.\nIt must be set explicitly before binding.\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…"
}
]
}⚙ search_kb(HOME roof age credit dwelling update roof age reprice Florida homeowners roof…)
{
"query": "HOME roof age credit dwelling update roof age reprice Florida homeowners roof replacement discount",
"limit": 10
}{
"results": [
{
"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…"
},
{
"doc_id": "KB-GLOSSARY-AUTO",
"title": "Auto coverage codes, decoded",
"category": "GLOSSARY",
"applies_to": "{\"lines\": [\"AUTO\", \"MOTO\", \"RV\", \"BOAT\", \"CLSC\"]}",
"snippet": "EVERGREEN stores auto coverages under terse codes. Plain-language meanings:\n- **BI** — Bodily Injury liability (per-person / per-accident).\n- **PD** — Property Damage liability.\n- **UM/UIM** (`UMUIM`) — Uninsured / Underinsured Motorist.\n- …"
},
{
"doc_id": "KB-FL-HURRICANE",
"title": "FL: separate hurricane deductible",
"category": "COMPLIANCE",
"applies_to": "{\"lines\": [\"HOME\"], \"states\": [\"FL\"]}",
"snippet": "Florida homeowners policies carry a **separate hurricane deductible** expressed as\na percentage of the dwelling limit, distinct from the flat all-peril deductible.\nIt must be set explicitly before binding.\n"
},
{
"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"
},
{
"doc_id": "KB-EVERGREEN-CLASSIC",
"title": "Evergreen Classic (Home, retired 2018) — wind/hail math",
"category": "UNDERWRITING",
"applies_to": "{\"lines\": [\"HOME\"]}",
"snippet": "Retired 2018-01-01. Uses a legacy flat-capped wind/hail deductible (1.5% of\ndwelling, capped) rather than the current percentage math. Not re-bindable.\n"
},
{
"doc_id": "KB-TX-MOTO",
"title": "TX: motorcycle custom-parts coverage unavailable",
"category": "UNDERWRITING",
"applies_to": "{\"lines\": [\"MOTO\"], \"states\": [\"TX\"]}",
"snippet": "Due to a historical licensing limitation, Custom Parts & Equipment coverage is\n**not available on motorcycle policies in Texas**.\n"
},
{
"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-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-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-SUITABILITY",
"title": "Suitability requirement for Life & Health",
"category": "COMPLIANCE",
"applies_to": "{\"lines\": [\"LIFE_T\", \"LIFE_W\", \"HLTH\"]}",
"snippet": "Before binding any Life or Supplemental Health policy you must complete a\n**suitability record** (income, existing coverage, dependents, stated need,\nhorizon, risk tolerance) with outcome SUITABLE. Selling **whole life** to a\nshort-horizon,…"
}
]
}⚙ update_insured_object(dwelling, DWL-fl-coastal-home-d1, {"roof_age":0})
{
"object_type": "dwelling",
"object_id": "DWL-fl-coastal-home-d1",
"fields": {
"roof_age": 0
}
}{
"ok": true,
"rows_affected": 1,
"changeset": {
"dwellings": {
"changed": [
{
"pk": {
"dwelling_id": "DWL-fl-coastal-home-d1"
},
"fields": {
"roof_age": [
6,
0
]
}
}
]
}
},
"note": "if these facts feed rating, the affected policy's premium is stale — reprice_policy"
}⚙ reprice_policy(POL-fl-coastal-home-p_home, 2025-06-01)
{
"policy_id": "POL-fl-coastal-home-p_home",
"as_of": "2025-06-01"
}{
"ok": true,
"as_of": "2025-06-01",
"base_premium_cents": 529408,
"final_premium_cents": 485546,
"breakdown": [
{
"step": "BASE",
"code": "base",
"detail": "$4.2/$1k × RC $520,000.0",
"factor": null,
"amount_cents": null,
"running_cents": 218400
},
{
"step": "BASE",
"code": "tier:SEQUOIA",
"detail": "tier factor ×1.55",
"factor": 1.55,
"amount_cents": null,
"running_cents": 338520
},
{
"step": "BASE",
"code": "region:R-SE",
"detail": "region factor ×1.45",
"factor": 1.45,
"amount_cents": null,
"running_cents": 490854
},
{
"step": "RISK",
"code": "factor:roof_age",
"detail": "roof_age=0 ×0.92",
"factor": 0.92,
"amount_cents": null,
"running_cents": 451586
},
{
"step": "RISK",
"code": "factor:construction",
"detail": "construction=MASONRY ×0.95",
"factor": 0.95,
"amount_cents": null,
"running_cents": 429007
},
{
"step": "RISK",
"code": "factor:protection_class",
"detail": "protection_class=5 ×1.0",
"factor": 1,
"amount_cents": null,
"running_cents": 429007
},
{
"step": "RISK",
"code": "factor:dist_to_coast_mi",
"detail": "dist_to_coast_mi=2 ×1.2",
"factor": 1.2,
"amount_cents": null,
"running_cents": 514808
},
{
"step": "RISK",
"code": "factor:risk_score",
"detail": "risk_score=715 ×1.0",
"factor": 1,
"amount_cents": null,
"running_cents": 514808
},
{
"step": "RISK",
"code": "wind_hail_ded",
"detail": "wind/hail ded 0.01 ×1.0",
"factor": 1,
"amount_cents": null,
"running_cents": 514808
},
{
"step": "COVERAGE",
"code": "SERVICE_LN",
"detail": "+ SERVICE_LN $30",
"factor": null,
"amount_cents": 3000,
"running_cents": 517808
},
{
"step": "COVERAGE",
"code": "WATER_BACK",
"detail": "+ WATER_BACK $55",
"factor": null,
"amount_cents": 5500,
"running_cents": 523308
},
{
"step": "FEES",
"code": "policy_fee",
"detail": "+ policy fee",
"factor": null,
"amount_cents": 2500,
"running_cents": 525808
},
{
"step": "FEES",
"code": "installment",
"detail": "+ fractional-pay surcharge",
"factor": null,
"amount_cents": 3600,
"running_cents": 529408
},
{
"step": "DISCOUNT",
"code": "PAPERLESS",
"detail": "−$25",
"factor": null,
"amount_cents": -2500,
"running_cents": 526908
},
{
"step": "DISCOUNT",
"code": "AUTOPAY",
"detail": "−3%",
"factor": 0.97,
"amount_cents": null,
"running_cents": 511101
},
{
"step": "DISCOUNT",
"code": "LOYALTY",
"detail": "−5%",
"factor": 0.95,
"amount_cents": null,
"running_cents": 485546
}
],
"changeset": {
"policies": {
"changed": [
{
"pk": {
"policy_id": "POL-fl-coastal-home-p_home"
},
"fields": {
"rating_as_of": [
"2025-04-01",
"2025-06-01"
],
"base_premium_cents": [
574173,
529408
],
"final_premium_cents": [
526797,
485546
],
"premium_breakdown": [
"[{\"step\": \"BASE\", \"code\": \"base\", \"detail\": \"$4.2/$1k \\u00d7 RC $520,000.0\", \"factor\": null, \"amount_cents\": null, \"running_cents\": 218400}, {\"step\": \"BASE\", \"code\": \"tier:SEQUOIA\", \"detail\": \"tier factor \\u00d71.55\", \"factor\": 1.55, \"amount_cents\": null, \"running_cents\": 338520}, {\"step\": \"BASE\", \"code\": \"region:R-SE\", \"detail\": \"region factor \\u00d71.45\", \"factor\": 1.45, \"amount_cents\": null, \"running_cents\": 490854}, {\"step\": \"RISK\", \"code\": \"factor:roof_age\", \"detail\": \"roof_age=6 \\u00d71.0\", \"factor\": 1.0, \"amount_cents\": null, \"running_cents\": 490854}, {\"step\": \"RISK\", \"code\": \"factor:construction\", \"detail\": \"construction=MASONRY \\u00d70.95\", \"factor\": 0.95, \"amount_cents\": null, \"running_cents\": 466311}, {\"step\": \"RISK\", \"code\": \"factor:protection_class\", \"detail\": \"protection_class=5 \\u00d71.0\", \"factor\": 1.0, \"amount_cents\": null, \"running_cents\": 466311}, {\"step\": \"RISK\", \"code\": \"factor:dist_to_coast_mi\", \"detail\": \"dist_to_coast_mi=2 \\u00d71.2\", \"factor\": 1.2, \"amount_cents\": null, \"running_cents\": 559573}, {\"step\": \"RISK\", \"code\": \"factor:risk_score\", \"detail\": \"risk_score=715 \\u00d71.0\", \"factor\": 1.0, \"amount_cents\": null, \"running_cents\": 559573}, {\"step\": \"RISK\", \"code\": \"wind_hail_ded\", \"detail\": \"wind/hail ded 0.01 \\u00d71.0\", \"factor\": 1.0, \"amount_cents\": null, \"running_cents\": 559573}, {\"step\": \"COVERAGE\", \"code\": \"SERVICE_LN\", \"detail\": \"+ SERVICE_LN $30\", \"factor\": null, \"amount_cents\": 3000, \"running_cents\": 562573}, {\"step\": \"COVERAGE\", \"code\": \"WATER_BACK\", \"detail\": \"+ WATER_BACK $55\", \"factor\": null, \"amount_cents\": 5500, \"running_cents\": 568073}, {\"step\": \"FEES\", \"code\": \"policy_fee\", \"detail\": \"+ policy fee\", \"factor\": null, \"amount_cents\": 2500, \"running_cents\": 570573}, {\"step\": \"FEES\", \"code\": \"installment\", \"detail\": \"+ fractional-pay surcharge\", \"factor\": null, \"amount_cents\": 3600, \"running_cents\": 574173}, {\"step\": \"DISCOUNT\", \"code\": \"PAPERLESS\", \"detail\": \"\\u2212$25\", \"factor\": null, \"amount_cents\": -2500, \"running_cents\": 571673}, {\"step\": \"DISCOUNT\", \"code\": \"AUTOPAY\", \"detail\": \"\\u22123%\", \"factor\": 0.97, \"amount_cents\": null, \"running_cents\": 554523}, {\"step\": \"DISCOUNT\", \"code\": \"LOYALTY\", \"detail\": \"\\u22125%\", \"factor\": 0.95, \"amount_cents\": null, \"running_cents\": 526797}]",
"[{\"step\": \"BASE\", \"code\": \"base\", \"detail\": \"$4.2/$1k \\u00d7 RC $520,000.0\", \"factor\": null, \"amount_cents\": null, \"running_cents\": 218400}, {\"step\": \"BASE\", \"code\": \"tier:SEQUOIA\", \"detail\": \"tier factor \\u00d71.55\", \"factor\": 1.55, \"amount_cents\": null, \"running_cents\": 338520}, {\"step\": \"BASE\", \"code\": \"region:R-SE\", \"detail\": \"region factor \\u00d71.45\", \"factor\": 1.45, \"amount_cents\": null, \"running_cents\": 490854}, {\"step\": \"RISK\", \"code\": \"factor:roof_age\", \"detail\": \"roof_age=0 \\u00d70.92\", \"factor\": 0.92, \"amount_cents\": null, \"running_cents\": 451586}, {\"step\": \"RISK\", \"code\": \"factor:construction\", \"detail\": \"construction=MASONRY \\u00d70.95\", \"factor\": 0.95, \"amount_cents\": null, \"running_cents\": 429007}, {\"step\": \"RISK\", \"code\": \"factor:protection_class\", \"detail\": \"protection_class=5 \\u00d71.0\", \"factor\": 1.0, \"amount_cents\": null, \"running_cents\": 429007}, {\"step\": \"RISK\", \"code\": \"factor:dist_to_coast_mi\", \"detail\": \"dist_to_coast_mi=2 \\u00d71.2\", \"factor\": 1.2, \"amount_cents\": null, \"running_cents\": 514808}, {\"step\": \"RISK\", \"code\": \"factor:risk_score\", \"detail\": \"risk_score=715 \\u00d71.0\", \"factor\": 1.0, \"amount_cents\": null, \"running_cents\": 514808}, {\"step\": \"RISK\", \"code\": \"wind_hail_ded\", \"detail\": \"wind/hail ded 0.01 \\u00d71.0\", \"factor\": 1.0, \"amount_cents\": null, \"running_cents\": 514808}, {\"step\": \"COVERAGE\", \"code\": \"SERVICE_LN\", \"detail\": \"+ SERVICE_LN $30\", \"factor\": null, \"amount_cents\": 3000, \"running_cents\": 517808}, {\"step\": \"COVERAGE\", \"code\": \"WATER_BACK\", \"detail\": \"+ WATER_BACK $55\", \"factor\": null, \"amount_cents\": 5500, \"running_cents\": 523308}, {\"step\": \"FEES\", \"code\": \"policy_fee\", \"detail\": \"+ policy fee\", \"factor\": null, \"amount_cents\": 2500, \"running_cents\": 525808}, {\"step\": \"FEES\", \"code\": \"installment\", \"detail\": \"+ fractional-pay surcharge\", \"factor\": null, \"amount_cents\": 3600, \"running_cents\": 529408}, {\"step\": \"DISCOUNT\", \"code\": \"PAPERLESS\", \"detail\": \"\\u2212$25\", \"factor\": null, \"amount_cents\": -2500, \"running_cents\": 526908}, {\"step\": \"DISCOUNT\", \"code\": \"AUTOPAY\", \"detail\": \"\\u22123%\", \"factor\": 0.97, \"amount_cents\": null, \"running_cents\": 511101}, {\"step\": \"DISCOUNT\", \"code\": \"LOYALTY\", \"detail\": \"\\u22125%\", \"factor\": 0.95, \"amount_cents\": null, \"running_cents\": 485546}]"
]
}
}
]
}
}
}Done — I updated your home policy to reflect the new roof and re-rated it.
Updated policy
- Policy:
POL-fl-coastal-home-p_home - Location: Naples, FL
- Roof age on file: changed from 6 years to 0 years
New premium
- New annual premium: $4,855.46
- Previous annual premium: $5,267.97
- Annual decrease: $412.51
The rating change came from the roof-age factor improving on your Florida homeowners policy.
If you’d like, I can also help estimate what that means for your installment amount specifically, depending on where you are in the billing cycle.
That's fantastic — thank you! I'm very happy with that savings. I have the contractor's certificate of completion if you need it for the file, but it sounds like you've got everything updated and the new premium locked in. I appreciate your help!
⚙ end_conversation()
{}{
"ok": true,
"note": "Deliver your closing message now."
}You’re very welcome, Gloria — glad I could help, and that’s a nice savings. No additional document is needed from my side right now based on the update we made today.
Thanks for choosing PEICO, and have a great day!