Lachend katoenpersonage uit het oorspronkelijke Cotton-logo, zonder achtergrond en letters
Terug naar de zaal

Cotton

Translation workflow

Gegenereerde vertalingen omzetten in reviewbare resultaten.

Een vertaalworkflow voor gamedialogen.

2026.05.06 — 2026.05.26

Werkproject · vertaalverwerking, beoordeling en reviewpad

  • WebappGeïmplementeerd · ontwikkeling

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

Scores, nieuwe pogingen en menselijke review, elk op een eigen grens.

Generatie en beoordeling delen de woordenlijst, en het falen van een hard gate dat het beoordelingsmodel meldt, kan niet door de gemiddelde score worden gecompenseerd. Tussentoestanden van vertaling en beoordeling worden vastgelegd, limieten voor nieuwe pogingen en kosten blijven gescheiden van uitgeputte inloggegevens, en vastgelopen jobs keren afhankelijk van de oorzaak terug naar de queue of naar review.

Dit werkproject verbindt vertaalgeneratie, door het model gerapporteerde kwaliteitsbeoordeling, nieuwe pogingen en menselijke review in één stroom.

Van de start van de repository tot het werk dat tijdens de opdracht is bevestigd

Een webapp met schermen voor het bewerken en goedkeuren van vertalingen, een API en een jobworker, draaiend in de ontwikkelomgeving.

Kaart van de beoordelingsstroom · op basis van niet-openbare implementatieverslagen
Cotton-vertaalbeoordeling · nieuwe poging · herstelDe API commit de brontekst en doeltalen naar de database en zet daarna per doeltaal een job in de queue. Een worker vergrendelt de rij, controleert de poging, maakt de draft en de voortgangstoestand aan, genereert een vertaling met de woordenlijst en roept apart een beoordelingsmodel aan met dezelfde woordenlijst. De vertaling (Tx1) en het oordeel met bewijs (Tx2) worden in aparte transacties vastgelegd. Code aggregeert het oordeel zodat een hard-gate-fout niet door het gemiddelde wordt gecompenseerd: een geslaagde vertaling wordt afgerond, een mislukte krijgt nog een turn, de turn- of kostenlimiet stuurt haar naar menselijke review, en een quota- of authenticatiesignaal stopt de uitgaven en wacht op een controle van de inloggegevens. Een sweep van vastgelopen jobs bekijkt tot 200 drafts ouder dan 10 minuten: een draft met resterende pogingen die in de queue ontbreekt, wordt opnieuw in de queue gezet, en een draft waarvan de pogingen op zijn, gaat naar review of naar de controle van de inloggegevens, afhankelijk van of er een resultaat is.Bron · doeltalenOpgeslagen segmentenMenselijke reviewneeds_review · geen goedkeuringControle van inloggegevensneeds_credentialAPI · jobregistratieIn de queue na commitJobqueueBullMQ · job-IDJobinstapRijvergrendeling · pogingcontroleWoordenlijst · contextWorkspace-woordenlijstVertaalturnGenereren · modelaanroepAanroep beoordelingsmodel · parsenOordeelsregelsHard gate · gewogen gemiddeldeNieuwe poging · uitgavenTurns · kosten · quotaVertaaltoestandDraft · voortgangRijen vertaling · oordeelToestand · aanroeplogAfrondingAfrondingstransactieQueuecontroleQueuetoestand vergelijkenSweep van vastgelopen jobsDrafts ouder dan 10 min · max. 200Invoer · queueGeneratie · beoordelingToestand · acceptatieHerstel · menselijke beslissing1bron2na commit3 job afleveren · BullMQ · job-ID → Rijvergrendeling · pogingcontrole34voortgangsrij5poging toegestaan1 woordenlijst · Workspace-woordenlijst → Genereren · modelaanroep12 dezelfde woordenlijst · Workspace-woordenlijst → Aanroep beoordelingsmodel · parsen23Tx1 · vertaling4Tx2 · oordeel5 scores · gates · Aanroep beoordelingsmodel · parsen → Hard gate · gewogen gemiddelde56oordeel7pass8definitieve vastlegging1oordeel2volgende turn3limiet · afbreken4quota · authenticatie5handmatig hervatten1vastgelopen draft2 onder de limiet · Drafts ouder dan 10 min · max. 200 → Queuetoestand vergelijken23opnieuw in de queue4 resultaat aanwezig · Drafts ouder dan 10 min · max. 200 → Menselijke review45geen resultaat

Registratie → instap

