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:
onMouseDownqueda solo cone.preventDefault()(evita blur del input).- La lógica de acción se mueve a
onClick. - Se añade
tabIndex={-1}a todos los botones del modo-toggle y de control para que no roben el foco del input con Tab. - Los links de source pasan de
onMouseDown(connavigate) aonClickcone.preventDefault()+navigate.
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:
-
AbortSignal.timeout(45_000)en elfetcha AI Studio dentro desynthesizeAnswer(archivo-core.ts):- Si Gemma 4 se cuelga, el fetch aborta a los 45 s.
- El
catchdetectaTimeoutError/AbortErrory lanza unErrorsemá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.
-
TOP_K8 → 5 enask.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.
- El system prompt
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
VECTORIZEno existe enwrangler.tomlni 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):
- Crear índice Vectorize en la cuenta CF.
- Añadir binding
VECTORIZEenwrangler.toml. - Re-indexar todos los chunks con embeddings en Vectorize.
- 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
| Evento | Sesión |
|---|---|
| Oráculo desplegado | s72 |
Corpus claude-method indexado (+341 chunks, total ~1 700) | s73 |
| Bugs detectados con uso real | s73 |
| Hardening v1 aplicado y mergeado | s73 (2026-05-19) |
Archivos modificados
| Archivo | Cambio principal |
|---|---|
functions/api/mcp/handlers/archivo-core.ts | AbortSignal.timeout(45_000) en synthesizeAnswer |
functions/api/oraculo/ask.ts | TOP_K 8 → 5 |
src/components/shell/SearchInline.tsx | onMouseDown→onClick en chips + tabIndex={-1} |
src/styles/globals.css | Eliminar truncado ellipsis en .search-inline-oracle-chip |
Véase también
- [[entity—oraculo—endpoint—ask]]
- [[entity—biblioteca—handler—archivo-core]]