Skip to content

[Fix] 수도권 공식 시간표를 전국 후보 시간표에 적재 - #910

Merged
AquilaXk merged 14 commits into
mainfrom
fix/capital-official-timetable-899
Oct 2, 2026
Merged

AquilaXk merged 14 commits into
mainfrom
fix/capital-official-timetable-899

Conversation

@AquilaXk

@AquilaXk AquilaXk commented Oct 2, 2026 •

Copy link
Copy Markdown
Owner

Related issue

Closes #899
Refs #862
Refs #902
Refs #903

Summary

  • 문제
    • seq 124 전국 후보의 수도권 시간표에는 4호선 2정차 pilot(상록수·사당)만 있었습니다.
    • 그래서 서버 활성화 canary의 첫 경로(신도림→강남)가 후보 0개로 실패했습니다(platform run 37024125755, 503).
    • 운영 데이터(seq 122)는 2026-10-09 12:16 KST에 만료됩니다.
  • 결과
    • KRIC 공식 파일 「전체_도시철도운행정보」(파일 id 900)에서 수도권 13개 노선의 공식 시간표를 전국 후보에 실었습니다. 대상은 정차 순서가 원천에 명시된 노선입니다.
    • 노선별 trip은 평일과 주말·휴일 각각 1건 이상입니다.
    • 로컬 재현에서 canary 5개 경로가 6개 시각(평일·토·일·공휴일) 모두 후보 1개를 냈습니다.

Changes

  • tools/datapack/lib/kric-capital-timetable-records.mjs
    • KRIC 파일 id 900 행을 원천 중립 trip 형태로 읽습니다.
    • 노선마다 문법·요일구분·운행유형·역명 별칭을 명시 표로 고정했습니다. 표에 없는 값은 실패합니다.
    • 시각이 역전된 행과 문법 오류 행은 사유와 함께 격리합니다.
  • tools/datapack/lib/official-line-timetable.mjs: 원천 중립 노선 적재기입니다. #903도 같은 진입점을 씁니다.
    • 실패 조건: 역 미매칭, 노선 trip 0, 운행일 종류별 trip 0, 노선 격리 5% 초과
    • 일반열차의 비인접 연속 정차는 격리합니다.
    • 노선별 고정 격리 집합(사유·건수·행 집합 hash)은 정확히 같을 때만 상한 계산에서 뺍니다.
    • trip_id는 결정적 단축형입니다: <접두>-<노선>-<운행일>-<sha 12자>. 충돌하면 실패합니다.
  • tools/datapack/lib/external-stop-times.mjs: 공식 원천(수도권·인천) trip과 stop_time을 결정적 gzip 파일로 분리합니다.
    • 파일: release/nationwide-official-stop-times.json.gz
    • 팩에는 sha·건수·노선별 요약만 결속합니다.
    • 원천 공통 provenance는 섹션 헤더에 한 번만 두고, trip마다 providerRecordHash를 둡니다.
    • 펼치는 곳: build-datapack, 후보 accessibility 입력 생성기, anti-cheat guard
    • 펼칠 때 sha·요약·FK·provenance·고아 행·중복과, 최상위·섹션 키·헤더·행 열 수의 닫힌 계약을 검사합니다. 어긋나면 실패합니다.
    • 파일 형식은 schemaVersion 3입니다. timeSource는 선택 열입니다.
  • 단일 제공 시각 정차 표기(QA 결정 2026-10-03)
    • 원천이 한 정차에 시각을 하나만 준 경우, 그 값을 정차 시각(도착 = 출발)으로 씁니다.
    • 이 경우 stop_time.timeSource에 SINGLE_PROVIDER_TIME_ARRIVAL 또는 SINGLE_PROVIDER_TIME_DEPARTURE를 표기합니다.
    • 노선별 건수는 보고서 singleProviderTimeStopCount에 남깁니다. 예: 공항선 중간역 7,528건
    • 도착·출발 시각이 모두 없는 정차는 격리합니다.
  • tools/datapack/prepare-nationwide-candidate-run.mjs
    • inventory capitalScheduleAdmissionEvidence가 가리키는 snapshot을 입력으로 씁니다. 신선도는 official_static_timetable_confirmation(P7D) 정책으로 유도합니다.
    • 4호선 pilot을 공식 전 노선 시간표로 교체했습니다.
    • 노선별 보고서 release/nationwide-capital-timetable-report.json을 씁니다.
  • tools/datapack/register-kric-capital-timetable.mjs: 수집본에서 projection snapshot과 inventory 증거를 만듭니다.
  • tools/ci/guard-datapack-anti-cheat.mjs
    • 외부 시간표까지 펼쳐 검사합니다. 결속 실패는 위반으로 처리합니다.
    • 균일 간격 검사에서 S1101 907열차 1건만 원천 행 hash로 고정해 제외했습니다. 원천 자체가 2분 간격 10정차입니다.
  • contracts/datapack/server-route-bundle-build-contract.json·schema·테스트
  • 데이터
    • KRIC 파일을 2026-10-02T15:57:05.773Z에 수집했습니다(raw sha256 218f76dd…). projection snapshot은 11,922행입니다.
    • 전국 후보를 releaseSequence 125로 재생성했습니다. 후보 ID는 nationwide-candidate-20261002-seq125입니다.

