ADR-047: La ficha provisional dura hasta la disposición final, el correo se autentica y ALTCHA pasa a v2¶
Estado: Aceptado Derogado en parte por ADR-065: D-3, purga de la ficha provisional. Siguen vigentes correo autenticado y ALTCHA. Fecha: 2026-10-22 Autores: Giampiero (mantenedor principal); lote D, bloque D-3 Relacionados: ADR-038 (enmienda su §6, el widget fijado en 2.3.0, y fija el destino de la ficha provisional), ADR-031 (Ley 1581), ADR-035, ADR-010
Contexto¶
Tres asuntos de la puerta pública: (1) la ficha provisional de quien radica sin autenticar quedaba para siempre aunque el radicado se eliminara por la TRD, conservando datos personales sin finalidad (Ley 1581 de 2012 [confirmar]); (2) el correo entrante se asociaba a una ficha por la sola dirección del remitente, que cualquiera puede falsificar; (3) ALTCHA v1 usaba un reto SHA-256 con maxnumber y la versión 2.3.0 del widget.
Decisión¶
- Purga de la ficha provisional con la disposición final: dentro de la transacción de cada radicado que la purga TRD elimina,
purgar_provisional_huerfanaelimina la ficha si ningún otro radicado la usa y la anonimiza (anonimizada_at, sin identidad) si es actor de alguno. Asientosdocument.tercero_provisional_eliminado|anonimizado. Migración tenant054:origen_provisional(ventanilla|correo), CHECKchk_tercero_provisional_sin_identidad, triggerreject_tercero_conciliacion_rewriteque abre una transición de anonimización. - Conciliación por lote:
GET /terceros/por-conciliar/gruposagrupa por documento declarado o por correo;POST /terceros/conciliar-loteaplica UNA acción a 2..50 fichas del mismo grupo, todo o nada, con las reglas de la conciliación individual y un asiento por ficha con el mismolote_id. Errores: 404tercero_no_encontrado, 409lote_no_homogeneo,lote_cambio,documento_ya_registrado,destino_invalido. - Correo autenticado (E19):
email_cuenta.authserv_iddeclara qué servidor receptor autentica la cuenta.core/autenticacion_correo.py(RFC 8601) confía solo en el primerAuthentication-Resultscuyo authserv-id es el declarado, exige SPF/DKIM/DMARC alineados con el dominio deFrom(alineación relajada con el punto:endswith("."+d)) y, sinauthserv_id, falla cerrado.resolver_por_email(..., autenticado)no tiene valor por defecto: un correo no autenticado crea ficha provisional (origen_provisional='correo') y no se asocia a nadie. Se guardaemail_mensaje.autenticaciony el asiento de radicación lo cita.PATCH /email/cuentas/{id}/authserv-id(USUA_PERM_ADMIN, asiento antes/después) es una ruta propia: es una decisión de confianza. - Horario de atención: parámetro
entidad_horario_atencion(tenant-service, migración tenant017), servido con el contacto de la ventanilla. - ALTCHA v2 (
core/altcha.py): PBKDF2/SHA-256 concosty prefijo calibrables (ALTCHA_COST,ALTCHA_PREFIJO_HEX),parametersfirmados con HMAC-SHA256 sobre JSON canónico; la firma se verifica antes de derivar; anti-replay porsignature. Widgetaltcha@3.3.0fijado exacto (guardián depackage.json).
Alternativas descartadas¶
- Confiar en cualquier
Authentication-Results: el remitente puede inyectar el suyo; solo vale el del servidor propio. - Conservar la ficha provisional siempre: datos personales sin finalidad tras la disposición.
Residuos declarados¶
- Microsoft 365 no emite el authserv-id de forma conforme: queda
NULL(todo correo sin autenticar) hasta confirmarlo [confirmar]. - El vector de prueba de ALTCHA se generó con
altcha-lib@2.4.0, no con el paquete del widget. - La calibración de
ALTCHA_COSTse afina en el navegador (Playwright) al cierre del lote.
Consecuencias¶
- Una dirección falsificada ya no se vincula a la ficha de otra persona.
- El widget y el servidor deben desplegarse juntos: el formato del reto cambió.