Skip to content

Concepts: Overview

Wakeplane is built around four concerns that are kept explicitly separate:

ConcernRole
Scheduler / PlannerComputes due occurrences from schedule definitions
DispatcherClaims eligible runs and dispatches to executors
ExecutorPerforms the actual work (HTTP call, shell command, workflow)
Run LedgerAppend-only record of every execution attempt

The planner and dispatcher are separate loops. The planner materializes occurrences from schedule state. The dispatcher claims and executes them. Neither loop does the other’s job.

Executors are registered types, not arbitrary execution blobs. You declare a target type (http, shell, workflow) and the dispatcher routes to the correct executor.

Every scheduled occurrence has a deterministic occurrence_key derived from the schedule ID and the scheduled time slot. This key is the deduplication boundary — the same slot cannot be executed twice, even after restarts or failures.

Manual triggers use a different key space (manual:<run_id>) and do not collide with scheduled occurrences.

No executor runs without:

  1. A persisted run record
  2. A durable claim held by the worker

This is not optional. It is enforced structurally. Execution without a run record and claim is not possible through the normal dispatch path.