Personajul zâmbitor de bumbac din logoul original Cotton, fără fundal și text
Înapoi în sală

Cotton

Translation workflow

Din traduceri generate, rezultate care pot fi revizuite.

Un flux de lucru pentru traducerea dialogurilor din jocuri.

2026.05.06 — 2026.05.26

Proiect de lucru · procesarea traducerilor, judecată și calea de revizuire

  • Aplicație webImplementat · dezvoltare

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

Scoruri, reîncercări și revizuire umană, fiecare la propria graniță.

Generarea și judecata împart glosarul, iar eșecul unei porți stricte raportat de modelul judecător nu poate fi compensat de scorul mediu. Stările intermediare ale traducerii și judecății sunt înregistrate, limitele de reîncercare și de cost sunt ținute separat de credențialele epuizate, iar joburile blocate revin în coadă sau la revizuire în funcție de cauză.

Acest proiect de lucru leagă într-un singur flux generarea traducerilor, judecata de calitate raportată de model, reîncercările și revizuirea umană.

De la începutul depozitului până la lucrul confirmat în timpul colaborării

O aplicație web cu ecrane de editare și aprobare a traducerilor, un API și un worker pentru joburi, care rulează în mediul de dezvoltare.

Harta fluxului judecății · după înregistrări private de implementare
Cotton: judecata traducerii · reîncercare · recuperareAPI-ul face commit pentru textul sursă și limbile țintă în baza de date, apoi pune în coadă un job pentru fiecare limbă țintă. Un worker blochează rândul, verifică încercarea, creează draftul și starea de progres, generează o traducere cu glosarul și apelează separat un model judecător cu același glosar. Traducerea (Tx1) și judecata cu dovezile ei (Tx2) sunt înregistrate în tranzacții separate. Codul agregă judecata, astfel încât eșecul unei porți stricte nu este compensat de medie: un rezultat reușit este finalizat, un eșec primește o nouă tură, limita de ture sau de cost o trimite la revizuire umană, iar un semnal de cotă sau de autentificare oprește cheltuielile și așteaptă verificarea credențialelor. O verificare stale examinează cel mult 200 de drafturi mai vechi de 10 minute: unul cu încercări rămase, dar lipsă din coadă este repus în coadă, iar unul cu încercările consumate merge la revizuire sau la verificarea credențialelor, după cum există sau nu un rezultat.Sursă · limbi țintăSegmente stocateRevizuire umanăneeds_review · nu este aprobareVerificarea credențialelorneeds_credentialAPI · înregistrarea joburilorPunere în coadă după commitCoada de joburiBullMQ · ID de jobIntrarea jobuluiBlocare pe rând · verificarea încercăriiGlosar · contextGlosarul spațiului de lucruTura de traducereGenerare · apel de modelApelul modelului judecător · parsareRegulile verdictuluiPoartă strictă · medie ponderatăReîncercare · cheltuieliTure · cost · cotăStarea traduceriiDraft · progresRânduri de traducere · judecatăStare · jurnal de apeluriFinalizareTranzacția finalăVerificarea coziiCompararea stării coziiTerificare staleDrafturi mai vechi de 10 min · max. 200Intrare · coadăGenerare · judecatăStare · acceptareRecuperare · decizie umană1sursă2 după commit · Punere în coadă după commit → BullMQ · ID de job23 livrarea jobului · BullMQ · ID de job → Blocare pe rând · verificarea încercării34rând de progres5încercare permisă1glosar2 același glosar · Glosarul spațiului de lucru → Apelul modelului judecător · parsare23Tx1 · traducere4Tx2 · judecată5 scoruri · porți · Apelul modelului judecător · parsare → Poartă strictă · medie ponderată56verdict7pass8înregistrare finală1verdict2tura următoare3limită · abandon4cotă · autentificare5reluare manuală1draft blocat2sub limită3repunere în coadă4 există rezultat · Drafturi mai vechi de 10 min · max. 200 → Revizuire umană45fără rezultat

Înregistrare → intrare

