Volver a la wiki

Endpoint /biblioteca/crons — Health de los 12 cron jobs del workspace

Descripción

El endpoint /biblioteca/crons (y su gemelo server-to-server /api/biblioteca/crons) expone en tiempo real el estado de los 12 cron jobs del workspace CreaRack. Cierra la tarjeta Crons del sistema del Pulse (banda 4), que antes mostraba 9 de 12 crons con —. Con este PR, 11 de 12 crons tienen último-run auténtico.

El único cron sin telemetría es pg_dump · CreaRack-Pro, que corre en PROD (Hetzner) sin acceso D1 desde el workspace — se muestra — honesto con nota explicativa (Regla 13).


Arquitectura

Builder central: functions/_lib/crons.ts

Toda la lógica de agregación reside en buildCronsReport(env: CronsEnv). Es un aggregator sin caché propia: consulta las fuentes en cada request con AbortSignal.timeout(5s) y fallback limpio a null si falla.

CronsEnv
  ├── DB: D1Database
  └── GH_PAT?: string   ← PAT con scope actions:read

Fuentes por cron:

CronFuenteTabla / API
Bibliotecario · Ingestbib_wiki_log (D1)WHERE operation='ingest'
Bibliotecario · Curatorbib_wiki_log (D1)WHERE operation='curate'
Bibliotecario · Lintbib_wiki_log (D1)WHERE operation='lint'
Reindex · TS/TSXGitHub Actions APIworkflow 265753720
Reindex · AST (Python)bib_nodes (D1)MAX(last_indexed_at) WHERE file_path LIKE '%.py'
Reindex · claude-methodGitHub Actions APIworkflow 279618390
Wiki · Drift-checkGitHub Actions APIworkflow 276707608
Wiki · TranslateGitHub Actions APIworkflow 276287061
Wiki · Weekly reportGitHub Actions APIworkflow 265712084
Sync Cascade · detectGitHub Actions APIworkflow 281534648
DR Backups · workspaceactivity_log (D1)WHERE action='dr_export'
pg_dump · CreaRack-ProSin telemetríanull honesto

Las 6 llamadas a GitHub Actions API se lanzan en paralelo con Promise.all.

Endpoints CF Pages Functions

URLAuthDescripción
/biblioteca/cronsCF Access (browser)Para el Pulse Panel
/api/biblioteca/cronsBearer token (MCP_TOKENS)Server-to-server / agentes

Ambos devuelven el mismo CronsReport JSON con Cache-Control: private, max-age=60.

Schema de respuesta

interface CronsReport {
  generated_at: string;   // ISO UTC
  with_data: number;      // crons con lastRun !== null
  total: number;          // siempre 12
  crons: CronStatus[];
}

interface CronStatus {
  key: string;
  label: string;
  group: 'Bibliotecario' | 'Reindex' | 'Wiki' | 'Sync' | 'Backups';
  schedule: string;
  lastRun: string | null;  // ISO UTC o null
  status: 'success' | 'failure' | 'cancelled' | 'skipped' | 'running' | null;
  source: 'github_actions' | 'bib_wiki_log' | 'bib_nodes' | 'activity_log' | 'no-telemetry';
  detailUrl: string | null;  // enlace al run GHA si aplica
  note?: string;             // nota honesta si sin telemetría
}

Integración con PulsePanel

CronsHealthCard (en src/components/biblioteca/PulsePanel.tsx) consume /biblioteca/crons con refresh cada 60 segundos (best-effort). La tarjeta:

Umbrales de staleness por grupo:

GrupoUmbral
Bibliotecario24 h
Reindex12 h
Wiki48 h
Sync24 h
Backups36 h

Degradación limpia


Archivos clave

ArchivoRol
functions/_lib/crons.tsBuilder buildCronsReport, tipos CronStatus, CronsReport
functions/biblioteca/crons.tsHandler CF Pages Function (browser / CF Access)
functions/api/biblioteca/crons.tsHandler CF Pages Function (Bearer server-to-server)
src/components/biblioteca/PulsePanel.tsxCronsHealthCard + integración estado crons

Véase también

Subir