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

Cotton

Translation workflow

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

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

2026.05.06 — 2026.05.26

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

  • 웹 앱구현 · 개발 환경

Cotton vocabulary

Lens
Refinement Loop
Translation
Quality Estimation
Workflow
Job Control
Human Review
  1. prompt layers
  2. glossary
  3. generation
  4. revision
  1. judge
  2. hard gate
  3. score
  1. intake
  2. checkpoint
  3. spend control
  4. stale sweep
  1. approval
  2. correction
  3. audit trail

Prompt Layers: SYSTEM_PROMPT_L0 · buildTranslateUserMessage · L1 CONTRACT · L3 SPEAKER · L6 SOURCE · L7 INSTRUCTION · ICU PLACEHOLDER · INLINE TAG · TARGET TEXT ONLY · FORCED MAPPING · L2 GLOSSARY · speaker_keyGlossary: glossary_term · fetchGlossaryHits · canonical_form · forbidden_translations · SUBSTRING MATCH · FORCED MAPPING · FORBIDDEN ALTERNATIVE · L2 GLOSSARY · glossary_hits · glossary_complianceGeneration: AdapterRegistry · anthropic-sdk · openai-sdk · claude-local · codex-local · llm_plan · PIVOT_VIA · shouldPivot · COTTON_ADAPTER_CONCURRENCY · NODE_OPTIONS · pivot_register_carry · translation.refinedRevision: buildTranslateUserMessage · L7 INSTRUCTION · runRefinementLoop · priorAttempt · priorCritique · REJECTED BY THE JUDGE · maxTurns · willRetry · RefinementHooks · HOOK ABORT · turn_count_to_final · critique_for_retry · failingDimensions · cost_ceiling_usd · needs_reviewJudge: glossary_hits · runJudge · JUDGE_SYSTEM_PROMPT · judgeModel · TEMPERATURE 0 · parseJudgeResponse · FOUR-SECTION XML · VERBATIM CHUNKS · severity · critique_for_retry · judge_citation · missingHardGates · TRIGGER ABSENT = PASS · judge.scoredHard Gate: ICU PLACEHOLDER · INLINE TAG · FORBIDDEN ALTERNATIVE · hard_gate_fail · hardGatePassed · glossary_compliance · cps_budget_compliant · icu_validity · inline_tag_preserved · length_constraint · HARD GATE FIRST · missingHardGates · TRIGGER ABSENT = PASSScore: HARD GATE FIRST · computeVerdict · cottonEvalScore · WEIGHTED AVERAGE · tone_register · personality_consistent · emotional_state_match · cultural_marker_preserved · accuracy · pivot_register_carry · auto_approve_threshold · failingDimensions · approval_gate · judge.scoredIntake: processXlsxBytes · classifySheetName · parseGoogleSheetsUrl · source_file · content_sha256 · extractStageDirection · speaker_key · ingest_session · segment.ingested · github.push.receivedCheckpoint: translation_progress · last_completed_step · turn_translated · turn_judged · finalized · jobEntryGuard · SELECT FOR UPDATE · attempt_count · DEFAULT_MAX_RESUME_ATTEMPTS · TWO-TX SPLIT · ON CONFLICT DO NOTHINGSpend Control: llm_plan · costCap · cost_ceiling_usd · rateLimit · FailoverDispatcher · haltOnQuota · detectQuotaFromStream · quota_daily_exhausted · auth_revoked · NO AUTO-SWAP · needs_credential · POST /:id/resumeStale Sweep: COTTON_ADAPTER_CONCURRENCY · NODE_OPTIONS · attempt_count · runStaleSweep · STALE_THRESHOLD_INTERVAL · DLQ_ATTEMPT_CAP · LIMIT 200 · re_enqueued · dead_lettered · ORPHAN RE-ENQUEUE · IN-FLIGHT SET · /health/queues · maxStalledCount · needs_reviewApproval: auto_approve_threshold · ingest_session · SELECT FOR UPDATE · needs_credential · POST /:id/resume · POST /:id/approve · POST /:id/unapprove · POST /:id/reject · APPROVE_FROM · REJECT_FROM · needs_review · reviewer_id · HITL · approval_gate · translation.approved · EDIT & APPROVE · actor_idCorrection: POST /:id/correct · corrected_text · CORRECT_FROM · EDIT & APPROVE · human_corrected_segments · human-corrected-after-mt · translation.human_corrected · supersedes · NEW REVISION · IMMUTABLE HISTORYAudit Trail: turn_count_to_final · severity · judge_citation · content_sha256 · segment.ingested · github.push.received · translation.approved · human_corrected_segments · translation.human_corrected · IMMUTABLE HISTORY · event_log · appendNextEvent · ULID · AGGREGATE VERSION · translation_state_log · actor_id · llm_call_log · telemetryHook · judge.scored · translation.refined

