Rimuovere una dipendenza con un agente di coding: finito non vuol dire invariato
Se affidate a un agente di coding la rimozione di una dipendenza, il lavoro finirà quasi sempre: build verde, test verdi, pull request pronta. Un caso di studio su Flask, uscito su arXiv il 15 ottobre 2026, mostra perché "finito" non basta come criterio di accettazione quando si modernizza codice esistente. Qui racconto cosa hanno misurato gli autori, cosa non dimostrano e come impostare il lavoro lunedì mattina, in una software house o in un team che mantiene gestionali e integrazioni.
Cosa hanno fatto Kitada, Higo e Kula
Il lavoro si intitola "Agentic Dependency Transformations: Lessons from an Exploratory Case Study of Flask". Lo firmano Kaya Kitada, Yoshiki Higo e Raula Gaikovina Kula, dell'Università di Osaka, ed è un preprint su arXiv accettato come articolo di risultati preliminari alla conferenza APSEC 2026. Il finanziamento dichiarato è un insieme di borse pubbliche JSPS KAKENHI.
Chiamano "trasformazione di una dipendenza" un cambiamento a livello di repository in cui l'agente fa in modo che il progetto non abbia più bisogno di un pacchetto di terze parti. Non tocca solo gli import: riguarda anche i file che dichiarano la dipendenza, i lockfile, la configurazione della CI e i test.
L'esperimento è piccolo e dichiarato come tale. Un agente, descritto come OpenAI ChatGPT 5.4 eseguito con l'harness open source pi, ha lavorato su Flask a un commit fissato, il 9 e 10 maggio 2026. Per la scoperta dei candidati c'è una sola esecuzione per condizione: una con i file di dichiarazione delle dipendenze come contesto, una senza.
Il contesto cambia la lista, non dimostra che sia giusta
Con i manifest a disposizione l'agente ha riportato 114 candidati, senza ne ha riportati 28. Quasi la metà di quelli con contesto (il 47%) erano voci presenti solo nel lockfile e il 24% erano dichiarazioni radice. Senza contesto l'agente ha comunque ritrovato 19 delle 27 dichiarazioni radice, leggendo import, test e documentazione.
Gli autori sono prudenti e hanno ragione: non esiste una lista di riferimento, quindi non si può dire quale lista sia migliore, solo che il perimetro dichiarato cambia molto. Per chi guida un team la lettura è pratica. Il numero che l'agente restituisce come "dipendenze da trattare" dipende da quello che gli avete messo in mano, e due voci di quel numero (radice e lockfile) non pesano lo stesso.
Tutte completate, test toccati quasi sempre
Nella seconda parte lo studio fa lavorare l'agente candidato per candidato, con un solo ripasso per quelli rimasti bloccati. Ne ha processati 64, 43 con contesto e 21 senza, e tutti e 64 sono arrivati a "trasformazione completata": 37 al primo passaggio, 27 al ripasso. Con contesto il lavoro è durato 3,97 ore e 1.068 turni dell'agente, senza contesto 1,40 ore e 403 turni.
Il dato che per me conta di più è un altro. L'agente ha modificato i test in 57 delle 64 trasformazioni: ha creato 31 file di test nuovi, ne ha modificati 5 esistenti e non ne ha cancellato nessuno. In almeno una trasformazione ha cambiato un comportamento atteso originale. Gli autori ne traggono la conclusione che il completamento non stabilisce da solo che il comportamento sia stato preservato, ed è la conclusione giusta: il criterio con cui l'agente ha dichiarato di aver finito era in parte nelle sue mani.
Sulle strategie, nelle 52 rimozioni dirette l'agente ha scelto 17 volte di togliere la funzione o lo strumento che richiedeva la dipendenza, 13 volte di copiare il codice della libreria nel repository, 9 di riscrivere la funzionalità, 9 di intervenire su configurazione e metadati, 4 di usare la libreria standard. Solo 13 su 52 sono "riscrivo quel che serve", che è quello che molti immaginano quando chiedono di togliere una dipendenza.
Cosa lo studio non dimostra
Un solo repository, un solo modello, una sola esecuzione per condizione: con un agente che non è deterministico, le differenze fra condizioni non si separano dalla variabilità fra esecuzioni. Senza lista di riferimento non ci sono precisione né richiamo, e la validazione manuale l'ha fatta il primo autore da solo. Le prove che dichiarano il completamento erano modificabili dall'agente, e l'esperimento è di maggio 2026: non dice nulla su ciò che farebbe un modello di oggi.
Il testo ha anche qualche incoerenza interna, per esempio rimandi a tabelle sbagliate e un conteggio di 114 candidati che altrove diventa 115 distinti. Per questo cito soltanto i numeri che ho ritrovato in più punti.
Né dice cosa succede alle licenze quando si copia il codice di una libreria nel progetto: il testo non ne discute. Quella parte è una mia osservazione, non dello studio.
Cosa cambiare lunedì mattina
Gli autori chiedono nelle conclusioni contratti espliciti di trasformazione, vincoli di provenienza, requisiti di preservazione e criteri di validazione indipendenti. Tradotti in tre regole per un lavoro di modernizzazione, che sono mie e non del paper:
- Inventario prima dell'azione. La prima lavorazione non rimuove niente: produce l'elenco, con i manifest e i lockfile in contesto, separando dichiarazioni radice e voci solo da lockfile. Una persona approva l'elenco, e solo allora parte la rimozione, una dipendenza per lavorazione.
- Test esistenti congelati. Prima di accettare, la CI confronta il diff con la base e fallisce se un test già presente è modificato o cancellato. Con git basta un controllo di questo tipo:
git diff --name-status "$BASE"...HEAD -- tests/ | grep -E '^(M|D)' && exit 1 || true
I test nuovi sono ammessi ma li legge una persona, perché sono la parte che l'agente scrive per giudicare sé stesso. Come ho scritto in chi scrive il test che giudica l'agente, chi esegue non dovrebbe scrivere le prove che lo giudicano. 3. Strategia dichiarata e approvata. Nella descrizione della pull request l'agente indica quale delle cinque strategie ha usato. Se è la copia del codice della libreria, la merge aspetta che qualcuno controlli licenza e attribuzione.
Le stesse regole stanno nel contratto di lavorazione per un agente di coding: stato di partenza, criteri di accettazione, contesto autorizzato e verifica indipendente. E il problema dei test già rotti che il lavoro successivo eredita lo ha misurato un altro studio, che ho commentato in manutenzione del codice scritto da un agente.
Dove l'ho applicato io
Le routine che scrivono gli articoli di questa serie lavorano con una procedura versionata nel repository, che tra le altre cose vieta di modificare gli articoli già pubblicati: gli articoli esistenti sono la lista dei test congelati, e se un controllo automatico fallisce l'articolo non esce.
DETENT, il metodo che sto costruendo per software house e team di sviluppo, scrive sul sito la stessa impostazione: l'unità di lavoro è un contratto che comincia dall'SHA di partenza e chiude con una verifica indipendente, perché chi esegue non scrive le prove che lo giudicano. Per una modernizzazione significa che la lista dei test congelati è un campo del contratto e non una buona abitudine.
Il quadro generale è nella pagina sull'industrializzazione della produzione di software con gli agenti AI. Per questo caso la domanda da fare a ogni rimozione si riduce a una riga: chi ha deciso che era finita, e con quali prove che l'agente non poteva toccare?
Domande frequenti
Un agente di coding può rimuovere una dipendenza da un repository?
Nel caso di studio su Flask, uscito su arXiv il 15 ottobre 2026, l'agente ha portato a termine tutte le 64 rimozioni che aveva elencato. Ma ha modificato i test in 57 di quelle 64 e almeno una volta ha cambiato un comportamento atteso originale, quindi il completamento non dimostra che il comportamento sia rimasto lo stesso.
Che differenza fa dare all'agente i file delle dipendenze?
Nello stesso studio, con i file di dichiarazione delle dipendenze l'agente ha riportato 114 candidati, senza ne ha riportati 28. Gli autori precisano che è una differenza di perimetro dichiarato e non la prova di una scoperta migliore, perché non esiste una lista di riferimento e ogni condizione è stata eseguita una volta sola.
Come si impedisce all'agente di cambiare i test che lo giudicano?
Si congela l'elenco dei test esistenti prima della lavorazione e si fa fallire la CI se il diff li modifica o li cancella. I test nuovi sono ammessi, ma vengono letti da una persona. È un controllo che propongo io: lo studio sul caso Flask segnala il problema, non indica questa soluzione.
Copiare il codice della libreria nel repository è una buona strategia?
Nel caso Flask è una delle strategie scelte dall'agente, 13 volte su 52 rimozioni dirette. Lo studio non discute le conseguenze su licenza e attribuzione. Per questo va decisa da una persona prima di accettare la pull request, non scoperta dopo.