O personagem de algodão sorridente do logotipo original do Cotton, sem fundo nem letras
Voltar à sala

Cotton

Translation workflow

Transformar traduções geradas em resultados revisáveis.

Um fluxo de trabalho de tradução para diálogos de jogos.

2026.05.06 — 2026.05.26

Projeto de trabalho · processamento de traduções, julgamento e caminho de revisão

  • App webImplementado · desenvolvimento

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

Pontuações, novas tentativas e revisão humana, cada uma em sua própria fronteira.

Geração e julgamento compartilham o glossário, e a falha de um hard gate relatada pelo modelo juiz não pode ser compensada pela pontuação média. Os estados intermediários de tradução e de julgamento são registrados, os limites de tentativas e de custo ficam separados das credenciais esgotadas, e os jobs travados voltam à fila ou à revisão conforme a causa.

Este projeto de trabalho conecta em um único fluxo a geração de traduções, o julgamento de qualidade relatado pelo modelo, as novas tentativas e a revisão humana.

Do início do repositório ao trabalho confirmado durante o contrato

Um app web com telas de edição e aprovação de traduções, uma API e um worker de jobs, rodando no ambiente de desenvolvimento.

Mapa do fluxo de julgamento · a partir de registros de implementação privados
Cotton: julgamento de traduções · nova tentativa · recuperaçãoA API grava no banco de dados o texto de origem e os idiomas de destino, depois coloca na fila um job por idioma de destino. Um worker trava a linha, verifica a tentativa, cria o rascunho e o estado de progresso, gera uma tradução com o glossário e chama separadamente um modelo juiz com o mesmo glossário. A tradução (Tx1) e o julgamento com suas evidências (Tx2) são registrados em transações separadas. O código agrega o julgamento para que a falha de um hard gate não seja compensada pela média: uma aprovação é finalizada, uma falha ganha outro turno, o limite de turnos ou de custo a envia para revisão humana, e um sinal de cota ou de autenticação para os gastos e aguarda uma verificação de credenciais. Uma varredura de parados olha até 200 rascunhos com mais de 10 minutos: um que ainda tem tentativas mas não está na fila é recolocado na fila, e um que esgotou as tentativas vai para revisão ou para a verificação de credenciais conforme exista um resultado.Origem · idiomas de destinoSegmentos armazenadosRevisão humananeeds_review · não é aprovaçãoVerificação de credenciaisneeds_credentialAPI · registro de jobsEnfileirar após o commitFila de jobsBullMQ · ID do jobEntrada do jobLock de linha · verificação da tentativaGlossário · contextoGlossário do workspaceTurno de traduçãoGerar · chamada ao modeloChamada ao modelo juiz · parsingRegras de vereditoHard gate · média ponderadaNova tentativa · gastosTurnos · custo · cotaEstado da traduçãoRascunho · progressoLinhas de tradução · de julgamentoEstado · log de chamadasFinalizaçãoTransação finalVerificação da filaComparar o estado da filaVarredura de paradosRascunhos com mais de 10 min · máx. 200Entrada · filaGeração · julgamentoEstado · aceitaçãoRecuperação · decisão humana1origem2 após o commit · Enfileirar após o commit → BullMQ · ID do job23 entregar o job · BullMQ · ID do job → Lock de linha · verificação da tentativa34linha de progresso5tentativa permitida1glossário2 mesmo glossário · Glossário do workspace → Chamada ao modelo juiz · parsing23Tx1 · tradução4Tx2 · julgamento5 pontuações · gates · Chamada ao modelo juiz · parsing → Hard gate · média ponderada56veredito7pass8registro final1veredito2próximo turno3limite · aborto4cota · autenticação5retomada manual1rascunho parado2 abaixo do limite · Rascunhos com mais de 10 min · máx. 200 → Comparar o estado da fila23recolocar na fila4 há resultado · Rascunhos com mais de 10 min · máx. 200 → Revisão humana45sem resultado

Registro → entrada

