GDPR fin dalla progettazione, e ogni impegno verificato
Un indirizzo è un dato personale. Questa pagina elenca esattamente cosa Addrova registra, conserva e non tiene mai. Ogni affermazione ha un identificatore ed è collegata a un test automatico eseguito a ogni modifica del codice.
Gli impegni zero log
In queste tabelle «indirizzo» indica qualsiasi dato inserito dal cliente: testo libero, componenti, coordinate richieste, file in blocco. La fonte di riferimento è la specifica zero log dell’API, in francese; questa pagina la traduce senza cambiarne il senso.
Versione della specifica del 2026-10-19
Cosa viene registrato (elenco esaustivo)
| Id | Affermazione | Test automatico |
|---|---|---|
| ZL-01 | Una riga per richiesta HTTP, con esattamente: metodo, modello di rotta (/v1/geocode, mai l’URL reale né la stringa di query), stato, durata, tenant pseudonimizzato, identificatore di richiesta casuale. Nessun indirizzo IP, nessuno user-agent, nessuna chiave API. | api/tests/test_zerolog.py::test_access_log_exact_fields |
| ZL-02 | Gli unici altri messaggi emessi dal codice di Addrova sono quelli dell’inventario qui sotto; i loro parametri sono identificatori di job, contatori, stati o nomi di tipi di eccezione. | api/tests/test_privacy_claims.py::test_log_inventory_matches_code |
| ZL-03 | Il tenant è pseudonimizzato ovunque (log, tracce): 16 caratteri esadecimali di uno SHA-256 con salt del suo identificatore; l’identificatore in chiaro non compare mai. | api/tests/test_observability.py::test_tenant_hash_is_stable_and_opaqueapi/tests/test_zerolog.py::test_access_log_exact_fields |
Cosa non viene mai registrato né tracciato
| Id | Affermazione | Test automatico |
|---|---|---|
| ZL-10 | Nessun indirizzo, nessuna coordinata richiesta e nessuna chiave API compare nei log, su tutte le rotte (geocodifica, inversa, completamento automatico, riparazione, blocchi, compatibilità Google e Nominatim), anche in caso di errore (motore non disponibile, input rifiutato, parametro non valido, chiave errata, rotta sconosciuta). | api/tests/test_zerolog.py::test_canary_never_logged |
| ZL-11 | I messaggi delle librerie di terze parti sono neutralizzati: parametri mascherati, stringa di query cancellata, eccezione ridotta al suo tipo (senza messaggio né traccia). | api/tests/test_zerolog.py::test_third_party_logger_args_and_query_redacted |
| ZL-12 | Le risposte di errore non restituiscono né il valore errato né il messaggio interno del motore. | api/tests/test_api.py::test_geocode_invalid_paramsapi/tests/test_api.py::test_engine_errors_do_not_echo_query |
| ZL-13 | Le tracce OpenTelemetry portano solo attributi di una lista consentita (metodo, modello di rotta, stato, tenant pseudonimizzato, operazione del motore, paese, numero di risultati, precisione del primo risultato), senza eventi; né indirizzo, né coordinata, né chiave, né identificatore di tenant in chiaro. | api/tests/test_observability.py::test_spans_carry_only_allowlisted_attributesapi/tests/test_observability.py::test_span_content |
| ZL-15 | Console: l’indirizzo e-mail, i token del link magico e i token di sessione non compaiono in nessun log. | api/tests/test_console.py::test_email_and_tokens_never_logged |
| ZL-16 | Demo pubblica del sito (/demo/v1): né l’indirizzo inserito né l’indirizzo IP del visitante compaiono nei log; l’IP non viene mai conservato, solo un’impronta HMAC con segreto giornaliero (inutilizzabile dopo la rotazione) serve a contare le richieste. | api/tests/test_demo.py::test_demo_never_logs_address_or_ipapi/tests/test_demo.py::test_fingerprint_rotates_daily_and_hides_ipapi/tests/test_demo.py::test_redis_mode_shares_secret_and_counters |
| ZL-14 | Le metriche Prometheus hanno solo etichette con valori limitati; un percorso sconosciuto è conteggiato come <unmatched>. | api/tests/test_observability.py::test_metrics_labels_are_boundedapi/tests/test_observability.py::test_spans_carry_only_allowlisted_attributes |
Cosa viene conservato, e per quanto tempo
| Id | Affermazione | Test automatico |
|---|---|---|
| ZL-20 | Le chiavi API sono conservate solo come impronta SHA-256 (più 12 caratteri di prefisso per la visualizzazione). | api/tests/test_tenancy_persistent.py::test_keys_are_hashed_and_revocable |
| ZL-21 | Il database non contiene alcuna richiesta né alcun risultato: solo tenant, chiavi (impronte) e contatori di utilizzo (tenant, giorno, endpoint, numero). | api/tests/test_privacy_claims.py::test_schema_has_no_content_columns |
| ZL-22 | Blocchi: il file di input è eliminato appena termina il trattamento; il risultato e i metadati del job sono eliminati al termine della conservazione (1 ora dopo il completamento per impostazione predefinita, configurabile) o immediatamente con DELETE; un job mai trattato è eliminato dopo 24 ore. | api/tests/test_batch.py::test_csv_roundtrip_usage_and_input_purgeapi/tests/test_batch.py::test_isolation_delete_and_expiryapi/tests/test_batch.py::test_result_purged_after_retention |
| ZL-23 | I metadati di un job in blocco non contengono alcuna riga del file (contatori, date, nomi delle colonne, paese predefinito). | api/tests/test_privacy_claims.py::test_batch_metadata_has_no_row_content |
| ZL-25 | Console: l’unico dato personale conservato è l’indirizzo e-mail dell’account (e quello di un link di accesso in corso, valido 15 minuti, monouso); i token di link e di sessione sono conservati solo come impronta SHA-256. | api/tests/test_privacy_claims.py::test_schema_has_no_content_columnsapi/tests/test_console.py::test_link_is_single_use_and_logout |
| ZL-26 | Un’organizzazione non vede né le chiavi né l’utilizzo di un’altra; una chiave revocata o scaduta (rotazione) viene rifiutata. | api/tests/test_console.py::test_org_isolationapi/tests/test_console.py::test_keys_lifecycle_and_plan_limit |
| ZL-27 | Webhook di fine blocco: il payload contiene solo l’identificatore, lo stato, i contatori e i link del job, mai una riga del file né un indirizzo; l’URL e il segreto del webhook non vengono mai registrati. | api/tests/test_batch_stream.py::test_webhook_delivery_signed_without_addresses_and_retried |
| ZL-28 | Idempotenza (Idempotency-Key): viene conservata per 24 ore solo un’impronta SHA-256 della richiesta (e, per un blocco, l’identificatore del job), mai l’indirizzo inviato né la risposta. | api/tests/test_idempotency_versioning.py::test_idempotency_never_stores_addressapi/tests/test_idempotency_versioning.py::test_in_progress_conflict_and_stores_keep_no_content |
| ZL-29 | Nessuna uscita di rete non dichiarata: rifiuto per impostazione predefinita nel namespace; il sito web non ha uscite; l'API raggiunge solo il DNS del cluster, i suoi database (PostgreSQL, Redis), il collettore OTel interno e, per i webhook, HTTPS verso Internet pubblico (intervalli privati, locali e di metadati esclusi). Nessuno strumento di analisi di terze parti può ricevere una richiesta. | api/tests/test_k8s_hardening.py::test_egress_is_limited_to_declared_flowsapi/tests/test_k8s_hardening.py::test_namespace_is_restricted_and_denies_by_default |
| ZL-24 | Il job in blocco di un cliente è invisibile agli altri clienti. | api/tests/test_batch.py::test_isolation_delete_and_expiry |
Cosa non esiste (ancora)
| Id | Affermazione | Test automatico |
|---|---|---|
| ZL-30 | Il ripiego asincrono di /v1/repair (LLM) è disattivato: nessuna chiamata esterna, nessun indirizzo lascia il servizio. | api/tests/test_repair.py::test_repair_unrepairable_and_async_disabled |
| ZL-32 | Nella v0 non viene realmente inviata alcuna e-mail (casella di posta in uscita in memoria) e non è collegato alcun fornitore di fatturazione reale (fornitore fittizio). | api/tests/test_privacy_claims.py::test_no_external_transport_by_default |
| ZL-31 | Nella v0 non esiste alcuna cache dei risultati (la cache HMAC a segreto rotante dell’ADR 0005 non è ancora implementata). | api/tests/test_privacy_claims.py::test_no_result_cache_in_v0 |
Inventario dei messaggi di log
Sono gli unici messaggi emessi dal codice, nel loro formato esatto. Un test fallisce se il codice e questo elenco divergono.
%s %s %d %.1fms tenant=%s rid=%s
job %s queued rows=%d
job %s %s rows=%d matched=%d
job %s failed: %s
engine loaded: %s
addrova_engine not installed, using the fake engine
usage flush failed: %s
index preloaded: %d bytes
webhook job %s attempt %d status %s
engine contract violation: candidate without source
engine failure: %sFuori dall’ambito di questi test
Questi punti si verificano in altro modo, e lo diciamo:
- Ingress / proxy: il suo log di accesso deve essere disattivato sulle rotte dell’API (ADR 0004); configurazione dell’infrastruttura, da verificare in infra/ e sul cluster.
- Motore (addrova_engine): si impegna a non registrare le richieste (ADR 0002); i suoi test lo verificano.
- Esportazione delle tracce: solo se ADDROVA_OTLP_ENDPOINT è definito, verso un collettore ospitato nell’UE; senza questa impostazione nessuna traccia lascia il processo.
- Conservazione dei file in blocco: v0 sul disco locale del container (permessi 0600); archiviazione di oggetti cifrata nell’UE prevista per la produzione (ADR 0006, ADR 0009).
Poiché nulla viene conservato, nulla viene riutilizzato
Addrova non usa le sue richieste per addestrare modelli, costituire insiemi di dati o arricchire il proprio indice, e il codice lo rende concreto: interrogazioni e risultati non sono mai registrati (ZL-10), il database non contiene richieste né risultati (ZL-21), i file in blocco sono eliminati dopo il trattamento (ZL-22), non esiste una cache dei risultati (ZL-31) e nessun indirizzo viene inviato a un servizio esterno (ZL-30).
Non ancora dichiarato
- Hosting esclusivamente nell’UE: il fornitore di hosting e la regione non sono ancora pubblicati. [À VÉRIFIER]
- Sub-responsabili e accordo sul trattamento dei dati (DPA): saranno pubblicati, con firma online, prima del lancio. [À VÉRIFIER]
- Certificazioni: nessuna dichiarata. ISO 27001 è prevista in una fase successiva.
Fonti dei dati e licenze
Ci basiamo su dati aperti ufficiali con licenze aperte (per la Francia, Licence Ouverte 2.0). Ogni risposta dell’API riporta un elenco di attribuzione che nomina le fonti. I dati con licenza share-alike, come OpenStreetMap, restano in un indice separato e non vengono mai fusi con l’indice ufficiale.
Domande sulla conformità
Posso verificare questi impegni?
Ogni impegno nomina il test automatico che lo verifica. I test vengono eseguiti a ogni modifica; uno di essi fallisce se un test citato scompare o se l’inventario dei log non corrisponde più al codice. L’accesso alla suite di test per un audit è da definire. [À VÉRIFIER]
Registrate il mio indirizzo IP?
L’applicazione no: il suo log di accesso non contiene indirizzo IP, user-agent né chiave API (ZL-01). Anche l’ingress davanti ad essa deve avere il log di accesso disattivato; è un’impostazione di infrastruttura, indicata sopra come fuori dall’ambito dei test.
Per quanto tempo vengono conservati i risultati di un blocco?
Un’ora dopo il completamento per impostazione predefinita, oppure finché non elimina il job (ZL-22). Il file di input viene eliminato appena termina il trattamento.