fix(ci): protect current review evidence from stale runs - #1899
fix(ci): protect current review evidence from stale runs#1899seonghobae wants to merge 11 commits into
Conversation
|
Warning Review limit reachedNext included review available in 37 minutes. View limit detailsLimit details: You’ve used the included review currently available. You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. Review configuration: ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Team Run ID: 📒 Files selected for processing (17)
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. Comment |
구형 main 검증 2건의 종료 확인2026-09-05 10:44 UTC에 primary가 일반 cancel API로 아래 두 실행만 정리했습니다. 취소 직전에 event=
같은 workflow와 branch의 후속 33933530334는 단순히 현재 main의 조상이라는 이유만으로 취소하지 않았습니다. 같은 workflow의 더 새로운 실행을 추가 확인했으며, 최신 eligible Strix 33956092119의 새 workflow나 dispatch, force-cancel, ruleset 변경은 없었습니다. 현재 PR·배포·릴리스·이미지·마이그레이션 작업은 취소하지 않았습니다. Noema 영구 수정은 이 PR의 branch-push concurrency 변경입니다. 수동 종료 2건은 그 미병합 수정의 효과나 조직 전체 60-job ceiling 해소를 입증하지 않습니다. #1922의 공통 CI 복구를 실제 main에서 받은 뒤 이 PR의 새 exact head를 다시 검증합니다. |
사용자가 명시한 Actions chicken-and-egg 복구 예외를 이 CI 수정에만 적용한다. 기존 main의 CI-only fixture 실패를 제거하고 같은 단일 품질 workflow에서 scheduler 변경의 trigger/selector 누락을 복구한다. 운영 코드, 의존성, 권한, 보안 검사와 보호 규칙은 변경하지 않는다. Exact head f7f11af: 일반/CI 각 2890 passed, 1 LLVM-host skip, 21 subtests. 지정 CI coverage 658 statements/222 branches 100%, 문서화 100%, actionlint/ShellCheck 통과. 독립 소스 검토 후 두 지적을 반영했다. Hosted required Checks는 대기 상태이며 GitHub 승인 완료나 일반 보호 병합으로 주장하지 않는다. #1899/#1900은 실제 main 채택 후 자체 exact-head 검증을 다시 수행해야 한다. 전체 41개 목표의 완료 증거가 아니다. Co-Authored-By: Codex <noreply@openai.com>
Co-Authored-By: Codex <noreply@openai.com>
|
I filed #1917 for the stale comment at @@ -511,14 +512,9 @@ jobs:
- # bootstrap group is now `cancel-in-progress: false` (see its own comment):
- # nothing is ever preempted there, by design, to structurally close the
- # #1568 stale-cancels-fresh race regardless of arrival order. This job
+ # Native concurrency coalesces first attempts; this cleanup also reachesThat is the whole defect: the file has exactly one Two additions to consider while these two comment blocks are already open. Both are one sentence; neither changes behaviour. 1. The forward-looking instruction (
2. The expiry condition (
Writing down what would make this wrong is what the removed comment lacked — it was not false when written, it just carried no condition, so nothing flagged it when the design changed underneath. Separately — a cross-PR pairing worth knowing about. This PR implements rerun isolation in the group key: #1885 ( 🤖 Generated with Claude Code |
One conflicted file, one block: REVIEW_DISPATCH_BLOB_SHA in tests/test_pr_review_autofix_nvidia_nim_contract.py. The pin is git hash-object on .github/workflows/opencode-review-dispatch.yml. Both sides are correct for their own tree and both wrong for this merge - the branch claims fec6de0, main claims 26e8555 - so neither was taken. Recomputed from the merged file: ba81fa1. Everything else in this PR (the rerun concurrency isolation, its doctoring record, and the queue-contract additions) merged cleanly. Evidence: - uvx ruff check --select F821 scripts/ci tests: All checks passed - full suite, branch head 623891f (unmerged): 2960 passed, 0 failed - full suite, this merge: 2974 passed, 0 failed - the PR's own oracle (test_review_rerun_concurrency.py plus the autofix, queue-contract and opencode shell-syntax contracts): 129 passed - coverage: TOTAL 100%; interrogate: PASSED (minimum 100.0%) Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
현재 검증 — main 통합 후 원격 반영
623891f2e74af44ff244b7d9e3ed397e7440a6c8; tree:d77c91b7c7b8ecd829c5abbca1a6877ca7af8cfb.7c7e611280902c381dc5773cd525473b04810254와 실제 mainf250638827f8252b0d9e5cb2601f4d333f96162f입니다. push 직전 로컬 head·원격 head·추적 파일의 변경 없음을 확인하고 이력 재작성 없이 반영했습니다. 미추적uv.lock은 보존하고 커밋에서 제외했습니다.GITHUB_ACTIONS=true전체 검사: 2,960 passed, 1 skipped, 21 subtests passed, 117.42초, exit 0. 기존 review-repair 4개 모듈은 **658 statements / 222 branches / missing 0 / partial 0 / 100%**이며 관련 5개 파일의 docstring도 100%입니다.011a6d15e749bb3f2d771eed9c7aa0e7e3e10ee7을 사용했습니다. 시스템 설치나 프로젝트 의존성 변경은 없습니다.실행 명령:
아래에는 이전 head에서 실제로 재현한 실패와 수정 이력을 보존했습니다. 과거의 미해결 표시는 해당 head 기준이며 위 통합 결과를 대신하지 않습니다.
변경 목적
G-02/G-03 후속 수정입니다. 오래된 Actions 실행을 재실행하면 최신 PR 실행과 같은 동시성 그룹에 들어가 최신 검증을 취소할 수 있었습니다. 작업 내부의 최신 HEAD 확인은 이 취소보다 늦어 충돌을 막지 못합니다.
Strix·Noema·Required OpenCode의 workflow 그룹, Strix 정리 job, 중앙 OpenCode 실행 job 등 5곳에서 두 번째 시도부터
rerun-<run_id>그룹을 사용합니다. 첫 실행의 workflow/대상 저장소/PR별 중복 정리와cancel-in-progress: true는 유지합니다. OpenCode 검토 결과 도착 후rerun-failed-jobs로 재개하는 경로도 유지합니다.job·의존성·권한·모델 설정·보안 예외를 추가하지 않았습니다. 필요한 스킬과 운영 절차를 정리한 문서 PR #1885와 분리된 실제 workflow 수정입니다.
실제 REST 응답에서는 오래된 실행의
head_sha가 그대로인데pull_requests[].head.sha만 최신 값으로 바뀌는 사례도 확인했습니다. 같은 HEAD 중복 정리의 공통 판정 함수가 이런 연결 정보만으로 오래된 실행을 최신 증거로 인정하지 않도록 수정했습니다. 실행 환경의GITHUB_SHA와 REST 실행 revision은 별개입니다. 실행 ID와 전체 SHA를 남긴 RCA에 읽기 전용 관측과 한계를 기록했습니다.기존 Required OpenCode·Strix 정리 경로에는 갱신된 PR 연결 정보 때문에 오래된 실행을 최신 실행으로 잘못 보존하는 역방향 문제도 있었습니다. 목록 선택과 취소 직전 정확한 실행 조회에서 같은 jq 조건을 재사용합니다. 활성 상태·대상 PR·workflow·event·기록된 SHA를 확인하고, ID 불일치·잘못된 JSON·알 수 없는 상태나 revision이면 취소하지 않습니다. OpenCode의 현재 PR은 열림·비-Draft·동일 HEAD여야 합니다. Strix의 명시적인 종료/Draft 정리는 유지합니다. 성공 로그도 취소 완료가 아닌 요청 성공으로 고쳤습니다.
첫 branch push의 Strix 실행도 저장소와 전체 ref로 묶었습니다. 실제 main의 서로 다른 세 SHA 실행이 2026-09-05 08:28:26–08:45:01 UTC에 겹쳤고, 당시 식은 push마다 별도 run ID를 사용했습니다. 새 식은 PR 그룹과 재실행 격리를 유지하며, tag·schedule·manual·비-PR dispatch·누락 ref는 서로 분리합니다. 새 job·sleep·정리 API는 추가하지 않았습니다. 이는 새 workflow 버전의 향후 중복 예방이며 기존 실행의 취소나 60-job ceiling 해소 증거가 아닙니다.
이전 커밋 검증 — HEAD 7c7e611
검증 HEAD는
7c7e611280902c381dc5773cd525473b04810254입니다.1d422702790a200224a76da401cb1fed085448bd에 현재 main7fcada597d5b79bdb14445f24322b2c9f6ed4b19을 일반 merge했습니다. main에서 추가된 AGENTS.md·CLAUDE.md 지침을 보존했으며 이력을 재작성하지 않았습니다.fec6de078c2f206bcd82a99638d0b5e2867a05cb인데 테스트 상수가 이전ade10b37c43d0f2b46490b2196c893244afc3d49를 유지해 2 failed를 재현했습니다. 현재 main에서는 이전 해시가 정확하므로 이 PR의 동반 갱신 누락입니다.uv run pytest tests -q -ra: 2,953 passed, 1 skipped, 21 subtests passed in 171.12s, exit 0. 전체 로그에 Timeout/Fatal/Warn/Denied 신호가 없음을 별도로 확인했습니다. skip 한 건은 이 macOS에 고정 경로의 LLVM 19 도구가 없어 Linux 전용 허용 경로를 실행하지 못한 것으로, 통과에 포함하지 않았습니다.GITHUB_ACTIONS=true로 doctoring의 16파일 집중 검사를 실행한 결과는 2 failed, 734 passed, 1 skipped in 72.04s, exit 1입니다. 따라서 이 PR은 CI clean이 아닙니다.test_inspect_pr_closes_empty_pull_request_even_if_the_comment_call_fails와test_main_reconciles_the_durable_admission_gate_when_a_state_path_is_given입니다. 별도 clean worktree의 main7fcada597d5b79bdb14445f24322b2c9f6ed4b19에서도 같은 두 실패를 재현했습니다. 하나는 가짜run(args)의 누락된 키워드 인자이고 다른 하나는 실제 SHA 검증 경로로 들어간 합성head값입니다.64bf199b468ecf271819c7739e9ce109822268d0가 바로 이 두 fixture의 startup-recovery 경계를 격리합니다. 소스 diff를 확인했으며 #1899에서 복제하지 않았습니다. #1922의 보호 병합 이후 main을 승계하고 최종 HEAD에서 CI 환경 검사까지 다시 통과해야 합니다. 그 전에는 hosted Checks 대기와 별도로 이 재현 가능한 실패가 남습니다.uv.lock은 보존하고 커밋에서 제외했습니다.이전 커밋 검증 — HEAD 1d42270
a01ffc1edee2e5fc9c56e4351f90a0ce4a75e77b. 원래 작업 기준6d7fbebec8aec31d88a30a36e71ca5b3925d241d에서 전진한 커밋을 이력 재작성 없이 승계한 뒤 다시 검사했습니다.1d422702790a200224a76da401cb1fed085448bdeval이나 새 패키지를 쓰지 않습니다.51345839f78d269ecf192aa386f1679508581a32에서 취소 로직의 별도 3파일 테스트 57 passed, 문장·분기 커버리지 100%(252 statements, 118 branches)를 확인했습니다. 이 3파일 테스트는 최신 705개 실행에도 포함됐지만 coverage 명령은 새 HEAD에서 다시 실행하지 않았습니다. 다른 PR·저장소·base·진행 상태 보호도 유지합니다.Required OpenCode Review호출이OpenCode Review Dispatch실행을 찾는 조합을 검증합니다.git diff --check통과. 기본 actionlint 1.7.12는 외부 검사기 입력 전달 중 멈춰 통과로 계산하지 않았습니다. 원인이 수정된 공식 upstream011a6d15e749bb3f2d771eed9c7aa0e7e3e10ee7을 격리 빌드해 확인했습니다. 같은 기존 진단 29건을 head/base에서 확인한 뒤, 불필요한 패턴·중복 redirect·파일 탐색을 정리하고 의도된 literal에만 명령 단위 annotation을 붙였습니다. 최신 변경을 포함한 네 workflow의 ShellCheck 포함 전체 actionlint: exit 0, 출력 없음. 시스템 설치·프로젝트 의존성·hosted gate 변경은 없습니다.printf를 끊은 실수는 메인 검토에서 발견해 커밋 전에 제거했습니다. 실제 본문 생성 함수를 Bash로 실행하는 테스트에서## Findings: command not foundRED 후 GREEN을 확인했습니다. lint 통과와 실제 셸 실행 검증은 구분했습니다.uv.lock은 커밋에서 제외했습니다.남은 검증과 한계
격리된 오래된 재실행은 새 첫 실행이 직접 취소하지 못합니다. 기존 정리 경로가 runner를 확보한 뒤 회수합니다. 중앙 OpenCode는 scheduler가 dispatch 단계까지 도달해야 정리하므로 Strix 대기나 조기 반환 시 즉시 회수되지 않을 수 있습니다. 정리 API 요청을 검증한 테스트는 GitHub의 실제
completed/cancelled상태를 입증하지 않습니다.뒤늦게 도착한 첫 실행의 순서 역전은 별도 미해결 항목입니다. 이미 생성된 실행은 원래 workflow 버전을 재사용하므로, 보호 병합 뒤 새 버전으로 생성된 실행에서 오래된 PR 이벤트를 재실행하고 최신 실행이 보존되는지 확인해야 합니다.
hosted lint·보안 Checks, 최신 HEAD의 독립 승인, 정상 보호 병합과 실행 증거가 남았습니다. Admin 우회는 요청하지 않습니다. 이 로컬 수정으로 전체 41개 목표의 완료 수를 올리지 않습니다.
근거와 인계
GitHub 공식 concurrency 문서, context 문서, 재실행 문서를 확인했습니다. 구체적인 설정 결함 수정이므로 별도 논문 PDF는 추가하지 않았습니다.
담당: Codex, 2026-09-05 KST. 다음 담당자는 위 HEAD의 Checks·검토 스레드를 새로 확인하고, 보호 병합 이후 새 workflow 버전의 실제 재실행 보존 증거를 남겨야 합니다. 정리 작업 추가나 조직 전체 순회로 runner 포화 해결을 대신하지 않습니다.
Project #1의 기존 In Progress 항목을 계속 사용합니다. CLI의 read:project 권한이 없어 실제 Edge 브라우저로 이 PR의 프로젝트 필드를 확인했고 In Progress 상태를 재확인했습니다. 이전 회차의 Mac 잠금 제한은 이번 조회에서 해소됐습니다. Done 처리는 하지 않았습니다. PR #1885는 스킬·운영 절차 담당, 이 PR은 실행 취소 안전성의 구현 담당입니다. 전체 목표의 이번 신규 완료는 **0/41(0%p)**이며, 로컬 검증·PR 갱신을 실제 적체 해소 완료로 계산하지 않습니다.