Skip to content

[Fix] 부산·대구·대전 시간표 달력에 KASI 공휴일 예외를 싣고 공휴일 달력 불변식 추가 - #922

Merged
AquilaXk merged 10 commits into
mainfrom
fix/regional-holiday-calendar-exceptions-919
Oct 4, 2026
Merged

AquilaXk merged 10 commits into
mainfrom
fix/regional-holiday-calendar-exceptions-919

Conversation

@AquilaXk

@AquilaXk AquilaXk commented Oct 4, 2026 •

Copy link
Copy Markdown
Owner

Related issue

Closes #919
Refs AquilaXk/easysubway-backend#479

Summary

  • Problem
    • 지역 시간표 통합기(lib/regional-timetable-integrator.mjs)는 부산·대구·대전 달력을 요일 플래그로만 만든다. 공휴일 예외 행은 만들지 않는다.
    • 인천·KRIC·코레일 경로는 같은 공휴일 목록(HOLIDAYS_2026)으로 예외 행을 싣는다. 세 기관만 빠져 있었다.
      • 기존 materialize-busan/daegu/daejeon-timetable.mjs의 목록은 전국 후보 경로에서 쓰지 않는다.
    • seq126 실측 결과는 다음과 같다.
      • 세 기관의 service_calendar_dates가 0행이다.
      • KASI 공휴일 22일에 평일·토요일 달력이 운행하는 위반이 312건이다(부산 4노선 각 40, 대구 3노선 각 40, 대전 32).
      • 대구 반월당은 10-09(한글날)에 평일 296편, 10-03(개천절)에 토요일 280편이 나간다. backend #479는 이 날짜에 TIMETABLE_NOT_COVERED를 낸다.
  • Outcome
    • 공휴일마다 평일·토요일 달력은 빼고(2) 휴일 달력은 더한다(1).
    • 휴일 달력이 이미 그 요일에 운행하면 행을 만들지 않는다. 일요일 공휴일과 대전 휴일 달력의 토요일이 여기에 해당한다.
    • 공휴일 목록이 없거나 형식이 틀리면 통합기가 실패한다. 추정 달력은 만들지 않는다.
    • 모든 기관에 적용하는 불변식을 전국 후보 조립 단계에 추가했다. 공휴일에 평일·토요일 달력이 운행하거나, 휴일 달력을 가진 노선에서 휴일·명절 달력이 하나도 운행하지 않으면 후보 생성이 실패한다.

Changes

  • lib/regional-timetable-integrator.mjs
    • holidayDates를 필수 인자로 받는다. 형식은 YYYYMMDD이고 중복 없이 2026년 날짜를 하나 이상 포함해야 한다. 어기면 REGIONAL_TIMETABLE_HOLIDAY_DATES_INVALID로 실패한다.
    • 통합기가 만든 달력에 역할(휴일 달력 여부)을 붙인다. 공휴일 예외 행은 마지막에 만든다.
    • holidayCalendarViolations(신규 export)는 노선별 공휴일 달력 불변식을 검사한다. 명절 전용 달력(요일 운행 없음)은 공휴일에 운행해도 된다.
  • prepare-nationwide-candidate-run.mjs
    • 통합기에 HOLIDAYS_2026을 넘긴다.
    • 광주 보관본까지 합친 뒤 불변식 위반이 있으면 실패한다.
  • release/kasi-public-holiday-2026/: 2026-10-04에 수집한 KASI getRestDeInfo 2026년 1~12월 응답 원문과 months.json이다. 기존 수집기 fetch-kasi-public-holiday-calendar.mjs로 받았다. 서비스 키는 응답에 없다.
    • 리뷰 F2로 fixtures에서 release로 옮겼다. 운영 경로가 이 원문을 읽는다.
    • retainedKasiHolidayDates()가 원문에서 공휴일 집합을 도출한다.
    • 통합기는 넘겨받은 목록이 이 집합과 정확히 같아야 한다. 빠지거나 더한 날짜가 있으면 실패한다.
    • 후보 조립 불변식은 통합기 입력이 아니라 이 독립 집합과 비교한다.
  • 테스트
    • fetch-kasi-public-holiday-calendar.test.mjs: HOLIDAYS_2026이 KASI 원문 공휴일 22일과 같음을 고정한다.
    • lib/regional-timetable-integrator.test.mjs: 예외 행, 실패 조건, 불변식을 검사한다.
      • 리뷰 F1: 달력 창 밖 공휴일(2025-12-25·2027-01-01) 테스트로 창 가드 변이 4개를 잡는다.
      • 리뷰 F2: 목록에서 날짜를 빼거나 더하면 실패하는지 확인한다.
    • prepare-nationwide-candidate-run.test.mjs: 조립 팩 불변식을 검사하고, 고정 예외 행 수를 206에서 398로 바꿨다.
    • 통합기 호출 테스트 3개에 holidayDates를 넘긴다.
  • 전국 후보 재생성(별도 커밋 e780d1e, SonarCloud 리팩터 61c7cb5 뒤 builder SHA 재결속 c4efaab)
    • refresh-nationwide-candidate --evaluated-at 2026-10-03T05:27:51.411Z --release-sequence 126
    • 원천 snapshot·fan-in head는 그대로다. 정본 팩·spec·request·hash evidence·preparation이 바뀐다.

