ENGitHubУстановить

Расписания - что запускается само и что происходит при сбое

Фоновая работа идёт расписаниями eve: единая ночь памяти memory-night в 04:00, получасовой тик proactive (Watch, Brief и Insight), дневной jobs-watchdog и минутный диспетчер напоминаний. Каждое расписание - тонкий спавнер, работа живёт в scripts/ (см. docs/deploy.md).

Каждый запуск оставляет факт

Одна строка на запуск в data/jobs.json (кроме получасового тика proactive: он пишет только провал и первый успех после него, чтобы 48 строк в сутки не вытесняли остальные): имя, время старта и финиша, ok, причина провала, код выхода и хвост ошибок запуска (последние 20 строк stderr; режет то же правило, что пакет улик, — отчёт, который скрипт печатает в stdout, в строку и в ход агента не попадает). Строки старше семи дней удаляются при следующей записи. data/rollup-status.json хранит только «идёт сейчас» и «последний успех» для гвардов двойного запуска - история в jobs.json.

Агент просыпается с фактом

Сразу после запуска schedule-runner в фоне стартует scripts/jobs/wake.ts <name> <startedAt>. Ребёнок читает строку, открывает обычный ход агента и:

Владельцу уходит только непустой ответ, в его личный чат (первый id TELEGRAM_ALLOWED_USER_IDS: тап кнопки принимается только там). В тихие часы (по умолчанию 23:00–08:00) при включённых Watch и Brief ответ ночью не шлётся: провал остаётся открытым и встаёт первым в утреннем Brief. Если Watch и Brief выключены или время Brief не задано, ответ уходит сразу. Исход хода (ответил / ответил пустым / провалился, плюс отметка deferred у провала, который ждёт Brief) приписывается той же строке.

Куда смотреть

Если всё-таки сломалось

Сырой журнал запуска - журнал сервиса:

journalctl --user -u iva.service -n 200 --no-pager | grep schedule-runner
Исходный Markdown ↗