Il log dice: y = -9389. Meno diecimila metri, velocità di caduta -189 al secondo, e la macchina continua a scendere. Ho passato tre ore a far guidare una Porsche del 1975 dentro Unity a un sistema che per buona parte del lavoro non poteva guardare lo schermo, e a un certo punto quella cifra negativa è diventata il dato più interessante della giornata.
Il compito era banale sulla carta: prendere un modello scaricato da Sketchfab, montarci le ruote, farlo girare intorno a un cubo rosso. L’agente — Claude Code collegato a Unity via un protocollo che espone funzioni, non pixel — doveva dedurre lo stato fisico della scena campionando posizione e velocità nel tempo. Niente cattura schermo per gran parte della sessione. Le proprietà interne del componente ruote tornavano indietro con un messaggio quasi comico: dettagli omessi per sicurezza. Capire dov’era la macchina, in pratica, funzionava come capire dov’è una buca dal rumore delle sospensioni. Alla cieca, ma con un metodo.
Quando la macchina ha iniziato a cadere nel vuoto, la prima ipotesi è stata quella ovvia: il pavimento. Scartata — un cubo di controllo lasciato cadere si è fermato in modo perfetto, quindi la superficie reggeva. Seconda ipotesi: le sospensioni troppo rigide. Scartata anche quella, margine di sicurezza portato all’estremo, la macchina continuava a sprofondare. Terza: la matrice di collisione tra i livelli grafici, tutta aperta, nessun colpevole lì. Tre ipotesi testate una per volta, tutte sbagliate — non per un metodo scelto in autonomia, ma perché erano le adiacenze più plausibili nello spazio di ricerca disponibile. Esaurite quelle, è rimasto solo il resto.
La causa vera era nell’importazione del modello. Il formato usato da Sketchfab arriva da un altro sistema di coordinate, e per farlo stare dritto in Unity qualcuno aveva ruotato l’oggetto di 270 gradi. Risultato collaterale: il vettore che il codice usava per calcolare “quanto sta andando veloce in avanti” puntava dritto verso l’alto. La macchina non stava accelerando: stava cadendo, e il sistema leggeva quella caduta come velocità di marcia. Un asse sbagliato, nascosto tre livelli sotto il sintomo visibile.
C’è qualcosa di Smetto quando voglio in questa sequenza — non per la trama, per la struttura: ricercatori con competenza vera, metodo vero, applicati con precisione a un problema che si rivela diverso da come lo avevano inquadrato all’inizio. Non incompetenza, cattiva inquadratura. L’agente non ha tirato a indovinare: ha isolato variabili, escluso ipotesi con test controllati, seguito la procedura corretta — semplicemente nell’ordine sbagliato, perché l’ordine sbagliato era quello più plausibile visto da fuori.
È lo stesso problema che vedo da anni con Nexus, il personaggio che tengo su un server di mondi virtuali per testare come i modelli reggono un dialogo prolungato in italiano: interpola benissimo finché il binario resta quello previsto, e quando esce fuori — un asse ruotato, una domanda fuori schema — non lo dice. Continua a rispondere con la stessa sicurezza di prima. La differenza, qui, è che l’ambiente fisico non lascia margine di bluff: o la macchina tocca terra o cade per diecimila metri. Un modello linguistico può confondere una cosa per un’altra e restare plausibile per un paragrafo intero. Una simulazione fisica no — il numero arriva, ed è innegabile.
Vale anche per me, l’osservazione. Ho seguito il log convinto che il problema fosse il pavimento, prima ancora che lo pensasse l’agente — istinto sbagliato, stessa direzione sbagliata. Boh, capita: si cerca il guasto dove si è già cercato altre volte, perché la memoria di ciò che ha funzionato prima pesa più della logica del caso specifico.
Il punto che mi interessa tenere non è “l’AI ha risolto un bug fisico”, cosa che tra l’altro fa ogni giorno mezzo internet con ChatGPT e uno stack trace. È che la sequenza — isolare, testare, escludere — ha prodotto la risposta giusta nonostante l’assenza quasi totale di percezione diretta. L’agente non vedeva la scena. Vedeva numeri che la descrivevano — non un sostituto scelto della vista, ma l’unica interfaccia che aveva con quello spazio. Il capire, qui, non è arrivato per intuizione: è arrivato per sottrazione, dopo aver esaurito ogni spiegazione plausibile che non fosse quella vera.
Ed è stato leggibile solo perché catastrofico. Un vettore che precipita per diecimila metri non lascia zone grigie: o la macchina tocca terra o continua a scendere per sempre. Ma se quella rotazione sbagliata avesse prodotto una deviazione di due gradi invece di duecentosettanta, la macchina avrebbe semplicemente curvato in modo plausibile — non un crollo, una sterzata di troppo. Leggendo gli stessi log, l’agente avrebbe probabilmente corretto la traiettoria come un problema di taratura, seppellendo l’errore genealogico sotto un comportamento che sembra solo adattivo. Il metodo ha funzionato perché l’ambiente si è rifiutato di collaborare con l’errore. La domanda scomoda è cosa succede quando invece collabora.
Riferimenti
[1] Khronos Group, glTF specification — coordinate system, discussione tecnica su orientamento e convenzione “avanti”. Il conflitto di manualità (destrorso in glTF, sinistrorso in Unity) è la causa strutturale della rotazione correttiva applicata all’importazione. URL: https://github.com/KhronosGroup/glTF/issues/1640

Leave a Reply