Decisión 2026-09-10 · Búsqueda de texto completo en las wikis del workspace (cajita + Oráculo híbrido)
Decisión de Edu (10-09-2026, s321, sesión de preguntas
/method:grill): las wikis del workspace han crecido hasta 1.269 páginas (356 escritas a mano en 5 wikis + 872 fichas automáticas del Bibliotecario en el Supercontexto) y lo que existe no aparece al buscarlo, ni en la cajita del sitio ni en el Oráculo. Se construye una búsqueda de texto completo compartida por las dos superficies. GO dado para la sesión del 11-09.
Contexto medido (10-09-2026)
| Superficie | Cómo funciona hoy | Medición (batería sintética) |
|---|---|---|
| Cajita del sitio | Fuse.js en el navegador sobre public/search-index.json (1,7 MB; título peso 3, sección 1, cuerpo 2; umbral 0,35; top 10). Indexa solo los primeros 1.500 caracteres del cuerpo. No filtra por estado (166 borradores y 15 archivadas entran mezcladas). | título exacto 100 % · 2 palabras del título 84 % · frase temprana del cuerpo 81 % · frase cerca del corte 77 % · más allá de 1.500 caracteres: 0 %. ~0,5 s por búsqueda. |
| Oráculo | Mismo motor que bib_search_semantic: embeddings + Vectorize, top-k, floor 0,4. Solo por significado: no hay coincidencia exacta de términos (un nombre de fichero, un ID, “pgbouncer”). | 3 palabras del título 86 % · frase literal del cuerpo 39 %. |
Decisiones
- Garantía: si un término está en cualquier parte de una página, esa página aparece. En la cajita y en el Oráculo (híbrido exacto + significado).
- Borradores y archivadas: ocultas por defecto; interruptor “incluir borradores y archivadas”, etiquetadas cuando se muestran.
- Orden: resultados agrupados por wiki, las escritas a mano primero (Help, Tech, Workspace, IA Tech); las fichas automáticas del Supercontexto en bloque propio plegado; sin tope de diez, con paginación.
- Alcance: las 5 wikis + el diario de trabajo + los briefings y la bitácora del Supercontexto (STATE/NEXT/LOG). Tareas y notas fuera (tienen su propia búsqueda).
- Cuándo: entrega 1 el 11-09; entrega 2 la semana siguiente.
Plan
Entrega 1 · motor de texto completo + cajita nueva (11-09) — HECHA el 11-09-2026 (s323): migración 0054_search_fts.sql, functions/_lib/search.ts + GET /api/search, tool bib_index_search + scripts/index-search.mjs (1.789 documentos, 9,6 MB; modo search del cron de OPS), cajita nueva sin Fuse, scripts/bench-search.mjs, 9 tests de integración contra D1 real. Detalle en [[feature—workspace—busqueda-texto-completo]]. Batería del mismo día contra el sitio real: título 97 % · temprana 99 % · tardía 99 % · exacto 100 % (línea base 84 / 81 / 77 / 0); el veredicto de la apuesta #22 sigue esperando a la entrega 2 y a las tres búsquedas reales de Edu. Los puntos 1-4 de abajo son el plan tal como se aprobó; la única desviación: la tabla NO cuelga de bib_chunks (saltan secciones cortas, excluyen LOG.md y no llevan el diario) sino que el indexador lee el repo entero.
- Migración D1: tabla virtual FTS5
bib_search_fts(doc_id, title, product, status, kind, content)alimentada desdebib_chunks(cuerpo entero) + páginas wiki, worklog y briefings; se reconstruye en el reindex nocturno de OPS (cron-bib-reindex-ws.sh, modossupercontext/wiki) y en el reconcile repo→D1. FTS5 probado en la D1 local de wrangler (CREATE VIRTUAL TABLE … USING fts5+MATCH+bm25); en remoto lo confirma la primera migración. - Endpoint
GET /api/search?q=&include_drafts=0&page=tras CF Access:bm25con el título ponderado, agrupado por wiki, soloactivepor defecto, paginado. - Cajita (
SearchDialog.tsx/SearchInline.tsx): llama al endpoint en vez de cargar el índice yFuse; interruptor de borradores; bloques por wiki.build-search-index.mjsqueda solo para las 25 páginas fijas del sitio, o se retira. - Batería reproducible
scripts/bench-search.mjs(título 2 palabras · frase temprana · frase tardía · término exacto). Línea base: 84 / 81 / 77 / 0 %.
Entrega 2 · Oráculo híbrido — HECHA el 11-09-2026 (s324), adelantada de la semana del 14-09: functions/_lib/retrieval-hybrid.ts (searchHybrid = searchChunks ∪ searchFts con order: 'relevance' → ftsHitsToChunks → rrfFuse, k = 60), usado por POST /api/oraculo/ask y bib_search_semantic; flag RETRIEVAL_HYBRID; batería scripts/bench-oraculo.mjs. Workspace PR #172. Medido con la misma muestra de 60 páginas antes y después del deploy: título 75 → 93 % · frase literal 30 → 75 % · identificador exacto 28 → 77 % con la versión vigente #176 (la primera, #172, dio 98/90/77 con páginas coladas por palabras comunes; p50 306 → 438 ms; los fallos restantes son enlaces [[slug]] presentes en decenas de páginas, que no caben en un top-8). Detalle en [[feature—workspace—busqueda-texto-completo]] § “Entrega 2”.
5. bib_search_semantic y el Oráculo fusionan por rangos (RRF) la lista semántica de Vectorize con la lista FTS5: un término exacto presente en una página garantiza su aparición. Mismo floor 0,4 para la síntesis (aplicado al mejor coseno de la lista fundida).
Apuesta (WAGERS)
Batería ≥95 % por título y 100 % por término exacto (línea base 84 % y 0 % más allá de 1.500 caracteres). Veredicto con la batería completa y tres búsquedas reales de Edu que hoy fallan (pendientes de que se las apunte). Fecha: al cerrar la entrega 2.
Fuera de alcance
Reorganizar categorías o sidebars de las wikis (Q1 descartó que el dolor fuera el índice) · buscar en tareas y notas · cambiar el modelo de síntesis del Oráculo.
Véase también
- [[workspace-tech—arquitectura—oraculo]]
- [[crearack-tech—backend—biblioteca]]