You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[UXD Spike] Confirm what the Competency Status values should be, how they will be determined, and what iconography or other accessible means will be used with their display. #768
As a Learner, on the Progress tab in a Course, I need to be able to view my competency status for each gradeable subsection assignment along with my percentage score.
changed the title [-][UXD Spike] Ability to view competency status for each gradeable subsection with percentage score[/-][+][UXD Spike] Confirm what the Competency Status values should be, how they will be determined, and what iconography or other accessible means will be used with their display.[/+]on Aug 26, 2026
@illiphilli Before we lock in the visual design, I want to flag a mismatch between the status values used here and the competency status model the backend already committed to in ADR 0002: a subsection's competency status is one of three values, Demonstrated, PartiallyAttempted, or AttemptedNotDemonstrated. I went through edx-platform to check whether the six statuses in the mockup (Achieved, Available, In Progress, Awaiting evaluation, Needs revision, Locked) have anything to back them today, so we can agree on what's realistic before more design time goes into them.
Mockup status
What it's meant to represent
What exists in edx-platform today
In Progress
Learner has started a subsection's graded content but not yet submitted it
Nothing at subsection granularity. Completion tracking (completion app) is binary per unit, PersistentSubsectionGrade.first_attempted is a one-way flag set on first score (not cleared, doesn't distinguish "started" from "finished"), and the Progress-tab backend (lms/djangoapps/course_home_api/progress/) doesn't expose an in-progress field at all. The only per-problem signals that come close (capa_block.attempts, .done, .has_saved_answers) exist per-problem, not per-subsection, and aren't exposed by any API.
Awaiting evaluation
Learner has submitted a subsection for grading, but it needs a human (instructor or peer) to grade it
Exists inside ORA's own workflow model (waiting, staff states), but only as course-wide aggregate counts (OraAggregateData) or through a staff-only grading tool (ora_staff_grader). Nothing learner-facing surfaces "my submission is pending human review" per subsection, and the grades app only sees a subsection once ORA writes a final score, so it can't distinguish "not submitted" from "submitted, awaiting grading" either.
Needs revision
An instructor or peer graded the learner's submission as failing, and the learner can retry
Not supported as learner self-service anywhere I could find. ORA's own submit flow raises MultipleSubmissionsException if a learner has already submitted, so a second attempt after a failing grade requires a course team member to use the instructor dashboard's "reset student attempts," which is staff-only. Capa supports multiple attempts, but those are self-graded/immediate-feedback, not "graded by a human, then retry."
Achieved
Learner has demonstrated the competency
Maps directly to Demonstrated.
Locked
Content isn't accessible yet
Out of scope for competency status: it's about content gating, and nothing in edx-platform gates subsection access based on CBE criteria today, so there's no "locked" state to represent.
Available
Content is accessible and not yet attempted
Not a formal backend status. It falls out naturally from the data model instead: no StudentCompetencyCriteriaStatus row exists for a learner/criterion until they make a first attempt, so "no row yet" reads as "available, not started." Since nothing in the platform currently gates subsection access for CBE purposes, this would apply to every subsection by default until we build a locking mechanism, if we ever do.
Separately, here's what each of the three backend status values actually means and when a learner would see it, since that also affects which ones are realistic at the subsection level the mockups show:
Backend status
What it means
When it's assigned
Demonstrated
The threshold for this node was met.
Subsection: the grading rule's comparison (for example, "score >= 75%") against the subsection's grade evaluated true. Competency: enough of its criteria are Demonstrated to satisfy its AND/OR expression.
AttemptedNotDemonstrated
An attempt was made, but the threshold wasn't met.
Subsection only: the subsection was graded and the comparison evaluated false.
PartiallyAttempted
Some, but not all, of what's required has been attempted so far; could still end up Demonstrated.
Competency only in practice: a mix of criteria where the expression isn't settled yet.
PartiallyAttempted is legal at the subsection level too as far as the database schema goes, but it isn't reachable in practice: the only evaluation rule implemented right now compares one subsection's grade to one threshold, a binary pass/fail with no partial-credit outcome. Conversely, AttemptedNotDemonstrated is excluded from the competency level by an explicit database constraint on StudentCompetencyStatus. That table is what feeds every competency-level pill in these mockups, both the sub-competency rows (Analysis, Written Communication, and so on) and the "Focus Areas" summary panel at the top, so the same restriction applies to both: a competency-level pill can only ever be Demonstrated, PartiallyAttempted, or not-yet-attempted, never AttemptedNotDemonstrated.
Given all that, here's what I'd like to land on for the Progress tab:
Use Demonstrated, AttemptedNotDemonstrated, and PartiallyAttempted, read directly from the learner's StudentCompetencyCriteriaStatus row (subsection level) or StudentCompetencyStatus row (competency level), as the "attempted" statuses. These need accessible display lables, and they don't need to literally be the enum names, just whatever's best for the learner.
Keep an Available state for "no attempt yet," derived from the absence of a status row rather than a stored value.
Drop In Progress, Awaiting evaluation, Needs revision, and Locked. Nothing in edx-platform backs any of them today, and each would need its own scoped platform work first (a subsection-level in-progress signal, a learner-facing "pending human grading" surface, a learner self-service resubmission flow, and a content-gating mechanism, respectively).
In conclusion, I think the only statuses we can have in scope are Available, PartiallyAttempted, AttemptedNotDemonstrated, and Demonstrated. Can you update the UX Designs to only use these statuses and ensure their representation is accessible?
In Progress, Awaiting evaluation, Needs revision and Locked no longer appear on any screen.
Accessibility
Statuses never rely on color alone. Every pill pairs a text label with an icon, and each icon has a distinct shape.
The chart has a text equivalent. The sunburst encodes status by color, but every segment's status is also in its tooltip and in the competency panel below. Developers should make that panel the screen-reader path, and give the chart a short text alternative rather than reading out every segment.
@illiphilli The legend for the sunburst is still based on color. Is that okay or should the icons appear there as well? Do we want the icons on the sunburst itself or is it okay for them to just be in the tooltip?
Legend: icons instead of color dots. Each status now uses the same icon as its pill (check, empty circle, half-filled circle, minus), in the chart's colors. The legend no longer relies on color alone. That matters most for Demonstrated (green) and Not Demonstrated (red), the pair color-blind users most often confuse.
The chart itself: no icons. Most segments, especially in the outer ring, are too small to hold one, and putting icons on only the larger segments would be inconsistent. The chart stays a color summary, and each status is available without color in two places:
The tooltip shows the status with its icon and label. It should open on keyboard focus as well as on hover.
The competency panel below the chart lists every competency and assignment with its status pill.
The tooltip alone wouldn't be enough, since it depends on hover or focus. That's why the panel is the main non-color path, and the one screen-reader users should be pointed to.
If we later want the chart readable without color, a texture on Not Demonstrated segments would do it, but I'd leave that until after MVP.
@jmakowski1123@mgwozdz-unicon On the Axim/Unicon sync, Available and Partially Attempted were hard to tell apart. I explored seven options (comparison board). Each is shown in color, in grayscale and with simulated deuteranopia (the most common color blindness), and the chosen option was also checked with the Stark plugin. Mary and I recommend Option G, now applied to all Reduced Scope frames:
Status
Icon
Chart color
Available
Slate circle with a dashed gray ring
#CBD5E1 (lightest)
Demonstrated
Check
#3FA36F
Partially Attempted
Half-filled circle
#0A67A3
Not Demonstrated
Minus
#741420 (darkest)
Why this option
Lightness follows urgency. The darker a status, the more it needs the learner's attention, so the areas to work on stand out most.
All four statuses stay distinct without color. Each is about twice as dark as the one before it. In grayscale and with deuteranopia, Demonstrated and Not Demonstrated no longer blend together, as they did with the previous green and red.
Available and Partially Attempted differ in more than color. One is a dashed outline on a light fill, the other a solid half-filled circle, and their pills differ too (white vs. tinted blue).
Nothing relies on color alone. Every status keeps a text label and its own icon shape.
Contrast (WCAG 2.1 AA)
Available icon ring: 6.7:1. Partially Attempted half-fill: 6.0:1.
Pill text: 6:1 or better on every status. I darkened the Demonstrated pill text, which was 4.4:1.
Chart segments: Not Demonstrated 11.3:1, Partially Attempted 6.0:1, Demonstrated 3.1:1 against white. Available's light segments are 1.5:1, which is fine as long as the chart has the text alternative below.
Recommended Next Action is back
It's in the Course Progress panel, below Focus Areas, since it's on Mary's in-scope list in #767. The copy only uses what the #757 API returns: the subsection name, the score threshold and the competency name. For example, "Retake Draft a persuasive memo and score 80% or better to demonstrate Written Communication." There's no attempt count, because the API can't provide one. A Paragon primary button ("Retake assignment") is the single action. The card uses only Paragon colors, and all of its text is 9.4:1 or better.
For developers
New colors: Available's slate (#CBD5E1, #64748B, #475569) and the new green (#3FA36F) and red (#741420) aren't Paragon colors. They need to be added as tokens, or the closest Paragon colors chosen.
Sunburst text alternative: the chart still needs a short text alternative that points screen-reader users to the competency panel below it.
Next Action, verb: use "Retake" when reason is retry_available and "Start" for a subsection that hasn't been started yet.
Next Action, hiding: hide the card entirely when next_action is null.
Next Action, bold: the subsection and competency names are bold. Wrap them in <strong> on the normal body style.
@jmakowski1123, can you approve this direction? Once you do, I'll replace the original status components with these versions and remove the alternatives.
@jmakowski1123@mgwozdz-unicon recording the outcome of today's Axim/Unicon sync: I walked through the status-clarity options on the comparison board, and think we got a nod from Jenna that this is the right path. I'm treating that as approval. Jenna, reply here if I've misread that.
What Option G is: status colors ordered by urgency, so lighter means less urgent and the order holds in grayscale and for colorblind users:
Available: slate, with a dashed ring.
Demonstrated: green.
Partially Attempted: blue, with a half-filled icon.
Not Demonstrated: the darkest, dark red.
Each status also keeps its own icon and text label, so color is never the only cue.
One correction from the call. Per Mary, the MVP assumes no retakes. So the Written Communication tooltip now reads "Complete ANY at 80% or better". With one assignment Not Demonstrated and one still Available, the learner can still demonstrate it, so Partially Attempted is correct. Under "all", it would have been Not Demonstrated.
Next steps on my side:
Merge Option G into the Student Progress components and color variables, and remove the alternative options.
Raise the three colors that aren't in Paragon (the slate, and the tuned green and red) with the developers and the Paragon WG.
Recommended Next Action: per Mary, it will have three types: Continue, Retake and Start. They're calculated separately from the statuses. I'll take the design for each type, including whether Retake and Start get different callout colors, to that ticket when it's ready.
Activity
[-][UXD Spike] Ability to view competency status for each gradeable subsection with percentage score[/-][+][UXD Spike] Confirm what the Competency Status values should be, how they will be determined, and what iconography or other accessible means will be used with their display.[/+]mgwozdz-unicon commentedon Sep 1, 2026
@illiphilli Before we lock in the visual design, I want to flag a mismatch between the status values used here and the competency status model the backend already committed to in ADR 0002: a subsection's competency status is one of three values,
Demonstrated,PartiallyAttempted, orAttemptedNotDemonstrated. I went through edx-platform to check whether the six statuses in the mockup (Achieved,Available,In Progress,Awaiting evaluation,Needs revision,Locked) have anything to back them today, so we can agree on what's realistic before more design time goes into them.In Progresscompletionapp) is binary per unit,PersistentSubsectionGrade.first_attemptedis a one-way flag set on first score (not cleared, doesn't distinguish "started" from "finished"), and the Progress-tab backend (lms/djangoapps/course_home_api/progress/) doesn't expose an in-progress field at all. The only per-problem signals that come close (capa_block.attempts,.done,.has_saved_answers) exist per-problem, not per-subsection, and aren't exposed by any API.Awaiting evaluationwaiting,staffstates), but only as course-wide aggregate counts (OraAggregateData) or through a staff-only grading tool (ora_staff_grader). Nothing learner-facing surfaces "my submission is pending human review" per subsection, and the grades app only sees a subsection once ORA writes a final score, so it can't distinguish "not submitted" from "submitted, awaiting grading" either.Needs revisionMultipleSubmissionsExceptionif a learner has already submitted, so a second attempt after a failing grade requires a course team member to use the instructor dashboard's "reset student attempts," which is staff-only. Capa supports multiple attempts, but those are self-graded/immediate-feedback, not "graded by a human, then retry."AchievedDemonstrated.LockedAvailableStudentCompetencyCriteriaStatusrow exists for a learner/criterion until they make a first attempt, so "no row yet" reads as "available, not started." Since nothing in the platform currently gates subsection access for CBE purposes, this would apply to every subsection by default until we build a locking mechanism, if we ever do.Separately, here's what each of the three backend status values actually means and when a learner would see it, since that also affects which ones are realistic at the subsection level the mockups show:
DemonstratedDemonstratedto satisfy its AND/OR expression.AttemptedNotDemonstratedPartiallyAttemptedDemonstrated.PartiallyAttemptedis legal at the subsection level too as far as the database schema goes, but it isn't reachable in practice: the only evaluation rule implemented right now compares one subsection's grade to one threshold, a binary pass/fail with no partial-credit outcome. Conversely,AttemptedNotDemonstratedis excluded from the competency level by an explicit database constraint onStudentCompetencyStatus. That table is what feeds every competency-level pill in these mockups, both the sub-competency rows (Analysis,Written Communication, and so on) and the "Focus Areas" summary panel at the top, so the same restriction applies to both: a competency-level pill can only ever beDemonstrated,PartiallyAttempted, or not-yet-attempted, neverAttemptedNotDemonstrated.Given all that, here's what I'd like to land on for the Progress tab:
Demonstrated,AttemptedNotDemonstrated, andPartiallyAttempted, read directly from the learner'sStudentCompetencyCriteriaStatusrow (subsection level) orStudentCompetencyStatusrow (competency level), as the "attempted" statuses. These need accessible display lables, and they don't need to literally be the enum names, just whatever's best for the learner.Availablestate for "no attempt yet," derived from the absence of a status row rather than a stored value.In Progress,Awaiting evaluation,Needs revision, andLocked. Nothing in edx-platform backs any of them today, and each would need its own scoped platform work first (a subsection-level in-progress signal, a learner-facing "pending human grading" surface, a learner self-service resubmission flow, and a content-gating mechanism, respectively).In conclusion, I think the only statuses we can have in scope are
Available,PartiallyAttempted,AttemptedNotDemonstrated, andDemonstrated. Can you update the UX Designs to only use these statuses and ensure their representation is accessible?illiphilli commentedon Oct 1, 2026
@mgwozdz-unicon: the designs now use only the four statuses from your comment above (Reduced Scope frames):
PartiallyAttemptedAttemptedNotDemonstratedDemonstratedIn Progress, Awaiting evaluation, Needs revision and Locked no longer appear on any screen.
Accessibility
mgwozdz-unicon commentedon Oct 5, 2026
@illiphilli The legend for the sunburst is still based on color. Is that okay or should the icons appear there as well? Do we want the icons on the sunburst itself or is it okay for them to just be in the tooltip?
illiphilli commentedon Oct 6, 2026
@mgwozdz-unicon Good question. I've added the icons to the legend (Reduced Scope frames):
Legend: icons instead of color dots. Each status now uses the same icon as its pill (check, empty circle, half-filled circle, minus), in the chart's colors. The legend no longer relies on color alone. That matters most for Demonstrated (green) and Not Demonstrated (red), the pair color-blind users most often confuse.
The chart itself: no icons. Most segments, especially in the outer ring, are too small to hold one, and putting icons on only the larger segments would be inconsistent. The chart stays a color summary, and each status is available without color in two places:
The tooltip alone wouldn't be enough, since it depends on hover or focus. That's why the panel is the main non-color path, and the one screen-reader users should be pointed to.
If we later want the chart readable without color, a texture on Not Demonstrated segments would do it, but I'd leave that until after MVP.
illiphilli commentedon Oct 8, 2026
@jmakowski1123 @mgwozdz-unicon On the Axim/Unicon sync, Available and Partially Attempted were hard to tell apart. I explored seven options (comparison board). Each is shown in color, in grayscale and with simulated deuteranopia (the most common color blindness), and the chosen option was also checked with the Stark plugin. Mary and I recommend Option G, now applied to all Reduced Scope frames:
#CBD5E1(lightest)#3FA36F#0A67A3#741420(darkest)Why this option
Contrast (WCAG 2.1 AA)
Recommended Next Action is back
It's in the Course Progress panel, below Focus Areas, since it's on Mary's in-scope list in #767. The copy only uses what the #757 API returns: the subsection name, the score threshold and the competency name. For example, "Retake Draft a persuasive memo and score 80% or better to demonstrate Written Communication." There's no attempt count, because the API can't provide one. A Paragon primary button ("Retake assignment") is the single action. The card uses only Paragon colors, and all of its text is 9.4:1 or better.
For developers
#CBD5E1,#64748B,#475569) and the new green (#3FA36F) and red (#741420) aren't Paragon colors. They need to be added as tokens, or the closest Paragon colors chosen.reasonisretry_availableand "Start" for a subsection that hasn't been started yet.next_actionisnull.<strong>on the normal body style.@jmakowski1123, can you approve this direction? Once you do, I'll replace the original status components with these versions and remove the alternatives.
illiphilli commentedon Oct 13, 2026
@jmakowski1123 @mgwozdz-unicon recording the outcome of today's Axim/Unicon sync: I walked through the status-clarity options on the comparison board, and think we got a nod from Jenna that this is the right path. I'm treating that as approval. Jenna, reply here if I've misread that.
What Option G is: status colors ordered by urgency, so lighter means less urgent and the order holds in grayscale and for colorblind users:
Each status also keeps its own icon and text label, so color is never the only cue.
One correction from the call. Per Mary, the MVP assumes no retakes. So the Written Communication tooltip now reads "Complete ANY at 80% or better". With one assignment Not Demonstrated and one still Available, the learner can still demonstrate it, so Partially Attempted is correct. Under "all", it would have been Not Demonstrated.
Next steps on my side: