# Checklist di verifica

> I controlli da fare su un sito per verificarne la conformità tecnica, distinti tra quelli automatizzabili e quelli che richiedono una verifica manuale.

<!-- Fonte: https://sitoanorma.it/docs/riferimenti/checklist-validazione -->
<!-- Aggiornato: 2026-08-15 -->

Questa è la checklist che usiamo negli audit. È divisa in due parti, perché la distinzione è importante: alcuni controlli si possono automatizzare e mettere in CI, altri richiedono un occhio umano, e confondere i due porta a un falso senso di sicurezza.

## Dati aziendali e footer

- [ ] Il footer è presente su **tutte** le pagine, home inclusa
- [ ] La home page contiene la **partita IVA** (art. 35 DPR 633/1972)
- [ ] Sono presenti ragione sociale e sede legale
- [ ] Per le società di capitali: REA, capitale sociale e, se ricorre, socio unico
- [ ] I dati coincidono con la visura camerale aggiornata
- [ ] I dati sono testo selezionabile, non immagini

## Pagine legali

- [ ] Esiste l'informativa privacy ed è raggiungibile da ogni pagina
- [ ] **Tutti i link legali rispondono 200**: nessun link a pagine inesistenti
- [ ] Le pagine pubblicate corrispondono a quelle linkate nel footer
- [ ] Ogni pagina legale riporta una data di ultimo aggiornamento
- [ ] Nessun riferimento residuo alla piattaforma **ODR** (chiusa nel 2025)

## Form e consensi

- [ ] Ogni form ha una **base giuridica** identificata e documentata
- [ ] Nessuna checkbox obbligatoria "accetto l'informativa privacy"
- [ ] Nessun consenso **pre-spuntato**
- [ ] Le finalità sono separate: newsletter ≠ marketing ≠ profilazione
- [ ] I consensi facoltativi non bloccano l'invio
- [ ] L'informativa è linkata **nel form**, non solo nel footer
- [ ] Ogni campo ha una `<label>` associata
- [ ] I consensi raccolti sono registrati con data, finalità e versione dell'informativa

## Cookie e tracciamento

- [ ] In sessione pulita, **nessun cookie non tecnico** prima del consenso
- [ ] **Nessuno script di terze parti** caricato prima del consenso
- [ ] Comportamento corretto anche dopo un rifiuto e nelle pagine successive
- [ ] "Accetta tutti" e "Rifiuta tutti" hanno pari evidenza
- [ ] La revoca è raggiungibile da ogni pagina
- [ ] La cookie policy elenca i cookie **realmente** presenti
- [ ] Font, mappe e video esterni sono gestiti o auto-ospitati

## Accessibilità

- [ ] `lang` dichiarato su `<html>`
- [ ] Un solo `<h1>` per pagina, gerarchia dei titoli senza salti
- [ ] Contrasto ≥ 4.5:1 sul testo, ≥ 3:1 su componenti UI
- [ ] Ogni immagine ha un `alt` corretto (vuoto se decorativa)
- [ ] Navigazione completa **da tastiera**, focus sempre visibile
- [ ] Skip-link al contenuto principale
- [ ] Il **banner cookie** rispetta gli stessi criteri
- [ ] Reflow corretto a 320px e zoom al 200%

## E-commerce

- [ ] Prezzo totale (IVA e spese incluse) prima della conferma
- [ ] Pulsante finale che esplicita l'**obbligo di pagamento**
- [ ] Termini di vendita accettati esplicitamente
- [ ] Informazioni su recesso e garanzia disponibili prima dell'ordine
- [ ] Sconti con il **prezzo più basso dei 30 giorni** precedenti
- [ ] Email di conferma con informazioni contrattuali e modulo di recesso

## Cosa si può automatizzare

Questi controlli possono stare in una pipeline di CI e girare a ogni rilascio:

| Controllo | Come |
|-----------|------|
| P.IVA presente in home | Test sul markup renderizzato |
| Link legali non rotti | Crawler interno sul build |
| Errori di accessibilità | `axe-core`, `pa11y`, Lighthouse CI |
| Cookie prima del consenso | Playwright con ispezione di `document.cookie` e richieste di rete |
| `lang`, `<h1>` unico, `alt` presenti | Parsing dell'HTML statico |
| Riferimenti a norme obsolete | `grep` sui contenuti (es. `524/2013`) |

Un esempio del controllo più utile in assoluto, quello sui link legali:

```ts
test("nessun link legale rotto", async () => {
  const home = await render("/");
  const href = [...home.matchAll(/href="(\/[^"#?]*)"/g)].map((m) => m[1]);
  for (const url of new Set(href)) {
    expect(await esiste(url), `link rotto: ${url}`).toBe(true);
  }
});
```

## Cosa resta manuale

Nessuno strumento automatico sostituisce queste verifiche:

- la **correttezza dei contenuti** legali: che l'informativa descriva i trattamenti reali;
- l'**individuazione delle norme** applicabili al caso concreto;
- la **qualità** del testo alternativo delle immagini (un `alt` presente ma inutile passa qualsiasi test);
- l'**ordine di tabulazione** e la navigazione reale da tastiera;
- l'uso del **colore** come unico veicolo di informazione;
- la **comprensibilità** effettiva dei testi.

> Gli strumenti automatici verificano che la struttura sia a posto e intercettano indicativamente un terzo dei problemi di accessibilità. La sostanza, legale e di usabilità, resta una valutazione umana.