Enfileirado após o commit no banco; um worker trava a linha, verifica a tentativa e cria o rascunho.

  1. Origem · idiomas de destinoDados: origemEnfileirar após o commitAPI · registro de jobs

    Os segmentos de origem e os idiomas de destino do projeto são armazenados no banco de dados. Os dados de clientes não são mostrados.

  2. Enfileirar após o commitAPI · registro de jobsDados: após o commitBullMQ · ID do jobFila de jobs

    Após o commit no banco, um job com um ID definido por requisição é colocado na fila para cada idioma de destino ativo. Se o enfileiramento falha, só um aviso é registrado no log e o commit não é desfeito (não há outbox atômico); por isso existe a varredura de parados.

  3. BullMQ · ID do jobFila de jobsExecução · julgamento: entregar o jobLock de linha · verificação da tentativaEntrada do job

    O BullMQ entrega o job a um worker de forma assíncrona.

  4. Lock de linha · verificação da tentativaEntrada do jobDados: linha de progressoRascunho · progressoEstado da tradução

    Dentro de uma transação, a linha de progresso é travada e uma tradução em rascunho é criada. Novas tentativas automáticas de jobs finalizados ou pausados por credenciais são puladas; pedidos manuais são tratados à parte.

  5. Lock de linha · verificação da tentativaEntrada do jobExecução · julgamento: tentativa permitidaGerar · chamada ao modeloTurno de tradução

    A contagem de tentativas sobe um dentro do limite e então o turno de tradução começa.

Gerar → julgar → finalizar

Geração e julgamento usam o mesmo glossário; a tradução e o julgamento são registrados separadamente, e o código agrega o julgamento antes de finalizar.

  1. Glossário do workspaceGlossário · contextoDados: glossárioGerar · chamada ao modeloTurno de tradução

    O glossário e o contexto do workspace são buscados e passados à geração.

  2. Glossário do workspaceGlossário · contextoDados: mesmo glossárioChamada ao modelo juiz · parsingTurno de tradução

    O julgamento recebe as mesmas restrições de glossário.

  3. Gerar · chamada ao modeloTurno de traduçãoDados: Tx1 · traduçãoLinhas de tradução · de julgamentoEstado da tradução

    O modelo é chamado diretamente ou por um pivô en-US, e a chamada, o evento e o progresso são gravados em uma única transação. Se o job rodar de novo após uma queda, a chamada de tradução e seu custo podem se repetir.

  4. Chamada ao modelo juiz · parsingTurno de traduçãoDados: Tx2 · julgamentoLinhas de tradução · de julgamentoEstado da tradução

    As pontuações e as evidências do juiz são inseridas uma vez por tradução e turno; uma duplicata encontra a linha existente, e as citações só são gravadas na primeira inserção. Não é a mesma transação da tradução.

  5. Chamada ao modelo juiz · parsingTurno de traduçãoDados: pontuações · gatesHard gate · média ponderadaRegras de veredito

    A resposta do modelo juiz é analisada em pontuações por dimensão e resultados de gates. Se o glossário passou é o que o modelo juiz relata.

  6. Hard gate · média ponderadaRegras de vereditoExecução · julgamento: vereditoTurnos · custo · cotaNova tentativa · gastos

    Qualquer falha de hard gate relatada significa zero e falha; só depois se aplicam a média ponderada e os limiares por dimensão. O limiar geral de 8.0 é um valor padrão de configuração, não uma qualidade de tradução observada.

  7. Turnos · custo · cotaNova tentativa · gastosExecução · julgamento: passTransação finalFinalização

    Uma aprovação é finalizada como translated.

  8. Transação finalFinalizaçãoDados: registro finalEstado · log de chamadasEstado da tradução

    Candidato, estado, pontuação e turnos são finalizados, e o progresso finalized e o log de estado são gravados em uma única transação. Um evento de tradução concluída só é emitido para translated.

Novas tentativas · limites de gastos

