CreaRack-SL

Endpoint /biblioteca/crons — Estado de los 12 crons del sistema

Endpoint /biblioteca/crons — Estado de los 12 crons del sistema

Identidad

CampoValor
URL browser/biblioteca/crons
URL server-to-server/api/biblioteca/crons
MétodoGET
Auth browserCF Access (sesión de navegador)
Auth APIBearer token via middleware MCP_TOKENS
Handler browserfunctions/biblioteca/crons.ts
Handler APIfunctions/api/biblioteca/crons.ts
Builder compartidofunctions/_lib/crons.ts → buildCronsReport()
Cache-Controlprivate, max-age=60
Introducido encommit 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 keyFuente que consulta el códigoRealidad hoy
bib-ingest / bib-curate / bib-lintbib_wiki_log (D1)✅ fiable — los crons de OPS escriben en D1 vía MCP
reindex-astbib_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-wsactivity_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-prono-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 fuente github_actions devuelven {lastRun: null, status: null, detailUrl: null} silenciosamente.
  • Timeout D1: AbortSignal.timeout(5000) en cada fetch GHA. Las queries D1 tienen .catch() que devuelve {results:[]} o null.
  • 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-Pro corre en PROD sin telemetría accesible desde el workspace → lastRun: null con note explicativa; 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

VariableDescripción
DBBinding D1 del workspace (tablas bib_wiki_log, bib_nodes, activity_log)
GH_PATPersonal 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]]