Scope

Included

  • 수도권 13개 노선: 서울 1~9호선, 신분당, 우이신설, 신림, 공항
  • 공식 시간표 수집기·등록기·적재기
  • 외부 시간표 파일
  • 서버 번들 상한 계약
  • 후보 재생성

Excluded

  • 다음 노선은 #903에서 적재합니다.
    • 코레일 단독 노선(경의중앙, 수인분당, 경춘, 경강, 서해)과 코레일 단독 열차(1·3·4호선 코레일 구간 일부)
      • 원천 행에 정차 순서가 없습니다.
    • 에버라인: 원천 526행 중 516행이 배차간격 문구입니다.
    • 의정부: 원천 793행 모두 종점 시각이 없습니다.
    • 김포골드: 노선 번호가 L41G1~L41G59로 쪼개져 있고, 역명 표기가 다릅니다.
    • GTX-A, 대경선, 동해, 부산김해: 이 파일 범위 밖입니다.
  • 1호선 원천 손상 행 453건은 싣지 않았습니다.
    • 원천의 운행유형 표기는 '일반'이지만, 기종점 패턴상 급행 계열로 판단됩니다.
    • #902에서 보강합니다.
  • 1·4호선 등 live API와 ±1~3분 차이가 나는 노선의 현행화는 #902에서 합니다.
  • 지역(부산·대구·대전·광주) trip의 snapshot·hash provenance 공백은 별도 이슈로 다룹니다. 이 노선들은 외부 파일로 옮기지 않았습니다.
  • 발행과 dispatch는 이 PR에 포함하지 않습니다.

Ownership / dependencies

도구와 데이터를 한 PR에 담은 이유

Contract & Compatibility

  • Source / API / schema contract
    • 새 원천 계약은 없습니다. 기존 inventory 원천 kric-nationwide-timetable-file에 capitalScheduleAdmissionEvidence를 추가했습니다.
    • hub api-catalog에는 이 파일 id 900이 없습니다.
  • Artifact / provenance identity
    • 팩 JSON이 externalTransitStopTimes로 외부 파일 sha를 결속합니다. 팩 JSON 자체는 build spec fixtureSha256이 결속합니다.
    • stop_time은 tripId FK로 trip provenance를 이어받습니다. 인천은 펼칠 때 행 provenance를 복원합니다(ROW_COPY).
  • Backward compatibility
    • SQLite 스키마는 바뀌지 않았습니다.
    • 팩 JSON을 직접 읽는 코드는 expandExternalStopTimes를 거쳐야 수도권·인천 시간표를 봅니다.
  • Migration or cutover

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: 후보 releaseSequence 125(nationwide-candidate-20261002-seq125). 발행은 이 PR 밖에서 합니다.
  • data contract: server-route-bundle-build-contract.json maxTotalDecompressedBytes를 58720256에서 201326592로 올렸습니다.
  • route-map artifact / product gate: 변경 없음
  • promotion request id: release-request-nationwide-candidate-20261002-seq125

Verification

노선별 적재 (원천 trip / 적재 trip / stop_time / 격리)

