For an agent on either AT runner.
Symptom
On the student gradebook, the score cell announces with no points value. From the NVDA log of run 31017279720, task gradebook__gradebook-assignment:
idx263: "link, View submission for Agent Assignment" // "Submitted slash 100"
The seeded submission scores 5/10 with a 100-point column, and the number a student actually wants — their score — is never spoken. VoiceOver on the same page reached only "Grade for Agent Assignment article", likewise with no score.
Why the lane was green anyway
GRADEBOOK_COLUMNS_TASK needles on assignmentName only (tools/a11y-judge/agent/tasks.ts), and the plan has zero milestones — so the task passes when the assignment name is heard, regardless of whether any score is reachable. The prompt asks the agent for "any score shown for it", but nothing asserts it.
While you are in there, the same log shows "no next heading" / "no next landmark" ×3 on that page, which suggests the gradebook's structure is thin for AT navigation generally.
Where to look
app/course/[course_id]/gradebook/ — how the score cell is rendered, and whether the value is in a visually-styled element that carries no text or is aria-hidden. Compare the DOM against what the accessibility tree exposes.
Definition of done
Beyond the visual fix: strengthening GRADEBOOK_COLUMNS_TASK to needle the score value (not just the assignment name) would make the lane actually guard this. Note the needle mechanism has a known weakness — bare numeric needles match incidental digits anywhere in the journey (see the memo in docs/a11y-session-memo-2026-08.md), so a score needle needs to be bound to context, not a bare 5.
Reproduce on the runner
npm run a11y:nvda -- --filter gradebook
Criteria: 1.3.1 Info and Relationships (A); 4.1.2 Name, Role, Value (A)
Symptom
On the student gradebook, the score cell announces with no points value. From the NVDA log of run 31017279720, task
gradebook__gradebook-assignment:The seeded submission scores 5/10 with a 100-point column, and the number a student actually wants — their score — is never spoken. VoiceOver on the same page reached only
"Grade for Agent Assignment article", likewise with no score.Why the lane was green anyway
GRADEBOOK_COLUMNS_TASKneedles onassignmentNameonly (tools/a11y-judge/agent/tasks.ts), and the plan has zero milestones — so the task passes when the assignment name is heard, regardless of whether any score is reachable. The prompt asks the agent for "any score shown for it", but nothing asserts it.While you are in there, the same log shows
"no next heading"/"no next landmark"×3 on that page, which suggests the gradebook's structure is thin for AT navigation generally.Where to look
app/course/[course_id]/gradebook/— how the score cell is rendered, and whether the value is in a visually-styled element that carries no text or isaria-hidden. Compare the DOM against what the accessibility tree exposes.Definition of done
Beyond the visual fix: strengthening
GRADEBOOK_COLUMNS_TASKto needle the score value (not just the assignment name) would make the lane actually guard this. Note the needle mechanism has a known weakness — bare numeric needles match incidental digits anywhere in the journey (see the memo indocs/a11y-session-memo-2026-08.md), so a score needle needs to be bound to context, not a bare5.Reproduce on the runner
Criteria: 1.3.1 Info and Relationships (A); 4.1.2 Name, Role, Value (A)