LMS lifecycle
LMS lifecycle
Section titled “LMS lifecycle”Audience: all
Status: specced
Owns: product + backend
Depends on: Personas, Policies, API overview
Learner path
Section titled “Learner path”flowchart LR OL[OL register / login] --> Prov[lms_users] Prov --> OB[Learner onboarding] OB --> Cat[Catalogue browse] Cat --> Enr[Enrollment pending or active] Enr -->|priced| Pay[LMS checkout → OL pay] Pay --> Act[Entitlement active] Enr -->|grant / zero-price| Act Act --> Learn[Player + assessments] Learn --> Comp[Completion policy] Comp --> Cert[LMS certificate] Comp --> Evt[lms.course.completed]| Stage | Gate |
|---|---|
| Account | Orchestrator JWT; user.created with lms intent (or lazy provision) |
| Onboarding | Learner draft → submit |
| Catalogue | Authenticated; published courses only |
| Access | Active entitlement (not merely an enrollment row) |
| Learn | Sequencing locks (lms.sequencing.locked); progress % |
| Complete | Completion policy (required items + min % + passed assessments) |
| Certificate | LMS-owned; lms.certificate.issued |
Instructor / staff path
Section titled “Instructor / staff path”- Platform invite → email (
notification.requested). - OL login / register.
- Persona onboarding.
- Author (draft) → publish (owner/staff) → learners appear on assigned courses.
Enrollment statuses
Section titled “Enrollment statuses”| Status | Meaning |
|---|---|
pending |
Created; waiting for payment or grant |
active |
Entitlement active; player unlocked |
completed |
Completion policy satisfied |
expired |
Entitlement validity ended |
withdrawn |
Cancelled |
Entitlement sources (v1)
Section titled “Entitlement sources (v1)”| Source | How it activates |
|---|---|
self_pay |
POST /enrollments/{id}/checkout → payment.completed (zero-price skips OL) |
admin_grant |
Staff POST /admin/entitlements |
sponsor |
Staff grant — “someone paid”; optional sponsorUserId / note. No LMS orgs |
cap_recommendation |
Staff/system grant tied to capApplicationId (CAP gRPC recs + this source) |
Organizations later live on Orchestrator; organization_seat is not a v1 source.
Completion → CAP
Section titled “Completion → CAP”LMS does not close CAP applications. It emits lms.course.completed (learnerUserId, courseId, optional capApplicationId, linkage ids). CAP decides whether GAP_TRAINING can clear.