MUSA Graderv0.1.0

User guide

TA workflow

The Streamlit app is the main interface. It configures a GradingService and shows what comes back, and nothing in the UI grades anything itself.

Select an assignment
  → upload a Canvas ZIP or point at a submissions folder
  → review what discovery found
  → Run Grader (notebooks execute in isolated containers)
  → class overview: mean, distribution, most common issues
  → review queue: only the submissions that need a decision
  → per-student page: rubric scores, evidence, manual override
  → export grades.csv and per-student feedback

Start the app#

streamlit run app.py

The app binds to localhost. Uploads can be up to 600 MB, because the Zillow extract is well over Streamlit's 200 MB default. See .streamlit/config.toml.

The sidebar#

Assignment#

Choose any rubric found in rubrics/. The list is built from every YAML file that parses.

Submissions#

Upload a Canvas export ZIP, or type a local folder path and press Load folder. Both layouts are supported: a folder of per-student folders, and a flat Canvas export (doejane_12345_67890_assignment1.ipynb, including _late_ files).

Assignment data#

Students hand in a notebook and nothing else, so you provide the data. Upload the file(s) here, or use "or use a file already on this machine" to give a path. Uploads are kept in .musa_grader_data/ and survive a restart. Each file in use is listed with its size and can be removed individually.

AssignmentData
Assignment 1required The Zillow ZHVI extract. The app refuses to start a run without it.
Assignment 2none Students choose their own dataset, so the saved outputs are graded.
Assignment 3optional The five files from assignment3-data.zip. Supplying them lets the grader re-run each notebook to confirm the saved answers. The sidebar names any of the five that are missing.

Pages#

PageWhat it is for
OverviewThe class dashboard: mean, median, distribution, most common issues. You can also reload a saved session from here.
SubmissionsWhat discovery found: the chosen notebook per student, warnings, and submissions with multiple or missing notebooks.
GradingStarts a run and shows live progress per student and per stage: notebook execution, structural checks, hidden tests, feedback generation.
StudentsThe per-student page: each rubric item's score, status, confidence, feedback and evidence, the rendered notebook, and manual overrides.
Review QueueOnly the submissions that need a decision, broken submissions first.
Class AnalyticsPer-item breakdown across the class: where points were lost and how often.
ExportDownload grades, feedback and archives, and regrade a session.
SettingsExecution mode and limits, review policy, optional LLM grading.

The review queue#

A submission goes to the queue when any of these applies:

  • It lost any points at all. This rule is on by default, and it is the strongest one.
  • The notebook failed to execute or timed out.
  • Discovery found multiple notebooks or none.
  • An item's confidence is below the threshold (default 0.80).
  • An item has status manual_review. This includes every qualitative item when LLM grading is off.

Each queue entry names the items that lost points and how many, and broken submissions sort above small deductions. Marking a submission reviewed, or overriding it back to full marks, removes it from the queue.

An automated deduction is a claim about a student's work

That is why a person signs off before it becomes a grade. Full marks need no defence and pass straight through. For a large class you can switch the rule off in Settings → Review every submission that loses points. The queue then holds only uncertain or failed submissions.

Manual overrides#

An override never replaces the automatic score. Both are kept:

{ "automatic_score": 12, "manual_override": true,
  "final_score": 15, "override_reason": "Alternative valid implementation." }

Re-running the grader regenerates the automatic scores. With Preserve manual overrides on, your decisions are reapplied on top. For extra-credit items (worth 0 points in the rubric), an override adds to the student's total without changing the maximum they are graded out of.

Settings#

SettingDefaultNotes
Execution modedockerlocal runs student code on this machine with no network, memory or filesystem isolation.
Notebook timeout600 sA rubric's execution_timeout_seconds raises it, never lowers it. Assignment 3 asks for 1800.
Cell timeout300 s
Memory / CPU limit2g / 1.0Passed to docker run.
Docker imagemusa-grader:latest
Review every submission that loses pointsonSee above.
Confidence threshold0.80Items graded below this confidence go to the queue.
LLM gradingoffProvider anthropic. Needs ANTHROPIC_API_KEY in the environment. Low-confidence judgements still go to a person.