노선 lineId 원천 적재 stop_time 운행일별 trip 격리 데이터 기준일
1호선 S1101 line-472a81add377 1576 1123 46332 평일 581, 주말·휴일 542 453(고정 집합, TIME_NOT_MONOTONIC) 2025-12-31
2호선 S1102 seoul-2 1818 1818 42616 평일 976, 주말·휴일 842 0 2025-12-31
3호선 S1103 line-41a8c75ec9d8 773 772 29032 평일 406, 주말·휴일 366 1 (0.13%) 2025-12-31
4호선 S1104 seoul-4 896 889 32744 평일 481, 주말·휴일 408 7 (0.78%) 2025-12-31
5호선 S1105 line-80fc4d5350d4 774 772 34391 평일 428, 주말·휴일 344 2 (0.26%, 비인접 정차) 2025-12-31
6호선 S1106 line-3f41718e0833 591 591 20831 평일 340, 주말·휴일 251 0 2025-12-31
7호선 S1107 line-15b3b8a93259 752 752 34475 평일 420, 주말·휴일 332 0 2025-12-31
8호선 S1108 line-2b2d9eaa53d0 566 566 13374 평일 324, 주말·휴일 242 0 2025-12-31
9호선 S1109 line-f0e747248a31 880 880 23515 평일 492, 주말·휴일 388 0 2026-02-28
신분당 I11D1 shinbundang 866 866 13667 평일 332, 토 267, 일·휴 267 0 2026-06-18
우이신설 L11UI line-30886152e4f8 940 940 12220 평일 516, 주말·휴일 424 0 2022-05-30
신림 L11SL line-aefa08ccc0a9 696 663 7213 평일 382, 주말·휴일 281 33 (4.74%) 2025-09-23
공항 I28A1 line-e9e9a5b520a4 794 794 9116 평일 421, 주말·휴일 373 0 2025-12-31
  • 합계: trip 11,426, stop_time 319,526
  • 신림 격리 33건의 사유: 시각 역전 30, 종점 시각 없음 2, 문법 오류 1
  • 격리 상한은 노선별 5%입니다. 실측 최대값은 신림 4.74%입니다.
  • 1호선은 고정 집합(453건, 행 집합 sha256 b4e52aa3…)만 허용합니다. 건수나 행 집합이 바뀌면 실패합니다.

KRIC 파일과 live API(subwayTimetable, 평일) 비교

같은 역의 평일 시각 multiset이 몇 건 일치하는지 셌습니다(파일 / API / 일치).

노선 역 파일 API 일치
2호선 강남 479 479 479
2호선 서초 479 479 479
2호선 아현 479 479 478
5호선 동대문역사문화공원 396 395 395
6호선 삼각지 330 330 330
7호선 강남구청 398 398 398
7호선 도봉산 396 396 283
8호선 장지 319 319 319
9호선 동작(현충원) 484 484 484
3호선 대곡(코레일 구간) 264 264 264
3호선 구파발 382 378 309
신분당 정자 331 326 314
우이신설 솔밭공원 516 516 516
신림 서울지방병무청 374 374 374
1호선 종로5가 484 484 355
1호선 관악(코레일 구간) 267 267 153
4호선 동대문 474 468 289
4호선 수리산(코레일 구간) 254 249 152
  • 1·4호선은 대부분 ±1분, 일부 ±3분 차이로 개정이 아직 반영되지 않은 것으로 보입니다. 현행화는 #902에서 합니다.
  • 3·7호선 일부는 +0.5~1.5분의 표기 차이입니다.
  • live API는 2호선 강남의 휴일(dayCd 9) 응답이 resultCode 03(데이터 없음)입니다. 주말·휴일 시간표를 갖춘 파일을 원천으로 택한 이유입니다.

canary probe 재현

  • 실행 조건
    • backend c5784f1d의 RouteBundleSqliteRuntimeCompiler·JourneyRaptorAdapter를 썼습니다. 상한은 로컬에서만 192MiB 이상으로 바꿨습니다.
    • 번들: 이 후보로 만든 run-rc-full 출력입니다.
시각(KST) capital 신도림→강남 busan daegu daejeon gwangju
10-05(월, 대체공휴일) 09:00 1 (30분, 환승 0) 1 1 1 1
10-07(수) 08:30 1 (29분) 1 1 1 1
10-08(목) 14:00 1 (28분) 1 1 1 1
10-09(금, 한글날) 11:00 1 (31분) 1 1 1 1
10-03(토) 13:00 1 (29분) 1 1 1 1
10-04(일) 22:00 1 (32분) 1 1 1 1

표의 숫자는 각 시각·지역별 후보 경로 수이고, 괄호 안은 첫 후보의 소요 시간과 환승 수입니다.

검증 표

