In basso a destra, nella barra della sessione, c'è scritto claude-fable-5 · high. Tre righe più su gira un worker: claude-sonnet-5, thinking alto, cinque turni, nove tool call, una serie di grep dentro il repo dell'app di Finanz.

Il primo decide cosa fare. Il secondo va a leggere. E nessuno dei due sarà l'ultimo a guardare il codice che ne esce.

La sessione: orchestratore su claude-fable-5, worker in fork su claude-sonnet-5
L'orchestratore su Fable, un worker in fork su Sonnet, in sola lettura

Sto riscrivendo una grossa fetta dell'app. Su un lavoro di questa taglia, affidarsi a un modello solo è un errore da principiante. Questo è il flusso che uso invece, e il criterio con cui ogni pezzo sta dove sta.

Cinque domande prima di dire «uso Claude»

Sento tutti raccontare come hanno velocizzato lo sviluppo con l'AI. Quasi nessuno sa rispondere a cinque domande:

  • quale modello stai usando, e perché proprio quello
  • quando ne scegli un altro, e in base a cosa
  • chi decide il piano, e chi lo esegue
  • quale modello gira sotto ognuno degli agenti
  • chi rivede il codice, e se è lo stesso che l'ha scritto

Se la risposta a tutte e cinque è «Claude», non hai un workflow agentico. Hai una chat lunga.

Un workflow agentico, per come lo uso io, è una cosa sola: decidere, eseguire e rivedere sono tre ruoli separati, e ognuno gira sul modello scelto per quel ruolo. Il numero di agenti viene dopo. Prima viene la divisione del lavoro.

Il criterio: intelligenza proporzionata al costo

Non scelgo il modello dalla classifica. Lo scelgo da due cose insieme: quanta intelligenza serve a quel passo, e quanto costa dargliela.

In cima metto Fable 5. È il più capace dei due, ed è anche il più caro. Lo pago dove un errore costa di più: capire cosa va toccato in una riscrittura, spezzare il lavoro in pezzi, decidere cosa delegare e a chi.

Sotto metto Sonnet 5. Leggere il codice, cercare dove vive una logica, inventariare i sorgenti da riscrivere: è volume, non giudizio. Lì serve un modello bilanciato, che regga la mole senza costare come il primo.

Il ragionamento vale nei due sensi. Pagare Fable per fare grep è sproporzionato. Mettere Sonnet a decidere la forma di una riscrittura è risparmiare nel punto sbagliato.

L'orchestratore delega la lettura

Nello screenshot il worker è un fork: parte dal contesto della sessione che lo lancia, quindi sa già cosa si sta facendo. Gira in background, mentre la sessione principale resta libera.

Il suo lavoro è in sola lettura. Le righe di output sono ricerche nel repo, e l'ultima dice che sta per leggere i sorgenti da inventariare, senza modificarli.

È esplorazione: tanta lettura per poche righe utili. Da lì in poi quella lettura resta nel contesto del worker, e all'orchestratore torna il risultato.

È la stessa divisione di prima, vista dal lato del contesto. Il modello caro non si riempie di file che non deve giudicare.

Una persona sola non fa brainstorming

Fin qui è divisione del lavoro. La parte che quasi tutti saltano è la review.

Far rivedere il codice allo stesso modello che l'ha scritto è come fare brainstorming con una persona sola. Può essere brillante, ma le idee che non ha non le trova rileggendosi. Un team con pensieri e ideologie diverse trova quello che il singolo dà per scontato.

Con un modello è peggio, perché il modello non ha dubbi sul proprio lavoro. Per lui il suo codice è perfetto. Rileggerlo nella stessa sessione, o in una nuova con lo stesso modello, lo conferma e basta.

Per questo la review non la fa Claude. La fa Codex.

Codex rivede, Claude giudica la review

Il passaggio è in sequenza, non in parallelo:

  • Codex legge il diff e riporta i problemi per gravità, con file e riga. Non tocca un file, perché il suo compito è trovare, non correggere
  • Claude rilegge quella review contro il diff vero, finding per finding: lo conferma, lo corregge o lo respinge, con l'evidenza nel codice. Serve a separare i bug dal rumore prima di toccare qualcosa
  • Quello che sopravvive ai due passaggi diventa lavoro da fare, e solo quello

I due non si oppongono e non litigano. Si completano. Dove Claude non arriva, arriva Codex, che è un tantino più critico. Dove Codex esagera, Claude lo ferma.

Non conta quale dei due sia il modello migliore. Conta che vengono da due famiglie diverse, e quindi non condividono gli stessi punti ciechi.

Il trade-off: il revisore esagera

Non è un flusso pulito. Codex critica pesantemente il codice di Claude, e trova innumerevoli bug.

Molti non esistono. Altri sono veri ma sproporzionati: un caso limite trattato come un blocco al rilascio. Se applicassi tutto quello che segnala, passerei la riscrittura a correggere problemi immaginari.

Per questo il secondo passaggio non è opzionale. Claude non accetta tutti i finding, e fa bene.

Ma fra quelli che accetta ci sono bug che da solo non avrebbe mai trovato. È il punto dell'intero flusso: il rumore di Codex è il prezzo per vedere quello che Claude non vede.

Resta un limite, e va detto. A giudicare la review è lo stesso modello che ha scritto il codice, quello per cui il suo codice è perfetto. Il rischio che respinga un bug vero per difendere il proprio lavoro non è zero. Il filtro serve contro il rumore, non è una garanzia.

Il principio

Chi scrive il codice non è chi lo rivede. Il modello si sceglie per il ruolo, in proporzione a quanto costa sbagliarlo.

E se ti stai affidando a un solo modello per scrivere e per rivedere, stai pur certo che il tuo codice è rotto. Non in qualche punto. Al 100%.