From grading-toolkit
Use when starting a new grading assignment and the project workspace does not yet exist — no workflow.yml, no grade stubs, no scripts directory. Run before any other grade-* skill.
How this skill is triggered — by the user, by Claude, or both
Slash command
/grading-toolkit:grade-initThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Initialize a new grading project. Follow these steps in order without skipping.
Initialize a new grading project. Follow these steps in order without skipping.
Run these commands and note the output — present the results as suggestions in Step 2:
conda env list
# On Windows (TeX Live):
where pdftoppm 2>nul || dir /s /b "C:\texlive\*pdftoppm.exe" 2>nul
# On Mac/Linux:
which pdftoppm || find /usr -name pdftoppm 2>/dev/null
Ask the following questions, presenting detected values as defaults:
conda run -n <env>, python, or a custom prefixrubric.md. If no, create from the default 8-category template at the end of this document.answer_key.mdmetadata.yml, or create blank template:
# submissions/metadata.yml
# One entry per student:
students:
- submission_id: "student_id"
student_name: "Student Name"
pdf: "<SID>.pdf"
Copy all scripts from this skill's scripts/ directory to the project's scripts/ directory.
Then run:
<run_prefix> scripts/check_pdf_type.py submissions/<first_pdf_filename>
Use the output (text_layer or image_layer) in workflow.yml. If image_layer, also ask:
/usr/bin/pdftoppm on Linux/Mac)Create workflow.yml at the project root:
project:
name: "<project_name>"
course: "<course_name>"
instructor: "<instructor_name>"
created_at: "<YYYY-MM-DD today>"
profile: "instructor_profile.md"
submissions:
directory: "submissions/"
metadata: "submissions/metadata.yml"
pdf_type: "<text_layer|image_layer>"
pdf_renderer:
tool: "pdftoppm"
path: "<pdftoppm_path>"
dpi: <dpi>
max_pages: <max_pages>
python:
run_prefix: "<run_prefix>"
questions:
- id: "<id>"
description: "<description>"
# repeat for each question
comment_strategy: "collaborative"
output:
format: "<csv|json|both>"
csv_path: "grades.csv"
json_dir: "workspace/grades/"
paths:
rubric: "rubric.md"
answer_key: "answer_key.md"
comments: "comments.md"
decisions: "decisions.md"
transcriptions: "workspace/transcriptions/"
grades: "workspace/grades/"
pages: "workspace/pages/"
scripts: "scripts/"
Create these directories (if they don't exist):
submissions/workspace/transcriptions/workspace/grades/workspace/pages/scripts/Create blank files if not already imported:
rubric.md (see default template below, or use imported rubric)answer_key.mdcomments.mddecisions.mdRead submissions/metadata.yml. For each student, create workspace/grades/<SID>_grades.json:
{
"submission_id": "<SID>",
"student_name": "<name>",
"grades": { "<Q1>": null, "<Q2>": null },
"comments": { "<Q1>": null, "<Q2>": null },
"explanations": { "<Q1>": null, "<Q2>": null },
"flags": []
}
Replace <Q1>, <Q2>, etc. with the actual question IDs from workflow.yml. Every question must have a null entry in every student's file.
If instructor_profile.md does not exist:
"No instructor profile found. Would you like to create one now with /grade-profile? A profile captures your grading style and can be reused across assignments. You can also skip this and run /grade-profile later."
# Rubric
## Correct
Full credit. No comment needed.
## Minor communication error
Minor notation, terminology, or arithmetic/transcription error that does not affect the substance of the argument.
## Multiple minor communication errors
Two or more independent minor communication errors.
## Minor justification error
Minor error in logic or justification — one key element is missing or one mechanism is described incorrectly.
## Multiple minor justification errors
Two or more independent minor justification errors.
## Major errors or misconceptions
Fundamentally wrong approach, or a core misconception about the concept being tested.
## Incoherent/incomplete evidence of understanding
The response fails to construct a coherent argument. Use only when the reasoning is genuinely impossible to follow — not merely wrong or brief.
## Blank
No response, or a response with no written justification (e.g., a checkbox selected with no explanation).
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub justin-graham/grading-toolkit --plugin grading-toolkit