Tracking epic for semesters — a structured term concept so students can view old grades by semester, see classes per semester, and get per-semester + cumulative GPA.
Why
Today courses.semester is free text (TEXT DEFAULT 'Spring 2026') on a shared, per-offering course catalog (backend/db/supabase_schema.sql:37). Enrollments (user_courses), gradebook (course_categories, assignments), and graph-context all FK to course_id, so semester is inherited transitively — but there's no canonical/orderable term list and no "current semester" concept. This epic makes the term structured and surfaces it where it matters.
Data model (decided)
- New
semesters table (term, year, label, start_date, end_date, sort_key). courses.semester (text) → semester_id (FK), backfilled — this single change makes gradebook, dashboard, and graph-context term-aware through joins they already have.- "Current" = the term whose date range contains today (global, date-derived). No per-user active flag (a user's "this term" = their enrollments in the current semester).
v1 surfaces (decided)
| Surface | Behavior |
|---|
| Gradebook | term switcher · per-semester GPA · cumulative GPA / transcript |
| Dashboard / Course list | classes grouped by semester; current default, past terms behind Archive |
| Calendar | unchanged — assignments stay date-driven, no term label |
| Graph & study tools | not per-term by default; Archive toggle deferred to a follow-up |
Issues
Build order
137 (migration) → 138 (API + GPA) → 139 / 140 (UI, in parallel) → 141 (follow-up).
Coordination
Tracking epic for semesters — a structured term concept so students can view old grades by semester, see classes per semester, and get per-semester + cumulative GPA.
Why
Today
courses.semesteris free text (TEXT DEFAULT 'Spring 2026') on a shared, per-offering course catalog (backend/db/supabase_schema.sql:37). Enrollments (user_courses), gradebook (course_categories,assignments), and graph-context all FK tocourse_id, so semester is inherited transitively — but there's no canonical/orderable term list and no "current semester" concept. This epic makes the term structured and surfaces it where it matters.Data model (decided)
semesterstable (term,year,label,start_date,end_date,sort_key).courses.semester(text) →semester_id(FK), backfilled — this single change makes gradebook, dashboard, and graph-context term-aware through joins they already have.v1 surfaces (decided)
Issues
semesterstable +courses.semester_id+ backfill[backend, infrastructure]— owner Luke[backend]— owner Luke[frontend]— owner Jose[frontend]— owner Jose[frontend, backend]Build order
137 (migration) → 138 (API + GPA) → 139 / 140 (UI, in parallel) → 141 (follow-up).
Coordination