
Cotton
Translation workflow
Transformar traduções geradas em resultados revisáveis.
Um fluxo de trabalho de tradução para diálogos de jogos.
Cotton vocabulary
- prompt layers
- glossary
- generation
- revision
- judge
- hard gate
- score
- intake
- checkpoint
- spend control
- stale sweep
- approval
- correction
- 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.
Registro → entrada
Enfileirado após o commit no banco; um worker trava a linha, verifica a tentativa e cria o rascunho.
Origem · idiomas de destinoDados: origemEnfileirar após o commit
API · registro de jobsOs 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.
Enfileirar após o commit
API · registro de jobsDados: após o commitBullMQ · ID do jobFila de jobsApó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.
BullMQ · ID do job
Fila de jobsExecução · julgamento: entregar o jobLock de linha · verificação da tentativaEntrada do jobO BullMQ entrega o job a um worker de forma assíncrona.
Lock de linha · verificação da tentativa
Entrada do jobDados: linha de progressoRascunho · progressoEstado da traduçãoDentro 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.
Lock de linha · verificação da tentativa
Entrada do jobExecução · julgamento: tentativa permitidaGerar · chamada ao modeloTurno de traduçãoA 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.
Glossário do workspace
Glossário · contextoDados: glossárioGerar · chamada ao modeloTurno de traduçãoO glossário e o contexto do workspace são buscados e passados à geração.
Glossário do workspace
Glossário · contextoDados: mesmo glossárioChamada ao modelo juiz · parsingTurno de traduçãoO julgamento recebe as mesmas restrições de glossário.
Gerar · chamada ao modelo
Turno de traduçãoDados: Tx1 · traduçãoLinhas de tradução · de julgamentoEstado da traduçãoO 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.
Chamada ao modelo juiz · parsing
Turno de traduçãoDados: Tx2 · julgamentoLinhas de tradução · de julgamentoEstado da traduçãoAs 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.
Chamada ao modelo juiz · parsing
Turno de traduçãoDados: pontuações · gatesHard gate · média ponderadaRegras de vereditoA 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.
Hard gate · média ponderada
Regras de vereditoExecução · julgamento: vereditoTurnos · custo · cotaNova tentativa · gastosQualquer 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.
Turnos · custo · cota
Nova tentativa · gastosExecução · julgamento: passTransação finalFinalizaçãoUma aprovação é finalizada como translated.
Transação final
FinalizaçãoDados: registro finalEstado · log de chamadasEstado da traduçãoCandidato, 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.
Hard gate · média ponderada
Regras de vereditoExecução · julgamento: vereditoTurnos · custo · cotaNova tentativa · gastosQualquer 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.
Turnos · custo · cota
Nova tentativa · gastosExecução · julgamento: próximo turnoGerar · chamada ao modeloTurno de traduçãoUma 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.
Turnos · custo · cota
Nova tentativa · gastosExecução · julgamento: limite · abortoRevisão humanaQuando 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.
Turnos · custo · cota
Nova tentativa · gastosFalha · limite: cota · autenticaçãoVerificação de credenciaisUm 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.
Verificação de credenciaisExecução · julgamento: retomada manualBullMQ · ID do job
Fila de jobsUm 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.
Rascunho · progresso
Estado da traduçãoObservação · relatório: rascunho paradoRascunhos com mais de 10 min · máx. 200Varredura de paradosAté 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.
Rascunhos com mais de 10 min · máx. 200
Varredura de paradosExecução · julgamento: abaixo do limiteComparar o estado da filaVerificação da filaCom 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.
Comparar o estado da fila
Verificação da filaExecução · julgamento: recolocar na filaBullMQ · ID do jobFila de jobsSe 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.
Rascunhos com mais de 10 min · máx. 200
Varredura de paradosExecução · julgamento: há resultadoRevisão humanaCom as 3 tentativas usadas e um resultado de tradução presente, o job vai para needs_review.
Rascunhos com mais de 10 min · máx. 200
Varredura de paradosExecução · julgamento: sem resultadoVerificação de credenciaisCom 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.