Overview
:::info Source
Sourced from services/progress-service/SERVICE_OVERVIEW.md in the documentation repo.
:::
1. Purpose
Authoritative Learning Record Store (LRS) for the platform. Owns learner progress, attempts, xAPI statements, and completion records. Conformant with xAPI 1.0.3 + cmi5.
Progress is an append-only ledger: every navigation, interaction, assessment submission, and completion is a Statement. The LRS is the source of truth for compliance audits, certification issuance, learning analytics, and xAPI interoperability.
2. Bounded Context
- Context: Progress (LRS)
- Classification: Core domain (competitive differentiator for regulated learning)
- Ubiquitous language: Statement, Attempt, InteractionResult, CompletionRecord, PassFailRecord, Activity, Verb, Actor.
3. Responsibilities
- Accept xAPI statements from delivery-service, SCORM adapters, and 3rd-party LRS integrations.
- Persist statements with tenant + temporal partitioning.
- Aggregate statements into
Attemptrecords with outcomes. - Emit
progress.completion.recorded.v1when attempt completes passing → triggers certification. - Serve xAPI query API (
GET /xapi/statements) for admin/reporting. - Generate transcripts for learners (per enrollment, all attempts).
- Forward statements to analytics-service firehose.
4. Non-Responsibilities
- Does not grade assessments (assessment-service does).
- Does not issue certificates (certification-service does).
- Does not own session state (delivery-service does).
- Does not serve content (content-service does).
5. Dependencies
| Upstream (events consumed) | Purpose |
|---|---|
| delivery-service | .play_session.started.v1, .navigated.v1, .completed.v1 |
| assessment-service | .attempt_result.scored.v1 |
| sync-service | Offline statements replayed on reconnect |
| Downstream (events produced) | Purpose |
|---|---|
| certification-service | progress.completion.recorded.v1 triggers certificate issuance |
| assignment-service | Triggers compliance window completion |
| analytics-service | Firehose consumer for learning analytics |
6. Slice & Milestone Involvement
| Slice | Milestone | Scope |
|---|---|---|
| S0 | M0 | Event pipeline skeleton |
| S1 | M1 | Basic progress + transcripts (MVP) |
| S4 | M3 | Full xAPI + cmi5 conformance |
| S5 | M4 | Branching scenario statement shape |
| S6 | M5 | Multi-region LRS with residency enforcement |
7. Architectural Freeze Points
- F11 — xAPI statement schema: M1 start. Our internal
Statementuses xAPI 1.0.3 format; platform extensions underhttp://ghasi.io/xapi/...namespace. - F12 — Attempt lifecycle: M1 start. Attempt states frozen; outcome enum additive only.
- F06 — VectorClock semantics: M0 end (required because offline statements sync).
8. Key Invariants
- Statements are append-only (never updated or deleted except via GDPR erasure).
statementIdis globally unique (ULID).- Every statement anchored to a tenant, actor, activity, and
attemptId. - Attempt outcome determined by GradingRule + aggregated InteractionResults.
- Completion record is idempotent: multiple passing statements → single completion.