Na de databasecommit in de queue gezet; een worker vergrendelt de rij, controleert de poging en maakt de draft aan.

  1. Bron · doeltalenGegevens: bronIn de queue na commitAPI · jobregistratie

    Bronsegmenten en de doeltalen van het project worden in de database opgeslagen. Klantgegevens worden niet getoond.

  2. In de queue na commitAPI · jobregistratieGegevens: na commitBullMQ · job-IDJobqueue

    Na de databasecommit wordt per actieve doeltaal een job met een verzoekgebonden ID in de queue gezet. Mislukt dat, dan wordt alleen een waarschuwing gelogd en wordt de commit niet teruggedraaid (geen atomaire outbox); daarom bestaat de sweep van vastgelopen jobs.

  3. BullMQ · job-IDJobqueueUitvoeren · oordeel: job afleverenRijvergrendeling · pogingcontroleJobinstap

    BullMQ geeft de job asynchroon door aan een worker.

  4. Rijvergrendeling · pogingcontroleJobinstapGegevens: voortgangsrijDraft · voortgangVertaaltoestand

    Binnen een transactie wordt de voortgangsrij vergrendeld en een draft-vertaling aangemaakt. Automatische nieuwe pogingen voor afgeronde of wegens inloggegevens gepauzeerde jobs worden overgeslagen; handmatige verzoeken worden apart behandeld.

  5. Rijvergrendeling · pogingcontroleJobinstapUitvoeren · oordeel: poging toegestaanGenereren · modelaanroepVertaalturn

    Het aantal pogingen gaat binnen de limiet met één omhoog, daarna start de vertaalturn.

Genereren → beoordelen → afronden

Generatie en beoordeling gebruiken dezelfde woordenlijst; vertaling en oordeel worden apart vastgelegd, en code aggregeert het oordeel vóór het afronden.

  1. Workspace-woordenlijstWoordenlijst · contextGegevens: woordenlijstGenereren · modelaanroepVertaalturn

    De woordenlijst en context van de workspace worden opgezocht en aan de generatie doorgegeven.

  2. Workspace-woordenlijstWoordenlijst · contextGegevens: dezelfde woordenlijstAanroep beoordelingsmodel · parsenVertaalturn

    Het oordeel krijgt dezelfde beperkingen uit de woordenlijst.

  3. Genereren · modelaanroepVertaalturnGegevens: Tx1 · vertalingRijen vertaling · oordeelVertaaltoestand

    Het model wordt direct of via een en-US-pivot aangeroepen, en aanroep, event en voortgang worden in één transactie geschreven. Draait de job na een crash opnieuw, dan kunnen de vertaalaanroep en de kosten ervan zich herhalen.

  4. Aanroep beoordelingsmodel · parsenVertaalturnGegevens: Tx2 · oordeelRijen vertaling · oordeelVertaaltoestand

    Scores en bewijs van de beoordelaar worden eenmaal per vertaling en turn ingevoegd; een duplicaat vindt de bestaande rij, en citaten worden alleen bij de eerste invoeging geschreven. Niet dezelfde transactie als de vertaling.

  5. Aanroep beoordelingsmodel · parsenVertaalturnGegevens: scores · gatesHard gate · gewogen gemiddeldeOordeelsregels

    Het antwoord van het beoordelingsmodel wordt geparsed tot scores per dimensie en gate-resultaten. Of de woordenlijst geslaagd is, is wat het beoordelingsmodel rapporteert.

  6. Hard gate · gewogen gemiddeldeOordeelsregelsUitvoeren · oordeel: oordeelTurns · kosten · quotaNieuwe poging · uitgaven

    Elk gerapporteerd falen van een hard gate betekent nul en een fail; pas dan worden het gewogen gemiddelde en de drempels per dimensie toegepast. De totale drempel van 8.0 is een standaardwaarde uit de configuratie, geen waargenomen vertaalkwaliteit.

  7. Turns · kosten · quotaNieuwe poging · uitgavenUitvoeren · oordeel: passAfrondingstransactieAfronding

    Een geslaagde vertaling wordt afgerond als translated.

  8. AfrondingstransactieAfrondingGegevens: definitieve vastleggingToestand · aanroeplogVertaaltoestand

    Kandidaat, toestand, score en turns worden afgerond, en de voortgang finalized plus het toestandslog worden in één transactie geschreven. Een event voor een voltooide vertaling wordt alleen bij translated uitgezonden.

Opnieuw proberen · uitgavenlimieten

