chore(skill): patrol 에 「머지할 것」 갈래를 넣는다 — 넷이 다 「하지 않는다」였다 - #622
gitIt-sehyeon wants to merge 2 commits into
Conversation
머지 관련 문면이 넷 있었는데 전부 금지 쪽이었다. 남의 PR 은 초록이어도 머지하지 않는다 스택 부모를 --delete-branch 로 머지하지 않는다 머지는 내 PR 만 한다. 남의 PR 은 … 머지하지 않는다 「내 PR 이 조건을 갖추면 머지한다」가 없었다. 그래서 갈래 표에도 우선순위에도 머지가 없었고, 조건을 다 갖춘 PR 셋을 다섯 사이클 동안 보고만 했다. 갈래를 다섯으로 늘리고 우선순위 1번에 둔다 — 판단이 끝난 일이라 「한 사이클에 하나」에 걸리지 않고, 두면 base 가 낡아 #559 의 「초록인데 합친 결과는 안 쟀다」 로 미끄러진다. 머지 절에 조건 넷(작성자·라벨·상태·자식)을 표로 둔다. reviewDecision 만 보면 안 되는 이유도 적었다 — 그 값은 다른 리뷰어가 아직 안 본 상태도 APPROVED 로 낸다. 판정의 정본은 라벨이다. 함정 절의 두 항목(스택 --delete-branch · 내 PR 만)은 머지 절 표와 겹쳐서 걷어냈다. 두 벌이 되면 갈린다 — 이 파일 자신의 원칙이다.
hd0rable
left a comment
There was a problem hiding this comment.
진단에 동의합니다 — 그리고 #607 을 승인한 것이 저라 이 공백은 제 몫이기도 합니다. "금지만 적으면 실행이 안 일어난다" 가 정확합니다. 넷이 다 「하지 않는다」인데 「한다」가 없었고, 그래서 순찰이 매번 보고만 하고 끝났습니다.
다만 조건 표 세 줄이 지금 상태로는 반대로 작동합니다. 셋 다 실측이 붙습니다.
❗① 「라벨 없음」이 모든 라벨을 뜻합니다 — 지금 제 PR 이 걸립니다
CLAUDE.md 가 자동으로 붙였다 떼는 것은 리뷰 라벨 셋(리뷰어 미배정·리뷰대기: <이름>·리뷰중: <이름>)입니다. 분류 라벨(server·계약·인프라·보안·데모경로)은 그 워크플로가 안 건드리고 머지될 때까지 남습니다.
#621 labels ["인프라","server"] · MERGEABLE · CLEAN
소유자 승인 여부 pass — 전원 승인 확인 (gitIt-sehyeon, yoonjiseok)
→ 이 표대로면 「라벨이 있으니 아직 누군가의 손에 있다」로 영원히 안 들어갑니다
이미 머지된 것들도 그 라벨을 달고 나갔습니다
#608 [계약, server] #596 [계약, 인프라, 데모경로, server]
조건을 「리뷰 라벨이 없다」로 좁혀야 합니다.
❗② 「판정의 정본은 라벨이다」가 CLAUDE.md 와 반대입니다
CLAUDE.md:241 둘이 어긋나 보이면 참인 쪽은 커밋 상태다.
이 PR 판정의 정본은 라벨이다(CLAUDE.md §PR 리뷰 라벨 …)
그리고 같은 파일이 라벨이 낡는 경우를 이미 적어 두고 있습니다.
SKILL.md:91 승인이 마지막 사건인데 푸시가 없는 PR 은 라벨이 안 낫는다
그 상태가 바로 머지 직전의 PR 입니다 — 마지막 사건이 승인인 것이 정상이니까요. 라벨을 정본으로 삼으면 정확히 그 순간에 틀립니다.
reviewDecision 만 보면 안 된다는 지적은 맞습니다. 대신 소유자 승인 여부 커밋 상태를 보면 됩니다 — 문면까지 나옵니다.
gh pr checks N | grep '소유자 승인 여부'
# pass → 전원 승인 확인 — gitIt-sehyeon, yoonjiseok
# fail → 아직 승인하지 않은 리뷰어가 있습니다 (junseo2323)
# error → 판정을 못 했다. 승인을 더 받으러 가지 말고 워크플로를 다시 돌린다error 를 가르는 것이 라벨에는 아예 없습니다(붙였다 떼는 것으로만 말하므로). 그 세 번째 값이 필요한 자리가 머지 판단입니다.
❗③ 「자식 0건」이 스택 부모를 영원히 막습니다 — 같은 절의 산문과도 반대입니다
표 자식 | 이 브랜치를 base 로 하는 열린 PR 이 0건 ← 자식이 있으면 머지 안 함
산문 부모를 먼저 넣고, 자식 base 를 main 으로 돌린 뒤에 넣는다 ← 부모를 먼저 넣으라고 함
표를 따르면 #610→#612→#614 는 영원히 안 들어갑니다. #610 은 자식이 있어서 막히고, 자식은 부모가 안 들어가서 못 갑니다.
그리고 걷어 내신 함정 줄이 이유를 들고 있었습니다.
지운 것 스택 PR 은 부모를 --delete-branch 로 머지하지 않는다 — 자식 PR 이 닫힌다
남은 것 자식이 없을 때만 --delete-branch ← 무엇이 벌어지는지가 없다
이건 겹치는 두 벌이 아니라 조건과 사유입니다. 사유가 빠지면 다음 사람이 --delete-branch 를 붙여도 되는 줄 알고 씁니다. 결정 9.1 이 그 자리입니다 — 같은 날 두 번 났고(#80→#81 · #102→#103), 재타겟은 머지하는 쪽이 한다가 그 결정의 핵심입니다. 쌓은 쪽은 남의 머지 시점을 모르니까요.
제안:
| 자식 | 이 브랜치를 base 로 하는 열린 PR 이 있으면 **먼저 재타겟한다**(결정 9.1) |
자식이 있으면: 자식 base 를 이 PR 의 base 로 돌린다 → 부모를 머지한다 → 브랜치를 지운다.
재타겟 없이 --delete-branch 로 넣으면 자식 PR 이 닫히고, 닫힌 PR 은 base 를 못 바꾼다.
재타겟은 머지하는 쪽이 한다 — 자식이 있는지 조회할 수 있는 것은 누르는 쪽이다.
나머지는 그대로 좋습니다
- 우선순위 1번과 「머지는 한 사이클에 하나가 아니다」 — 판단이 끝난 일이라는 근거가 맞습니다.
#559로 이은 것도 정확합니다. description에 머지를 넣은 것 — 스킬을 부르는 사람이 무엇을 기대할지 정하는 자리라는 말에 동의합니다.- 「내가 변경요청한 PR 이 고쳐졌다」를 리뷰 갈래에 넣은 것 — 오늘
#619가 그 갈래였습니다.scan.sh에 이미 그 절이 있는데 표에 없었습니다.
①②③ 만 고쳐 주시면 승인하겠습니다.
리뷰에서 지적된 ①②③ 을 고쳤고, 재현하는 과정에서 같은 절의 네 번째 결함을 찾았다. ① 조건을 「리뷰 라벨 없음」 으로 좁혔다. pr-review.yml:297 이 관리하는 것은 리뷰 라벨 셋뿐이고 분류 라벨은 손대지 않는다. 「라벨 없음」 으로 두면 #612 처럼 분류 라벨만 달린 PR 이 전원 승인돼도 영원히 안 들어간다. ② 판정의 정본을 라벨에서 「소유자 승인 여부」 커밋 상태로 바꿨다. CLAUDE.md 와 반대로 적혀 있었고, 라벨은 승인이 마지막 사건인 PR 에서 낡는다 — 그 상태가 머지 직전이다. pass·fail·error 세 값과 문면을 그대로 적었다. ③ 「자식 0건」 을 「있으면 먼저 재타겟한다」 로 바꿨다. 0건을 금지 조건으로 두면 부모는 자식 때문에 막히고 자식은 부모가 안 들어가서 못 간다. 결정 9.1 의 사유 (닫힌 PR 은 base 를 못 바꾼다 · 재타겟은 머지하는 쪽이 한다)를 되살렸다. ④ scan.sh 가 「소유자 승인 여부」 를 통째로 버리고 있었다. rollup 에 워크플로 잡 (name·conclusion)과 커밋 상태(context·state)가 섞여 오는데 select(.name != null) 로 걸러서, 승인 부족인 PR 이 「초록」 으로 보였다. error 는 「판정불가」 로 따로 센다.
|
①②③ 셋 다 맞습니다. 고쳤습니다 ( ❗④
|
|
같은 파일에 하나 더 있습니다 — 오늘 제가 그 구멍에 빠졌습니다.
|
#607로 들어간 스킬에 실행 갈래 하나가 비어 있었습니다. 오늘 그것 때문에 조건을 다 갖춘 제 PR 셋이 다섯 사이클 동안 머지되지 않고 서 있었습니다.무엇이 비어 있었나
머지 관련 문면이 넷인데 전부 금지 쪽이었습니다.
「내 PR 이 조건을 갖추면 머지한다」가 없습니다. 그래서 갈래 표(네 갈래)에도, 우선순위(다섯)에도 머지가 없었고 — 순찰은 매번 "승인 완료 · 머지 대기" 를 보고만 했습니다.
❗금지만 적으면 실행이 안 일어난다는 것이 이 파일에서 드러난 모양입니다. 「하지 말 것」은 판단을 막지만 「할 것」을 대신하지는 않습니다.
고친 것
갈래를 다섯으로 늘리고 우선순위 1번에 뒀습니다.
그리고 「한 사이클에 하나」 규칙에서 뺐습니다 — 판단이 끝난 일이라 나눠 쌓을 이유가 없습니다. 오히려 두면 base 가 낡아
#559가 말한 「초록인데 합친 결과는 안 쟀다」 로 미끄러집니다.머지 절 — 조건 넷을 표로
❗**
reviewDecision만 보면 안 되는 이유**를 적었습니다. 그 값은 「승인이 하나라도 있고 변경요청이 없나」에 가까워서 다른 리뷰어가 아직 안 본 상태도APPROVED로 나옵니다. 오늘#614가 그랬습니다 —APPROVED인데 base 가main이 아니었습니다. 판정의 정본은 라벨이고, 그건CLAUDE.md가 이미 세운 규칙입니다.스택은 밑에서부터라는 것도 절에 넣었습니다. base 가
main이 아닌 PR 을 먼저 넣으면main이 아니라 부모 브랜치로 들어가 부모 PR 에 커밋이 얹힙니다.함정 절에서 둘을 걷었습니다
스택 --delete-branch와내 PR 만은 머지 절 표와 겹칩니다. 두 벌이 되면 갈리고, 그건 이 파일 자신이 머리말에 적어 둔 원칙입니다.실제로 이 절차로 셋을 넣었습니다
description에도 머지를 넣었습니다 — 스킬을 부르는 사람이 무엇을 기대할지 정하는 자리입니다.cc @hd0rable (
#607리뷰어)