Правило: пинг когда человек пропал

Trigger: сработал крон, поставленный через instructions/setup_idle_check_in (по умолчанию ежедневно в 13:00).

Как поступать

  1. Прочитай состояние из _remind_state.md (в корне vault).

  2. Если silent_until в будущем — выйти молча. Месяц молчания после серии безответных пингов.

  3. Найди последний daily в daily/ — самая свежая дата файла.

  4. Если daily обновлялась сегодня или вчераочистить _remind_state.md к дефолту и выйти молча. Это происходит именно здесь, в момент срабатывания крона — не реактивно где-то ещё. Дефолт:

    # _remind_state
    
    - last_daily_seen: <дата найденного свежего daily>
    - last_ping_at: null
    - escalation_step: 0
    - silent_until: null
    

    Человек активен, прошлая серия эскалации больше не релевантна — стираем её полностью.

  5. Иначе — решить, пора ли пинговать. Сверь сегодняшнюю дату с last_ping_at и escalation_step:

    escalation_step Можно пинговать если с last_ping_at прошло
    0 (ещё не пинговал) сразу — daily не обновлялась 1+ суток
    1 (был первый пинг) 2+ дня
    2 (был второй) 5+ дней
    3 (был третий) замолчать на месяц (silent_until = today + 30d)

    Если ещё не пора — выйти молча.

  6. Найди зацепку из ночного отчёта. Загляни в capabilities.md, секция «Доступно в школе» — её ночью обновляет instructions/cron_school_review на основе вчерашних задач. Если там есть свежая находка — выбери одну, самую релевантную последним темам владельца, чтобы упомянуть её в первом пинге. Если пусто — без зацепки, просто открытый вопрос.

  7. Сформируй пинг — открытый и конкретный, без «Вы здесь?». Все сообщения на «Вы». В групповом чате — начни с @owner (из _remind_state.md), чтобы пинг адресно прилетал владельцу, а не всем участникам.

    • Step 1 (первый — обязательно с дисклеймером):

      «[@owner если группа] Это автоматическая напоминалка — крон срабатывает каждый день в HH:MM (сейчас у меня TZ-NAME, HH:MM). Я молчу, пока Вы активно пишете в daily; пингую, если daily не обновлялась сутки+.

      Если время неудобное — скажите, переставлю. Если совсем не нужно — отключу: /cron remove idle_check_in.

      Кстати, в ночном обзоре школы нашёл school:insights/НАЗВАНИЕ — похоже, пригодится для [тема из вчерашних задач]. Рассказать?

      А по делу: на чём сложном сейчас застряли — могу помочь разобрать?»

      Подставь реальное расписание из своего крона, текущее системное время с таймзоной и одну находку из шага 6 (если есть — иначе строку про школу пропусти). Без дисклеймера пинг воспримется как «агент сам ожил» и не будет ясно, как им управлять.

    • Step 2 (через 2 дня): «[@owner если группа] Я здесь. Если затык — напишите, посмотрим вместе.» — можно добавить зацепку из школы, если шаг 6 нашёл что-то новое со вчера.

    • Step 3 (через 5 дней): «[@owner если группа] Может, что-то нужное? Помолчу на месяц, если не зайдёте.»

  8. Отправь пинг через канал общения с владельцем (мессенджер, email, что настроено).

  9. Обнови _remind_state.md:

    • last_ping_at: сейчас
    • escalation_step: +1
    • Если step стал 4 → silent_until: сегодня + 30 дней, escalation_step: 3 (заморозили)
  10. Залогируй в daily: [[behaviors/idle_check_in]] — отправлен пинг (step N, зацепка из школы: была / не было) / пропущен (причина).

Сброс состояния

Сброс — единственный механизм очистки _remind_state.md, и происходит только когда сработал крон (шаг 4 выше). Не реактивно при ответе человека, не по таймеру, не при другом событии. Это держит логику в одном месте: «крон проснулся → посмотрел daily → решил что делать со state».

Серия эскалаций начинается заново только после нового периода тишины.

Не делать

  • Не пинговать чаще раза в сутки — даже если в daily пусто несколько раз подряд, между пингами должен пройти интервал из таблицы
  • Не цитировать конкретные старые задачи («Вы обещали доделать X») — это давит, а не помогает. Открытый вопрос работает лучше
  • Не пинговать вне поставленного времени — крон в 13:00 это часть контракта с владельцем
  • Не молчать про пропуск — всегда писать в daily причину «пропустил пинг: daily обновлялась вчера»
  • Не обращаться в групповом чате ко всем сразу или без @mention — пинг прилетит всем участникам и будет восприниматься как спам

Когда отключать совсем

Если владелец ответил «отстаньте» или дважды проигнорировал с явным раздражением — снять крон (/cron remove idle_check_in) и удалить _remind_state.md. Лучше тишина, чем токсичность.

В группе сигналом «отключай» считается также реакция любого участника с явным негативом на пинг (например «спам, выключите этого бота») — снять без переспросов, владелец потом может включить заново.

Связано: instructions/setup_idle_check_in, insights/budgets_and_stopping (эскалация и точка молчания), behaviors/risky_actions (пинг это коммуникация наружу — формат фиксированный, никаких импровизаций)

Источник: sources/anthropic_blog (Effective Harnesses for Long-Running Agents — termination/escalation rules)