문제
PR 템플릿은 gajae.pr-review-verdict.v1 블록을 머지 게이트로 쓴다. 규칙은 본문에 명시돼 있다.
Paste one exact-head verdict. Self-approval is BLOCK. If there was no independent architect/critic/human review, write needs-human and stop.
이 블록은 작성자가 자기 PR 본문에 직접 쓰는 자유 텍스트이고, 검증하는 것이 아무것도 없다. 실제로 열린 PR 17개 중 7개가 규칙을 위반한 merge-approved를 달고 있다.
현황 (열린 PR 전수, verdict 블록 보유 17개)
| PR |
본문 verdict |
reviewer 주장 |
GitHub 리뷰 결정 |
sha=head |
독립 APPROVED |
작성자 |
| #3935 |
needs-human |
human |
- |
예 |
0 |
probepark |
| #3932 |
needs-human |
human |
- |
예 |
0 |
yazzang-homelab |
| #3931 |
needs-human |
human |
- |
예 |
0 |
yazzang-homelab |
| #3925 |
merge-approved |
critic |
- |
아니오 |
0 |
snowykr |
| #3919 |
needs-human |
human |
- |
아니오 |
0 |
twoimo |
| #3910 |
needs-human |
human |
- |
아니오 |
0 |
yazzang-homelab |
| #3904 |
needs-human |
human |
- |
아니오 |
0 |
gimso2x |
| #3893 |
merge-approved |
architect |
CHANGES_REQUESTED |
아니오 |
0 |
snowykr |
| #3889 |
needs-human |
human |
- |
아니오 |
0 |
innocarpe |
| #3887 |
merge-approved |
architect |
- |
아니오 |
0 |
Loxia106 |
| #3844 |
needs-human |
human |
CHANGES_REQUESTED |
아니오 |
0 |
yazzang-homelab |
| #3823 |
merge-approved |
architect |
CHANGES_REQUESTED |
아니오 |
0 |
developjik |
| #3822 |
merge-approved |
architect |
CHANGES_REQUESTED |
아니오 |
0 |
developjik |
| #3784 |
needs-human |
human |
- |
아니오 |
0 |
pers0n4 |
| #3777 |
needs-human |
human |
CHANGES_REQUESTED |
아니오 |
0 |
binyangzhu000-sudo |
| #3741 |
merge-approved |
architect |
CHANGES_REQUESTED |
아니오 |
0 |
sj0618 |
| #3697 |
merge-approved |
architect |
CHANGES_REQUESTED |
예 |
1 |
sj0618 |
위반 유형
A. CHANGES_REQUESTED인데 본문은 merge-approved (5건) — #3893, #3823, #3822, #3741, #3697
리뷰어가 변경을 요구한 뒤에도 본문 verdict가 그대로 남아 있다. 머지 판단을 본문만 보고 하면 정반대 결론이 나온다.
B. 독립 APPROVED 0건인데 merge-approved (6건)
reviewer:architect / reviewer:critic이라고 적혀 있지만 그 리뷰가 GitHub에 존재하지 않는다. #3887은 작성자가 자기 변경에 reviewer:architect merge-approved를 붙였고 리뷰는 0건이었다 — 템플릿이 명시적으로 BLOCK이라고 한 자체 승인이다.
C. sha가 head와 불일치 (6건)
템플릿이 <exact-head-or-diff-hash>를 허용하므로 diff 해시일 수 있어 단독으로는 위반이라고 단정하지 않는다. 다만 diff 해시는 외부에서 재계산할 방법이 문서화돼 있지 않아 검증 불가능한 증거다. 검증할 수 없는 필드는 게이트 역할을 못 한다.
왜 지금 문제인가
exact-head CI 게이트는 기계적으로 강제되지만(dev-ci.yml의 git merge-base --is-ancestor), 리뷰 게이트는 강제되지 않는다. 그래서 CI는 통과하는데 리뷰 근거는 자기 신고인 PR이 정상으로 보인다. 게이트가 하나라도 자유 텍스트면 그 게이트는 없는 것과 같다.
제안
verdict 블록은 GitHub API로 전부 기계 검증이 가능하다. pull_request_target 또는 기존 CI에 검사 하나를 추가한다.
- 본문에서 verdict 블록을 파싱한다. 없으면 실패.
merge-approved이면:
- 작성자가 아닌 사용자의
APPROVED 리뷰가 최소 1건 존재해야 한다. (자체 승인 차단 — 지금은 문서로만 존재한다)
- 그 APPROVED 리뷰의
commit_id가 현재 head와 같아야 한다. (exact-head 요구를 실제로 강제)
reviewDecision이 CHANGES_REQUESTED가 아니어야 한다.
sha256: 필드는 head sha로 고정하거나, diff 해시를 쓸 거면 재계산 명령을 템플릿에 명시한다. 검증 불가능한 형식은 빼는 게 낫다.
needs-human은 언제나 통과시킨다. 정직한 신고를 벌주면 안 된다.
이러면 verdict 블록이 문서가 아니라 게이트가 된다. 지금은 7건이 그 사실을 증명하고 있다.
문제
PR 템플릿은
gajae.pr-review-verdict.v1블록을 머지 게이트로 쓴다. 규칙은 본문에 명시돼 있다.이 블록은 작성자가 자기 PR 본문에 직접 쓰는 자유 텍스트이고, 검증하는 것이 아무것도 없다. 실제로 열린 PR 17개 중 7개가 규칙을 위반한
merge-approved를 달고 있다.현황 (열린 PR 전수, verdict 블록 보유 17개)
humanhumanhumancritichumanhumanhumanarchitecthumanarchitecthumanarchitectarchitecthumanhumanarchitectarchitect위반 유형
A. CHANGES_REQUESTED인데 본문은 merge-approved (5건) — #3893, #3823, #3822, #3741, #3697
리뷰어가 변경을 요구한 뒤에도 본문 verdict가 그대로 남아 있다. 머지 판단을 본문만 보고 하면 정반대 결론이 나온다.
B. 독립 APPROVED 0건인데 merge-approved (6건)
reviewer:architect/reviewer:critic이라고 적혀 있지만 그 리뷰가 GitHub에 존재하지 않는다. #3887은 작성자가 자기 변경에reviewer:architect merge-approved를 붙였고 리뷰는 0건이었다 — 템플릿이 명시적으로 BLOCK이라고 한 자체 승인이다.C. sha가 head와 불일치 (6건)
템플릿이
<exact-head-or-diff-hash>를 허용하므로 diff 해시일 수 있어 단독으로는 위반이라고 단정하지 않는다. 다만 diff 해시는 외부에서 재계산할 방법이 문서화돼 있지 않아 검증 불가능한 증거다. 검증할 수 없는 필드는 게이트 역할을 못 한다.왜 지금 문제인가
exact-head CI 게이트는 기계적으로 강제되지만(
dev-ci.yml의git merge-base --is-ancestor), 리뷰 게이트는 강제되지 않는다. 그래서 CI는 통과하는데 리뷰 근거는 자기 신고인 PR이 정상으로 보인다. 게이트가 하나라도 자유 텍스트면 그 게이트는 없는 것과 같다.제안
verdict 블록은 GitHub API로 전부 기계 검증이 가능하다.
pull_request_target또는 기존 CI에 검사 하나를 추가한다.merge-approved이면:APPROVED리뷰가 최소 1건 존재해야 한다. (자체 승인 차단 — 지금은 문서로만 존재한다)commit_id가 현재 head와 같아야 한다. (exact-head 요구를 실제로 강제)reviewDecision이CHANGES_REQUESTED가 아니어야 한다.sha256:필드는 head sha로 고정하거나, diff 해시를 쓸 거면 재계산 명령을 템플릿에 명시한다. 검증 불가능한 형식은 빼는 게 낫다.needs-human은 언제나 통과시킨다. 정직한 신고를 벌주면 안 된다.이러면 verdict 블록이 문서가 아니라 게이트가 된다. 지금은 7건이 그 사실을 증명하고 있다.