Repository navigation
fix(ci): 재리뷰 요청 누락으로 리뷰 적체 가드가 무력 — 대기 7건을 빚 0건으로 판정 #1450
Description
작업 유형
bug — 버그·오동작
주 담당 모듈
platform — Android 앱·CI·빌드·릴리스·저장소 운영
개요
review-debt-guard 가 리뷰 응답을 기다리는 PR 7건을 「빚 0건」으로 판정하고 있습니다. 가드가 서 있지만 아무도 막지 못합니다.
8/29 01:39 에 #1449(작성자 Sadturtleman)로 돌아간 가드 run 33226967880 은 열린 PR 33건을 훑고 「응답을 기다리는 PR 없음 — 통과」로 끝났습니다. 같은 시점에 열린 PR 을 전수 실측하면 이렇습니다.
| PR | 작성자 | 변경요청 낸 사람 | 최신 변경요청 뒤 반영 커밋 | 재요청 | 가드 판정 |
|---|---|---|---|---|---|
| #1379 | koongmai | 1hyok | 1 | ❌ | 빚 아님 |
| #1371 | 1hyok | Sadturtleman | 1 | ❌ | 빚 아님 |
| #1365 | koongmai | 1hyok | 1 | ❌ | 빚 아님 |
| #1355 | dependabot | 1hyok | 1 | ❌ | 빚 아님 |
| #1265 | Sadturtleman | 1hyok | 1 | ❌ | 빚 아님 |
| #966 | Sadturtleman | 1hyok | 1 | ❌ | 빚 아님 |
| #882 | koongmai | 1hyok | 1 | ❌ | 빚 아님 |
| #1316 | 1hyok | Sadturtleman | 0 (merge 5건) | ✅ | 변경요청 미반영 |
8건 전부 「리뷰어가 봐야 하는데 가드에는 안 잡히는」 상태이고, 원인은 서로 다른 두 개입니다.
구멍 A — 재요청은 손으로 걸어야 하는데 아무도 안 건다 (7건)
review-debt-guard.yml:93-101 은 변경요청을 빚으로 세는 조건을 셋으로 둡니다. ①최신 판정이 CHANGES_REQUESTED ②그 리뷰어에게 재요청이 다시 걸려 있음 ③그 뒤 작성자의 반영 커밋. #1206 이 ②를 넣으면서 「수정 커밋만으로 리뷰 의무를 만들지 않는다」를 명문화했는데, GitHub 은 변경요청 리뷰를 제출하는 순간 그 리뷰어의 요청을 떼어 내므로 ②는 작성자가 매번 손으로 되살려야 합니다. 그리고 실제로는 아무도 안 겁니다 — 위 7건 중 7건 모두.
이건 개인의 부주의로 볼 수 없습니다. 누락이 세 사람과 봇에 고루 퍼져 있고, 특히 #1355 는 dependabot 이 작성자라 재요청을 걸 주체가 아예 없습니다 — 자동화 없이는 구조적으로 영원히 빚이 되지 않습니다.
같은 종류의 구멍을 이미 액션으로 막은 선례가 있습니다. review-request-all.yml 이 그것이고, 헤더 주석이 문제 진술까지 같습니다 — 「리뷰 요청을 손으로 걸다 보면 빠뜨린다」 / 「요청을 손으로 걸던 때는 아예 걸지 않는 것으로 가드를 통과할 수 있었다」. 다만 트리거가 opened / reopened / ready_for_review 뿐이라 반영 커밋(synchronize)에는 걸리지 않습니다.
구멍 B — merge 로 반영하면 「미반영」으로 샌다 (#1316)
#1316 은 재요청이 걸려 있어(8/28 07:38) ②를 통과했지만 ③에서 탈락했습니다. 가드는 반영 커밋을 select((.parents | length) < 2) 로만 세는데, 최신 변경요청(8/28 04:05:58) 이후 커밋 5건이 전부 병합 커밋이기 때문입니다.
그런데 실제로는 반영돼 있습니다. 리뷰 지적이 「base(fix/562)의 fake 를 가져와 달라」였고 작성자가 rebase 대신 base 를 merge 로 끌어와 처리했습니다 — 69f5e1f9 는 리뷰가 지목한 TestHiltModules.kt 를 실제로 바꿉니다(+4/-0). 작성자 응답 코멘트도 2건(8/28 07:38, 21:34) 달려 있습니다. 즉 공은 리뷰어에게 넘어갔는데 가드만 「공은 작성자에게」로 읽습니다.
처방 후보
- A —
review-request-all.yml에synchronize트리거를 더해, PR 전체의 최신 판정이CHANGES_REQUESTED인 리뷰어를 자동 재요청한다. 권한·수단은 이미 같은 워크플로가GITHUB_TOKEN+pull-requests: write로gh pr edit --add-reviewer를 돌려 실증돼 있고, force-push 마다 오는synchronize중복은 기존current체크 패턴을 그대로 쓰면 된다.review_requested를 소비하는 워크플로가 이 저장소에 0건이라,GITHUB_TOKEN이 만든 이벤트가 다른 워크플로를 못 깨우는 제약도 무해하다. - B — 반영 커밋 계수에서 병합 커밋을 무조건 빼지 않는다. first-parent 대비 실변경이 있으면 센다. 또는 변경요청 이후의 작성자 코멘트를 반영 신호로 함께 본다.
결정이 필요한 지점
A 를 넣으면 재요청이 자동이 되므로 #1206 이 명시적으로 세운 「수정 커밋만으로 리뷰 의무를 만들지 않는다」가 사실상 뒤집힙니다. review-debt-policy.test.mjs 는 가드 파일만 검사하므로 새 워크플로를 더하는 것만으로는 red 가 나지 않지만, 정책 자체를 바꾸는 변경이라 팀 합의가 먼저여야 합니다. 그리고 넣는 즉시 위 표의 빚이 살아나 그 뒤 새 PR 을 여는 사람부터 가드에 닫힙니다.
참고
- 가드 신설 chore(ci): 리뷰 적체 가드 신설 — 미처리 리뷰 요청이 있으면 새 PR 을 닫는다 #1136 / 재요청 조건 도입 fix(ci): 재리뷰 요청이 있을 때만 리뷰 빚으로 센다 [base: develop] #1206 / 최신 판정만 보기 fix(ci): 마지막 결정 리뷰만 리뷰 빚으로 판정한다 #1211 / 등록 시에만 검사 fix(ci): 리뷰 부채를 PR 등록 시에만 검사한다 #1225
- 실측 run — 33226967880 (fix(mindrecord): 본문 링크에 스킴 제한과 이스케이프를 세운다 (#1067) #1449, 통과), 33225233570 (refactor(core): domain 3모듈을 순수 JVM 으로 — 안드로이드 SDK 를 타입으로 차단 (#1151) #1440, 통과)
- 표는 2026-08-29 01:5x 기준입니다. fix(afternote): 상세·수신자 화면이 재진입 시 데이터를 다시 조회한다 (#701) #1374 는 그 직후 01:53 에 재요청이 걸려 지금은 빚으로 성립합니다 — 손으로 걸어야만 성립한다는 사실 자체가 이 이슈의 근거입니다.
Activity
github-actions commentedon Aug 29, 2026
bug 이슈는 사이드바 Fields > Priority 로 심각도를 지정해야 합니다. 판정 기준:
등록 후 24시간이 지나도 비어 있으면 자동으로 닫습니다. 닫힌 뒤에는 값을 지정하고 다시 열어 주세요.
fix(ci): 소문자 변환을 로케일 안전한 문자 클래스로 (#1450)
Merge pull request #1451 from Afternote/fix/1450-rereview-automation