Contract validated

Address-sketch31-7 (contract boundary)

What changed

  • Added stable payload contract: App\Contract\Address\AddressValidated
  • AddressValidatedApplierInterface now accepts AddressValidated instead of raw array
  • Outbox event name standardized: address.validated.applied (v1)
  • Added HTTP endpoint: POST /api/address/validated/apply

Request example { "id": "01HF...ULID...", "validated": { "line1Norm": "10 downing st", "cityNorm": "london", "postalCodeNorm": "sw1a2aa", "countryCode": "GB", "latitude": 51.5033, "longitude": -0.1276, "validationProvider": "locator", "validatedAt": "2025-12-30T00:00:00Z" } }

Notes

  • This repo still defaults to sqlite for index search if DB_DSN is not set.
  • ApplyValidated must point DB_DSN to Postgres where address_entity/address_outbox exist.