Build just this flow: a customer (or producer — an insurance agent/broker) enters the property & product selection, the system prefills from data sources, scores perils via the cat-model, and emits a quote. It is the only externally-exposed flow, so it gets its own trust boundary (a hard line where outside traffic is checked before anything inside is reached). Advance the maturity stage to grow it.
Every cross-flow arrow is the same async handoff — no flow calls another directly. 1. The sending flow commits its data row plus an outbox row in one transaction. 2. A relay publishes the event to the event bus (Pub/Sub on GCP · EventBridge→SQS on AWS). 3. The bus's push-subscription POSTs it to the receiving flow's Cloud Run API, which processes it idempotently (duplicates ignored, deduped on event_id). Synchronous reads (e.g. getProductVersion) are plain request/response.
getProductVersion(line, form, asOfDate), returns the immutable product and the quote workbench (the coverage-selection screen) renders its provisions/options. (How product versioning works — worked example.)POST /peril-scores, sync) for wildfire/flood/wind at that exact address; those scores + the prefilled property data set the coverage defaults — every defaulted provision/option traces back to a prefill field (field → provision mapping).submission row (event-sourced: SubmissionCreated), stamped with the cat-model version + as-of date — and an outbox row holding QuoteRequested. Then it commits.QuoteRequested {submission_id, property, coverages, geo} to the event bus.event_id) — the submission now sits in the underwriter's queue.| Direction | Contract | Who |
|---|---|---|
| Emits | QuoteRequested {property, coverages, geo} | Underwriting |
| Calls (read) | getProductVersion(), POST /peril-scores, prefill | Product, Cat-model, Prefill (black boxes) |
| Consumes | — (entry point of the lifecycle) | — |