Skip to content

ADR-064: Alcance de la destrucción por disposición final

Estado: Derogado por ADR-065, salvo D11 y el asiento de envío de D10 Fecha: 2026-11-04 Autores: Giampiero (mantenedor principal) Relacionados: ADR-010, ADR-043, ADR-061, ADR-063


Contexto

La purga por disposición destruía los anexos y las filas del radicado. Un censo de lo que apunta a un archivo o copia contenido del documento mostró más:

  • Un expediente con AIP o re-amarrado no se podía destruir. expediente_aip_version, expediente_trd_resoluciones y expediente_worm_extension referenciaban sin acción: el borrado de la fase 3 fallaba después de destruir los radicados, y el expediente quedaba sin lápida.
  • El AIP sobrevivía entero, con los bytes de todos los documentos, aunque su retención hubiera vencido. Ningún código borraba del bucket de preservación.
  • Sobrevivían las copias en otro formato, el .eml de un correo, el borrador del radicado, el índice firmado y sus renovaciones, y el texto copiado en flujo, firma, conocimiento y lotes.
  • Un radicado vinculado a dos expedientes se destruía aunque el otro siguiera vivo, y el gate WORM no corría si el expediente no tenía archivos que purgar.

El art. 4.3.2.5 del Ac. AGN 001/2024 ordena eliminar lo electrónico que cumplió su retención y no es de conservación permanente. El art. 4.5.4 num. 7 ordena conservar las actas e inventarios de lo eliminado.

Decisiones

D1. La disposición alcanza toda copia, en cualquier formato, bucket o sistema. Hay tres clases:

Clase Qué es Destino
Documento y copia Bytes o texto del documento Destruir (art. 4.3.2.5)
Traza del acto Quién hizo qué y cuándo, sin contenido Conservar y quitar el texto libre
Instrumento Acta, inventario, lápida, FUID, decisión del Comité Conservar intacto (art. 4.5.4 num. 7; resolución de revisión: arts. 4.4.3 par. 1 y 4.5.4 par. 1)

D2. Orden: comprobar, preservación, documentos, lápida. Por expediente: (0) sin tocar nada, retención WORM, hold, copia de preservación no destruible y radicado en otro expediente vivo omiten, con constancia en el addendum; (1) intención con inventario; (2a) verificación previa en document, lectura de los artefactos de firma, destrucción en storage bajo su gate y, solo si el gate pasó, retiro de los sellos; (2b) documentos; (3) lápida. Antes de 2a y de 2b se repite la comprobación del radicado compartido. Con una intención registrada, un bloqueo es fallo reintentable, no omisión.

D3. El inventario de artefactos cuenta, pero no bloquea. A diferencia de anexo_ids (ADR-063), una renovación LTA puede añadir un objeto tras la intención. Storage destruye la unión de inventario y filas vivas de contenido, y declara los extras, que quedan en artefactos_extra. La lápida los cuenta en artefactos_preservacion_eliminados.

D4. Destrucción por lista permitida. TIPOS_QUE_SE_DESTRUYEN (aip, indice, firma_lta_renovada). Un tipo fuera de contenido e instrumento falla con tipo_worm_desconocido, nunca se borra. Se borra por version_id: en este almacén, borrar sin versión deja una marca y el objeto sigue vivo. Probado contra RustFS: la retención COMPLIANCE vigente y el legal hold rechazan el borrado; vencida, lo admite.

D5. El texto derivado converge por evento. document.radicado.purged pasa a outbox, atómico con la destrucción. Flujo, firma, conocimiento y notificación limpian lo suyo y fallan sin acuse si el radicado sigue vivo. La lápida da fe de documentos y bytes, que son síncronos; no afirma nada sobre las copias derivadas.

D6. Los registros inmutables admiten solo vaciar su texto, con el objeto ya destruido. flow_events y expediente_eventos lo comprueban en el motor (NOT EXISTS), no con una bandera de sesión.

D7. Barrido de temporales por marca. files.origen (ventanilla, render_borrador) y una ventana de 60 minutos: se descartó una cola durable porque pierde justo el caso del proceso muerto. Sin marca no se barre nada: los artefactos firmados no están en REFERENCIAS_DE_ARCHIVO. Quien adjunta toma FOR SHARE y el barrido decide bajo FOR UPDATE.

D8. Una versión pública retirada no retiene bytes contra la disposición de otro radicado. Su huella, causa y asientos son la prueba de lo publicado. La aprobada o elaborada sí retiene.

D9. Correo: se destruye el .eml y se anonimiza la fila. Se conservan message_id y número: sin ellos, un correo aún presente en el buzón se ofrecería de nuevo para radicar.

D10. Notificaciones: retención de 180 días con constancia. La purga asienta recuento y fecha de corte, y cada envío deja un asiento sin contenido. Esta tabla no es prueba de notificación de un acto administrativo: una futura notificación del art. 56 del CPACA debe vincularse al expediente (Ac. 001/2024 art. 4.2.10).

D11. Los asientos de eventos fallidos ya no copian el sobre. evento.dead_letter lleva identificadores y motivo. El sobre completo vive en evento_dead_letter, que sí se depura.

Pendiente: decisiones del usuario

  1. audit_log con contenido. document.radicado_actualizado y los comentarios de flujo y visto bueno guardan antes y después del texto, y son inmutables. Hoy sobreviven a la disposición. Propuesta: dejar el nombre del campo y mover los valores a una tabla que cae con el radicado. Un SHA-256 de un asunto corto se revierte por fuerza bruta, así que no basta con la huella.
  2. Índice firmado. Se destruye por defecto (TIPOS_QUE_SE_DESTRUYEN); conservarlo es quitar dos valores.
  3. Radicado compartido por dos expedientes. Hoy ambos se omiten y, si los dos siguen vinculados, ninguno se destruye nunca. Propuesta: destruir el expediente vencido y conservar el radicado por el vínculo del otro, con constancia.

Deuda declarada

  • Respaldos. El borrado es lógico, sin sobrescribir el medio, y no alcanza los respaldos vigentes. infra/restore.sh no reaplica las destrucciones: restaurar resucita lo destruido. metodo_borrado debe decirlo.
  • Convergencia sin cota. Un consumidor caído más de los 30 días de retención del stream pierde el evento y conserva el texto. Falta un barrido periódico que no dependa de eventos.
  • Omisión tras la intención. Un hold que llega después de la intención da fallo reintentable y no genera addendum mientras dure. Si llega entre la comprobación y la fase 2b, la preservación puede estar ya destruida.
  • Bloqueo por un vínculo tardío. Un vínculo en la ventana entre la comprobación y 2a puede dejar la preservación destruida y el expediente fallido hasta desvincular el radicado.
  • Alerta previa al Administrador Funcional por documentos compartidos y metadato de copia en el otro expediente (Modelo de Requisitos SGDEA §6.2.2.7).
  • Fuera del sistema: buzón externo, webhooks, descargas y proveedor externo de lenguaje.
  • knowledge.ingest_malformed_event aún copia el evento al audit_log.
  • Acuse de recibo opcional por omisión (CPACA art. 61): anterior a este ADR, por revisar.

Consecuencias

  • Migraciones: archive 090, storage 028, signature 028, document 062, workflow 022.
  • Desplegar document, storage y signature antes que archive: sus llamadas nuevas fallan cerradas (503, sin destruir nada) si los endpoints faltan.
  • Una suspensión de la entidad a mitad de ejecución deja el expediente fallido y reintentable.