Sem aprovação, outro turno; com limite, revisão humana; com cota ou autenticação, os gastos param à espera de que um operador retome.

  1. Hard gate · média ponderadaRegras de vereditoExecução · julgamento: vereditoTurnos · custo · cotaNova tentativa · gastos

    Qualquer falha de hard gate relatada significa zero e falha; só depois se aplicam a média ponderada e os limiares por dimensão. O limiar geral de 8.0 é um valor padrão de configuração, não uma qualidade de tradução observada.

  2. Turnos · custo · cotaNova tentativa · gastosExecução · julgamento: próximo turnoGerar · chamada ao modeloTurno de tradução

    Uma tradução que não passa é gerada de novo com a tradução anterior e a crítica. Mesmo uma falha de hard gate pode ser tentada de novo primeiro, em vez de ir direto para uma pessoa.

  3. Turnos · custo · cotaNova tentativa · gastosExecução · julgamento: limite · abortoRevisão humana

    Quando os turnos acabam ou o teto de custo é atingido, o job é finalizado como needs_review. Finalizado significa que o processamento terminou, não que uma pessoa o aprovou.

  4. Turnos · custo · cotaNova tentativa · gastosFalha · limite: cota · autenticaçãoVerificação de credenciais

    Um sinal de cota ou de autenticação para os gastos e define needs_credential. Não há troca automática para outra conta ou provedor. Erros de transporte sem sinal de parada voltam para as novas tentativas do BullMQ.

  5. Verificação de credenciaisExecução · julgamento: retomada manualBullMQ · ID do jobFila de jobs

    Um operador que verificou as credenciais reinicia explicitamente.

Recuperação de jobs parados

Rascunhos antigos são separados por motivo: fora da fila, recolocação na fila; tentativas esgotadas, decisão humana.

  1. Rascunho · progressoEstado da traduçãoObservação · relatório: rascunho paradoRascunhos com mais de 10 min · máx. 200Varredura de parados

    Até 200 candidatos que estão em rascunho há mais de 10 minutos são lidos, dos mais antigos para os mais novos. A consulta não usa lock e as atualizações e logs rodam como instruções separadas, então isso não é descrito como um lote livre de condições de corrida.

  2. Rascunhos com mais de 10 min · máx. 200Varredura de paradosExecução · julgamento: abaixo do limiteComparar o estado da filaVerificação da fila

    Com menos tentativas que o limite (3), o job é comparado com os estados de fila active, waiting, delayed e prioritized. No código, o ramo de tentativas esgotadas vem antes dessa verificação da fila.

  3. Comparar o estado da filaVerificação da filaExecução · julgamento: recolocar na filaBullMQ · ID do jobFila de jobs

    Se o job não está na fila, ele é recolocado. A API usa IDs com sufixo de requisição enquanto a varredura procura o ID de segmento e de idioma, então isso não é descrito como abrangendo toda requisição em andamento.

  4. Rascunhos com mais de 10 min · máx. 200Varredura de paradosExecução · julgamento: há resultadoRevisão humana

    Com as 3 tentativas usadas e um resultado de tradução presente, o job vai para needs_review.

  5. Rascunhos com mais de 10 min · máx. 200Varredura de paradosExecução · julgamento: sem resultadoVerificação de credenciais

    Com as 3 tentativas usadas e nenhum resultado, o job vai para needs_credential.

Todas as conexões com a mesma espessura. Escolha um fluxo para destacar só o caminho dele, com etapas numeradas.

  • Contínua · direção de entradas, resultados e registros
  • Tracejada · execução, julgamento, requisição
  • Pontos longos · observação e relatório, à parte do julgamento
  • Traços curtos · falha, parada, limite
  • Linha preta grossa · o fluxo selecionado; os números dão a ordem
  • Caixa · fronteira de código ou de estado, com o nome no cabeçalho
  • Chip interno · componente dessa fronteira
  • Caixa pontilhada · fora dessa fronteira
  • Contorno laranja · onde um modelo decide
  • Geração · gastos · finalização
  • Entrada · regras de veredito · varredura
  • Fila · estado · registros
  • Registro · verificação da fila

Desenhado a partir de registros privados de implementação e desenvolvimento. Dados de clientes e caminhos de código não são mostrados.

Uma varredura
May 26, 2026, um ciclo de varredura no ambiente de desenvolvimento: 200 verificados, 106 transições de estado, 2 recolocados na fila. Uma transição de estado não é uma tradução bem-sucedida, e a divisão dos 106 por estado de destino não está registrada.
Por que não exatamente uma vez
Os registros são gravados sem duplicatas, mas se um job roda de novo após uma queda, as chamadas ao modelo e seu custo podem se repetir. O limite de concorrência é por processo, não para o cluster inteiro.
Alcance do veredito
Impedir que uma média encubra uma falha de glossário é uma regra de agregação sobre os gates relatados. Não prova que todo termo proibido seja encontrado nem que a qualidade seja de nível nativo.