Check Result / Evidence
Focused RED → GREEN capital-official-timetable.test.mjs 3건이 기존 코드에서 실패하고("1호선 trip 0건", "서울역→청량리 stop_times 없음", "pilot 2역") 변경 뒤 4건이 통과합니다. lib 3종 테스트는 21건 통과입니다.
Affected integration 아래 "통합 테스트 결과" 참고
Required CI PR CI 결과로 확인합니다
Live provider / release KRIC 파일과 subwayTimetable 실측 비교(위 표). run-rc-full로 release-candidate 전 단계 재현: 상한 192MiB 이상에서 ALL RC STEPS PASSED, 이전 상한 56MiB에서는 E_SERVER_BUNDLE_DECOMPRESSED_BUDGET
Security / data integrity 외부 시간표 파일 sha·요약·FK·provenance 결속 검사와 anti-cheat guard PASS. 키는 출력하거나 커밋하지 않았습니다.

통합 테스트 결과

  • prepare-nationwide-candidate-run: 42건 통과
  • refresh-nationwide-candidate: 13건 통과
  • build-nationwide-candidate: 13건 통과
  • guard-datapack-anti-cheat: 12건 통과
  • 그 밖의 영향 테스트 묶음: 2,004건 중 2,002건 통과
    • 실패 1: server-route-bundle-build-contract 정본 hash. 상한 값을 바꿔서 생긴 실패라 이 PR에서 고쳤습니다.
    • 실패 2: bundle-component-contract "contract mutations fail closed". origin/main(b25a8c8)에서도 로컬로 똑같이 실패해, 이 PR과 무관한 기존 실패입니다.
  • 파일을 쓰는 테스트(capital-official-timetable, canonical-pack-*, regional-timetable-official-stop-times, nationwide-platform-resolver)는 직렬로 돌려 모두 통과했습니다.
  • validate-source-inventory(pinned hub): 통과
  • 문서 파편 --check: IN SYNC

크기

항목 값
팩 JSON 57.9MB (main 82.5MB, 상한 테스트 70MB)
외부 시간표 파일 4.0MB (상한 테스트 50MB)
서버 번들 압축해제 합계 85,544,960바이트
└ timetable 69.7MB
└ accessibility 14.5MB
└ topology 1.1MB
└ fare 0.2MB

Not run

  • Check: 운영 publish·platform DEPLOY
  • Reason: 이 PR 범위 밖입니다. 발행은 별도로 진행합니다.
  • Rerun owner / condition
    • 메인 세션이 맡습니다.
    • 순서: PR 병합 → 데이터 PR(재수집·재생성) → 발행 → KST 운행 시간에 DEPLOY

Risk

  • Level: High
  • Main risk
  • Failure behavior
    • 다음 경우 후보 생성이 실패합니다: 역 미매칭, 노선 trip 0, 격리 상한 초과, 고정 집합 불일치, 외부 파일 결속 불일치, 입력 만료
  • Candidate / admission / publication state on failure: 후보를 만들지 않습니다. 이전 발행 데이터는 그대로입니다.
  • Fallback or degraded-success path introduced: No

Rollout / Recovery

  • Rollout or promotion: 병합 → 데이터 PR → release-candidate → promotion → production-publish → platform DEPLOY
  • Monitoring / success signal: platform canary 5개 probe 통과, 수도권 경로 후보가 1개 이상
  • Rollback or recovery: 이 PR을 revert하면 이전 후보 구조로 돌아갑니다. 운영 데이터 롤백은 기존 manifest 롤백 절차를 따릅니다.
  • Existing artifact / schema compatibility after rollback: SQLite 스키마 변경이 없어 호환됩니다.

Review focus

  • 외부 시간표 파일 결속(external-stop-times)이 provenance 정보를 잃지 않는지, 그리고 결속 불일치가 실패로 이어지는지
  • 1호선 고정 격리 집합과 노선별 5% 상한
  • anti-cheat 균일 간격 검사의 고정 제외 1건이 정당한지
  • trip_id 단축의 결정성과 충돌 검사

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 상태를 확인했습니다.

seq 124 후보에는 수도권 4호선 2정차 pilot만 있어 canary 신도림→강남 후보가 0개였다.

