Automatismos y workflows: el calendario de bots del Supercontexto
Parte de la colección [[concept—workspace—supercontexto-00-vision]]. Cubre: todos los workflows de GitHub Actions y crons de Hetzner, su cadencia, qué hace cada uno y cómo pausarlos.
El panorama general
El Supercontexto funciona gracias a 21 automatismos distribuidos entre dos repos de GitHub y un servidor Hetzner:
graph TD
subgraph GH_PRO["🐙 GitHub Actions · CreaRack-Pro (5 workflows)"]
P1["post-merge-ingest\nEn cada push"]
P2["push-drift\nEn cada push con código"]
P3["ci.yml\nEn cada PR"]
P4["agent-pip-audit\nLunes 06:00 UTC"]
P5["audit-docs-drift\n1er domingo de mes"]
end
subgraph GH_WS["🐙 GitHub Actions · workspace (11 workflows)"]
W1["post-merge-ingest\nEn cada push"]
W2["bib-reindex-ts\nDiario 00:15 + push .ts"]
W3["bib-reindex-claude-method\nDiario 00:30"]
W4["wiki-translate\nDiario 06:00"]
W5["wiki-catalog\nL+M+V 06:30"]
W6["wiki-weekly-report\nDomingo 08:00"]
W7["sync-cascade-detect\nEn cada push wiki .md"]
W8["wiki-lint.yml\nManual / migrado"]
W9["wiki-curator.yml\nManual / migrado"]
W10["drift-cron.yml\nManual / migrado"]
W11["wiki-utility.yml\nManual"]
end
subgraph HETZNER["🖥️ Hetzner Stage · crons systemd"]
H1["bib_ast.py\nCada 6 horas"]
H2["drift-cron (REST)\nDiario 04:15 UTC"]
H3["wiki-lint (MCP)\nDiario 04:30 UTC"]
H4["wiki-curator (MCP)\nL+J 05:00 UTC"]
end
Workflows de CreaRack-Pro
post-merge-ingest — El Ingest principal
Trigger: cada push a main o PR mergeada
Cuánto tarda: ~3-5 minutos
Qué hace:
- Lee el diff del commit (qué archivos cambiaron)
- Pasa el diff a Claude Haiku 4.5 que analiza el significado del cambio
- Actualiza el grafo en D1: nuevos nodos, nuevos edges, confidence actualizado
- Si hay conocimiento nuevo → crea
concept_pageen statusdraften la wiki - Si falla → abre un issue automático en GitHub con el error
No se dispara cuando el commit empieza por wiki( (commits del propio Bibliotecario) para evitar bucles.
push-drift — Detector de drift en tiempo real
Trigger: cada push a main que toque archivos de código (no docs)
Cuánto tarda: ~1 minuto
Qué hace: llama a /api/biblioteca/drift-run en el workspace para que el Pulse refleje inmediatamente qué docs quedan desactualizadas tras el commit.
Trabaja en tándem con el cron diario de drift (04:15 UTC en Hetzner): el push-drift da inmediatez, el cron diario es la red de seguridad.
ci.yml — CI estándar
Trigger: cada PR contra main
Cuánto tarda: ~5-8 minutos
Qué hace: ruff (linter Python) + biome (linter JS) + build Docker + tests pytest
agent-pip-audit — Auditoría de seguridad del Local Agent
Trigger: push que toca el lockfile del Local Agent + lunes 06:00 UTC semanal
Qué hace: ejecuta pip-audit contra terminal/agent/requirements-agent.lock para detectar CVEs en las dependencias empaquetadas en el .exe que se distribuye a clientes.
Si encuentra vulnerabilidades → el workflow falla y hay que actualizar el lockfile.
audit-docs-drift — Auditoría mensual de docs
Trigger: primer domingo de cada mes a las 08:00 UTC
Qué hace: ejecuta scripts/audit_docs_drift.py que compara:
- Conteos de páginas wiki declarados en
CLAUDE.mdvs los reales en el repo APP_VERSIONenbase.pyvs las 6 menciones que deben propagarse- Referencias a archivos/funciones que ya no existen
Si encuentra drift “hard” → abre un issue automático. Si es drift “soft” → lo registra en el log del run pero no crea issue.
Workflows del workspace
post-merge-ingest (workspace) — Ingest del workspace
Idéntico al de CreaRack-Pro, pero analiza commits del repo del workspace. Indexa cambios en la wiki, funciones TypeScript, scripts, etc.
Diferencia clave: filtra también commits sync-cascade(*) para no crear bucles cuando el Sync Cascade genera sus PRs.
bib-reindex-ts — Reindexación TypeScript
Trigger: push que toca .ts/.tsx/.mjs + diario 00:15 UTC
Cuánto tarda: ~2 minutos
Qué hace: ejecuta scripts/bib_ast_ts.mjs que parsea el AST de TypeScript del workspace y actualiza los nodos en D1. No usa LLM — es parseo sintáctico puro, muy rápido y preciso.
bib-reindex-claude-method — Reindexación del método del equipo
Trigger: diario 00:30 UTC
Cuánto tarda: ~3 minutos
Qué hace: clona el repo privado claude-method (con deploy key SSH dedicada) y ejecuta bib_ingest_claude_method.mjs para indexar sus 49 documentos Markdown. Esto hace que el Oráculo de EL pueda responder preguntas sobre el harness, los onboardings y las guías del equipo.
wiki-translate — Traducción automática ES→EN
Trigger: diario 06:00 UTC
Cuánto tarda: ~5-10 minutos
Qué hace: detecta páginas crearack--*.md más nuevas que su traducción EN, las traduce con Gemma 4 26B y hace commit de las traducciones a src/content/wiki-en/.
Corre en su propio workflow (separado del build de CF Pages) para que un fallo de la API de Gemma no bloquee los deploys.
wiki-catalog — Regeneración del catálogo
Trigger: lunes + miércoles + viernes 06:30 UTC
Cuánto tarda: ~1 minuto
Qué hace: ejecuta scripts/generate-wiki-catalog.py --write que regenera src/content/wiki/catalog.md con todas las páginas de la wiki clasificadas por tipo, tag y fecha. El catálogo es una vista derivada del corpus — se puede regenerar en cualquier momento sin pérdida.
wiki-weekly-report — Informe semanal
Trigger: domingos 08:00 UTC
Cuánto tarda: ~1 minuto
Qué hace: genera un informe Markdown con el estado de la semana (commits, concept_pages creadas/publicadas/descartadas, salud del grafo, docs stale) y lo publica en public/supercontext/reports/weekly--YYYY-MM-DD.md.
sync-cascade-detect — Propagación de cambios entre docs vinculadas
Trigger: push que toca cualquier .md en src/content/wiki/
Cuánto tarda: ~2-5 minutos
Qué hace: detecta qué slugs wiki se modificaron, consulta qué mirrors tienen via el campo mirrors: del frontmatter, y ejecuta scripts/sync_cascade.mjs que propone actualizaciones usando Haiku 4.5 y abre PRs draft con los cambios sugeridos.
No se dispara para commits del propio Bibliotecario (wiki(*)o sync-cascade(*)).
Crons en Hetzner Stage
Los crons “pesados” (los que consumen muchos minutos de GH Actions) se migraron al servidor Hetzner Stage en mayo 2026 (Plan Servicios Fase C · ADR decision--20260516--fase-c-crons-stage-ligera). La razón: ahorrar minutos de GitHub Actions y tener más control sobre los timeouts.
Viven en /etc/cron.d/biblioteca-crons del servidor Stage (crearack-staging.netbird.cloud):
| Cron | Cadencia | Script | Qué hace |
|---|---|---|---|
bib_ast.py | Cada 6 horas | python scripts/bib_ast.py --push --stats | Reindexación AST Python de CreaRack-Pro |
drift-cron | Diario 04:15 UTC | REST /api/biblioteca/drift-run | Detección de drift docs ↔ código |
wiki-lint | Diario 04:30 UTC | MCP wiki_lint_bulk + wiki_lint_contradictions | Páginas stale, huérfanas, contradicciones |
wiki-curator | Lunes + jueves 05:00 UTC | MCP wiki_curator_review | Revisar drafts y publicar/descartar |
El calendario completo (hora Madrid CEST)
| Hora Madrid | Qué corre | Dónde |
|---|---|---|
| 02:15 | bib-reindex-ts (GH Actions) | workspace |
| 02:30 | bib-reindex-claude-method (GH Actions) | workspace |
| 06:15 | bib_ast.py · Python AST reindex | Hetzner Stage |
| 06:15 | drift-cron · detección drift | Hetzner Stage |
| 06:30 | wiki-lint · stale + contradicciones | Hetzner Stage |
| 07:00 (L+J) | wiki-curator · revisar drafts | Hetzner Stage |
| 08:00 | wiki-translate (GH Actions) | workspace |
| 08:30 (L+M+V) | wiki-catalog (GH Actions) | workspace |
| 10:00 (domingos) | wiki-weekly-report (GH Actions) | workspace |
| 10:00 (1er domingo) | audit-docs-drift (GH Actions) | CreaRack-Pro |
| En cada push | post-merge-ingest (GH Actions) | ambos repos |
| En cada push de código | push-drift (GH Actions) | CreaRack-Pro |
| En cada push de wiki .md | sync-cascade-detect (GH Actions) | workspace |
Cómo pausar todos los bots
Toggle global (Curator + Lint + Utility + Drift + bib-reindex-ts)
# Pausar
gh variable set BIBLIOTECARIO_PAUSADO --body true --repo CreaRackSL/CreaRackSL-workspace
# Reanudar
gh variable set BIBLIOTECARIO_PAUSADO --body false --repo CreaRackSL/CreaRackSL-workspace
Toggle de Sync Cascade (solo)
# Pausar
gh variable set SYNC_CASCADE_PAUSADO --body true --repo CreaRackSL/CreaRackSL-workspace
# Reanudar
gh variable set SYNC_CASCADE_PAUSADO --body false --repo CreaRackSL/CreaRackSL-workspace
Los crons de Hetzner
Para pausar los crons de Hetzner hay que SSH al servidor Stage y comentar/descomentar líneas en /etc/cron.d/biblioteca-crons:
ssh root@crearack-staging.netbird.cloud
nano /etc/cron.d/biblioteca-crons
# Comentar la línea del cron que quieras pausar
Ver el estado en tiempo real
workspace.crearack.com/biblioteca/pulse tiene un widget de estado de crons que muestra:
- Último run de cada bot (con timestamp)
- Si está en verde (ejecutó en el tiempo esperado) o rojo (lleva más tiempo del umbral sin ejecutar)
- Los thresholds de “stale” están configurados según la cadencia real de cada cron
Véase también
- [[concept—workspace—supercontexto-00-vision]] — Visión general del sistema completo
- [[concept—workspace—supercontexto-02-bibliotecario]] — Qué hace el Bibliotecario en detalle
- [[decision—20260516—fase-c-crons-stage-ligera]] — Por qué algunos crons migraron a Hetzner