Timetable plan

A degree planner for the ANU Bachelor of Advanced Computing (Honours): pick a course and a semester from real catalogue data, and it’s saved to SQLite on the server — reload, or come back tomorrow, and it’s still there. That’s the core flow this week’s spec asks for; everything else here is what I built on top of it once that flow worked.

The starter’s guestbook is gone — it was demo plumbing for a feature this prototype doesn’t have, and keeping a “leave a message” form on a degree planner would have been noise, not a feature.

What’s here

What good looks like here

The spec line I’m testing is mechanical and narrow: POST a course/session, get redirected home, and see it on the next load. spec/enrolment.test.ts checks exactly that, against the built server. The enrolment form keeps the starter’s no-JS shape (plain HTML POST, 303 redirect, server re-renders from the database) rather than inventing a second interaction pattern for what’s functionally the same shape of feature.

What I deliberately left out, because the spec doesn’t ask for it and a prototype doesn’t need it: no de-duplication of the same course/semester pair, no live multi-tab updates (that was the guestbook’s SSE stream, and it left with the guestbook), no validation against a course’s actual prerequisite chain beyond the handbook’s recommended sequence. A person could reasonably want all three; the crit test only holds me to persistence, so that’s the line I built to.

The accessibility floor and the navigation/heading/landmark invariants in spec/invariants.test.ts are enforced automatically and I didn’t touch them; the page still has exactly one <h1>.