Skip to content
Updated Jul 4, 2026

Business Processes ​

The dynamic views show how the containers cooperate on a specific business operation. They're sequence-style - each arrow is auto-numbered in execution order - and they're rendered from the same Structurizr model as L1 and L2, so changes to the model flow through automatically.

Source of truth

Defined in /root/olly/docs/architecture/workspace.dsl (Structurizr DSL). Open standalone: ↗ structurizr.dev.hiolly.com.

ProcessWhat it shows
Quote → BindBroker quotes a scheme, binds, policy issuance saga runs, welcome email goes out.
Member EnrolmentHR adds a member to a group scheme, eligibility pre-flight, enrolment, welcome email.
Member Onboarding (MEM-ONB) - 0 (HR adds employee, PRIMARY)HR signs into the Employer Portal, adds an employee, group-scheme mints a party + PIN via the identity service (which creates the party in policy-admin), enrolment fires, notifications sends the activation PIN.
Member Onboarding (MEM-ONB) - A (PIN, internal fallback)God-mode operator provisions a member + emails a 5-digit PIN → member enters PIN → JWT minted via ROPC. Retained as a fallback for edge cases.
Member Onboarding (MEM-ONB) - B1 (secondary email magic link)Signed-in member adds a secondary email → 15-min single-use token → clicks link → attribute appended in Keycloak.
Member Onboarding (MEM-ONB) - B2 (link Google)Signed-in member picks Google account → id_token verified against Google JWKS → google_* attributes written.
Claim AdjudicationProvider submits a claim → eligibility → adjudication workflow → payout + decision email.
Prior AuthPA request → rules + workflow → admin review (if flagged) → decision → provider + member emails.
Triage → CareMember describes symptoms → LLM triage → disposition → book recommended care → confirmation email.
Billing CycleMonthly cron → invoice issued → HR pays → card capture → payment received (or dunning).

Quote to Bind ​

Member Enrolment ​

Member Onboarding (MEM-ONB) - 0 (HR adds employee, PRIMARY) ​

Primary onboarding path. HR signs into the Employer Portal (JWT org_locator) and posts an employee to POST /api/group-scheme/{scheme}/members. group-scheme should mint a party + 5-digit PIN via the identity service (POST /internal/parties/mint-with-pin; identity is DB-free, so it creates the party by calling policy-admin's POST /internal/parties - #1161), enrol the member, and let notifications dispatch the activation-PIN email that transitions the member into Flow A verify-pin (also served by identity).

Not fully wired today

Audit against shipped Go code + docker-compose.yml: the frontend/backend contract on that endpoint is broken (frontend sends {firstName,lastName,email}, backend expects {memberPartyLocator} - see dashboardStore.ts:322 vs schemes.go:107). Group-scheme does NOT call policy-admin, does NOT emit member.enrolled, and no activation-email pathway is wired end-to-end. The ⏳ hops in the diagram below mark aspirational relationships. Only the bulk-enrolment path ships end-to-end (enrollment outbox → notifications SMTP direct).

Member Onboarding (MEM-ONB) - A (PIN, internal fallback) ​

God-mode operator provisions a member in Keycloak and emails a 5-digit PIN (Flow A) - retained as the internal fallback path for edge cases where Flow 0 can't be used. Member enters the PIN in the mobile app at POST /identity/onboarding/verify-pin; the identity service resolves the user by party_locator, rotates the Keycloak password to a random secret, and mints access + refresh tokens via ROPC against the web-member client. See Discussion #1160 §10 for the sequence detail. verify-pin + mint-with-pin were extracted from policy-admin into the identity service in #1161; the surviving link endpoints (Flow B1/B2) still live in policy-admin and follow into identity when PR #1159 lands.

Signed-in member submits a candidate secondary email address (Flow B1). policy-admin verifies the Bearer against Keycloak JWKS, stores a 32-byte token in Valkey (15-min TTL) keyed to the caller's sub, and sends a branded email carrying olly://link-email?token=... plus a member.dev.hiolly.com/auth/link-email web fallback. Redeem is single-use (Valkey GETDEL), cross-user guarded (entry.UserID == JWT.sub), then appends secondary_emails on the Keycloak user and rotates tokens so the new attribute lands in the access token.

Signed-in member links a Google account (Flow B2). Client collects a Google id_token - web via the Google Identity Services SDK popup, native via @react-native-google-signin on top of Play Services - and posts it to policy-admin. policy-admin verifies the Bearer against Keycloak JWKS, fetches Google's JWKS (https://www.googleapis.com/oauth2/v3/certs, cached 1h with rotate-on-unknown-kid), verifies signature + iss + aud + exp/iat, writes google_sub, google_email, google_email_verified_at on the Keycloak user, and rotates tokens so the new claims are present in the next access token.

Claim Adjudication ​

Prior Authorisation ​

Triage to Care ​

Billing Cycle ​

Olly Health Insurance Platform