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.
| Assignment | Data |
|---|---|
| Assignment 1 | required The Zillow ZHVI extract. The app refuses to start a run without it. |
| Assignment 2 | none Students choose their own dataset, so the saved outputs are graded. |
| Assignment 3 | optional 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#
| Page | What it is for |
|---|---|
| Overview | The class dashboard: mean, median, distribution, most common issues. You can also reload a saved session from here. |
| Submissions | What discovery found: the chosen notebook per student, warnings, and submissions with multiple or missing notebooks. |
| Grading | Starts a run and shows live progress per student and per stage: notebook execution, structural checks, hidden tests, feedback generation. |
| Students | The per-student page: each rubric item's score, status, confidence, feedback and evidence, the rendered notebook, and manual overrides. |
| Review Queue | Only the submissions that need a decision, broken submissions first. |
| Class Analytics | Per-item breakdown across the class: where points were lost and how often. |
| Export | Download grades, feedback and archives, and regrade a session. |
| Settings | Execution 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#
| Setting | Default | Notes |
|---|---|---|
| Execution mode | docker | local runs student code on this machine with no network, memory or filesystem isolation. |
| Notebook timeout | 600 s | A rubric's execution_timeout_seconds raises it, never lowers it. Assignment 3 asks for 1800. |
| Cell timeout | 300 s | |
| Memory / CPU limit | 2g / 1.0 | Passed to docker run. |
| Docker image | musa-grader:latest | |
| Review every submission that loses points | on | See above. |
| Confidence threshold | 0.80 | Items graded below this confidence go to the queue. |
| LLM grading | off | Provider anthropic. Needs ANTHROPIC_API_KEY in the environment. Low-confidence judgements still go to a person. |