Heroes / Perché / misurato

Misurato

La tesi del progetto, messa alla prova in pubblico: che cosa è stato misurato, che cosa è stato scritto prima di misurare e che cosa questa pagina non dice ancora. Ogni numero di questa pagina è copiato dal file del repository che lo ha misurato, e quel file è nominato accanto.

La tesi

Un linguaggio progettato perché ogni sbaglio plausibile di un modello sia un errore di compilazione produrrà programmi funzionanti spendendo meno token in totale di un linguaggio convenzionale, anche se ogni singolo programma costa più token da scrivere.

Il modello di cui parla la tesi è un LLM, un grande modello linguistico: il tipo di modello AI che scrive codice. I token sono i frammenti di testo che un modello legge e genera. La tesi poggia su una formula del documento di progetto:

costo reale = token del programma × (1 + tasso di riscrittura)

Accorciare la sintassi riduce i token necessari per scrivere un file. Correggere un errore richiede invece altri passaggi: il modello legge il messaggio, rilegge il codice, riscrive una funzione e riprova la compilazione. Evitare una correzione può quindi far risparmiare più token di una sintassi più breve. Tutto il ragionamento →

La formula ha due fattori, e il documento di progetto dice con parole sue che solo il primo è misurato. Il secondo, quanto spesso un programma va riscritto, richiede un modello nel giro, quindi finché un modello non ci viene messo la formula è una regola di progetto e non una regola verificata. La prova che mette un modello nel giro è qui sotto, con le sue regole scritte prima che parta.

Misurato: che cosa rileva il compilatore

heroes mutate prende programmi funzionanti e ci pianta uno sbaglio plausibile alla volta: due argomenti scambiati, un nome scritto male, un caso dimenticato. Poi chiede se il compilatore rifiuta il risultato, due volte: una con tutte le regole, e una con le regole proprie di Heroes spente (--permissive), così la differenza fra le due è quello che aggiungono quelle regole. Un mutante è un programma modificato, e killed vuol dire che il compilatore lo ha rifiutato. Lo strumento dà un tasso per ogni tipo di sbaglio e avverte di non fonderli mai in un unico titolo, perché la misura è il tasso di ciascun tipo.

Letta un tipo alla volta, la tabella mostra tre cose. Alcuni sbagli li rilevano solo le regole proprie di Heroes: un argomento posizionale dove serviva un’etichetta, un nome che ne nasconde un altro scritto uguale. Altri li rilevano già i controlli ordinari, un refuso in un nome o interi mescolati a decimali, e lì le regole non aggiungono nulla e non sono contate a loro favore. E alcuni non li rileva nessun controllo, come un refuso dentro una stringa, e la tabella lo dice. La tabella vera e propria, ogni riga in parole semplici e rieseguita ogni volta che viene pubblicata, sta nel capitolo sugli errori.

Quello che si misura qui è il compilatore: se rifiuta uno sbaglio piantato da uno strumento. Non si misura se un modello fa quegli sbagli, quanto spesso, né se rifiutarli fa risparmiare qualcosa. Quella è la tesi stessa, e la sua prova è la sezione che segue.

Scritto prima di misurare: la prova della tesi

La tesi parla di modelli, quindi la sua prova mette dei modelli nel giro. Il panel di progetto ha fissato le regole di quella prova e l’autore le ha ratificate prima che un modello girasse sui compiti su cui sarà giudicato; le regole sono nel verbale di quella seduta. In parole semplici:

Perché un conteggio di programmi funzionanti, se la tesi parla di token: la ragione della seduta è che ciò che la tesi promette a chi legge è un programma che funziona, con il riscontro che avrebbe chi lo usa. Il giro riporta anche, per ogni braccio, i due fattori della formula (i token del programma e quante riscritture ha richiesto) e i token spesi finché un programma funziona; quelli sono esplorativi, e lo dicono dove vengono riportati.

La previsione, come è stata fissata

La preregistrazione è un file solo, prediction.md, scritto nello stesso commit dei compiti sigillati. Seguono le sue parole, copiate da quel file e controllate contro di esso a ogni build del sito. Prima, l’unico numero:

