Schedule
Route /schedule. Jobs the core runs on its own, and the live feed of what they did.

Creating a job
| Field | What it means |
|---|---|
| Spec | When to run. in 60s for one shot, or a cron expression for a recurring job |
| Task | The prompt the job runs, for example summarise today's commits |
| Mode | The permission mode the job's session starts in: plan, accept or auto |
| Channel | Where the result goes: log, or telegram:<chat id> for a bound chat |
| Workdir | Where it runs. Blank means the daemon's home |
A job running unattended cannot answer its own approvals. plan is the safe default, and auto on a scheduled job means exactly what it says.
The job list
Jobs are listed soonest first, under Upcoming; anything with nothing left to run — cancelled, or a one-shot that has fired — collects under Past, newest first.
Each job is one row of three lines. The first names the job: its spec, whether it repeats, the mode it runs in, the channel its result goes to, and the thread it delivers to when it has one. The second is the prompt itself, clamped to two lines so a long one cannot push the row down the page — more opens the rest in place, and the whole text is in the row's tooltip either way. The third carries both clocks, next and last, with the status of that last run: scheduled before the first one, then ok or the error it ended with.
Run now fires the job immediately, without disturbing its schedule. Cancel removes it. Both sit at the right of the row at a fixed size, and show their names when the pane is wide enough for them.
The live feed
The panel on the right is the core's job event stream: started, finished, failed. It updates as things happen, and every event also re-reads the list, because the outcome of a run is recorded on the core rather than derived here.