# Changelog

## 2026-05-05

### Breaking changes

- **Coordinate types switched from integer to number.** `latitude`/`longitude`/`altitude` in `commonInsuredObjectData` are now `number`, with geographic bounds (lat −90..90, lon −180..180). Integer-only payloads will continue to validate, but decimal coordinates and below-sea-level altitudes are now expected.
- **Strict validation on `commonInsuredObjectData` standalone.** Added `unevaluatedProperties: false` at the root; payloads with unknown properties are now rejected when validating directly against `commonInsuredObjectData_V1`.
- **Property rename:** `subsidiaryRiskObject` → `subsidiaryRiskObjects` (building, trailer).

### Fixes

- **Licence array schemas now actually validate items.** `nauticalLicence` and `aviationLicence` were missing the `type: "array"` + `items` wrapper, so entries were silently unchecked. Now properly typed.
- **Broken `$ref` in `nauticalLicence`** (still pointing at the old `*Type` filename) fixed.
- **Typo in `insuredTrailerData.202601.json` `$id`** (`ininsured` → `insured`) fixed.

### Schema-structure changes

- **`subsidiaryRiskObjects` moved out of `commonInsuredObjectData $defs/common` to the top-level schema.** Consumers that extend `common` no longer inherit its strict items, so they can add their own item fields (e.g. `accessoriesValueExcludingVat`) without conflict. Standalone validation stays strict.
- **Bare-shape `subsidiaryRiskObjects`** (only `subsidiaryRiskObjectType`, `additionalProperties: false`) added to `insuredHouseholdPrivateData` and `insuredIndividualPersonData` so they accept the field without extras.
- **All properties moved into `$defs/common`** in `commonInsuredObjectData_V1`; the five consuming schemas continue to work unchanged via `#/$defs/common`.

### Renames

- `aviationLicenceType_V1.json` → `aviationLicenceCategory_V1.json`
- `nauticalLicenceType_V1.json` → `nauticalLicenceCategory_V1.json`
- (matching the existing `drivingLicenceCategory` convention; internal `$id` and `title` updated)

## 2026-05-06

### Breaking changes

- **`percentage` primitive is now a 0..1 fraction.** `shared/primitives/percentage_V1` was redefined as a decimal fraction (`0` = 0%, `1` = 100%) with `multipleOf 0.0001`. Existing producers must convert: e.g. `vatRate: 21.0` → `0.21`, `combustibleMaterialsPercentage: 15.12` → `0.1512`. Affects every schema that `$ref`s the percentage primitive (including `vatRecoverabilityPercentage` in vehicle/trailer, which was previously inlined).
- **Property renames** (callers must update field names):
  - `isRiskAddressSameAsPolicyHolderAdress` → `isRiskAddressSameAsPolicyHolderAddress`
  - `isPrefabDwellin` → `isPrefabDwelling`
  - `isDriverPolicyholder` → `isDriverPolicyHolder`
  - `accessoiresValueExcludingVat` → `accessoriesValueExcludingVat`
  - `geoGraphicalDescription` → `geographicalCoordinateDescription`
  - `url` → `documentUrl` on policyHolder document
  - `partyType` enum value `copolicyholder` → `coPolicyHolder`

### Fixes

- **`$id` and title** of `insuredBuildingAndAssociatedObjectsData` corrected (`AssiocatedObjects` typo).

## 2026-05-07

### Breaking changes

- **Driver licence wrapper changed.** `insuredMotorisedVehicleAndDriverData.driver.drivingLicence` now uses the same shape as policyHolder: `hasMultipleDrivingLicenceCategories` wrapper containing `response` + `licences[]`, with the wrapper required and `response` constrained to `const: true`.
- **Strict validation on vehicle subsidiary objects.** `additionalProperties: false` added to `subsidiaryRiskObjects.items` in `insuredMotorisedVehicleAndDriverData` (building/trailer were already strict).
- **`hasOngoingInvestigations` and `hasCompletedDefensiveDrivingCourse` flattened to nullable booleans.** Previously wrapped as `{ response: boolean | null }` objects with no other fields, now plain `boolean | null`. Affects `policyHolderOrCoPolicyHolderData` and `insuredMotorisedVehicleAndDriverData.driver`. Callers must send the value directly instead of nesting it under `response`.
- **Property rename:** `policyHolderOrCoPolicyHolderData.document` (single object) → `documents` (array).

