Облачные агенты: web, routines и фоновые задачи

В предыдущих статьях мы разбирали автоматизацию через GitHub Actions и GitLab CI/CD — оба подхода завязаны на пайплайн вашего репозитория. Но что если задача не связана с пушем в ветку? Что если агент должен запускаться ночью по расписанию, отвечать на алерты из мониторинга или поддерживать PR в актуальном состоянии, пока вы на встрече — и всё это без открытого терминала?

Здесь Claude Code предлагает три разных механизма фоновой работы. Они отличаются тем, где выполняется агент и как долго живёт задача.

flowchart TD subgraph CLOUD["☁️ Инфраструктура Anthropic"] R["Routines\n(Schedule / API / GitHub)"] end subgraph LOCAL["💻 Ваша машина"] D["Desktop scheduled tasks\n(без открытой сессии)"] L["/loop\n(внутри открытой сессии)"] end subgraph VIEW["👁 Agent View"] AV["claude agents\n(панель всех фоновых сессий)"] end R -->|"создаёт сессию на claude.ai"| AV D -->|"локальные задачи"| AV L -->|"сессионные задачи"| AV style CLOUD fill:#e8f4f8,stroke:#2196f3 style LOCAL fill:#f0f8e8,stroke:#4caf50 style VIEW fill:#fff8e1,stroke:#ff9800
flowchart TD
    subgraph CLOUD["☁️ Инфраструктура Anthropic"]
        R["Routines\n(Schedule / API / GitHub)"] 
    end
    subgraph LOCAL["💻 Ваша машина"]
        D["Desktop scheduled tasks\n(без открытой сессии)"]
        L["/loop\n(внутри открытой сессии)"]
    end
    subgraph VIEW["👁 Agent View"]
        AV["claude agents\n(панель всех фоновых сессий)"]
    end
    R -->|"создаёт сессию на claude.ai"| AV
    D -->|"локальные задачи"| AV
    L -->|"сессионные задачи"| AV
    style CLOUD fill:#e8f4f8,stroke:#2196f3
    style LOCAL fill:#f0f8e8,stroke:#4caf50
    style VIEW fill:#fff8e1,stroke:#ff9800
Три уровня фоновой работы в Claude Code: cloud, local и сессионный /loop

Три уровня фоновой работы

Прежде чем углубляться в детали, важно понять, чем три механизма принципиально отличаются:

Routines (cloud)Desktop tasks/loop
Где выполняетсяИнфраструктура AnthropicВаша машинаВаша машина
Нужен открытый терминалНетНетДа
Нужна включённая машинаНетДаДа
Доступ к локальным файламНет (клонирует репо)ДаДа
Минимальный интервал1 час1 минута1 минута
Живёт без сессииДаДаНет (7 дней, потом умирает)

Простое правило: нужно работать без машины — Routines; нужны локальные файлы и машина включена — Desktop tasks; быстрый поллинг прямо сейчас, пока сессия открыта — /loop.


Быстрое повторение
Где выполняется routine, и почему это определяет её главное преимущество?

Routines: агент, которому не нужна ваша машина

Routine — это сохранённая конфигурация Claude Code: промпт, один или несколько репозиториев, MCP-коннекторы. Всё это упаковывается один раз и запускается автоматически на серверах Anthropic.

> Статус: Routines находятся в research preview. API и лимиты могут меняться. Доступны на тарифах Pro, Max, Team и Enterprise при включённом Claude Code на вебе.

Каждый раз, когда routine запускается, создаётся полноценная Claude Code-сессия — со всеми инструментами, но без запросов на разрешения. Агент работает автономно: читает, пишет, вызывает MCP, пушит ветки. Поэтому промпт должен быть максимально конкретным: что сделать, как убедиться что всё сработало.

Создание routine

Создать routine можно двумя способами: через веб-интерфейс на claude.ai/code/routines или прямо из CLI командой /schedule.

Через CLI — быстрее для простых случаев:

# Создать routine с расписанием — естественный язык
/schedule daily PR review at 9am

# Разовый запуск
/schedule in 2 weeks, open a cleanup PR that removes the feature flag

# Посмотреть список и управлять
/schedule list
/schedule update
/schedule run

