Download (PDF)
Parity report · sample · Beers Labs LLC
Ironparse Parity Report — ACORD_AL3_NIGHTMARE.CPY

The artifact every pilot delivers, one per copybook. Every number reproduces from the input — re-run the engine inside your perimeter and the hashes match.

1 · Engagement & verdict

Copybook
ACORD_AL3_NIGHTMARE.CPY
Run environment
customer VPC — zero data egress
Verdict
PASS

2 · Provenance (reproduce this)

Input SHA-256
a3297567bd4b766668235bd20706da1f2bae39e842c5bbf43f5224de2d01cf0c
Output SHA-256
e3b252076d57ee9fe348d14c4dab30e0d4a896a5551dd043b8be75b2cb40249a
Determinism
same input → identical output hash, every run

3 · Structure

Records
11
Elementary fields
80
REDEFINES overlays
2
OCCURS (incl. ODO)
8

4 · Quality gates

#GateResultWhat it provesMeasure
01PARSERPASSDeterministic AST extraction yields a non-empty, field-bearing record set. No LLM involved.11 records · 80 elementary fields
02SCHEMA_SANITYPASSCandidate schema parses as valid Zod — balanced delimiters, no markdown fences, no prose.valid Zod module
03FIELD_PARITYPASSlen(COBOL elementary fields) === len(emitted schema leaves). Off by one and the build fails.COBOL 80 ⇄ schema 80
04DARK_CORNERPASSEvery 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
05MOCK_STRUCTUREPASSA mock document generated from the schema re-validates against it — the schema is internally consistent.82 nodes round-tripped

5 · Field-for-field mapping · 80 fields

