Distributed Job Scheduler  ·  View 04 of 20  ·  People and journeys

Journey — Ship a Scheduled Job

A developer with a four-word requirement meets the one screen where it gets hard.

Editable source SVG draw.io All views
Tenant developer first scheduled job Goal — A weekday 09:00 digest, in my customers' zone, live today Trigger — A product ask: "can this email go out every morning?" Done when — It fires at 09:00 local, and I can prove it fired 1 · Express cron string + zone 2 · Check dry-run 3 · Choose policy ◆ moment of truth 4 · First fire ◆ moment of truth 5 · Live day two onwards What they do Writes 0 9 * * 1-5 Names a zone Reads next 3 instants Picks missed-fire policy Picks overlap policy Watches the 09:00 Checks the history tab What the platform does Validates expression Resolves the zone Same code path as prod Explains each option Commits, then dispatches Publishes lateness How it feels Confident Fine Uneasy Where it hurts No idea what fire-all costs Is 3 s late a problem? What answers it Zone picker, not UTC maths Dry-run before commit Default is fire-once-now Published p99 budget Per-fire record Journey — A Developer Ships a Scheduled Job The trough is the policy screen: this is the one moment a developer is asked a distributed-systems question, and the default has to be the safe one. v 1.0 · owner Platform Architecture · date 2026-10

What the trough says

  • The sentiment line drops at the policy screen, not at the cron expression. Writing 0 9 * * 1-5 is easy; being asked what should happen to the fires missed during an outage is not.
  • That is a structural finding, not a UX one: the answer has to be declared before the outage (ADR-06), so the question cannot be deferred to the moment it matters.

What answers it

  • A default of fire-once-now, so the common case needs no decision and the unsafe case needs an explicit one.
  • Dry-run on the production code path, so the next three instants a developer sees are the instants the scheduler will use (ADR-05).
  • A published p99 lateness budget, so "three seconds late" has an answer other than a guess.

Assumptions

  • A developer's first scheduled job is a calendar recurrence in a named zone, not an interval. The zone picker is therefore on the primary path rather than behind an advanced toggle.