Repository navigation
[Chore] 노선 topology 신선도를 컷오버 이후 P7D 창으로 전환하고 Hub 계약 pin 상향 - #904
Conversation
- datapack-freshness-sla route_graph_topology P1D -> P7D (Hub 계약과 바이트 동일) - lib/topology-freshness-cutover: 컷오버 2026-10-03T00:00:00.000Z 이전 수집분은 P1D, 이후 수집분은 P7D를 정확값으로 쓰는 단일 규칙 - 정책 유도(deriveFreshnessExpiresAt)가 컷오버 이전 topology basis에 P1D를 적용해 커밋된 과거 스냅샷·원장 행이 그대로 유효하다(연장 없음) - topology 수집기 5개와 검증기(부산·인천 station-info·대전·current topology admission·수도권 재검증)가 같은 규칙을 쓴다. 대구 시간표 등 비topology 수집 창(+1D)은 그대로다 - 수도권·대구 등록기의 주기 고정값과 수도권 candidate freshness 메타데이터를 P7D로 - stage-contracts가 고정 Hub 번들의 topology 주기가 lib와 다르면 막는다 Refs #862 Refs #870
contracts.lock.json의 url·sha256과 stage-contracts의 bundle URL·sha256을 AquilaXk/easysubway#3024 병합 커밋(506306c6) 번들로 올렸다. release가 판정에 쓰는 고정 Hub 신선도 정책의 route_graph_topology 주기(P7D)가 data 사본·lib 컷오버 규칙과 다시 맞는다. Refs #862 Refs #870
|
Important
This repository does not receive automatic reviews because it has fewer than 10 stars. ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Advanced Run ID:
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 |
AquilaXk
left a comment
There was a problem hiding this comment.
Actionable comments posted: 1
🎯 Linked issue & acceptance criteria audit
- Linked issue: #870 Data pipeline operating model transition (parent issue, data repo)
- Goal summary: Move topology freshness to P7D via an exact cutover; never extend old evidence.
- Acceptance criteria verified: 4/4
| ID | Acceptance criterion | Status | Evidence |
|---|---|---|---|
| C1 | Topology cadence moves from P1D to P7D only for route_graph_topology | PASS | release/product-gates/datapack-freshness-sla.json:184 and tools/datapack/freshness-policy.mjs:96 |
| C2 | Cutover constant is exact: before is +1D, at or after is +7D, both checked exactly | PASS | tools/datapack/lib/topology-freshness-cutover.mjs:23 and tools/datapack/lib/topology-freshness-cutover.mjs:27 |
| C3 | Collectors, validators and registrars share the one cutover rule | PASS | tools/datapack/collect-busan-route-topology.mjs:330 and tools/datapack/collect-incheon-station-info.mjs:533 |
| C4 | Pinned hub bundle matches the lib cadence and the pin matches the hub merge | PASS | tools/datapack/stage-contracts.mjs:106 and contracts.lock.json:4 |
🛡️ Adversarial audit evidence
- Falsifiability verified: Yes (Probes on the cutover lib killed less-than, times and strict-equal mutants;
manual <= and 6D mutants turned the cutover tests RED) - Hollow assertions detected: 0
- Production backdoors detected: 0
- Ground-truth sources verified:
git grep of 86400000 and 24h constants: remaining hits are non-topology classesHub merge 506306c6 bundle recomputed SHA-256 equals 13c9bd12 in contracts.lock.jsonQA decision recorded in data#870 body (cutover 2026-10-03T00:00:00.000Z, exact +1D/+7D)
🤖 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/build-datapack.mjs:1991-1991`
Could node tools/repo/refresh-documentation-fragment.mjs --worktree be run and the
regenerated fragment committed, then --check re-run to confirm IN SYNC, before
merge?
---
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 904 at head 465ef32
Base:
main@e89d9939137a0012d8888c18c0091e7492120d97
Head:
chore/topology-freshness-p7d-870@465ef3265361c6113427aede4a4d4ca3616f8f76
Command:
aquila-review discovery via post-review.mjs on AquilaXk/easysubway-data PR 904
📥 Commits
Reviewing files changed in this pull request between:
- Base:
e89d9939137a0012d8888c18c0091e7492120d97 - Head:
465ef3265361c6113427aede4a4d4ca3616f8f76
📒 Files selected for processing (27)
contracts.lock.jsonrelease/product-gates/datapack-freshness-sla.jsontools/datapack/build-datapack.mjstools/datapack/collect-busan-route-topology.mjstools/datapack/collect-busan-route-topology.test.mjstools/datapack/collect-capital-route-topology.mjstools/datapack/collect-capital-route-topology.test.mjstools/datapack/collect-daegu-datapack-sources.mjstools/datapack/collect-daegu-datapack-sources.test.mjstools/datapack/collect-gwangju-route-topology.mjstools/datapack/collect-gwangju-route-topology.test.mjstools/datapack/collect-incheon-station-info.mjstools/datapack/collect-incheon-station-info.test.mjstools/datapack/freshness-policy.mjstools/datapack/freshness-policy.test.mjstools/datapack/lib/route-map-admission-freshness.mjstools/datapack/lib/route-map-admission-freshness.test.mjstools/datapack/lib/topology-freshness-cutover.mjstools/datapack/materialize-daejeon-route-topology.mjstools/datapack/materialize-daejeon-route-topology.test.mjstools/datapack/materialize-incheon-station-info.mjstools/datapack/register-current-capital-route-topology.mjstools/datapack/register-current-capital-route-topology.test.mjstools/datapack/register-daegu-datapack-sources.mjstools/datapack/source-candidates.jsontools/datapack/stage-contracts.mjstools/datapack/stage-contracts.test.mjs
📜 Review details
|
No description provided. |
|
* [Data] 대경선 코레일 광역전철 시각표 topology 동일 원본 재확인 등록(P7D) - 공식 첨부(sha c28dcd…)를 2026-10-03T00:05Z에 재수집해 원본 재게시 없이 재확인 원장 행으로 등록한다(#911 경로). - topology head를 5d68004f…에서 a2fee5ce…로 잇고 freshUntil은 2026-10-10T00:05Z다. Refs #903 #862 * [Data] 대경선 계획 시각표를 재확인한 topology head에 다시 결속해 등록 - 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 * [Feat] 코레일 6개 노선 projection·station-lines 스냅샷을 공용 시간표 적재기 입력으로 연결하는 lib - 수도권 등록기가 같은 관측에서 코레일 projection snapshot을 만들고 korailScheduleAdmissionEvidence에 결속한다 (재확인 이력 append-only, 수도권과 같은 관측 시각). - 코레일 provider: 휴일→WEEKEND_HOLIDAY, alias 근거 동반, 급행은 trip 단위 고정 집합(경춘 5·수인분당 22·경의중앙 28). - station-lines provider: 등록 파생 스냅샷의 내용 해시·inventory 결속을 다시 확인하고 trip을 그대로 넘긴다. Refs #903 #862 * [Data] KRIC 파일 900 재수집: 수도권 동일 원본 재확인과 코레일 6개 노선 projection 첫 등록 - 2026-10-03T00:11Z 재수집(원본 sha 218f76dd…). 수도권 snapshot은 재사용하고 재확인 이력만 append한다. - 같은 관측에서 코레일 projection(59,346행, snapshot c186585e…)을 korailScheduleAdmissionEvidence로 등록한다. Refs #903 #862 * [Chore] Hub data 계약 pin을 905ae116(#3025, planned_timetable station-lines 포함)으로 상향 Refs #903 * [Data] KRIC 역별 시간표 5개 노선(kric-subway-timetable-station-lines) 첫 등록과 필수 원천 지정 - 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 * [Feat] 전국 후보 prepare에 코레일 6개 노선·KRIC 역별 5개 노선·대경선 시간표 적재 연결 - 코레일 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 * [Test] e2e 후보 건수를 노선 추가분만큼 갱신하고 입력 선택 17개로 고정 - trip 19,973→26,240, 정차 561,983→671,914, route 26→39, 달력 24→30, 달력 예외 132→200. 증가분은 코레일 6개 노선·KRIC 역별 5개 노선·대경선뿐이고 기존 노선 건수는 같다. Refs #903 * [Data] 전국 후보 재생성(seq125, 후보 시계 2026-10-03T00:17:16.988Z): 전 노선 시간표 적재 - 노선 36개 전부 trip 1건 이상(이전 12개 노선 0건). trip 26,240·정차 671,914. - 팩 JSON 59,147,366B, 외부 시간표 파일 gzip 5,641,204B(펼침 58,866,238B). Refs #903 #862 * [Test] 새 등록 데이터에 맞춰 저장소 상태 의존 테스트를 갱신 - 수도권 외부 시간표 단언은 같은 원천의 코레일 섹션과 구분하도록 snapshot으로 고른다. - 대경선 재확인 head의 신선도 값과 이전 head lineage를 반영한다. - car-door 등록 테스트의 'inventory·governance 끝' 위치 가정을 '하나만, 기존이면 제자리'로 바꾼다. - station-lines 등록·게시 테스트는 저장소 사본을 등록 전 상태로 되돌려 첫 등록부터 시험한다. Refs #903 * [Data] station-lines·코레일 evidence 등록에 따른 전국 coverage tally 재생성 Refs #903 * [Data] coverage tally 재생성 뒤 전국 후보 재결속(seq125, 후보 시계 2026-10-03T00:25:30.412Z) - 팩·외부 시간표 파일 바이트는 같고 fan-in·소유권 원장·spec·request·hash 결속만 갱신된다. Refs #903 #862 * [Data] 수도권·인천 현행 topology 입력 재수집(2026-10-03) current-capital-topology-refresh 절차와 같은 공식 수집기 출력 4개다(ITX admission은 10-11까지 유효해 재수집하지 않는다). Refs #903 #862 * [Data] 수도권 현행 topology admission 활성화(2026-10-03 수집 입력) activate-current-source-set --topology-source-admission 결과(inventory·canonical pack·재검증 증거)다. Refs #903 #862 * [Data] 수도권 topology 원본 OCI 게시·원장 등록(capital-route-topology-20261003) run-current-capital-route-topology-registration 결과다. Refs #903 #862 * [Data] 광주 topology 재수집·OCI 게시·원장 등록(2026-10-03, 원본 sha 동일) register-gwangju-route-topology publish-register 결과다. 같은 도구가 topology에 묶인 접근성·노선도 위치 snapshot 결속을 새 topology로 다시 맞췄다. Refs #903 #862 * [Data] 부산 topology 재수집·OCI 게시·원장 등록(2026-10-03, 원본 sha 동일) register-busan-route-topology publish-register 결과다. Refs #903 #862 * [Data] 대전 역간 거리·운임 topology 재수집·OCI 게시·원장 등록(2026-10-03, 원본 sha 동일) register-daejeon-route-topology publish-register 결과다. 같은 도구가 topology에 묶인 접근성·노선도 위치 snapshot 결속을 다시 맞췄다. Refs #903 #862 * [Data] 대구 1·2·3호선 topology·시간표 재수집·OCI 게시·원장 등록(2026-10-03, 원본 sha 9개 모두 동일) register-daegu-datapack-sources publish-register 결과다. data.go.kr 파일은 #890 미해결로 포털 다운로드 버튼과 같은 경로(임시 방식, 키 없음)로 받았다. Refs #903 #862 #890 * [Data] 대전·광주 접근성 재수집·OCI 게시·원장 등록(2026-10-03, 원본 sha 동일) topology 재등록이 접근성 결속을 새 topology 계보로 바꿔서, #892와 같이 접근성을 다시 수집해 원장 행을 맞췄다. data.go.kr 파일은 #890 미해결로 임시 포털 경로로 받았다. Refs #903 #862 #890 * [Data] 재수집으로 대체된 접근성 중간 snapshot 제거 topology 재등록이 만든 접근성 중간 snapshot 2개는 같은 브랜치의 재수집 등록으로 대체돼 inventory·원장 어디에서도 참조되지 않는다. Refs #903 * [Data] 부산 topology 재등록에 맞춰 부산 환승 지표 재결속 build-busan-transfer-metrics 결과다. 지표 12개와 제외 행 6개는 같고 원천 식별만 새 topology head로 바뀐다. Refs #903 #862 * [Data] 수도권 정본 팩 재결속에 맞춰 서울 실측 환승 지표 재생성 build-seoul-measured-transfer-metrics 결과다. 지표 263개는 같고 정본 팩 sha만 8102f1f6…에서 83e11161…로 바뀐다. Refs #903 #862 * [Data] 서울 환승 거리·시간 admission을 새 수도권 정본 팩에 재결속 rebind-current-seoul-transfer-source-admission(#893) 결과다. 잠긴 원본은 OCI에서 GET만 했다(PUT 없음). 원천 값은 같고 정본 팩 결속만 바뀐다. Refs #903 #862 * [Data] topology 7개 재등록 뒤 전국 후보 재결속(seq125, 후보 시계 2026-10-03T00:40:43.059Z) 시간표 내용은 같고 인천 1·2호선 snapshot 식별(20261003)과 fan-in·spec·request·hash 결속만 바뀐다. Refs #903 #862 * [Fix] 광주 시간표 materializer의 topology evidence 창을 #904 컷오버 규칙으로 검사 컷오버 이후 수집한 광주 topology(P7D)를 24시간 고정값으로 검사해 보관본 등록 경로가 실패했다(register-retained-kric-timetable 테스트가 실데이터로 RED). topologySnapshotFreshnessMillis로 컷오버 전 P1D, 후 P7D를 정확값으로 검사한다. Refs #903 #904 * [Test] 컷오버 이후 첫 topology 데이터에 맞춰 저장소 상태 의존 테스트 갱신 - 공용 materialize fixture는 대전 topology 창을 커밋된 evidence 창이 아니라 수집 시각 기준 컷오버 규칙으로 유도한다. - 인천 station-info 수집기·후보 입력 만료 테스트의 24시간 고정값을 컷오버 규칙으로 바꾼다. - 인천 시간표 만료 테스트는 후보 시계를 옮기지 않고 수집 시각을 옮겨 다른 입력의 만료와 섞이지 않게 한다. - 후보 입력 pin을 10-03 원장 head로 갱신한다. - 코레일 projection 결정성 단언을 독립 해시 계산으로 바꾼다(anti-cheat ANTI-CIRCULAR-ORACLE). Refs #903 * [Docs] source-inventory·governance blob 변경에 맞춰 문서 파편 갱신 Refs #903 * [Test] 코레일 급행 고정 집합이 기본 경로 binding과 노선 보고서에 붙는지 단언 리뷰 F1: 기본 allowance 경로를 타는 테스트가 없어 고정 집합 부착 분기를 지우는 변이가 살아남았다. 기본 경로에서 경춘 5·수인분당 22·경의중앙 28 trip 고정 집합이 붙고 나머지 3개 노선에는 붙지 않음을 단언하고, e2e에서 노선 보고서 pinnedQuarantine을 노선별로 단언한다. 부착 분기를 false로 바꾸면 두 테스트가 모두 실패한다. Refs #903 * [Fix] station-lines·코레일 격리 행의 운행일을 명시 값만 받도록 엄격화 리뷰 F2: 격리 행은 평일이 아닌 값을 모두 주말·휴일로 기록했다. station-lines는 dayCd 8=평일·9=주말·휴일, 코레일은 요일구분 평일·휴일만 받고 그 밖의 값은 SERVICE_DAY로 실패한다. 현재 데이터의 격리 행·보고서·팩 바이트는 바뀌지 않는다. Refs #903
… 검사 (#914) * [Fix] 광주 보관 KRIC 시간표 갱신 판정을 만료 전 SLA 경보 창(PT6H)부터 DUE로 만료 시각에 도달해야 DUE가 되어 보관본 head가 만료되기 전에 갱신할 수 없었다. SLA monitoring.alertBeforePackExpiry(수도권 topology 갱신 판정과 같은 기준)를 읽어 만료 PT6H 전부터 DUE로 판정하고 refreshDueAt을 함께 남긴다. 만료 시각 자체는 바꾸지 않는다. 경보 창이 없거나 형식이 틀리면 판정하지 않는다. Refs #903 Refs #862 Refs #913 * [Fix] 대구 시간표 materializer의 topology evidence 창을 #904 컷오버 규칙으로 검사 topology evidence를 24시간 고정값으로 검사해 컷오버 이후 수집한 대구 topology(P7D)를 거부했다. topologySnapshotFreshnessMillis로 컷오버 전 P1D, 후 P7D를 정확값으로 검사하고 시각표 수집 창(+1D)은 그대로 둔다. Refs #903 Refs #862 Refs #913


Related issue
Refs #862
Refs #870
Summary
route_graph_topology)의 신선도 창이 1일입니다. 대상은 수도권 topology, Korail 광역 시간표 파일, 광주·부산 topology, 대전 역간거리, 대구 1~3호선 topology, 인천 역정보입니다. 매일 다시 수집·등록하지 않으면 팩이 만료되고, 첫 전국 팩(releaseSequence 124)도 수집 하루 뒤인 2026-10-03T06:03:36Z에 만료됩니다. 1일 창은 정책 JSON에만 있지 않았습니다. 수집기 5개가 스냅샷freshUntil = 수집 + 1일을 하드코딩했고, 검증기 6곳과 등록기 2개도 1일을 정확값으로 검사했습니다. 팩expiresAt은 이 스냅샷freshUntil들의 최솟값입니다(build-datapack.mjs1859-1876). 그래서 정책만 바꾸면 팩 만료는 그대로입니다.2026-10-03T00:00:00.000Z) 이후 수집분은 7일 창, 이전 수집분은 원래 1일 창을 정확값으로 가집니다. 이미 만들어진 증거는 연장하지 않습니다. 고정 Hub 계약도 [Chore] 노선 topology 신선도 정책을 P1D에서 P7D 만료 안전망으로 전환 easysubway#3024 병합 커밋으로 올렸습니다. 재검증이 일주일 내내 실패하면SOURCE_SNAPSHOT_EXPIRED로 막히고, stale 데이터를 조용히 제공하지 않습니다. 일일 재확인(scheduledPipeline.cadenceP1D)은 그대로이며, 자동화는 #870에서 다룹니다.Changes
release/product-gates/datapack-freshness-sla.json:route_graph_topology.reverificationCadence를 P1D에서 P7D로 바꿨습니다. Hub506306c6과 바이트가 같습니다.tools/datapack/lib/topology-freshness-cutover.mjs:topologySnapshotFreshUntil/topologySnapshotFreshnessMillis가 수집 시각이 컷오버보다 이르면 +1D, 같거나 늦으면 +7D를 돌려줍니다.freshness-policy.mjs의deriveFreshnessExpiresAt:route_graph_topology에서 basis가 컷오버 이전이면 P1D를 적용합니다. 그래서 커밋된 과거 스냅샷·원장 행이 같은 값으로 유도되고, 등록기·governance·후보 준비가 같은 규칙을 씁니다.freshUntil):collect-capital-route-topology,collect-gwangju-route-topology,collect-busan-route-topology,collect-incheon-station-info,collect-daegu-datapack-sources(topology만. 대구 시간표의 수집 창 +1D는 유지).collect-busan-route-topologyadmissioncollect-incheon-station-infovalidatematerialize-incheon-station-infomaterialize-daejeon-route-topologylib/route-map-admission-freshness의assertCurrentTopologyAdmissionFreshnessbuild-datapack의 수도권 topology 재검증(수도권 수집기의FRESHNESS_MILLISexport 제거)register-current-capital-route-topology,register-daegu-datapack-sources가 P1D 고정값 대신TOPOLOGY_REVERIFICATION_CADENCE를 씁니다.source-candidates.json의 수도권registrationMetadata.freshness.reverificationCadence도 P7D로 바꿨습니다.stage-contracts.mjs:contracts.lock.json과 stage 상수의 URL·sha256을506306c6번들(13c9bd12…fdb100c)로 올렸습니다.Scope
Included
Excluded
release/source-snapshots.json)과 inventory의 과거 행(updateFrequency"P1D" 포함). append-only 이력이며 다음 등록에서 새 값으로 기록됩니다.Ownership / dependencies
506306c666ecc23d77c254a99d990fa23e3e8261)Contract & Compatibility
route_graph_topology주기만 P7D로 바뀝니다. 외부 API를 새로 쓰지 않으므로 API 카탈로그 대조는 해당 없습니다.freshUntil, 원장freshnessExpiresAt, inventory admissionfreshUntil은 컷오버 이후 수집분부터 +7D가 됩니다. 커밋된 바이트는 바뀌지 않습니다.2026-10-03T00:00:00.000Z고정입니다. 커밋된 topology 스냅샷은 모두 2026-10-02 이전 수집분입니다.Version impact
Product gate impact
Provenance impact
source-candidates.json수도권 등록 메타데이터의 갱신 주기만 바뀝니다. 제공처·라이선스·적용 범위는 바뀌지 않습니다.Version decision
63737fd7→506306c6datapack-freshness-sla.jsontopology 주기 P7DVerification
4193151f0을 구현보다 먼저 두고 RED를 확인했습니다. 수집기 5개 테스트는actual '2026-10-04T00:00:00.000Z',expected '2026-10-10T00:00:00.000Z'로 실패했습니다. 대전 materializer는topology evidence freshness contract is invalid, current topology admission 경계 테스트는 fail 1, stage-contracts는Missing expected rejection., 정책 유도 테스트는 lib 모듈 부재로 실패했습니다. 구현 커밋2d5fe2731뒤에는 모두 GREEN입니다node --test --test-concurrency=6로 돌려 1697 pass / 0 fail입니다.node --test tools/ci/*.test.mjs는 225/225 pass입니다.guard-datapack-anti-cheatPASS, 문서 파편 preflight OK·IN SYNC입니다. pin 상향 뒤에는node tools/datapack/stage-contracts.mjs가 OK이고, CI와 같은 인자로 돌린validate-source-inventory.mjs가 exit 0입니다. stage된 신선도 정책은 data 사본과cmp결과 같습니다.release-pin-drift·stage-contracts·datapack-release-workflow테스트는 43/43 pass입니다465ef3265에서 required checkData contracts가 pass입니다. 하위 job mobile-v19와 shard 1~4가 모두 pass이고, mobile-v19의Validate source inventory against pinned Hub contracts스텝이 새 pin(506306c6)으로 통과했습니다. run: https://github.com/AquilaXk/easysubway-data/actions/runs/37029320970 . CodeQL·Analyze·CodeRabbit status도 pass입니다run-rc-full)에서 팩expiresAt이 min(topology 수집 + 7D, KRIC 전국 시간표 파일 관측 + 7D, ITX 계약 freshUntil, …)인지 실측합니다. 아래 Not run을 참고하세요팩 expiresAt 검증 방식
build-datapack의 min 계산(applyCandidateNetworkEdgeProjectionInternal)은 커밋된 전국 build spec·inventory·원장·스냅샷 sha 결속 전체를 입력으로 받습니다. 컷오버 이후 스냅샷으로 종단 실행하려면 결속 fixture 세트를 새로 만들어야 합니다. 그래서 min에 들어가는 topology 입력을 하나씩 경계값으로 고정했습니다.build-datapack재검증assertCurrentTopologyAdmissionFreshnessfreshnessExpiresAt = retrievedAt + 7D,updateFrequencyP7D, governance POLICY_MISSING 없음종단 확인은 다음 실제 발행에서 합니다.
Not run
run-rc-full발행에서 팩expiresAt실측expiresAt을 #862에 기록합니다.Risk
freshness mismatch,freshness contract is invalid,route_graph_topology reverificationCadence is invalid같은 명시적 오류로 실패합니다.Rollout / Recovery
collect-capital-route-topology.mjs --download,collect-incheon-station-info.mjs --download→activate-current-source-set.mjs --topology-source-admission→run-current-capital-route-topology-registration.mjscollect-gwangju-route-topology.mjs→register-gwangju-route-topology.mjs publish-registercollect-busan-route-topology.mjs --scope-html→register-busan-route-topology.mjs publish-registercollect-daejeon-route-topology.mjs→register-daejeon-route-topology.mjs publish-registerregister-daegu-datapack-sources.mjs publish-registerfreshnessExpiresAt= 수집 + 7DValidate source inventory통과expiresAt= min(…) 실측63737fd7로 되돌립니다. 그 경우 7D로 등록된 행은 P1D 정책에서 거부되므로 topology를 다시 등록해야 합니다.Review focus
freshness-policy.mjs의 컷오버 분기가route_graph_topology에만 적용되고, 다른 클래스의 유도값은 바뀌지 않는지(freshness-policy.test.mjs)stage-contracts의 새 검사Checklist