번역 점수, 재시도, 사람 검토를 각자의 경계에 둡니다.

용어집을 생성과 판정에 함께 주고, 판정 모델이 보고한 hard gate 실패가 평균 점수로 상쇄되지 않게 했습니다. 번역과 판정의 중간 상태를 남기며 재시도 · 비용 한도와 자격 소진을 구분하고, 정체 작업은 원인에 따라 큐나 검토로 되돌립니다.

번역 생성, 모델의 품질 판정, 재시도와 사람 검토를 한 흐름으로 잇는 업무 프로젝트입니다.

저장소 시작부터 참여 기간 중 확인한 작업까지

번역 편집 · 승인 화면, API, 작업 처리기로 이루어진 웹 앱으로, 개발 환경에서 동작합니다.

판정 흐름 구성도 · 비공개 구현 기록 기준
Cotton 번역 판정 · 재시도 · 복구API는 원문과 목표 언어를 DB에 커밋한 뒤 목표 언어마다 작업을 큐에 넣습니다. worker는 행을 잠가 시도를 확인하고 draft와 진행 상태를 만든 뒤, 같은 용어집으로 번역을 생성하고 판정 모델을 따로 부릅니다. 번역(Tx1)과 판정 · 근거(Tx2)는 서로 다른 트랜잭션으로 남습니다. 코드가 판정을 집계해 hard gate 실패를 평균으로 상쇄하지 않고, 통과하면 확정, 못 하면 다음 turn, turn · 비용 한도면 사람 검토, quota · 인증 신호면 지출을 멈추고 자격 확인으로 둡니다. 정체 점검은 10분 넘은 draft를 최대 200건 보고, 시도가 남았는데 큐에 없으면 다시 넣고, 시도를 다 썼으면 결과 유무에 따라 검토나 자격 확인으로 보냅니다.원문 · 목표 언어저장된 세그먼트사람 검토needs_review · 승인 아님자격 확인needs_credentialAPI · 작업 등록커밋 뒤 작업 등록작업 큐BullMQ · 작업 ID작업 진입행 잠금 · 시도 확인용어집 · 문맥워크스페이스 용어집번역 turn번역 생성 · 모델 호출판정 모델 호출 · 파싱판정 집계hard gate · 가중 평균재시도 · 지출 판단turn · 비용 · quota번역 상태draft · 진행 상태번역 · 판정 기록상태 · 호출 기록결과 확정확정 트랜잭션큐 대조큐 상태 대조정체 점검10분 넘은 draft · 최대 200입력 · 큐생성 · 판정상태 · 수락복구 · 사람 결정1원문2커밋 뒤3작업 전달4진행 행5시도 허용1용어집2같은 용어집3Tx1 · 번역4Tx2 · 판정5점수 · gate6판정7pass8확정 기록1판정2다음 turn3한도 · 중단4quota · 인증5수동 재개1정체 draft2상한 미만3재등록4결과 있음5결과 없음

등록 → 진입

