grading

Grades Canvas LMS submissions with consensus grading, human review gates, and FERPA de-identification.

4|4|Updated Apr 15, 2026
One-click install
npx skills add https://github.com/chaz-clark/canvas-toolbox --skill grading-chaz-clark
Or copy as Structured Prompt for Agent▼
Please help me install this Agent Skill.
Skill: grading
Source: https://github.com/chaz-clark/canvas-toolbox/tree/main/.agents/skills/grading
Command: npx skills add https://github.com/chaz-clark/canvas-toolbox --skill grading-chaz-clark

SYSTEM DOCUMENTATION & REQUIREMENTS

What problem does it solve? Grading with AI risks stale data, fabricated claims about student work, duplicate comments, and FERPA violations. This Skill enforces a human-in-the-loop protocol so every grade and comment that reaches a student in Canvas is instructor-reviewed, honestly disclosed, and privacy-safe. ## Core Features & Use Cases - Consensus grading pipeline: Fetch submissions with grader_fetch.py, run 3-pass consensus grading (grader_grade.py --bulk → grader_consensus.py), and push results through grader_push.py with two mandatory in-chat instructor approval pop-ups. - FERPA de-identification: Submissions are stripped of names into opaque keys before reaching the LLM, then re-identified by key (never sort order) via grader_reidentify.py; Zone-2 name-bearing files are never read or displayed. - Disclosure tags and standing columns: Every comment carries a provenance tag (ai, hybrid, or script), and instructor-computed "your grade" columns are pushed roster-keyed with grader_standing.py. - Use Case: An instructor asks the agent to grade a challenge: the agent fetches fresh submissions, de-identifies them, drafts consensus grades and feedback, shows the full review surface in chat, and pushes only after the instructor clicks Allow at two guardian pop-ups. ## Quick Start Ask the agent to grade the submissions in grading/<challenge-name> and it will fetch fresh Canvas data, run consensus grading, show you the comments and old-to-new grade preview, and push only after your approval.

Frequently Asked Questions about grading

High-intent search queries and answers about installing and using this skill.

FAQPage Schema
How do I grade Canvas submissions with AI assistance safely?▼

Run grader_fetch.py on the challenge directory, then grader_grade.py --bulk followed by grader_consensus.py for 3-pass consensus grading. Show the generated comments and old-to-new grade preview in chat, then push with grader_push.py after the instructor approves two guardian pop-ups.

How does the grading workflow protect student privacy under FERPA?▼

grader_fetch.py de-identifies submissions into opaque keys before anything reaches the LLM, and names live only in gitignored keymap files. Re-identification uses grader_reidentify.py keyed by user_id, and Zone-2 name-bearing files are never read or displayed.

Can I push grades to Canvas with a custom Python script?▼

No. Grades and comments reach Canvas only through grader_push.py or grader_standing.py. The grade_guardian hook deterministically blocks creating, editing, or running hand-written scripts that write to Canvas, because they bypass the review gate, duplicate-comment protection, and disclosure tags.

What is the difference between grader_push and grader_standing?▼

grader_push handles assignments that take student submissions and is keyed on submission files with a regrade gate. grader_standing handles No-Submission standing columns, is roster-keyed by user_id, overwrites freely, and accepts --yes because values are instructor-computed.

Why does grader_push skip some rows during a push?▼

Rows are skipped when already pushed (use --regrade for genuine resubmissions), when the push would lower an existing grade (use --allow-lower), or for inactive and Test students (use --include-inactive). The fix is always a flag on the tool, never a direct API call.

Can this grading workflow work without a Canvas API?▼

Yes, for courses on other LMS platforms with local-only inputs. Declare the course's Zone-2 files in .claude/ferpa_zone2.txt, work from roster ID codes, and use local_feedback_join.py to join names back into code-keyed feedback at output time.