# GoodScroll Privacy Browser Observer 4.0.1

Questo progetto produce un'osservazione tecnica e redatta di una pagina web
pubblica. Non è un audit GDPR, non è una certificazione e non assegna punteggi.
La versione 4 sostituisce il precedente esperimento storico: il suo modello
probatorio è deliberatamente più ristretto e fail-closed.

## Cosa osserva

In un profilo Chrome/Chromium nuovo e non autenticato raccoglie soltanto
metadati browser ragionevoli:

- endpoint di rete (host e percorso redatto, metodo, tipo e stato);
- attributi dei cookie senza valori;
- chiavi Web Storage redatte, tipo e dimensione senza valori;
- nomi di database/store IndexedDB e cache;
- registrazioni Service Worker;
- versioni dell'ambiente e hash degli artefatti metodologici.

Gli esiti possibili sono `observed`, `not_observed`, `not_tested` e
`inconclusive`. Il significato preciso è in
[`data/privacy_contract.json`](data/privacy_contract.json).

## Cosa non può dimostrare

Il test non verifica conformità legale, consenso, RLS/ACL, autorizzazioni
backend, log o retention dei provider, cancellazione/esportazione completa,
backup, flussi autenticati, altre interazioni, dispositivi o momenti. Non usa
database di tracker come scorciatoia per dedurre finalità o conformità.

## Requisiti riproducibili

- Python 3.11 o successivo;
- Chrome o Chromium;
- un `chromedriver` compatibile fornito esplicitamente;
- dipendenze installate da `requirements-lock.txt`.

Esempio Windows PowerShell, da questa directory:

```powershell
py -3 -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements-lock.txt
```

Il lock fissa Selenium e l'intero grafo transitivo osservato nell'ambiente di
riferimento Python 3.13/Windows. Non include gli hash dei wheel e non garantisce
che gli stessi file binari esistano per ogni piattaforma: per una conservazione
probatoria di lungo periodo occorre archiviare anche i wheel effettivamente
installati. Questa limitazione è dichiarata, non nascosta.

Prima di aprire il browser la CLI confronta ogni pacchetto installato con il
lock. Una versione assente o diversa rende l'esecuzione non valida: non esiste
un'opzione per ignorare questo controllo.

## Esecuzione

Con driver locale, senza download automatici:

```powershell
.\.venv\Scripts\python.exe .\gdpr_privacy_test_v4.py `
  --url https://goodscroll.it/ `
  --driver-path C:\tools\chromedriver.exe `
  --output-dir C:\GoodScroll-private\privacy-runs
```

Selenium Manager è disabilitato per impostazione predefinita. Solo se si
accetta consapevolmente la sua risoluzione (e l'eventuale download) del driver:

```powershell
.\.venv\Scripts\python.exe .\gdpr_privacy_test_v4.py `
  --url https://goodscroll.it/ `
  --use-selenium-manager `
  --output-dir C:\GoodScroll-private\privacy-runs
```

La URL iniziale con query o fragment viene rifiutata: evita che un magic link o
un token trasformi involontariamente la sessione in autenticata e impedisce che
un segreto resti nella cronologia della shell. Query e fragment eventualmente
osservati nelle richieste o nei redirect sono comunque redatti. La directory di
output dovrebbe trovarsi fuori dalla webroot.

## Output e codici di uscita

Ogni run crea una sottodirectory univoca e non sovrascrive file:

- run completa: `observation.json`, `report.html`, `report.pdf`,
  `manifest.json`, exit `0`;
- fase incompleta: `diagnostic.json`, `manifest.json`, exit `4`;
- errore browser/runtime: diagnostica soltanto, exit `3`;
- interruzione: diagnostica soltanto, exit `130`;
- input/configurazione non validi: nessun report, exit `2`;
- errore di scrittura: exit `5`.

`report.html` e `report.pdf` sono due proiezioni dello stesso oggetto di
osservazione strutturato, salvato in `observation.json`: il PDF non esegue una
seconda analisi. Il PDF è un documento A4 testuale, con tabelle in scala di
grigi e numeri di pagina; non contiene grafici, icone, punteggi, colori
semaforici, proclami o giudizi legali.

Una run completa è soltanto tecnicamente completa. Entrambi i report restano
neutrali e richiedono revisione umana prima di un'eventuale pubblicazione. Se la
generazione di HTML o PDF fallisce, i due report vengono rimossi insieme e il
run termina fail-closed con sola diagnostica e manifest inconclusivo.

## Test locali, senza browser o rete

```powershell
python -m unittest discover -s tests -v
```

I test usano driver fittizi: non aprono browser, non effettuano accessi e non
eseguono richieste esterne.

## Struttura e provenienza

- `METHODOLOGY.txt`: risorsa metodologica canonica, confini e regola
  fail-closed;
- `data/observation_config.json`: fasi e limiti;
- `data/privacy_contract.json`: significato degli esiti e limiti;
- `requirements-lock.txt`: dipendenza diretta fissata;
- `tests/`: regressioni per redazione, hostname, output e fallimenti.

Le risorse relative sono sempre risolte rispetto a questa directory e i loro
SHA-256 sono registrati nel risultato. Il progetto non dipende dalla vecchia
base dati di cookie/tracker perché una corrispondenza nominale non può provare
una finalità o una violazione.
