
Cotton
Translation workflow
Trasformare traduzioni generate in risultati verificabili.
Un workflow di traduzione per i dialoghi di gioco.
Una race condition trovata dalla revisione, job bloccati rimandati per causa
Un caso in cui regola e commit indicano Claude per l’implementazione e Codex per la revisione, e uno che ha reso diagnosticabili i job bloccati.
May 19, 2026
Una modifica che si ferma all’esaurimento della quota è stata corretta nella stessa PR, inclusa la race condition trovata dalla revisione
PersonaPersona
AzioneFermare la spesa all’esaurimento della quota · nessun fallback automatico
- consegnaVincolo di implementazione→ Implementare checkpoint · halt · ripresa manuale (Claude)
Agente di programmazioneClaude
AzioneImplementare checkpoint · halt · ripresa manuale
- consegnaRevisione nella stessa PR→ Rilievo: race condition · transizioni di stato duplicate (Codex)
Revisione · verificaCodex
Osservazione · rilievoRilievo: race condition · transizioni di stato duplicate
- rimandato indietroRace · idempotenza→ Nella stessa PR: row lock · chiave univoca del punteggio · transizione atomica (Stessa PR)
ArtefattiStessa PR
ArtefattoNella stessa PR: row lock · chiave univoca del punteggio · transizione atomica
- consegna→ Fixture locale · registri del controllo d’integrazione del DB (Stessa PR)
ArtefattiStessa PR
ArtefattoFixture locale · registri del controllo d’integrazione del DB
- non un’esecuzione registrataAmbito verificato→ Nessun nuovo risultato di CI o di deployment in produzione raccolto (Stessa PR)
ArtefattiStessa PR
Regola · non verificataNessun nuovo risultato di CI o di deployment in produzione raccolto
- Contesto
- La condizione posta da una persona era fermare la spesa all’esaurimento della quota, senza fallback automatico. Claude ha implementato checkpoint, halt e ripresa manuale, e una revisione di Codex eseguita tramite l’MCP del progetto ha trovato una race condition e duplicazioni nelle transizioni di stato.
- Esito
- Le transizioni di ingresso e di ripresa avvengono all’interno di un lock, i punteggi del giudice hanno una chiave univoca contro i duplicati, e il confine della transazione è stato fissato. Ciò non significa che ogni race condition sia stata eliminata.
- Limite
- Il commit riporta 140 controlli e il successivo CHANGELOG d’integrazione 160, quindi non vengono uniti in un unico conteggio di esecuzioni. Secondo la regola, la revisione di Codex è un passaggio locale facoltativo, quindi ciò non significa che ogni PR passata l’abbia ricevuta.
Fonti e limiti residui
- La regola fissa l’ordine: Claude implementa, Codex rivede in locale tramite l’MCP del progetto, la revisione viene allegata alla PR, e i disaccordi vengono esaminati insieme all’agente di revisione di Claude. La revisione automatica di Codex in CI era stata rimandata.
- I controlli di sviluppo usano fixture e mock, e le chiamate reali al modello richiedono un ambito proprio. I rilievi della revisione confluiscono nella stessa PR e vengono uniti con squash merge feature → main.
May 26, 2026
Resi diagnosticabili i job bloccati e rimandati per causa
In sviluppoWorker di traduzione · coda
Osservazione · rilievoJob rimasti in draft · tentativi esauriti
- consegnaValori osservati→ Confronto tra failedReason · codici di uscita · stato draft (Sviluppatore)
PersonaSviluppatore
AzioneConfronto tra failedReason · codici di uscita · stato draft
- consegna→ Causa: le NODE_OPTIONS ereditate entrano in conflitto nei subprocessi (Sviluppatore)
PersonaSviluppatore
Osservazione · rilievoCausa: le NODE_OPTIONS ereditate entrano in conflitto nei subprocessi
- rimandato indietroConflitto di opzioni ereditate→ Rimozione di NODE_OPTIONS · tetto di concorrenza per processo (Modifiche al codice)
Sessione di lavoroModifiche al codice
AzioneRimozione di NODE_OPTIONS · tetto di concorrenza per processo
- consegna→ Stato della coda: waiting · active · failed · stale (Modifiche al codice)
Sessione di lavoroModifiche al codice
AzioneStato della coda: waiting · active · failed · stale
- consegna→ Stale sweep: assente dalla coda vs tentativi esauriti, con diramazione in base all’esistenza di un risultato (Modifiche al codice)
Sessione di lavoroModifiche al codice
AzioneStale sweep: assente dalla coda vs tentativi esauriti, con diramazione in base all’esistenza di un risultato
- consegnaUn ciclo→ Sweep di sviluppo: 200 candidati → 106 spostati · 2 rimessi in coda · 0 errori (Artefatti)
ArtefattiArtefatti
ArtefattoSweep di sviluppo: 200 candidati → 106 spostati · 2 rimessi in coda · 0 errori
- non un’esecuzione registrataLimite dell’interpretazione→ I 106 job non sono traduzioni riuscite (Artefatti)
ArtefattiArtefatti
Regola · non verificataI 106 job non sono traduzioni riuscite
- Contesto
- Confrontando il failedReason di BullMQ, i codici di uscita dei subprocessi e i job rimasti in draft si è scoperto che le NODE_OPTIONS ereditate entravano in conflitto nei subprocessi. In seguito la stessa situazione è stata resa visibile come stato della coda.
- Esito
- I job bloccati sono divisi tra quelli assenti dalla coda e quelli che hanno esaurito i tentativi; questi ultimi passano, con un motivo, a needs_review o needs_credential a seconda che esista un risultato. La revisione umana resta in vigore.
- Limite
- Il tetto di concorrenza è per processo. I log originali delle esecuzioni non erano disponibili nel materiale esaminato; i dati di latenza sono omessi perché i modelli richiesti e l’effort non sono stati registrati. Il solo codice di build e rilascio non è prova di un deployment pubblico.
Fonti e limiti residui
- Il CHANGELOG riporta una proposta di branch paralleli degli adapter, ma non viene trasformata in un registro di esecuzione parallela effettiva.
- Il resto dei 200 non è dettagliato in questo registro.