Navegador :3102
│
▼
Next.js web ───────► FastAPI :8102 ───────► PostgreSQL compartido / esquema xreview
│ │ │
│ │ ├──────► SeaweedFS S3 / bucket xreview
│ └──────────► BGE-M3 + Milvus / xreview_chunks_v1
└──────────────► cola PostgreSQL ◄──── worker ────► llm2
xtender ── instantánea inmutable ──► xreview ── paquete de adjudicación ──► xfollow
Web, API y worker tienen imágenes, .env.local, Compose y ciclo de vida propios. Los servicios de datos e IA son dependencias compartidas y no aparecen duplicados en el Compose de xreview. La configuración común puede heredarse con XREVIEW_SHARED_ENV_FILE; la configuración local se aplica después y prevalece.
El esquema xreview contiene procedimientos y registros JSONB tipados por dominio: lotes, reglas, licitadores, ofertas, sobres, documentos, chunks, asignaciones, valoraciones, cálculos, casos de anormalidad, declaraciones de confidencialidad, informes, feedback, paquetes de adjudicación, trabajos de IA y auditoría.
Los originales se almacenan en SeaweedFS con claves segmentadas por tenant/procedimiento/lote/oferta/sobre. Milvus utiliza una colección exclusiva y todos los registros vectoriales incluyen esos mismos campos. Las búsquedas construyen siempre un filtro de tenant y procedimiento, más lote/oferta/sobre cuando corresponde.
Un documento se recibe y conserva mientras el sobre permanece sellado, pero no puede descargarse, extraerse, indexarse ni incorporarse a una llamada al modelo. La apertura autorizada realiza la extracción y, si la calidad es suficiente, el chunking e indexado. Los documentos con OCR insuficiente quedan fuera de las fuentes de IA.
La secuencia es administrativo → tecnico → economico → justificacion. El económico exige que todos los sobres previos estén cerrados y que todos los requisitos, comprobaciones de solvencia y valoraciones técnicas aplicables estén validados. Una modificación técnica posterior solo se admite como rectificación versionada y motivada.
La API crea trabajos persistentes e idempotentes. El worker conserva:
- tipo de trabajo, solicitante, intentos y errores;
- instantánea de ids y hashes de fuentes abiertas;
- versión de plantilla y hash del prompt;
- modelo, proveedor y parámetros;
- salida original y artefactos creados;
- citas, limitaciones y posteriores ediciones/validaciones humanas.
Los documentos se delimitan como fuentes no confiables. Las instrucciones contenidas en ellos se ignoran por diseño. Los reintentos transitorios usan espera exponencial, leases recuperables y un máximo configurable. Las citas ajenas a la instantánea de fuentes se rechazan y el worker no puede sobrescribir una decisión oficial.
La importación desde xtender lee una instantánea y hashes sin modificar el expediente original. La carga ZIP/CSV es idempotente y valida rutas, cifrado, enlaces simbólicos, extensiones, firmas, tamaño y hashes.
Al finalizar un lote, xreview publica una sola vez un paquete inmutable con resultado oficial, adjudicatario, importe, bases, oferta almacenada y compromisos aceptados. PostgreSQL impide modificar o borrar el paquete publicado. xfollow lo consulta por tenant e importa idempotentemente por procedimiento/lote como source_kind=xreview; enlaza las bases como tender_basis, la oferta como winning_offer, crea obligaciones desde compromisos ya validados y encola el análisis de riesgos sin recarga manual.