Course selection & graduation roadmap

The ANU system that reliably ruins a Master of Computing student’s week isn’t a single broken page — it’s the fact that there is no single page. Working out whether a term’s course picks actually count towards graduation means cross-referencing the Study Options table, your specialisation’s own list, prerequisite chains, incompatible-course notes, and how many units you’ve actually banked, all by hand, across several different handbook pages. This app is that cross-reference, built for program 7706XMCOMP (crit-7’s chosen specialisation: Human-Centred and Creative Computing, though the model covers all seven).

/ is the course-selection page: pick a term, see what’s offered, what’s locked (missing a prerequisite, a duplicate, incompatible with something already planned, off-semester), and how picking a course moves your outstanding requirements. /roadmap/ is the graduation audit: every requirement group — Core, Foundational, Capstone, your specialisation’s own 24 units, Computing Elective, University Elective — with real progress bars and a top-line “would this plan graduate you” verdict. /completed/ is the read-only transcript view. Picks persist in a real SQLite database (.data/app.db) across reloads and restarts.

What good looks like here

Good means a student can trust the picker not to lie to them: a course that’s disabled in the dropdown is disabled for a real, statable reason (shown as a tooltip, not just greyed out), and a plan that shows “satisfied” against a requirement group is one that would actually satisfy it under the real handbook rule — not a simplified stand-in. Getting there meant reading the handbook’s own wording closely rather than approximating it: “12 units from completion of elective courses” is not “2 named placeholder courses”; “the subject area COMP…or ENGN” is not “any course code starting with COMP.” Both were bugs this repo shipped and then fixed once checked against the source.

What’s enforced vs. judgement call: spec/ pins down that every page has one h1, a real nav landmark, accessible alt text, and no double-counted enrolment across two requirement buckets — those are checks, not opinions. CLAUDE.md records the judgement calls behind them: never inventing handbook data, keeping catalogue data separate from user data, and treating proactive testing as the agent’s own responsibility rather than something the user has to trigger by finding a bug. What’s deliberately out of scope: a full constraint solver for list max-caps and 8000-level sub-rules some specialisations carry — this models minimums, not every cap.