**`green@3`(strict, full message) − `green@3`(control) on `claude-sonnet-5-5` in the `spec`
context**, over the 40 tasks at three samples each (panel 226's R2). `green@k` is *the hidden cases
passed by turn k under the compiler's feedback*. The interval is **the cluster bootstrap over
tasks**, the task the cluster and its three samples never nine independent pairs, 2,000 resamples,
the seed in the run's provenance; the test is **McNemar's mid-p over the discordant pairs**, the
exact conditional p reported beside it and never as the primary's. **The smallest effect of
interest is 10 percentage points**: a confirmed difference under it is reported as confirmed and
small, never as success. Everything else is exploratory and says so where it is reported.
tests/thesis/held-out/prediction.md, righe 30–37

In parole semplici: la quota di programmi strict verdi entro il terzo tentativo, meno quella del braccio di controllo. Accanto va un intervallo in cui è probabile che cada la differenza vera, calcolato ricampionando i compiti 2.000 volte, e un test che conta solo le coppie in cui i due bracci non sono d’accordo. Una differenza sotto i 10 punti percentuali (una differenza fra due percentuali) viene riportata come piccola, mai come un successo. Poi, che cosa vorrà dire ciascun esito:

- **Confirmed**: the bootstrap interval's lower bound is above 0.
- **Falsified**: its upper bound is below 0.
- **Inconclusive**: otherwise. **Rule, the author's choice (1a)**: an inconclusive result is
  published as inconclusive, with its interval as measured. n is not extended once the result is
  seen, since extending a sample after reading it inflates the false positives it then reports;
  the reserve is drawn only to replace a task the canary burns or the adjudication finds
  ambiguous.
tests/thesis/held-out/prediction.md, righe 46–52

Confermata se l’intervallo sta tutto sopra lo zero, smentita se sta tutto sotto, non conclusiva altrimenti. Un risultato non conclusivo viene pubblicato come non conclusivo, e dopo aver visto il risultato non si aggiungono compiti. Poi, che cosa si aspetta l’autore:

- `green@1`: the strict arm **below** the control by **5 to 15 points**, the price of refusing at
  turn 1, before any feedback.
- `green@3`: the strict arm **above** the control by **at least 10 points**, the smallest effect
  of interest.
- The silent rate at turn 3: the strict arm's **at most half** the control's.

The trial on the assistant's ten tasks (measurement 050) is not evidence for or against these:
those tasks tempt no trap, and its arms were level by turn 3 with no discordant pair of 90.
tests/thesis/held-out/prediction.md, righe 56–63

L’autore si aspetta che le regole costino al primo tentativo, il braccio strict da 5 a 15 punti sotto il controllo, e che ripaghino entro il terzo, almeno 10 punti sopra, con al più la metà dei fallimenti silenziosi del controllo. Il numero dei compiti è fissato: 40 compiti, 3 campioni ciascuno, per ogni modello e braccio. Il collaudo qui sotto doveva servire a dimensionarlo, da quanto spesso i bracci non sono d’accordo; entro il terzo tentativo non ha trovato nessuna coppia in disaccordo, quindi la probabilità che la prova rilevi un effetto reale è dichiarata sconosciuta invece di essere calcolata da un numero che non c’è.

Lo stesso file si chiude con il protocollo e i digest di ciò che il giro userà, in un solo blocco: il compilatore, il prompt e la sua struttura, lo strumento, la specifica che il prompt contiene, i modelli e le loro impostazioni. Il report mette ogni giro a confronto con quel blocco, campo per campo, e stampa ogni differenza come una deviazione.

Il sigillo, e come controllarlo

Una prova che un modello ha letto durante l’addestramento misura la sua memoria, non il linguaggio, e questo repository è pubblico, quindi un compito messo in chiaro finirebbe nella prossima raccolta di testi dal web. Per questo i compiti sono nel repository cifrati, con chiavi che tiene l’autore e che non vengono mai scritte su una riga di comando né in un file del repository. Un digest è l’impronta di un testo: basta cambiare un carattere e cambia tutta. Queste due righe sono quelle che il congelamento ha scritto per la suite e per la sua riserva, ciascun digest calcolato dai digest dei compiti che contiene:

suite c24a5b813f6bba6da2f8ca28f63aa15f76a790be5e012e74468f6924f7ad2274 held-out 40 canary
tests/thesis/held-out/hashes.txt, riga 41
suite b27ea1a9949cd555646f816f73ac5473276156eea7bd5556eeb019a700f77dd4 held-out 20 canary
tests/thesis/held-out/hashes-reserve.txt, riga 21

Quei digest sono calcolati sul testo e sui casi dei compiti, quindi si possono controllare quando l’archivio sarà aperto. Due cose invece si controllano già oggi, da un clone del repository, con i soli file:

$ cd tests/thesis/held-out
$ shasum -a 256 -c suite.enc.sha256 reserve.enc.sha256
suite.enc: OK
reserve.enc: OK
$ git log --format=%H -- prediction.md hashes.txt hashes-reserve.txt suite.enc reserve.enc
a4e09e061130af837a1ed66d61cf247fb10afe4a

Il primo comando controlla i due archivi cifrati contro i digest scritti accanto a loro. Il secondo elenca ogni commit che abbia mai cambiato la previsione, i digest o gli archivi, e ne stampa uno: il commit che li ha fissati. Una modifica successiva a uno qualsiasi di loro stamperebbe una seconda riga; e qualunque risultato, una volta nel repository, si può mettere a confronto con questo commit per vedere quale è venuto prima.

La CI del progetto, i controlli automatici che girano a ogni push su GitHub, ha un job che apre l’archivio dentro una macchina di GitHub, con le chiavi custodite come suoi segreti, e stampa soltanto conteggi e digest, mai il testo di un compito; dove le chiavi non ci sono, come in una copia del repository, dice di non aver attestato nulla invece di passare come se l’avesse fatto. Ogni compito porta inoltre una stringa casuale unica, un canary: prima di un giro a ogni modello si chiede di completarle una per una, e un compito la cui stringa un modello completa esattamente stava nei suoi dati di addestramento, quindi viene sostituito dal compito successivo della riserva. La stessa sonda, fatta girare sui compiti di collaudo prima del congelamento con quattro modelli: 44 sonde, 0 completate.

L’archivio si apre da solo. Entro 30 giorni dalla prima release pubblicata dopo il primo giro su questi compiti, o dal giorno in cui i canary dichiarano bruciata la suite, quale dei due venga prima, l’autore fa il commit delle chiavi e ogni compito diventa leggibile da chiunque. Fino ad allora la chiave viene data a chi la chiede, alla sola condizione di non ripubblicarla, e ogni consegna è annotata nel README della cartella sigillata.

Il collaudo: la prova che lo strumento funziona, non una prova della tesi

Prima del congelamento lo strumento è stato provato su dieci compiti scritti dall’assistente AI che scrive il compilatore. Per una regola del progetto quei dieci compiti non entrano mai in un numero pubblicato: una suite scritta dall’assistente misura quello che l’assistente già si aspetta. Nessuno è stato scritto per invitare a uno sbaglio. Quello che il collaudo può mostrare è che lo strumento misura, quanto costa un giro e dove il protocollo andava riparato. Non può mostrare se la tesi regge, e niente in questa sezione è offerto come prova che regga.

Tre modelli, i dieci compiti, tre campioni ciascuno, la specifica nel prompt; quanti dei 30 programmi di ogni modello e braccio erano verdi al primo tentativo, ed entro il secondo, il terzo e il quinto:

| model | green@1 strict / brief / control | green@2 | green@3, every arm | green@5 | mean turns to green |
|---|---|---|---|---|---|
| Haiku 5.5 | 16 / 16 / 16 | 27 | 28 | 28 | 1.5 |
| Sonnet 5.5 | 18 / 18 / 20 | 29 | 29 | 29 | 1.4 strict, 1.3 control |
| Opus 5.5 | 23 / 23 / 24 | 29 strict, 30 control | 30 | 30 | 1.3 strict, 1.2 control |
docs/measurements/050-the-trial-asked-again-with-every-model-named-level-by-turn-three-through-the-api-and-through-claude-p-and-without-the-specification-no-model-wrote-a-program-that-ran-right.md, righe 36–40

Letto come lo legge il resoconto: pari è quello che dieci compiti possono dire. Questi compiti non sono stati scritti per invitare a uno sbaglio; i compiti sigillati, ognuno una trappola, sono dove una differenza potrebbe vedersi. La preregistrazione dice la stessa cosa di sé, nelle ultime righe citate sopra.

Il collaudo è stato fatto due volte. Il resoconto del primo dice, nelle correzioni scritte sotto, che ogni prima richiesta era andata a Haiku 5.5, qualunque modello nominasse: un difetto dello strumento, trovato quando una regola che tiene ogni risposta al modello nominato dalla sua richiesta ha fermato un giro successivo. Il collaudo è stato rifatto con ogni modello nominato, e i numeri qui sopra sono quelli del secondo.

Non ancora su questa pagina: il numero della tesi

Il giro sui compiti sigillati c’è stato. Con le regole e senza, i modelli hanno risolto gli stessi compiti entro tre tentativi, e ogni programma riuscito in un modo è riuscito anche nell’altro. Letto contro la previsione qui sopra, quella che c’era prima del giro, questo risultato è non conclusivo: il giro non sa dire se le regole aiutano. Un risultato non conclusivo si pubblica come non conclusivo, ed è questo. Le cifre dietro, e il resto di quello che il giro ha letto, non sono ancora su questa pagina.

Il sito dirà il numero della tesi alla soglia di pubblicazione del progetto, il passaggio per annunciare una cosa finita, e non prima: con le parole della pagina di quella soglia, dirlo senza averlo misurato pubblica un’opinione con i decimali.

Perché la tesi: le scelte di progetto. Che cosa dice il compilatore quando rifiuta: il capitolo sugli errori. E che cosa Heroes ha escluso: i no.