DB 커밋 뒤 큐에 넣고, worker가 행을 잠가 시도를 확인한 뒤 draft를 만듭니다.

  1. 원문 · 목표 언어데이터: 원문커밋 뒤 작업 등록API · 작업 등록

    원문 세그먼트와 프로젝트의 목표 언어가 DB에 저장됩니다. 고객 데이터는 싣지 않습니다.

  2. 커밋 뒤 작업 등록API · 작업 등록데이터: 커밋 뒤BullMQ · 작업 ID작업 큐

    DB 커밋이 끝난 뒤 활성 목표 언어마다, 요청 단위로 정해진 ID의 작업을 넣습니다. 등록이 실패하면 경고만 남고 커밋은 되돌리지 않습니다(원자적 outbox 없음). 그래서 정체 점검이 필요합니다.

  3. BullMQ · 작업 ID작업 큐실행 · 판정: 작업 전달행 잠금 · 시도 확인작업 진입

    BullMQ가 worker에 작업을 비동기로 넘깁니다.

  4. 행 잠금 · 시도 확인작업 진입데이터: 진행 행draft · 진행 상태번역 상태

    트랜잭션 안에서 진행 행을 잠그고 draft 번역을 만듭니다. 이미 확정됐거나 자격 문제로 멈춘 작업의 자동 재시도는 건너뛰고, 수동 요청은 따로 다룹니다.

  5. 행 잠금 · 시도 확인작업 진입실행 · 판정: 시도 허용번역 생성 · 모델 호출번역 turn

    시도 횟수를 한도 안에서 하나 올린 뒤 번역 turn을 시작합니다.

생성 → 판정 → 확정

같은 용어집으로 생성 · 판정하고, 번역과 판정을 따로 기록한 뒤 코드가 판정을 집계해 확정합니다.

  1. 워크스페이스 용어집용어집 · 문맥데이터: 용어집번역 생성 · 모델 호출번역 turn

    워크스페이스 용어집과 문맥을 찾아 번역 생성에 넣습니다.

  2. 워크스페이스 용어집용어집 · 문맥데이터: 같은 용어집판정 모델 호출 · 파싱번역 turn

    판정에도 같은 용어집 제약을 넘깁니다.

  3. 번역 생성 · 모델 호출번역 turn데이터: Tx1 · 번역번역 · 판정 기록번역 상태

    직접 또는 en-US pivot으로 모델을 불러 번역하고, 호출 · 이벤트 · 진행을 한 트랜잭션으로 남깁니다. 중단 뒤 다시 실행되면 번역 호출과 비용이 반복될 수 있습니다.

  4. 판정 모델 호출 · 파싱번역 turn데이터: Tx2 · 판정번역 · 판정 기록번역 상태

    판정 점수와 근거는 번역 × turn마다 한 번만 넣고, 중복이면 기존 행을 찾습니다. 근거 인용은 처음 넣을 때만 씁니다. 번역과 같은 트랜잭션이 아닙니다.

  5. 판정 모델 호출 · 파싱번역 turn데이터: 점수 · gatehard gate · 가중 평균판정 집계

    판정 모델의 응답을 파싱해 차원별 점수와 gate 결과를 넘깁니다. 용어집 통과 여부는 판정 모델이 보고한 값입니다.

  6. hard gate · 가중 평균판정 집계실행 · 판정: 판정turn · 비용 · quota재시도 · 지출 판단

    보고된 hard gate가 하나라도 실패면 0점 · 실패이고, 그다음에 가중 평균과 차원별 기준을 봅니다. 종합 기준 8.0은 설정 기본값이며 관측한 번역 품질이 아닙니다.

  7. turn · 비용 · quota재시도 · 지출 판단실행 · 판정: pass확정 트랜잭션결과 확정

    통과하면 translated로 확정합니다.

  8. 확정 트랜잭션결과 확정데이터: 확정 기록상태 · 호출 기록번역 상태

    후보 · 상태 · 점수 · turn을 확정하고, 진행 finalized와 상태 기록을 한 트랜잭션으로 남깁니다. translated일 때만 번역 완료 이벤트를 냅니다.

재시도 · 지출 한도

통과하지 못하면 다음 turn, 한도면 사람 검토, quota · 인증이면 지출을 멈추고 운영자의 재개를 기다립니다.

  1. hard gate · 가중 평균판정 집계실행 · 판정: 판정turn · 비용 · quota재시도 · 지출 판단

    보고된 hard gate가 하나라도 실패면 0점 · 실패이고, 그다음에 가중 평균과 차원별 기준을 봅니다. 종합 기준 8.0은 설정 기본값이며 관측한 번역 품질이 아닙니다.

  2. turn · 비용 · quota재시도 · 지출 판단실행 · 판정: 다음 turn번역 생성 · 모델 호출번역 turn

    통과하지 못하면 이전 번역과 critique를 넣어 다음 turn을 생성합니다. hard gate 실패도 곧바로 사람에게 가지 않고, 먼저 다시 시도할 수 있습니다.

  3. turn · 비용 · quota재시도 · 지출 판단실행 · 판정: 한도 · 중단사람 검토

    turn을 다 쓰거나 비용 상한에 닿으면 needs_review로 확정합니다. finalized는 처리가 끝났다는 뜻이지 사람이 승인했다는 뜻이 아닙니다.

  4. turn · 비용 · quota재시도 · 지출 판단실패 · 한도: quota · 인증자격 확인

    quota나 인증 신호가 오면 지출을 멈추고 needs_credential로 둡니다. 다른 계정이나 공급사로 자동 전환하지 않습니다. 멈춤 신호가 아닌 전송 오류는 BullMQ 재시도로 넘깁니다.

  5. 자격 확인실행 · 판정: 수동 재개BullMQ · 작업 ID작업 큐

    자격을 확인한 운영자가 명시적으로 다시 시작합니다.

