
Cotton
Translation workflow
Gegenereerde vertalingen omzetten in reviewbare resultaten.
Een vertaalworkflow voor gamedialogen.
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
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.
Registratie → instap
Na de databasecommit in de queue gezet; een worker vergrendelt de rij, controleert de poging en maakt de draft aan.
Bron · doeltalenGegevens: bronIn de queue na commit
API · jobregistratieBronsegmenten en de doeltalen van het project worden in de database opgeslagen. Klantgegevens worden niet getoond.
In de queue na commit
API · jobregistratieGegevens: na commitBullMQ · job-IDJobqueueNa 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.
BullMQ · job-ID
JobqueueUitvoeren · oordeel: job afleverenRijvergrendeling · pogingcontroleJobinstapBullMQ geeft de job asynchroon door aan een worker.
Rijvergrendeling · pogingcontrole
JobinstapGegevens: voortgangsrijDraft · voortgangVertaaltoestandBinnen 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.
Rijvergrendeling · pogingcontrole
JobinstapUitvoeren · oordeel: poging toegestaanGenereren · modelaanroepVertaalturnHet 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.
Workspace-woordenlijst
Woordenlijst · contextGegevens: woordenlijstGenereren · modelaanroepVertaalturnDe woordenlijst en context van de workspace worden opgezocht en aan de generatie doorgegeven.
Workspace-woordenlijst
Woordenlijst · contextGegevens: dezelfde woordenlijstAanroep beoordelingsmodel · parsenVertaalturnHet oordeel krijgt dezelfde beperkingen uit de woordenlijst.
Genereren · modelaanroep
VertaalturnGegevens: Tx1 · vertalingRijen vertaling · oordeelVertaaltoestandHet 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.
Aanroep beoordelingsmodel · parsen
VertaalturnGegevens: Tx2 · oordeelRijen vertaling · oordeelVertaaltoestandScores 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.
Aanroep beoordelingsmodel · parsen
VertaalturnGegevens: scores · gatesHard gate · gewogen gemiddeldeOordeelsregelsHet antwoord van het beoordelingsmodel wordt geparsed tot scores per dimensie en gate-resultaten. Of de woordenlijst geslaagd is, is wat het beoordelingsmodel rapporteert.
Hard gate · gewogen gemiddelde
OordeelsregelsUitvoeren · oordeel: oordeelTurns · kosten · quotaNieuwe poging · uitgavenElk 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.
Turns · kosten · quota
Nieuwe poging · uitgavenUitvoeren · oordeel: passAfrondingstransactieAfrondingEen geslaagde vertaling wordt afgerond als translated.
Afrondingstransactie
AfrondingGegevens: definitieve vastleggingToestand · aanroeplogVertaaltoestandKandidaat, 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.
Hard gate · gewogen gemiddelde
OordeelsregelsUitvoeren · oordeel: oordeelTurns · kosten · quotaNieuwe poging · uitgavenElk 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.
Turns · kosten · quota
Nieuwe poging · uitgavenUitvoeren · oordeel: volgende turnGenereren · modelaanroepVertaalturnEen 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.
Turns · kosten · quota
Nieuwe poging · uitgavenUitvoeren · oordeel: limiet · afbrekenMenselijke reviewAls 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.
Turns · kosten · quota
Nieuwe poging · uitgavenMislukking · limiet: quota · authenticatieControle van inloggegevensEen 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.
Controle van inloggegevensUitvoeren · oordeel: handmatig hervattenBullMQ · job-ID
JobqueueEen 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.
Draft · voortgang
VertaaltoestandObservatie · rapport: vastgelopen draftDrafts ouder dan 10 min · max. 200Sweep van vastgelopen jobsTot 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.
Drafts ouder dan 10 min · max. 200
Sweep van vastgelopen jobsUitvoeren · oordeel: onder de limietQueuetoestand vergelijkenQueuecontroleMet 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.
Queuetoestand vergelijken
QueuecontroleUitvoeren · oordeel: opnieuw in de queueBullMQ · job-IDJobqueueStaat 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.
Drafts ouder dan 10 min · max. 200
Sweep van vastgelopen jobsUitvoeren · oordeel: resultaat aanwezigMenselijke reviewZijn alle 3 pogingen gebruikt en is er een vertaalresultaat, dan gaat de job naar needs_review.
Drafts ouder dan 10 min · max. 200
Sweep van vastgelopen jobsUitvoeren · oordeel: geen resultaatControle van inloggegevensZijn 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.