- lib/kric-capital-timetable-records: KRIC 전체_도시철도운행정보(파일 id 900)에서 정차 순서를 명시한
  수도권 13개 노선(서울 1~9호선·신분당·우이신설·신림·공항)을 정규화 trip으로 읽는다. 문법·시각 역전 행은
  사유와 함께 격리하고, 1호선 원천 손상 행 453건은 행 집합 hash로 고정해 미적재(#902에서 보강).
- lib/official-line-timetable: 원천 중립 노선 적재기. 역 미매칭·노선 trip 0·운행일 종류 trip 0·격리 5% 초과는
  실패. 일반열차 비인접 정차 격리. trip_id는 결정적 단축형(<접두>-<노선>-<운행일>-<sha 12자>).
- lib/external-stop-times: 공식 원천(수도권·인천) trip·stop_time을 결정적 gzip 파일로 분리하고 팩에는
  sha·건수만 결속. 원천 공통 provenance는 섹션 헤더, trip별 providerRecordHash. 펼칠 때 sha·요약·FK·
  provenance·고아·중복을 검사(build-datapack·후보 accessibility 입력·anti-cheat guard).
- prepare: capitalScheduleAdmissionEvidence snapshot 입력(정책 신선도 유도), 4호선 pilot 교체, 적재 보고서.
- register-kric-capital-timetable: 수집본 → projection snapshot·inventory 증거 등록.
- anti-cheat: KRIC S1101 907열차(원천 2분 간격 10정차)만 원천 행 hash로 고정 제외.

Refs #899
Refs #862
collect-kric-nationwide-timetable-file.mjs로 2026-10-02T15:57:05.773Z 수집(raw sha256 218f76dd…,
기존 광주 retained와 같은 원본). register-kric-capital-timetable.mjs로 수도권 13개 노선 11,922행
projection snapshot과 inventory capitalScheduleAdmissionEvidence를 등록.

Refs #899
…2T17:01:35.688Z)

공식 refresh-nationwide-candidate.mjs(--evaluated-at 2026-10-02T17:01:35.688Z --release-sequence 125
--requested-by data-operator-lead --approved-by data-release-authority). 후보 ID
nationwide-candidate-20261002-seq125. 팩 JSON 57.9MB, nationwide-official-stop-times.json.gz 4.0MB
(수도권·인천 공식 trip·stop_time). 노선별 적재·격리는 nationwide-capital-timetable-report.json.

Refs #899
backend RouteBundleSqliteRuntimeCompiler.MAX_TOTAL_DECOMPRESSED_BYTES 192MiB(backend #459, 운영 배포)와
같은 값으로 올린다. 수도권 공식 시간표 후보 번들 실측 압축해제 합계 85,544,960바이트(81.6MiB),
#903 노선 추가 추정 약 105~110MB. backend 측정: 176MiB 번들 heap peak 556MiB(QA 승인 2026-10-03).

Refs #899
…1:18:19.409Z)

공식 refresh-nationwide-candidate.mjs(--evaluated-at 2026-10-02T21:18:19.409Z --release-sequence 125
--requested-by data-operator-lead --approved-by data-release-authority). 팩·외부 시간표 파일 바이트는 같다.

Refs #899
@coderabbitai

coderabbitai Bot commented Oct 2, 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: c13b1343-89d1-4f79-88ba-4b00ee3acf60

  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Autopilot is currently an internal CodeRabbit preview.


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 marked this pull request as ready for review October 2, 2026 21:46

@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: 5

🎯 Linked issue & acceptance criteria audit
ID Acceptance criterion Status Evidence
C1 Failing test first for per-line trips and representative pair stop_times PASS tools/datapack/capital-official-timetable.test.mjs
C2 Collection, registration and nationwide candidate loading path extended PASS tools/datapack/register-kric-capital-timetable.mjs
C3 No synthetic or estimated timetable for lines without a source PASS tools/datapack/lib/official-line-timetable.mjs
🛡️ Adversarial audit evidence
  • Falsifiability verified: No (Failed: Pinned set or-guard, expand orphan and empty-trip checks, collision guard survived)
  • Hollow assertions detected: 0
  • Production backdoors detected: 0
  • Ground-truth sources verified:
    • Anti-cheat exemption probes killed on source id and row hash operands
    • Committed snapshot recount of trips and one-sided stops via the parser
    • documentation fragment check reports in sync at head 869b9106
    • Issue 899 body and QA decisions on line scope and pinned line 1 rows