> /schedule требует авторизации через claude.ai (не API-ключ). Если в окружении выставлен ANTHROPIC_API_KEY, команда будет скрыта — уберите ключ и войдите через claude login.

Через веб-форму открывается больше опций: выбор модели, настройка окружения, несколько триггеров одновременно, MCP-коннекторы.

Проверь себя
Вы хотите запустить routine через CLI командой `/schedule`. Почему команда не отображается в интерфейсе, хотя вы установили Claude Code и у вас есть `ANTHROPIC_API_KEY`?

Три типа триггеров

Одна routine может сочетать несколько триггеров. Например, routine код-ревью можно запускать и по расписанию (ночной прогон), и по API-вызову из деплой-скрипта, и на каждый открытый PR.

Schedule — по расписанию. Пресеты: hourly, daily, weekdays, weekly. Для нестандартного интервала (например, «каждые два часа») нужно задать cron-выражение через /schedule update в CLI. Минимальный интервал — 1 час. Время задаётся в вашем локальном часовом поясе.

API — по HTTP-запросу. После создания routine получает уникальный endpoint. Любая система, умеющая делать POST-запрос, может запустить агента:

curl -X POST https://api.anthropic.com/v1/claude_code/routines/trig_01ABCDEFGHJKLM/fire \
  -H "Authorization: Bearer sk-ant-oat01-xxxxx" \
  -H "anthropic-beta: experimental-cc-routine-2026-04-01" \
  -H "anthropic-version: 2023-06-01" \
  -H "Content-Type: application/json" \
  -d '{"text": "Sentry alert SEN-4521 fired in prod. Stack trace attached."}'

В ответе приходит URL сессии — можно сразу открыть и смотреть, что делает агент.

{
  "type": "routine_fire",
  "claude_code_session_id": "session_01HJKLMNOPQRSTUVWXYZ",
  "claude_code_session_url": "https://claude.ai/code/session_01HJKLMNOPQRSTUVWXYZ"
}

GitHub — на события репозитория. Поддерживаемые события: pull_request (открыт, закрыт, обновлён, помечен лейблом…) и release (создан, опубликован, удалён). Фильтры позволяют точно выбрать, какие PR запускают routine: по автору, заголовку, базовой ветке, лейблам, статусу draft.

Пример: routine портирует изменения в SDK на другой язык срабатывает только на pull_request.closed + is_merged: true + labels: include needs-backport. Никаких лишних запусков.

Проверь себя
Routine настроена с GitHub-триггером на `pull_request.closed`. Каждый день закрываются десятки PR. Как ограничить запуски только теми PR, которые были смерджены и имеют лейбл `needs-backport`?

Ветки, коннекторы и окружения

Ветки. По умолчанию routine пушит только в ветки с префиксом claude/. Это защита от случайной записи в main или release. Если нужно разрешить пуш в произвольные ветки — включите «Allow unrestricted branch pushes» в настройках routine.

Коннекторы. Это ваши MCP-серверы, добавленные через claude.ai (не локальные, добавленные через claude mcp add — они живут только на машине). При создании routine все коннекторы включаются по умолчанию. Удалите лишние — агент получит доступ только к тому, что реально нужно.

Окружение. Каждая routine работает в изолированном cloud environment с настраиваемыми: сетевым доступом (список разрешённых доменов), переменными среды (API-ключи, токены) и setup-скриптом (установка зависимостей, кешируется между запусками). Стандартное окружение «Default» разрешает пакетные регистры, cloud provider API и CDN — но блокирует всё остальное.

Что показывает статус «green»

Важный нюанс, который легко упустить: зелёный статус в списке запусков означает, что сессия стартовала и завершилась без инфраструктурной ошибки. Это не гарантирует, что задача в промпте выполнена успешно. Провал сети, отсутствующий коннектор или логическая ошибка в задаче — всё это видно только внутри сессии, в транскрипте.


Быстрое повторение
Почему routine не запрашивает разрешения на действия, в отличие от интерактивной сессии?

Agent View: панель управления фоновыми агентами

Когда routines или субагенты работают параллельно, нужно видеть общую картину. Для этого есть agent view — запускается командой:

claude agents

