Skip to content

[Feat] 시간표 미지원 12개 노선의 공식 시간표를 전국 후보에 적재 - #912

Merged
AquilaXk merged 30 commits into
mainfrom
feat/integrate-remaining-timetables-903
Oct 3, 2026
Merged

AquilaXk merged 30 commits into
mainfrom
feat/integrate-remaining-timetables-903

Conversation

@AquilaXk

@AquilaXk AquilaXk commented Oct 3, 2026 •

Copy link
Copy Markdown
Owner

Related issue

Refs #903
Refs #862

Summary

  • Problem
    • 첫 전국 후보(seq 124)에서 노선 36개 중 12개 노선의 시간표 trip이 0건이다. 해당 노선은 서해·경춘·수인분당·경의중앙·경강·동해·GTX-A·에버라인·의정부·김포골드·부산김해·대경선이다. QA 결정(2026-10-03)으로 전 노선이 출시 범위가 됐다.
    • 10-02에 컷오버 이전 규칙(P1D)으로 등록한 topology 7개가 2026-10-03 06:03~06:07Z에 만료된다. 이 상태의 후보는 발행할 수 없다.
  • Outcome
    • 12개 노선의 공식 시간표를 후보에 적재했다. 노선 36개 모두 trip이 1건 이상이다.
      • 코레일 6개 노선: KRIC 파일 900의 역별 행을 재구성했다.
      • GTX-A·에버라인·의정부·김포골드·부산김해: KRIC 역별 시간표 API로 재구성했다.
      • 대경선: 승인된 코레일 계획 시각표를 재등록했다.
    • topology 7개를 다시 수집해 컷오버 이후 규칙(P7D)으로 재등록했다(메인 결정 (a)). 만료는 10-10이다.
    • 전국 후보를 seq125로 재생성했다. 후보 시계는 2026-10-03T00:40:43.059Z이다.
    • 서버 번들과 manifest의 freshUntil은 2026-10-10 09:31:56 KST이다.

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

Changes

