Grading Interface Review
Pawtograder · grading interface · usability review

Grading 20 submissions in a row

A walkthrough of the grader-facing submission view as it ships on staging (146759be). It covers three roles: a grader with assigned reviews, a grader with nothing assigned, and an instructor. It ends with a proposed scope for one larger PR.

Captured 2026-10-03 on a fresh local stack (433/433 migrations, production build) Seeded: 6 students, 2 graders, 1 instructor; one code assignment and one survey-only (no_submission) assignment
1 confirmed bugThe Review Task box shows the assignee's profile UUID. Anyone else viewing the submission sees no assignee at all.
Tab is never remembered"Next Incomplete" always opens Files, or Grade on survey-only assignments. Each submission costs at least one extra click.
Completing doesn't advanceThere are two "Complete" buttons that write different records. Only one of them offers "Complete + Next", and part-scoped graders can't see that one.
Rubric starts below the foldOn a 1600×1000 screen, the "Grading Rubric" heading sits at about y=970. The grader scrolls on every submission.

The bug: "Assigned to: <uuid>"

Review Task box reading 'Assigned to: faa75f9b-d160-43ae-90b4-a39b0f363c4a'
Grader Gary's own review. layout.tsx:2175 renders reviewAssignment.assignee_profile_id directly.

Replacing the UUID with a name is a one-line change: <PersonName uid=… showAvatar={false} />. That component is already imported in the file and already used by the review toolbar. The one-line fix only fixes the case where the line matters least, though:

The fix for all three: load every review assignment on the submission for staff viewers, and render a line like "Assigned to Gary Grader (you) · due Oct 5", "Assigned to Gary Grader · due Oct 5", or "Not assigned". The same source can drive an "Assigned grader" column on the dashboard.

Grader Grace viewing Alan Turing's submission with no assignee shown
Grace, with nothing assigned, opens Alan's submission. It's assigned to Gary, but the page doesn't say so. She also gets a working "Complete Review" button.
Assignment dashboard with an empty Grader column for all six students
Assignment dashboard. Five of the six submissions are assigned to Gary, yet the Grader column is empty because it shows the completer.

Walkthrough: grader with assigned reviews

This is the path Gary takes to grade his five assigned submissions. One of them is scoped to a single rubric part.

Grading assigned to me table listing five students
Entry: "Grading assigned to me". Rows are sorted by due date. Each row is an onClick, not a link, so middle-click, open-in-new-tab and keyboard focus don't work. Clicking a row opens the submission root with ?review_assignment_id.
Submission view defaulting to Autograder Detail with the rubric sidebar
Landing tab: Autograder Detail. Graders default to Results when there is autograder output, otherwise Files. In the sidebar, the review task, score, actions, automated checks, active-rubric strip and descriptions toggle all come before the rubric. "Grading Rubric" starts at the bottom edge of the screen. The review due date appears twice before the rubric and a third time under it.
Complete Review Assignment popover listing missing required checks; a second Complete Review button sits in the sidebar
Two "Complete" buttons. "Complete Review Assignment" (top) writes review_assignments.completed_at. "Complete Review" (sidebar) writes submission_reviews.completed_at. Only the sidebar button has "Complete + Next", and the sidebar button is hidden from graders whose assignment is scoped to rubric parts.
After Next Incomplete the grader is on the Files tab of the next submission
"Next Incomplete" from Autograder Detail lands on Files. useNextIncompleteReview hard-codes /files, and so do the dropdown and selector in assignment-grading-toolbar.tsx. The order follows submission ID, not the order in the table the grader started from. There is no Previous.
Grade tab showing the student-facing ledger with 'Your grade hasn't been released yet'
The "Grade" tab is the student's view. For a grader it reads "Your grade for this assignment hasn't been released yet", and there's no rubric to grade with. On survey-only assignments, the same tab label is the editable rubric.
Part-scoped review with View + Grade Full Rubric and no Submission Review Actions
Part-scoped review. The banner names the part and offers "View + Grade Full Rubric". The sidebar has no "Complete Review", so these graders never get "Complete + Next".

Walkthrough: survey-only assignment

This walkthrough uses a no_submission assignment with a linked survey. The grader's job is to read each student's answers and fill in the rubric.

Survey-only submission opens on Grade with a full-width rubric
Every submission opens on Grade. The rubric fills the full width, with no survey answers in view.
Survey tab showing the student's answers with the rubric sidebar on the right
The Survey tab has everything needed to grade: the answers on the left and the editable rubric on the right. This is the screen the grader actually wants.
After Next Incomplete the grader is back on the Grade tab
"Next Incomplete" from the Survey tab returns to Grade (/submissions/32/grade?review_assignment_id=28). With 20 students, that's 20 extra clicks plus the scroll back to the answers.

Walkthrough: instructor

Instructor Grading Progress Dashboard listing Gary Grader with 5 pending
Grading Assignments page. Per-TA counts are correct here (Gary: 5 pending). The submission page and the assignment dashboard don't connect back to this information.