Pus în coadă după commitul în baza de date; un worker blochează rândul, verifică încercarea și creează draftul.

  1. Sursă · limbi țintăDate: sursăPunere în coadă după commitAPI · înregistrarea joburilor

    Segmentele sursă și limbile țintă ale proiectului sunt stocate în baza de date. Datele clienților nu sunt afișate.

  2. Punere în coadă după commitAPI · înregistrarea joburilorDate: după commitBullMQ · ID de jobCoada de joburi

    După commitul în baza de date, pentru fiecare limbă țintă activă este pus în coadă un job cu un ID la nivel de cerere. Dacă punerea în coadă eșuează, se înregistrează doar un avertisment, iar commitul nu este anulat (fără outbox atomic), motiv pentru care există verificarea stale.

  3. BullMQ · ID de jobCoada de joburiRulare · judecată: livrarea jobuluiBlocare pe rând · verificarea încercăriiIntrarea jobului

    BullMQ predă jobul unui worker în mod asincron.

  4. Blocare pe rând · verificarea încercăriiIntrarea jobuluiDate: rând de progresDraft · progresStarea traducerii

    Într-o tranzacție, rândul de progres este blocat și este creată o traducere draft. Reîncercările automate ale joburilor finalizate sau oprite din cauza credențialelor sunt sărite; cererile manuale sunt tratate separat.

  5. Blocare pe rând · verificarea încercăriiIntrarea jobuluiRulare · judecată: încercare permisăGenerare · apel de modelTura de traducere

    Numărul de încercări crește cu unu în limita sa, apoi începe tura de traducere.

Generare → judecată → finalizare

Generarea și judecata folosesc același glosar; traducerea și judecata sunt înregistrate separat, iar codul agregă judecata înainte de finalizare.

  1. Glosarul spațiului de lucruGlosar · contextDate: glosarGenerare · apel de modelTura de traducere

    Glosarul și contextul spațiului de lucru sunt căutate și transmise generării.

  2. Glosarul spațiului de lucruGlosar · contextDate: același glosarApelul modelului judecător · parsareTura de traducere

    Judecata primește aceleași constrângeri de glosar.

  3. Generare · apel de modelTura de traducereDate: Tx1 · traducereRânduri de traducere · judecatăStarea traducerii

    Modelul este apelat direct sau printr-un pivot en-US, iar apelul, evenimentul și progresul sunt scrise într-o singură tranzacție. Dacă jobul rulează din nou după o cădere, apelul de traducere și costul lui se pot repeta.

  4. Apelul modelului judecător · parsareTura de traducereDate: Tx2 · judecatăRânduri de traducere · judecatăStarea traducerii

    Scorurile și dovezile judecătorului sunt inserate o singură dată pentru fiecare traducere și tură; un duplicat găsește rândul existent, iar citările sunt scrise doar la prima inserare. Nu este aceeași tranzacție cu traducerea.

  5. Apelul modelului judecător · parsareTura de traducereDate: scoruri · porțiPoartă strictă · medie ponderatăRegulile verdictului

    Răspunsul modelului judecător este parsat în scoruri pe dimensiuni și rezultate ale porților. Dacă glosarul a fost respectat este ceea ce raportează modelul judecător.

  6. Poartă strictă · medie ponderatăRegulile verdictuluiRulare · judecată: verdictTure · cost · cotăReîncercare · cheltuieli

    Orice eșec raportat al unei porți stricte înseamnă zero și respingere; abia apoi se aplică media ponderată și pragurile pe dimensiuni. Pragul general de 8.0 este o valoare implicită de configurare, nu o calitate observată a traducerii.

  7. Ture · cost · cotăReîncercare · cheltuieliRulare · judecată: passTranzacția finalăFinalizare

    Un rezultat reușit este finalizat ca translated.

  8. Tranzacția finalăFinalizareDate: înregistrare finalăStare · jurnal de apeluriStarea traducerii

    Candidatul, starea, scorul și turele sunt finalizate, iar progresul finalized și jurnalul de stare sunt scrise într-o singură tranzacție. Un eveniment de traducere finalizată este emis doar pentru translated.

Reîncercare · limite de cheltuieli