도구

  • lib/kric-korail-timetable.mjs
    • 파일 900 관측에서 코레일 6개 노선 행을 원문 그대로 projection snapshot으로 만든다.
    • 공용 적재기 입력(provider, lineBindings)으로 바꾼다. 휴일은 WEEKEND_HOLIDAY로 넘기고, alias는 근거 문구와 함께 넘긴다.
    • 급행은 trip 단위 고정 집합으로 묶어 적재하지 않는다(경춘 5, 수인분당 22, 경의중앙 28 trip). 사유는 "급행 정차·통과 구분 불가, #902에서 보강"이다.
  • lib/kric-station-lines-timetable.mjs: station-lines 등록 파생 스냅샷의 내용 해시와 inventory 결속을 다시 확인한 뒤 공용 적재기 입력으로 바꾼다.
  • register-kric-capital-timetable.mjs
    • 같은 수집·같은 관측에서 코레일 projection을 하나 더 만들고 korailScheduleAdmissionEvidence에 결속한다.
    • 재확인 이력은 append-only이고, 관측 시각은 수도권과 같다.
  • prepare-nationwide-candidate-run.mjs
    • 코레일 projection은 inventory evidence와 정책 신선도로 고른다.
    • 대경선 계획 시각표와 station-lines 스냅샷은 원장 head와 fan-in으로 고르고, 내용 해시를 원장·inventory와 대조한다.
    • 공용 적재기로 싣는다. station-lines는 외부 시간표 파일(sidecar) 원천에 추가하고, 코레일은 수도권과 같은 원천의 두 번째 섹션이 된다.
    • 대경선은 materializeKorailTimetable로 싣는다.
    • 노선별 요약과 격리 행을 nationwide-official-line-timetable-report.json에 남긴다.
  • refresh-nationwide-candidate.mjs: 새 보고서를 refresh 출력에 추가했다.
  • 리뷰 반영([Feat] 시간표 미지원 12개 노선의 공식 시간표를 전국 후보에 적재 #912 Aquila review)
    • F1: 기본 경로에서 급행 고정 집합이 경춘·수인분당·경의중앙 binding에 붙는지 단위 테스트로 단언했다. e2e에서는 노선 보고서 pinnedQuarantine을 노선별로 단언했다. 부착 분기를 지우는 변이는 두 테스트에서 모두 실패한다.
      • 커밋된 보고서는 이미 세 노선에 고정 집합이 붙어 있었다(I41K2 5, I28K1 22, I4108 28). 산출물은 바뀌지 않는다.
    • F2: station-lines 격리 행은 dayCd 8·9만 받고, 코레일 격리 행은 평일·휴일만 받는다. 그 밖의 값은 SERVICE_DAY로 실패한다. 보고서·팩 바이트는 같다.
    • F3: 아래 데이터 절에 대전·광주 접근성 snapshot 변화를 적었다.
  • materialize-gwangju-timetable.mjs(버그 수정)
    • 문제: topology evidence 창을 24시간 고정값으로 검사해서, 컷오버 이후 수집한 광주 topology(P7D)가 들어오면 보관본 등록 경로가 실패했다.
    • 수정: #904의 topologySnapshotFreshnessMillis로 검사한다. 컷오버 전 수집은 P1D, 후 수집은 P7D를 정확값으로 요구한다.
  • Hub data 계약 pin을 905ae116으로 올렸다(#3025, planned_timetable에 station-lines 포함).

테스트

  • 컷오버 이후 첫 topology 데이터가 들어오면서, 저장소 상태에 기대던 테스트를 같은 규칙으로 고쳤다.
    • 공용 materialize fixture: 대전 topology 창을 커밋된 evidence에서 옮겨 쓰지 않고, 수집 시각에 컷오버 규칙을 적용해 유도한다.
    • 인천 station-info 수집기·후보 입력 만료 테스트: 24시간 고정값을 컷오버 규칙으로 바꿨다.
    • 인천 시간표 만료 테스트: 후보 시계 대신 수집 시각을 옮긴다. 시계를 옮기면 다른 입력이 먼저 만료돼 결과가 섞인다.
    • 후보 입력 pin을 10-03 원장 head로 갱신했다.
  • 코레일 projection의 결정성 단언을 독립 해시 계산으로 바꿨다(anti-cheat ANTI-CIRCULAR-ORACLE).
  • car-door·freshness·수도권 시간표·station-lines 등록/게시 테스트: 저장소에 새로 등록된 데이터에 맞추거나, 등록 전 상태 사본으로 격리했다.

데이터(시간표)

  • 대경선
  • KRIC 파일 900(sha 218f76dd…)
    • 수도권: 동일 원본 재확인으로 이력만 append했다.
    • 코레일 projection은 처음 등록했다(59,346행).
  • kric-subway-timetable-station-lines
    • 실수집: 응답 210개, 3,956 trip, 고정 기대값과 일치
    • OCI 원본 게시(sha 3a8c462a…, 8,823,618B)
    • 명시 검토 admission: 승인자 data-release-authority, 근거는 QA 승인(2026-10-03 채팅 "출시 범위 전 노선 공식 시간표 적재", [Feat] 코레일 단독 노선 등 시간표 미지원 노선의 공식 시간표 적재 #903)
    • 원장, inventory, governance(kric-subway-timetable과 같은 약관), freshness(planned_timetable)에 등록
    • production scope requiredSourceIds에 추가

데이터(topology 재등록, 2026-10-03 수집, 모두 P7D)

원천 도구 원본 sha 만료(UTC)
capital-route-topology (+인천 station-info·1·2호선 입력) collect → activate-current-source-set --topology-source-admission → run-current-capital-route-topology-registration 새 수집 2026-10-10T00:31:56Z
gwangju-transportation-route-topology register-gwangju-route-topology publish-register 10-02와 같음(6759e59e…) 2026-10-10T00:33:52Z
daejeon-station-distance-fare register-daejeon-route-topology publish-register 10-02와 같음 2026-10-10T00:33:59Z
busan-transportation-route-topology register-busan-route-topology publish-register 10-02와 같음(1314c1ca…) 2026-10-10T00:34:31Z
daegu-line1/2/3-route-topology (+시간표 3개) register-daegu-datapack-sources publish-register 파일 9개 모두 10-02와 같음 topology 2026-10-10T00:35:58Z, 시간표 2026-11-02
  • ITX admission은 10-11까지 유효해서 다시 수집하지 않았다(decide-current-capital-topology-refresh: itxRefreshRequired=false).
  • 대구 data.go.kr 파일 9개와 대전·광주 접근성 파일 4개
  • 연쇄 재결속은 #892와 같은 공식 도구를 썼다.
    • 대전·광주 접근성 재수집과 register-regional-accessibility publish-register: topology 등록기가 접근성 결속을 새 topology 계보로 바꿨기 때문이다. 원본 sha는 같다.
      • snapshot 행 내용은 바뀌었다. 원천이 주지 않는 휠체어 리프트 수가 0이 아니라 null로 기록된다([Fix] 지역 접근성 조작 부재 제거와 coverage report 지역 증거 엄격 검증 #894 규칙: 추정치 금지).
      • 그래서 inventory evidence의 facilityCount가 대전 66 → 44, 광주 56 → 36으로 줄었다. 엘리베이터·에스컬레이터 값은 같다.
      • 전국 팩의 facilities·stationFacilityEvidence 행 수는 그대로다. snapshot id, 해시, 시각만 바뀌었다. 후보 산출물에서 시설이 사라진 것이 아니다.
    • build-busan-transfer-metrics: 지표 12개와 제외 6개는 같고, 원천 식별만 바뀌었다.
    • build-seoul-measured-transfer-metrics: 지표 263개는 같고, 정본 팩 sha만 8102f1f6…에서 83e11161…로 바뀌었다.
    • rebind-current-seoul-transfer-source-admission([Fix] 전국 경로용 서울 환승 증거 재결속 명령 복원 #893): OCI는 GET만 했다(PUT 없음).
  • 전국 후보 재생성: seq125, 후보 시계 2026-10-03T00:40:43.059Z
    • 시간표 내용은 같다. 인천 1·2호선 snapshot 식별만 20261003으로 바뀌었다.
  • 문서 파편: source-inventory·governance blob 변경을 반영했다.

신선도(가장 이른 만료)

순위 원천 만료(KST) 비고
1 kric-nationwide-timetable-file 원장 head(광주 보관본, 10-01 등록) 2026-10-08 13:19:25 후속 Tool PR로 조기 재확인한다
2 korail-metropolitan-timetable-file 2026-10-10 09:05:31
3 capital-route-topology 2026-10-10 09:31:56 서버 번들·manifest freshUntil과 같다
4 gwangju-transportation-route-topology 2026-10-10 09:33:52
5 daejeon-station-distance-fare 2026-10-10 09:33:59
6 busan-transportation-route-topology 2026-10-10 09:34:31
  • 원천 단위로 가장 이른 만료는 10-08 13:19 KST(광주 보관 KRIC)이다. 운영 seq122 만료(10-09 12:16 KST)보다 이르다.
  • 이 head는 공식 경로인 run-retained-gwangju-timetable-refresh로 만료 전에 갱신할 수 없다. 판정이 now >= freshnessExpiresAt일 때만 DUE이기 때문이다.
  • 후속 Tool PR에서 #911의 동일 원본 재확인 경로를 register-retained-kric-timetable로 넓히고, 조기 재확인 창을 둔다.
  • 예약 workflow Retained Gwangju Timetable Refresh와 Current Capital Topology Refresh는 둘 다 disabled_manually 상태다(gh workflow list --all).
  • 실측한 서버 번들·manifest freshUntil은 2026-10-10 09:31:56 KST이다. 번들 freshUntil은 topology·접근성 창으로 정해지고, 시간표 원천의 만료는 반영되지 않는다. 이 동작이 의도인지는 리뷰에서 확인이 필요하다.

Scope

Included

  • 위 도구, 테스트, 등록 데이터, topology 재등록, 후보 재생성

Excluded

  • #903의 "미지원 목록에서 뺀다" 항목: QA 결정(2026-10-03, 전 노선 출시 범위·제외 없음)으로 철회됐다. 미지원 노선 목록 자체를 만들지 않았다.
  • 발행(publish)과 2단계 DEPLOY. 이 PR 병합 뒤 메인이 진행한다.
  • 광주 보관 KRIC 조기 재확인. 후속 Tool PR에서 한다.
  • 급행 정차 패턴. #902에서 보강한다.
  • pilot 체인 정리(activate-current-source-set의 CURRENT_SOURCE_HANDOFF·applySchedule, 두 sourceId 통합). 메인이 후속 이슈로 만든다.
  • materialize-daegu-timetable.mjs의 topology evidence 24시간 고정 검사
    • 광주와 같은 결함이다.
    • 현재 실데이터 경로(전국 후보 prepare, run-rc-full)에서는 호출되지 않는다. 그래서 RED 없이 고치지 않았다.
    • 후속 Tool PR에서 RED와 함께 다룬다.

Ownership / dependencies

Contract & Compatibility

  • Source / API / schema contract
    • 새 inventory evidence 키 korailScheduleAdmissionEvidence
    • 새 원천 kric-subway-timetable-station-lines
    • 새 보고서 nationwide-official-line-timetable-report.json
  • Artifact / provenance identity
    • trip provenance: sourceId, 원천 snapshot, 원천 행 sha. 외부 시간표 파일 섹션 헤더로 결속한다.
    • 코레일 trip은 원천 행 sha 목록의 sha를, station-lines trip은 정규화 행의 sha를 쓴다.
  • Backward compatibility: 기존 노선의 trip·정차 건수는 바뀌지 않는다(아래 전후 표).
  • Migration or cutover: 없음. topology 창은 [Chore] 노선 topology 신선도를 컷오버 이후 P7D 창으로 전환하고 Hub 계약 pin 상향 #904 컷오버 규칙을 그대로 따른다.

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의 근거를 갱신했습니다. 근거: production-datapack-scope.json requiredSourceIds에 등록 완료 원천 1건을 추가했고, datapack-freshness-sla.json planned_timetable에 같은 원천을 등록기가 append했다(Hub #3025와 같은 값).
  • 검증되지 않은 지원 범위 claim을 추가하거나 확대하지 않습니다.

Provenance impact

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

Version decision

  • datapack version: 후보 seq125
    • 운영 manifest(catalog/current.json, 읽기 전용 GET): releaseSequence 124, expiresAt 2026-10-03T06:03:36.888Z
    • seq125는 아직 발행되지 않았다.
  • decide 로컬 실행(decide-datapack-release)
    • 입력: 이 후보 manifest, 위 운영 manifest, build-spec, release-request, freshness SLA, strict validation PASS
    • 결과: outcome PUBLISH_REQUIRED, productionWriteAllowed true, materialChange true, approvalValid true, strictValidationPassed true
    • reasonCodes: PACK_PUBLISH_FRESHNESS_EXPIRING, PUBLISH_REQUIRED_NOT_COMPLETED
    • evaluationAt: 2026-10-03T00:44:48Z
  • data contract: 위 Contract 항목
  • route-map artifact / product gate: production scope, freshness SLA
  • promotion request id: 없음(발행은 이 PR 밖)

e2e 건수 변화(전후)

노선 원천 trip 전 → 후 정차 전 → 후
서해 파일 900 I41WS 0 → 320 0 → 5,936
경춘 파일 900 I41K2(급행 5 미적재) 0 → 211 0 → 4,201
수인분당 파일 900 I28K1(급행 22 미적재) 0 → 757 0 → 25,065
경의중앙 파일 900 I4108(급행 28 미적재) 0 → 410 0 → 15,580
경강 파일 900 I41K5 0 → 221 0 → 2,565
동해 파일 900 I26K6 0 → 198 0 → 4,342
GTX-A KRIC API GX·SR/A 0 → 804 0 → 3,780
에버라인 KRIC API EV/E1 0 → 746 0 → 11,134
의정부 KRIC API UL/U1 0 → 794 0 → 11,910
김포골드 KRIC API GM/G1 0 → 854 0 → 8,012
부산김해 KRIC API BG/B1 0 → 758 0 → 15,918
대경선 코레일 계획 시각표 0 → 194 0 → 1,488
그 외 24개 노선 기존 원천 변화 없음 변화 없음
합계 19,973 → 26,240 561,983 → 671,914
  • route 26 → 39: 코레일 6, 역별 API 5, 대경선 상·하행 2
  • 운행 달력 24 → 30, 달력 예외 132 → 200
  • trip이 0건인 노선: 12 → 0
  • topology 재등록 뒤에도 같은 건수다. 외부 시간표 파일에서 바뀐 것은 인천 1·2호선 섹션 헤더의 snapshot 식별과 updatedAt뿐이다.

크기 실측

항목 전 후 상한
팩 JSON 57,882,210B 59,147,355B 70MB 미만
외부 시간표 파일(gzip) 4,194,741B 5,641,204B 50MB 미만
외부 시간표 파일(펼침) 해당 없음 58,866,238B 해당 없음
서버 번들 압축해제 합계 해당 없음 99,143,680B(timetable 83,308,544 + accessibility 14,499,840 + topology 1,097,728 + fare 237,568) 192MiB 미만

canary probe 재현

  • 실행 조건
    • backend origin/main ac30403c의 RouteBundleSqliteRuntimeCompiler·JourneyRaptorAdapter를 썼다. 압축해제 상한은 #459로 이미 192MiB이고, 로컬에서 바꾸지 않았다.
    • 번들은 이 PR head로 만든 run-rc-full 출력이다. 받은 manifest sha는 fe59b975…, releaseSequence는 125다.
    • d92f11c와 dc30bf4 두 실행의 payload 4개는 바이트가 같다(payloadRootSha256 e95d6073…).
  • 결과: 30건 모두 후보 1개
시각(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
  • 표의 숫자는 각 시각·지역별 후보 경로 수이고, 괄호 안은 첫 후보의 소요 시간과 환승 수다.
  • 10-08 14:00과 10-09 11:00은 원천 단위 최소 만료(10-08 13:19 KST, 광주 보관 KRIC)보다 뒤인 시각이다. 서버 번들 freshUntil(10-10 09:31 KST) 안이므로 경로 계산만 재현했다.

Verification

Check Result / Evidence
Focused RED → GREEN 아래 세 항목 참고
└ e2e "팩의 전 노선 trip 1건 이상" 단언을 추가했다. 변경 전 팩은 12개 노선이 0건이다. 변경 후 prepare 테스트 42건이 통과한다.
└ 광주 materializer 수정 전에는 register-retained-kric-timetable.test.mjs가 실데이터로 "gwangju-transportation-route-topology evidence freshness relationship is invalid"를 내며 실패했다(CI shard 2/4도 같다). 수정 후 23건이 통과한다.
└ 새 lib 테스트 korail 3건, station-lines 2건, 수도권 등록기 8건
Affected integration 아래 "영향 테스트" 참고
Required CI Data contracts(이 PR의 CI 결과)
Live provider / release KRIC 파일 900, KRIC 역별 API, 코레일 첨부, topology 7개(수도권·인천·광주·부산·대전·대구), 대전·광주 접근성을 실수집했다. run-rc-full은 d92f11c와 dc30bf4 두 head에서 38/38 ALL RC STEPS PASSED다.
Security / data integrity OCI 게시는 immutable PUT이다. PAR과 키는 출력하지 않았다. 수집본에 키 문자열은 0회다. 검토 admission은 명시 입력 파일로 넣었다. guard-datapack-anti-cheat PASS

영향 테스트

  • node tools/ci/run-affected-tests.mjs --base origin/main: 2077건 중 1974건 통과, 103건 실패
  • 실패 103건은 위 테스트 수정으로 고쳤다. 실패한 파일을 하나씩 직렬로 다시 돌린 결과는 다음과 같다.
    • materialize-* 20개 파일, collect-incheon-station-info 8/8, register-retained-kric-timetable 5/5: 모두 통과
    • prepare-nationwide-candidate-run 42/42, datapack-tools 363/363, release-candidate-accessibility-input 8/8: 통과
    • guard-datapack-anti-cheat test 12/12: 통과
  • emit-station-catalog-pack 2건은 로컬에서만 실패한다. #892에서 로컬 시간대·SQLite 고정 런타임 문제로 확인했고, origin/main에서도 같았다. 이번 CI shard 실패 목록에는 없다.
  • 문서 파편: refresh-documentation-fragment --worktree 후 --check 결과 IN SYNC

Not run

  • Check: 고친 뒤 영향 테스트 전체를 한 번에 다시 실행하는 것
  • Reason: prepare 테스트가 실행 중에 저장소 산출물을 다시 써서, 같은 실행 안의 다른 테스트가 바뀐 파일을 읽고 실패한다(#892와 같은 현상). 그래서 실패 파일을 하나씩 직렬로 다시 돌렸다.
  • Rerun owner / condition: 전체 재실행은 이 PR의 CI가 한다.

Risk

  • Level: High
  • Main risk: 발행 후보의 전 노선 시간표와 topology 결속이 바뀐다. 원천 재구성 오류가 있으면 잘못된 시각이 배포된다.
  • 운영 메모
    • 대전·광주 접근성 1차 publish-register가 OCI PUT 뒤 원장 단계에서 실패했다(SOURCE_LINEAGE_BROKEN: retrievedAt 순서).
    • 그 결과 원장이 참조하지 않는 OCI 객체 2개가 남았다. 경로는 source-raw/{daejeon,gwangju}-transportation-accessibility/20261002/…이다.
    • 삭제하지 않았다. raw 보존 만료 때 purge 대상이다.
  • Failure behavior: 다음 경우 후보 생성이 실패한다.
    • 역 미매칭, 노선 trip 0, 운행일 종류 누락, 격리 상한 초과
    • 급행 고정 집합 불일치, 기대값 변경
    • 내용 해시·원장 결속 불일치, 입력 만료
  • Candidate / admission / publication state on failure: 후보를 만들지 않는다. 발행은 이 PR 밖에서 한다.
  • Fallback or degraded-success path introduced: No

Rollout / Recovery

  • Rollout or promotion: 병합 후 메인이 발행하고, 운행 시간대에 2단계 DEPLOY를 한다. 광주 보관 KRIC 조기 재확인은 후속 Tool PR에서 한다.
  • Monitoring / success signal: platform canary 5개 probe 통과, 전 노선 경로 후보 1개 이상
  • Rollback or recovery: 이 PR을 revert한다. 발행 뒤라면 기존 롤백 manifest 절차를 따른다.
  • Existing artifact / schema compatibility after rollback: 기존 팩 형식과 같다(외부 시간표 파일 섹션만 늘었다).

Review focus

  • 코레일 projection과 수도권 projection의 관측 공유
  • 공용 적재기 결속(급행 고정 집합, alias 근거)
  • 대경선 재결속, station-lines 등록 결속
  • topology 재등록과 연쇄 재결속(접근성, 부산·서울 환승 지표, 서울 환승 admission)
  • 광주 materializer 수정과 테스트 fixture의 컷오버 규칙 적용
  • 서버 번들 freshUntil이 시간표 원천 만료를 반영하지 않는 점(위 신선도 절)

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

- 공식 첨부(sha c28dcd…)를 2026-10-03T00:05Z에 재수집해 원본 재게시 없이 재확인 원장 행으로 등록한다(#911 경로).
- topology head를 5d68004f…에서 a2fee5ce…로 잇고 freshUntil은 2026-10-10T00:05Z다.

Refs #903 #862
- planned timetable을 topology a2fee5ce…에 결속해 재등록한다(동일 원본, 운행 194 trip).
- 달력 창은 2026-10-03~2026-11-02(KASI 10·11월), freshUntil은 2026-11-02T00:05Z다.
- materializeKorailTimetable 부모 불일치(PARENT)가 해소된다(10-03·10-08 시각 건식 실행 194 trip).

Refs #903 #862
- 수도권 등록기가 같은 관측에서 코레일 projection snapshot을 만들고 korailScheduleAdmissionEvidence에 결속한다
  (재확인 이력 append-only, 수도권과 같은 관측 시각).
- 코레일 provider: 휴일→WEEKEND_HOLIDAY, alias 근거 동반, 급행은 trip 단위 고정 집합(경춘 5·수인분당 22·경의중앙 28).
- station-lines provider: 등록 파생 스냅샷의 내용 해시·inventory 결속을 다시 확인하고 trip을 그대로 넘긴다.

Refs #903 #862
- 2026-10-03T00:11Z 재수집(원본 sha 218f76dd…). 수도권 snapshot은 재사용하고 재확인 이력만 append한다.
- 같은 관측에서 코레일 projection(59,346행, snapshot c186585e…)을 korailScheduleAdmissionEvidence로 등록한다.

Refs #903 #862
…수 원천 지정

- 2026-10-03T00:12Z 실수집(응답 210, 3,956 trip, 기대값 일치), OCI 원본 게시(sha 3a8c462a…), 명시 검토 admission
  (data-release-authority, QA 승인 2026-10-03 채팅: 출시 범위 전 노선 공식 시간표 적재)으로 등록한다.
- governance(kric-subway-timetable과 같은 약관)·freshness(planned_timetable)·원장·inventory·파생 스냅샷을 한 트랜잭션으로 쓴다.
- production scope requiredSourceIds에 추가한다.

Refs #903 #862
- 코레일 projection(korailScheduleAdmissionEvidence)은 수도권과 같은 inventory evidence·정책 신선도로 고르고,
  대경선 계획 시각표·station-lines 파생 스냅샷은 원장 head·fan-in으로 고른 뒤 내용 해시를 원장·inventory와 대조한다.
- 두 원천은 공용 적재기로 싣고 station-lines는 외부 시간표 파일(sidecar) 원천에 추가한다. 코레일은 수도권과 같은
  원천의 두 번째 섹션이 된다. 노선별 요약·격리 행은 nationwide-official-line-timetable-report.json에 남긴다.
- 대경선은 materializeKorailTimetable로 싣는다. e2e에 '팩의 전 노선 trip 1건 이상' 단언을 추가한다(RED).

Refs #903 #862
- trip 19,973→26,240, 정차 561,983→671,914, route 26→39, 달력 24→30, 달력 예외 132→200.
  증가분은 코레일 6개 노선·KRIC 역별 5개 노선·대경선뿐이고 기존 노선 건수는 같다.

Refs #903
- 노선 36개 전부 trip 1건 이상(이전 12개 노선 0건). trip 26,240·정차 671,914.
- 팩 JSON 59,147,366B, 외부 시간표 파일 gzip 5,641,204B(펼침 58,866,238B).

Refs #903 #862
@coderabbitai

coderabbitai Bot commented Oct 3, 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: ae30e4e2-9699-472b-a39c-67c9d4419827
  • 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.

- 수도권 외부 시간표 단언은 같은 원천의 코레일 섹션과 구분하도록 snapshot으로 고른다.
- 대경선 재확인 head의 신선도 값과 이전 head lineage를 반영한다.
- car-door 등록 테스트의 'inventory·governance 끝' 위치 가정을 '하나만, 기존이면 제자리'로 바꾼다.
- station-lines 등록·게시 테스트는 저장소 사본을 등록 전 상태로 되돌려 첫 등록부터 시험한다.

Refs #903
…30.412Z)

- 팩·외부 시간표 파일 바이트는 같고 fan-in·소유권 원장·spec·request·hash 결속만 갱신된다.

Refs #903 #862
current-capital-topology-refresh 절차와 같은 공식 수집기 출력 4개다(ITX admission은 10-11까지 유효해 재수집하지 않는다).

Refs #903 #862
activate-current-source-set --topology-source-admission 결과(inventory·canonical pack·재검증 증거)다.

Refs #903 #862
run-current-capital-route-topology-registration 결과다.

Refs #903 #862
register-gwangju-route-topology publish-register 결과다. 같은 도구가 topology에 묶인 접근성·노선도 위치 snapshot 결속을 새 topology로 다시 맞췄다.

Refs #903 #862
register-busan-route-topology publish-register 결과다.

Refs #903 #862
register-daejeon-route-topology publish-register 결과다. 같은 도구가 topology에 묶인 접근성·노선도 위치 snapshot 결속을 다시 맞췄다.

Refs #903 #862
… 모두 동일)

register-daegu-datapack-sources publish-register 결과다. data.go.kr 파일은 #890 미해결로 포털 다운로드 버튼과 같은 경로(임시 방식, 키 없음)로 받았다.

Refs #903 #862 #890
topology 재등록이 접근성 결속을 새 topology 계보로 바꿔서, #892와 같이 접근성을 다시 수집해 원장 행을 맞췄다. data.go.kr 파일은 #890 미해결로 임시 포털 경로로 받았다.

Refs #903 #862 #890
topology 재등록이 만든 접근성 중간 snapshot 2개는 같은 브랜치의 재수집 등록으로 대체돼 inventory·원장 어디에서도 참조되지 않는다.

Refs #903
build-busan-transfer-metrics 결과다. 지표 12개와 제외 행 6개는 같고 원천 식별만 새 topology head로 바뀐다.

Refs #903 #862
build-seoul-measured-transfer-metrics 결과다. 지표 263개는 같고 정본 팩 sha만 8102f1f6…에서 83e11161…로 바뀐다.

Refs #903 #862
rebind-current-seoul-transfer-source-admission(#893) 결과다. 잠긴 원본은 OCI에서 GET만 했다(PUT 없음). 원천 값은 같고 정본 팩 결속만 바뀐다.

Refs #903 #862
…059Z)

시간표 내용은 같고 인천 1·2호선 snapshot 식별(20261003)과 fan-in·spec·request·hash 결속만 바뀐다.

Refs #903 #862
컷오버 이후 수집한 광주 topology(P7D)를 24시간 고정값으로 검사해 보관본 등록 경로가 실패했다(register-retained-kric-timetable 테스트가 실데이터로 RED). topologySnapshotFreshnessMillis로 컷오버 전 P1D, 후 P7D를 정확값으로 검사한다.

Refs #903 #904
- 공용 materialize fixture는 대전 topology 창을 커밋된 evidence 창이 아니라 수집 시각 기준 컷오버 규칙으로 유도한다.
- 인천 station-info 수집기·후보 입력 만료 테스트의 24시간 고정값을 컷오버 규칙으로 바꾼다.
- 인천 시간표 만료 테스트는 후보 시계를 옮기지 않고 수집 시각을 옮겨 다른 입력의 만료와 섞이지 않게 한다.
- 후보 입력 pin을 10-03 원장 head로 갱신한다.
- 코레일 projection 결정성 단언을 독립 해시 계산으로 바꾼다(anti-cheat ANTI-CIRCULAR-ORACLE).

Refs #903
@AquilaXk
AquilaXk marked this pull request as ready for review October 3, 2026 01:35

@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 Reconstruction tests check monotonic times, line membership and continuity PASS tools/datapack/prepare-nationwide-candidate-run.test.mjs
AC-2 Korail lines are reconstructed and loaded with pinned express quarantine PASS tools/datapack/lib/kric-korail-timetable.mjs
AC-3 Sources for the four separate lines are catalog-checked and measured PASS tools/datapack/source-inventory.json
AC-4 The Gimpo Gold line row structure is judged and handled PASS tools/datapack/lib/kric-station-lines-timetable.mjs
⚡ Tiered triage & token efficiency
  • Non-code files skipped: 0
  • AST symbols extracted: 190
  • Estimated token savings: 0%
Category Count Status
Skipped non-code files 0 TIER-1 SKIPPED
AST semantic symbols 190 TIER-2 EXTRACTED
🛡️ Adversarial audit evidence
  • Falsifiability verified: Yes (Gwangju freshness probe killed 2 of 3 mutants; hardcoded 7-day window went red.)
  • Hollow assertions detected: 0
  • Production backdoors detected: 0
  • Ground-truth sources verified:
    • Issue 903 QA decision 2026-10-03: all lines in launch scope
    • Loader pins express row count and row set sha: 5, 22 and 28 trips
    • Seoul transfer rebind used the sanctioned tool that fails on value change
    • Station-lines snapshot: 0 quarantine rows, day codes 8 and 9, policy recorded
🤖 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/kric-korail-timetable.mjs:135-136`
  Could a test call kricKorailOfficialTimetable with the default allowance and assert
  that lineBindings for I41K2, I28K1 and I4108 carry the pinned rowCount and
  rowSetSha256, while the other three lines carry none, mirroring kric-capital-
  timetable-records.test.mjs? Could the e2e also assert pinnedQuarantine in the
  committed line report, and could the unused expressQuarantine fixture field be
  dropped?
- `@tools/datapack/lib/kric-station-lines-timetable.mjs:42-42`
  Could quarantine rows reuse the same strict day-kind lookup as admitted trips, so an
  unknown day code or weekday label fails explicitly instead of defaulting to holiday?
- `@tools/datapack/source-inventory.json:1577-1577`
  Could the PR body note that re-collection changed the snapshot rows (lift 0 to null,
  facilityCount 66 to 44 and 56 to 36) while the raw sha and pack facility rows stayed
  the same, so reviewers do not read the new counts as lost facilities?

---

Outside diff comments:
None.

ℹ️ Review info
⚙️ Run configuration

Configuration used: aquila-review skill run by Claude Code with hub CLAUDE.md invariants

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 for the automerge review gate

Base:
main@7f1594b163e8f3a387bf3a777d03e96c1379911d

Head:
feat/integrate-remaining-timetables-903@dc30bf4ce1e299b53b8a95aebfb75f9a307b8bae

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

📥 Commits

Reviewing files changed in this pull request between:

  • Base: 7f1594b163e8f3a387bf3a777d03e96c1379911d
  • Head: dc30bf4ce1e299b53b8a95aebfb75f9a307b8bae
📒 Files selected for processing (11)
  • tools/datapack/lib/kric-korail-timetable.mjs
  • tools/datapack/lib/kric-korail-timetable.test.mjs
  • tools/datapack/lib/kric-station-lines-timetable.mjs
  • tools/datapack/lib/kric-station-lines-timetable.test.mjs
  • tools/datapack/materialize-gwangju-timetable.mjs
  • tools/datapack/prepare-nationwide-candidate-run.mjs
  • tools/datapack/prepare-nationwide-candidate-run.test.mjs
  • tools/datapack/register-kric-capital-timetable.mjs
  • tools/datapack/register-kric-station-timetables.test.mjs
  • tools/datapack/release/source-snapshots.json
  • tools/datapack/source-inventory.json
📜 Review details

Comment thread tools/datapack/lib/kric-korail-timetable.mjs
Comment thread tools/datapack/lib/kric-station-lines-timetable.mjs Outdated
Comment thread tools/datapack/source-inventory.json
리뷰 F1: 기본 allowance 경로를 타는 테스트가 없어 고정 집합 부착 분기를 지우는 변이가 살아남았다. 기본 경로에서 경춘 5·수인분당 22·경의중앙 28 trip 고정 집합이 붙고 나머지 3개 노선에는 붙지 않음을 단언하고, e2e에서 노선 보고서 pinnedQuarantine을 노선별로 단언한다. 부착 분기를 false로 바꾸면 두 테스트가 모두 실패한다.

Refs #903
리뷰 F2: 격리 행은 평일이 아닌 값을 모두 주말·휴일로 기록했다. station-lines는 dayCd 8=평일·9=주말·휴일, 코레일은 요일구분 평일·휴일만 받고 그 밖의 값은 SERVICE_DAY로 실패한다. 현재 데이터의 격리 행·보고서·팩 바이트는 바뀌지 않는다.

Refs #903
@sonarqubecloud

sonarqubecloud Bot commented Oct 3, 2026

Copy link
Copy Markdown

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

github-actions Bot commented Oct 3, 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.

1 participant