
리뷰가 찾은 경쟁 조건, 원인별로 되돌린 정체 작업
Claude 구현 · Codex 리뷰가 지침과 commit에 이름으로 남은 사건과, 멈춘 작업을 진단할 수 있게 만든 사건입니다.
May 19, 2026
할당량이 바닥나면 멈추게 한 변경을, 리뷰가 찾은 경쟁 조건까지 같은 PR에서 고쳤습니다
사람사람
행동할당량이 바닥나면 지출 중단 · 자동 fallback 없음
- 전달구현 제약→ checkpoint · halt · 수동 재개 구현 (Claude)
코딩 에이전트Claude
행동checkpoint · halt · 수동 재개 구현
- 전달같은 PR 리뷰→ 지적: 경쟁 조건 · 중복 상태 전이 (Codex)
리뷰 · 검증Codex
관측 · 지적지적: 경쟁 조건 · 중복 상태 전이
- 되돌린 지적race · idempotency→ 같은 PR에서: row lock · 고유 점수 키 · 원자적 전이 (같은 PR)
산출물같은 PR
산출물같은 PR에서: row lock · 고유 점수 키 · 원자적 전이
- 전달→ 로컬 fixture · DB 통합 검사 기록 (같은 PR)
산출물같은 PR
산출물로컬 fixture · DB 통합 검사 기록
- 기록된 실행 아님확인한 범위→ 새 CI · 운영 배포 결과는 수집 안 함 (같은 PR)
산출물같은 PR
지침 · 미확인새 CI · 운영 배포 결과는 수집 안 함
- 배경
- 사람이 정한 조건은 할당량이 바닥나면 지출을 멈추고 자동 fallback을 하지 않는 것이었습니다. Claude가 checkpoint · halt · 수동 재개를 구현했고, 프로젝트 MCP로 실행한 Codex 리뷰가 상태 전이의 경쟁 조건과 중복을 찾았습니다.
- 결과
- 진입 · 재개 상태 전이를 잠금 안에서 처리하고, 판정 점수에 고유 키를 두어 중복을 막고, 트랜잭션 경계를 정했습니다. 모든 경쟁 조건을 없앴다는 뜻은 아닙니다.
- 한계
- commit에는 검사 140개, 이후 통합 CHANGELOG에는 160개가 적혀 있어 하나의 실행 수로 합치지 않았습니다. 지침상 Codex 리뷰는 로컬 선택 사항이므로, 모든 과거 PR이 이 리뷰를 거쳤다는 뜻이 아닙니다.
근거와 남은 한계
- 지침은 Claude 구현, 프로젝트 MCP를 통한 Codex 로컬 리뷰, PR에 리뷰 첨부, 의견이 다르면 Claude의 리뷰 에이전트와 함께 조사하는 순서를 적어 둡니다. CI에서 자동으로 Codex 리뷰를 다는 것은 미뤄 둔 상태였습니다.
- 개발 검사는 fixture와 mock을 쓰고, 실제 모델 호출은 범위를 따로 정해야 합니다. 리뷰 지적은 같은 PR에 접어 넣고 feature → main으로 squash 병합합니다.
May 26, 2026
멈춘 작업을 진단할 수 있게 만들고, 원인별로 되돌렸습니다
개발 대상번역 worker · 큐
관측 · 지적draft에 남은 작업 · 시도 소진
- 전달관측값→ failedReason · 종료 코드 · draft 상태 대조 (개발자)
사람개발자
행동failedReason · 종료 코드 · draft 상태 대조
- 전달→ 원인: 상속된 NODE_OPTIONS가 하위 프로세스에서 충돌 (개발자)
사람개발자
관측 · 지적원인: 상속된 NODE_OPTIONS가 하위 프로세스에서 충돌
- 되돌린 지적상속된 옵션 충돌→ NODE_OPTIONS 제거 · 프로세스 단위 동시 실행 상한 (코드 변경)
작업 세션코드 변경
행동NODE_OPTIONS 제거 · 프로세스 단위 동시 실행 상한
- 전달→ 큐 상태: waiting · active · failed · stale (코드 변경)
작업 세션코드 변경
행동큐 상태: waiting · active · failed · stale
- 전달→ stale sweep: 큐에 없음 vs 시도 소진, 결과 유무로 분기 (코드 변경)
작업 세션코드 변경
행동stale sweep: 큐에 없음 vs 시도 소진, 결과 유무로 분기
- 전달한 사이클→ 개발 환경 sweep: 후보 200 → 전이 106 · 재등록 2 · 오류 0 (산출물)
산출물산출물
산출물개발 환경 sweep: 후보 200 → 전이 106 · 재등록 2 · 오류 0
- 기록된 실행 아님해석의 경계→ 106건은 번역 성공이 아님 (산출물)
산출물산출물
지침 · 미확인106건은 번역 성공이 아님
- 배경
- BullMQ의 failedReason, 하위 프로세스 종료 코드, draft로 남은 상태를 대조해 상속된 NODE_OPTIONS가 하위 프로세스에서 충돌하는 것을 찾았습니다. 그 뒤 같은 상황을 큐 상태로 볼 수 있게 했습니다.
- 결과
- 정체 작업은 큐에 아예 없는 경우와 시도를 다 쓴 경우로 나뉘고, 시도를 다 쓴 작업은 결과가 있는지에 따라 needs_review나 needs_credential로 이유와 함께 옮겨집니다. 사람 검토는 그대로 남습니다.
- 한계
- 동시 실행 상한은 프로세스 단위입니다. 검토한 자료에서 원본 실행 로그를 확보하지 못했고, 당시 모델과 effort가 확인되지 않아 지연 개선 수치는 싣지 않았습니다. 빌드 · 릴리스 코드의 존재는 공개 배포 근거가 아닙니다.
근거와 남은 한계
- CHANGELOG에 병렬 adapter 브랜치를 제안한 기록은 있지만, 실제 병렬 실행의 기록으로 바꾸지 않았습니다.
- 200건 중 나머지는 이 기록에서 세부 분류하지 않았습니다.