Skip to content

measure(actions): 대기 큐의 약 47%가 중앙 리뷰 체크로 merge를 막지 못하는 67개 저장소에서 나온다 (76개 전수, 기본 브랜치 기준 정정됨) #1928

Description

@seonghobae

요약

org 전체 대기 실행 2093건 가운데 1282건(61.3%)이 중앙 리뷰 체크가 merge를 막지 않는 저장소에서 나옵니다. 76개 저장소를 표본이 아니라 전수로 확인했습니다.

중앙 리뷰 체크가 merge를 막는 저장소   5개 :  811건 (38.7%)
중앙 리뷰 체크가 merge를 못 막는 저장소 71개 : 1282건 (61.3%)
                                    합계   : 2093건

merge를 막는 5곳은 .github, contextual-orchestrator, fast-mlsirm, pg-erd-cloud, bandscope 뿐입니다.

측정 방법

  • 대기 깊이: 저장소마다 actions/runs?status=queued&per_page=1total_count. 필터 없는 actions/runs는 최근 30건만 돌려주므로 깊이 측정에 쓰면 안 됩니다.
  • 게이팅 판정: 저장소마다 두 경로를 모두 봤습니다. classic branch protection(branches/main/protection/required_status_checks)과 ruleset 유효 규칙(rules/branches/main). 한쪽만 보면 틀립니다 — 실제로 aFIPCnewsdom-api는 classic protection이 없어서 처음에 게이팅 없음으로 잘못 분류됐고, ruleset 경로에서야 잡혔습니다.
  • 중앙 체크 판정: 필수 context 이름에 opencode-review|coverage-evidence|noema-review|required-workflow-bootstrap|strix|scan-pr-queue|CodeQL|osv-scan|trivy-fs|scorecard|dependency-review 중 하나라도 있는지로 봤습니다. wardnet의 유일한 필수 context는 rust라서 중앙 리뷰는 이 저장소의 merge를 막지 못합니다. newsdom-apipytest 하나뿐입니다.
  • 합계 검증: 811 + 1282 = 2093, 5 + 71 = 76. join에서 누락된 행이 없습니다.

큐가 cron이 아니라 PR에서 옵니다

게이팅 없는 저장소 4곳의 대기 실행 event 분포입니다. per_page=100 상한이 있어 naruon은 240건 중 최근 100건 표본입니다.

naruon              pull_request 59 + pull_request_target 19,  schedule 0
xtrmLLMBatchPython  pull_request 66 + pull_request_target 13,  schedule 0
OriginWeave         pull_request 53 + pull_request_target 29,  schedule 1
noema               pull_request 36,                           schedule 3

정기 실행이 밀어 넣는 게 아닙니다. PR마다 붙는 필수 워크플로가 밀어 넣습니다. .github 기준으로 PR 하나의 synchronize가 실제로 만드는 job은 33개입니다(matrix 전개 포함, if:로 확실히 skip되는 job 제외).

무엇을 주장하고 무엇을 주장하지 않는가

주장하지 않는 것: 71개 저장소의 리뷰를 끄자는 게 아닙니다. 게이팅이 없다고 리뷰 결과가 쓸모없지 않습니다. 권고 신호로서의 가치는 그대로입니다.

주장하는 것: 포화 상태에서 merge를 막을 수 없는 작업이 큐의 61%를 차지하고, merge를 막는 39%가 그 뒤에 줄 서 있습니다. 60-job 상한이 org 공유이므로 이건 직접적인 자리 경합입니다.

다음 판단이 필요한 지점

리뷰 역량을 없애지 않으면서 실행 시점을 바꾸는 쪽이 방향으로 보입니다 — 게이팅 없는 저장소에서 push마다가 아니라 merge 시점이나 예약, 혹은 요청 시 도는 형태. 다만 이건 org ruleset(18156473)의 적용 범위를 바꾸는 일이고, ruleset 읽기에 admin:org 권한이 필요해서 이 세션에서는 확인도 변경도 못 합니다. 소유자 판단이 필요합니다.

재현

gh api "repos/ContextualWisdomLab/<repo>/actions/runs?status=queued&per_page=1" --jq '.total_count'
gh api "repos/ContextualWisdomLab/<repo>/branches/main/protection/required_status_checks" --jq '.contexts'
gh api "repos/ContextualWisdomLab/<repo>/rules/branches/main" --jq '[.[]|select(.type=="required_status_checks")]|.[].parameters.required_status_checks[].context'

측정 시각 2026-09-05 11:2x UTC. 대기 깊이는 스냅샷이라 변합니다. 게이팅 구성은 구조적이라 잘 안 변합니다.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions