Diagnóstico de puruto-cron
このコンテンツはまだ日本語訳がありません。
Qué cubre esta página
- Flujo de diagnóstico de
puruto-cron - Checks de
.jobs.json, DB SQLite y scheduler - Diagnóstico de
run-now,tick, leases y retries - Verificación de notificaciones locales y replicación a
puruto-telegram
Alcance
Fuente de verdad:
- templates
cron/*.py.tpldel generador - skills scaffold
init,status,logs,run-now,register-job
Principio de diagnóstico
En puruto-cron, separa estos fallos:
- Configuración declarativa (
.jobs.json) - Persistencia local (
db/cron.db) - Scheduler/runtime (
tick,run-now, leases) - Observabilidad/notificaciones (
notifications/events.jsonl, outbox a telegram)
Paso 1. Validar estructura del repo
python3 /Users/pepetox/Documents/01-code/puruto/.claude/skills/validate/scripts/validate.py /ruta/a/puruto-cron --jsonRevisa:
kind = "puruto-cron"errors = 0
Paso 2. Validar .jobs.json
Chequeo rápido de parseo:
python3 - <<'PY'import jsonfrom pathlib import Path
data = json.loads(Path(".jobs.json").read_text(encoding="utf-8"))jobs = data.get("jobs", [])print("jobs:", len(jobs))for j in jobs: print("-", j.get("job_id"), "enabled=", j.get("enabled"), "schedule=", j.get("schedule"))PYSi falla:
- JSON inválido
- root sin
jobs - jobs con campos críticos faltantes
Referencia:
Paso 3. Inicialización base (alineada con /init)
La skill /init del scaffold hace:
mkdir -p db runs notificationspython3 main.py init-dbpython3 main.py sync-jobspython3 main.py status
Si dudas del estado local, reejecuta ese flujo.
Paso 4. Estado del scheduler (status)
Comando:
python3 main.py statusLa salida JSON incluye:
jobsrecent_runsnotification_targets
Qué revisar:
- jobs esperados existen
enabled,next_run_at,lease_owner,lease_expires_at- rutas de notificación (
local_events,telegram_outbox)
Paso 5. Probar ejecución puntual (run-now)
Comando:
python3 main.py run-now <job_id>Revisa en la salida:
status(ok/error)run_idnotification_paths
Errores controlados frecuentes (scheduler):
JOB_NOT_FOUNDJOB_DISABLEDJOB_LOCKED
Paso 6. Diagnóstico de tick (scheduler loop)
Comando:
python3 main.py tickCampos clave:
nowlease_ownerdue_jobsresults[]
Si due_jobs sale vacío cuando esperas ejecuciones:
- revisa
next_run_at - revisa
enabled - revisa leases activos (
lease_expires_at) - revisa si el
scheduleparsea en el MVP
Paso 7. Notificaciones y outbox a puruto-telegram
puruto-cron escribe siempre en:
notifications/events.jsonl
Y replica opcionalmente al repo hermano puruto-telegram en:
../puruto-telegram/inbox/cron-events.jsonl(por defecto)
Variables relevantes:
PURUTO_TELEGRAM_PATHPURUTO_TELEGRAM_OUTBOX_FILE
Comprobación:
ls -la notifications runstail -n 20 notifications/events.jsonlSi no se replica a telegram:
- revisa
notification_targetsenmain.py status - confirma que existe el repo
puruto-telegram - revisa
PURUTO_TELEGRAM_PATH
Paso 8. SQLite (diagnóstico profundo)
DB por defecto:
db/cron.db
Inspecciones útiles:
sqlite3 db/cron.db "select job_id, enabled, next_run_at, lease_owner, lease_expires_at from jobs order by job_id;"sqlite3 db/cron.db "select run_id, job_id, status, started_at, finished_at from runs order by started_at desc limit 20;"Diagnóstico por síntomas
status OK pero no ejecuta jobs
Revisa:
enabled=falsenext_run_atnulo (schedule no parseable en MVP)- lease activo (
JOB_LOCKED)
run-now devuelve error del invoker
El scaffold usa invoker.py común (stub o error estructurado). Revisa:
- payload de
result/error notifications/events.jsonl- integración del target (si has modificado el scaffold)
No aparecen eventos en notifications/events.jsonl
Revisa:
- que realmente hubo una ejecución (
run-now/tick) - permisos de escritura en
notifications/ - errores antes de
emit_notification()
Checklist de diagnóstico rápido
validate.pydel repopuruto-cron✅.jobs.jsonparsea ✅main.py statusresponde ✅run-now <job_id>responde ✅notifications/events.jsonlregistra eventos ✅db/cron.dbcontiene jobs/runs ✅
Referencias relacionadas
Última verificación
Runbook contrastado con cron/main.py.tpl, cron/scheduler.py.tpl, cron/notifier.py.tpl, cron/db.py.tpl y skills scaffold de puruto-cron el 25 de febrero de 2026.