Matching assignments
An assignment is identified by its name and due date. For each class, the two snapshots’ assignments are matched on that pair:
If a class lists two assignments with the same name and due date, they share one identity and only one of them is compared.
Fields compared
For matched assignments, these fields are compared:categoryscore_rawpercentgradehas_comments- each status flag on its own:
collected,late,missing,exempt,absent,incomplete,excluded
Class-level changes
Separately from assignments, each snapshot records:- classes that appeared or disappeared
- classes whose
final_gradechanged
class_level in the rolling index and kept out of the assignment totals.
Two layers, one definition
Change detection runs in two places for performance reasons:1
Rolling index (Python, after each scrape)
The scraper’s
/append-index endpoint diffs the new snapshot against the previous one and stores the counts. The calendar colors each day from these counts without fetching any snapshots.2
Day view (TypeScript, on demand)
When you open a day, the browser fetches that snapshot and the previous one and diffs them field by field to produce the detail rows.