### Fixes

- **`syndic` on `insuredBuildingAndAssociatedObjectsData`** now has a real `type`/`properties`/`additionalProperties` wrapper instead of being a no-op property bag.
- **`vatRecoverabilityPercentage` in vehicle and trailer** now `$ref`s the shared percentage primitive (previously inlined a divergent `multipleOf: 0.001`).
- **`$ref` style normalized** in `commonInsuredObjectData_V1`: dropped stray `../shared/` prefix from 7 refs for consistency with its `$id`.

### Sample payloads

- **`payloads/` directory replaced by `samples/`.** The single `-example.json` per schema was dropped in favor of paired `-sample.json` and `-question.json` files. VSCode `json.schemas` `fileMatch` globs updated accordingly.

### Code lists

- **`revenueInsurance` added to `guaranteeType_V1`.**

### Cleanup

- Removed unused shared schemas (no `$ref` pointed at them): `shared/licencePlate_V1`, `shared/phoneNumber_V1`, `shared/primitives/date_V1`, `shared/primitives/year_V1`, `shared/lists/coveragesType_V1`.
- **`shared/money_V1` retained** even though it is not yet `$ref`-ed by any schema. It is kept on purpose to document that monetary amounts in this package are expressed in EUR by convention (no currency field), so consumers and future schemas have a canonical money shape to reference.

### Additional notes

- **Code list values were not modified, even where errors or spelling mistakes are present.** Per a decision of the technical workgroup normalisation (WGN - Technic), code list values are out of scope for BrokerBridge changes. Any corrections to existing code list entries must go through the WGN - Technic process rather than being patched here.

## 2026-07-06

### Breaking changes

- **Property rename:** `hasMultipleDrivingLicenceCategories` → `hasOneOrMoreDrivingLicenceCategories` (driving licence wrapper on `policyHolderOrCoPolicyHolderData` and `insuredMotorisedVehicleAndDriverData.driver`).
- **Property rename:** `hasMultipleAviationLicenceCategories` → `hasOneOrMoreAviationLicenceCategories` (aviation licence wrapper on `policyHolderOrCoPolicyHolderData`).
- **Property rename:** `hasMultipleNauticalLicenceCategories` → `hasOneOrMoreNauticalLicenceCategories` (nautical licence wrapper on `policyHolderOrCoPolicyHolderData`).
- **`documents` array removed from `policyHolderOrCoPolicyHolderData`.** The `documents[]` property (each `{ documentType, documentUrl }`) added on 2026-05-07 was dropped from the schema and both sample files.
- **`partyType` on `policyHolderOrCoPolicyHolderData` is no longer nullable.** Dropped the `{ "type": "null" }` branch; it is now a required non-null `string` enum (`policyHolder` / `coPolicyHolder`). The question sample was updated from `null` to `"policyHolder"`.
- **Related-party objects renamed on `policyHolderOrCoPolicyHolderData`** (callers must update field names):
  - `bankAccountHolder` → `relatedBankAccountHolder`
  - `bankruptcyTrustee` → `relatedBankruptcyTrustee`

### Field constraints

- **`shared/address_V1` field lengths increased** (relaxation; existing data stays valid):
  - `streetName` maxLength `30` → `50`
  - `houseNumber` maxLength `5` → `11`
  - `boxNumber` maxLength `4` → `10`

### Code lists

