Descripción
La sección Bibliotecario · 7d es un panel operativo permanente añadido a workspace.crearack.com/biblioteca/pulse en la sesión 22 F3 (2026-04-24). Consolida en una vista única el estado de salud del sistema Supercontexto: corpus de páginas wiki, actividad de agentes, pendientes críticos y coste de tokens.
Se activa condicionalmente: solo se renderiza cuando el campo HotCache.bibliotecario es no-nulo, lo que garantiza compatibilidad con proyectos CreaRack sin Supercontexto desplegado.
Motivación
Hasta esta sesión, el estado del Bibliotecario era opaco: había que consultar tablas D1 directamente (bib_wiki_log, bib_wiki_pages, bib_wiki_contradictions) para saber si el sistema estaba sano. El panel convierte esa información en señal operativa visible en el dashboard principal, con semáforo de estado global.
Componentes involucrados
Backend: functions/_lib/hot-cache.ts
Nueva interface BibliotecarioActivity:
interface BibliotecarioActivity {
window_days: number; // 7 días fijo
runs_by_operation: Record<string, number>; // { ingest: 12, curate: 7, lint: 7 … }
last_run_by_operation: Record<string, string | null>; // timestamps ISO por operación
pages_by_status: Record<string, number>; // { active: 86, draft: 0, stale: 0 … }
contradictions_open: number;
tokens_7d: number;
top_utility: Array<{ slug: string; title: string; score: number }>;
pending_drafts: number;
actions_24h: number;
}
Nueva función fetchBibliotecarioActivity(env):
- Lanza 7 queries D1 en paralelo via
Promise.allcon.catch(() => fallback)individual. - Tablas consultadas:
bib_wiki_log,bib_wiki_pages,bib_wiki_contradictions. - Fallback limpio: si
totalPages === 0 && Object.keys(runsByOp).length === 0, retornanull→ el panel no se muestra en proyectos sin Supercontexto. - Campo añadido a
HotCache:bibliotecario: BibliotecarioActivity | null.
renderMarkdown actualizado: emite sección ## Bibliotecario · Nd con corpus, runs, contradicciones, drafts, coste y top utility (primeros 3).
Frontend: src/components/biblioteca/PulsePanel.tsx
Layout: sección full-width (gridColumn: '1 / -1') con grid auto-fit minmax(200px, 1fr) de 4 columnas:
| Columna | Contenido |
|---|---|
| Corpus | Total páginas + distribución active/draft/stale |
| Agentes · 7d | Pills por operación (Ingest / Curator / Lint / Create / Update / Archive / Query) |
| Pendientes | Contradicciones (rojo), drafts pendientes (ámbar), o “Sin pendientes” (verde) |
| Coste · estado | Tokens 7d + último run de ingest/curate/lint con tiempo relativo |
Badge de estado global (bibliotecarioStatus):
| Estado | Condición |
|---|---|
contradicciones 🔴 | contradictions_open > 0 |
drafts pendientes 🟡 | pending_drafts > 3 |
X% stale 🟡 | stale > 10% del corpus activo |
sano 🟢 | ninguna de las anteriores |
Top utility: tabla al pie (hasta 5 páginas con utility_score > 0), separada por border-top.
OPERATION_LABELS: array de configuración con etiqueta corta, key D1 y tooltip descriptivo. Operaciones: ingest, curate, lint, create, update, archive, query.
Fix incluido: functions/api/health.ts
Corrección de null-check en staleCrons:
// Antes (bug: hoursAgo puede retornar null):
if (h > 36) staleCrons.push(...)
// Después (correcto):
if (h !== null && h > 36) staleCrons.push(...)
hoursAgo() retorna number | null; comparar null > 36 producía false silencioso en lugar de marcar el cron como sin datos.
Queries D1 ejecutadas
-- 1. Runs por operación últimos 7d
SELECT operation, COUNT(*) AS n, MAX(created_at) AS last_ts
FROM bib_wiki_log
WHERE datetime(created_at) >= datetime('now', '-7 days')
GROUP BY operation
-- 2. Distribución de páginas por status
SELECT status, COUNT(*) AS n FROM bib_wiki_pages GROUP BY status
-- 3. Contradicciones abiertas
SELECT COUNT(*) AS n FROM bib_wiki_contradictions WHERE status='open'
-- 4. Tokens consumidos 7d
SELECT COALESCE(SUM(tokens_used), 0) AS t FROM bib_wiki_log
WHERE datetime(created_at) >= datetime('now', '-7 days')
-- 5. Top 5 por utility_score
SELECT slug, title, utility_score FROM bib_wiki_pages
WHERE status='active' AND utility_score > 0
ORDER BY utility_score DESC LIMIT 5
-- 6. Drafts pendientes
SELECT COUNT(*) AS n FROM bib_wiki_pages WHERE status='draft'
-- 7. Actividad 24h
SELECT COUNT(*) AS n FROM bib_wiki_log
WHERE datetime(created_at) >= datetime('now', '-1 day')
Compatibilidad multi-proyecto
El fallback return null en fetchBibliotecarioActivity garantiza que proyectos CreaRack sin las tablas bib_wiki_* no rompan el HotCache. Las 7 queries tienen .catch(() => fallback) individual, por lo que un error en una sola tabla no bloquea las demás.
Véase también
- [[entity—biblioteca—service—hot-cache]]
- [[concept—saas—multi-tenancy]]
- [[feature—supercontexto—zombie-runs-sensor]] — sensor de runs zombie expuesto en este panel