COBOL fieldPICStorageSchema pathType
 TRANSACTION-TYPEX(4)alphanumeric (4 chars)acordAl3Record.transactionTypez.string().max(4)
 MESSAGE-IDX(8)alphanumeric (8 chars)acordAl3Record.messageIdz.string().max(8)
 TIMESTAMPX(26)alphanumeric (26 chars)acordAl3Record.timestampz.string().max(26)
 STATE-CODEX(2)alphanumeric (2 chars)acordAl3Record.stateCodez.string().max(2)
 CARRIER-CODEX(4)alphanumeric (4 chars)acordAl3Record.carrierCodez.string().max(4)
 POLICY-NUMBERX(20)alphanumeric (20 chars)acordAl3Record.policyNumberz.string().max(20)
 NAME-TYPEX(1)alphanumeric (1 chars)insuredNameData.nameTypez.string().max(1)
 INSURED-LAST-NAMEX(30)alphanumeric (30 chars)insuredNameData.insuredLastNamez.string().max(30)
 INSURED-FIRST-NAMEX(20)alphanumeric (20 chars)insuredNameData.insuredFirstNamez.string().max(20)
 INSURED-MIDDLE-NAMEX(15)alphanumeric (15 chars)insuredNameData.insuredMiddleNamez.string().max(15)
 INSURED-SUFFIXX(10)alphanumeric (10 chars)insuredNameData.insuredSuffixz.string().max(10)
 ADDR-INDICATORX(1)alphanumeric (1 chars)insuredAddressData.addrIndicatorz.string().max(1)
 ADDRESS-LINE-1X(35)alphanumeric (35 chars)insuredAddressData.addressLine1z.string().max(35)
 ADDRESS-LINE-2X(35)alphanumeric (35 chars)insuredAddressData.addressLine2z.string().max(35)
 CITYX(25)alphanumeric (25 chars)insuredAddressData.cityz.string().max(25)
 STATEX(2)alphanumeric (2 chars)insuredAddressData.statez.string().max(2)
 ZIP-CODEX(9)alphanumeric (9 chars)insuredAddressData.zipCodez.string().max(9)
 POLICY-EFF-DATEX(8)alphanumeric (8 chars)policyInfo.policyEffDatez.string().max(8)
 POLICY-EXP-DATEX(8)alphanumeric (8 chars)policyInfo.policyExpDatez.string().max(8)
 PREMIUM-AMOUNTS9(9)V99 COMP-3packed decimal (COMP-3, signed, scaled)policyInfo.premiumAmountz.number()
 PREMIUM-PAYMENT-MODEX(1)alphanumeric (1 chars)policyInfo.premiumPaymentModez.string().max(1)
 POLICY-STATUSX(1)alphanumeric (1 chars)policyInfo.policyStatusz.string().max(1)
 VEHICLE-COUNT9(2)display numeric (2 digits)vehicleDetail.vehicleCountz.string().regex(/^\d{1,2}$/)
  VINX(17)alphanumeric (17 chars)vehicleDetail.vehicleEntry[].vinz.string().max(17)
  YEAR9(4)display numeric (4 digits)vehicleDetail.vehicleEntry[].yearz.string().regex(/^\d{1,4}$/)
  MAKEX(15)alphanumeric (15 chars)vehicleDetail.vehicleEntry[].makez.string().max(15)
  MODELX(20)alphanumeric (20 chars)vehicleDetail.vehicleEntry[].modelz.string().max(20)
  VEHICLE-CLASSX(3)alphanumeric (3 chars)vehicleDetail.vehicleEntry[].vehicleClassz.string().max(3)
  COVERAGE-AMOUNTS9(7)V99 COMP-3packed decimal (COMP-3, signed, scaled)vehicleDetail.vehicleEntry[].coverageAmountz.number()
  DEDUCTIBLE-AMOUNTS9(5)V99 COMP-3packed decimal (COMP-3, signed, scaled)vehicleDetail.vehicleEntry[].deductibleAmountz.number()
  DRIVER-COUNT9(1)display numeric (1 digits)vehicleDetail.vehicleEntry[].driverCountz.string().regex(/^\d{1,1}$/)
   DRIVER-NAMEX(30)alphanumeric (30 chars)vehicleDetail.vehicleEntry[].driverList[].driverNamez.string().max(30)
   DRIVER-LICENSEX(20)alphanumeric (20 chars)vehicleDetail.vehicleEntry[].driverList[].driverLicensez.string().max(20)
   DRIVER-DOBX(8)alphanumeric (8 chars)vehicleDetail.vehicleEntry[].driverList[].driverDobz.string().max(8)
   DRIVER-RELATIONX(1)alphanumeric (1 chars)vehicleDetail.vehicleEntry[].driverList[].driverRelationz.string().max(1)
 DH-RECORD-TYPEX(1)alphanumeric (1 chars)driverHistory.dhRecordTypez.string().max(1)
 DH-LAST-UPDATEX(8)alphanumeric (8 chars)driverHistory.dhLastUpdatez.string().max(8)
 DH-ACCIDENT-COUNT9(2)display numeric (2 digits)driverHistory.dhAccidentCountz.string().regex(/^\d{1,2}$/)
 DH-VIOLATION-COUNT9(2)display numeric (2 digits)driverHistory.dhViolationCountz.string().regex(/^\d{1,2}$/)
 DH-MVR-SCORE9(3)display numeric (3 digits)driverHistory.dhMvrScorez.string().regex(/^\d{1,3}$/)
  DH-CLAIM-DATEX(8)alphanumeric (8 chars)driverHistory.dhClaimHistory[].dhClaimDatez.string().max(8)
  DH-CLAIM-AMOUNTS9(6)V99 COMP-3packed decimal (COMP-3, signed, scaled)driverHistory.dhClaimHistory[].dhClaimAmountz.number()
  DH-CLAIM-TYPEX(2)alphanumeric (2 chars)driverHistory.dhClaimHistory[].dhClaimTypez.string().max(2)
 COVERAGE-COUNT9(2)display numeric (2 digits)coverageOptions.coverageCountz.string().regex(/^\d{1,2}$/)
  COVERAGE-TYPEX(3)alphanumeric (3 chars)coverageOptions.coverageEntry[].coverageTypez.string().max(3)
  COVERAGE-LIMITS9(7)V99 COMP-3packed decimal (COMP-3, signed, scaled)coverageOptions.coverageEntry[].coverageLimitz.number()
  COVERAGE-PREMIUMS9(6)V99 COMP-3packed decimal (COMP-3, signed, scaled)coverageOptions.coverageEntry[].coveragePremiumz.number()
  COVERAGE-STATUSX(1)alphanumeric (1 chars)coverageOptions.coverageEntry[].coverageStatusz.string().max(1)
  DEDUCTIBLE-APPLIEDS9(5)V99 COMP-3packed decimal (COMP-3, signed, scaled)coverageOptions.coverageEntry[].deductibleAppliedz.number()
 SUPPLEMENT-COUNT9(2)display numeric (2 digits)supplementalExposures.supplementCountz.string().regex(/^\d{1,2}$/)
  SUPPLEMENT-TYPEX(4)alphanumeric (4 chars)supplementalExposures.supplementData[].supplementTypez.string().max(4)
  SUPPLEMENT-CODEX(6)alphanumeric (6 chars)supplementalExposures.supplementData[].supplementCodez.string().max(6)
  SUPPLEMENT-DESCX(50)alphanumeric (50 chars)supplementalExposures.supplementData[].supplementDescz.string().max(50)
  SUPPLEMENT-AMOUNTS9(7)V99 COMP-3packed decimal (COMP-3, signed, scaled)supplementalExposures.supplementData[].supplementAmountz.number()
  EXCLUSION-INDX(1)alphanumeric (1 chars)supplementalExposures.supplementData[].exclusionIndz.string().max(1)
 TOTAL-CLAIMS9(3)display numeric (3 digits)claimHistoryRecord.totalClaimsz.string().regex(/^\d{1,3}$/)
  CLAIM-DATEX(8)alphanumeric (8 chars)claimHistoryRecord.claimDetails[].claimDatez.string().max(8)
  CLAIM-TYPEX(2)alphanumeric (2 chars)claimHistoryRecord.claimDetails[].claimTypez.string().max(2)
  CLAIM-AMOUNTS9(8)V99 COMP-3packed decimal (COMP-3, signed, scaled)claimHistoryRecord.claimDetails[].claimAmountz.number()
  CLAIM-STATUSX(1)alphanumeric (1 chars)claimHistoryRecord.claimDetails[].claimStatusz.string().max(1)
  CLAIM-DESCRIPTIONX(100)alphanumeric (100 chars)claimHistoryRecord.claimDetails[].claimDescriptionz.string().max(100)
  LOSS-DATEX(8)alphanumeric (8 chars)claimHistoryRecord.claimDetails[].lossDatez.string().max(8)
  REPORT-DATEX(8)alphanumeric (8 chars)claimHistoryRecord.claimDetails[].reportDatez.string().max(8)
 BILL-ACCOUNT-NUMBERX(15)alphanumeric (15 chars)billingAccount.billAccountNumberz.string().max(15)
 BILL-PAYMENT-TYPEX(1)alphanumeric (1 chars)billingAccount.billPaymentTypez.string().max(1)
 BILL-CREDIT-CARDX(16)alphanumeric (16 chars)billingAccount.billCreditCardz.string().max(16)
 BILL-EXPIRYX(4)alphanumeric (4 chars)billingAccount.billExpiryz.string().max(4)
 BILL-AUTH-CODEX(10)alphanumeric (10 chars)billingAccount.billAuthCodez.string().max(10)
 LAST-PAYMENT-DATEX(8)alphanumeric (8 chars)billingAccount.lastPaymentDatez.string().max(8)
 LAST-PAYMENT-AMOUNTS9(7)V99 COMP-3packed decimal (COMP-3, signed, scaled)billingAccount.lastPaymentAmountz.number()
 BALANCE-DUES9(8)V99 COMP-3packed decimal (COMP-3, signed, scaled)billingAccount.balanceDuez.number()
  PAY-DATEX(8)alphanumeric (8 chars)billingAccount.paymentHistory[].payDatez.string().max(8)
  PAY-AMOUNTS9(6)V99 COMP-3packed decimal (COMP-3, signed, scaled)billingAccount.paymentHistory[].payAmountz.number()
  PAY-RESULTX(2)alphanumeric (2 chars)billingAccount.paymentHistory[].payResultz.string().max(2)
 NOTE-COUNT9(2)display numeric (2 digits)notesAndRemarks.noteCountz.string().regex(/^\d{1,2}$/)
  NOTE-DATEX(8)alphanumeric (8 chars)notesAndRemarks.noteEntry[].noteDatez.string().max(8)
  NOTE-AUTHORX(20)alphanumeric (20 chars)notesAndRemarks.noteEntry[].noteAuthorz.string().max(20)
  NOTE-TYPEX(1)alphanumeric (1 chars)notesAndRemarks.noteEntry[].noteTypez.string().max(1)
  NOTE-TEXTX(200)alphanumeric (200 chars)notesAndRemarks.noteEntry[].noteTextz.string().max(200)
  NOTE-STATUSX(1)alphanumeric (1 chars)notesAndRemarks.noteEntry[].noteStatusz.string().max(1)

6 · Emitted schema

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>;

Ironparse · Beers Labs LLC · pilots@ironparse.com · ironparse.com — Ironparse processed no data outside your network.