- **`legalFormCode_V15`:** `privateCompany` → `privateLimitedCompany` (OpenProject #299). Intentional exception to the WGN - Technic "code list values are out of scope" policy noted under 2026-05-07.
- **`countryCode` bumped V4 → V5.** `countryCode_V5.json` replaces `countryCode_V4.json`; all `$ref`s repointed (`address_V1`, `policyHolderOrCoPolicyHolderData`, `insuredMotorisedVehicleAndDriverData`) and the V4 file removed.
- **Duplicate "old" country entries dropped from `countryCode_V5`** (each was a second code for a country already present):
  - `RCA` (`CentralAfricanRepublicOld`) — kept `CF` (`CentralAfricanRepublic`)
  - `SUD` (`SudanOld`) — kept `SD` (`Sudan`)
  - `TP` (`EastTimorOld`) — kept `TL` (`EastTimor`)
- **`fuelCode` bumped V7 → V8.** `fuelCode_V8.json` replaces `fuelCode_V7.json` (ref in `insuredMotorisedVehicleAndDriverData` repointed, V7 file removed) and adds a new value: `33` (`DieselAndHydrogen`).
- **`documentType_V1`: 8 new document types added** — `documentManagmentRegulations`, `documentKeyInformationDocument`, `documentInsuranceProductInformationDocument`, `documentSustainabilityInfoSheet`, `documentFinancialInfoSheet`, `documentInfoSheet2ndPillar`, `documentInfoSheetDeathInsurance`, `documentSolidarityRegulation`.

## 2026-07-07

### Schema-structure changes

- **Nullability relocated from code lists to the point of use.** The `anyOf: [ { type: "string", enum: [...] }, { type: "null" } ]` wrapper was removed from all 71 code-list files under `shared/lists/**`; each is now a bare `type: "string"` + `enum` and no longer permits `null` on its own. Nullable list-typed fields now re-add the null branch at the reference site via `anyOf: [ { $ref }, { type: "null" } ]` — applied in `shared/address_V1` (`addressIdentifierResponsibleAgency`, `countryCode`), `shared/name_V1` (`title`), `shared/commonInsuredObjectData_V1`, and the six domain schemas. Net validation behaviour is unchanged for every field that was already wrapped in an `anyOf` at its reference site.

### Breaking changes

- **`objectType` is no longer nullable.** It is referenced by a bare `$ref` (not wrapped in `anyOf`/null) and is `required`, and `objectType_V1` no longer carries a null branch, so `null` is now rejected. The six `-question` sample files were updated from `null` to a concrete object type (e.g. `objectInsuredTrailer`, `objectInsuredBuilding`, `objectInsuredGoods`).

### Code lists

- **`objectType_V1`:** value `objectInsuredConstructionSiteOld` renamed to `objectInsuredConstructionSite`.
- **`motherTongueLanguage` bumped `V2` → `V3`:** added value `romanian` (23 values). Referenced from `insuredIndividualPersonData` and `policyHolderOrCoPolicyHolderData`.
- **`documentType_V1`: 30 values removed** (164 → 134): `documentAntiTheftCertificate`, `documentCertifcateLiabilityHunting`, `documentClaimDeclaration`, `documentClaimsHandlingLetter`, `documentConfirmationFollowingVisitVictim`, `documentContractGroupingDescription`, `documentCreditorAgreesToArrangement`, `documentCustomerProfileQuestionnaireFaor`, `documentCustomerProfileQuestionnaireInsurance`, `documentCustomerProfileQuestionnaireLife`, `documentCyLetterPortfolioScrutiny`, `documentDirectDebitChangeBankAccount`, `documentDirectDebitWithdrawal`, `documentDrivingAbilityMedicalCertificate`, `documentEmail`, `documentEmployerCertificate`, `documentFamilyAllowanceCertificate`, `documentInformationAboutBodilyInjuries`, `documentInformationAboutMedicalCosts`, `documentLeasingCertificate`, `documentMotorcycleCertificate`, `documentNoticeOfDebtAcknowledgement`, `documentPrecontractLifeOrInvestment`, `documentPrecontractNonLife`, `documentPreviousPolicy`, `documentProductSheetLegalInfo`, `documentProperReport`, `documentSpecialClausesNonCodeAble`, `documentVesselLiabilityCertificate`, `documentYearlyContractReportAsOfInsurer`.

## 2026-08-20

### New message: claim context

- **`schemas/claimFileData.202701.json` added.** The Telebib2 contextual claim message (MIG `ECLAFILN` v4, source `EvCDonClaim.202701`) is ported into the Broker Bridge package. `contextExchangeId` is `claimFileData`, `contextExchangeVersion` is `202701`.
- **Samples added:** `samples/claimFileData-question.json` (null-filled surface) and `samples/claimFileData-sample.json` (a completed motor claim). `.vscode/settings.json` updated accordingly.
- **Versioning note:** this is the first schema in the package aligned on norm release `202701` rather than `202601`. The package now spans two norm releases.
- **Nullability:** `claimFileData` follows the package convention — scalar leaves accept `null`, arrays are not nullable (a question carries `[]`), objects are not nullable (their leaves carry `null`). Only `contextExchangeId` and `contextExchangeVersion` are required.

### Code lists — Telebib2 becomes the source of truth

- **47 code lists imported** from the Telebib2 registry, taking the package from 71 to 117 lists. Every file was checked against the sha256 published in the registry `catalog.json`; only `$id` was rewritten to the package convention. Per-value `x-enum-labels` (fr/nl) come along and are new to this package.
- **13 lists replaced with identical values.**
- **3 lists replaced with differing values** — Telebib2 prevails. No existing sample used any of the removed values.
  - `title_V1`: `coOwners` becomes `co-owners`
  - `vehicleUse_V7`: trailing underscore dropped from `limitedUse_privateAndWorkRoute_`, `limitedUse_privateWithoutWorkRoute_`, `privateServices_organizedTransport_`
  - `guaranteeType_V1`: removed `guaranteedIncome`, `guaranteedIncomeCorporate`, `litteraE`, `litteraI`, `revenueInsurance`, `salvagingAndRefloatingAndSearching`; added `article6pt5`, `article6pt6`, `guaranteedIncome_280`, `guaranteedIncome_640`, `searchingSalvagingRefloating`
- **`countryCode_V5` retained.** Telebib2 will align on V5.

### Breaking changes

- **`percentage` is now a decimal string, not a JSON number.** `shared/primitives/percentage_V1` adopts the Telebib2 form (`type: string`, up to 9 fraction digits, sign allowed, convention `1.0` = 100%). Producers must convert `"vatRate": 0.21` to `"vatRate": "0.21"`. Affects `commonInsuredObjectData_V1` (`vatRate`), `insuredBuildingAndAssociatedObjectsData` (`combustibleMaterialsPercentage`), `insuredMotorisedVehicleAndDriverData` and `insuredTrailerData` (`vatRecoverabilityPercentage`). Nullability moved to the point of use per the 2026-07-07 convention. The 9 affected sample values were converted.
- **`shared/money_V1.json` removed.** Monetary amounts now use `shared/primitives/amount_V1.json`, a bare decimal string rather than an object wrapper.
- **`reference` flattened.** The Telebib2 `reference` component (a `{ referenceContent, statusCoded }` wrapper, 57 occurrences in the claim message) is carried as a plain `string` with `maxLength: 40`, matching the existing `fileReference` style. `statusCoded` is not carried.

### New shared components

- **23 structural components ported** from Telebib2, flat in `shared/` with the `_V1` suffix: the damage tree (`dptDam*`, 8 files), the risk-object tree (`evtRod*`, `eventRiskObject`, `riskObjectIdentificationDetail`, 5 files), party and seat identification details, guarantee identification, and unit components (`qualifiedValue`, `product`, `profession`, `document`, `attribute`, `formula`, `indexedAmount`).
- **New primitives:** `amount_V1`, `decimal_V1`, `duration_V1`, alongside the redefined `percentage_V1`.
- **`address_V1` and `name_V1` kept unchanged.** Telebib2 will align on the Broker Bridge definitions rather than the reverse.

### Known issue, not introduced here

- **Official code lists use `oneOf` + `const` per value** where telebib lists use `enum` + `x-enum-labels`. For `naceBel2025Code_V1` that is 2024 subschemas. The `enum` form would be considerably lighter for implementers; worth raising with the Telebib2 registry.

### Monetary amounts migrated off floating point

- **The 17 remaining `multipleOf: 0.01` constraints are gone.** Every `{ "type": "number", "minimum": 0, "multipleOf": 0.01 }` in `commonInsuredObjectData_V1` (3), `insuredBuildingAndAssociatedObjectsData` (4), `insuredMotorisedVehicleAndDriverData` (5) and `insuredTrailerData` (5) now references a decimal-string primitive. This removes a defect that predates this release — verified against the untouched 20260707 package, `insuredIndividualPersonData-sample.json` did not validate, because `invoicedAmount: 145.20` fails `multipleOf: 0.01`: `145.20 / 0.01` is `14519.999999999998` in IEEE-754. Decimal strings remove the class of defect rather than the single occurrence, which is why Telebib2 made the same change (ADR-008).
- **New primitive `shared/primitives/amountNonNegative_V1.json`.** Identical to `amount_V1` but restricted to zero or positive values, so the `minimum: 0` constraint carried by all 17 sites is preserved rather than silently dropped — `amount_V1` allows a leading sign. Pattern `^(0|[1-9]\d{0,15})(\.\d{1,2})?$`.
- **Breaking for producers:** the affected fields now carry strings. `"invoicedAmount": 145.20` becomes `"invoicedAmount": "145.20"`. Thirty-two sample values were converted across six sample files. The `-question` samples are unaffected — those fields were already `null`.
- **Result: all 16 samples now validate under ajv**, including `insuredIndividualPersonData-sample.json`, which failed in the 20260707 release.

Fields affected: `maximumInsuredAmount`, `invoicedAmount`, `invoicedAmountExcludingVat`, `valuationFormResult`, `signageValue`, `windowPanesValue`, `maximumValuePerObject`, `vehicleRegistrationTax`, `listPriceIncludingVat`, `listPriceExcludingVat`, `valuationAmount`, `accessoriesValueExcludingVat`.

### Five intermediate structures flattened

Broker Bridge does not need the full Telebib2 sub-structures for identification, qualification and indexation. Five components were removed and their 110 usage sites replaced by the value they actually carry.

| Removed component | Replaced by | Sites |
|---|---|---|
| `attribute_V1` | direct `$ref` to the code list each site constrained | 20 |
| `indexedAmount_V1` | `$ref` to `primitives/amount_V1` — indexation is not carried in Broker Bridge | 29 |
| `partyIdentificationDetail_V1` | array of `string(1..17)`, `maxItems: 3` | 25 |
| `seatSubsidiaryIdentificationDetail_V1` | `string(1..17)` | 25 |
| `qualifiedValue_V1` | `string(1..70)` — the `value` field | 11 |

Payload effect, on the claim sample:

- `"partyIdentification": [{ "partyIdentifier": "0405764064", "codeListIdentifier": "telebibCmpValue" }]` becomes `"partyIdentification": ["0405764064"]`
- `"paymentNature": { "attributeValueCoded": "compensation" }` becomes `"paymentNature": "compensation"`
- `"benefitAmount": { "amount": "2450.00", "indexTypeCoded": "none" }` becomes `"benefitAmount": "2450.00"`

The code-list constraints are preserved: a site that constrained `attributeValueCoded` to `paymentNature_V2` now references that list directly, so the same values validate. What is lost is the qualification metadata — `codeListIdentifier`, `codeListResponsibleAgencyCoded`, `indexTypeCoded`, `indexAppliedValue`, `indexBaseValue`. Broker Bridge does not use it.

`shared/` drops from 26 to 21 components. No code list became orphaned: `codeListIdentifier_V1` is still referenced by `riskObjectIdentificationDetail_V1`.

## 2026-08-27

### `document_V1` redefined around document delivery

`shared/document_V1.json` no longer describes a Telebib2 document qualification block; it now describes a document *made available at a URL*, with its electronic-signature requirements.

**Breaking — the four previous properties are gone**, including `documentQualifier`, which was the component's only `required` property:

| Removed | Added |
|---|---|
| `documentQualifier` (required, `documentQualifier_V1`) | `documentType` (`documentType_V1`) |
| `documentIdentifier` (`string(1..50)`) | `documentUrl` (`format: uri`, `maxLength: 2048`) |
| `documentDetail` (`string(1..70)`) | `digitalSignatureRequirement` (`digitalSignatureRequirement_V3`) |
| `statusCoded` (`statusCoded_V1`) | `digitalSignatureType` (`digitalSignatureType_V3`) |
| | `urlExpiryDate` (`YYYY-MM-DD`) |
| | `documentNumber` (`string(1..40)`) |

All six properties are optional and nullable; the component carries `additionalProperties: false`. No `required` remains, in line with the rest of the package.

`digitalSignatureType_V3.json` was imported from Telebib2 for this change. Both signature lists sit flat in `shared/lists/` like every other list (decision #8), and their `$id` was realigned on that path — they were carrying a `/shared/lists/telebib/...` `$id` that matched no file.

### `documents` now references the component

`documents` in `commonInsuredObjectData_V1` was an inline array of `{documentType, documentUrl}`. It now references `document_V1.json` and is **nullable as well as multiple** — previously the array itself could not be `null`, only its contents. The two fields existing payloads carry are unchanged, so all samples still validate; four new optional fields become available.

### `policeReport` detached from `document_V1`

`policeReport` in `claimFileData.202701` composed `document_V1` through an `allOf` and pinned `documentQualifier` to `"report"`. Now that `document_V1` describes a URL-delivered document, that composition no longer made sense: `policeReport` is a plain object carrying only `documentIssueDate` and `documentNumber`, with `additionalProperties: false` replacing the `unevaluatedProperties: false` the `allOf` required.

**Breaking:** `documentQualifier: "report"` is no longer accepted on `policeReport` — as are `documentIdentifier`, `documentDetail` and `statusCoded`, which it inherited. No sample carried them.

### Orphaned lists

`documentQualifier_V1` and `statusCoded_V1` were referenced only by `document_V1` and have no consumer left. They are kept in `shared/lists/` pending the final orphan sweep listed in `DECISIONS.md`.

Result: 152 schemas compile under ajv, all 16 samples validate.

## 2026-08-28

### Broken `$ref` — the package did not compile

`claimFileData.202701` and `policyHolderOrCoPolicyHolderData.202601` referenced `document_V1.json` relatively, resolving to `/schemas/document_V1.json`, which does not exist. Repointed to `../shared/document_V1.json`. Until this was fixed ajv aborted before validating anything.

### Breaking changes — claim message

- **Three envelope properties removed** from `claimFileData`: `exchangeUnitBusinessContentDescription`, `exchangeUnitBusinessContentDescriptionVersion`, `domain`.
- **`product` now references `shared/product_V1`** (`productIdentifier` ≤ 17, `productName` ≤ 35). `productCode` is gone.
- **`partyIdentification` dropped from `insurer` and `intermediary`**, replaced by `kboBceNumber`, `establishmentUnitNumber` and `legalEntityIdentifierReference`.
- **`event.eventName` removed.** `eventType` (`eventQualifier_V1`) carries the classification; free text goes in `description`.
- **`riskObjectIdentification` removed** from event risk objects, along with `shared/riskObjectIdentificationDetail_V1`. The chassis number is already carried by `chassisNumber`.
- **`vehicleMakeModelType` flattened** to `makeName` / `modelName` / `typeName`, on both event risk objects (`evtRod001_V1`) and damage risk objects (`dptDamGen_V1`).
- **`lossOfUsePeriodInDays` is a plain `number`**, no longer a `{ value, durationUnit }` duration.

### Breaking changes — policyholder message

- **`documents` reinstated on `policyHolderOrCoPolicyHolderData`**, now referencing `document_V1.json` (six fields) rather than the inline `{documentType, documentUrl}` pair dropped on 2026-07-06.

### Last remnants of the Telebib2 flattening removed

The 2026-08-20 flattening of `partyIdentificationDetail_V1`, `seatSubsidiaryIdentificationDetail_V1` and the `reference` component left three artefacts in the damage tree, now cleared:

- **`partyIdentification` and `seatSubsidiaryIdentifier` removed** from the five components where they survived: `dptDam001_V1`, `dptDamDod001_V1`, `dptDamDod030_V1`, `dptDamGen_V1` and `evtRod001_V1`. Parties are identified by `kboBceNumber` / `establishmentUnitNumber` / `legalEntityIdentifierReference` throughout.
- **The `statusCoded` remnant removed at 11 sites.** Each carried `allOf: [{type: "string", …}, {properties: {statusCoded: {const: "permanent"}}}]` — a second subschema that constrained nothing on a string, and, more importantly, made the leaf non-nullable. All 11 are now `anyOf: [{string}, {null}]`: `PartyExpert.kboBceNumber`/`establishmentUnitNumber`/`vatNumber`/`expertApprovalNumber`/`fileReference` and `PartyRepairer.kboBceNumber`/`establishmentUnitNumber`/`vatNumber` (`dptDam001_V1`), `numberPlate` (`dptDamDod001_V1`), `Settlement.calculationNoteNumber`/`producerAccountNumber` (`dptDamGen_V1`).
- **`shared/lists/statusCoded_V1.json` deleted**, its last consumer gone.

### Nullability convention applied to the claim tree

Fifteen code-list references in the ported damage and risk-object components were bare `$ref`s, making them non-nullable although they are neither `required` nor discriminants — contrary to the convention restated on 2026-08-20. All are now `anyOf: [{$ref}, {type: "null"}]`:

| Component | Fields |
|---|---|
| `dptDam001_V1` | `rdrScaleCode`, `expertiseRequestOrigin`, `expertiseTrigger`, `appointmentType`, `expertMandateType`, `expertiseForm`, `expertType`, `expertAppointmentType`, `expertiseType`, `conventionType` |
| `dptDamDod001_V1` | `isVehicleImmobilised`, `transmissionType`, `vehicleOnDeclaration` |
| `evtRod01x_V1` | `buildingUse`, `relationshipBetweenPolicyHolderAndRiskObject` |

Eight non-nullable code-list references remain, all deliberate: `objectQualifier` (×4), `lossQualifier` and `guaranteeType` (×4) are `required` and drive the `if/then/else` branch selection, exactly as `objectType` does elsewhere.

### Samples

- **`claimFileData-question.json` rebuilt.** It covered 21 root scalars out of 27 properties; `product`, `insurer`, `intermediary`, `mainPolicyHolder`, `leadingInsurer`, `claimsHandler`, `event`, `claimants` and `documents` were absent entirely. Regenerated from the schema as a complete null-filled surface (734 bytes → 17 KB). Only eight values are non-null: the two envelope fields and the six discriminants the schema forbids setting to `null`.
- **`claimFileData-sample.json` realigned** on the seven breaking changes above.
- **The four `document_V1` fields added on 2026-08-27 propagated to all six `-question` files** carrying `documents`: `digitalSignatureRequirement`, `digitalSignatureType`, `urlExpiryDate`, `documentNumber`.
- **Three coverage gaps closed:** `documents` on `policyHolderOrCoPolicyHolderData-question`, `geographicalCoordinatesSet` on `insuredIndividualPersonData-question`, `leasingRentingCompany` and `financingCompany` on `insuredBuildingAndAssociatedObjectsData-question`.

The eight `-question` files now cover 100 % of their schema's property surface. The `-sample` files remain deliberately partial.

### Known issue, not addressed here

`dptDam001_V1.$defs/PartyRepairer` still carries `required: ["kboBceNumber"]` on a now-nullable field, forcing producers to emit the key even when empty.

Result: 148 schemas compile under ajv, 132 distinct `$ref`s all resolve, all 16 samples validate. Nine lists remain orphaned in `shared/`, pending the sweep listed in `DECISIONS.md`: `busBoiteIndicator_V1`, `codeListIdentifier_V1`, `documentQualifier_V1`, `domainCode_V2`, `indexTypeCoded_V1`, `jobCategoryCoded_V1`, `jobQualifier_V1`, `official/naceBel2025Code_V1`, `primitives/decimal_V1`.
