RGPD desde el diseño, y cada compromiso probado
Una dirección es un dato personal. Esta página enumera exactamente qué registra, almacena y nunca conserva Addrova. Cada afirmación tiene un identificador y está vinculada a una prueba automática que se ejecuta con cada modificación del código.
Los compromisos de cero registros
En estas tablas, «dirección» designa cualquier dato introducido por el cliente: texto libre, componentes, coordenadas solicitadas, archivos por lotes. La fuente de referencia es la especificación de cero registros de la API, en francés; esta página la traduce sin alterar su sentido.
Versión de la especificación del 2026-10-19
Qué se registra (lista exhaustiva)
| Id | Afirmación | Prueba automática |
|---|---|---|
| ZL-01 | Una línea por solicitud HTTP, con exactamente: método, plantilla de ruta (/v1/geocode, nunca la URL real ni la cadena de consulta), estado, duración, inquilino seudonimizado, identificador de solicitud aleatorio. Sin dirección IP, sin user-agent, sin clave de API. | api/tests/test_zerolog.py::test_access_log_exact_fields |
| ZL-02 | Los únicos demás mensajes que emite el código de Addrova son los del inventario siguiente; sus parámetros son identificadores de trabajo, contadores, estados o nombres de tipos de excepción. | api/tests/test_privacy_claims.py::test_log_inventory_matches_code |
| ZL-03 | El inquilino se seudonimiza en todas partes (registros, trazas): 16 caracteres hexadecimales de un SHA-256 con sal de su identificador; el identificador en claro nunca aparece. | api/tests/test_observability.py::test_tenant_hash_is_stable_and_opaqueapi/tests/test_zerolog.py::test_access_log_exact_fields |
Qué nunca se registra ni se traza
| Id | Afirmación | Prueba automática |
|---|---|---|
| ZL-10 | Ninguna dirección, ninguna coordenada solicitada ni ninguna clave de API aparece en los registros, en todas las rutas (geocodificación, inversa, autocompletado, reparación, lotes, compatibilidad con Google y Nominatim), incluso en caso de error (motor caído, entrada rechazada, parámetro no válido, clave errónea, ruta desconocida). | api/tests/test_zerolog.py::test_canary_never_logged |
| ZL-11 | Los mensajes de las bibliotecas de terceros se neutralizan: parámetros ocultos, cadena de consulta borrada, excepción reducida a su tipo (sin mensaje ni traza). | api/tests/test_zerolog.py::test_third_party_logger_args_and_query_redacted |
| ZL-12 | Las respuestas de error no devuelven el valor erróneo ni el mensaje interno del motor. | api/tests/test_api.py::test_geocode_invalid_paramsapi/tests/test_api.py::test_engine_errors_do_not_echo_query |
| ZL-13 | Las trazas de OpenTelemetry solo llevan atributos de una lista permitida (método, plantilla de ruta, estado, inquilino seudonimizado, operación del motor, país, número de resultados, precisión del primer resultado), sin eventos; ni dirección, ni coordenada, ni clave, ni identificador de inquilino en claro. | api/tests/test_observability.py::test_spans_carry_only_allowlisted_attributesapi/tests/test_observability.py::test_span_content |
| ZL-15 | Consola: la dirección de correo electrónico, los tokens de enlace mágico y los tokens de sesión no aparecen en ningún registro. | api/tests/test_console.py::test_email_and_tokens_never_logged |
| ZL-16 | Demostración pública del sitio (/demo/v1): ni la dirección introducida ni la dirección IP del visitante aparecen en los registros; la IP nunca se almacena, solo una huella HMAC con secreto diario (inutilizable tras la rotación) sirve para contar las solicitudes. | 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 | Las métricas de Prometheus solo tienen etiquetas con valores acotados; una ruta desconocida se cuenta como <unmatched>. | api/tests/test_observability.py::test_metrics_labels_are_boundedapi/tests/test_observability.py::test_spans_carry_only_allowlisted_attributes |
Qué se almacena, y durante cuánto tiempo
| Id | Afirmación | Prueba automática |
|---|---|---|
| ZL-20 | Las claves de API se almacenan únicamente como huella SHA-256 (más 12 caracteres de prefijo para mostrarlas). | api/tests/test_tenancy_persistent.py::test_keys_are_hashed_and_revocable |
| ZL-21 | La base de datos no contiene ninguna solicitud ni ningún resultado: solo inquilinos, claves (huellas) y contadores de uso (inquilino, día, punto de acceso, cantidad). | api/tests/test_privacy_claims.py::test_schema_has_no_content_columns |
| ZL-22 | Lotes: el archivo de entrada se elimina en cuanto termina el tratamiento; el resultado y los metadatos del trabajo se eliminan al final de la retención (1 hora tras terminar por defecto, configurable) o de inmediato con DELETE; un trabajo que nunca se trató se purga a las 24 horas. | 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 | Los metadatos de un trabajo por lotes no contienen ninguna fila del archivo (contadores, fechas, nombres de columnas, país por defecto). | api/tests/test_privacy_claims.py::test_batch_metadata_has_no_row_content |
| ZL-25 | Consola: el único dato personal almacenado es la dirección de correo electrónico de la cuenta (y la de un enlace de acceso en curso, válido 15 minutos, de un solo uso); los tokens de enlace y de sesión se almacenan únicamente como huella 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 | Una organización no ve ni las claves ni el uso de otra; una clave revocada o caducada (rotación) es rechazada. | api/tests/test_console.py::test_org_isolationapi/tests/test_console.py::test_keys_lifecycle_and_plan_limit |
| ZL-27 | Webhook de fin de lote: la carga útil solo contiene el identificador, el estado, los contadores y los enlaces del trabajo, nunca una fila del archivo ni una dirección; la URL y el secreto del webhook nunca se registran. | api/tests/test_batch_stream.py::test_webhook_delivery_signed_without_addresses_and_retried |
| ZL-28 | Idempotencia (Idempotency-Key): solo se conserva durante 24 horas una huella SHA-256 de la solicitud (y, para un lote, el identificador del trabajo), nunca la dirección enviada ni la respuesta. | 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 | Ninguna salida de red no declarada: denegación por defecto en el namespace; el sitio web no tiene salidas; la API solo llega al DNS del clúster, a sus bases de datos (PostgreSQL, Redis), al recolector OTel interno y, para los webhooks, a HTTPS hacia Internet público (rangos privados, locales y de metadatos excluidos). Ninguna herramienta de análisis de terceros puede recibir una petición. | 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 | El trabajo por lotes de un cliente es invisible para los demás clientes. | api/tests/test_batch.py::test_isolation_delete_and_expiry |
Qué no existe (todavía)
| Id | Afirmación | Prueba automática |
|---|---|---|
| ZL-30 | El respaldo asíncrono de /v1/repair (LLM) está desactivado: ninguna llamada externa, ninguna dirección sale del servicio. | api/tests/test_repair.py::test_repair_unrepairable_and_async_disabled |
| ZL-32 | En v0 no se envía realmente ningún correo (bandeja de salida en memoria) y no hay conectado ningún proveedor de facturación real (proveedor ficticio). | api/tests/test_privacy_claims.py::test_no_external_transport_by_default |
| ZL-31 | No hay caché de resultados en v0 (la caché HMAC con secreto rotatorio de la ADR 0005 aún no está implementada). | api/tests/test_privacy_claims.py::test_no_result_cache_in_v0 |
Inventario de mensajes de registro
Estos son los únicos mensajes que emite el código, en su formato exacto. Una prueba falla si el código y esta lista divergen.
%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: %sFuera del alcance de estas pruebas
Estos puntos se verifican de otra manera, y lo decimos:
- Ingress / proxy: su registro de accesos debe estar desactivado en las rutas de la API (ADR 0004); configuración de infraestructura, por verificar en infra/ y en el clúster.
- Motor (addrova_engine): se compromete a no registrar las solicitudes (ADR 0002); sus propias pruebas lo verifican.
- Exportación de trazas: solo si ADDROVA_OTLP_ENDPOINT está definido, hacia un colector alojado en la UE; sin este ajuste, ninguna traza sale del proceso.
- Almacenamiento de los archivos por lotes: v0 en el disco local del contenedor (permisos 0600); almacenamiento de objetos cifrado en la UE previsto para producción (ADR 0006, ADR 0009).
Como no se conserva nada, nada se reutiliza
Addrova no utiliza sus solicitudes para entrenar modelos, constituir conjuntos de datos ni enriquecer su índice, y el código lo concreta: las consultas y los resultados nunca se registran (ZL-10), la base de datos no contiene ninguna solicitud ni resultado (ZL-21), los archivos por lotes se eliminan tras el tratamiento (ZL-22), no hay caché de resultados (ZL-31) y ninguna dirección se envía a un servicio externo (ZL-30).
Todavía no declarado
- Alojamiento exclusivamente en la UE: el proveedor de alojamiento y la región aún no se han publicado. [À VÉRIFIER]
- Subencargados y contrato de encargo del tratamiento (DPA): se publicarán, con firma en línea, antes del lanzamiento. [À VÉRIFIER]
- Certificaciones: ninguna declarada. ISO 27001 está prevista en una etapa posterior.
Fuentes de datos y licencias
Nos apoyamos en datos abiertos oficiales con licencias abiertas (para Francia, Licence Ouverte 2.0). Cada respuesta de la API incluye una lista de atribución con sus fuentes. Los datos con licencia de compartir igual, como OpenStreetMap, permanecen en un índice separado y nunca se fusionan con el índice oficial.
Preguntas sobre la conformidad
¿Puedo verificar estos compromisos?
Cada compromiso nombra la prueba automática que lo verifica. Las pruebas se ejecutan con cada modificación; una de ellas falla si desaparece una prueba citada o si el inventario de registros ya no coincide con el código. El acceso al conjunto de pruebas para una auditoría está por definir. [À VÉRIFIER]
¿Registran mi dirección IP?
La aplicación no: su registro de accesos no contiene dirección IP, ni user-agent, ni clave de API (ZL-01). El ingress situado delante también debe tener desactivado su registro de accesos; es un ajuste de infraestructura, indicado arriba como fuera del alcance de las pruebas.
¿Cuánto tiempo se conservan los resultados de un lote?
Una hora después de terminar por defecto, o hasta que elimine el trabajo (ZL-22). El archivo de entrada se elimina en cuanto termina el tratamiento.