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:

FieldWhat it carriesWhy it’s there
class / codeThe one business class, e.g. legal_proceedingThe routing key every other app reads.
prioritySeverity band P1P7Drives queue placement and SLA/urgency.
confidenceFloat 0.0–1.0Below threshold → auto-flag for human review.
reasonOne or two sentences, grounded in the documentHuman-readable justification for reviewers.
evidence1–3 quoted spans that drove the choiceCitations — makes the decision defensible.
runner_upThe second-best class + its confidenceShows what it almost was — review context.
applied_rulesWhich override rules fired (e.g. R2)Explains why it beat a plausible alternative.
ignored_noiseWhat was discarded before judgingTransparency on the noise-stripping step.
// An ACORD 25 PDF that turned out to contain a served Summons & Complaint
{
  "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.

BandClassCodeWhat it means
P1Legal Proceedinglegal_proceedingA filed or served legal action against the insured/carrier.
P2Regulatory Actionregulatory_actionA notice, inquiry, or order from a government/regulatory body.
P2Attorney Demandattorney_demandCounsel asserting representation, settlement, or a legal threat.
P3Claim Assertionclaim_assertionA formal claim asserting liability/damages against the insured.
P4First Notice of Lossfirst_notice_of_lossFirst party reporting that a loss or event has occurred.
P4Circumstance Noticecircumstance_noticePrecautionary notice of a potential future claim.
P4Claim Acknowledgementclaim_acknowledgementCarrier-side acknowledgement / adjuster assignment / receipt.
P4ACORD Formacord_formA standard ACORD form with no stronger embedded meaning.
P5Cyber Incidentcyber_incidentNotification of a cyber/privacy event reported for coverage.
P5Forensic Investigationforensic_investigationDFIR / root-cause / engineering / inspection findings.
P5Authority Reportauthority_reportPolice report, FIR, fire-marshal, regulator inspection.
P6Coverage Positioncoverage_positionReservation of rights, coverage opinion/denial, claim handling.
P6Policy Contractpolicy_contractPolicy wording, declarations, endorsements, schedules of forms.
P6Loss Runloss_runHistorical claims/loss-experience report (data table).
P6Statement of Valuesstatement_of_valuesProperty/asset schedule with values (SOV).
P6Exposure Scheduleexposure_scheduleRating-basis data: payroll, sales, vehicle/driver/fleet, locations.
P6Underwriting Submissionunderwriting_submissionApplication / submission / quote-request package.
P6Financial Recordfinancial_recordInvoices, loss calculations, payment/settlement, proof of loss.
P6Medical Recordmedical_recordMedical reports, injury records, treatment summaries, IME.
P7Supporting Evidencesupporting_evidenceExhibit-only attachments: screenshots, logs, photos, exhibits.
P7Broker/Insured Comm.broker_insured_commOperational correspondence with no operative content.
P7OtherotherIdentifiable document that matches no class.
P7UnknownunknownInsufficient, 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.

flowchart LR I[Raw input] --> N[normalize
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…WinnerWhy
ACORD 25 PDF containing a served Summonsacord_formP1 legal_proceedingR1 + R2 — a filed action beats the form.
AG letter about a data breach affecting residentscyber_incidentP2 regulatory_actionR4 — regulator beats incident.
Insured email: “ransomware hit us last night”first_notice_of_lossP5 cyber_incidentR5 — no third-party demand; more specific.
3-year spreadsheet of claims with paid/reservedclaim_assertionP6 loss_runR10 — 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 systemWhat it does with the verdict
Claims triage / workflowThe 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 / regulatoryA regulatory_action starts the statutory response and breach-notification clocks automatically — the class is the trigger that a deadline exists.
Underwriting workbenchData 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 pipelineThe 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 / DMSFiles itself under the right record and folder, coded consistently — no manual indexing, and searchable by business class.
RPA / straight-through botsBots switch on the code to pick the next action — acknowledge, assign, decline, or escalate — without bespoke per-document logic.
Policy administrationpolicy_contract and coverage_position route to policy/coverage systems instead of the claims queue.
Analytics / portfolioConsistent 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 DocumentClass record. 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 DocumentClass row — the prompts render from the taxonomy, so new classes flow through to every consumer without a code change.
InsightXtract document classes — the shared P&C taxonomy that classification assigns and downstream systems consume by stable code
Document classes are real, governed records — the shared vocabulary every downstream system reads.

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.