# Heartbeat · Schedule tasks > Built-in and owner-created scheduled work — templates, cadences, the worker's 60-second re-sync, and how outcomes join back to the plan. --- .. toc:: ## Two kinds of tasks, one scheduler **Built-in tasks** are code: the frozen `SCHEDULE` list plus job bodies in `lib/pulse/network_jobs.py` (satellite sweep every 5 minutes, hourly traffic rollup, daily wallet summary, daily digest, nightly prune). **Dynamic tasks** are rows: created at [/admin/heartbeat/tasks](/admin/heartbeat/tasks) (owner-only), each parameterizing a pre-built template at a chosen cadence. The pulse worker re-syncs its scheduler every 60 seconds, so a new task fires within a minute of clicking Create — no deploy, no restart. .. exec::docs.heartbeat.tasks_examples ## Outcome joins Every run wraps itself in `hb.task()`, landing as `task_start`/`task_end` events. The schedule joins each planned slot against actual `task_end` events within ±15 minutes to grade it — `complete`, `partial` (finished with a note), `error`, or `missed` — which is what the calendar, the UP NEXT countdowns, and the runs pie all render. .. admonition::The re-sync subtlety :icon: tabler:alert-triangle :color: yellow The worker's sync loop only re-adds a scheduler job when its cadence fingerprint changes. Re-adding an unchanged interval job resets its next-fire time — an unconditional 60-second re-add would starve every hourly job forever. Parameters aren't in the fingerprint because they're re-read at fire time. ## Guardrails - Cadence floor: every 5 minutes. - Tasks faster than every 30 minutes stay off the calendar (the rhythm bar and satellite board tell their story) — a 5-minute task alone would put ~288 events a day on the grid. - No template may make an LLM or metered-AI call. The hub observes; it never generates. The full operational playbook — including curated per-satellite task suggestions — lives at `HEARTBEAT-TASKS.md` in the repo root. .. llms_copy::Heartbeat · Schedule tasks --- *Source: /docs/heartbeat-tasks*