Notas

Esquemas con IA, ingesta educada y frontend público nuevo

Esquemas sectoriales propuestos por IA, reprocesado histórico, controles

3 min de lectura

La noche más larga de la fase: cerrar el conocimiento externo de punta a punta y, de camino, rehacer todo el frontend público.

Esquemas sectoriales propuestos por IA

Desde el panel puedo elegir entre 3 y 10 documentos y pedir a la IA campos sectoriales validados: nombre, tipo, orden, activación, caducidad y revisión, editables visualmente. Guardar crea una versión nueva sin destruir las anteriores, y la ingesta posterior solo aplica el esquema activo y descarta claves o tipos inventados. El E2E real propuso 12 campos desde tres documentos controlados y guardó la versión correctamente.

Reprocesado histórico y autoposts con respaldo

Una versión nueva de esquema puede reprocesar hasta 20 documentos vigentes sin tocar los históricos: revisiones paralelas por esquema, vectores reutilizados y ejecución idempotente. Los autoposts reciben un dossier diversificado por dominio con hechos, fechas y procedencia, filtran por fuente y confianza y exigen un mínimo de fuentes independientes: si falta respaldo, borrador o cancelación. Dos controles antiplagio: coincidencia textual por frases y similitud coseno por párrafos. Con esto, la fase de conocimiento externo queda cerrada con E2E completo en producción y guía operativa.

Tres bugs de la revisión

La auditoría del hito sacó tres problemas reales: run() reejecutaba runs ya en marcha (cron y disparo manual solapados procesaban el mismo artículo dos veces; ahora un run running se devuelve sin tocar), el dossier viajaba como own_content y la IA lo recibía como contenido propio (ahora es un bloque aparte: «contrasta, no copies», con límite de 16k), y los rate limits acumulaban claves para siempre (memoria sin tope; añadido límite con purga de las más antiguas). Test de regresión y 38 tests en verde.

Ingesta educada por lotes

Para no ser bloqueados: máximo 5 documentos nuevos y 10 descargas por ejecución, pausa aleatoria de 1,5–3,5 segundos, robots.txt respetado (Disallow y Crawl-delay con tope de 10 s), peticiones condicionales con ETag/Last-Modified y detención inmediata ante 403/429/503. Dos sustos del camino: una migración con columnas sin sellar versión (resuelto con alembic stamp) y una indentación que partió la clase SourceDiscovery sin error de sintaxis — la cazaron los tests. 41 tests.

La web pública, desde cero

La landing pasa de demo a página de venta: dark con acento lima, terminal viva que narra el pipeline, capturas reales del panel y comparativa honesta con WordPress. El resto del frontend público sube al mismo nivel: blog editorial, chat terminal, legales y 404 real. Tres peleas: el .rich-text se dimensionaba a su max-width dentro de flex (capado con min(100%, …)), las tablas rompían el móvil (overflow-x: auto) y la clave: :global() en un CSS plano silenciaba cada regla entera por selector inválido — semanas de bugs invisibles evitadas entendiendo que es sintaxis de componente scoped. La colisión /[lang] vs /[seccion] se cerró con portada única de producto: los idiomas viven en el blog.

De madrugada, una anotación list ocultaba el tipo incorporado y la API no arrancaba: from __future__ import annotations y producción sana. Por la mañana, segunda iteración pública: ritmo vertical, diagramas propios, comparativa sin cifras inventadas y chat en formato terminal. Producción comprobada a 1440/768/390, sin overflow ni errores JS.

Otras entradas del diario