The receipt room · live trace
Parity receipt
The hardest known ACORD AL3 transmission record: nested REDEFINES overlays and nested OCCURS DEPENDING ON arrays. Where general-purpose LLMs fall apart.
Verdict
PASS
Records
11
Elementary fields
80
REDEFINES
2
OCCURS
8
Five quality gates
| 01 | PARSER | PASS | Deterministic AST extraction yields a non-empty, field-bearing record set. No LLM involved. | 11 records · 80 elementary fields |
| 02 | SCHEMA_SANITY | PASS | Candidate schema parses as valid Zod — balanced delimiters, no markdown fences, no prose. | valid Zod module |
| 03 | FIELD_PARITY | PASS | len(COBOL elementary fields) === len(emitted schema leaves). Off by one and the build fails. | COBOL 80 ⇄ schema 80 |
| 04 | DARK_CORNER | PASS | Every REDEFINES overlay compiles to a union (discriminated where a record-type byte exists); every OCCURS to a dynamic array. | 2/2 overlays · 8/8 arrays |
| 05 | MOCK_STRUCTURE | PASS | A mock document generated from the schema re-validates against it — the schema is internally consistent. | 82 nodes round-tripped |
Field-for-field mapping · 80 elementary fields
| COBOL field | PIC | Storage | Schema path | Type |
|---|---|---|---|---|
| TRANSACTION-TYPE | X(4) | alphanumeric (4 chars) | acordAl3Record.transactionType | z.string().max(4) |
| MESSAGE-ID | X(8) | alphanumeric (8 chars) | acordAl3Record.messageId | z.string().max(8) |
| TIMESTAMP | X(26) | alphanumeric (26 chars) | acordAl3Record.timestamp | z.string().max(26) |
| STATE-CODE | X(2) | alphanumeric (2 chars) | acordAl3Record.stateCode | z.string().max(2) |
| CARRIER-CODE | X(4) | alphanumeric (4 chars) | acordAl3Record.carrierCode | z.string().max(4) |
| POLICY-NUMBER | X(20) | alphanumeric (20 chars) | acordAl3Record.policyNumber | z.string().max(20) |
| NAME-TYPE | X(1) | alphanumeric (1 chars) | insuredNameData.nameType | z.string().max(1) |
| INSURED-LAST-NAME | X(30) | alphanumeric (30 chars) | insuredNameData.insuredLastName | z.string().max(30) |
| INSURED-FIRST-NAME | X(20) | alphanumeric (20 chars) | insuredNameData.insuredFirstName | z.string().max(20) |
| INSURED-MIDDLE-NAME | X(15) | alphanumeric (15 chars) | insuredNameData.insuredMiddleName | z.string().max(15) |
| INSURED-SUFFIX | X(10) | alphanumeric (10 chars) | insuredNameData.insuredSuffix | z.string().max(10) |
| ADDR-INDICATOR | X(1) | alphanumeric (1 chars) | insuredAddressData.addrIndicator | z.string().max(1) |
| ADDRESS-LINE-1 | X(35) | alphanumeric (35 chars) | insuredAddressData.addressLine1 | z.string().max(35) |
| ADDRESS-LINE-2 | X(35) | alphanumeric (35 chars) | insuredAddressData.addressLine2 | z.string().max(35) |
| CITY | X(25) | alphanumeric (25 chars) | insuredAddressData.city | z.string().max(25) |
| STATE | X(2) | alphanumeric (2 chars) | insuredAddressData.state | z.string().max(2) |
| ZIP-CODE | X(9) | alphanumeric (9 chars) | insuredAddressData.zipCode | z.string().max(9) |
| POLICY-EFF-DATE | X(8) | alphanumeric (8 chars) | policyInfo.policyEffDate | z.string().max(8) |
| POLICY-EXP-DATE | X(8) | alphanumeric (8 chars) | policyInfo.policyExpDate | z.string().max(8) |
| PREMIUM-AMOUNT | S9(9)V99 COMP-3 | packed decimal (COMP-3, signed, scaled) | policyInfo.premiumAmount | z.number() |
| PREMIUM-PAYMENT-MODE | X(1) | alphanumeric (1 chars) | policyInfo.premiumPaymentMode | z.string().max(1) |
| POLICY-STATUS | X(1) | alphanumeric (1 chars) | policyInfo.policyStatus | z.string().max(1) |
| VEHICLE-COUNT | 9(2) | display numeric (2 digits) | vehicleDetail.vehicleCount | z.string().regex(/^\d{1,2}$/) |
| VIN | X(17) | alphanumeric (17 chars) | vehicleDetail.vehicleEntry[].vin | z.string().max(17) |
| YEAR | 9(4) | display numeric (4 digits) | vehicleDetail.vehicleEntry[].year | z.string().regex(/^\d{1,4}$/) |
| MAKE | X(15) | alphanumeric (15 chars) | vehicleDetail.vehicleEntry[].make | z.string().max(15) |
| MODEL | X(20) | alphanumeric (20 chars) | vehicleDetail.vehicleEntry[].model | z.string().max(20) |
| VEHICLE-CLASS | X(3) | alphanumeric (3 chars) | vehicleDetail.vehicleEntry[].vehicleClass | z.string().max(3) |
| COVERAGE-AMOUNT | S9(7)V99 COMP-3 | packed decimal (COMP-3, signed, scaled) | vehicleDetail.vehicleEntry[].coverageAmount | z.number() |
| DEDUCTIBLE-AMOUNT | S9(5)V99 COMP-3 | packed decimal (COMP-3, signed, scaled) | vehicleDetail.vehicleEntry[].deductibleAmount | z.number() |
| DRIVER-COUNT | 9(1) | display numeric (1 digits) | vehicleDetail.vehicleEntry[].driverCount | z.string().regex(/^\d{1,1}$/) |
| DRIVER-NAME | X(30) | alphanumeric (30 chars) | vehicleDetail.vehicleEntry[].driverList[].driverName | z.string().max(30) |
| DRIVER-LICENSE | X(20) | alphanumeric (20 chars) | vehicleDetail.vehicleEntry[].driverList[].driverLicense | z.string().max(20) |
| DRIVER-DOB | X(8) | alphanumeric (8 chars) | vehicleDetail.vehicleEntry[].driverList[].driverDob | z.string().max(8) |
| DRIVER-RELATION | X(1) | alphanumeric (1 chars) | vehicleDetail.vehicleEntry[].driverList[].driverRelation | z.string().max(1) |
| DH-RECORD-TYPE | X(1) | alphanumeric (1 chars) | driverHistory.dhRecordType | z.string().max(1) |
| DH-LAST-UPDATE | X(8) | alphanumeric (8 chars) | driverHistory.dhLastUpdate | z.string().max(8) |
| DH-ACCIDENT-COUNT | 9(2) | display numeric (2 digits) | driverHistory.dhAccidentCount | z.string().regex(/^\d{1,2}$/) |
| DH-VIOLATION-COUNT | 9(2) | display numeric (2 digits) | driverHistory.dhViolationCount | z.string().regex(/^\d{1,2}$/) |
| DH-MVR-SCORE | 9(3) | display numeric (3 digits) | driverHistory.dhMvrScore | z.string().regex(/^\d{1,3}$/) |
| DH-CLAIM-DATE | X(8) | alphanumeric (8 chars) | driverHistory.dhClaimHistory[].dhClaimDate | z.string().max(8) |
| DH-CLAIM-AMOUNT | S9(6)V99 COMP-3 | packed decimal (COMP-3, signed, scaled) | driverHistory.dhClaimHistory[].dhClaimAmount | z.number() |
| DH-CLAIM-TYPE | X(2) | alphanumeric (2 chars) | driverHistory.dhClaimHistory[].dhClaimType | z.string().max(2) |
| COVERAGE-COUNT | 9(2) | display numeric (2 digits) | coverageOptions.coverageCount | z.string().regex(/^\d{1,2}$/) |
| COVERAGE-TYPE | X(3) | alphanumeric (3 chars) | coverageOptions.coverageEntry[].coverageType | z.string().max(3) |
| COVERAGE-LIMIT | S9(7)V99 COMP-3 | packed decimal (COMP-3, signed, scaled) | coverageOptions.coverageEntry[].coverageLimit | z.number() |
| COVERAGE-PREMIUM | S9(6)V99 COMP-3 | packed decimal (COMP-3, signed, scaled) | coverageOptions.coverageEntry[].coveragePremium | z.number() |
| COVERAGE-STATUS | X(1) | alphanumeric (1 chars) | coverageOptions.coverageEntry[].coverageStatus | z.string().max(1) |
| DEDUCTIBLE-APPLIED | S9(5)V99 COMP-3 | packed decimal (COMP-3, signed, scaled) | coverageOptions.coverageEntry[].deductibleApplied | z.number() |
| SUPPLEMENT-COUNT | 9(2) | display numeric (2 digits) | supplementalExposures.supplementCount | z.string().regex(/^\d{1,2}$/) |
| SUPPLEMENT-TYPE | X(4) | alphanumeric (4 chars) | supplementalExposures.supplementData[].supplementType | z.string().max(4) |
| SUPPLEMENT-CODE | X(6) | alphanumeric (6 chars) | supplementalExposures.supplementData[].supplementCode | z.string().max(6) |
| SUPPLEMENT-DESC | X(50) | alphanumeric (50 chars) | supplementalExposures.supplementData[].supplementDesc | z.string().max(50) |
| SUPPLEMENT-AMOUNT | S9(7)V99 COMP-3 | packed decimal (COMP-3, signed, scaled) | supplementalExposures.supplementData[].supplementAmount | z.number() |
| EXCLUSION-IND | X(1) | alphanumeric (1 chars) | supplementalExposures.supplementData[].exclusionInd | z.string().max(1) |
| TOTAL-CLAIMS | 9(3) | display numeric (3 digits) | claimHistoryRecord.totalClaims | z.string().regex(/^\d{1,3}$/) |
| CLAIM-DATE | X(8) | alphanumeric (8 chars) | claimHistoryRecord.claimDetails[].claimDate | z.string().max(8) |
| CLAIM-TYPE | X(2) | alphanumeric (2 chars) | claimHistoryRecord.claimDetails[].claimType | z.string().max(2) |
| CLAIM-AMOUNT | S9(8)V99 COMP-3 | packed decimal (COMP-3, signed, scaled) | claimHistoryRecord.claimDetails[].claimAmount | z.number() |
| CLAIM-STATUS | X(1) | alphanumeric (1 chars) | claimHistoryRecord.claimDetails[].claimStatus | z.string().max(1) |
| CLAIM-DESCRIPTION | X(100) | alphanumeric (100 chars) | claimHistoryRecord.claimDetails[].claimDescription | z.string().max(100) |
| LOSS-DATE | X(8) | alphanumeric (8 chars) | claimHistoryRecord.claimDetails[].lossDate | z.string().max(8) |
| REPORT-DATE | X(8) | alphanumeric (8 chars) | claimHistoryRecord.claimDetails[].reportDate | z.string().max(8) |
| BILL-ACCOUNT-NUMBER | X(15) | alphanumeric (15 chars) | billingAccount.billAccountNumber | z.string().max(15) |
| BILL-PAYMENT-TYPE | X(1) | alphanumeric (1 chars) | billingAccount.billPaymentType | z.string().max(1) |
| BILL-CREDIT-CARD | X(16) | alphanumeric (16 chars) | billingAccount.billCreditCard | z.string().max(16) |
| BILL-EXPIRY | X(4) | alphanumeric (4 chars) | billingAccount.billExpiry | z.string().max(4) |
| BILL-AUTH-CODE | X(10) | alphanumeric (10 chars) | billingAccount.billAuthCode | z.string().max(10) |
| LAST-PAYMENT-DATE | X(8) | alphanumeric (8 chars) | billingAccount.lastPaymentDate | z.string().max(8) |
| LAST-PAYMENT-AMOUNT | S9(7)V99 COMP-3 | packed decimal (COMP-3, signed, scaled) | billingAccount.lastPaymentAmount | z.number() |
| BALANCE-DUE | S9(8)V99 COMP-3 | packed decimal (COMP-3, signed, scaled) | billingAccount.balanceDue | z.number() |
| PAY-DATE | X(8) | alphanumeric (8 chars) | billingAccount.paymentHistory[].payDate | z.string().max(8) |
| PAY-AMOUNT | S9(6)V99 COMP-3 | packed decimal (COMP-3, signed, scaled) | billingAccount.paymentHistory[].payAmount | z.number() |
| PAY-RESULT | X(2) | alphanumeric (2 chars) | billingAccount.paymentHistory[].payResult | z.string().max(2) |
| NOTE-COUNT | 9(2) | display numeric (2 digits) | notesAndRemarks.noteCount | z.string().regex(/^\d{1,2}$/) |
| NOTE-DATE | X(8) | alphanumeric (8 chars) | notesAndRemarks.noteEntry[].noteDate | z.string().max(8) |
| NOTE-AUTHOR | X(20) | alphanumeric (20 chars) | notesAndRemarks.noteEntry[].noteAuthor | z.string().max(20) |
| NOTE-TYPE | X(1) | alphanumeric (1 chars) | notesAndRemarks.noteEntry[].noteType | z.string().max(1) |
| NOTE-TEXT | X(200) | alphanumeric (200 chars) | notesAndRemarks.noteEntry[].noteText | z.string().max(200) |
| NOTE-STATUS | X(1) | alphanumeric (1 chars) | notesAndRemarks.noteEntry[].noteStatus | z.string().max(1) |
Emitted schema · TypeScript + Zod
import { z } from "zod";
export const RecordSchema = z.object({
acordAl3Record: z.object({
transactionType: z.string().max(4),
messageId: z.string().max(8),
timestamp: z.string().max(26),
stateCode: z.string().max(2),
carrierCode: z.string().max(4),
policyNumber: z.string().max(20),
}),
// REDEFINES overlay: INSURED-NAME-DATA / INSURED-ADDRESS-DATA
insuredNameData: z.union([
z.object({
nameType: z.string().max(1),
insuredLastName: z.string().max(30),
insuredFirstName: z.string().max(20),
insuredMiddleName: z.string().max(15),
insuredSuffix: z.string().max(10),
}),
z.object({
addrIndicator: z.string().max(1),
addressLine1: z.string().max(35),
addressLine2: z.string().max(35),
city: z.string().max(25),
state: z.string().max(2),
zipCode: z.string().max(9),
})
]),
policyInfo: z.object({
policyEffDate: z.string().max(8),
policyExpDate: z.string().max(8),
premiumAmount: z.number(),
premiumPaymentMode: z.string().max(1),
policyStatus: z.string().max(1),
}),
// REDEFINES overlay: VEHICLE-DETAIL / DRIVER-HISTORY
vehicleDetail: z.union([
z.object({
vehicleCount: z.string().regex(/^\d{1,2}$/),
vehicleEntry: z.array(z.object({
vin: z.string().max(17),
year: z.string().regex(/^\d{1,4}$/),
make: z.string().max(15),
model: z.string().max(20),
vehicleClass: z.string().max(3),
coverageAmount: z.number(),
deductibleAmount: z.number(),
driverCount: z.string().regex(/^\d{1,1}$/),
driverList: z.array(z.object({
driverName: z.string().max(30),
driverLicense: z.string().max(20),
driverDob: z.string().max(8),
driverRelation: z.string().max(1),
})).max(5) /* OCCURS 0..5 DEPENDING ON DRIVER-COUNT */,
})).max(10) /* OCCURS 0..10 DEPENDING ON VEHICLE-COUNT */,
}),
z.object({
dhRecordType: z.string().max(1),
dhLastUpdate: z.string().max(8),
dhAccidentCount: z.string().regex(/^\d{1,2}$/),
dhViolationCount: z.string().regex(/^\d{1,2}$/),
dhMvrScore: z.string().regex(/^\d{1,3}$/),
dhClaimHistory: z.array(z.object({
dhClaimDate: z.string().max(8),
dhClaimAmount: z.number(),
dhClaimType: z.string().max(2),
})).max(5) /* OCCURS 5 */,
})
]),
coverageOptions: z.object({
coverageCount: z.string().regex(/^\d{1,2}$/),
coverageEntry: z.array(z.object({
coverageType: z.string().max(3),
coverageLimit: z.number(),
coveragePremium: z.number(),
coverageStatus: z.string().max(1),
deductibleApplied: z.number(),
})).max(8) /* OCCURS 0..8 DEPENDING ON COVERAGE-COUNT */,
}),
supplementalExposures: z.object({
supplementCount: z.string().regex(/^\d{1,2}$/),
supplementData: z.array(z.object({
supplementType: z.string().max(4),
supplementCode: z.string().max(6),
supplementDesc: z.string().max(50),
supplementAmount: z.number(),
exclusionInd: z.string().max(1),
})).max(20) /* OCCURS 0..20 DEPENDING ON SUPPLEMENT-COUNT */,
}),
claimHistoryRecord: z.object({
totalClaims: z.string().regex(/^\d{1,3}$/),
claimDetails: z.array(z.object({
claimDate: z.string().max(8),
claimType: z.string().max(2),
claimAmount: z.number(),
claimStatus: z.string().max(1),
claimDescription: z.string().max(100),
lossDate: z.string().max(8),
reportDate: z.string().max(8),
})).max(15) /* OCCURS 0..15 DEPENDING ON TOTAL-CLAIMS */,
}),
billingAccount: z.object({
billAccountNumber: z.string().max(15),
billPaymentType: z.string().max(1),
billCreditCard: z.string().max(16),
billExpiry: z.string().max(4),
billAuthCode: z.string().max(10),
lastPaymentDate: z.string().max(8),
lastPaymentAmount: z.number(),
balanceDue: z.number(),
paymentHistory: z.array(z.object({
payDate: z.string().max(8),
payAmount: z.number(),
payResult: z.string().max(2),
})).max(12) /* OCCURS 12 */,
}),
notesAndRemarks: z.object({
noteCount: z.string().regex(/^\d{1,2}$/),
noteEntry: z.array(z.object({
noteDate: z.string().max(8),
noteAuthor: z.string().max(20),
noteType: z.string().max(1),
noteText: z.string().max(200),
noteStatus: z.string().max(1),
})).max(10) /* OCCURS 0..10 DEPENDING ON NOTE-COUNT */,
}),
});
export type Record = z.infer<typeof RecordSchema>;
Source copybook
Show ACORD_AL3_NIGHTMARE.CPY
01 ACORD-AL3-RECORD.
02 TRANSACTION-TYPE PIC X(4).
02 MESSAGE-ID PIC X(8).
02 TIMESTAMP PIC X(26).
02 STATE-CODE PIC X(2).
02 CARRIER-CODE PIC X(4).
02 POLICY-NUMBER PIC X(20).
01 INSURED-NAME-DATA.
02 NAME-TYPE PIC X(1).
02 INSURED-LAST-NAME PIC X(30).
02 INSURED-FIRST-NAME PIC X(20).
02 INSURED-MIDDLE-NAME PIC X(15).
02 INSURED-SUFFIX PIC X(10).
01 INSURED-ADDRESS-DATA REDEFINES INSURED-NAME-DATA.
02 ADDR-INDICATOR PIC X(1).
02 ADDRESS-LINE-1 PIC X(35).
02 ADDRESS-LINE-2 PIC X(35).
02 CITY PIC X(25).
02 STATE PIC X(2).
02 ZIP-CODE PIC X(9).
01 POLICY-INFO.
02 POLICY-EFF-DATE PIC X(8).
02 POLICY-EXP-DATE PIC X(8).
02 PREMIUM-AMOUNT PIC S9(9)V99 COMP-3.
02 PREMIUM-PAYMENT-MODE PIC X(1).
02 POLICY-STATUS PIC X(1).
01 VEHICLE-DETAIL.
02 VEHICLE-COUNT PIC 9(2).
02 VEHICLE-ENTRY OCCURS 0 TO 10 TIMES DEPENDING ON VEHICLE-COUNT.
03 VIN PIC X(17).
03 YEAR PIC 9(4).
03 MAKE PIC X(15).
03 MODEL PIC X(20).
03 VEHICLE-CLASS PIC X(3).
03 COVERAGE-AMOUNT PIC S9(7)V99 COMP-3.
03 DEDUCTIBLE-AMOUNT PIC S9(5)V99 COMP-3.
03 DRIVER-COUNT PIC 9(1).
03 DRIVER-LIST OCCURS 0 TO 5 TIMES DEPENDING ON DRIVER-COUNT.
04 DRIVER-NAME PIC X(30).
04 DRIVER-LICENSE PIC X(20).
04 DRIVER-DOB PIC X(8).
04 DRIVER-RELATION PIC X(1).
01 DRIVER-HISTORY REDEFINES VEHICLE-DETAIL.
02 DH-RECORD-TYPE PIC X(1).
02 DH-LAST-UPDATE PIC X(8).
02 DH-ACCIDENT-COUNT PIC 9(2).
02 DH-VIOLATION-COUNT PIC 9(2).
02 DH-MVR-SCORE PIC 9(3).
02 DH-CLAIM-HISTORY OCCURS 5 TIMES.
03 DH-CLAIM-DATE PIC X(8).
03 DH-CLAIM-AMOUNT PIC S9(6)V99 COMP-3.
03 DH-CLAIM-TYPE PIC X(2).
01 COVERAGE-OPTIONS.
02 COVERAGE-COUNT PIC 9(2).
02 COVERAGE-ENTRY OCCURS 0 TO 8 TIMES DEPENDING ON COVERAGE-COUNT.
03 COVERAGE-TYPE PIC X(3).
03 COVERAGE-LIMIT PIC S9(7)V99 COMP-3.
03 COVERAGE-PREMIUM PIC S9(6)V99 COMP-3.
03 COVERAGE-STATUS PIC X(1).
03 DEDUCTIBLE-APPLIED PIC S9(5)V99 COMP-3.
01 SUPPLEMENTAL-EXPOSURES.
02 SUPPLEMENT-COUNT PIC 9(2).
02 SUPPLEMENT-DATA OCCURS 0 TO 20 TIMES DEPENDING ON SUPPLEMENT-COUNT.
03 SUPPLEMENT-TYPE PIC X(4).
03 SUPPLEMENT-CODE PIC X(6).
03 SUPPLEMENT-DESC PIC X(50).
03 SUPPLEMENT-AMOUNT PIC S9(7)V99 COMP-3.
03 EXCLUSION-IND PIC X(1).
01 CLAIM-HISTORY-RECORD.
02 TOTAL-CLAIMS PIC 9(3).
02 CLAIM-DETAILS OCCURS 0 TO 15 TIMES DEPENDING ON TOTAL-CLAIMS.
03 CLAIM-DATE PIC X(8).
03 CLAIM-TYPE PIC X(2).
03 CLAIM-AMOUNT PIC S9(8)V99 COMP-3.
03 CLAIM-STATUS PIC X(1).
03 CLAIM-DESCRIPTION PIC X(100).
03 LOSS-DATE PIC X(8).
03 REPORT-DATE PIC X(8).
01 BILLING-ACCOUNT.
02 BILL-ACCOUNT-NUMBER PIC X(15).
02 BILL-PAYMENT-TYPE PIC X(1).
02 BILL-CREDIT-CARD PIC X(16).
02 BILL-EXPIRY PIC X(4).
02 BILL-AUTH-CODE PIC X(10).
02 LAST-PAYMENT-DATE PIC X(8).
02 LAST-PAYMENT-AMOUNT PIC S9(7)V99 COMP-3.
02 BALANCE-DUE PIC S9(8)V99 COMP-3.
02 PAYMENT-HISTORY OCCURS 12 TIMES.
03 PAY-DATE PIC X(8).
03 PAY-AMOUNT PIC S9(6)V99 COMP-3.
03 PAY-RESULT PIC X(2).
01 NOTES-AND-REMARKS.
02 NOTE-COUNT PIC 9(2).
02 NOTE-ENTRY OCCURS 0 TO 10 TIMES DEPENDING ON NOTE-COUNT.
03 NOTE-DATE PIC X(8).
03 NOTE-AUTHOR PIC X(20).
03 NOTE-TYPE PIC X(1).
03 NOTE-TEXT PIC X(200).
03 NOTE-STATUS PIC X(1).Provenance
copybookACORD_AL3_NIGHTMARE.CPY
input SHA-256a3297567bd4b766668235bd20706da1f2bae39e842c5bbf43f5224de2d01cf0c
output SHA-256e3b252076d57ee9fe348d14c4dab30e0d4a896a5551dd043b8be75b2cb40249a
determinismsame input → identical output hash, every run
machine-readable/receipt.json?cb=al3