diff --git a/docs/openedx_learning/decisions/0007-pathway-credentials.rst b/docs/openedx_learning/decisions/0007-pathway-credentials.rst new file mode 100644 index 000000000..041e53439 --- /dev/null +++ b/docs/openedx_learning/decisions/0007-pathway-credentials.rst @@ -0,0 +1,58 @@ +.. _openedx-learning-adr-0007: + +7. Pathway Credentials +====================== + +Status +------ + +Draft + +Context +------- + +Learners who complete a Pathway should receive a certificate, in the same way as the built-in Open edX course +certificates. Individual courses inside a Pathway keep their existing course certificates unchanged; this decision is +only about the Pathway-level credential. + +Decisions +--------- + +1. **Earning rule.** A learner earns the Pathway certificate by fulfilling all Items in the Pathway. In the MVP that + means passing every course in the Pathway, where "passing" is dictated by each course's own grading policy. There + are no Pathway-level grades, thresholds, or enrollment modes. + +2. **Automatic issuance via signals.** The Pathways app listens for the Django signals the platform already emits when + a learner's course passing status changes. On each relevant signal, it re-evaluates the learner's Item fulfillment + for any enrolled Pathways containing that course, and issues the certificate as soon as all Items are fulfilled. + No manual issuing step is required. + +3. **Configuration in Django admin.** Pathway certificates are configured in the Django admin, not in Studio. A + certificate configuration can be created, previewed, edited, and deleted while inactive; it must be activated + before certificates are issued. Configuration includes the issuing organization and 1–4 signatories (name, title, + organization, signature image). + +4. **Rendering.** An issued certificate is rendered as an HTML page (printable by the learner), analogous to course + certificates. W3C Verifiable Credentials / Open Badges will not be supported in the MVP. + +5. **Issued certificates are records.** An issued certificate stores everything needed to display it later: recipient + name, Pathway name, issuer, signatories, the criteria met (the list of courses passed), and the date earned. It + remains valid and viewable even if the Pathway is later updated or archived. + +6. **Events.** Issuing a certificate emits an event, so that instances can report on credentials (e.g. in Aspects). + +.. Run `dot -Tsvg images/pathway-credentials.dot > images/pathway-credentials.svg` to regenerate the diagram after + making changes to `images/pathway-credentials.dot`. + +.. image:: images/pathway-credentials.svg + :alt: Pathway certificate issuance flow + :width: 100% + +Consequences +------------ + +- Because issuance uses the existing platform signals, no polling or batch jobs are needed for the typical flow. +- Since certificates are self-contained records, later edits to the Pathway or its certificate configuration never + alter what a learner already earned. +- Interaction-progress-based criteria, per-course credential rules, badges/microcredentials, and verifiable + credentials are all explicitly out of scope and can be layered on later without changing the basics of this design. diff --git a/docs/openedx_learning/decisions/images/pathway-credentials.dot b/docs/openedx_learning/decisions/images/pathway-credentials.dot new file mode 100644 index 000000000..1a16c34f2 --- /dev/null +++ b/docs/openedx_learning/decisions/images/pathway-credentials.dot @@ -0,0 +1,18 @@ +digraph pathway_credentials { + rankdir=LR; + fontname="Helvetica"; + node [shape=box, style=rounded, fontname="Helvetica", fontsize=11]; + edge [fontname="Helvetica", fontsize=10]; + + signal [label="course passing-status\nDjango signal", shape=ellipse]; + handler [label="re-evaluate Item fulfillment\nfor learner's enrolled Pathways\ncontaining that course"]; + decide [label="all Items\nfulfilled?", shape=diamond, style=""]; + issue [label="issue certificate:\nstore self-contained record,\nemit event"]; + render [label="HTML certificate\n(viewable, printable)"]; + + signal -> handler -> decide; + decide -> issue [label="yes"]; + decide -> done [label="no"]; + done [label="done", shape=plaintext]; + issue -> render; +} diff --git a/docs/openedx_learning/decisions/images/pathway-credentials.svg b/docs/openedx_learning/decisions/images/pathway-credentials.svg new file mode 100644 index 000000000..387524871 --- /dev/null +++ b/docs/openedx_learning/decisions/images/pathway-credentials.svg @@ -0,0 +1,87 @@ + + + + + + +pathway_credentials + + + +signal + +course passing-status +Django signal + + + +handler + +re-evaluate Item fulfillment +for learner's enrolled Pathways +containing that course + + + +signal->handler + + + + + +decide + +all Items +fulfilled? + + + +handler->decide + + + + + +issue + +issue certificate: +store self-contained record, +emit event + + + +decide->issue + + +yes + + + +done +done + + + +decide->done + + +no + + + +render + +HTML certificate +(viewable, printable) + + + +issue->render + + + + +