Skip to content

[CI] ITX 승격 뒤 파생 재결속 자동화: 입력 팩 고정·출력 팩 파생·재결속 workflow (#979) - #980

Merged
AquilaXk merged 25 commits into
mainfrom
ci/itx-promotion-rebinding-979
Oct 6, 2026
Merged

AquilaXk merged 25 commits into
mainfrom
ci/itx-promotion-rebinding-979

Conversation

@AquilaXk

@AquilaXk AquilaXk commented Oct 6, 2026 •

Copy link
Copy Markdown
Owner

Related issue

Refs #979
Refs #981
Refs #870
Refs #977
Refs #969
Refs #636

DATAPACK_SCHEDULED_ITX_PROMOTION은 이 PR이 병합돼도 켜지 않는다. 파생 재결속은 이 PR로 끝난다. raw capture 원장 대조와 첫 실제 dispatch 확인은 후속 이슈 #981로 분리했고, 메인 결정으로 변수를 켜는 선행 조건이 아니다. #979는 이 PR 병합 후 수동으로 닫는다. 켜기는 QA 보고 뒤 별도 설정 변경이다.

Summary

Changes

  • apply-itx-topology-to-bundled-pack.mjs: 코드의 ADMITTED_TOPOLOGY_INPUTS 허용 목록을 없애고 입력 팩 식별을 contract의 topologyInputPackIdentity에서 읽는다(식별이 없거나 잘못되면 거부). 새 옵션 --derive-fixture <apps/mobile>: 고정 입력 fixture에서 팩·index를 파생하고 증거는 쓰지 않으며, 계산한 증거가 커밋된 증거와 다르면 ITX_FIXTURE_DERIVATION_MISMATCH로 실패한다(시계에 묶이지 않는 immutable 모드).
  • rebind-itx-promotion.mjs(신규): 승격 근거를 다시 검증한 뒤 입력 fixture에 새 topology를 적용해 itx-cheongchun-topology-evidence.json과 버전 증거 itx-cheongchun-topology-evidence-<stamp>.json을 만들고, 5권역 alignment fixture의 packSha256만 새 팩에 맞춘다(그 밖의 값이 바뀌면 실패).
  • itx-current-promotion.yml: 승격 직후 고정 mobile 입력 fixture checkout·stage, 재결속 step을 추가했다. 커밋 step은 허용 경로(원천 승격 4 + 재결속 7)의 정본인 itxPromotionAllowedPaths와 바뀐 경로 집합이 정확히 같을 때만 진행한다. automation-pr-evidence.mjs의 itx-promotion 단계도 같은 경로 집합을 요구한다.
  • ci.yml(5개 job)·datapack-release.yml: mobile fixture를 입력 팩(mobile 573aefdb, 팩 sha 609a7409)으로 고정하고 Node 설정 뒤에 파생 step을 넣었다. "Re-verify" step은 파생된 팩의 기대 sha를 workflow literal이 아니라 커밋된 증거(pack.outputSha256)에서 읽는다. datapack-release.yml의 Node도 CI와 같은 24.19.0으로 고정했다(SQLite 버전에 묶인 바이트를 만들기 때문).
  • data-test-discovery.mjs: fixture 파일 기대 해시를 JSON 증거에서 읽는 derivedProfileSha256({jsonPath, pointer})을 추가했다. 모양이 틀리거나 값이 sha256이 아니면 INVALID_FIXTURE_DERIVED_HASH다. data-test-ownership.json의 mobile-v19 pin·fixtureStageContracts를 입력 팩으로 바꾸고 새 테스트를 data979 소유로 등록했다.
  • stage-local-mobile-fixture.mjs: 로컬 staging도 입력 팩 검증 뒤 파생하고 증거 sha와 대조한다.
  • 테스트의 현재 원천 literal을 contract·증거·artifactId에서 도출하게 했다: itx-cheongchun-coverage-contract.test(두 승격 모드 검증, 운행일·요일·신선도 규칙), activate-current-source-set.test, apply-itx-topology-to-bundled-pack.test, itx-promotion-gate.test(정책 측정 근거 snapshot까지만 이력 재생하고 이후 게이트 승격은 영수증 존재로 확인), datapack-tools.test(작업 트리 원천을 읽는 route graph 검사는 현재 contract 기준 임시 build spec 사용).
  • test-fixtures/itx-synthetic-collection.mjs·rebind-itx-promotion.test.mjs: 합성 수집(실제 후보 생성기) → 승격 → 재결속 → CI가 하는 파생을 격리 worktree에서 끝까지 돌리는 종단 테스트. 시나리오 4개: 7일 뒤 수집, 현재 원천들과 같은 날 수집, 운행역 제거·추가(자동 게이트가 막아 사람 승인 승격으로 처리, 증거·파생 팩의 간선이 따라감).
  • 승격 CLI --rebind: 게이트·사람 승인 승격이 같은 재결속을 탄다. apply-itx-topology는 Node 24.19.0·SQLite 3.53.3 런타임 가드를 둔다.
  • 문서 파편(documentation-fragment.json) 갱신.

Scope

Included

  • 파생 재결속 도구·workflow 단계·증거 단계 허용 경로·mobile fixture 고정 방식 전환·literal 테스트 파생화
  • mobile 레포 fixture 커밋 573aefdb(브랜치·태그 data-fixture/itx-979): 병합 대상이 아니다. checkout은 태그 ref로 하고, 각 job이 checkout 전에 태그가 기대 커밋을 가리키는지 먼저 검사한다(지우면 안 된다). 기존 data-fixture/itx-938 선례처럼 브랜치와 태그로만 보존한다(앱 번들 팩을 입력 팩으로 되돌리는 커밋이라 mobile main에 병합하면 안 된다).

Excluded

  • raw capture 원장 등록(OCI 게시 + release/source-snapshots.json 행)과 영수증 대조: 원천 inventory·거버넌스 정책·신선도 SLA 등록과 OCI 게시 권한(datapack-release-check 환경 secret)이 얽힌 별도 원천 온보딩이라 이 PR에서 구현·검증할 수 없다. 후속 이슈 #981에서 다룬다(메인 결정: 변수 켜기의 선행 조건이 아니다).
  • 후보 build spec·전국 후보 입력 manifest·preparation의 ITX pin: 승격 PR이 바꾸지 않는다. PR CI는 이 pin이 가리키는 게시된 입력(OCI)을 받아 쓰고, 병합 뒤 전국 후보 준비 단계(prepare-nationwide-candidate-run)가 버전 증거를 읽어 새 원천으로 다시 묶는다.
  • 저장소 변수 켜기, 게이트 한도 변경

Ownership / dependencies

Contract & Compatibility

  • Source / API / schema contract: 새 API 없음. API 카탈로그(list --query korail)·source-candidates.json의 기존 id만 쓴다.
  • Artifact / provenance identity: contract·증거 스키마는 그대로다. 승격 PR의 허용 경로가 4개에서 11개(원천 승격 4 + topology 증거 2 + alignment fixture 5)로 늘었다.
  • Backward compatibility: 현재 contract·증거·팩 sha는 바뀌지 않는다(--derive-fixture가 입력 fixture에서 현재 출력 팩·index·증거를 그대로 재현한다).
  • Migration or cutover: mobile fixture pin이 출력 팩(4d419569)에서 입력 팩(573aefdb)으로 한 번 바뀐다. 이후 승격은 pin을 바꾸지 않는다.

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: 변경 없음
  • data contract: 변경 없음
  • route-map artifact / product gate: 변경 없음
  • promotion request id: 해당 없음

Verification

Check Result / Evidence
Focused RED → GREEN (1) apply-itx 테스트: 허용 목록 의존 3건 RED → contract 기반 GREEN. (2) CI 첫 실행에서 5개 job이 ITX_FIXTURE_DERIVATION_MISMATCH로 RED였고, linux/amd64 컨테이너(node 24.19.0)에서 pack.outputSha256만 달라지는 것을 재현했다(원인: zlib gzip 헤더 OS 바이트가 macOS 19·Linux 3). OS 바이트 고정 뒤 같은 컨테이너에서 팩 sha 16497931…와 index sha 7e5ca038…가 증거·mobile 4d419569와 일치(GREEN). (3) discovery derivedProfileSha256, 증거 단계 허용 경로(11), 승격 workflow 계약, 재결속 종단 테스트(시나리오 2개)
Affected integration 합성 수집 → 실제 게이트·승격 → 재결속 → CI와 같은 입력 fixture 복원·--derive-fixture 상태에서 required-pr 전체를 격리 worktree로 실행했다. mobile-v19 profile: exit 0. 기본 profile 4 shard: shard 2·4 통과, shard 1·3은 이 macOS 개발 환경에서 승격 전 main에서도 같은 테스트가 실패하는 2개 파일(bundle-component-contract ICU, collect-korail-itx-cheongchun-timetable 임시 경로 심볼릭 링크 25건; 실패 집합 동일)만 실패했다. 후보 pin 입력은 실제 공개 OCI 읽기(GET)로 받았다.
Required CI head 33221968: Data contracts(mobile-v19, shard 1~4 포함)·SonarCloud·CodeQL·CodeRabbit 전부 success
Live provider / release Not required — reason: 합성 수집으로 게이트·승격·재결속을 돌렸고 공급자 호출·dispatch는 하지 않았다
Security / data integrity 파생 결과가 커밋된 증거와 다르면 실패하고(ITX_FIXTURE_DERIVATION_MISMATCH에 달라진 필드를 적는다), --derive-fixture는 증거를 쓰지 않는다. fallback 없음

Not run

  • Check: 실제 승격 workflow dispatch, raw capture 원장 대조
  • Reason: 변수를 켜지 않은 채 병합하며 공급자 호출·OCI 게시를 하지 않는다. 원장 대조는 범위 밖(Excluded)
  • Rerun owner / condition: QA가 변수 켜기를 결정하기 전 force_collect dispatch로 확인

Risk

  • Level: High
  • Main risk: (1) 합성 시뮬레이션과 실제 승격의 차이. datapack-tools 일부 테스트(8개)의 build 시계는 원천들의 수집 시각 최댓값이라 ITX 수집 시각이 Incheon 원천 신선도(24시간) 밖으로 앞서면 그 테스트가 실패한다. 수집 시각을 직전 수집 7일 뒤로 합성했을 때 이 8개가 정확히 이 사유로 실패했고, 수집 시각을 현재 원천들과 같은 날로 합성했을 때는 통과했다. 실제 승격은 Incheon 갱신 PR이 병합된 main 위에서 열려야 안정적이다. (2) raw capture 원장 대조가 없어 SOURCE_BINDING·FETCH_ERRORS는 승격 시점 PASS 기록만 남는다.
  • Failure behavior: 재결속·파생이 어긋나면 workflow 또는 CI가 실패하고 [Fix] 원천 갱신 workflow 실패를 이슈로 드러내고 광주 보관 시간표 갱신에 수동 실행 경로 추가 #926 경로로 드러난다. 이전·stale 데이터로 대체하지 않는다.
  • Candidate / admission / publication state on failure: 변경 없음(PR이 열리지 않거나 red로 병합되지 않는다)
  • Fallback or degraded-success path introduced: No

Rollout / Recovery

  • Rollout or promotion: 변수를 끈 채 병합. 켜기는 QA 보고 뒤 별도 설정 변경이다.
  • Monitoring / success signal: 승격 PR 하나의 Data contracts green
  • Rollback or recovery: 이 PR revert. mobile fixture 브랜치·태그는 남겨 둔다.
  • Existing artifact / schema compatibility after rollback: 이 PR이 만드는 산출물 스키마 변경이 없어 영향 없음

Review focus

  • --derive-fixture가 시계에 묶이지 않는 immutable 모드로 증거 불일치를 거부하는지
  • 승격 PR 허용 경로 정본(itxPromotionAllowedPaths)과 workflow의 정확 일치 검사
  • 입력 fixture pin(workflow 3곳)과 ownership manifest의 일치

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

…된 증거에서 파생

- apply-itx-topology --derive-fixture: 입력 fixture에서 같은 팩·index를 결정적으로 만들고 커밋된 증거와 한 글자라도 다르면 실패한다(증거는 쓰지 않는다).
- ADMITTED_TOPOLOGY_INPUTS 허용 목록을 없애고 입력 팩 식별을 coverage contract의 topologyInputPackIdentity에서 읽는다.
- ci.yml·datapack-release.yml·ownership manifest·stage-local의 pin을 입력 팩(mobile 573aefdb)으로 바꾸고, 파생 출력 팩 sha는 증거를 가리키게 한다(discovery derivedProfileSha256).
- 승격마다 mobile 커밋·workflow pin이 바뀌지 않는다.

Refs #979
후보 spec·입력 manifest·preparation의 ITX pin은 OCI에 게시된 입력을 가리키므로 승격 PR이 바꾸지 않는다. 병합 뒤 전국 후보 준비가 새 원천으로 다시 묶는다.
ITX 소유 테스트를 data979 소유로 등록한다.

Refs #979
- coverage contract 테스트: 승인·게이트 두 승격 모드 모두 구조와 근거를 검증하고, 운행일·신선도·요일을 literal 대신 규칙으로 확인
- activate-current-source-set 테스트: 버전 증거 경로와 build 시각을 현재 artifactId stamp에서 도출

Refs #979
@coderabbitai

coderabbitai Bot commented Oct 6, 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: cb0a14b6-5864-4d42-8a55-353f91f0d794
  • 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.

zlib은 gzip 헤더 OS 바이트를 실행 플랫폼으로 채워(macOS 19, Linux 3) 압축 본문이 같아도 팩 sha256이 달랐다. linux/amd64 컨테이너(node 24.19.0)에서 파생이 pack.outputSha256 불일치로 실패하는 것을 재현했고, 고정 뒤 같은 컨테이너에서 팩 sha와 index sha가 증거·mobile 4d419569와 일치한다. 불일치 오류에는 달라진 필드를 적는다.

Refs #979
- 현재 contract 기준으로 build spec의 ITX pin을 다시 계산하는 helper(current-itx-bound-build-spec)를 route graph·current admission·datapack-tools 테스트가 쓴다.
- refresh-nationwide-candidate 테스트는 게이트 승격 근거 파일(영수증·정책·직전·기준선 원천)도 복사한다.
- activate-current-source-set 테스트는 게이트 승격 contract에 repositoryRoot를 넘긴다.

Refs #979
관측 시각 literal(2026-10-05)과 승인 URL 주입 가정을 없애고, 게이트 승격이면 작업 트리 영수증을 근거로 쓴다.

Refs #979

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

🎯 Linked issue & acceptance criteria audit
ID Acceptance criterion Status Evidence
AC1 A gate-mode promotion PR alone turns Data contracts green with no manual commit PASS tools/datapack/rebind-itx-promotion.mjs and .github/workflows/itx-current-promotion.yml
AC2 Literal tests derive from the contract so no one edits expectations by hand PASS tools/datapack/apply-itx-topology-to-bundled-pack.test.mjs
AC3 The input pack allowlist is contract-based and a mismatching identity fails PASS tools/datapack/apply-itx-topology-to-bundled-pack.mjs
AC4 Topology evidence and pack regenerate and the mobile fixture pin is paired FAIL PR 980 body states the mobile PR is replaced by a branch and tag
AC5 The raw capture sha is reconciled against the source ledger row FAIL PR 980 body section Excluded states this criterion is left unmet
⚡ Tiered triage & token efficiency
  • Non-code files skipped: 0
  • AST symbols extracted: 0
  • Estimated token savings: 0%
Category Count Status
Skipped non-code files 0 TIER-1 SKIPPED
AST semantic symbols 0 TIER-2 EXTRACTED
🛡️ Adversarial audit evidence
  • Falsifiability verified: Yes (Validation mutants killed 4 of 4; derive comparison probed by CLI only)
  • Hollow assertions detected: 0
  • Production backdoors detected: 0
  • Ground-truth sources verified:
    • Issue 979 body acceptance criteria
    • Local derive run against the committed evidence file
    • Pinned input pack sha in ci.yml compared with the contract identity
  • Mutation testing evidence: topologyInputPackIdentity lines 388, 389, 391: 4 of 4 mutants killed
🤖 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:
- `@.github/workflows/ci.yml:44-44`
  Could the issue body record that the branch and tag must be kept, and could the
  manual path document that the rebind tool is the follow-up step?
- `@.github/workflows/itx-current-promotion.yml:12-12`
  Could the PR switch to Refs #979, or split the ledger reconciliation and the
  dispatch check into a follow-up issue before the closing keyword is kept? The issue
  body could also record the mobile branch-and-tag substitution as a QA-approved
  decision.
- `@tools/datapack/apply-itx-topology-to-bundled-pack.mjs:407-407`
  Could the comment name the real step and could main keep a single variable for the
  option?
- `@tools/datapack/apply-itx-topology-to-bundled-pack.mjs:1171-1173`
  Could a small test stage the pinned input pack, copy the evidence with one altered
  digit, and assert the mismatch error names pack.outputSha256? That keeps the
  immutable-mode gate falsifiable on any runner.
- `@tools/datapack/apply-itx-topology-to-bundled-pack.mjs:1209-1209`
  Could the apply tool assert the same Node and SQLite runtime before computing, and
  fail with a clear message, or record the SQLite version in the evidence so a
  mismatch names its cause?
- `@tools/datapack/apply-itx-topology-to-bundled-pack.test.mjs:35-42`
  Could the test recompute the station, served-station, and directed-edge counts
  directly from the source stationSequences with a short independent loop, and assert
  them against the evidence? That would restore a second oracle without a literal per
  promotion.
- `@tools/datapack/test-fixtures/itx-synthetic-collection.mjs:31-35`
  Could one scenario remove or add a served station in the synthetic completeness
  data, and then assert that the evidence topology counts, the derived pack rows, and
  the alignment fixtures all follow the change?

---

Outside diff comments:
None.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository CLAUDE.md, issue 979 body, and the aquila-review skill rules

Review profile: ASSERTIVE

Plan: Aquila fallback

Run ID: N/A (Aquila fallback)

Review source: Aquila CLI

Repository visibility: public GitHub repository

Trigger:
Single discovery review of PR 980 at head 88b437b, requested by the QA owner

Base:
main@c80d3508d9ebc2c79ea8fd5dec0c2039cd4be7a5

Head:
automation-itx-rebinding-979@88b437bed5426584112e70a2529619bed832ae20

Command:
node post-review.mjs input.json payload-1.json --repo AquilaXk/easysubway-data --pr 980

📥 Commits

Reviewing files changed in this pull request between:

  • Base: c80d3508d9ebc2c79ea8fd5dec0c2039cd4be7a5
  • Head: 88b437bed5426584112e70a2529619bed832ae20
📒 Files selected for processing (9)
  • .github/workflows/ci.yml
  • .github/workflows/itx-current-promotion.yml
  • tools/ci/automation-pr-evidence.mjs
  • tools/ci/data-test-ownership.json
  • tools/datapack/apply-itx-topology-to-bundled-pack.mjs
  • tools/datapack/apply-itx-topology-to-bundled-pack.test.mjs
  • tools/datapack/rebind-itx-promotion.mjs
  • tools/datapack/rebind-itx-promotion.test.mjs
  • tools/datapack/test-fixtures/itx-synthetic-collection.mjs
📜 Review details

Comment thread .github/workflows/ci.yml Outdated
Comment thread .github/workflows/itx-current-promotion.yml Outdated
Comment thread tools/datapack/apply-itx-topology-to-bundled-pack.mjs Outdated
Comment thread tools/datapack/apply-itx-topology-to-bundled-pack.mjs
Comment thread tools/datapack/apply-itx-topology-to-bundled-pack.mjs
Comment thread tools/datapack/apply-itx-topology-to-bundled-pack.test.mjs
Comment thread tools/datapack/test-fixtures/itx-synthetic-collection.mjs
변이(servedStationCount 14→15)는 이 단언이 실패로 잡는다.

Refs #979
…980 F3)

