<!--
  scaffold: scheduling-and-launchd.md
  bucket: platform-tooling (Bucket 7)
  what belongs here: `schedules/<id>.json` conventions.
    - Target-host is an operator-configured field. Core describes mechanism; operator names host.
-->

# Scheduling

## Location and shape

Scheduled tasks live at `schedules/<id>.json`. JSON manifest per task.

## The mechanism

The core scheduler primitives handle:

- `schedules/<id>.json` manifest parsing.
- cron-style triggers.
- Task dispatch via the platform's task-runner (launchd on macOS, systemd on Linux).

Verbs (via `scheduler` bin):

- `scheduler install` — install a scheduled task.
- `scheduler verify` — check it's registered.
- `scheduler list` — list installed schedules.
- `scheduler remove` — remove.

Full reference: `packages/core/docs/scheduling.md`.

## Target host

**Core describes the MECHANISM; operator names the default HOST.** Target host is an operator-configured field in the schedule manifest.

Manifest shape (subset):

```json
{
  "id": "distill-4-hourly",
  "cron": "0 */4 * * *",
  "targetHost": "<operator-named-host>",
  "command": "pnpm exec distill"
}
```

<!-- OPERATOR: name your default scheduling target host here. Core does NOT prescribe a host name — it's operator-specific. -->

## Why the split

Host names are operator-specific by definition — every operator's machine estate is different. Core prescribing a specific host name would restrict every future operator adopting the platform.

## Related

- CLAUDE.md.template Bucket 7 rule 6.
- `packages/core/docs/scheduling.md`.
- `packages/core/schema/schedule.json` — canonical manifest schema.
