기존 Cotton 로고에서 배경과 글자를 제거한 웃는 목화 캐릭터
전시실로

Cotton

Translation workflow

생성된 번역을, 검토 가능한 결과로.

게임 대사를 번역하는 워크플로입니다.

2026.05.06 — 2026.05.26

업무 프로젝트 · 번역 처리·판정·검토 경로

  • 웹 앱구현 · 개발 환경

리뷰가 찾은 경쟁 조건, 원인별로 되돌린 정체 작업

Claude 구현 · Codex 리뷰가 지침과 commit에 이름으로 남은 사건과, 멈춘 작업을 진단할 수 있게 만든 사건입니다.

범례 전체

읽는 법 · 모든 사건에 같은 규칙

  • 세로 열은 누가 했는지, 위에서 아래로는 시간 순서
  • 실선: 기록된 전달 · 다음 단계
  • 굵은 남색 선 ↩: 작업을 되돌려 보낸 지적
  • 점선: 기록된 실행이 아님 (지침 · 권한 없는 가설 · 확인 안 한 경계)
  • 사각형: 행동
  • 둥근 칸: 관측된 상태 · 지적
  • 접힌 모서리: 산출물 · 증거
  • 빗금 열: 개발 대상 제품 안의 구성 요소 (개발에 쓴 에이전트가 아님)

사례 1 / 2 · 할당량이 바닥나면 멈추게 한 변경을, 리뷰가 찾은 경쟁 조건까지 같은 PR에서 고쳤습니다

May 19, 2026

할당량이 바닥나면 멈추게 한 변경을, 리뷰가 찾은 경쟁 조건까지 같은 PR에서 고쳤습니다

  1. 사람사람

    행동할당량이 바닥나면 지출 중단 · 자동 fallback 없음

    • 전달구현 제약→ checkpoint · halt · 수동 재개 구현 (Claude)
  2. 코딩 에이전트Claude

    행동checkpoint · halt · 수동 재개 구현

    • 전달같은 PR 리뷰→ 지적: 경쟁 조건 · 중복 상태 전이 (Codex)
  3. 리뷰 · 검증Codex

    관측 · 지적지적: 경쟁 조건 · 중복 상태 전이

  4. 산출물같은 PR

    산출물같은 PR에서: row lock · 고유 점수 키 · 원자적 전이

    • 전달→ 로컬 fixture · DB 통합 검사 기록 (같은 PR)
  5. 산출물같은 PR

    산출물로컬 fixture · DB 통합 검사 기록

    • 기록된 실행 아님확인한 범위→ 새 CI · 운영 배포 결과는 수집 안 함 (같은 PR)
  6. 산출물같은 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

멈춘 작업을 진단할 수 있게 만들고, 원인별로 되돌렸습니다

  1. 개발 대상번역 worker · 큐

    관측 · 지적draft에 남은 작업 · 시도 소진

    • 전달관측값→ failedReason · 종료 코드 · draft 상태 대조 (개발자)
  2. 사람개발자

    행동failedReason · 종료 코드 · draft 상태 대조

    • 전달→ 원인: 상속된 NODE_OPTIONS가 하위 프로세스에서 충돌 (개발자)
  3. 사람개발자

    관측 · 지적원인: 상속된 NODE_OPTIONS가 하위 프로세스에서 충돌

  4. 작업 세션코드 변경

    행동NODE_OPTIONS 제거 · 프로세스 단위 동시 실행 상한

    • 전달→ 큐 상태: waiting · active · failed · stale (코드 변경)
  5. 작업 세션코드 변경

    행동큐 상태: waiting · active · failed · stale

    • 전달→ stale sweep: 큐에 없음 vs 시도 소진, 결과 유무로 분기 (코드 변경)
  6. 작업 세션코드 변경

    행동stale sweep: 큐에 없음 vs 시도 소진, 결과 유무로 분기

    • 전달한 사이클→ 개발 환경 sweep: 후보 200 → 전이 106 · 재등록 2 · 오류 0 (산출물)
  7. 산출물산출물

    산출물개발 환경 sweep: 후보 200 → 전이 106 · 재등록 2 · 오류 0

    • 기록된 실행 아님해석의 경계→ 106건은 번역 성공이 아님 (산출물)
  8. 산출물산출물

    지침 · 미확인106건은 번역 성공이 아님

배경
BullMQ의 failedReason, 하위 프로세스 종료 코드, draft로 남은 상태를 대조해 상속된 NODE_OPTIONS가 하위 프로세스에서 충돌하는 것을 찾았습니다. 그 뒤 같은 상황을 큐 상태로 볼 수 있게 했습니다.
결과
정체 작업은 큐에 아예 없는 경우와 시도를 다 쓴 경우로 나뉘고, 시도를 다 쓴 작업은 결과가 있는지에 따라 needs_review나 needs_credential로 이유와 함께 옮겨집니다. 사람 검토는 그대로 남습니다.
한계
동시 실행 상한은 프로세스 단위입니다. 검토한 자료에서 원본 실행 로그를 확보하지 못했고, 당시 모델과 effort가 확인되지 않아 지연 개선 수치는 싣지 않았습니다. 빌드 · 릴리스 코드의 존재는 공개 배포 근거가 아닙니다.
근거와 남은 한계
  • CHANGELOG에 병렬 adapter 브랜치를 제안한 기록은 있지만, 실제 병렬 실행의 기록으로 바꾸지 않았습니다.
  • 200건 중 나머지는 이 기록에서 세부 분류하지 않았습니다.