Every insurance operation has a mailroom problem. Submissions, claims, legal filings, broker threads, loss runs, cyber reports, medical records, and spreadsheets pour in through email, portals, and scans — heterogeneous, mislabeled, and often bundled. The very first decision, before any value can be extracted, is what is this document, and how urgent is it? Get that wrong and a served summons sits in an FNOL queue for a week; a Department of Insurance inquiry gets triaged as routine correspondence; a three-year loss run gets read as a single active claim.
InsightXtract treats classification as a first-class, agentic step — not a filename regex or a layout template match. It reads the messy reality (OCR text, scanned PDFs, email bodies, legal filings, claim forms, spreadsheets) and assigns exactly one business class that captures the document’s intent: an obligation, a notification, or a data artifact. And it returns that verdict with the evidence that drove it — so every downstream system can trust it, and act on it.
The core principle: classify by meaning, not by layout
The design rests on a simple, hard-won rule: a document is what it does, not what it looks like. A lawsuit pasted into an ACORD form or forwarded inside a broker email is still a lawsuit. So InsightXtract never decides on template alone. Four ideas make that work in practice:
- Intent over form. Classify what the document does in the claims/underwriting lifecycle, not its shape.
- Obligation beats description. A document that creates a legal or regulatory obligation (a filing, a regulator order, an attorney demand) outranks one that merely reports an event (an FNOL, an incident, an investigation).
- Noise is stripped before meaning is judged. Forwarding headers, signatures, disclaimers, and confidentiality footers are discarded — unless that text is the operative content.
- Single-label, severity-ranked. Documents carry many signals at once. The system always returns one class, chosen by a deterministic severity ladder — never by model whim.
What comes back: an evidence-bearing verdict
Classification doesn’t hand back a bare label. Every document gets a structured, auditable verdict — the payload that downstream systems consume:
| Field | What it carries | Why it’s there |
|---|---|---|
class / code | The one business class, e.g. legal_proceeding | The routing key every other app reads. |
priority | Severity band P1–P7 | Drives queue placement and SLA/urgency. |
confidence | Float 0.0–1.0 | Below threshold → auto-flag for human review. |
reason | One or two sentences, grounded in the document | Human-readable justification for reviewers. |
evidence | 1–3 quoted spans that drove the choice | Citations — makes the decision defensible. |
runner_up | The second-best class + its confidence | Shows what it almost was — review context. |
applied_rules | Which override rules fired (e.g. R2) | Explains why it beat a plausible alternative. |
ignored_noise | What was discarded before judging | Transparency on the noise-stripping step. |
{
"class": "legal_proceeding",
"priority": "P1",
"confidence": 0.96,
"reason": "Summons and Verified Complaint served on the insured; the ACORD wrapper is incidental.",
"evidence": ["YOU ARE HEREBY SUMMONED", "SUPERIOR COURT OF THE STATE OF ...", "Index No. 65432/2026"],
"runner_up": { "class": "acord_form", "confidence": 0.41 },
"applied_rules": ["R1", "R2"],
"ignored_noise": ["email forwarding header", "broker signature block"]
}
The taxonomy: 23 classes across 7 severity bands
Classes are ranked P1 (highest — an active legal obligation) to P7 (lowest — operational and catch-all). When several classes are defensible, the resolver picks the highest band, then breaks ties with the override rules.
| Band | Class | Code | What it means |
|---|---|---|---|
| P1 | Legal Proceeding | legal_proceeding | A filed or served legal action against the insured/carrier. |
| P2 | Regulatory Action | regulatory_action | A notice, inquiry, or order from a government/regulatory body. |
| P2 | Attorney Demand | attorney_demand | Counsel asserting representation, settlement, or a legal threat. |
| P3 | Claim Assertion | claim_assertion | A formal claim asserting liability/damages against the insured. |
| P4 | First Notice of Loss | first_notice_of_loss | First party reporting that a loss or event has occurred. |
| P4 | Circumstance Notice | circumstance_notice | Precautionary notice of a potential future claim. |
| P4 | Claim Acknowledgement | claim_acknowledgement | Carrier-side acknowledgement / adjuster assignment / receipt. |
| P4 | ACORD Form | acord_form | A standard ACORD form with no stronger embedded meaning. |
| P5 | Cyber Incident | cyber_incident | Notification of a cyber/privacy event reported for coverage. |
| P5 | Forensic Investigation | forensic_investigation | DFIR / root-cause / engineering / inspection findings. |
| P5 | Authority Report | authority_report | Police report, FIR, fire-marshal, regulator inspection. |
| P6 | Coverage Position | coverage_position | Reservation of rights, coverage opinion/denial, claim handling. |
| P6 | Policy Contract | policy_contract | Policy wording, declarations, endorsements, schedules of forms. |
| P6 | Loss Run | loss_run | Historical claims/loss-experience report (data table). |
| P6 | Statement of Values | statement_of_values | Property/asset schedule with values (SOV). |
| P6 | Exposure Schedule | exposure_schedule | Rating-basis data: payroll, sales, vehicle/driver/fleet, locations. |
| P6 | Underwriting Submission | underwriting_submission | Application / submission / quote-request package. |
| P6 | Financial Record | financial_record | Invoices, loss calculations, payment/settlement, proof of loss. |
| P6 | Medical Record | medical_record | Medical reports, injury records, treatment summaries, IME. |
| P7 | Supporting Evidence | supporting_evidence | Exhibit-only attachments: screenshots, logs, photos, exhibits. |
| P7 | Broker/Insured Comm. | broker_insured_comm | Operational correspondence with no operative content. |
| P7 | Other | other | Identifiable document that matches no class. |
| P7 | Unknown | unknown | Insufficient, empty, or corrupted content. |
Note that data artifacts are first-class: loss runs, SOVs, exposure schedules, and submissions are explicit underwriting-data classes — never dumped into “other.”
How the verdict is reached: normalize → route → vote → resolve
Classification runs as a small agentic subgraph. Cheap steps do recall; an LLM does judgment on a shortlist; and a deterministic resolver — no LLM — makes the final call so the outcome is repeatable and explainable.
strip noise · OCR cleanup
segment attachments] N --> R[route
keyword + embedding recall
→ candidate families] R --> V[skill voting
family detectors in parallel
applies · confidence · evidence] V --> D[resolve
severity ladder + override rules
deterministic] D --> J[Strict JSON verdict]
- Normalize. Strip email chains, headers, signatures, disclaimers, and footers — unless that text is the operative content — and segment bundled attachments so each is judged on its own.
- Route. A cheap, high-recall pass (keyword matcher + embeddings) narrows 23 classes down to a shortlist of candidate families, so the expensive step stays small.
- Skill voting. Each shortlisted skill — a focused detector for one family — runs in parallel and returns
{applies, best_class, confidence, evidence, disqualified_by}. Adding a class means adding a skill entry, not rewriting a giant prompt. - Resolve. A deterministic resolver takes the candidates above a confidence floor, picks the highest severity band, and applies the override rules. Crucially, the rules can only escalate severity — never silently downgrade — because escalation is the safe direction for an insurer’s obligations.
The override rules are where the judgment lives
Twelve deterministic tie-breaks encode “legal meaning wins over form.” A filed action beats a threat (R2). A regulator’s breach notice beats a cyber-incident report (R4). A demand from counsel beats a plain FNOL (R3). Multi-row historical claim data is a loss run, not an active claim (R10). Because the resolver — not the model — applies these, the same document always classifies the same way, and the fired rules are recorded in the verdict.
A few worked examples
| Document (after noise-strip) | Almost… | Winner | Why |
|---|---|---|---|
| ACORD 25 PDF containing a served Summons | acord_form | P1 legal_proceeding | R1 + R2 — a filed action beats the form. |
| AG letter about a data breach affecting residents | cyber_incident | P2 regulatory_action | R4 — regulator beats incident. |
| Insured email: “ransomware hit us last night” | first_notice_of_loss | P5 cyber_incident | R5 — no third-party demand; more specific. |
| 3-year spreadsheet of claims with paid/reserved | claim_assertion | P6 loss_run | R10 — historical data, not an active claim. |
Why this is the most reusable signal in your stack
Here is the part that matters beyond the extraction engine. Classification isn’t a private, internal step — it produces a clean, coded, cited verdict that any system can consume. One classification call becomes the routing brain for the whole operation:
| Consuming system | What it does with the verdict |
|---|---|
| Claims triage / workflow | The priority band sets the queue and SLA. legal_proceeding and attorney_demand jump straight to litigation/supervisor with a suit-response clock; an authority_report attaches to the right claim. |
| Compliance / regulatory | A regulatory_action starts the statutory response and breach-notification clocks automatically — the class is the trigger that a deadline exists. |
| Underwriting workbench | Data classes route to the right place: underwriting_submission, loss_run, statement_of_values, and exposure_schedule each open the matching extraction agent and populate the submission record. |
| Extraction pipeline | The winning class’s YAML spec is the extraction plan — classification tells the agent exactly which fields and tables to pull, so extraction is targeted, not generic. |
| Document management / DMS | Files itself under the right record and folder, coded consistently — no manual indexing, and searchable by business class. |
| RPA / straight-through bots | Bots switch on the code to pick the next action — acknowledge, assign, decline, or escalate — without bespoke per-document logic. |
| Policy administration | policy_contract and coverage_position route to policy/coverage systems instead of the claims queue. |
| Analytics / portfolio | Consistent classes make the inbound mix measurable — severity trend, litigation frequency, submission volume — across the whole book, over time. |
How other apps actually get the signal
The plumbing is deliberately simple, so integration is a day, not a quarter:
- A shared vocabulary. Each class is a real
DocumentClassrecord. Your systems key off stable codes, not free text — so “lawsuit” means the same thing everywhere. - The verdict travels with the document. The winning class is written to the document record and the full JSON verdict (evidence + applied rules) is persisted alongside it — available to any consumer, and defensible in an audit.
- API & events. Classify on ingest and read the verdict over the API, or subscribe to the classification event so a PAS, claims system, mailroom, or bot reacts the moment a document lands.
- Extensible without redeploys. Add a class in the taxonomy config and seed a
DocumentClassrow — the prompts render from the taxonomy, so new classes flow through to every consumer without a code change.
Why it matters to the business
- The right document reaches the right desk in seconds. Severity-ranked routing means a served summons never waits behind routine mail — the most costly misses (P1–P3) are exactly the ones the ladder protects.
- Deadlines start themselves. When a regulator notice or a legal filing is recognized on arrival, the compliance and suit-response clocks begin automatically instead of when someone happens to open the file.
- Every decision is defensible. The evidence spans and applied rules make each single-label choice reviewable by claims and legal — and auditable for exams and disputes.
- One signal, many systems. Build the classification capability once; claims, underwriting, compliance, DMS, analytics, and your bots all consume the same verdict. That is leverage no per-app rule engine gives you.
Related reading →
See how the coded document feeds extraction: inside an excess casualty submission, and how the whole thing stays defensible: auditability by design.