• contact@verticalserve.com
Home / Engineering / Post 84
Engineering Blog · Post #84

Applying a 12% Market-Hardening Override: How InsightUW's Authority-Gated Decision Engine Keeps Senior UWs Moving Without Losing Audit

How Senior UW Sarah Chen adds a market condition factor of 1.12 to a $450k NA property quote, clears her authority ceiling, auto-applies the override, and watches the rater-produced quote supersede cleanly — with the entire chain reversible in one click if the broker pushes back.


The Problem

A UW looks at a rater-produced quote and it's wrong.

Not wrong because the rater malfunctioned — wrong because the rater doesn't know what the UW knows. The rater doesn't know the market is hardening 12% this quarter. It doesn't know the incumbent just walked away. It doesn't know this broker is about to lose three accounts to a competitor who's being aggressive. It doesn't know the insured is acquiring a subsidiary next month that doubles the TIV. The rater prices the risk; the UW prices the deal.

Most systems force a choice: either lock the UW out of the quote (and watch them do the math in Excel), or give them edit rights on every field (and accept that the audit trail is meaningless). Neither works at scale.

The InsightUW override engine takes a third path: every override is a row, not an edit. The original rater output is immutable. The UW's decision becomes a new row that supersedes the prior state. The authority matrix gates how much the UW can move without approval. The approval queue catches anything outside authority. Nothing is lost; nothing is forged; every change carries its reason.

This blog walks through one full override cycle — composer to authority check to audit trail to reverted state — on a concrete NA property quote.

