Concepts: Overview
Wakeplane is built around four concerns that are kept explicitly separate:
| Concern | Role |
|---|---|
| Scheduler / Planner | Computes due occurrences from schedule definitions |
| Dispatcher | Claims eligible runs and dispatches to executors |
| Executor | Performs the actual work (HTTP call, shell command, workflow) |
| Run Ledger | Append-only record of every execution attempt |
Separation of concerns
Section titled “Separation of concerns”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.
Occurrence identity
Section titled “Occurrence identity”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.
Durable-first execution
Section titled “Durable-first execution”No executor runs without:
- A persisted run record
- 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.