Scope

Included

  • 부산·대구·대전 공휴일 예외 행과 전 기관 공휴일 달력 불변식
  • 공휴일 목록과 KASI 원문의 일치를 고정하는 fixture

Excluded

  • 원천 snapshot 재수집(데이터 갱신). 이 PR은 같은 시계·같은 원천으로 파생 후보만 다시 만든다.
  • 명절 시간표 생성. 세 기관 원천에 명절 구분이 없어 추정 시간표를 만들지 않는다.
  • backend 변경. backend #479는 번들 예외가 생기면 그대로 휴일 시간표로 응답한다.

Ownership / dependencies

원천·카탈로그 대조

  • hub api-catalog.mjs list --query kasi의 결과는 provider:kasi-public-holiday-calendar(getRestDeInfo, status preflight_only)다.
  • data source-candidates.json에는 kasi-public-holiday-calendar(P0, preflight_only)가 있다. source-inventory.json에는 KASI 항목이 없다.
  • 기존 구현은 다음과 같다.
    • fetch-kasi-public-holiday-calendar.mjs: 광주 보관본 계약과 코레일 등록이 쓴다.
    • 전국 후보는 materialize-incheon-timetable.mjs의 HOLIDAYS_2026을 인천·KRIC·코레일 달력에 쓴다.
  • 실측(2026-10-04): KASI 2026년 1~12월 응답의 공휴일 22일이 HOLIDAYS_2026과 정확히 같다.
    • 대상 날짜는 01-01, 02-1618, 03-01·02, 05-01·05·24·25, 06-03·06, 07-17, 08-15·17, 09-2426, 10-03·05·09, 12-25다.
    • 이 PR은 새 원천을 쓰지 않는다. 이미 전국 후보가 쓰는 목록을 세 기관에도 쓰고, 그 목록을 KASI 원문으로 고정한다.
  • 명절 시간표 유무를 확인한 원천은 다음과 같다. 세 원천 모두 명절 구분이 없다.
    • 부산 busan-transportation-timetable: day 1·2·3(평일·토요일·휴일)
    • 대구 1~3호선: WEEK·SAT·HOLI
    • 대전 daejeon-train-timetable: dayType 0·1(평일·휴일)

병합 순서

도구/데이터 PR을 한 PR에 둔 이유

