MolongloUniversityStudent Portal

Student Administration

Not signed in

Course enrolment, eligibility-first

ANU’s enrolment site lets you get most of the way through signing up for a course before telling you that you’re not actually allowed to take it — a missing prerequisite or permission code shows up on the last screen, after you’ve already picked a time slot and read the outline. This prototype inverts that: it shows every course sorted by whether your transcript already clears it, before you try to enrol in anything.

It’s dressed as the student portal of Molonglo University, which is fictional. Log in with any username and password; there’s no real authentication (see below). A brand-new username is offered a randomly generated but plausible transcript, so the portal starts populated instead of empty. The homepage is a tile hub, like a real student-administration system, covering timetable, degree planning, finances and personal details, but only Enrolment, Academic Records and a testing tool are built. Every other tile is visibly marked under construction and isn’t a link, so there are no dead pages to fall into.

Enrolment (/enrolment/) is the point of the prototype. As in the real portal, you search by subject area first: 196 real ANU courses across eleven disciplines, from Computer Science to Psychology and History. Unlike the real portal, each result row already says whether you can take the course: eligible, enrolled, completed, or not eligible, with the specific reason (“Needs COMP2300 or ENGN2219”, “Permission required”). The cue is deliberately quiet, just an edge stripe, a dot and a few words, so a whole subject fits on one screen at one line per course. Academic Records (/records/) is the read-only transcript those verdicts are computed from.

What good looks like here

The core bet is that eligibility should be legible before commitment, not revealed after it. Everything else follows from that:

Enforced vs. judgement

spec/invariants.test.ts enforces the baseline true of any page here: a language tag, one <h1>, a nav landmark, alt text, and an axe-core accessibility pass. It sweeps /, /enrolment/, /records/, /login/ and /readme/, which all render a real logged-out page rather than redirecting. /welcome/ and /god-mode/ require a logged-in session and the invariants fetch cold, so they’re deliberately left out rather than faked with a session the test harness doesn’t have.

What’s not enforced by any check, and is a judgement call instead: