Skip to content

[Chore] 노선 topology 신선도를 컷오버 이후 P7D 창으로 전환하고 Hub 계약 pin 상향 - #904

Merged
AquilaXk merged 4 commits into
mainfrom
chore/topology-freshness-p7d-870
Oct 2, 2026
Merged

AquilaXk merged 4 commits into
mainfrom
chore/topology-freshness-p7d-870

Conversation

@AquilaXk

@AquilaXk AquilaXk commented Oct 2, 2026 •

Copy link
Copy Markdown
Owner

Related issue

Refs #862
Refs #870

Summary

  • Problem: 노선 topology 원천 9개(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.mjs 1859-1876). 그래서 정책만 바꾸면 팩 만료는 그대로입니다.
  • Outcome: QA 승인(2026-10-02)에 따라 topology를 이벤트 기반 갱신과 P7D 만료 안전망으로 바꿨습니다. 컷오버(2026-10-03T00:00:00.000Z) 이후 수집분은 7일 창, 이전 수집분은 원래 1일 창을 정확값으로 가집니다. 이미 만들어진 증거는 연장하지 않습니다. 고정 Hub 계약도 [Chore] 노선 topology 신선도 정책을 P1D에서 P7D 만료 안전망으로 전환 easysubway#3024 병합 커밋으로 올렸습니다. 재검증이 일주일 내내 실패하면 SOURCE_SNAPSHOT_EXPIRED로 막히고, stale 데이터를 조용히 제공하지 않습니다. 일일 재확인(scheduledPipeline.cadence P1D)은 그대로이며, 자동화는 #870에서 다룹니다.

Changes

  • release/product-gates/datapack-freshness-sla.json: route_graph_topology.reverificationCadence를 P1D에서 P7D로 바꿨습니다. Hub 506306c6과 바이트가 같습니다.
  • 신규 tools/datapack/lib/topology-freshness-cutover.mjs:
    • 컷오버 시각, 기존 주기(P1D), 새 주기(P7D)를 상수로 둡니다.
    • topologySnapshotFreshUntil/topologySnapshotFreshnessMillis가 수집 시각이 컷오버보다 이르면 +1D, 같거나 늦으면 +7D를 돌려줍니다.
  • freshness-policy.mjs의 deriveFreshnessExpiresAt: route_graph_topology에서 basis가 컷오버 이전이면 P1D를 적용합니다. 그래서 커밋된 과거 스냅샷·원장 행이 같은 값으로 유도되고, 등록기·governance·후보 준비가 같은 규칙을 씁니다.
  • 수집기(topology 스냅샷 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-topology admission
    • collect-incheon-station-info validate
    • materialize-incheon-station-info
    • materialize-daejeon-route-topology
    • lib/route-map-admission-freshness의 assertCurrentTopologyAdmissionFreshness
    • build-datapack의 수도권 topology 재검증(수도권 수집기의 FRESHNESS_MILLIS export 제거)
  • 등록기: register-current-capital-route-topology, register-daegu-datapack-sources가 P1D 고정값 대신 TOPOLOGY_REVERIFICATION_CADENCE를 씁니다. source-candidates.json의 수도권 registrationMetadata.freshness.reverificationCadence도 P7D로 바꿨습니다.
  • stage-contracts.mjs:
    • 고정 Hub 번들의 topology 주기가 lib(P7D)와 다르면 stage 단계에서 막습니다. 수집기는 7일 창을 만드는데 release 판정 정책이 1일이면 원장 저장값과 유도값이 갈라지기 때문입니다.
    • contracts.lock.json과 stage 상수의 URL·sha256을 506306c6 번들(13c9bd12…fdb100c)로 올렸습니다.
  • 테스트(먼저 추가해 RED 확인): 위 수집기·검증기·정책 유도·수도권 등록기 원장 행·stage 검사에 컷오버 경계값(컷오버 −1ms → +1D, 컷오버 → +7D) 테스트를 넣었습니다.

Scope

Included

  • topology 신선도 주기 변경(P7D), 컷오버 규칙, topology 수집기·검증기·등록기 정합, 고정 Hub 계약 pin 상향, 경계값 테스트

Excluded

  • topology 9원천 재수집·재등록, 새 전국 후보와 발행. 데이터 운영 작업이라 도구 PR과 분리합니다([Refactor] 데이터 파이프라인 운영 방식 전환: 자동 갱신·개발/발행 게이트 분리·생성 산출물 축소 #870 원칙). 명령은 아래 Rollout에 적었습니다.
  • 일일 재확인에서 내용이 바뀌었을 때만 발행하는 자동화. #870에서 다룹니다.
  • 비topology 클래스(접근성 P90D, 시간표 P30D, KRIC 파일 P7D 등)와 지역 접근성·시간표 수집기의 +1D 수집 창. QA 승인 범위 밖입니다.
  • 원장(release/source-snapshots.json)과 inventory의 과거 행(updateFrequency "P1D" 포함). append-only 이력이며 다음 등록에서 새 값으로 기록됩니다.

Ownership / dependencies

Contract & Compatibility

  • Source / API / schema contract: 원천 API와 스키마는 바뀌지 않습니다. 신선도 계약에서 route_graph_topology 주기만 P7D로 바뀝니다. 외부 API를 새로 쓰지 않으므로 API 카탈로그 대조는 해당 없습니다.
  • Artifact / provenance identity: 스냅샷 freshUntil, 원장 freshnessExpiresAt, inventory admission freshUntil은 컷오버 이후 수집분부터 +7D가 됩니다. 커밋된 바이트는 바뀌지 않습니다.
  • Backward compatibility: 컷오버 이전 수집분은 +1D만 정확히 허용하고, +7D로 늘린 과거 증거는 거부합니다. 컷오버 이후 수집분은 +7D만 허용하고 +1D는 거부합니다.
  • Migration or cutover: 컷오버는 2026-10-03T00:00:00.000Z 고정입니다. 커밋된 topology 스냅샷은 모두 2026-10-02 이전 수집분입니다.

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에 추가하지 않습니다.

source-candidates.json 수도권 등록 메타데이터의 갱신 주기만 바뀝니다. 제공처·라이선스·적용 범위는 바뀌지 않습니다.

Version decision

  • datapack version: 변경 없음. 다음 등록·발행부터 새 창이 적용됩니다
  • data contract: Hub data-contracts v1.0.0 pin 63737fd7 → 506306c6
  • route-map artifact / product gate: datapack-freshness-sla.json topology 주기 P7D
  • promotion request id: 해당 없음(발행 없음)

Verification

Check Result / Evidence
Focused RED → GREEN 테스트 커밋 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입니다
Affected integration topology·신선도·등록기·후보·build-datapack을 참조하는 테스트 106파일을 node --test --test-concurrency=6로 돌려 1697 pass / 0 fail입니다. node --test tools/ci/*.test.mjs는 225/225 pass입니다. guard-datapack-anti-cheat PASS, 문서 파편 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입니다
Required CI head 465ef3265에서 required check Data 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입니다
Live provider / release 이 PR에서는 실행하지 않습니다. 다음 실제 발행(run-rc-full)에서 팩 expiresAt이 min(topology 수집 + 7D, KRIC 전국 시간표 파일 관측 + 7D, ITX 계약 freshUntil, …)인지 실측합니다. 아래 Not run을 참고하세요
Security / data integrity 창 연장은 컷오버 이후 수집분에만 적용되고, 두 규칙 모두 정확값으로 검사합니다. 과거 증거를 늘리는 경로는 없습니다. 시크릿·권한 경계 변경은 없습니다

팩 expiresAt 검증 방식

build-datapack의 min 계산(applyCandidateNetworkEdgeProjectionInternal)은 커밋된 전국 build spec·inventory·원장·스냅샷 sha 결속 전체를 입력으로 받습니다. 컷오버 이후 스냅샷으로 종단 실행하려면 결속 fixture 세트를 새로 만들어야 합니다. 그래서 min에 들어가는 topology 입력을 하나씩 경계값으로 고정했습니다.

  • 수도권 topology admission: 수집기, build-datapack 재검증
  • 수도권 노선별 admission: assertCurrentTopologyAdmissionFreshness
  • 인천 admission: 수집기·검증기, 후보 준비의 정책 유도
  • 원장 행: 수도권 등록기에서 freshnessExpiresAt = retrievedAt + 7D, updateFrequency P7D, governance POLICY_MISSING 없음

종단 확인은 다음 실제 발행에서 합니다.

Not run

Risk

  • Level: High
  • Main risk: 수집기·검증기·등록기·정책 유도 중 한 곳이라도 규칙이 어긋나면 등록이나 후보 빌드가 실패합니다. 같은 lib 함수 하나를 쓰도록 모았고, stage 단계에서 고정 Hub 주기 불일치를 막습니다.
  • Failure behavior: 규칙 불일치는 freshness mismatch, freshness contract is invalid, route_graph_topology reverificationCadence is invalid 같은 명시적 오류로 실패합니다.
  • Candidate / admission / publication state on failure: 등록 트랜잭션은 출력 전에 실패하고, 후보와 발행 상태는 바뀌지 않습니다.
  • Fallback or degraded-success path introduced: No

Rollout / Recovery

  • Rollout or promotion: 이 PR이 병합된 뒤 topology 9원천을 새로 수집·등록합니다(#892와 같은 공식 절차). 기존 원장 행은 연장되지 않습니다.
    • 수도권·인천 역정보: 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.mjs
    • 광주: collect-gwangju-route-topology.mjs → register-gwangju-route-topology.mjs publish-register
    • 부산: collect-busan-route-topology.mjs --scope-html → register-busan-route-topology.mjs publish-register
    • 대전: collect-daejeon-route-topology.mjs → register-daejeon-route-topology.mjs publish-register
    • 대구: register-daegu-datapack-sources.mjs publish-register
    • Korail 파일: 재파싱·등록
    • 그다음 전국 후보 재생성과 발행
  • Monitoring / success signal:
    • 새 원장 topology 행 freshnessExpiresAt = 수집 + 7D
    • Data Pack Release Validate source inventory 통과
    • 발행 manifest expiresAt = min(…) 실측
  • Rollback or recovery: 이 PR과 #3024를 revert하고 pin을 63737fd7로 되돌립니다. 그 경우 7D로 등록된 행은 P1D 정책에서 거부되므로 topology를 다시 등록해야 합니다.
  • Existing artifact / schema compatibility after rollback: 컷오버 이전 아티팩트는 영향이 없습니다.

Review focus

  • freshness-policy.mjs의 컷오버 분기가 route_graph_topology에만 적용되고, 다른 클래스의 유도값은 바뀌지 않는지(freshness-policy.test.mjs)
  • 수집기 생성 규칙과 검증기 정확값 검사가 같은 lib 함수를 쓰는지
  • 대구 수집기에서 topology만 바뀌고 시간표 수집 창(+1D)은 유지되는지
  • stage-contracts의 새 검사

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

QA 승인(2026-10-02)으로 topology 신선도가 이벤트 기반 갱신 + P7D 만료 안전망으로
바뀐다. 2026-10-03T00:00:00.000Z 컷오버 이전 수집분은 P1D, 이후 수집분은 P7D 창을
정확값으로 갖는지 수집기(수도권·광주·부산·대구·인천 station-info), 검증기
(current topology admission, 대전 materializer), 정책 유도, 수도권 등록기 원장 행,
고정 Hub 번들 stage 검사에서 경계값으로 고정한다.

Refs #862
Refs #870
- 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
@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: 565df0f6-c229-4092-92a2-8d763a43a7ad

  • 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 15:54

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

🎯 Linked issue & acceptance criteria audit
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 classes
    • Hub merge 506306c6 bundle recomputed SHA-256 equals 13c9bd12 in contracts.lock.json
    • QA 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.json
  • release/product-gates/datapack-freshness-sla.json
  • tools/datapack/build-datapack.mjs
  • tools/datapack/collect-busan-route-topology.mjs
  • tools/datapack/collect-busan-route-topology.test.mjs
  • tools/datapack/collect-capital-route-topology.mjs
  • tools/datapack/collect-capital-route-topology.test.mjs
  • tools/datapack/collect-daegu-datapack-sources.mjs
  • tools/datapack/collect-daegu-datapack-sources.test.mjs
  • tools/datapack/collect-gwangju-route-topology.mjs
  • tools/datapack/collect-gwangju-route-topology.test.mjs
  • tools/datapack/collect-incheon-station-info.mjs
  • tools/datapack/collect-incheon-station-info.test.mjs
  • tools/datapack/freshness-policy.mjs
  • tools/datapack/freshness-policy.test.mjs
  • tools/datapack/lib/route-map-admission-freshness.mjs
  • tools/datapack/lib/route-map-admission-freshness.test.mjs
  • tools/datapack/lib/topology-freshness-cutover.mjs
  • tools/datapack/materialize-daejeon-route-topology.mjs
  • tools/datapack/materialize-daejeon-route-topology.test.mjs
  • tools/datapack/materialize-incheon-station-info.mjs
  • tools/datapack/register-current-capital-route-topology.mjs
  • tools/datapack/register-current-capital-route-topology.test.mjs
  • tools/datapack/register-daegu-datapack-sources.mjs
  • tools/datapack/source-candidates.json
  • tools/datapack/stage-contracts.mjs
  • tools/datapack/stage-contracts.test.mjs
📜 Review details

Comment thread tools/datapack/build-datapack.mjs
@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.

@AquilaXk
AquilaXk merged commit 2baed06 into main Oct 2, 2026
13 checks passed
@AquilaXk
AquilaXk deleted the chore/topology-freshness-p7d-870 branch October 2, 2026 16:06
@sonarqubecloud

sonarqubecloud Bot commented Oct 2, 2026

Copy link
Copy Markdown

Quality Gate Failed Quality Gate failed

Failed conditions
3.2% Duplication on New Code (required ≤ 3%)

See analysis details on SonarQube Cloud

AquilaXk added a commit that referenced this pull request Oct 3, 2026
컷오버 이후 수집한 광주 topology(P7D)를 24시간 고정값으로 검사해 보관본 등록 경로가 실패했다(register-retained-kric-timetable 테스트가 실데이터로 RED). topologySnapshotFreshnessMillis로 컷오버 전 P1D, 후 P7D를 정확값으로 검사한다.

Refs #903 #904
AquilaXk added a commit that referenced this pull request Oct 3, 2026
* [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
AquilaXk added a commit that referenced this pull request Oct 3, 2026
… 검사 (#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
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