Ir al contenido
use-cases / on-call-shift-cron / hero
CRON · EXPIRES_AT · NOTIFICACIONES

Una escalada de guardia que caduca con tu turno

Publica una entrada cron el lunes con expires_at puesto al viernes a las 09:00. El job avisa a tu teléfono cada 30 minutos durante cuatro días, y se elimina solo en el instante en que termina el turno. La siguiente persona de guardia publica la suya. Sin programación de PagerDuty, sin config de scheduler compartida, sin recordatorio en el calendario para desactivarla.

Leer los docs de cron
use-cases / on-call-shift-cron / handoff

Cómo se hace el relevo del turno sin reunión

Tres puntos en la semana. La existencia de la entrada cron sigue al turno con exactitud — sin solapes, sin huecos, sin línea de crontab residual.

Lunes 09:00 → Viernes 09:01expires_at carga con el turno
LUNES 09:00

Publica la entrada

Un curl con schedule */30, command apuntando a hoody-notifications/push/me y expires_at = viernes 09:00:00Z. El servidor devuelve id e7d3.

LUN–VIE

Los avisos van a tu teléfono

Cada 30 minutos durante cuatro días la entrada se ejecuta y hace ping a hoody-notifications. Solo a tu dispositivo. El canal del equipo permanece en silencio.

VIERNES 09:01

La entrada se elimina sola

A las 09:00:00Z el servicio de cron borra e7d3. El tick de las 09:30 no tiene nada que disparar. La siguiente persona de guardia ya ha publicado la suya.

Cada persona de guardia escribe un POST cuando empieza su turno. El campo expires_at es el protocolo de relevo entero — el servicio de cron hace la limpieza, al segundo.

use-cases / on-call-shift-cron / mechanism

Dos curls — uno por turno

Todo el protocolo de rotación son dos llamadas HTTP por semana. Quien está de guardia publica el lunes, lista el viernes y comprueba que la entrada ya no está. No hay archivo de programación compartida en el que hacer merge.

monday.sh · m.dossantos
POST · entry
# monday 09:00 — i'm on call until friday 09:00
curl -X POST \
  https://oncall.containers.hoody.com/users/me/entries \
  -H "Content-Type: application/json" \
  -d '["schedule":"*/30 * * * *","command":"curl -fsS hoody-notifications/push/m.dossantos","comment":"on-call wk19","expires_at":"2026-05-08T09:00:00Z"]'

# response
HTTP/1.1 201 Created
{ "id":"e7d3", "expires_at":"2026-05-08T09:00:00Z", "enabled":true }
friday.sh · m.dossantos
GET · auditoría
# friday 09:01 — the next on-call took over
curl GET https://oncall.containers.hoody.com/users/me/entries

HTTP/1.1 200 OK
[
  // my entry e7d3 is gone — it expired
  // at 09:00 sharp. j.okafor's new
  // entry took over at 09:00:30.
]
# no slack thread, no calendar reminder

Ningún servicio de scheduler compartido entra en juego. La entrada cron es propiedad del ingeniero; nada de la configuración del siguiente de guardia depende de que el anterior haya hecho limpieza.

use-cases / on-call-shift-cron / powers

Tres cosas que esta forma quita de tu semana

Una entrada de guardia que controla su propio tiempo de vida frena tres clases de errores que las configs de PagerDuty y los recordatorios del calendario no pueden frenar.

ENRUTAMIENTO

Los avisos van a un dispositivo — el tuyo

Como el command de la entrada apunta a tu endpoint personal de notificación, las escaladas se dirigen a tu teléfono durante tu turno, y solo eso. Sin spam accidental al canal del equipo a las 3 de la mañana.

PROPIEDAD

Sin config compartida que editar, sin PR que mergear

No hay un escalation_policy.yaml que toque todo el mundo. Cada ingeniero es dueño de su entrada. Dos personas de guardia en zonas horarias distintas no pueden chocar editando el mismo archivo.

LIMPIEZA

El relevo está en los datos, no en el chat

Cuando llega el viernes a las 09:00 no preguntas «espera, ¿sigo recibiendo esto?». La entrada ya no está. Verificar el relevo es un GET que devuelve una fila menos.

use-cases / on-call-shift-cron / capacity

Lo que garantiza el servicio de cron

Las cifras vienen de la API de Hoody Cron. Límites reales, no inventados.

  1. PRECISIÓN DE EXPIRACIÓN1 seg

    La auto-expiración corre contra el reloj del sistema. Un expires_at 09:00:00Z se borra dentro del mismo minuto que dispara el tick de cron — sin retraso de 5 minutos del limpiador.

  2. CAMPOS POR PROGRAMACIÓN5

    Expresiones cron estándar de 5 campos más macros @hourly / @daily / @weekly. */30 * * * * es lo que se dispara cada 30 minutos durante tu turno.

  3. AISLAMIENTO1 / usuario

    Cada usuario del sistema tiene su propio crontab. La entrada del siguiente de guardia vive en su propio /users/[name]/entries — nunca toca la tuya.

Límites según la API de Hoody Cron: las entradas gestionadas son CRUD JSON con UUIDs y expires_at; el acceso al crontab raw está disponible por usuario; el aislamiento del crontab por usuario está integrado de fábrica.

use-cases / on-call-shift-cron / punchline

Cuando termina el turno, también termina la entrada cron — automáticamente.

antes · el archivo de rotacióndespués · dos curls por semana
CÓMO ERA EL RELEVO ANTESedita oncall.yaml → PR → merge → avisar a alguien para desactivarcuatro humanos · un archivo compartido · y aún recibías avisos el viernes a las 11
CÓMO ES AHORAPOST /entries [ expires_at: '2026-05-08T09:00:00Z' ]un ingeniero · un curl · el servicio de cron hace la limpieza
Leer los docs de cron
use-cases / on-call-shift-cron / replaces

Lo que esto reemplaza

Las herramientas a las que sueles recurrir cuando quieres rotaciones de guardia. Cada una te cobra un servicio, un repo de configuración y un ritual de relevo. Una entrada cron con expires_at te cobra un POST.

  • políticas de escalada de PagerDutyPrecio por asiento por lo que es un curl a tu teléfono
  • rotaciones de programación de OpsgenieUn producto entero para decidir a quién avisar esta semana
  • repos de config de guardia hechos a medidaYAML compartido al que todos hacen PR y nadie es dueño
  • acordarse de desactivar cron al hacer relevoUn recordatorio del calendario que pones, ignoras y maldices el viernes
  • limpieza manual de escaladasHilo de Slack a las 11 del viernes — "oye, ¿alguien me puede dar de baja?"
  • rotaciones de VictorOpsOtro servicio de scheduler para lo que hace un solo campo expires_at
use-cases / on-call-shift-cron / cta

Deja de desactivar líneas de crontab los viernes por la mañana. Pon expires_at el lunes y olvídate.

Leer los docs de cron
use-cases / on-call-shift-cron / related

Lee los otros