All findings

SeverityFindingWhere
BugShows "Assigned to: <uuid>". Other staff see no assignee at all.submissions/[id]/layout.tsx:2175
HighCross-submission navigation always forces /files and drops the current tab. No tab memory exists.hooks/useNextIncompleteReview.ts:51, assignment-grading-toolbar.tsx:167,296
HighSurvey-linked no_submission assignments default to Grade instead of Survey.layout.tsx:2283, submissions/[id]/page.tsx:28
HighTwo completion buttons write different tables. "Complete + Next" only exists on the sidebar button, which part-scoped graders don't see. "Complete Review Assignment" stays on the page.submission-review-toolbar.tsx:368–423, 430–619; layout.tsx:1825
HighThe rubric starts at the bottom of a 1000px-tall screen, under five blocks of status.RubricView, layout.tsx:2165–2228
MediumFor staff, "Grade" is the read-only student ledger with student-facing copy. On no-submission assignments, the same label is the editable rubric.grade/page.tsx, layout.tsx:2624
Medium"Next" follows submission ID, while the table sorts by due date and the dropdown labels by name. There is no Previous.useNextIncompleteReview.ts:40–43
MediumNo keyboard shortcuts for next/previous submission, complete, or switching tabs. Today's j/k and n/p only work inside Files.files/page.tsx:1665–1719
MediumThe dashboard's "Grader" column shows the completer, so assignments are invisible until they're done.assignmentsTable.tsx:727
LowThe review due date appears 3 times (banner, Review Task box, rubric header).layout.tsx:2176, toolbar
Low"Assigned to me" rows aren't links (no new tab, no keyboard focus).reviewAssignmentsTable.tsx:250
LowAn auto-picked review_assignment_id adds a router.replace hop on each load.useSubmissionReview.tsx:84–147
Low · from code onlyThe /course/…/grade/… staff route has a footer link to a route that doesn't exist and a Survey tab with no page. I didn't exercise this in the browser.grade/…/layout-client.tsx:13, layout.tsx:2606

Proposed scope for the PR

This is grouped so the first tier can ship on its own if the PR gets too big. Every item in the first tier removes a per-submission click or fixes wrong information.

Tier 1: the 20-in-a-row loop

  1. Assignee shown to every staff viewer, by name. Show "(you)", another grader's name, or "Not assigned", with due date and status. Covers the bug and both flows (assigned and unassigned).
  2. Remember the sub-tab per assignment. Save the last tab used for that assignment, and have every cross-submission link use it: Next Incomplete, the dropdown, the selector, Complete + Next, and the table rows. If the next submission doesn't have that tab, fall back to the default.
  3. Survey becomes the default tab on no_submission assignments that have a linked survey, both for the first visit and for the canonicalizing redirect.
  4. One completion control with "Complete + Next". Available on the review-assignment button too, so part-scoped graders get it.
  5. Previous / Next in the toolbar, using the same order as the "Assigned to me" table.

Tier 2: less scrolling, clearer labels

  • Move the rubric to the top of the sidebar. Put the review task in the toolbar banner (one due date), and collapse automated checks by default.
  • For staff, rename the Grade tab to something like "Student view", or make it the editable rubric, consistent with no-submission assignments.
  • Keyboard shortcuts: next/previous submission, complete + next, and switching tabs (? help already exists).
  • Add an "Assigned grader" column on the assignment dashboard, next to the completer column.

Out of scope: separate tickets

  • Fix the staff /grade/… route's broken links and Survey tab.
  • Make "Assigned to me" rows real links.
  • Remove the review_assignment_id redirect hop.

Questions to settle before building

Where should tab memory live?

Options are localStorage per (assignment, user), or the URL (carry the current sub-page on every navigation link). The URL is simpler and survives a shared link. localStorage also covers "come back tomorrow". I'd do both: the URL first, localStorage as the fallback.

Should the memory be per assignment or global?

Per assignment avoids carrying "Survey" onto a code assignment that has no survey tab. A global setting would be wrong on mixed assignment types.

Should completing auto-advance?

One option is to make "Complete + Next" the primary action and "Complete" secondary. The other is a per-user preference.

What should "Next" follow?

The table order (due date, then name), submission ID as today, or a fixed order chosen when grading starts?

Should an unassigned grader be able to complete someone else's review?

Today Grace gets a working "Complete Review" on Gary's submission. Should showing the assignee come with a warning, or with a restriction?

Method and caveats

I took the screenshots with a temporary Playwright script against a production build on localhost:3001, with the e2e harness's visual-test masking turned off. The masking replaces the "Assigned to" line with a placeholder, which is why existing visual tests never caught the UUID. The survey-only submissions were seeded with the pre-baked submission helper, so they show autograder checks that a real manual submission wouldn't have. The Grade/Survey tab behaviour doesn't depend on that. Code references point to staging at 146759be.