diff --git a/.gitignore b/.gitignore index 34d1045..1678535 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ dist/ .env.* !.env.example llaves +backups/ npm-debug.log* # Local agent caches and tooling artifacts diff --git a/docs/API_RAG.md b/docs/API_RAG.md index b73755f..ff1bc68 100644 --- a/docs/API_RAG.md +++ b/docs/API_RAG.md @@ -2,9 +2,9 @@ **Proyecto:** Workspace de tools IA para empresas **Modulo:** RAG -**Ultima actualizacion:** 2026-09-11 +**Ultima actualizacion:** 2026-09-13 **Ultima modificacion por:** Subagente Implementacion ciclo de vida del conocimiento -**Estado:** Punto 2 desplegado; pendiente de preparar PostgreSQL, migrar el corpus y validar en produccion +**Estado:** Punto 2 desplegado, migrado y validado en produccion Esta guia explica como descubrir y consumir la API. El contrato tecnico completo y canonico se publica en OpenAPI 3.1.1; este documento prioriza el camino rapido, las decisiones de uso y los ejemplos habituales. diff --git a/docs/CONTRATO_CICLO_VIDA_Y_OCR.md b/docs/CONTRATO_CICLO_VIDA_Y_OCR.md index efbc87b..8938eee 100644 --- a/docs/CONTRATO_CICLO_VIDA_Y_OCR.md +++ b/docs/CONTRATO_CICLO_VIDA_Y_OCR.md @@ -4,7 +4,7 @@ **Modulo:** RAG **Ultima actualizacion:** 2026-09-08 **Ultima modificacion por:** Agente RAG 2 -**Estado:** Implementado y desplegado; pendiente de preparar PostgreSQL y ejecutar la migracion legacy +**Estado:** Punto 2 implementado, migrado y validado en produccion; punto 3 OCR pendiente ## Resultado esperado diff --git a/docs/DESPLIEGUE_EASYPANEL.md b/docs/DESPLIEGUE_EASYPANEL.md index 5a1967c..faaadd6 100644 --- a/docs/DESPLIEGUE_EASYPANEL.md +++ b/docs/DESPLIEGUE_EASYPANEL.md @@ -2,9 +2,9 @@ **Proyecto:** Workspace de tools IA para empresas **Modulo:** RAG -**Ultima actualizacion:** 2026-09-11 +**Ultima actualizacion:** 2026-09-13 **Ultima modificacion por:** Subagente Implementacion ciclo de vida del conocimiento -**Estado:** V1 desplegada en VPS2; ciclo de vida desplegado, pendiente de configurar PostgreSQL y migrar el corpus +**Estado:** V1 desplegada en VPS2; ciclo de vida configurado, migrado y validado en produccion --- diff --git a/docs/HISTORIAL_SESIONES.md b/docs/HISTORIAL_SESIONES.md index e86f338..9d17529 100644 --- a/docs/HISTORIAL_SESIONES.md +++ b/docs/HISTORIAL_SESIONES.md @@ -10,6 +10,41 @@ ## Registro de sesion +### 2026-09-13 - Agente RAG 2 - Propuesta de backups y persistencia + +**Modelo:** gpt-5.6-luna +**Session ID OpenCode:** `ses_29bdbd003ffeLrLjUlFgnp08Y7` +**Directorio:** `/home/pancho/Documentos/Empresa/Desarrollo/IA/RAG` + +**Trabajo realizado:** +- Auditado el almacenamiento actual de documentos, Qdrant, PostgreSQL y uploads. +- Confirmado que los uploads del endpoint `/ingest/upload` son temporales y se eliminan despues del procesamiento. +- Guardada en `PENDIENTES_RAG.md` la propuesta de persistencia de originales y backups de PostgreSQL/Qdrant. +- Definido un backup operativo inmediato antes de ejecutar la migracion del lifecycle. + +**Estado final:** +- Propuesta completa diferida para implementacion posterior. +- Backup rapido de `db_rag` completado como TAR portable y verificado con PostgreSQL 17.10. +- Snapshots de `rag_chunks` y `rag_eval_logs` descargados y verificados localmente. +- `npm run migrate:lifecycle` ejecutado correctamente en produccion. +- Esquema verificado: registro de migracion, ocho tablas, indices y triggers presentes. +- `/health` sigue operativo con enforcement desactivado. +- Dry-run legacy ejecutado: 22.605 puntos, 7 fuentes y `blockedReasons: []`. +- Pendiente ejecutar la migracion controlada del corpus legacy. + +**Archivos modificados:** +- `RAG/docs/PENDIENTES_RAG.md` +- `RAG/.gitignore` +- `RAG/backups/20260913-184344/postgres/db_rag.tar` +- `RAG/backups/20260913-184344/qdrant/rag_chunks.snapshot` +- `RAG/backups/20260913-184344/qdrant/rag_eval_logs.snapshot` +- `RAG/backups/20260913-184344/checksums.sha256` +- `RAG/docs/HISTORIAL_SESIONES.md` + +--- + +## Registro de sesion + ### 2026-09-11 - Agente RAG 2 - Preparacion PostgreSQL **Modelo:** gpt-5.6-luna @@ -282,3 +317,38 @@ Completar los 4 bloqueos del sdd-verify y cerrar la validacion local del punto 2 - Implementacion local del punto 2 verificada de forma independiente: PASS local. - No se hizo commit, push, deploy ni lectura de `.env`. - Pendiente: commit/push, deploy con enforcement desactivado, migracion legacy y validacion en produccion antes de cerrar el punto 2. + +--- + +### 2026-09-13 - Agente RAG 2 + +**Modelo:** openai/gpt-5.6-luna +**Session ID OpenCode:** `ses_29bdbd003ffeLrLjUlFgnp08Y7` +**Directorio:** `/home/pancho/Documentos/Empresa/Desarrollo/IA` + +**Rol asumido:** +Continuidad operativa y evolutiva del modulo RAG. + +**Trabajo realizado:** +- Creado y conservado un snapshot Qdrant remoto de `rag_chunks` antes de la migracion, con checksum `a55b13d3b6b791e9b148f87491b9b2788ce5797ee997a9f6be2a6d424eb92302`. +- Ejecutada la ventana de mantenimiento con escrituras desactivadas y `maintenance=true`. +- Aplicada la migracion legacy con lote `17f05cae-c5a7-49a5-b3ad-729958e1a342`. +- Catalogadas 7 fuentes y 22.605 puntos; las siete versiones quedaron activas y los recuentos esperados/verificados coinciden. +- Activado `KNOWLEDGE_LIFECYCLE_ENFORCED=true`, validado retrieval con catalogo y reactivadas las escrituras. + +**Validacion en produccion:** +- `/health`: HTTP 200, PostgreSQL, Qdrant y reconciliador operativos. +- Reconciliador: `inconsistentSources=[]`, `invariantViolations=[]` y cero versiones huerfanas recuperadas/fallidas. +- Retrieval FacturaTech y GStreamer: HTTP 200, resultados limitados a sus fuentes. +- Estado final: `maintenance=false`, `INGEST_WRITES_ENABLED=true`, enforcement activo. + +**Estado final:** +- Punto 2 del ciclo de vida cerrado y validado en produccion. +- Punto 3 OCR queda habilitado para la siguiente fase. + +**Archivos modificados:** +- `docs/PENDIENTES_RAG.md` +- `docs/API_RAG.md` +- `docs/DESPLIEGUE_EASYPANEL.md` +- `docs/CONTRATO_CICLO_VIDA_Y_OCR.md` +- `docs/HISTORIAL_SESIONES.md` diff --git a/docs/PENDIENTES_RAG.md b/docs/PENDIENTES_RAG.md index 9fff8c9..3ef132f 100644 --- a/docs/PENDIENTES_RAG.md +++ b/docs/PENDIENTES_RAG.md @@ -1,6 +1,6 @@ # Pendientes priorizados del RAG -**Ultima actualizacion:** 2026-09-11 +**Ultima actualizacion:** 2026-09-13 **Responsable de la priorizacion:** Usuario **Estado:** Activo @@ -17,7 +17,7 @@ Este documento es la fuente canonica del orden de trabajo pendiente del modulo R ## 2. Ciclo de vida del conocimiento -**Estado:** Implementado y desplegado; bloqueado por la preparacion operativa de PostgreSQL y la migracion controlada del corpus. +**Estado:** Completado y validado en produccion el 2026-09-13. El contrato de implementacion esta cerrado en [`CONTRATO_CICLO_VIDA_Y_OCR.md`](./CONTRATO_CICLO_VIDA_Y_OCR.md). Antes de ejecutar las pruebas de migracion o activar el ciclo de vida hay que completar este prerrequisito: @@ -26,11 +26,21 @@ El contrato de implementacion esta cerrado en [`CONTRATO_CICLO_VIDA_Y_OCR.md`](. - Confirmar que existe la instancia y la base de datos que usara RAG en EasyPanel. - Obtener el hostname interno, puerto, nombre de base de datos, usuario y requisitos SSL. - Configurar `POSTGRES_URL`, `POSTGRES_SSL` y `LIFECYCLE_ADMIN_TOKEN` en el servicio RAG. -- Arrancar las migraciones del esquema y verificar las tablas, permisos y `SELECT 1` desde RAG. -- Revisar que no falten variables, red interna, credenciales, almacenamiento persistente o permisos de migracion. La configuracion de backups queda diferida al paquete del punto 7. +- Ejecutar las migraciones del esquema y verificar las tablas, permisos y `SELECT 1` desde RAG. Completado el 2026-09-13. +- Revisar que no falten variables, red interna, credenciales, almacenamiento persistente o permisos de migracion. Completado el 2026-09-13; la configuracion completa de backups queda diferida al paquete del punto 7. - Inventariar las fuentes actuales de Qdrant y preparar su carga en el catalogo PostgreSQL. -No ejecutar la migracion legacy, activar enforcement ni iniciar OCR hasta cerrar este prerrequisito. +### Resultado del dry-run legacy + +- Ejecutado el 2026-09-13 sin `--apply`. +- Detectados 22.605 puntos en 7 fuentes de `rag_chunks`. +- `ok: true`; no se encontraron `blockedReasons`. +- Ventana de mantenimiento ejecutada con `INGEST_WRITES_ENABLED=false` y `rag_system_state.maintenance=true`. +- Migracion aplicada con el lote `17f05cae-c5a7-49a5-b3ad-729958e1a342` usando snapshot Qdrant remoto con checksum `a55b13d3b6b791e9b148f87491b9b2788ce5797ee997a9f6be2a6d424eb92302`. +- Catalogadas 7 fuentes y 22.605 puntos; todas las versiones quedaron `active` y sus recuentos PostgreSQL/Qdrant coinciden. +- `KNOWLEDGE_LIFECYCLE_ENFORCED=true`, `INGEST_WRITES_ENABLED=true`, `maintenance=false` y retrieval validado en produccion. + +El punto 2 queda cerrado. El punto 3, OCR integrado en la ingesta, puede comenzar respetando el contrato secuencial. - Crear un catalogo de fuentes y versiones ingeridas. - Saber que documento esta vigente, obsoleto, reemplazado o pendiente de reingesta. @@ -50,7 +60,7 @@ No ejecutar la migracion legacy, activar enforcement ni iniciar OCR hasta cerrar ## 3. OCR integrado en la ingesta -**Diseño:** Contrato de implementacion cerrado en [`CONTRATO_CICLO_VIDA_Y_OCR.md`](./CONTRATO_CICLO_VIDA_Y_OCR.md). Su ejecucion queda bloqueada hasta completar el punto 2. +**Diseño:** Contrato de implementacion cerrado en [`CONTRATO_CICLO_VIDA_Y_OCR.md`](./CONTRATO_CICLO_VIDA_Y_OCR.md). El punto 2 ya fue validado en produccion; su ejecucion queda habilitada. - Detectar PDFs con capturas, imagenes o una capa textual insuficiente. - Ejecutar OCR automaticamente o bloquear la ingesta para revision cuando no pueda garantizarse la cobertura. @@ -95,12 +105,25 @@ No ejecutar la migracion legacy, activar enforcement ni iniciar OCR hasta cerrar **Prioridad:** Diferida, sin urgencia; no bloquea la preparacion actual de PostgreSQL. Sin programacion automatica. +**Estado de la propuesta:** Diseno guardado para completar e implementar mas adelante. + - Configurar el destino de backups y diagnosticar el error observado al crearlo en EasyPanel. - Preparar copias manuales de la nueva base del RAG y snapshots de Qdrant; `db_gestion_flujos_n8n` es ajena a este alcance. - Definir una ventana sin escrituras para obtener copias coherentes de ambos almacenes. - Documentar y comprobar la restauracion, incluyendo la recuperacion de los permisos necesarios. - Este paquete difiere la solucion habitual de backups; el snapshot previo exigido por la migracion legacy sigue formando parte de esa operacion. +#### Diseno propuesto + +- Mantener los datos primarios separados: PostgreSQL conserva el catalogo, Qdrant conserva chunks y embeddings, y un volumen privado del RAG conserva originales y artefactos. +- Montar un volumen `rag-ingestions` en `/data/ingestions` para conservar originales, manifiestos y futuros artefactos OCR por version. +- Cambiar la ingesta para guardar el original antes de procesarlo; el flujo actual usa `/tmp` y elimina los uploads al terminar. +- Respaldar PostgreSQL con un dump portable de `db_rag` y, cuando quede configurado, con Database Backups de EasyPanel hacia un destino S3-compatible. +- Respaldar Qdrant con snapshot de la coleccion o del almacenamiento completo, preferentemente hacia el mismo destino externo. +- Incluir los artefactos del volumen en el plan de backup y probar una restauracion completa antes de considerar portable el servicio. +- No tratar un volumen Docker del mismo VPS como backup externo: protege frente a reinicios, no frente a perdida del servidor. +- Mantener fuera de este alcance `db_gestion_flujos_n8n`. + ## 8. Sistema de evaluacion - Revisar periodicamente los logs de evaluacion almacenados en Qdrant.