Volver a la wiki

Incidente: Oráculo hardening v1 — 5 bugs UX/operacionales en s72 (chips, 524 timeouts, sources truncados)

Resumen

Pack de 5 bugs UX/operacionales detectados en el Oráculo desplegado en s72 tras uso real, aflorados después de que la Fase 2 indexara el corpus claude-method en s73 (~341 chunks añadidos, total ~1 700 chunks). Los bugs son del Oráculo original, no de la indexación.

Resuelto en un único commit de hardening (c838e39) el 2026-05-19.


Bugs detectados y fixes aplicados

Bug 1 — Chips de modo y botones no clickables (SearchInline.tsx)

Síntoma: Los chips Auto/Buscar/Preguntar, el botón Cerrar, el botón Nueva conversación y los links de source dejaban de responder al click tras varios re-renders del dropdown.

Causa probable: El handler onMouseDown que llamaba setState robaba el foco del input durante el blur, provocando que el evento no llegara correctamente tras ciertos ciclos de re-render.

Fix: Separación de responsabilidades en los botones afectados:

Archivo: src/components/shell/SearchInline.tsx


Bug 2 — HTTP 524 intermitentes (CF Worker timeout) (ask.ts + archivo-core.ts)

Síntoma: Peticiones al Oráculo quedaban pending en el cliente y terminaban en HTTP 524 (Cloudflare gateway timeout) sin mensaje de error legible.

Causa raíz: El binding VECTORIZE no existe en wrangler.toml ni en la cuenta CF. Todo el retrieval del Bibliotecario usa D1 fallback iterando ~1 700 chunks por query con cosine similarity en JS. Con el corpus crecido (+341 chunks de claude-method), la latencia de retrieval + síntesis se acercaba al límite de 100 s del Worker de CF.

Fixes aplicados:

  1. AbortSignal.timeout(45_000) en el fetch a AI Studio dentro de synthesizeAnswer (archivo-core.ts):

    • Si Gemma 4 se cuelga, el fetch aborta a los 45 s.
    • El catch detecta TimeoutError/AbortError y lanza un Error semántico: “AI Studio timeout after 45s — el modelo no respondió a tiempo, reformula la pregunta o intenta de nuevo”.
    • El frontend renderiza este mensaje como error normal en lugar de quedarse pending.
  2. TOP_K 8 → 5 en ask.ts:

    • El system prompt 'oracle' pesa ~900 tokens. Con 8 chunks de hasta 400 palabras (~1 600 tok/chunk) + history multi-turno, el prompt total se acercaba a ~15 k tokens, zona donde Gemma 4 ralentiza significativamente.
    • Con 5 chunks el prompt baja a ~9–10 k y la latencia vuelve a 3–5 s estables.
    • Pérdida de cobertura mínima: los chunks 6–8 suelen ser tangenciales.

Archivos: functions/api/oraculo/ask.ts, functions/api/mcp/handlers/archivo-core.ts


Bug 3 — Source titles truncados a texto ininteligible (globals.css)

Síntoma: Los chips de source en las respuestas del Oráculo mostraban textos tipo "Guía Maestra · El Esquema · Véas[…]" — completamente inútiles para navegar al origen.

Causa: La clase .search-inline-oracle-chip tenía max-width: 280px + white-space: nowrap + text-overflow: ellipsis. Los títulos de páginas wiki multi-segmento ("wiki · sección · sub-sección") quedaban truncados antes del segmento informativo.

Fix: Eliminación de max-width, white-space: nowrap y text-overflow: ellipsis. Se añade word-break: break-word. Con flex-wrap del contenedor padre, los chips largos pasan a la siguiente línea completos y legibles.

Archivo: src/styles/globals.css


Deuda técnica identificada (no resuelta en este commit)

Root cause real de los 524: El binding VECTORIZE no existe en wrangler.toml ni está creado en la cuenta CF. Mientras no se cree el índice Vectorize y se re-indexen los ~1 700 chunks, el retrieval seguirá siendo O(n) en JS sobre D1.

Solución definitiva pendiente (registrada en NEXT.md):

  1. Crear índice Vectorize en la cuenta CF.
  2. Añadir binding VECTORIZE en wrangler.toml.
  3. Re-indexar todos los chunks con embeddings en Vectorize.
  4. Eliminar el D1 fallback de cosine similarity en JS.

Hasta entonces el AbortSignal.timeout(45_000) y el TOP_K=5 son mitigaciones operativas, no soluciones estructurales.


Timeline

EventoSesión
Oráculo desplegados72
Corpus claude-method indexado (+341 chunks, total ~1 700)s73
Bugs detectados con uso reals73
Hardening v1 aplicado y mergeados73 (2026-05-19)

Archivos modificados

ArchivoCambio principal
functions/api/mcp/handlers/archivo-core.tsAbortSignal.timeout(45_000) en synthesizeAnswer
functions/api/oraculo/ask.tsTOP_K 8 → 5
src/components/shell/SearchInline.tsxonMouseDown→onClick en chips + tabIndex={-1}
src/styles/globals.cssEliminar truncado ellipsis en .search-inline-oracle-chip

Véase también

Subir