정체 작업 복구

오래된 draft를 이유별로 나눠, 큐에 없으면 다시 넣고 시도를 다 썼으면 사람의 결정으로 보냅니다.

  1. draft · 진행 상태번역 상태관측 · 보고: 정체 draft10분 넘은 draft · 최대 200정체 점검

    10분 넘게 draft인 후보를 오래된 순으로 최대 200건 봅니다. 조회에 잠금이 없고 갱신 · 기록이 따로 실행되므로, 경합 없는 일괄 처리라고 쓰지 않습니다.

  2. 10분 넘은 draft · 최대 200정체 점검실행 · 판정: 상한 미만큐 상태 대조큐 대조

    시도가 상한(3회)보다 적으면 active · waiting · delayed · prioritized 큐 상태와 대조합니다. 코드에서는 시도 소진 분기가 큐 대조보다 먼저 옵니다.

  3. 큐 상태 대조큐 대조실행 · 판정: 재등록BullMQ · 작업 ID작업 큐

    큐에 없으면 같은 작업을 다시 넣습니다. API는 요청 접미사가 붙은 ID를 쓰고 점검은 세그먼트 · 언어 ID로 찾으므로, 진행 중인 모든 요청을 빠짐없이 맞춘다고 쓰지 않습니다.

  4. 10분 넘은 draft · 최대 200정체 점검실행 · 판정: 결과 있음사람 검토

    3회를 다 썼고 번역 결과가 있으면 needs_review로 보냅니다.

  5. 10분 넘은 draft · 최대 200정체 점검실행 · 판정: 결과 없음자격 확인

    3회를 다 썼는데 결과가 없으면 needs_credential로 보냅니다.

모든 연결을 같은 굵기로 보여 줍니다. 흐름을 고르면 그 경로만 번호와 함께 강조됩니다.

  • 실선 · 입력 · 결과 · 기록이 흐르는 방향
  • 파선 · 실행 · 판정 · 요청
  • 긴 점선 · 관측 · 보고, 판정과 별개
  • 짧은 파선 · 실패 · 중단 · 한도
  • 굵은 검은 선 · 고른 흐름, 번호는 순서
  • 상자 · 코드 · 상태 경계, 머리말에 이름
  • 안쪽 칩 · 그 경계의 구성 요소
  • 점선 상자 · 그 경계 밖
  • 주황 테두리 · 모델이 판단하는 곳
  • 생성 · 지출 판단 · 확정
  • 진입 · 판정 집계 · 점검
  • 큐 · 상태 · 기록
  • 등록 · 큐 대조

비공개 구현 · 개발 기록 기준으로 그렸습니다. 고객 데이터와 코드 경로는 싣지 않았습니다.

정체 점검 1회
May 26, 2026 개발환경 sweep 한 사이클: 200건 확인, 106건 상태 전환, 2건 재등록. 상태 전환은 번역 성공이 아니며, 106건의 목적 상태별 내역은 기록에 없습니다.
정확히 한 번이 아닌 이유
기록은 중복 없이 남지만, 중단 뒤 다시 실행되면 모델 호출과 비용은 반복될 수 있습니다. 동시 실행 한도도 프로세스 단위이며 클러스터 전체 한도가 아닙니다.
판정의 범위
용어집 실패를 평균이 덮지 못하게 하는 것은 보고된 gate의 집계 규칙입니다. 모든 금지어를 찾거나 원어민 수준의 품질을 증명하지 않습니다.