🤖 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/capital-official-timetable.test.mjs:108-109`
  Could the PR body record why the tool and data commits are not split, or could
  the data commits move to a follow-up PR?
- `@tools/datapack/lib/external-stop-times.mjs:196-208`
  Could a helper craft sidecar content with a valid sha and binding that contains
  an orphan stop_time, a trip without rows, and a header with an extra field, with
  each expected to fail in expandExternalStopTimes?
- `@tools/datapack/lib/official-line-timetable.mjs:231-231`
  Could tests be added for a same-count set with one different row hash and for a
  count-only change, each expecting QUARANTINE_ALLOWANCE_MISMATCH?
- `@tools/datapack/lib/official-line-timetable.mjs:275-275`
  Could a test inject a stub or two trips with the same provider key and assert
  TRIP_ID_COLLISION?
- `@tools/datapack/lib/official-line-timetable.mjs:289-290`
  Could the QA decision on zero-dwell normalization be recorded in the issue body,
  or could the missing side be preserved so the router sees the source value?

---

Outside diff comments:
None.

ℹ️ Review info
⚙️ Run configuration

Configuration used: CLAUDE.md files, data repo PR template, and aquila-review skill defaults

Review profile: ASSERTIVE

Plan: Aquila fallback

Run ID: N/A (Aquila fallback)

Review source: Aquila CLI

Repository visibility: public GitHub repository

Trigger:
QA-requested discovery review of PR 910 at head 869b910

Base:
main@b25a8c8b49938a610964d58d0ada6cdc12a91a74

Head:
fix/capital-official-timetable-899@869b91069acd58580ac645104ef4f4a0a5b168ef

Command:
aquila-review discovery via post-review.mjs on AquilaXk/easysubway-data PR 910

📥 Commits

Reviewing files changed in this pull request between:

  • Base: b25a8c8b49938a610964d58d0ada6cdc12a91a74
  • Head: 869b91069acd58580ac645104ef4f4a0a5b168ef
📒 Files selected for processing (7)
  • tools/ci/guard-datapack-anti-cheat.mjs
  • tools/datapack/capital-official-timetable.test.mjs
  • tools/datapack/lib/external-stop-times.mjs
  • tools/datapack/lib/external-stop-times.test.mjs
  • tools/datapack/lib/kric-capital-timetable-records.mjs
  • tools/datapack/lib/official-line-timetable.mjs
  • tools/datapack/lib/official-line-timetable.test.mjs
📜 Review details

Comment thread tools/datapack/capital-official-timetable.test.mjs
Comment thread tools/datapack/lib/external-stop-times.mjs
Comment thread tools/datapack/lib/official-line-timetable.mjs
Comment thread tools/datapack/lib/official-line-timetable.mjs
Comment thread tools/datapack/lib/official-line-timetable.mjs
건수는 같고 행 하나만 다른 경우와, 행 집합은 같고 고정 건수만 다른 경우를 각각
QUARANTINE_ALLOWANCE_MISMATCH로 실패시키는 테스트를 더했다. probe-falsifiability로
official-line-timetable.mjs:231의 '!==→===', '||→&&' mutant가 모두 죽는 것을 확인했다.

Refs #899
- expand는 결속 요약 계산 전에 최상위·섹션 키, 헤더, 행 열 수를 닫힌 계약으로 확인한다
  (모르는 필드·헤더 불일치·열 수 불일치는 실패).
- sha·결속을 다시 맞춘 변조 파일로 ORPHAN_STOP_TIME·TRIP_WITHOUT_STOP_TIMES·SECTION·CONTENT·
  ROW_SHAPE가 각각 expand에서 실패하는 테스트를 더했다. 각 검사를 무력화한 mutant 6개가 모두 죽는다.

Refs #899
같은 provider key를 가진 서로 다른 원천 행이 같은 trip_id로 모이면 실패하는지 고정했다.
official-line-timetable.mjs의 충돌 검사를 무력화한 mutant가 이 테스트로 죽는다.

Refs #899
QA 결정(2026-10-03): 원천이 정차에 시각 하나만 준 경우 그 값을 정차 시각(도착 = 출발)으로 쓰는 것을
허용하되 숨기지 않는다.
- stop_time.timeSource: PROVIDER_ARRIVAL_AND_DEPARTURE / SINGLE_PROVIDER_TIME_ARRIVAL / SINGLE_PROVIDER_TIME_DEPARTURE
- 보고서 lines[].singleProviderTimeStopCount(기점·중간·종점)
- 외부 시간표 파일 schemaVersion 3: 선택 열 timeSource(없는 행은 null, 펼칠 때 키 없음)
- 두 시각이 모두 없으면 지금처럼 실패한다(테스트 고정).

Refs #899
…0-02T21:55:02.841Z)

공식 refresh-nationwide-candidate.mjs(--evaluated-at 2026-10-02T21:55:02.841Z --release-sequence 125
--requested-by data-operator-lead --approved-by data-release-authority). 외부 시간표 파일 schemaVersion 3.

Refs #899
@sonarqubecloud

sonarqubecloud Bot commented Oct 2, 2026

Copy link
Copy Markdown

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

github-actions Bot commented Oct 2, 2026

Copy link
Copy Markdown
Contributor

No description provided.

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