You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
update the NUS v2 scraper academic year to AY2026/2027
add AY2026/2027 semester start dates to the academic calendar package so scraper Special Term I/II auto-routing can still source AY2025/2026 data during the overlap window
add AY2026/2027 timetable holiday exclusions from the NUS Registrar calendar and MOM public holiday data
include both actual Sunday holiday dates and observed Monday dates for applicable spillovers, so exact-date consumers such as Today and iCal exclusions handle both dates
update MAINTENANCE.md so future annual prep keeps the academic calendar update in PR1 and leaves semester/archive rollover for PR3
Special Term rollover
specialTermAcademicYear remains null. With the AY2026/2027 calendar present, the scraper can auto-detect that previous AY Special Term I/II remains active until AY2026/2027 Semester 1 starts on 10 Aug 2026.
JSON parse, sorted-order, and duplicate check for website/src/data/holidays.json
pnpm --filter nusmods-academic-calendar test
pnpm --filter nus-v2 typecheck
TZ=Asia/Singapore pnpm --filter nusmods test src/utils/ical.test.ts src/config/config.test.ts
Note: pnpm reported the repo's Node 22 engine warning because this local shell is running Node 24.14.0. Running the iCal test without TZ=Asia/Singapore in this thread's Europe/London timezone hits existing DST-sensitive expectations around 2016 dates.
✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 57.31%. Comparing base (988c6fd) to head (7bdf4c6). ⚠️ Report is 245 commits behind head on master.
This PR prepares the scraper and calendar data for AY2026/2027. The main changes are:
Adds AY2026/2027 semester and Special Term start dates to the academic calendar package.
Updates the NUS v2 scraper academic year to 2026/2027.
Extends website holiday data with AY2026/2027 NUS and Singapore public holidays.
Updates maintenance notes for the annual AY rollover flow.
Confidence Score: 5/5
The changes are merge-safe based on the scoped calendar, scraper configuration, holiday data, and maintenance documentation updates.
No correctness, security, or reliability issues were identified in the reviewed changes, and the provided validation covers JSON integrity, package tests, typechecking, and timezone-sensitive iCal behavior.
T-Rex Logs
What T-Rex did
Ran the special-term-routing test using trex-artifacts/special-term-routing-script.js to generate before and after logs.
Reviewed the after-run log trex-artifacts/special-term-routing-02-after.log and confirmed academicYear advanced to 2026/2027, calendarHas2026_2027 is true, and the routing behavior changed as described.
Ran the holiday exclusions test and captured before and after logs for comparison.
Reviewed trex-artifacts/holiday-exclusions-02-after.log and confirmed head holidays increased to 95, with all six target dates present in both raw data and iCal consumption.
Fixed the holiday spillover issue. The AY2026/2027 holiday block now includes both the actual Sunday dates and observed Monday dates for the MOM-published Sunday spillovers: National Day 2026, Deepavali 2026, and Chinese New Year day 2 in 2027.
The reason will be displayed to describe this comment to others. Learn more.
LGTM!
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
MAINTENANCE.mdso future annual prep keeps the academic calendar update in PR1 and leaves semester/archive rollover for PR3Special Term rollover
specialTermAcademicYearremainsnull. With the AY2026/2027 calendar present, the scraper can auto-detect that previous AY Special Term I/II remains active until AY2026/2027 Semester 1 starts on 10 Aug 2026.Data sources
Verification
website/src/data/holidays.jsonpnpm --filter nusmods-academic-calendar testpnpm --filter nus-v2 typecheckTZ=Asia/Singapore pnpm --filter nusmods test src/utils/ical.test.ts src/config/config.test.tsNote: pnpm reported the repo's Node 22 engine warning because this local shell is running Node 24.14.0. Running the iCal test without
TZ=Asia/Singaporein this thread'sEurope/Londontimezone hits existing DST-sensitive expectations around 2016 dates.