Evaluate student assignment reports using three independent reviewers for consensus grading. Each reviewer reads the PDF and context files independently, then provides section assessments in Swedish. Results compiled with majority voting into GRADING-RESULTS.md. Use when grading prepared student submissions.
Evaluate student reports using three independent reviewers for reliable consensus grading.
MUST READ from skill folder:
FEEDBACK-EXAMPLES.md - Swedish feedback tone and styleOUTPUT-FORMAT.md - Expected output structureCritical: This skill uses EVALUATION-STATUS.json to track progress and survive compacting events.
The status file enables:
{
"evaluation_session": {
"assignment": "Assignment Name",
"assignment_folder": "/full/path/to/assignment",
"started": "YYYY-MM-DD",
"last_updated": "YYYY-MM-DD",
"status": "in_progress|completed",
"batch_size": 3
},
"files": {
"grading_results": "GRADING-RESULTS.md",
"student_list": "STUDENT-LIST.md",
"assignment": "ASSIGNMENT.md",
"course_description": "/path/to/COURSE-DESCRIPTION.md",
"background": "BACKGROUND.md",
"special_considerations": "SPECIAL-CONSIDERATIONS.md",
"student_reports_folder": "student-reports/"
},
"progress": {
"total_students": 0,
"submitted_reports": 0,
"missing_reports": 0,
"evaluated": 0,
"remaining": 0
},
"batches": {
"batch_1": {
"status": "completed|in_progress|pending",
"students": [
{"name": "Student Name", "file": "lastname_firstname_rapport.pdf"}
],
"results": {"VG": 0, "G": 0}
}
},
"completed_evaluations": [
{"name": "Student Name", "grade": "G", "consensus": "3/3"}
],
"missing_submissions": ["Student Name"],
"next_batch": "batch_N"
}
On skill invocation:
EVALUATION-STATUS.json in assignment foldernext_batchEach assignment folder contains the context needed for evaluation. Most files must be in the assignment folder, but some (like COURSE-DESCRIPTION.md) can be shared in parent folders.
| File | Purpose | Search Behavior |
|---|---|---|
STUDENT-LIST.md | Roster with submission status and grades | Assignment folder only |
ASSIGNMENT.md | The assignment instructions (defines sections to evaluate) | Assignment folder only |
COURSE-DESCRIPTION.md | Formal course criteria and learning objectives | Parent folders up to project root |
BACKGROUND.md | Project scenario and learning context | Assignment folder only |
SPECIAL-CONSIDERATIONS.md | Exceptions and adjustments for this assignment | Assignment folder only |
EVALUATION-STATUS.json | Progress tracking (created/updated by skill) | Assignment folder only |
student-reports/ | Folder containing renamed PDFs | Assignment folder only |
project-root/
├── COURSE-DESCRIPTION.md # Can live here (shared across assignments)
└── assignments/
├── COURSE-DESCRIPTION.md # Or here (shared across assignments)
└── assignment-N/
├── COURSE-DESCRIPTION.md # Or here (assignment-specific)
├── STUDENT-LIST.md # WHO to evaluate
├── ASSIGNMENT.md # WHAT to look for (report sections)
├── BACKGROUND.md # WHY (context, scenario)
├── SPECIAL-CONSIDERATIONS.md # EXCEPTIONS (what's adjusted)
├── GRADING-RESULTS.md # OUTPUT (created/updated by skill)
└── student-reports/
└── *.pdf # Student submissions
COURSE-DESCRIPTION.md search order: Assignment folder → parent folder → grandparent → ... → project root. Uses the first one found.
All feedback must be framed positively. Never use negative critique.
When writing feedback, imagine you are actually saying this to the student face-to-face. Ask yourself: "Would I actually say this?" If it sounds bureaucratic, rewrite it.
| Principle | Description |
|---|---|
| Face-to-face test | The feedback should feel like something you'd actually say to the student in person |
| Positive framing | Frame everything positively - never mention what's missing or lacking |
| Genuine enthusiasm | Show real enthusiasm when something is good ("Riktigt snyggt!", "Kul att se...") |
| Natural Swedish | Use conversational language, not formal report language |
Each student report is evaluated by three independent subagents in parallel:
| Benefit | Explanation |
|---|---|
| Reliability | Multiple perspectives reduce bias |
| Consensus validation | Unanimous vs split decisions visible |
| Better feedback | Select best feedback from variety |
| Voting Pattern | Final Grade |
|---|---|
| 3/3 unanimous | Reviewer grade |
| 2/3 majority | Majority grade |
| 1/1/1 split | Flag for instructor review |
Before anything else, check if a session already exists.
EVALUATION-STATUS.json in the assignment folderResuming evaluation session from [last_updated]next_batchPrevious session completed. Starting fresh evaluation.No existing session. Starting new evaluation.Resume display format:
## Resuming Evaluation Session
Assignment: [assignment name]
Last updated: [date]
Progress: [evaluated]/[total] students evaluated
Completed batches: [N]
Next batch: [batch_N] with [3] students
Continuing evaluation...
Before starting evaluation, check that all required input files exist.
Standard files - Check in assignment folder only:
STUDENT-LIST.mdASSIGNMENT.mdBACKGROUND.mdSPECIAL-CONSIDERATIONS.mdstudent-reports/*.pdf (at least one PDF)Parent-searchable files - Check assignment folder first, then parent folders up to project root:
COURSE-DESCRIPTION.md - Search upward until foundIf any files are missing, display this table to the terminal:
## Missing Input Files
The following files are required for evaluation:
| File | Status | Search Location | Purpose |
|------|--------|-----------------|---------|
| STUDENT-LIST.md | [Found/MISSING] | Assignment folder | Roster with student names, submission status, and grade column |
| ASSIGNMENT.md | [Found/MISSING] | Assignment folder | Assignment instructions - defines report sections and weights |
| COURSE-DESCRIPTION.md | [Found at: path / MISSING] | Parent folders → root | Formal course learning objectives and G/VG criteria |
| BACKGROUND.md | [Found/MISSING] | Assignment folder | Project scenario and learning context |
| SPECIAL-CONSIDERATIONS.md | [Found/MISSING] | Assignment folder | Exceptions and adjustments for this assignment |
| student-reports/*.pdf | [N found/MISSING] | Assignment folder | Student report PDFs to evaluate |
Then use AskUserQuestion to ask:
"Some required input files are missing. Do you want to continue anyway?"
- Options: "Yes, continue with available files" / "No, stop and fix missing files"
If all files are present, display a brief confirmation:
## Input Validation Passed
All required files found in [assignment-folder]:
- STUDENT-LIST.md
- ASSIGNMENT.md
- COURSE-DESCRIPTION.md
- BACKGROUND.md
- SPECIAL-CONSIDERATIONS.md
- student-reports/ (N PDFs found)
Proceeding with evaluation...
Read all context files, using the paths determined in Step 0.5:
[assignment-folder]/ASSIGNMENT.md # Report structure and sections
[found-path]/COURSE-DESCRIPTION.md # Formal G/VG criteria (may be in parent folder)
[assignment-folder]/BACKGROUND.md # Project context
[assignment-folder]/SPECIAL-CONSIDERATIONS.md # Exceptions
Note: COURSE-DESCRIPTION.md path comes from the parent folder search in Step 0.5. Pass this resolved path to reviewer subagents.
From these files, extract:
Read [assignment-folder]/STUDENT-LIST.md and identify:
For new sessions only (skip if resuming from existing session):
Create EVALUATION-STATUS.json with:
{
"evaluation_session": {
"assignment": "[from ASSIGNMENT.md title]",
"assignment_folder": "[full path]",
"started": "[today's date]",
"last_updated": "[today's date]",
"status": "in_progress",
"batch_size": 3
},
...
}
Write the initial status file before starting any evaluations.
Batch size: Maximum 3 students per batch. This smaller batch size enables:
students_to_evaluate = [students with submitted reports but no grade]
batches = split into groups of max 3 students
Example for 28 students:
For a batch of N students (max 3), spawn N × 3 = up to 9 subagents in parallel.
Each subagent receives the same prompt (see REVIEWER-PROMPT.md) instructing them to:
Spawning pattern for batch:
# Single message with all Task calls for the batch (max 9 parallel tasks):
Task: Student 1 - Reviewer 1
Task: Student 1 - Reviewer 2
Task: Student 1 - Reviewer 3
Task: Student 2 - Reviewer 1
Task: Student 2 - Reviewer 2
Task: Student 2 - Reviewer 3
Task: Student 3 - Reviewer 1
Task: Student 3 - Reviewer 2
Task: Student 3 - Reviewer 3
Wait for all subagents in the batch to complete before proceeding. Each returns:
For each student in the batch, apply consensus:
Majority voting:
If all 3 agree: Final grade = reviewer grade (unanimous)
If 2/3 agree: Final grade = majority grade (majority)
If all different: Flag for manual review (split)
Select best feedback from the 3 options:
After processing all students in the batch:
GRADING-RESULTS.md in one write operationSTUDENT-LIST.md in one edit operationStatus file updates after each batch:
{
"evaluation_session": {
"last_updated": "[current date]"
},
"progress": {
"evaluated": [previous + batch count],
"remaining": [previous - batch count]
},
"batches": {
"[current_batch]": {
"status": "completed",
"results": {"VG": N, "G": M}
}
},
"completed_evaluations": [
// Append new evaluations
{"name": "...", "grade": "...", "consensus": "..."}
],
"next_batch": "[next_batch_key or null if done]"
}
This batch write approach:
After each batch completes, display summary for all students in the batch:
## Batch 1/10 Complete (3 students)
| Student | Grade | Consensus |
|---------|-------|-----------|
| Andersson, Anna | VG | 3/3 |
| Eriksson, Erik | G | 2/3 |
| Johansson, Johan | VG | 3/3 |
✓ 3 evaluations saved to GRADING-RESULTS.md
✓ STUDENT-LIST.md updated with grades
✓ EVALUATION-STATUS.json updated (next: batch_2)
Progress: 3/28 students evaluated (10.7%)
If more batches remain, repeat steps 3b-3f for the next batch.
Important: Each batch is self-contained. If a compacting event occurs:
After all batches complete:
{
"evaluation_session": {
"status": "completed",
"last_updated": "[current date]"
},
"next_batch": null
}
## Evaluation Complete
**Total students evaluated:** [N]
**Batches processed:** [M] (batch size: 3)
| Grade | Count |
|-------|-------|
| VG | [X] |
| G | [Y] |
**Consensus quality:**
- Unanimous (3/3): [N]
- Majority (2/3): [N]
- Split (flagged): [N]
✓ EVALUATION-STATUS.json marked as completed
Proceeding to generate summary tables...
After all students are evaluated, add two summary sections to GRADING-RESULTS.md:
Create a table showing all evaluated students with their grades and section assessments at a glance. This table should:
Template format:
## Sammanfattning
| Student | Betyg | Röster | [Section1] | [Section2] | [Section3] | [Section4] | [Section5] | [Section6] |
|---------|-------|--------|------------|------------|------------|------------|------------|------------|
| Lastname, Firstname | VG | 3/3 | Bra | Mycket bra | Bra | Mycket bra | Bra | Mycket bra |
| ... | ... | ... | ... | ... | ... | ... | ... | ... |
Column guidelines:
After the compact table, add statistical summaries:
# Summary Statistics
## Grade Distribution
| Grade | Count | Percentage |
|-------|-------|------------|
| **VG (Väl godkänt)** | [N] | [X]% |
| **G (Godkänt)** | [N] | [X]% |
| **Total Evaluated** | [N] | 100% |
### VG Recipients ([N] students)
| Student | Consensus | Notable Strength |
|---------|-----------|------------------|
| [Name] | 3/3 | [Key observation from evaluation] |
| ... | ... | ... |
### Consensus Breakdown
| Voting Pattern | Count |
|----------------|-------|
| Unanimous (3/3) | [N] |
| Majority (2/3) | [N] |
| Split (1/1/1) | [N] |
### Missing Submissions ([N] students)
- [Name]
- ...
---
*Evaluation completed: [DATE]*
*Method: Three-reviewer consensus grading*
*All feedback written in Swedish using du/din form*
The summaries should be placed at the end of GRADING-RESULTS.md, after all individual student evaluations. Structure:
# Grading Results - [Assignment Name]
[Individual student evaluations...]
---
## Sammanfattning
[Compact assessment overview table]
---
# Summary Statistics
[Statistics tables]
| Swedish Term | English | Grade Level |
|---|---|---|
| Okej | Okay | Pass minimum |
| Bra | Good | Solid pass |
| Mycket bra | Very Good | Distinction level |
| Utmärkt | Excellent | Beyond requirements |
| Grade | Swedish | Criteria |
|---|---|---|
| G | Godkänt | All sections meet minimum |
| VG | Väl godkänt | G criteria + VG-eligible sections show deeper understanding |
To evaluate just one student:
Evaluate the report for [Student Name] in [assignment-folder-path]
Use the three-reviewer method from report-evaluation skill.
To evaluate all remaining students:
Evaluate all ungraded students in [assignment-folder-path]
Use parallel batch mode (3 students per batch, 3 reviewers each).
Write results to GRADING-RESULTS.md, STUDENT-LIST.md, and EVALUATION-STATUS.json after each batch.
Performance characteristics:
Resuming after compaction:
Resume evaluation in [assignment-folder-path]
The EVALUATION-STATUS.json will be read automatically.
If reviewers split 1/1/1 (e.g., G, VG, G with different reasoning):
G (split - instructor review)Before completing:
GRADING-RESULTS.md and EVALUATION-STATUS.json contain student names and grades. They must be:
.gitignore