feat(task-manager): task scheduler API, dashboard and tutorial

Slice 1 / 6 (base: `feat/sched-0-serial-line`).

The thin end-to-end deferred-work path. `execute(task, run_at=T)` returns immediately with a JobHandle (id + status); plain `execute(task)` is unchanged. A Job lands in an in-memory `JobStore` (Protocol + `InMemoryJobStore` adapter); a `Scheduler` tick loop fires it at/after T through the shared SerialLine and the router. State transitions (queued→running→done/failed) publish `JobEvent`s. `tick(now)` takes an injected clock. Loud startup warning that the in-memory store loses schedules on restart.

image.png

Edited by Kristian Gogora

Merge request reports

Loading