Endpoint /biblioteca/crons — Estado de los 12 crons del sistema
Endpoint /biblioteca/crons — Estado de los 12 crons del sistema
Identidad
| Campo | Valor |
|---|---|
| URL browser | /biblioteca/crons |
| URL server-to-server | /api/biblioteca/crons |
| Método | GET |
| Auth browser | CF Access (sesión de navegador) |
| Auth API | Bearer token via middleware MCP_TOKENS |
| Handler browser | functions/biblioteca/crons.ts |
| Handler API | functions/api/biblioteca/crons.ts |
| Builder compartido | functions/_lib/crons.ts → buildCronsReport() |
| Cache-Control | private, max-age=60 |
| Introducido en | commit 009ca75 · s82 · 2026-05-24 |
Descripción
Devuelve un CronsReport JSON con el estado del último run de los 12 crons del workspace CreaRackSL, para la tarjeta “Crons del sistema” del Pulse. Los dos endpoints comparten handler (buildCronsReport(env)) y difieren solo en la capa de auth: CF Access para navegador, Bearer para server-to-server.
⚠️ Estado post-migración a OPS (verificado s202 · 07-07-2026)
La ficha original (s82) presumía “11 de 12 con datos”. Tras las migraciones de crons a Hetzner/OPS (s142 reindex · s193 el resto), las 6 filas con fuente github_actions quedaron desalineadas: el código de crons.ts sigue consultando esos workflow IDs, pero varios ya no corren en Actions:
Cron key | Fuente que consulta el código | Realidad hoy |
|---|---|---|
bib-ingest / bib-curate / bib-lint | bib_wiki_log (D1) | ✅ fiable — los crons de OPS escriben en D1 vía MCP |
reindex-ast | bib_nodes (D1) MAX(last_indexed_at) | ✅ fiable — ojo: con el guard por SHA (s202) entre pushes puede envejecer hasta 12h y es NORMAL |
dr-backup-ws | activity_log (D1) | ✅ fiable |
reindex-ts (GHA 265753720) · reindex-cm (GHA 279618390) | GitHub Actions API | ⚠️ workflows solo-dispatch desde s142 (corren como cron bib-reindex-ws en OPS) → lastRun congelado en el último dispatch manual |
wiki-drift (GHA 276707608) | GitHub Actions API | ⚠️ corre en OPS desde s66/s193 (wiki-drift-check.sh) → dato GHA viejo |
wiki-translate (GHA 276287061) · sync-cascade (GHA 281534648) | GitHub Actions API | ⚠️ desactivados/OFF en Actions (revisión 01-07) |
wiki-weekly (GHA 265712084) | GitHub Actions API | ✅ sigue en Actions (domingo 08:00) |
pgdump-pro | no-telemetry | ❌ honesto (sin cambios) |
Hueco conocido: para las filas ⚠️ la telemetría real vive en los logs de OPS (/opt/biblioteca-crons/logs/*.log, /opt/bib-reindex/*.log), que el Worker no puede leer. La vigilancia operativa real la hace el cron-heartbeat de OPS (email en transiciones DOWN), no esta tarjeta. Modernizar el builder (p.ej. que los crons de OPS reporten a activity_log al terminar, como hace dr-backup-ws) es una mejora pendiente sin task — coste bajo, valor cosmético (el Pulse).
Schema de respuesta
interface CronsReport {
generated_at: string; // ISO UTC del momento de generación
with_data: number; // crons con lastRun != null
total: number; // siempre 12
crons: CronStatus[];
}
interface CronStatus {
key: string; // Identificador estable (ej. 'bib-ingest')
label: string; // Nombre visible en la tarjeta
group: CronGroup; // 'Bibliotecario' | 'Reindex' | 'Wiki' | 'Sync' | 'Backups'
schedule: string; // Cadencia legible
lastRun: string | null; // ISO UTC del último run, o null
status: 'success' | 'failure' | 'cancelled' | 'skipped' | 'running' | null;
source: CronSource; // 'github_actions' | 'bib_wiki_log' | 'bib_nodes' | 'activity_log' | 'no-telemetry'
detailUrl: string | null; // URL al run GHA cuando aplica
note?: string; // Nota honesta (p.ej. pg_dump sin telemetría)
}
Comportamiento en errores
- Sin
GH_PAT: todos los crons de fuentegithub_actionsdevuelven{lastRun: null, status: null, detailUrl: null}silenciosamente. - Timeout D1:
AbortSignal.timeout(5000)en cada fetch GHA. Las queries D1 tienen.catch()que devuelve{results:[]}onull. - El endpoint nunca falla con 5xx por un cron individual — el patrón es best-effort + fallback limpio.
- Regla 13 / no-fakes:
pg_dump CreaRack-Procorre en PROD sin telemetría accesible desde el workspace →lastRun: nullconnoteexplicativa; nunca se inventa un timestamp.
Patrón hot-cache (sin tabla propia)
/biblioteca/crons no tiene tabla de cache: cada request lanza todas las consultas en paralelo (Promise.all) con timeouts cortos. Cache-Control: private, max-age=60 evita llamadas repetidas del mismo navegador.
Variables de entorno requeridas
| Variable | Descripción |
|---|---|
DB | Binding D1 del workspace (tablas bib_wiki_log, bib_nodes, activity_log) |
GH_PAT | Personal Access Token con permiso actions:read sobre CreaRackSL/CreaRackSL-workspace |
Véase también
- [[feature—biblioteca—crons-health]]
- [[entity—biblioteca—service—crons-builder]]
- [[ia-tech—biblioteca—incidente-503-1102-julio]]