Contract & Compatibility

  • Source / API / schema contract: 변경 없음. 기존 service_calendar_dates 형식(serviceId·date·exceptionType)이다.
  • Artifact / provenance identity
    • 예외 행 192개가 늘어난다(부산 40, 대구 노선별 40×3, 대전 32).
    • trip·stop_time·calendar 수는 그대로다.
  • Backward compatibility: backend·모바일은 이미 다른 기관의 예외 행을 읽는다.
  • Migration or cutover: 병합 뒤 다음 RC부터 반영된다(후보 재생성 포함).

Version impact

  • no version change
  • datapack release only
  • route-map artifact change
  • data contract change
  • product gate JSON change
  • CI workflow·계약 테스트 change

Product gate impact

  • release/product-gates/** 영향 없음
  • 변경한 gate의 근거를 갱신했습니다.
  • 검증되지 않은 지원 범위 claim을 추가하거나 확대하지 않습니다.

Provenance impact

  • source inventory·geometry provenance manifest 영향 없음
  • 제공처·라이선스·갱신 시점·적용 범위를 갱신했습니다.
  • 공식 source로 확인되지 않은 값을 배포 artifact에 추가하지 않습니다.

Version decision

  • datapack version: 다음 재발행(seq127 이상)에서 반영
  • data contract: 변경 없음
  • route-map artifact / product gate: 변경 없음
  • promotion request id: 데이터 갱신 PR에서 정한다

Verification

Check Result / Evidence
Focused RED → GREEN RED: origin/main 통합기에 holidayDates: ["20261009"]를 넘기면 예외 행이 0개다(기대 12). 새 테스트는 holidayCalendarViolations export가 없어 실패했다. GREEN: 통합기 테스트 4/4, 관련 5개 파일 40/40이 통과했다.
불변식 RED(seq126 동등 번들) holidayCalendarViolations를 seq126 동등 번들에 적용하면 312건이다. 부산 4노선은 각 40, 대구 3노선은 각 40, 대전은 32이고 다른 기관은 0이다.
Affected integration node tools/ci/run-affected-tests.mjs: 12개 파일, 127/127 통과
seq126 동등 RC 재현 seq126 시계로 로컬 RC 전 단계를 재현했다. refresh-nationwide-candidate → RC build-datapack → validate-datapack --require-production → 번들 staging이 통과했다. 서명은 로컬 임시 키를 썼다.
효과(seq126 동등) 아래 표 참고. 불변식 위반은 312건에서 0건이 됐다. service_calendar_dates는 206행에서 398행으로 늘었다.
Required CI PR CI에서 확인
Live provider / release KASI getRestDeInfo 2026년 12개월 실측. 키는 루트 .env에 있고 출력하지 않았다. 발행은 하지 않음
Security / data integrity Not applicable — reason: 시크릿·인증 경계 변경 없음. fixture 원문에 서비스 키가 없다(ServiceKey 0건).

10-03·10-05·10-09에 운행하는 달력과 편수(seq126 동등 번들, 역 기준 trip 수)는 다음과 같다.

역 날짜 변경 전 변경 후
대구 반월당(1호선) 10-03 토 토요일 280편 휴일 248편
대구 반월당(1호선) 10-05·10-09 평일 296편 휴일 248편
부산 서면(1호선) 10-03 토 토요일 334편 휴일 320편
부산 서면(1호선) 10-05·10-09 평일 354편 휴일 320편
대전 시청 10-03 토 휴일 216편 휴일 216편(토요일 시간표 없음)
대전 시청 10-05·10-09 평일 240편 휴일 216편

Not run

  • Check: backend 역 시간표 실응답
  • Reason: 재발행 번들이 배포된 뒤에 확인할 수 있다.
  • Rerun owner / condition: 10-10 09:05 KST 만료 전 재발행 뒤 backend 역 시간표에서 확인한다.

Risk

  • Level: High
  • Main risk
    • HOLIDAYS_2026은 2026년만 다룬다. 달력 창이 2027년으로 넘어가면 목록을 KASI로 다시 받아야 한다.
    • 지금 세 기관 달력은 2026-12-31에 끝난다.
  • Failure behavior
    • 공휴일 목록이 없거나 틀리면 통합기가 실패한다.
    • 조립 팩에서 공휴일에 평일·토요일 달력이 운행하면 후보 생성이 실패한다.
  • Candidate / admission / publication state on failure: 후보가 생성되지 않고 발행도 없다
  • Fallback or degraded-success path introduced: No

Rollout / Recovery

  • Rollout or promotion: 병합 → RC → 발행
  • Monitoring / success signal
    • 재생성 번들의 불변식 위반이 0건이다.
    • backend 역 시간표의 대구 반월당 10-09 응답이 휴일 시간표다(TIMETABLE_NOT_COVERED 해소).
  • Rollback or recovery: 이 PR revert와 이전 정본 팩으로 복귀
  • Existing artifact / schema compatibility after rollback: 스키마 변경이 없어 호환된다

Review focus

  • 휴일 달력 역할 판정. sunday=true이면 휴일, 일요일 미운행이면서 월~토 중 하루 이상 운행하면 평일·토요일이다. 요일 운행이 없으면 명절이다.
  • 휴일·명절 달력이 아예 없는 운행 패턴 노선은 예외로 둔다. 광주 보관본의 토요일 전용 노선이 여기에 해당한다.

Checklist

  • 이슈 범위와 실제 diff가 일치합니다.
  • 관련 없는 변경이나 다른 owner의 surface를 포함하지 않았습니다.
  • 위험에 필요한 검증과 미실행 사유를 기록했습니다.
  • 실패·호환성·promotion·recovery 동작이 명확합니다.
  • current failure를 이전·stale·alternate 결과의 성공으로 바꾸지 않습니다.
  • GitHub PR Review 객체가 있는지 확인했습니다. CodeRabbit status check만으로는 리뷰 완료로 보지 않습니다.
  • CodeRabbit Review 객체가 없으면 지원되는 Codex CLI 폴백 Review를 단일 GitHub PR Review로 게시했습니다.
  • datapack 배포 영향이 있는 경우 release workflow 상태를 확인했습니다.

@coderabbitai

coderabbitai Bot commented Oct 4, 2026 •

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration
  • Configuration used: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: d53dcb71-4840-42d5-bd04-5b0b33150da5
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@AquilaXk AquilaXk left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🎯 Linked issue & acceptance criteria audit
ID Acceptance criterion Status Evidence
AC-1 Holiday exception rows for the three agencies match the KASI decision PASS tools/datapack/lib/regional-timetable-integrator.mjs:50
AC-2 Add an invariant check that a holiday calendar is active on holidays for all agencies PASS tools/datapack/prepare-nationwide-candidate-run.mjs:1573
AC-3 Record that sources lack holiday-festival timetables and keep the holiday timetable PASS tools/datapack/lib/regional-timetable-integrator.mjs:657
🛡️ Adversarial audit evidence
  • Falsifiability verified: No (Failed: Probe left 3 mutants alive on the window guards, see F1.)
  • Hollow assertions detected: 0
  • Production backdoors detected: 0
  • Ground-truth sources verified:
    • Clean clone refresh at builder commit 61c7cb5b reproduced the committed artifacts
    • Issue 919 body and the QA day policy for Saturday holidays and holiday fallback
    • KASI fixture months match HOLIDAYS_2026 and months.json hashes, no service key
    • Source day types for Busan, Daegu and Daejeon named in the PR body
🤖 Prompt for all review comments with AI agents
Could we verify each finding against the current code and keep only those that
still apply? Could we make the smallest validated fix and briefly note why any
finding no longer applies?

Inline comments:
- `@tools/datapack/lib/regional-timetable-integrator.mjs:37-37`
  Could the production path read the retained KASI months instead of a constant, or
  could the candidate build compare the list with the retained KASI files and fail
  on a difference? A refresh step for 2027 would then be forced by CI.
- `@tools/datapack/lib/regional-timetable-integrator.mjs:59-59`
  Could one test pass a holiday list with a date before the calendar start and after
  the calendar end, then assert that no exception row is created and that
  holidayCalendarViolations reports nothing for those dates? That would kill the
  surviving mutants. Until the guard is pinned, the window rule is unproven.
- `@tools/datapack/prepare-nationwide-candidate-run.mjs:1573-1577`
  Could the merge order be recorded on both PRs, with the second one regenerating the
  candidate after rebase, and could the count assertions be re-checked at that time?

---

Outside diff comments:
None.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Aquila review skill, project CLAUDE.md, PR template full.md and issue 919 body

Review profile: ASSERTIVE

Plan: Aquila fallback

Run ID: N/A (Aquila fallback)

Review source: Aquila CLI

Repository visibility: public GitHub repository

Trigger:
Discovery review of the current change set on the draft pull request

Base:
main@53f01fc5c4c5d2b7630c2c6dcdb79608200eaa1c

Head:
fix/regional-holiday-calendar-exceptions-919@c4efaabe7cfc7e7de3d621c46a2fdfa5827bfc2d

Command:
node post-review.mjs input.json payload-1.json --repo AquilaXk/easysubway-data --pr 922

📥 Commits

Reviewing files changed in this pull request between:

  • Base: 53f01fc5c4c5d2b7630c2c6dcdb79608200eaa1c
  • Head: c4efaabe7cfc7e7de3d621c46a2fdfa5827bfc2d
📒 Files selected for processing (8)
  • tools/datapack/fetch-kasi-public-holiday-calendar.test.mjs
  • tools/datapack/fixtures/kasi-public-holiday-2026/months.json
  • tools/datapack/lib/regional-timetable-integrator.mjs
  • tools/datapack/lib/regional-timetable-integrator.test.mjs
  • tools/datapack/prepare-nationwide-candidate-run.mjs
  • tools/datapack/prepare-nationwide-candidate-run.test.mjs
  • tools/datapack/release/candidate-build-spec.json
  • tools/datapack/release/hash-evidence.json
📜 Review details

Comment thread tools/datapack/lib/regional-timetable-integrator.mjs Outdated
Comment thread tools/datapack/lib/regional-timetable-integrator.mjs
Comment thread tools/datapack/prepare-nationwide-candidate-run.mjs Outdated
AquilaXk added a commit that referenced this pull request Oct 4, 2026
리뷰 F1(#922). 2025-12-25·2027-01-01처럼 달력 창 밖 날짜로 holidayExceptionRows(창 가드)와
holidayCalendarViolations(calendarActiveOn 창 가드, 창 밖 날짜 건너뛰기)를 고정한다.
세 가드의 ||→&&·return false→true 변이 4개가 모두 실패로 잡힌다.

Refs #919
AquilaXk added a commit that referenced this pull request Oct 4, 2026
리뷰 F2(#922). 보관 원문을 release/kasi-public-holiday-2026으로 옮기고, 통합기는 넘겨받은 목록이
원문에서 도출한 공휴일 전체와 같지 않으면(빠진 날·더한 날) 실패한다. 후보 조립 불변식은
통합기 입력이 아니라 원문에서 따로 읽은 집합과 비교해 순환을 끊는다.

Refs #919
@AquilaXk
AquilaXk marked this pull request as ready for review October 4, 2026 07:41
- 지역 시간표 통합기가 공휴일(HOLIDAYS_2026)마다 평일·토요일 달력을 빼고(2) 휴일 달력을 더한다(1).
  공휴일 목록이 없거나 형식이 틀리면 실패한다.
- 세 기관 원천에 명절 시간표가 없어 설·추석도 휴일 시간표로 운행한다.
- HOLIDAYS_2026이 KASI 2026년 특일 정보 원문과 같음을 보관 원문 fixture로 고정한다.
- 전국 후보 조립 뒤 공휴일에 평일·토요일 달력이 운행하거나 휴일 달력이 빠진 노선이 있으면 실패한다.

Closes #919
refresh-nationwide-candidate --evaluated-at 2026-10-03T05:27:51.411Z --release-sequence 126
원천 snapshot과 fan-in head는 그대로다. 부산·대구·대전 공휴일 예외 192행이 정본 팩에 더해진다.

Refs #919
동작은 같다. 문자열 정렬에 codepointCompare를 쓰고, 노선·날짜 판정을 routeHolidayViolations로 나눠
인지 복잡도를 낮춘다. 후보 조립의 통합기 import를 한 줄로 합친다.

Refs #919
refresh-nationwide-candidate --evaluated-at 2026-10-03T05:27:51.411Z --release-sequence 126
정본 팩 바이트는 그대로이고 spec·request·hash·preparation의 builder SHA만 바뀐다.

Refs #919
리뷰 F1(#922). 2025-12-25·2027-01-01처럼 달력 창 밖 날짜로 holidayExceptionRows(창 가드)와
holidayCalendarViolations(calendarActiveOn 창 가드, 창 밖 날짜 건너뛰기)를 고정한다.
세 가드의 ||→&&·return false→true 변이 4개가 모두 실패로 잡힌다.

Refs #919
리뷰 F2(#922). 보관 원문을 release/kasi-public-holiday-2026으로 옮기고, 통합기는 넘겨받은 목록이
원문에서 도출한 공휴일 전체와 같지 않으면(빠진 날·더한 날) 실패한다. 후보 조립 불변식은
통합기 입력이 아니라 원문에서 따로 읽은 집합과 비교해 순환을 끊는다.

Refs #919
refresh-nationwide-candidate --evaluated-at 2026-10-03T05:27:51.411Z --release-sequence 126
정본 팩 바이트는 그대로다.

Refs #919
refresh-nationwide-candidate --evaluated-at 2026-10-03T05:27:51.411Z --release-sequence 126
정본 팩 바이트는 그대로이고 spec·request·hash·preparation의 builder SHA만 바뀐다.

Refs #919

@AquilaXk AquilaXk left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🎯 Linked issue & acceptance criteria audit
ID Acceptance criterion Status Evidence
AC-1 Holiday exception rows for the three agencies match the KASI decision PASS tools/datapack/lib/regional-timetable-integrator.mjs
AC-2 Add an invariant check that a holiday calendar is active on holidays for all agencies PASS tools/datapack/prepare-nationwide-candidate-run.mjs
AC-3 Record that sources lack holiday-festival timetables and keep the holiday timetable PASS tools/datapack/lib/regional-timetable-integrator.mjs
🔄 PR review lifecycle & thread tracking
  • Previous review ID: 5404237023
  • Previous commit SHA: c4efaabe7cfc7e7de3d621c46a2fdfa5827bfc2d
  • Resolved findings: 3
  • Active tracked threads: 0
Status Finding / Thread Path Resolution note
RESOLVED F1 tools/datapack/lib/regional-timetable-integrator.mjs Out-of-window holiday tests kill the four window-guard mutants
RESOLVED F2 tools/datapack/lib/regional-timetable-integrator.mjs Holiday list must equal the retained KASI set; invariant uses that set
RESOLVED F3 tools/datapack/prepare-nationwide-candidate-run.mjs Merge order is recorded; this head was rebased and refreshed after 921 and 923
🛡️ Adversarial audit evidence
  • Falsifiability verified: Yes (Four window-guard mutants on lines 50, 59 and the skip guard now fail)
  • Hollow assertions detected: 0
  • Production backdoors detected: 0
  • Ground-truth sources verified:
    • Issue 919 body and the QA day policy for Saturday holidays
    • Retained KASI getRestDeInfo 2026 months with sha256 manifest, 22 holidays
    • Source day types for Busan, Daegu and Daejeon named in the PR body
🤖 Prompt for all review comments with AI agents
Could we verify each finding against the current code and keep only those that
still apply? Could we make the smallest validated fix and briefly note why any
finding no longer applies?

Inline comments:
None.

---

Outside diff comments:
None.

ℹ️ Review info
⚙️ Run configuration

Configuration used: CLAUDE.md, AGENTS.md and .github/PULL_REQUEST_TEMPLATE/full.md in easysubway-data

Review profile: ASSERTIVE

Plan: Aquila fallback

Run ID: N/A (Aquila fallback)

Review source: Aquila CLI

Repository visibility: public GitHub repository

Trigger:
Closure review of frozen findings F1 to F3 on the rebased head of PR 922

Base:
main@397d6e74e75685c96e0eb4204346a98498b48eef

Head:
fix/regional-holiday-calendar-exceptions-919@894b73b27b65e931207afe93653cd219ed6289c0

Command:
node aquila-review/scripts/compile-review-payload.mjs input.json --output payload-1.json

📥 Commits

Reviewing files changed in this pull request between:

  • Base: 397d6e74e75685c96e0eb4204346a98498b48eef
  • Head: 894b73b27b65e931207afe93653cd219ed6289c0
📒 Files selected for processing (27)
  • tools/datapack/canonical-pack-service-calendar-flags.test.mjs
  • tools/datapack/canonical-pack-transit-car-door-contract.test.mjs
  • tools/datapack/fetch-kasi-public-holiday-calendar.mjs
  • tools/datapack/fetch-kasi-public-holiday-calendar.test.mjs
  • tools/datapack/lib/regional-timetable-integrator.mjs
  • tools/datapack/lib/regional-timetable-integrator.test.mjs
  • tools/datapack/prepare-nationwide-candidate-run.mjs
  • tools/datapack/prepare-nationwide-candidate-run.test.mjs
  • tools/datapack/regional-timetable-official-stop-times.test.mjs
  • tools/datapack/release/candidate-build-spec.json
  • tools/datapack/release/hash-evidence.json
  • tools/datapack/release/kasi-public-holiday-2026/2026-01.xml
  • tools/datapack/release/kasi-public-holiday-2026/2026-02.xml
  • tools/datapack/release/kasi-public-holiday-2026/2026-03.xml
  • tools/datapack/release/kasi-public-holiday-2026/2026-04.xml
  • tools/datapack/release/kasi-public-holiday-2026/2026-05.xml
  • tools/datapack/release/kasi-public-holiday-2026/2026-06.xml
  • tools/datapack/release/kasi-public-holiday-2026/2026-07.xml
  • tools/datapack/release/kasi-public-holiday-2026/2026-08.xml
  • tools/datapack/release/kasi-public-holiday-2026/2026-09.xml
  • tools/datapack/release/kasi-public-holiday-2026/2026-10.xml
  • tools/datapack/release/kasi-public-holiday-2026/2026-11.xml
  • tools/datapack/release/kasi-public-holiday-2026/2026-12.xml
  • tools/datapack/release/kasi-public-holiday-2026/months.json
  • tools/datapack/release/nationwide-candidate-preparation.json
  • tools/datapack/release/nationwide-production-canonical-pack.json
  • tools/datapack/release/release-request.json
📜 Review details

@AquilaXk AquilaXk added the automerge FIFO 병합 큐 대상 — 코디네이터가 순서대로 update-branch 후 auto-merge label Oct 4, 2026
@github-actions

github-actions Bot commented Oct 4, 2026 •

Copy link
Copy Markdown
Contributor

No description provided.

@github-actions

github-actions Bot commented Oct 4, 2026 •

Copy link
Copy Markdown
Contributor

No description provided.

@AquilaXk
AquilaXk merged commit 46885d4 into main Oct 4, 2026
11 checks passed
@AquilaXk
AquilaXk deleted the fix/regional-holiday-calendar-exceptions-919 branch October 4, 2026 10:25
@sonarqubecloud

sonarqubecloud Bot commented Oct 4, 2026

Copy link
Copy Markdown

AquilaXk added a commit that referenced this pull request Oct 4, 2026
refresh-nationwide-candidate를 같은 인자로 다시 실행했다. 정본 팩에 #919 공휴일 예외와 #920 중복 행 격리가 함께 들어간다.
trip 26,488 · 정차 677,120 · 달력 예외 398행, 같은 출발 중복 묶음 0, 공휴일 달력 위반 0.

Refs #920
AquilaXk added a commit that referenced this pull request Oct 4, 2026
#922·#935 병합으로 documentation-fragment.json이 충돌했다. main 기준으로 다시 생성했다(datapack-release.yml blob 갱신).
rebase로 이력을 다시 쓰지 않아 기존 리뷰·closure 대상 커밋이 그대로 남는다.

Refs #929
AquilaXk added a commit that referenced this pull request Oct 4, 2026
* [Fix] 1호선 주말 원천 중복 행을 공식 근거로 격리하고 같은 출발 trip 중복을 후보 생성에서 막음

- KRIC 전체_도시철도운행정보 파일의 1호선 '토요일+공휴일' 512·514 행은 같은 시각 506·508 행과 정차·시각이 모두 같다.
  KRIC 역별 API(subwayTimetable, 2026-10-04 실측)는 휴일에 506·508만, 평일에 512·514를 준다.
  고정 근거로 512·514 주말 행을 DUPLICATE_SERVICE_ROW로 격리한다. 근거 없는 내용 중복은 적재를 실패시킨다.
- 전국 후보 조립 뒤 같은 달력에서 (노선, 역, 출발 시각, 다음 역, 종착역)이 같은 trip이 있으면 후보 생성을 실패시킨다.

Closes #920

* [Chore] #920 적재 변경으로 전국 후보(seq126 시계)를 재생성

refresh-nationwide-candidate --evaluated-at 2026-10-03T05:27:51.411Z --release-sequence 126
원천 snapshot과 fan-in head는 그대로다. 1호선 주말 중복 trip 2개(정차 36행)가 빠지고 격리 보고서에 남는다.

Refs #920

* [Test] 중복 행 규칙이 행 해시와 열차 번호가 함께 맞을 때만 적용됨을 고정

리뷰 F1(#924). 해시만 맞는 규칙, 열차 번호만 맞는 규칙, 노선·요일구분만 다른 규칙은 모두
DUPLICATE_TRIP_UNRESOLVED로 실패한다. member()와 규칙 필터의 &&→|| 변이가 이 테스트로 잡힌다.

Refs #920

* [Test] 1호선 주말 중복 판정 근거인 KRIC 역별 API 응답을 키 없이 보관하고 규칙과 대조

리뷰 F2(#924). 서동탄·수원·금정 dayCd 7·8·9 응답 원문(2026-10-04 수집, 서비스 키 미포함)과
sha256 manifest를 fixture로 둔다. 휴일 23:14·23:34 계열은 K506·K508, 평일 같은 시각은 K512·K514이고
토요일은 데이터 없음(03)임을 원문에서 확인한 뒤 고정 규칙의 유지·제외 선택과 대조한다.

Refs #920

* [Chore] #922 병합 뒤 rebase에 맞춰 전국 후보(seq126 시계)를 재생성

refresh-nationwide-candidate를 같은 인자로 다시 실행했다. 정본 팩에 #919 공휴일 예외와 #920 중복 행 격리가 함께 들어간다.
trip 26,488 · 정차 677,120 · 달력 예외 398행, 같은 출발 중복 묶음 0, 공휴일 달력 위반 0.

Refs #920
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

automerge FIFO 병합 큐 대상 — 코디네이터가 순서대로 update-branch 후 auto-merge

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Fix] 부산·대구·대전 시간표 달력에 공휴일 예외가 없어 공휴일에 평일·토요일 시간표가 나가는 문제

1 participant