The Account

  • Insured: Vanguard Manufacturing Complex, Ohio
  • LOB: Commercial property
  • TIV: $50,000,000
  • Rating model: us property loss aware v1 2026 (cap Rating/Integrated Rater #2 — loss-aware variant)
  • Rater output: $450,000 subtotal, $517,500 final (with 15% broker commission + $250 policy fee)

Sarah has read the Council of Insurance Agents & Brokers Q1 index — NA property is up 10-12% this cycle. Her own book is pricing up ~12%. Incumbent carrier walked away last week per the broker. She wants to add a market-hardening factor of 1.12 and see the quote at ~$504k subtotal, ~$580k final.

The Architecture

The engine is built from four concerns, each in its own table:

graph TB subgraph Catalog["Reason code catalog"] RC["Rating Override Reason Code<br/>11 seeded codes<br/>always requires approval flag"] end subgraph Authority["Authority matrix"] AM["Authority Matrix<br/>user name + role + lob<br/>max premium + max loss ratio"] end subgraph Override["Override row"] O["Rating Override<br/>override type + target<br/>original value / new value<br/>status lifecycle<br/>market context"] end subgraph Target["Target entity"] Q["Pricing Quote<br/>(or CATResult,<br/>Rating Feature Value)<br/>supersede chain"] end RC --> O AM --> O O -.applies via materializer.-> Q

Override typesbase_premium | factor | tax | surcharge | final_premium | cat_aal | cat_pml | feature | market_condition. Each routes to a type-specific materializer that writes a new superseding row to the correct target table.

Lifecycle: draft → pending_approval → approved → applied (or rejected). Terminal state for a reverted override is reverted, created by a new reverting override row with parent override guid pointing at the original.

Step 1 — Open the Composer

Sarah is on the quote detail page. She scrolls past the factor stack to the Overrides section and clicks + New override. The composer drops inline.

Override type defaults to final premium. Sarah changes it to market condition. This tells the engine to append a new factor to the stack rather than replace an existing one — the market-hardening uplift becomes a new line item the broker can see.

Step 2 — Fill the Composer

Field Value
Override type market condition
Factor code (new) market hardening 2026
Original value 1.00
New value 1.12
Reason code market hardening
Notes "NA property market firming 10-12% per Q1 Council index; incumbent departed; pricing up ~12% across my book this quarter"
Market context: competitor_carrier
Market context: market_hardening_factor 0.12
Market context: relationship_tier gold

Delta preview updates live: +0.12 (+12.0%). Sarah clicks Check authority.

Step 3 — Authority Check

The service looks up Sarah's row in Authority Matrix:

Her premium ceiling is $100k. The market condition override type is measured by absolute delta (not percentage). New subtotal = base × factor_product = $200,000 × 2.282 = $504,000. Delta = $504,000 - $450,000 = $54,000.

$54k < $100k ceiling. The authority service returns:

Green pill on the UI. No approver needed.

What if she'd been over?

Suppose this had been a $1.2M account. 12% market factor → $144k delta → outside the $100k ceiling:

On submit, the override creates with status = pending_approval and does not auto-apply. The Chief Underwriter sees it at /uw/override-queue with full context. Approve → auto-applies. Reject → status flips to rejected with the reviewer's comment. Sarah gets notified either way.

Step 4 — Submit + Auto-Apply

Sarah clicks Submit override. Three things happen atomically inside a DB transaction:

1. A Rating Override row is created with status = approved (auto-approved because within authority):

2. The quote materializer fires (apply quote override). It:

  • Reads the prior Pricing Quote (guid quote-abc-123-...)
  • Appends a new factor line: {"code": "market_hardening_2026", "name": "market_hardening_2026", "value": 1.12, "source": "uw_override", "uw_added": true, "is_market_condition": true}
  • Recomputes subtotal: base × Π factor_values = $200,000 × 2.282 = $504,000
  • Re-runs the tax rule engine (no change for this account)
  • Re-runs the fee rule engine — broker commission scales with subtotal: 15% × $504k = $75,600; policy fee stays at $250 flat → total fees $75,850
  • Recomputes final: subtotal + taxes + fees + surcharges = 504,000 + 0 + 75,850 + 0 = 579,850
  • Writes a new Pricing Quote row with is_uw_override = True, overrides_quote_guid = quote-abc-123-..., is_current = True

3. The prior quote row flips to is_current = False and its superseded by guid now points at the new row.

All under one transaction. Zero data lost. Zero chance of an inconsistent state between override record and quote row.

Step 5 — Premium Waterfall: Before and After

Before (rater output):

After (UW override applied):

Final delta: +$62,350, of which $54,000 is the direct factor effect and $8,350 is the commission re-scaling. The quote summary page now shows a Comparison-vs-original block because the current quote has overrides quote guid set.

Step 6 — The Audit Record

The Overrides panel on quote-detail now shows:

Type Target Original New Δ Reason Status By
market condition market hardening 2026 1.00 1.12 +12% market_hardening
"NA property market firming…"
applied Sarah Chen
2026-04-24 11:32

A Revert button is present next to the row. Any user who can see this quote can see the audit row. Regulators get the same view — supersede chain reconstructs the exact sequence of rater output → UW override → authority clearance → applied, with timestamps and actor names attached.

Step 7 — Revert (When the Broker Pushes Back)

Ten minutes later the broker calls: "We can't go to $580k, the client will bolt." Sarah needs to dial back.

She clicks Revert on the override row. The service:

  1. Creates a new reverting Rating Override with the values flipped — original_value = 1.12, new_value = 1.00, reason_code = manual_correction, parent_override_guid = ov-7821-... pointing at her original
  2. Auto-applies it immediately (Sarah's authority is still fine for this delta)
  3. The materializer writes another superseding Pricing Quote row — this time without the market hardening 2026 factor. Final snaps back to $517,500.
  4. The original override's status flips to reverted, timestamps recorded.

Overrides panel now shows two rows — the original (marked reverted) and the revert (applied). Both stay in audit forever. A third-party reviewer can walk the chain backwards and see: rater produced X, Sarah overrode to Y at 11:32, Sarah reverted at 11:47 after broker call, quote snapped back to X. Nothing hidden.

Step 8 — Quote Summary Output

With the market factor applied (pre-revert), Sarah navigates to Quote Summary at /uw/quote-summary/<guid>. The page renders:

  • Hero: $579,850 final premium (indigo tone) + subtotal $504,000 + fees $75,850
  • Coverages block: coverage form, effective date, limit, deductible, building TIV, construction class, year built, protection class, sprinklered
  • Exposure block: loss ratio 5y, loss count 5y, max single loss 5y — each with source tag (feature:internal_prior_year)
  • Premium build-up: base → 6 original factors → market_hardening_2026 (with uw_override badge on the factor row) → subtotal → fees → final
  • Overrides applied: Sarah's market-condition override inline
  • Comparison vs original: "Base $200k → $200k (Δ $0), Subtotal $450k → $504k (Δ +$54k), Final $517.5k → $579.85k (Δ +$62.35k)"

Sarah flips the Redact internal toggle in the toolbar. The Overrides section and the Comparison section disappear; the factor stack stays visible (the broker sees the math). She clicks Open PDF — ReportLab plumbing in uw_template_render_service.html to pdf produces a broker-clean PDF that emails cleanly.

How the Authority Check Really Works

The service handles five classes of override differently:

Override type Gate measured on Default ceiling field
final premium / base premium / market condition absolute dollar delta max premium
factor / tax / surcharge percentage change max loss ratio (default 15%)
feature / cat pml / cat aal percentage change max loss ratio

Reason-code override: regardless of the math, if the reason code's always_requires_approval = true, the override goes to pending_approval. Seeded reason codes with this flag: cat adjustment, relationship adjustment, competitor indication. The intuition is that market-based intuition overrides (competitor pricing, relationship concessions, CAT model contrarian calls) always deserve a second set of eyes.

No matching authority row: if the user has no Authority Matrix entry for their LOB, the gate defaults to requires_approval = true with authority_code = "default_gate". Fail-safe: no authority = no silent approval.

The Reason Code Catalog

Seeded with 11 codes, all extensible via /api/uw_rating_decision/reason-codes:

Code Requires approval Typical use
market hardening No Q1 firming; post-CAT events; regional capacity withdrawal
market softening No Broker tier discount; new-entrant pricing pressure
terms tightening No Deductible up; exclusions added; coverage narrowed
terms loosening No Deductible down; sublimit increase; coverage broadened
limits change No Requested limit revised; re-rate required
deductible change No Deductible changed; apply credit/debit
cat adjustment Yes UW overrides vendor CAT model output (PML/AAL)
loss experience adjustment No Experience factor override on specific account
relationship adjustment Yes Strategic broker or insured relationship credit
competitor indication Yes Priced to known competitor quote
manual correction No Typo / re-entry / late data correction

Ops adds new codes from the admin surface — no deploy needed.

Workflow Integration

A workflow rule can act on overrides via Jinja helpers:

Or a policy-driven auto-override:

The workflow engine invokes Rating Decision Service.create_override + apply to target under the rule actor. Fully audited like any UW-driven override.

Why the Append-Only Chain Matters

Property carriers that bind hundreds of accounts a month carry regulatory exposure any time pricing decisions can't be reconstructed years later. Auditors ask:

  • What did the rater produce?
  • Who changed it, when, and why?
  • What authority covered the change?
  • Was the change reverted? Why?

In a traditional update-in-place model, the answer to "what did the rater originally produce" is "lost — the UW edited the row." Here, every answer is a query against the supersede chain:

Three queries, full lineage. The regulator gets the full picture. So does the internal audit. So does the UW six months later trying to remember why they did something.

What This Replaces

Most carriers today manage override authority in one of three ways, all of them bad:

  • Excel spreadsheets + email approvals. UW exports the rater output, edits in Excel, emails the manager for sign-off. Authority enforcement is manual. Audit trail is the email archive. When the regulator asks for reconstruction, IT spends three weeks pulling mailboxes.
  • Rater extensions. Add a "UW override" field to the rater workbook. Now the rater is the audit — but only for that workbook. Cross-submission analytics are impossible.
  • Policy admin system free-text fields. UW types the override into a comments box on the policy record. Zero math. Zero authority. Zero audit value beyond the text itself.

The override engine is none of those. It's a first-class entity with lifecycle, gating, supersede, revert, and workflow integration — and it sits alongside the rater, not inside it.

Quick Reference

Create override: POST /api/uw_rating_decision/overrides

Authority preview: POST /api/uw_rating_decision/authority-check

Approve: POST /api/uw_rating_decision/overrides/{guid}/approve

Reject: POST /api/uw_rating_decision/overrides/{guid}/reject

Apply (manual): POST /api/uw_rating_decision/overrides/{guid}/apply

Revert: POST /api/uw_rating_decision/overrides/{guid}/revert

List for submission: GET /api/uw_rating_decision/overrides/submission/{guid}

Pending queue: GET /api/uw_rating_decision/overrides/pending

Jinja helpers (workflow rules):


This blog walks one scenario. The same engine handles CAT PML overrides (revise a vendor-model return period), feature overrides (override a loss-ratio feature with UW judgment), tax/surcharge overrides, and revert cycles — all under the same table, same authority gate, same audit chain. The shape is the same; the target varies.

See InsightUW run on your data

A 45-minute working session with a real broker email and your LOBs.

Request a demo