- 운행역이 바뀐 수집은 자동 게이트가 막는 것을 확인하고, 사람 승인(OWNER_APPROVED) 승격으로 올린 뒤 같은 재결속 도구가 처리한다.
- 증거의 역·운행역·간선 수는 승격된 원천에서 독립 계산한 값과 같고, 바뀐 정차역의 ITX 간선이 파생 팩에서 사라지거나 생긴다.
- 재결속 도구는 게이트 승격뿐 아니라 OWNER_APPROVED 승격도 받는다.

Refs #979
팩 바이트가 SQLite 패치 버전에 묶여, 다른 런타임에서는 불투명한 해시 불일치로 실패했다. 계산 전에 실제 버전을 적어 거부한다.
증거 스키마에 SQLite 버전을 추가하는 것은 build-datapack·build-server-timetable-snapshot의 exact-key 검증과 불변 고정된 과거 버전 증거에 걸려 이 PR에서 하지 않는다.

Refs #979
대조 조건을 꺼 둔 변이는 이 테스트가 실패로 잡는다.

Refs #979
…동 승인 승격도 --rebind로 같은 재결속을 탐 (#980 F6)

- ci.yml 5개 job·datapack-release·승격 workflow가 checkout 전에 data-fixture/itx-979 태그가 기대 커밋을 가리키는지 확인한다. 태그가 사라지거나 옮겨지면 원인을 적어 실패한다(보호 규칙 대신 CI 검사). checkout ref는 태그, 커밋 고정은 stage의 rev-parse 검증이 맡는다.
- discovery manifest에 fixture profileRef(태그)를 추가하고 모양을 닫았다.
- 승격 CLI에 --rebind를 추가했다. 게이트·사람 승인 승격 모두 승격 직후 같은 재결속 도구를 탄다. 승격 workflow는 fixture를 승격 전에 stage하고 --rebind를 쓰며 별도 재결속 step을 없앴다. 수동 절차는 workflow 머리말에 적었다.

Refs #979
@AquilaXk
AquilaXk marked this pull request as ready for review October 6, 2026 09:35
@AquilaXk AquilaXk added the automerge FIFO 병합 큐 대상 — 코디네이터가 순서대로 update-branch 후 auto-merge label Oct 6, 2026
@github-actions

github-actions Bot commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

No description provided.

@github-actions

github-actions Bot commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

No description provided.

@sonarqubecloud

sonarqubecloud Bot commented Oct 6, 2026

Copy link
Copy Markdown

@AquilaXk
AquilaXk merged commit 0b0e0d5 into main Oct 6, 2026
12 checks passed
@AquilaXk
AquilaXk deleted the ci/itx-promotion-rebinding-979 branch October 6, 2026 09:55
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