insurance-claims-orchestrator · git:20260917.135328f · 2026-09-17 · sha256 7851134ad19900ef
insurance-claims-orchestrator git:20260917.135328fA
Immutable. This exact content is served forever at /api/v1/blob/7851134ad19900ef.
---
name: insurance-claims-orchestrator
description: Orchestrate a two-call consent-first insurance claims intake sequence with CALL-E. Call 1 collects a structured loss report from the policyholder. Call 2 verifies coverage using Call 1 results. Ambiguous outcomes route to human review. Introduces the first state-passing multi-call pattern in the repo.
license: MIT
---
# insurance-claims-orchestrator
Use this skill when an agent needs to initiate an insurance claim intake on behalf of a policyholder using two sequential CALL-E calls, where the structured result of Call 1 directly gates and informs Call 2.
This skill does **not** approve or deny claims, quote settlement amounts, or make commitments on behalf of the insurer. It gathers structured evidence and routes to a human adjuster.
## When To Use
- Initiate an insurance claim on behalf of a policyholder who has consented to automated contact
- Run a structured two-call sequence where results of Call 1 gate Call 2
- Return machine-readable claim intake data to a downstream adjuster or CRM system
- Demonstrate the state-passing multi-call pattern for other builders to copy
## When Not To Use
- Do not use to approve or deny claims
- Do not use to collect payment, SSN, or banking information
- Do not use when the policyholder has not explicitly consented to automated contact
- Do not use outside 8:00 AM to 9:00 PM recipient local time
- Do not use for collections, marketing, or unsolicited outreach
## Required Inputs
- `phone`: E.164 phone number of the policyholder, explicitly authorized
- `insurer_name`: display name disclosed on the call
- `consent`: must be `true`
Optional (live mode only):
- `CALLE_API_KEY`: environment variable, required only for `--live` execution
## Calls
### Call 1 — Loss Report
Contacts the policyholder to collect:
- Incident description (claimant's own words)
- Incident date (ISO 8601)
- Estimated damage in dollars (or `null` if declined)
- Policy number confirmation
**Exit gates — Call 2 is blocked if:**
- `outcome` is anything other than `"completed"`
- `policy_number_confirmed` is `null`
- Both `incident_description` AND `incident_date` are `null`
Any blocked gate routes to human review, not Call 2.
### Call 2 — Coverage Verification
Uses Call 1 results to confirm:
- Policy number (read back by claimant)
- Policy active status
- Coverage type applicability
- Prior claims in the last 12 months
- Adjuster follow-up timeline
## How to Run
**Dry-run (no calls, no API key needed):**
```bash
cd apps/typescript/insurance-claims-orchestrator
npm install
npm run dry-run
```
**Validate result fixtures against schema:**
```bash
npm run validate-schema
```
**Live (requires CALLE_API_KEY):**
```bash
export CALLE_API_KEY=your_key_here
npx tsx src/index.ts --phone +1XXXXXXXXXX --live
```
## Result Schemas
Both calls return structured JSON validated against `references/schema.json`.
**Call 1 — LossReportResult:**
| Field | Type | Notes |
|---|---|---|
| `outcome` | enum | completed / voicemail / no_answer / refused / unclear |
| `incident_description` | string or null | Claimant's own words |
| `incident_date` | string or null | ISO 8601 or null |
| `estimated_damage` | number or null | Dollar value or null |
| `policy_number_confirmed` | string or null | As spoken by claimant |
**Call 2 — CoverageVerifyResult:**
| Field | Type | Notes |
|---|---|---|
| `outcome` | enum | completed / voicemail / no_answer / refused / unclear |
| `policy_active` | boolean or null | Null if not established |
| `coverage_verified` | enum | yes / no / unknown — never guessed |
| `prior_claims_12mo` | boolean or null | Null if declined |
| `adjuster_notified` | boolean | Whether adjuster follow-up was communicated |
| `claimant_questions` | string or null | Verbatim unanswered questions |
## Safety Contract
See `references/safety.md`. Key rules:
- AI disclosure is mandatory at the start of both calls
- SSN, credit card, bank account, and password fields are never requested
- Coverage decisions are never made or implied on the call
- Ambiguous outcomes route to human review — never auto-retry unclear results
- Phone numbers masked in all logs: first 4 chars + asterisks
- Dry-run is the default — `--live` flag required for real calls
## Idempotency
Each call execution is keyed by `sha256(phone + step_id + incident_date)`.
Re-running with the same inputs within 24 hours is a no-op, not a second call.
## Files
```
skills/insurance-claims-orchestrator/
├── SKILL.md <- This file
├── references/
│ ├── safety.md <- Safety contract and fail-closed dispositions
│ ├── schema.json <- JSON Schema for both result shapes
│ └── two-call-pattern.md <- Pattern guide for other builders
├── scripts/
│ ├── dry-run.ts <- Fixture-based demo (no calls placed)
│ ├── validate-schema.ts <- Validates result JSON against schema
│ └── fixtures/
│ ├── loss-report-result.json
│ └── coverage-verify-result.json
└── assets/
└── sequence-diagram.md <- Mermaid call flow diagram
```