Onboarding
Onboarding (CAP)
Section titled “Onboarding (CAP)”Audience: domain, product, backend, ux
Status: specced
Owns: product + backend
Depends on: Auth module, Identity, Personas
OpenAPI covers start / mine / get / save / submit for all personas. An account may hold candidate and centre-staff onboardings (whitelist). Assessor and awarding-body mixes remain 409.
Staff onboarding is person-scoped (persona: centre, variant: staff): completing it once unlocks every current and future CentreStaff membership. It is not per centre and is not org founding (variant: organisation / CentreOnboardingPayload).
Organisation founding: on successful org submit, CAP provisions a Centre (pending) and founder CentreStaff (super_admin). Re-submit on an already-completed org record runs the same repair path. Historical rows missing centre staff are backfilled via deploy command repair:organisation-centres — Console commands.
Product intent
Section titled “Product intent”- After Orchestrator Auth, the client calls CAP
GET /onboarding/mine(always 200, possibly empty) andGET /mefor hats. Login does not carry onboarding. - Candidate onboarding remains the SoT for application-draft personal/occupation fields. After submit, unlocked occupation and accessibility edits go through
PATCH /me/profile(same blob) — not a second flatten on dashboard DTOs. Persona profile GETs (/candidate/profile,/assessor/profile,/centre/profile) nest the fullOnboardingRecordso settings do not need a second onboarding GET. Nesteddatastays id-only (no resolved URLs inside the blob). Profile photo is not in onboarding JSON — it isCapUser.photoAssetId. - Invite creates a staff draft if missing, prefilled from completed candidate onboarding when present.
- NIN: required for staff-only accounts on staff submit; skipped if
identityVerifiedis already true. - Staff payload:
personalDetails,contactInformation,residentialAddress,acknowledgements.acceptsCentreStaffTerms. Email should match the OL account.
See openapi/cap.yaml. POST /onboarding/start is idempotent per (capUser, persona). Completeness on submit follows variant for centre. After COMPLETED, PATCH /onboarding/{persona}/save stays 409. Personal contact/address/occupation/accessibility/photo edits go to PATCH /me/profile (occupation and accessibility require a candidate onboarding record — 422 profile.candidate_onboarding_required otherwise). Centre org fields (logo, support, bank, address) go to PATCH /centre/profile (super_admin). registrationNo is locked once the Centre row exists. There is no PATCH /candidate/profile.
See also
Section titled “See also”- Flows → Experience — account & identity
- Centres → Centres
- Application happy path → Experience — application