Это один экран со всеми фоновыми сессиями, сгруппированными по состоянию:

  • Needs input — агент ждёт вашего ответа
  • Working — активно выполняет задачу
  • Completed — завершил работу

Внизу экрана — поле для диспетчеризации новой сессии. Навигация между сессиями — стрелками; войти в сессию для ответа — Enter. Вы не держите N открытых терминалов: открыл agent view, ответил агентам в статусе «Needs input», закрыл.

Каждая фоновая сессия — полноценный диалог с Claude, который продолжается без открытого терминала. Подключиться можно когда угодно: прочитать транскрипт, отправить уточнение, создать PR из изменений.

Проверь себя
Вы открываете agent view и видите несколько сессий в статусе «Needs input». Что именно это означает с точки зрения агентного цикла?

/loop: поллинг прямо в сессии

Если routines — это «запустить и забыть», то /loop — это «смотреть в терминал, пока задача не решится». Команда повторяет промпт по расписанию внутри текущей сессии.

# Фиксированный интервал + конкретная задача
/loop 5m check if the deployment finished

# Динамический интервал — Claude сам выбирает паузу
/loop check CI and address review comments

# Голый /loop — встроенный maintenance-промпт
/loop

Три режима поведения

Фиксированный интервал (/loop 5m задача). Claude переводит интервал в cron-выражение. Секунды округляются вверх до минуты. Нестандартные интервалы (7m, 90m) округляются до ближайшего поддерживаемого — Claude сообщит, что именно выбрал.

Динамический интервал (/loop задача). Claude сам решает, как долго ждать после каждой итерации: смотрит на то, что обнаружил, и выбирает паузу от 1 минуты до 1 часа. Если билд ещё в процессе — короткая пауза; PR затих и всё зелёное — пауза длиннее. Иногда вместо поллинга использует инструмент Monitor, который стримит stdout процесса и реагирует на события, не тратя токены на холостые проверки.

Голый /loop. Запускает встроенный maintenance-промпт: продолжает незавершённую работу из сессии, тендирует PR (комментарии ревьюера, упавший CI, конфликты), запускает cleanup-паши когда больше нечего делать. Неплохой способ оставить агента «дежурить» по ветке на вечер.

loop.md: ваш дефолтный промпт

Если голый /loop должен делать что-то специфичное для вашего проекта — создайте файл loop.md:

# .claude/loop.md
Check the `release/next` PR. If CI is red, pull the failing job log,
diagnose, and push a minimal fix. If new review comments have arrived,
address each one and resolve the thread. If everything is green and
quiet, say so in one line.

Поиск: сначала .claude/loop.md (уровень проекта), потом ~/.claude/loop.md (глобальный). Файл читается перед каждой итерацией, так что можно редактировать его прямо во время работающего /loop.

Ограничения /loop

  • Задачи живут только в текущей сессии. При новом claude они пропадают. claude --resume восстанавливает незавершённые задачи (созданные в последние 7 дней).
  • Не срабатывают, когда Claude занят ответом на другой запрос — ждут своей очереди.
  • Нет catch-up: если задача не сработала в назначенное время (Claude был занят), она срабатывает один раз, как только Claude освободится.
  • Максимум 50 задач в одной сессии.

Остановить цикл: Esc во время паузы между итерациями.


Быстрое повторение
Что происходит с /loop задачей при закрытии Claude Code?

Практические паттерны

Alert triage через API-триггер. Мониторинг (Sentry, Datadog, Grafana) вызывает endpoint routine, передавая тело алерта в поле text. Routine тянет стек-трейс, коррелирует с последними коммитами в репо и открывает draft-PR с предложенным фиксом. Дежурный видит готовый PR вместо пустого терминала.

Ночная чистка бэклога. Schedule-триггер каждую ночь по будням: читает задачи через Slack/Linear коннектор, навешивает лейблы, назначает ответственных. Утром команда получает розданный бэклог.

Поддержка PR в сессии. Вы работаете над другой задачей, но хотите не пропустить новые комментарии в PR:

/loop check whether CI passed and address any review comments on PR #247

Claude поллит каждые несколько минут, адресует комментарии и сообщает об изменениях.

Разовое напоминание. Не через routine — просто натуральный язык внутри сессии:

remind me in 45 minutes to push the release branch

See also