# Schedule в Kavor: добавьте часы к графу

Schedule делает причину активности видимой: вы выбираете время, подключаете одну цель и можете проверить каждую
попытку на Canvas.

В домене Kavor Schedule — доступный источник Trigger. Он не выполняет работу и не решает, стоит ли действовать. У
него только две обязанности: **когда сработать** и **какой payload доставить**.

Смысл payload задаёт цель:

- для **CodingAgent** это prompt;
- для **Terminal** это shell-команда.

Остальное принадлежит цели. Workspace, каталог, provider или shell, Git mode, permissions, Guardrails и контекст
графа остаются прежними.

![Завершённый Schedule соединён с CodingAgent, получившим prompt на ревью, а Sticky Note передаёт замысел цикла](https://media.agentkavor.com/releases/1.3.0/schedule-trigger/overview.e6db5dc413e3.jpg)

*Schedule запускает активность; CodingAgent использует достижимый контекст, чтобы выполнить работу и объяснить результат.*

## Три оправданных сценария Schedule

### Разбудить Maintainer вместе с контекстом

Schedule ежедневно доставляет prompt CodingAgent. Агент достигает Specification с контрактом сопровождения,
Terminal для проверок, File с входными данными, Sticky Note для отчёта и Reviewer для независимой оценки.

Schedule создаёт причину, а граф предоставляет намерение, инструменты, память и совместную работу.

### Выполнить видимую операционную команду

Schedule, напрямую соединённый с Terminal, доставляет проверку, скрипт или команду обслуживания. Если File также
соединён с Terminal через переменную окружения, команда использует канонический путь без копирования значений между
окнами.

```sh
sqlite3 app.db < "$CHECK_SQL"
```

Процесс остаётся в настоящем Terminal. История фиксирует наблюдаемую Kavor доставку, не выдумывая успех по тексту shell.

### Создать небольшую полуавтономную систему

```text
Schedule — Maintainer — Specification
                      ├─ Terminal
                      ├─ File
                      ├─ Sticky Note
                      └─ Reviewer
```

Линии — Connections без сохраняемого направления. У Schedule одна прямая цель: `Maintainer`. CodingAgent использует
остальную достижимую компоненту и оставляет доказательства для решения человека.

## Сначала настройте, затем запускайте часы

Новый Schedule начинается в состоянии **Paused** как будущее однократное выполнение. Можно написать payload,
выбрать повторение, соединить цель и проверить preview до разрешения активности.

Безопасный порядок:

1. добавьте Schedule на Canvas;
2. напишите конкретный проверяемый payload;
3. выберите однократное или повторяющееся выполнение;
4. проверьте `Next occurrences` и показанную зону;
5. напрямую соедините один CodingAgent или Terminal;
6. используйте `Resume`, только когда структура готова.

Во время настройки Trigger может не иметь цели. Работающий Schedule без target Connection записывает момент как
`Blocked`; `Run now` без цели отклоняется до создания попытки.

## Напишите payload, который способен завершиться

Хороший prompt указывает цель, ресурсы графа, ожидаемые доказательства и условие остановки:

> Проанализируй недавние сбои CI. Выполни только нужные проверки в Terminal Checks, запиши подтверждённое резюме в
> Sticky Note Daily report и попроси Reviewer о независимой оценке. Не меняй код до фиксации вероятной причины и
> остановись, если исправление требует расширить область Specification.

Хорошая Terminal-команда явна, не интерактивна и оставляет наблюдаемый результат:

```sh
pnpm test -- --runInBand
```

Payload не заменяет Connections. Упоминание Sticky Note, File или Specification не даёт доступ, если Node не входит
в достижимую компоненту CodingAgent.

## Повторение без скрытого календаря

Редактор предлагает `Once`, `Hourly`, `Daily`, `Weekdays`, `Weekly`, `Monthly` и `Custom` для расширенного cron.
Presets и расширенный редактор меняют одно выражение — двух расходящихся расписаний нет. Минимальный интервал — одна
минута. Не изображайте cron-выражением повторение, которое cron не представляет точно, например «каждые две недели
от этой даты».

Kavor сохраняет явную IANA-зону и показывает будущие моменты в локальной зоне машины, отображающей Canvas. В UI зона
не редактируется: она фиксируется с host при сохранении. Всегда проверяйте preview перед `Resume`.

При переходе летнего времени повторяющееся локальное время срабатывает один раз. Несуществующее время переносится на
первый допустимый локальный момент. Месячный preset пропускает отсутствующий день: 31-е не выполняется в феврале.

## Pause, Resume и Run now — разные действия

- **Pause** немедленно останавливает новые моменты; пауза не создаёт попыток или `Missed`.
- **Resume** рассматривает только будущие моменты и требует валидный payload; однократный момент также должен быть в будущем.
- **Run now** создаёт отдельную ручную попытку, работает на паузе и не сдвигает следующее повторение.

`Run now` проверяет payload и цель до запуска часов. Это не автоматический retry и он не меняет состояние Paused или
Running. После `Once` Schedule возвращается в Paused; история и `Run now` остаются.

## Что происходит в назначенное время

Kavor сохраняет долговечную попытку и согласует доставку с уже принятыми целью сообщениями. До результата возможны
состояния `Pending` и `Delivering`.

- **Completed** — Kavor наблюдал завершение;
- **Needs attention** — CodingAgent запросил вмешательство и ещё может завершиться;
- **Fired** — доставка произошла, но путь не даёт наблюдаемого завершения;
- **Failed** — произошёл наблюдаемый сбой;
- **Interrupted** — доставка началась, но закончилась без надёжного результата;
- **Blocked** — цель или Workspace были недоступны;
- **Missed** — runtime не смог занять момент;
- **Coalesced** — единственный pending slot цели уже занимала другая попытка.

Плановое время не доказывает выполнение. Проверьте последнее состояние Node и откройте историю: nominal time,
delivery, result и diagnostic.

## Когда машина спит или Kavor закрыт

Schedule зависит от локального runtime: Kavor должен работать, машина — не спать, пользователь — быть
аутентифицирован, а сессия цели — активна.

Если во время недоступности прошло несколько моментов, Kavor записывает только последний `Missed` для этого Schedule.
Он не создаёт тысячи строк и неожиданно не запускает старую работу после возвращения. UI показывает `Missed` и
предлагает явное действие, эквивалентное `Run now`.

Автоматического catch-up и retry внешних эффектов нет.

## Когда цель уже занята

Во время работы цели Schedule хранит не более одной pending-попытки. Новые моменты при занятом slot получают
`Coalesced` и позже не доставляются.

Если задача может длиться дольше интервала, увеличьте его или заставьте цель идемпотентно сверять текущее состояние.

## Ограничения, которые нужно учитывать

- у Schedule не более одной прямой цели: CodingAgent или Terminal;
- он не запускает намеренно закрытую сессию;
- не расширяет граф, permissions или Guardrails цели;
- не заменяет acceptance criteria и не оценивает правильность результата;
- делает не более одной автоматической доставки на зарегистрированную попытку;
- не обещает exactly-once для внешних эффектов;
- не ставит все `Missed` и `Coalesced` в очередь на потом.

Если нужны fan-out, поэтапное согласование, compensation или транзакционная оркестрация, моделируйте ответственность
в графе и оставляйте решение человека явным.

## Checklist перед Resume

- payload содержит цель, доказательства и условие остановки?
- `Next occurrences` соответствует ожиданиям?
- показанная зона верна?
- существует ровно одна target Connection?
- сессия цели должна оставаться активной?
- в графе только нужные контекст и capabilities?
- повтор безопасен, если внешний эффект уже произошёл?
- известно, где смотреть результат и историю?

## Дальше

- Проверьте [матрицу Connections](./connections.md).
- Узнайте, [как CodingAgents видят и строят Canvas](./coding-agents-and-canvas.md).
- Используйте [CodingAgents и роли](./agents-and-roles.md), чтобы разделить сопровождение, ревью и решение.
