> 🇬🇧 [English version](../reminders.md) — каноническая версия, она может быть новее.

<!-- ru-sync: docs/reminders.md@v0.4.0 -->

# Напоминания

Попросите Иву напомнить - и она напомнит: в нужную минуту, в вашей зоне, в вашем чате. Напоминание это не заметка, о которой она может вспомнить: это строка в `data/`, которую раз в минуту забирает диспетчер. Перезапустите сервер, обновите Иву, откатите версию - строка на месте, а всё, чей срок пришёлся на время простоя, сработает на первом же тике после возвращения.

## Как попросить

Обычными словами в чате, как сказали бы человеку:

- «напомни через 30 минут позвонить в клинику»
- «в 14:30 напомни отправить счёт»
- «14 сентября в 09:00 - дедлайн по договору»
- «по будням в 9 утра напоминай про стендап»
- «какие у меня напоминания?» - она перечислит
- «сними напоминание про стендап» - найдёт и снимет

Вида два: разовое срабатывает один раз и на этом закончено, повторяющееся берёт следующий срок из расписания и ждёт его. Ни вы, ни она не считаете дату в уме: вы говорите когда, Ива превращает это в точный момент и называет время, которое записала. Если названное время не то, что вы имели в виду, скажите сразу - этот ответ и есть момент поймать недопонимание.

| Вы говорите                                     | Что это значит                                |
| ----------------------------------------------- | --------------------------------------------- |
| `in 30m`, `in 1h 30m`, `in 2d`                  | задержка от текущего момента                  |
| `14:30`                                         | сегодня в это время; если уже прошло - завтра |
| `2026-09-14 09:00`                              | эта дата и время на ваших часах               |
| ISO-момент со смещением или `Z`                 | ровно этот момент, где бы вы ни были          |
| выражение из пяти полей, например `0 9 * * 1-5` | повторяющееся: 09:00 по будням в вашей зоне   |

Всё считается в вашей зоне - той, в которой настроена Ива, а не в зоне сервера. Дата, которой на ваших часах не существует (час, пропущенный переходом на летнее время, 31 февраля), отвергается с этой причиной, а не округляется до соседнего времени. Время в прошлом и всё, что дальше года вперёд, - тоже.

## Что происходит в срок

Текст напоминания - это инструкция, которую Ива даёт себе будущей. В срок она просыпается свежей сессией, которая ничего не знает про разговор, где вы просили, делает то, что написано в тексте - своими инструментами, поэтому «найди новости и пришли» действительно идёт и ищет, - а код отправляет финальный текст этого хода в тот чат и ту тему, где вы просили. Один ход, одно сообщение.

Поэтому текст пишется так, чтобы стоял сам по себе: «напомни про стендап» и «собери вчерашние задачи и скажи, что осталось открытым» сработают, а «сделай то, что мы обсуждали» - нет: обсуждения к тому моменту рядом уже не будет.

Если ход не состоялся вовсе (провайдер модели недоступен, агент сломался, ответ пришёл пустым), код сам отправляет ваш текст дословно, а в строке остаётся причина. Напоминание приходит всегда - с моделью или без неё.

Повторов нет. Строка срабатывает один раз: в момент срабатывания она помечается, а повторяющаяся уезжает на следующий срок. Нет ни лестницы повторов, ни окна, которое снимает напоминание через часы, ни предупреждения на каждый провал - факт срабатывания остаётся в самой строке: `fired_at`, `delivered` и причина в `error`.

## Где смотреть список

`/menu` → **⏰** показывает ближайшие напоминания, что не дошло, и одну строку про диспетчер: когда он тикал в последний раз (его пульс - файл `data/reminders.tick`, который обновляется каждую минуту). Свежий пульс значит, что машинерия жива; старый или отсутствующий - что напоминания записаны, но не сработают, пока Ива не запущена.

Можно просто спросить в чате: Ива перечислит те же строки с id, следующим сроком и последним срабатыванием с фактом доставки. Сработавшие строки видны сутки - там и видно, дошёл ли текст. Попросите снять - снимет по id.

## Что делать при сбое

- **Ничего не пришло.** В строке `delivered: false` и причина в `error`. Почините чат или токен и попросите заново: разовое напоминание уже сработало, поэтому ставьте новое.
- **Ход агента не состоялся.** Ваш текст всё равно приходит дословно, причина - в `error` и в журнале (`journalctl --user -u iva.service | grep reminders`).
- **Диспетчер не тикает.** Список предупредит, что напоминание записано, но не сработает, а `iva doctor` скажет то же по файлу пульса. Он же перечислит напоминания, которые сработали за сутки и не доехали.
- **`no activity for 180000ms` при проверке внешнего задания.** Предел считает тишину в потоке событий Eve, включая блокирующий инструмент, который не выдаёт событий; это не трёхминутный предел всего хода. Проверка читает короткий снимок прогресса или статуса и возвращает его, даже если задание ещё работает. Ждать выхода процесса, запускать `tail -f` или держать цикл опроса не нужно. Процедуру описывает скилл `background-check`. Код отправляет финальный статус; модель не должна отправлять отчёт отдельно и затем продолжать ждать. Поздняя проверка — новый запрос владельца, а не новое напоминание, созданное внутри сработавшего хода.

## Чего Ива больше не делает

Расписание ставит инструмент `remind`. Отправка идёт ответом хода, во внешний чат — через `iva post`.

## Пределы

- **Туда, где попросили.** Напоминание возвращается в тот чат и ту тему форума, где его поставили; другой человек как адресат не поддерживается. Напоминания, поставленные до 0.4.4, идут в чат владельца из настроек.
- **Не чаще раза в десять минут.** Более частое повторяющееся расписание отвергается: это уже мониторинг, а не напоминание.
- **Ваша зона, одна из.** Всё считается в зоне, в которой настроена Ива.
- **Напоминание это один ход, а не проект.** Оно срабатывает, Ива делает написанное в одном ходу и отвечает один раз (повторяющееся переходит к следующему сроку). Потолка по времени у хода нет: он идёт, сколько нужно работе, и кончают его только две вещи - `/stop` из того же чата или три минуты тишины от модели. Ход напоминания останавливается через `/stop` в исходном чате. Нативная ■ доступна в черновике личного чата, когда ход ведёт канал Telegram. Новых напоминаний в этом ходу она не ставит: список и снятие - можно, добавление - нет.