Fără trecere urmează o nouă tură; la limită, revizuire umană; la cotă sau autentificare, cheltuielile se opresc și se așteaptă reluarea de către un operator.

  1. Poartă strictă · medie ponderatăRegulile verdictuluiRulare · judecată: verdictTure · cost · cotăReîncercare · cheltuieli

    Orice eșec raportat al unei porți stricte înseamnă zero și respingere; abia apoi se aplică media ponderată și pragurile pe dimensiuni. Pragul general de 8.0 este o valoare implicită de configurare, nu o calitate observată a traducerii.

  2. Ture · cost · cotăReîncercare · cheltuieliRulare · judecată: tura următoareGenerare · apel de modelTura de traducere

    O traducere care nu trece este generată din nou împreună cu traducerea și critica anterioare. Chiar și eșecul unei porți stricte poate fi mai întâi reîncercat, în loc să ajungă direct la o persoană.

  3. Ture · cost · cotăReîncercare · cheltuieliRulare · judecată: limită · abandonRevizuire umană

    Când turele se epuizează sau se atinge plafonul de cost, jobul este finalizat ca needs_review. Finalizat înseamnă că procesarea s-a încheiat, nu că a aprobat-o o persoană.

  4. Ture · cost · cotăReîncercare · cheltuieliEșec · limită: cotă · autentificareVerificarea credențialelor

    Un semnal de cotă sau de autentificare oprește cheltuielile și setează needs_credential. Nu există comutare automată la alt cont sau furnizor. Erorile de transport fără semnal de oprire revin la reîncercarea BullMQ.

  5. Verificarea credențialelorRulare · judecată: reluare manualăBullMQ · ID de jobCoada de joburi

    Un operator care a verificat credențialele repornește explicit.

Recuperarea joburilor blocate

Drafturile vechi sunt împărțite după motiv: lipsa din coadă înseamnă repunere în coadă, încercările consumate înseamnă o decizie umană.

  1. Draft · progresStarea traduceriiObservare · raport: draft blocatDrafturi mai vechi de 10 min · max. 200Terificare stale

    Sunt citiți cel mult 200 de candidați aflați în draft de peste 10 minute, începând cu cei mai vechi. Interogarea nu face blocări, iar actualizările și jurnalizarea rulează ca instrucțiuni separate, așa că nu este descrisă ca un lot fără condiții de concurență.

  2. Drafturi mai vechi de 10 min · max. 200Terificare staleRulare · judecată: sub limităCompararea stării coziiVerificarea cozii

    Cu mai puține încercări decât limita (3), jobul este comparat cu stările de coadă active, waiting, delayed și prioritized. În cod, ramura încercărilor epuizate vine înaintea acestei verificări a cozii.

  3. Compararea stării coziiVerificarea coziiRulare · judecată: repunere în coadăBullMQ · ID de jobCoada de joburi

    Dacă jobul nu este în coadă, este pus din nou. API-ul folosește ID-uri cu un sufix de cerere, în timp ce trecerea caută ID-ul de segment și de limbă, așa că nu este descrisă ca acoperind fiecare cerere în curs.

  4. Drafturi mai vechi de 10 min · max. 200Terificare staleRulare · judecată: există rezultatRevizuire umană

    Cu toate cele 3 încercări consumate și un rezultat de traducere prezent, jobul merge la needs_review.

  5. Drafturi mai vechi de 10 min · max. 200Terificare staleRulare · judecată: fără rezultatVerificarea credențialelor

    Cu toate cele 3 încercări consumate și fără rezultat, jobul merge la needs_credential.

Fiecare conexiune cu aceeași grosime. Alegeți un flux pentru a evidenția doar traseul lui, cu pași numerotați.

  • Continuă · direcția intrărilor, rezultatelor și înregistrărilor
  • Întreruptă · rulare, judecată, cerere
  • Puncte lungi · observare și raportare, separate de judecată
  • Liniuțe scurte · eșec, oprire, limită
  • Linie neagră groasă · fluxul selectat; numerele dau ordinea
  • Casetă · graniță de cod sau de stare, cu numele în antet
  • Etichetă interioară · o componentă a acelei granițe
  • Casetă punctată · în afara acelei granițe
  • Contur portocaliu · locul în care decide un model
  • Generare · cheltuieli · finalizare
  • Intrare · regulile verdictului · trecere
  • Coadă · stare · înregistrări
  • Înregistrare · verificarea cozii

Desenat după înregistrări private de implementare și dezvoltare. Datele clienților și căile de cod nu sunt afișate.

O singură trecere
26 mai 2026, un singur ciclu de trecere în mediul de dezvoltare: 200 verificate, 106 tranziții de stare, 2 repuse în coadă. O tranziție de stare nu este o traducere reușită, iar împărțirea celor 106 pe stările de destinație nu este înregistrată.
De ce nu exact o singură dată
Înregistrările sunt scrise fără duplicate, dar dacă un job rulează din nou după o cădere, apelurile de model și costul lor se pot repeta. Limita de concurență este per proces, nu la nivelul întregului cluster.
Domeniul verdictului
Faptul că o medie nu poate acoperi un eșec de glosar este o regulă de agregare a porților raportate. Nu dovedește că fiecare termen interzis este găsit sau că calitatea este la nivel de vorbitor nativ.