Scheduled task повторяет prompt по расписанию или по automation-триггеру, и это уже не разовый запуск, а production-workflow со своими требованиями. Три из них ключевые: задача должна быть идемпотентной, ограниченной по правам и оставлять evidence, понятное после вашего отсутствия. Идемпотентность - чтобы повторный прогон не ломал то, что уже сделано; узкие права - чтобы автоматическое действие не выходило за рамки; понятное evidence - чтобы вы разобрались в результате, не наблюдая прогон вживую.
Требование evidence отличает запланированную задачу от интерактивной сильнее всего. В интерактиве вы видите ход работы и можете вмешаться; запланированная задача отрабатывает без свидетелей. Поэтому она должна оставлять после себя понятный след - отчёт, лог, артефакт, - по которому вы восстановите, что произошло и всё ли в порядке. Задача, которая "что-то сделала" и не оставила понятного evidence, в production бесполезна: вы не сможете ни довериться ей, ни разобрать её сбой.
Частые запланированные задачи создают операционную нагрузку, о которой легко забыть. Они могут порождать много worktrees, и без уборки это накапливается. Поэтому завершённые прогоны архивируют, а закрепляют только те, что действительно должны сохранять рабочее состояние. Это та же дисциплина, что и с сессиями: не растить бесконечно, а осознанно решать, что сохранить, а что убрать. Автоматизация без уборки за собой превращается в свалку worktrees, в которой потом трудно разобраться.
Recurring mutation - самый рискованный класс запланированных задач, и к нему подходят поэтапно. Задача, которая каждую ночь "сама чинит код", требует куда более строгой изоляции и ревью, чем разовый интерактивный turn: у неё нет человека рядом, а последствия накапливаются каждую ночь. Разумный путь - сначала автоматизировать read-only отчёт, убедиться, что он полезен и надёжен, и лишь затем, отдельно и осознанно, переходить к автоматической мутации. Сразу доверять ночную правку кода - значит рисковать вслепую.
Remote control - экспериментальная команда для локального app-server-демона и короткоживущего pairing. Полезно один раз увидеть её команды: start, pair с выводом в JSON и stop. Экспериментальный статус здесь важен так же, как у App Server: на команду не строят критичный процесс, не проверив её текущее поведение. Remote control удобен для быстрого связывания, но это не тот фундамент, на котором стоит возводить production-интеграцию.
У remote control есть жёсткое правило безопасности вокруг pairing. Pairing-код не должен попадать в логи или persistent chat: это ключ к связыванию, и его утечка открывает доступ. Его трактуют как секрет - короткоживущий, но всё же секрет. И отдельная граница ответственности: remote control не заменяет app-server --listen как поддерживаемый протокол для собственного клиента. Если вы строите свой клиент, его основа - App Server с его аутентификацией транспорта, а не экспериментальный pairing.
Смысл этой главы - в том, что автоматизация и удалённое управление требуют более строгой дисциплины, чем интерактив, а не менее. Отсутствие человека рядом не упрощает задачу, а повышает требования: идемпотентность, узкие права, понятное evidence, поэтапный переход к мутации, защита pairing-кода. Запланированная задача и удалённый контроль - это production, а в production цена ошибки выше и повторяется, поэтому границы задают строже, а не расслабленнее, чем в разовой работе за терминалом.
Типичные провалы вокруг этой темы предсказуемы. Сделать запланированную задачу неидемпотентной и ломать сделанное на повторном прогоне. Не оставить понятного evidence и не суметь разобрать результат после отсутствия. Развести ночную автоматическую мутацию сразу, минуя стадию read-only отчёта. Слить pairing-код в логи. И строить production-клиент на экспериментальном remote control вместо app-server --listen. Делайте задачи идемпотентными, оставляйте evidence, идите к мутации поэтапно, берегите pairing-код и стройте клиент на App Server.
# Remote control - экспериментальная команда (локальный app-server-демон, короткоживущий pairing)
codex remote-control start
codex remote-control pair --json
codex remote-control stop
# pairing code НЕ в logs/persistent chat; не заменяет app-server --listen для своего client
# recurring mutation: сначала read-only report, потом отдельно и осознанно - автоправка