Volver a la wiki

Panel Bibliotecario · 7d — Sección operativa en /biblioteca/pulse

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):

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:

ColumnaContenido
CorpusTotal páginas + distribución active/draft/stale
Agentes · 7dPills por operación (Ingest / Curator / Lint / Create / Update / Archive / Query)
PendientesContradicciones (rojo), drafts pendientes (ámbar), o “Sin pendientes” (verde)
Coste · estadoTokens 7d + último run de ingest/curate/lint con tiempo relativo

Badge de estado global (bibliotecarioStatus):

EstadoCondició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

Subir