Skip to main content

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 Attempt records with outcomes.
  • Emit progress.completion.recorded.v1 when 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-serviceOffline statements replayed on reconnect
Downstream (events produced)Purpose
certification-serviceprogress.completion.recorded.v1 triggers certificate issuance
assignment-serviceTriggers compliance window completion
analytics-serviceFirehose consumer for learning analytics

6. Slice & Milestone Involvement

SliceMilestoneScope
S0M0Event pipeline skeleton
S1M1Basic progress + transcripts (MVP)
S4M3Full xAPI + cmi5 conformance
S5M4Branching scenario statement shape
S6M5Multi-region LRS with residency enforcement

7. Architectural Freeze Points

  • F11 — xAPI statement schema: M1 start. Our internal Statement uses xAPI 1.0.3 format; platform extensions under http://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).
  • statementId is 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.