Niet geslaagd betekent nog een turn; een limiet betekent menselijke review; quota of authenticatie stopt de uitgaven en wacht tot een operator hervat.

  1. Hard gate · gewogen gemiddeldeOordeelsregelsUitvoeren · oordeel: oordeelTurns · kosten · quotaNieuwe poging · uitgaven

    Elk gerapporteerd falen van een hard gate betekent nul en een fail; pas dan worden het gewogen gemiddelde en de drempels per dimensie toegepast. De totale drempel van 8.0 is een standaardwaarde uit de configuratie, geen waargenomen vertaalkwaliteit.

  2. Turns · kosten · quotaNieuwe poging · uitgavenUitvoeren · oordeel: volgende turnGenereren · modelaanroepVertaalturn

    Een vertaling die niet slaagt, wordt opnieuw gegenereerd met de vorige vertaling en de kritiek. Zelfs een hard-gate-fout kan eerst opnieuw worden geprobeerd in plaats van direct naar een mens te gaan.

  3. Turns · kosten · quotaNieuwe poging · uitgavenUitvoeren · oordeel: limiet · afbrekenMenselijke review

    Als de turns op zijn of het kostenplafond is bereikt, wordt de job afgerond als needs_review. Afgerond betekent dat de verwerking is beëindigd, niet dat een mens heeft goedgekeurd.

  4. Turns · kosten · quotaNieuwe poging · uitgavenMislukking · limiet: quota · authenticatieControle van inloggegevens

    Een quota- of authenticatiesignaal stopt de uitgaven en zet needs_credential. Er is geen automatische overstap naar een ander account of een andere provider. Transportfouten zonder haltsignaal gaan terug naar de BullMQ-retry.

  5. Controle van inloggegevensUitvoeren · oordeel: handmatig hervattenBullMQ · job-IDJobqueue

    Een operator die de inloggegevens heeft gecontroleerd, start expliciet opnieuw.

Herstel van vastgelopen jobs

Oude drafts worden naar reden gesplitst: ontbreekt de job in de queue, dan gaat hij opnieuw in de queue; zijn de pogingen op, dan beslist een mens.

  1. Draft · voortgangVertaaltoestandObservatie · rapport: vastgelopen draftDrafts ouder dan 10 min · max. 200Sweep van vastgelopen jobs

    Tot 200 kandidaten die al meer dan 10 minuten draft zijn, worden gelezen, oudste eerst. De query neemt geen lock en updates en logs draaien als aparte statements, dus dit wordt niet beschreven als een race-vrije batch.

  2. Drafts ouder dan 10 min · max. 200Sweep van vastgelopen jobsUitvoeren · oordeel: onder de limietQueuetoestand vergelijkenQueuecontrole

    Met minder pogingen dan de limiet (3) wordt de job vergeleken met de queuestatussen active, waiting, delayed en prioritized. In de code komt de tak voor uitgeputte pogingen vóór deze queuecontrole.

  3. Queuetoestand vergelijkenQueuecontroleUitvoeren · oordeel: opnieuw in de queueBullMQ · job-IDJobqueue

    Staat de job niet in de queue, dan wordt hij opnieuw in de queue gezet. De API gebruikt ID’s met een verzoeksuffix, terwijl de sweep zoekt op segment- en locale-ID, dus wordt hij niet beschreven als passend op elk lopend verzoek.

  4. Drafts ouder dan 10 min · max. 200Sweep van vastgelopen jobsUitvoeren · oordeel: resultaat aanwezigMenselijke review

    Zijn alle 3 pogingen gebruikt en is er een vertaalresultaat, dan gaat de job naar needs_review.

  5. Drafts ouder dan 10 min · max. 200Sweep van vastgelopen jobsUitvoeren · oordeel: geen resultaatControle van inloggegevens

    Zijn alle 3 pogingen gebruikt zonder resultaat, dan gaat de job naar needs_credential.

Alle verbindingen even zwaar. Kies een stroom om alleen het pad daarvan te markeren, met genummerde stappen.

  • Doorgetrokken · richting van input, resultaten en vastleggingen
  • Gestreept · uitvoeren, oordeel, verzoek
  • Lange punten · observatie en rapportage, los van het oordeel
  • Kort gestreept · mislukking, stop, limiet
  • Dikke zwarte lijn · de gekozen stroom; nummers geven de volgorde
  • Vak · code- of toestandsgrens, benoemd in de kop
  • Binnenchip · een component binnen die grens
  • Gestippeld vak · buiten die grens
  • Oranje omlijning · waar een model beslist
  • Generatie · uitgaven · afronding
  • Instap · oordeelsregels · sweep
  • Queue · toestand · logs
  • Registratie · queuecontrole

Getekend op basis van niet-openbare implementatie- en ontwikkelverslagen. Klantgegevens en codepaden worden niet getoond.

Eén sweep
May 26, 2026, één sweepcyclus in de ontwikkelomgeving: 200 gecontroleerd, 106 toestandsovergangen, 2 opnieuw in de queue. Een toestandsovergang is geen geslaagde vertaling, en de verdeling van de 106 naar doeltoestand is niet vastgelegd.
Waarom niet precies één keer
Vastleggingen worden zonder duplicaten geschreven, maar als een job na een crash opnieuw draait, kunnen modelaanroepen en de kosten ervan zich herhalen. De concurrencylimiet geldt per proces, niet clusterbreed.
Reikwijdte van het oordeel
Voorkomen dat een gemiddelde een woordenlijstfout maskeert, is een aggregatieregel over gerapporteerde gates. Het bewijst niet dat elke verboden term wordt gevonden of dat de kwaliteit op moedertaalniveau is.