- Reduce sync parallelism 5 -> 2 to cap peak heap while bulk-fetching
all departments for a period
- Replace per-write rows (insert schedule/days/lessons separately) with a
single @Transaction replaceSchedule() so Room invalidates observers once
per department instead of ~4x each, cutting main-thread recompositions
and intermediate allocations during the 38-department sync
- Register AppDatabase.MIGRATION_3_4 so v3 databases upgrade without data loss
- Query teacher schedule periods by containment (weekStart<=x AND weekEnd>=x)
instead of exact weekStart, matching 2-week catalog windows
- Clip buildTeacherSchedule days to the requested week range
- Add weeksFor() to enumerate weeks of a catalog window for the UI selector
- Serialize syncPeriod body with a Mutex to protect the unique index
- Rethrow CancellationException before generic catch; version loadRevision
checks so stale observers/loads are cancelled
- Sync job tracking in PickerViewModel; keep loading true while empty
- Drop dead selectTeacher helper