[Feat] Ingest nationwide barrier-free routes and regional accessibility facilities (#800) - #801
Conversation
…ty facilities (#800) - Parse MOLIT transfer movement raw data to generate 26 directed step-free pathway edges across 13 non-capital transfer stations - Ingest 746 regional accessibility facilities across Busan, Daegu, Daejeon, and Gwangju with Fail-Closed status validation - Support wheelchair lift unblocking in Gwangju collector/materializer - Update candidate build spec and nationwide production canonical pack schema - Pass all 313 accessibility unit and contract tests
|
Navigate logical layers of code changes, visualize relationships, and explore their blast radius. Note Currently processing new changes in this PR. This may take a few minutes, please wait... ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Advanced Run ID: 📒 Files selected for processing (20)
✨ Finishing Touches📝 Generate docstrings
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. Comment |
|
@coderabbitai review |
|
…ated source inventory
|
AquilaXk
left a comment
There was a problem hiding this comment.
Actionable comments posted: 0
🤖 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.
🪄 Autofix (Beta)
Codex fallback does not include CodeRabbit Autofix.
Could we verify each finding against the current code, then apply any still-valid
fix through the separately authorized workflow?
ℹ️ Review info
⚙️ Run configuration
Configuration used: Codex CLI invocation and local review instructions
Review profile: ASSERTIVE
Plan: Codex fallback
Run ID: N/A (Codex fallback)
Review source: Codex CLI
Repository visibility: public GitHub repository
Trigger:
Codex fallback triggered due to missing automated review
Base:
main@5734bef7c80dd3681b8b7f911d6c2e0323805eb8
Head:
feat/800-nationwide-datapack-pipeline@d5166a2e62043faa8f8cb35355f0f86dc552d348
Command:
node /Users/aquila/.gemini/config/skills/easysubway-review/scripts/compile-review-payload.mjs
📥 Commits
Reviewing files changed in this pull request between:
- Base:
5734bef7c80dd3681b8b7f911d6c2e0323805eb8 - Head:
d5166a2e62043faa8f8cb35355f0f86dc552d348
📒 Files selected for processing (20)
.gitignorecontracts/documentation/documentation-fragment.jsontools/datapack/collect-gwangju-accessibility.mjstools/datapack/collect-gwangju-accessibility.test.mjstools/datapack/lib/manifest-validation.mjstools/datapack/materialize-gwangju-accessibility.mjstools/datapack/materialize-gwangju-accessibility.test.mjstools/datapack/prepare-nationwide-candidate-run.mjstools/datapack/promote-and-sign.mjstools/datapack/release/candidate-build-spec.jsontools/datapack/release/current-five-region-source-fan-in.jsontools/datapack/release/hash-evidence.jsontools/datapack/release/nationwide-candidate-preparation.jsontools/datapack/release/nationwide-production-canonical-pack.jsontools/datapack/release/nationwide-route-edge-input.jsontools/datapack/release/nationwide-station-line-input.jsontools/datapack/release/release-request.jsontools/datapack/reports/nationwide-coverage-tally.jsontools/datapack/reports/nationwide-requirement-ownership-ledger.jsontools/datapack/source-inventory.json
📜 Review details
|
No description provided. |
7a75638(#800/#801)에서 캐노니컬 팩 id가 capital에서 nationwide로 바뀌고 manifest.activePack이 {id:"nationwide",version:"1"}이 되었지만, 접근성 projection/refresh 체인은 여전히 id === "capital"로 팩을 찾아 release-candidate accessibility 입력 빌드가 "canonical capital pack is missing"으로 실패했다. #833에서 제거한 암묵적 이중 id 허용을 되살리지 않고, 다음 위치에서 manifest.activePack.id로 정확히 한 팩을 고르고 activePack이 없거나 한 팩으로 해석되지 않으면 기존 오류를 그대로 던진다(대체 경로 없음). - apply-accessibility-evidence-to-bundled-pack.mjs: syncCanonicalAccessibilityEvidence(find → 정확히 하나 검사), retainPreAuthorityRideEdges - build-current-capital-station-line-input.mjs: validateCandidate, canonicalStationLines - build-current-capital-route-edge-input.mjs: buildCurrentCapitalRouteEdgeInput, validatedRideEdges RED 테스트의 비교는 candidate 헤더뿐 아니라 evidenceRows의 후보 식별 필드 (candidateId, sourceSetSha256)도 제외하도록 고치고, 제외한 필드가 build spec의 candidateId·sourceSnapshotSetHash와 같은지 따로 검사한다.
* test: add release-pin-drift contract test and ownership registration * [Fix] 원천 인벤토리 변경 뒤 fan-in·소유권 원장 고정값 재생성과 드리프트 검사 * fix(datapack): 전국 권역 캐노니컬 팩에 대한 릴리스 후보 빌드 지원 및 종단간 검증 추가 (#846) * docs(fragment): documentation-fragment.json 동기화 (#846) * revert: 전국 팩 capital/nationwide 이중 id 허용 커밋 되돌림 (#846) This reverts commit 04c8440. 04c84400은 canonical pack 조회에 (id === "capital" || id === "nationwide") 이중 id 허용을 다시 넣었다. 암묵적 이중 id 수용은 #833에서 의도적으로 제거한 동작이며, F1 경로 밖의 overlayReviewedSourcesOnCanonicalRoster와 build-datapack.mjs projectCapitalTopologyIntoCanonicalFixture까지 바꾸고, 추가 테스트 (e)는 main()이 throw하지 않는지만 확인했다. 후속 커밋에서 manifest.activePack.id로 정확히 한 팩을 고르는 명시적 선택으로 대체한다. documentation-fragment.json 충돌은 현재 head 버전을 유지했고, 구현 뒤 refresh 도구로 다시 동기화한다. * test: 전국 activePack 기준 release-candidate accessibility 입력 재현 RED 테스트 (#846) committed candidate-build-spec으로 build-current-release-candidate-accessibility-input main()을 임시 출력 경로에 실행해 네 산출물이 기록되고, station-line·route-edge 입력이 후보 식별 필드(candidateId, sourceSetSha256)를 제외하면 커밋된 current-capital-accessibility-full 입력과 같으며 stationSetSha256도 같은지 확인한다. activePack이 없거나, 없는 id를 가리키거나, 두 팩과 맞으면 팩 선택이 기존 오류로 실패하는지 단위 테스트로 고정한다. 현재 트리는 canonical pack을 id === "capital"로 찾으므로 "canonical capital pack is missing"으로 실패한다(RED). * fix(datapack): canonical pack을 manifest.activePack.id로 정확히 하나만 선택 (#846) 7a75638(#800/#801)에서 캐노니컬 팩 id가 capital에서 nationwide로 바뀌고 manifest.activePack이 {id:"nationwide",version:"1"}이 되었지만, 접근성 projection/refresh 체인은 여전히 id === "capital"로 팩을 찾아 release-candidate accessibility 입력 빌드가 "canonical capital pack is missing"으로 실패했다. #833에서 제거한 암묵적 이중 id 허용을 되살리지 않고, 다음 위치에서 manifest.activePack.id로 정확히 한 팩을 고르고 activePack이 없거나 한 팩으로 해석되지 않으면 기존 오류를 그대로 던진다(대체 경로 없음). - apply-accessibility-evidence-to-bundled-pack.mjs: syncCanonicalAccessibilityEvidence(find → 정확히 하나 검사), retainPreAuthorityRideEdges - build-current-capital-station-line-input.mjs: validateCandidate, canonicalStationLines - build-current-capital-route-edge-input.mjs: buildCurrentCapitalRouteEdgeInput, validatedRideEdges RED 테스트의 비교는 candidate 헤더뿐 아니라 evidenceRows의 후보 식별 필드 (candidateId, sourceSetSha256)도 제외하도록 고치고, 제외한 필드가 build spec의 candidateId·sourceSnapshotSetHash와 같은지 따로 검사한다. * docs(fragment): activePack 선택 수정 뒤 documentation-fragment.json 동기화 (#846)
* test: 정본 팩 운행 요일 boolean·전국 팩 승인 개명 라벨 RED 테스트 (#854) - canonical-pack-service-calendar-flags.test.mjs: 지역 시간표 통합 출력과 커밋된 전국 정본 팩의 serviceCalendars 요일 값이 모두 boolean인지 검사한다. 현재 main은 부산·대구·대전·광주 16개 달력이 0/1 숫자라 실패한다. - nationwide-route-map-official-rename.test.mjs: 자양(뚝섬한강공원)·불암산(당고개) 두 역을 공식 역사 좌표 파일(data.go.kr 15099316)·MOLIT 역 목록·승인 개명 기록과 대조하고, release-candidate 감사 인자로 커밋된 전국 팩을 감사해 BLOCKER·HIGH 0을 요구한다. 현재 main은 ROUTE_MAP_SOURCE_LABEL_MISMATCH HIGH 2건으로 실패한다. 승인 개명 권역은 팩이 선언한 coverageLineOperatorScopes 조합으로만 인정하는 단위 검사도 추가했다. - data-test-ownership.json에 data854 소유자와 두 테스트를 required-pr로 등록한다. * fix: 지역 운행 요일 boolean 출력과 승인 개명 권역을 팩 선언 조합으로 결속 (#854) 결함 1: regional-timetable-integrator가 부산·대구·대전·광주 serviceCalendars 16개의 요일 값을 0/1 숫자로 써서 build-datapack boolFlag가 "serviceCalendars.monday must be a boolean"으로 실패했다(870b574, #814 도입). 요일 값을 같은 의미의 true/false로 쓴다. 검사는 그대로 둔다. 결함 2: audit-route-map의 승인 개명(OFFICIAL_RENAME) 판정이 개명 기록 scopeKey의 권역을 pack.id와 비교했다. 7a75638(#800/#801)에서 정본 팩 id가 capital에서 nationwide로 바뀌어, capital 팩에서는 승인 개명으로 통과하던 같은 두 행(자양(뚝섬한강공원)/7호선, 불암산(당고개)/4호선)이 전국 팩에서 ROUTE_MAP_SOURCE_LABEL_MISMATCH HIGH가 됐다. 권역 결속을 팩 id 대신 팩이 선언한 coverageLineOperatorScopes의 정확한 region:operator:line 조합으로 바꾼다. 선언이 없거나 조합이 다르면 전과 같이 HIGH로 막는다(예외 목록·기준 변경 없음). 기존 단위 테스트 fixture에는 capital:seoul-metro:seoul-4 선언을 추가했다. * data: 공식 생성 명령으로 전국 정본 팩과 연쇄 고정값 재생성 (#854) node tools/datapack/prepare-nationwide-candidate-run.mjs \ --requested-by=data-operator-lead --approved-by=data-release-authority - nationwide-production-canonical-pack.json: 부산·대구·대전·광주 serviceCalendars 16개 x 7요일 = 112개 값이 0/1에서 같은 의미의 true/false로 바뀌었다. 그 밖의 값 차이는 없다(재생성 전 main 입력으로 돌린 결과는 커밋본과 바이트 동일). - candidate-build-spec.json fixtureSha256, hash-evidence.json fixturePath.sha256: a1c21d91… → 9e647a85… - release-request.json buildSpecSha256: 6e7a3947… → b3fe97eb… - nationwide-candidate-preparation.json builderIdentity.gitSha: 생성 시점 HEAD * test: 지역 정차 시각 계약 필드·칸·문 안내 계약 격리 RED 테스트 (#854) 범위 추가(2026-10-01 QA 결정)의 결함 3·4 실패 테스트. - 결함 3: 지역 시간표 통합 출력과 커밋된 전국 정본 팩의 transitStopTimes가 stationId·lineId·arrivalSeconds·departureSeconds를 갖고, lineId가 trip 노선· stationLines와 맞는지 검사한다. 현재 통합 도구는 stopId·arrivalTimeSeconds· departureTimeSeconds를 쓰고 lineId를 빠뜨려 실패한다. - 결함 4: 칸·문 안내 계약 검사(대상 시설 STAIR/ELEVATOR/ESCALATOR/TRANSFER, 칸 1~10, 문 1~4, 방향 ''/UP/DOWN/INNER/OUTER)와 격리 증거 파일을 요구한다. 현재 생성 도구에 계약 검사·증거 파일이 없고 팩에 계약 밖 행이 있어 실패한다. - data-test-ownership.json에 data854 소유로 required-pr 등록. * fix: 지역 정차 시각 계약 필드 출력과 계약 밖 KRIC 칸·문 안내 격리 (#854) 결함 3: regional-timetable-integrator가 transitStopTimes를 stopId· arrivalTimeSeconds·departureTimeSeconds로 쓰고 lineId를 빠뜨렸다. build-datapack 계약 필드 stationId·lineId·arrivalSeconds·departureSeconds로 쓰고 각 정차 행에 trip과 같은 노선 id를 싣는다. 시각 값과 산출 방식은 바꾸지 않는다(#855 범위 제외). regional-timetable-integrator.test.mjs의 옛 필드 참조도 계약 필드로 바꿨다. 결함 4: KRIC 칸·문 안내 확대가 station_car_door_hints 계약 밖 행을 팩에 실었다. 생성 단계에서 carDoorHintContractViolations로 대상 시설(STAIR/ELEVATOR/ESCALATOR/ TRANSFER), 칸 1~10, 문 1~4, 방향(''/UP/DOWN/INNER/OUTER, 빠른하차 importer 어휘)을 검사하고, 위반 행은 팩에 싣지 않고 사유·식별자·원문(dtlLoc)·개수를 tools/datapack/release/nationwide-car-door-hint-quarantine.json에 남긴다. 값을 다른 값으로 바꾸지 않는다. WHEELCHAIR_LIFT 계약 확장은 #856. * data: 결함 3·4 수정 뒤 전국 정본 팩·칸·문 격리 증거·연쇄 고정값 재생성 (#854) node tools/datapack/prepare-nationwide-candidate-run.mjs \ --requested-by=data-operator-lead --approved-by=data-release-authority - nationwide-production-canonical-pack.json - transitStopTimes 244,325행 수 유지. 지역 202,495행의 필드명만 계약 필드로 바뀌고 lineId가 붙었다. 역·순번·시각 값 차이 0건. - stationCarDoorHints 435 → 49행, minimumTableRows.station_car_door_hints 435 → 49. KRIC 파생 404행 중 386행 격리(방향 BOTH 386, 그중 WHEELCHAIR_LIFT 8·문 번호 5 이상 2). - nationwide-car-door-hint-quarantine.json(신규): 격리 386행의 id·역·노선·방향·시설· 칸·문·원문 dtlLoc·gubun·providerRecordHash·사유와 사유별 개수. - fixtureSha256·hash-evidence fixturePath.sha256: 9e647a85… → 064fa48a… - release-request buildSpecSha256: b3fe97eb… → 418a7756… - nationwide-candidate-preparation builderIdentity.gitSha: 생성 시점 HEAD - prepare-nationwide-candidate-run.test.mjs: 칸·문 행 수 기대값을 49와 격리 합계(49 + 386 = 435)로 바꿨다.




Related issue
Closes #800
Summary
nationwide-production-canonical-pack.json에 정규 반영하였습니다.Changes
tools/datapack/prepare-nationwide-candidate-run.mjs: 국토교통부 환승 경로 실측 데이터(MOLIT EUC-KR CSV) 파서 연동 및 부산/대구 13개 환승역 26개 무단차 보행 엣지(실제 한글 길안내 단계, 거리, 소요시간) 생성 로직 추가tools/datapack/collect-gwangju-accessibility.mjs,materialize-gwangju-accessibility.mjs: 휠체어 리프트 0건 허용으로 광주 56건 편의시설 수집 파이프라인 언블록tools/datapack/promote-and-sign.mjs: 전국 데이터팩 승격 및 서명 도구 정비tools/datapack/release/nationwide-production-canonical-pack.json: 5개 권역 총 963건 편의시설 및 26개 환승 보행 엣지 반영contracts/documentation/documentation-fragment.json: 최신 Git HEAD 커밋에 맞추어 동기화 완료Scope
Included
Excluded
Ownership / dependencies
Contract & Compatibility
accessibility_facilities,route_graph_topology스키마 100% 준수Version impact
Product gate impact
Provenance impact
Version decision
Verification
node --test tools/datapack/collect-gwangju-accessibility.test.mjs tools/datapack/materialize-gwangju-accessibility.test.mjs(10/10 PASS)node --test tools/datapack/*accessibility*.test.mjs(313/313 PASS)tools/ci/check-documentation-fragment-sync.mjs)Not run
Risk
Rollout / Recovery
Review focus
operational_status: 'UNKNOWN'Fail-Closed 준수 여부Checklist
Summary by CodeRabbit