Skip to content

ADR-071: Lectura de auditoría de lo inactivo

Estado: Aceptado. Fecha: 2026-11-09 Autores: Giampiero (mantenedor principal) Relacionados: ADR-065 (D5: lo inactivo no se ve; «Consultar exige reactivar»), ADR-070 (privacidad por función), ADR-010 (auditoría inmutable)


Contexto

El ADR-065 declaró dos consecuencias sin resolver: consultar lo inactivo exige reactivarlo, y no hay registro por radicado (solo GET /eliminacion/inactivados, por expediente). Reactivar para mirar mueve el estado del sistema solo para auditar, y el índice del art. 20 de la Ley 1712 pierde lo inactivo. Decisión del usuario (2026-11-09): lo inactivo se lee solo para auditoría, desde la administración.

Decisiones

D1. Solo administración. USUA_PERM_ADMIN con crud >= 1 (ROOT lo cumple por el bypass). Ni gestión documental ni los usuarios finales. El registro de expedientes de archive (USUA_PERM_TRD, crud 4) no cambia.

D2. Solo lectura, sin reactivar. Dos rutas en document-service: GET /api/v1/documents/inactivos (lista paginada, X-Total-Count) y GET /api/v1/documents/inactivos/{id}. No existe ruta que modifique lo inactivo desde ahí; reactivar sigue siendo el acto de sistema con segunda persona (ADR-065 D4).

D3. Registro, no contenido. Se devuelven: número de radicado, tipo, fecha, estado, dependencias de origen y destino, nivel de seguridad, y la inactivación (quién, cuándo, motivo y lote inactivado_ref). No se devuelven asunto, remitente, destinatarios ni texto, ni bytes de anexos. Leer el contenido sigue exigiendo reactivar. Aun así se aplica la privacidad (D4): que exista un radicado privado ya es una señal.

D4. Clearance y privacidad en el WHERE. El no-read-up (RF-SEG-08) rige también aquí: el nivel del llamador va en la consulta y el total se cuenta con la misma condición. Un administrador con clearance menor no ve ni cuenta lo que lo supera. Lo mismo la privacidad (ADR-070): la base radicados_todos no la filtra, así que el registro aplica el predicado de la vista; un radicado privado inactivo no se lista ni se cuenta para quien no lo ve (el administrador no ve lo privado ajeno).

D5. Cada lectura deja asiento. document.inactivo_consultado en public.audit_log, atómico con la lectura, con quién, qué (id o filtros), cuántos devolvió y el motivo, obligatorio (motivo, 10 a 500 caracteres; sin él, 422 motivo_requerido). Sin asiento no hay respuesta (fail-closed). Los asientos no llevan contenido.

D6. Un radicado reactivado sale del registro. La reactivación limpia la marca (ADR-065); su historia queda en los asientos de audit_log, no en el registro.

D7. Índice del art. 20: incluye lo inactivo, sin marcarlo. El índice público (/public/archive/indice-clasificados) se arma con lo clasificado que la entidad conserva, también lo inactivo: la calificación sigue vigente y un registro que lo omitiera sería incompleto. No lleva marca de inactivo: publicarla le diría al ciudadano que algo se inactivó, contra ADR-065 D5 (ahí solo recibe «No encontrado»). El índice sigue siendo agregado por serie y causal, sin números, sin conteos y sin la marca; lo único que cambia es que el grupo de un expediente inactivo ya no desaparece. document-service entrega los radicados desde radicados_todos (InactivacionRepository.clasificados_incluso_inactivos) y archive-service resuelve la serie desde expedientes_todos. El índice interno con número de radicado (reports, para usuarios) no cambia: lo inactivo sigue fuera de la vista.

Consecuencias, sin suavizar

  • El administrador sabe que existe un radicado inactivo, cuándo y por qué se inactivó, pero no puede leer su contenido sin reactivarlo; una auditoría de contenido sigue pasando por reactivar con otra persona.
  • El registro dice «existe». El ciudadano sigue recibiendo «No encontrado» en la verificación pública (ADR-065).
  • Un administrador malicioso puede enumerar el registro (con asiento y motivo, sin contenido, con clearance). El asiento es la contención, no la prevención.
  • Lo inactivo anterior a ADR-065 sin marca de quién/motivo no existe: no hay compatibilidad con datos viejos.