Schedule builds
A scheduler invokes the same meteo forecast build command you ran manually.
The scheduler sits outside the data contract. The operator communicates the
schedule and availability to consumers.
Use the declared cadence
models.json declares each forecast model’s runIntervalHours, stepHours
and horizonHours. Observation datasets declare cadenceMinutes instead
and run on their own clock. A GOES observation builder runs on every
fifteen-minute tick, independent of when any forecast model publishes.
The wire told on us records how we learned that
the expensive way. The living forecast feed reference
records provider schedules and verification dates. Use both when you choose a
polling window, and do not run a builder more often than its provider publishes.
scheduler tick │ ├─ latest run incomplete ──→ no publication ├─ reference time unchanged → no rewrite └─ complete new run ────────→ profiles + history + manifest │ ▼ deploy static treeA worked schedule
hrdps-continental publishes four runs a day (00/06/12/18Z). Each run is
complete roughly T+3:55 after its reference time, and the
feed reference
has the verified window. A tick a few minutes after the window, in UTC,
catches each run once.
5 4,10,16,22 * * * cd /srv/forecasts && pnpm exec meteo forecast build --model hrdps-continental --sites ./sites.json --output ./public/data && ./deploy.shBuilds are idempotent, so the timing is forgiving. A tick that fires before
the run completes publishes nothing. A tick that sees an already-published
referenceTime exits without rewriting. An extra tick per window (say, 30
minutes later) costs one cheap manifest read and covers a slow provider day.
deploy.sh stands for whatever moves --output to your hosting, and
Publish static output shows the sync
commands. Run it only on a zero exit.
Operational rules
- Give each model its own step and its own failure label. Group steps into jobs by provider rate-limit domain instead of by model, so a provider host sees at most one builder’s connections at a time. The reference operator instance is set up this way.
- Prevent overlapping jobs against the same output directory.
- A zero exit means the command completed. Check separately whether it produced a new manifest identity.
- Deploy only after the builder has completed. Consumers still guard manifest/profile skew because CDN objects can expire independently.
- Keep credentials and destination-specific settings in the scheduler or hosting platform. They do not belong in profile JSON.
- Keep logs with the model slug, start and end time, exit status and the
published
(referenceTime, generatedAt)pair.
The public reference operator follows every rule on this page in its schedule. Tune the wire walks through its pipeline.
For a multi-model schedule, prefer separate invocations over --all when
failure isolation matters. --all is useful for controlled batch execution
and follows the model catalogue’s order, but one failing model stops that command.