Skip to content
use-cases / mute-flaky-job / hero
CRON · MANAGED ENTRIES · PATCH

Mute the flaky job without losing it

The hourly metrics export has been failing for three days. You're on call tonight. PATCH the managed cron entry with enabled:false — the schedule, the command, the comment all stay. The job is in a defined state: present and muted, waiting for someone to fix it.

Read the cron docs

the toggle is just a PATCH · the entry never leaves the list

use-cases / mute-flaky-job / mechanism

Mute is a single PATCH

Hoody Cron's managed entries are a JSON resource: each row has an id, a schedule, a command, a comment, and an enabled flag. Flipping enabled to false is one PATCH. The entry stays in the crontab so the next person can read it and decide what to do.

terminal · on-call laptop
PATCH · mute
# mute the flaky entry — entry stays in the crontab
curl -X PATCH \
  https://cron.containers.hoody.com/users/me/entries/e7d3 \
  -H "Content-Type: application/json" \
  -d '["enabled": false, "comment": "flaking on monday with prod-db — see #pager"]'

# response
HTTP/1.1 200 OK
{ "id":"e7d3", "enabled":false, "schedule":"0 * * * *",
  "command":"/srv/cron/metrics-export.sh", ... }
terminal · the next morning
GET · verify
# the entry is still on the list — just not running
curl GET https://cron.containers.hoody.com/users/me/entries

HTTP/1.1 200 OK
[
  { "id":"a1f2", "enabled":true,  ... },
  { "id":"e7d3", "enabled":false, "comment":"flaking — see #pager" },
  { "id":"9b21", "enabled":true,  ... }
]
# present and muted — the on-call hand-off has somewhere to point

The PATCH does not delete, rewrite, or move the entry — it flips one boolean. Hand-off is one line: 'metrics-export entry e7d3 is muted, see hoody-cron, please look.'

use-cases / mute-flaky-job / states

Three states, one entry

An entry on a Hoody crontab is always in exactly one of three states. Each state has different consequences for who knows what tomorrow morning.

ENTRY · e7d3 · /srv/cron/metrics-export.shPATCH switches between states — never destructive
ENABLED

Runs on schedule, paged on failure

The entry is in the crontab and the kernel cron daemon picks it up every hour. Failures wake on-call. This is the default for healthy jobs.

MUTED

Present, paused, annotated

enabled:false. The entry is still in the crontab so the team can read its schedule, command, and comment. The cron daemon skips it. No 2am page tomorrow, no one forgets it exists.

DELETED

Gone — and so is the context

Once you DELETE, the schedule, the command, the comment, the reason — all of it leaves the crontab. The next on-call has nothing to grep. Mute is the choice that keeps the memory.

Mute is the middle state most schedulers don't have a name for. Hoody Cron does, because enabled is a first-class field on the managed entry.

use-cases / mute-flaky-job / powers

Why a defined muted state matters

When you can't fix a job tonight, the question is what shape its absence takes by tomorrow. Mute makes that shape readable.

HAND-OFF

The on-call message is one line

Instead of pasting a Slack thread or a deleted-line PR, the message is the entry id. Tomorrow's on-call opens the cron URL, reads the comment, and knows where to start.

AUDIT

Every mute is a row, not a memory

GET /entries returns enabled:false alongside the comment. Build an audit panel by filtering. Who muted it, why, and how long ago is in the JSON, not in someone's DMs.

REVERSIBLE

Un-muting is the inverse PATCH

When the underlying issue is fixed, one more PATCH with enabled:true puts the entry back on schedule. No rewriting the cron expression, no risk of typos, no commit-and-deploy cycle.

use-cases / mute-flaky-job / capacity

What the cron API gives you

Numbers come from the Hoody Cron managed-entries surface, not invented benchmarks.

  1. ONE METHODPATCH

    PATCH /users/[user]/entries/[id] accepts a partial body. Send ["enabled":false] alone — schedule, command, and comment are untouched.

  2. FIELDS PRESERVED5+1

    Five-field schedule, command, comment, expires_at, and id all persist across the mute. The kernel crontab still reflects the entry — just commented out by the cron service.

  3. REWRITES0

    No file edit, no PR, no deploy. The mute round-trip is one HTTP call from any terminal, including the one on your phone.

Per the Hoody Cron Managed Entries API: each entry carries an enabled boolean alongside schedule, command, comment, and optional expires_at. PATCH accepts partial bodies.

use-cases / mute-flaky-job / punchline

Disabled isn't deleted — the entry waits for someone to fix it.

tonight · on call · 23:14tomorrow · the team · 09:00
WHAT THE OLD WORKFLOW LOOKED LIKEvim crontab → comment line → commit → PR → merge → deploysix steps · loses comment context · risks a typo on a tired night
WHAT IT LOOKS LIKE NOWcurl -X PATCH .../entries/e7d3 -d '["enabled":false]'one PATCH · entry stays in the list · note travels with it
See the PATCH spec
use-cases / mute-flaky-job / replaces

What this replaces

The usual ways teams 'temporarily' park a flaky cron line. Each one is either destructive, lossy, or two PRs away from production.

  • commenting out crontab lines by handLoses the structured enabled flag · easy to forget
  • deleting the entry and 'remembering'Schedule, command, and reason all leave with it
  • manual // FIXME comments in codeLives in a repo, not in the schedule that runs
  • Slack threads as on-call memorySearchable for a week · then it's nobody's job
  • GitHub issues for muted-but-not-deleted jobsAn issue for a thing that's still on the crontab — duplicate state
  • Terraform-managed cron configPlan, apply, deploy — for one boolean field
use-cases / mute-flaky-job / cta

Stop deleting flaky jobs at 2am. Mute them, leave a note, and let tomorrow's on-call read the JSON.

Read the cron docs
use-cases / mute-flaky-job / related

Read the others