Come assegniamo il punteggio: 23 controlli e i loro pesi
Un punteggio su 100 è un'affermazione, e quasi nessuno è verificabile: un numero senza metodo dietro, senza versione sopra e senza modo di capire dopo se è cambiato il tuo sito o lo strumento.
Il nostro sono 23 controlli distribuiti su cinque dimensioni ponderate, ed è tutto dentro un unico file: packages/engine/src/scorer.js. Ecco cosa misura ogni parte, quanto vale e cosa non può dirti.
Le cinque dimensioni
Accessibilità — 30%, 3 controlli. Se una macchina riesce anche solo a leggere la pagina. Se il contenuto esiste senza JavaScript, se il contenuto principale comincia vicino all'inizio dell'HTML, se la pagina è abbastanza leggera da essere scaricata intera. È la dimensione più pesante perché tutto il resto è decorazione se il crawler riceve un guscio vuoto.
Reperibilità per le IA — 25%, 6 controlli. Se i client IA possono entrare e orientarsi: se esiste il robots.txt, se permette i bot di ricerca IA, se c'è una sitemap, se il sito risponde ad Accept: text/markdown, se c'è un llms.txt, se dichiari Content-Signal.
Dati strutturati — 20%, 5 controlli. Schema.org/JSON-LD, Open Graph, meta description, URL canonico e il lang sull'<html>. Quello che dice a una macchina cosa la pagina è, non cosa racconta.
HTML semantico — 15%, 5 controlli. Gerarchia dei titoli, <article> o <main>, rapporto tra elementi semantici e div, testi alternativi che descrivano qualcosa, profondità di annidamento dei div. È da qui che l'estrazione decide quali parti della pagina sono la pagina.
Efficienza del contenuto — 10%, 4 controlli. Riduzione di token da HTML a Markdown, rapporto tra contenuto e rumore, peso della pagina, stili inline. Quanto di ciò che spedisci è contenuto.
Perché non contano tutti allo stesso modo
Ogni controllo porta un livello di evidenza accanto al peso, ed è quel livello a fissare il peso:
- provato — lo documenta un fornitore di modelli, oppure lo dimostra una misurazione. 3 su 23.
- plausibile — ragionamento solido, coerente con il funzionamento dell'estrazione, ma nessun fornitore l'ha confermato. 13 su 23.
- speculativo — la convenzione esiste e il settore ci crede, ma nessuno ha mostrato che un bot la consumi. 7 su 23.
Portato fino al punteggio finale, questo mette circa 32 dei 100 punti su controlli provati, 51 su plausibili e 17 su speculativi.
I tre provati: la pagina si renderizza senza JavaScript, il robots.txt permette i bot di ricerca IA, la pagina porta marcatura Schema.org. Il primo è il segnale meglio documentato di tutto questo campo, perché nessun crawler IA importante esegue JavaScript. Il secondo è l'unica vera barriera del quadro: se blocchi un bot di ricerca, da quell'assistente sparisci.
All'altro estremo ci sono llms.txt e Content-Signal. Li servono moltissimi domini, nessun fornitore ha confermato di leggerli e Google ha dichiarato che llms.txt non ha alcun effetto. Continuiamo a valutarli — l'assenza di prove non prova l'assenza — ma al 10% della loro dimensione ciascuno invece del 20% che llms.txt portava un tempo. L'efficienza del contenuto è speculativa da cima a fondo: le pipeline di recupero fanno un'estrazione stile Readability prima che un modello veda qualsiasi cosa, quindi un HTML snello rende meno di quanto il settore supponga.
Quel riequilibrio è stato la versione 2 della griglia. Con la v1 «si renderizza senza JavaScript» valeva il 6% del punteggio finale mentre la riduzione di token, che nessun fornitore ha mai nominato, valeva il 10%: il controllo meglio documentato del quadro contava meno di un'intuizione.
La griglia ha un numero di versione
Lo scorer esporta RUBRIC_VERSION, adesso 2. La v1 erano i pesi originali, febbraio 2026. La v2 è il riequilibrio per evidenza, luglio 2026.
Senza quel numero un punteggio non è riproducibile. Fai un'analisi e ti dà 90. Sei mesi dopo ti dà 85. È peggiorato il tuo sito o abbiamo spostato noi i pali? Un certificato che non dice con quale righello è stato misurato è un numero che nessuno può verificare.
Questo errore l'abbiamo messo in produzione. La versione esisteva nello scorer e viaggiava sull'oggetto risultato, ma non arrivava mai al database: così la classifica ordinava punteggi l'uno contro l'altro senza sapere se fossero stati misurati allo stesso modo, righe v1 sopra righe v2 come se il confronto volesse dire qualcosa.
La migrazione 007_add_rubric_version_to_analyses.js ha aggiunto la colonna, con 1 come valore predefinito per ogni riga esistente. Quel valore non era un'ipotesi: tutte le righe precedevano la v2, quindi 1 è il dato. Indicizza anche (rubric_version, score), così una classifica può essere ristretta a una sola griglia. La parte delicata era il momento: doveva entrare prima che venisse scritta la prima analisi in v2, altrimenti le righe nuove avrebbero dichiarato di essere v1 senza esserlo.
Cosa non valutiamo di proposito
Una pagina, non un sito. Un'analisi legge un URL. robots.txt, sitemap e llms.txt valgono per tutto il sito; il resto riguarda quella pagina e solo quella. Una pagina fatta bene su un sito per il resto scadente prende un buon punteggio, ed è giusto così.
Cosa un modello abbia davvero fatto di te. Non possiamo vedere se ChatGPT ti ha citato, se Claude ha costruito la risposta a partire dalla tua pagina, se qualcuno ti ha nominato. Dall'esterno non lo vede nessuno. Ogni controllo è una proprietà di quello che servi, non di quello che ne è stato fatto.
Se un crawler sia davvero entrato. Quando sondiamo spacciandoci per un bot IA e qualcosa sul bordo ci respinge mentre il robots.txt dice che siamo i benvenuti, non sappiamo in quale dei due si imbatta un crawler verificato. Quel controllo viene limitato a 60 — una promozione con riserva, non una bocciatura — e la riga di dettaglio dice cos'è successo. Un numero è un brutto modo di dire «non si sa».
Qui dentro non si verifica se quello che hai scritto valga qualcosa. Un punteggio alto è un buon indizio di partenza: una macchina riesce a leggere la pagina e capisce cos'è. Non è la promessa di venire citato.
Lo applichiamo a noi stessi
agentready.md prende 94/100. Quella cifra esce dal database — la nostra analisi più recente del nostro dominio, collegata al suo certificato — invece di essere scritta a mano nel template. Quando si muove, si muove la pagina. Quando non c'è nessuna analisi, la pagina non mostra niente invece di mostrare un numero vecchio.
È già scesa. Per mesi la nostra origine restituiva 404 su /robots.txt mentre la Content Signals Policy gestita di Cloudflare rispondeva sul bordo con un 200 e un file che non avevamo mai scritto. Il nostro stesso scorer leggeva quel 200 e ci promuoveva. Sistemata l'origine e spento il file gestito, siamo passati da 93 a 90. Il numero più basso era quello onesto: quei tre punti misuravano il file di Cloudflare, non il nostro.