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:
Override types ∈ base_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:
- 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 - Auto-applies it immediately (Sarah's authority is still fine for this delta)
- The materializer writes another superseding Pricing Quote row — this time without the market hardening 2026 factor. Final snaps back to $517,500.
- The original override's
statusflips toreverted, 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.