Channels в Claude Code: 5 ловушек на боевом сервере

Channels в Claude Code: 5 ловушек на боевом сервере

Channels Anthropic выкатили 20 марта 2026 - вечером того же дня я поставил плагин в Claude Code и прошёл сборку «за 30 минут». Поставил телефон на зарядку, ушёл смотреть выпуск Lex Fridman. Вернулся через час, открыл Telegram: два «hi» от @username, которых я в жизни не видел.

Я не настроил allowlist. Бот висел публично 10 минут, пока я переключался между шагами. Двое незнакомцев успели постучаться. Никаких злых команд, просто «hi». Но в этом окне мог влететь промпт «удали все .env-файлы», и Claude его бы выполнил - руками, без подтверждения.

С тех пор Channels у меня крутятся на VPS неделю. За это время собралось ещё 4 ловушки, на которые я наступал по очереди. Ниже разберу, что они из себя представляют, какой код их закрывает и что я бы себе сразу сказал на первом часу сборки.

Что внутри Channels: мост между Telegram и твоей сессией

Channels - официальный MCP-плагин от Anthropic. Его выкатили 20 марта 2026 в статусе research preview. Технически Channels - инструмент с MCP-протоколом: мост между мессенджером и активной сессией Claude Code, которая крутится у тебя на машине.

Логика такая:

  • В Telegram-бот ты пишешь «допиши спецификацию API».
  • Сообщение долетает до MCP-сервера плагина.
  • Плагин пересылает его в Claude Code, запущенный с флагом --channels.
  • Claude работает с твоими файлами в твоём окружении и отвечает в тот же чат.

То есть это асинхронный пульт к локальной сессии. Ноутбук закрыт дома, ты с телефоном в спортзале - код всё равно дописывается.

Поддерживаются Telegram, Discord и iMessage (Apple-only), у меня чаще Telegram. Нужна сборка Claude Code v2.1.80 или новее и подписка Pro ($20/мес) или Max ($100-200/мес). MCP-протокол в этой версии встроен, отдельной возни нет.

Главное про Channels до сборки: бот - это только транспорт. Реальные действия (чтение файлов, запись, команды) Claude выполняет в той сессии, где ты его запустил. С флагом --dangerously-skip-permissions все действия идут без подтверждения. Без флага - Claude замолкает на каждом «можно я запишу файл?» и ждёт «да» в Telegram. Середина - хуки, про них в Ловушке 2.

30-минутная сборка: 4 команды + 1 systemd-юнит

Это артефакт «скопировал, вставил, работает». Привожу без воды, в порядке шагов. Все команды проверены на Ubuntu 22.04 на VPS 500-1000 ₽/мес.

Шаг 1. Завести бота в BotFather.

В Telegram написать @BotFather, отправить команду /newbot, придумать имя и юзернейм, получить токен вида 1234567890:AAH.... Сохранить в файл ~/.claude/channels/telegram/.env:

TELEGRAM_BOT_TOKEN=1234567890:AAH...

Шаг 2. Поставить плагин в сессии Claude Code (внутри проекта).

/plugin marketplace add anthropics/claude-plugins-official /plugin install telegram@claude-plugins-official /reload-plugins

Маркетплейс добавляется один раз на всю машину, дальше не нужен.

Шаг 3. Перезапустить Claude с флагом Channels.

claude --channels plugin:telegram@claude-plugins-official

Без флага плагин в спячке. В логах при этом тишина - подсказки «вы забыли флаг» нет. Первая часть Ловушки 1 родом отсюда.

Шаг 4. Алиас в ~/.zshrc или ~/.bashrc:

alias claude-tg="claude --channels plugin:telegram@claude-plugins-official"

Дальше запуск - просто claude-tg, без раздумий.

Шаг 5. Привязать владельца и закрыть чужих. Внутри сессии:

/telegram:configure <токен> /telegram:access pair <код-из-Telegram> /telegram:access policy allowlist

Код из Telegram - 5-значный, живёт 5 минут, генерится плагином и постится в твой бот. Полиси allowlist запирает доступ только на тебя. Этот шаг должен идти ПЕРВЫМ после привязки токена, не последним - подробнее в Ловушке 1.

Шаг 6. Для 24/7 на VPS - systemd-юнит в /etc/systemd/system/claude-code.service:

[Unit] Description=Claude Code with Telegram channel After=network-online.target Wants=network-online.target [Service] Type=simple User=claude WorkingDirectory=/home/claude/workspace Environment="HOME=/home/claude" Environment="TELEGRAM_BOT_TOKEN=1234567890:AAH..." ExecStart=/usr/bin/claude --channels plugin:telegram@claude-plugins-official --dangerously-skip-permissions Restart=on-failure RestartSec=10 RuntimeMaxSec=86400 [Install] WantedBy=multi-user.target

Включаю:

systemctl enable --now claude-code journalctl -u claude-code -f

Дополнительно cron от root - утренний рестарт на всякий случай:

0 5 * * * systemctl restart claude-code

Зачем RuntimeMaxSec=86400 и cron - объясню в Ловушке 4. На этом «работающий пульт с телефона» собирается за 30 минут. Дальше - 5 граблей, на которые я наступил за неделю.

Ловушка 1. Allowlist молчит - и это убийственная иллюзия

Самая опасная грабля - забыть про allowlist или поставить его последним шагом. Я наступил на оба варианта в один вечер.

Что происходит, если allowlist не настроен: бот публикуется в Telegram под обычным юзернеймом. Любой, кто угадал имя или нашёл его через стандартный поиск Telegram, пишет в личку. Сообщение долетает до плагина. Плагин отдаёт его Claude Code как валидный запрос. Если у тебя в сессии стоит --dangerously-skip-permissions (а в проде он почти всегда стоит), Claude идёт выполнять запрос. По твоим файлам, в твоей сессии. Без подтверждения.

У меня окно «без allowlist» жило 10 минут. За это время двое @username, которых я в жизни не видел, написали боту просто «hi». Claude вежливо ответил «Hello! How can I help?». Через сутки я открыл логи и понял: в эти 10 минут можно было получить запрос «удали все .env-файлы в текущей папке» или «выложи содержимое /etc/shadow». И он бы его выполнил.

Включаю policy allowlist сразу же, до публикации токена в systemd. Внутри сессии:

/telegram:access policy allowlist /telegram:access pair <свой-код> /telegram:access list

Контр-интуитивно вот что: когда allowlist включён, плагин чужим молчит. Совсем. Бот выглядит мёртвым, и ты думаешь «никто и не стучался». На деле стучатся - просто молча получают тишину в ответ.

Я добавил себе еженедельный лог:

journalctl -u claude-code | grep "rejected" | wc -l

Каждое отклонённое сообщение - попытка постороннего. У меня цифра за неделю выросла с нуля до 7. Кто это, я не знаю - возможно, тестируют боты-сканеры по словарю популярных юзернеймов. Но если бы allowlist не сработал, любая из этих 7 попыток могла стать промптом-вандалом.

Правило, к которому я пришёл: allowlist ставится первой командой после привязки токена, до того как сервис уйдёт в бой через systemd.

Ловушка 2. --dangerously-skip-permissions грохнул мне debug-логи

Флаг --dangerously-skip-permissions нужен, чтобы сессия не зависала на каждом «можно я запишу файл?» при асинхронной работе через Telegram. Логика простая. Ты сидишь с телефоном в трамвае, Claude хочет переименовать src/utils.ts и ждёт твоего подтверждения. Не дождётся - бот замолкает на 30 минут, ты выходишь в нужном месте, а ничего не сделано. Поэтому в systemd-юните флаг ставится.

И сразу прилетает вторая грабля.

Пример: я написал боту «убери ненужные console.log из src/, у меня их там штук 200». Claude посмотрел, решил, что и большая часть моих debug-логов «не нужные», и удалил их вместе с консолями. 30 минут отладки в туалете спортзала на возврате через git checkout src/.

Что закрывает эту ловушку:

  • Хуки в ~/.claude/settings.json, блокирующие rm, git reset --hard, find -delete без подтверждения. Они срабатывают даже при --dangerously-skip-permissions - это разные слои.
  • Whitelist разрешённых команд через permissions.allow. По дефолту я разрешаю npm, pnpm, git status/add/commit, ls, cat, grep. Всё вне whitelist требует ручного «да» в Telegram.
  • git commit -am "wip" перед каждым уходом из проекта. В асинхронном режиме ты не видишь, что делает Claude, пока он не доделал; без коммита восстановление сложнее.

Принцип за неделю: --dangerously-skip-permissions ставится для асинхронности, ограничения переезжают на уровень настроек Claude Code и хуков. Если хуки молчат, Claude может удалить что угодно: «здравого смысла» о ценности debug-логов у него нет, есть только инструкция «убери console.log».

Я отдельно разобрал, как правильно собрать слой permissions + хуки для боевой сессии Claude Code - в инструкции настройка Claude Code permissions и хуков. Там пошагово - что блочить, что разрешать, как тестировать хуки до того, как они спасут тебе репозиторий.

Ловушка 3. Max 5x исчерпывается за 4-6 часов асинхронной сборки

Синхронная работа за ноутбуком устроена с естественным дозированием. Ты обдумываешь промпт - проходит 5 минут. Читаешь ответ Claude - ещё 3. Решаешь, что писать дальше, - ещё 2. За час ты делаешь штук 10 запросов, и Claude между ними отдыхает.

В асинхронном режиме через Channels между твоими сообщениями Claude не отдыхает. Он крутит длинные многошаговые задачи. Один запрос «допиши спецификацию API» легко превращается в 50+ вызовов инструментов, чтение 30 файлов и 200 000 токенов прочитанного контекста.

У меня лимит Max 5x ($100/мес) выгорал за 4-6 часов утренней сборки: в среднем 800K-1.2M прочитанных токенов и 60-80 вызовов инструментов за это окно. Понимание приходило к обеду: «как это закончилось, я только два сообщения боту написал?»

Что помогает:

  • /clear после каждой крупной задачи. Сессия не таскает старый контекст 200 файлов в каждый следующий запрос - это вторая частая причина выгорания после длинных tool-цепочек.
  • Telegram-сообщения «составь план, не выполняй». Claude думает 30 секунд, отдаёт план, ты решаешь, что запускать. Без 200K токенов на чтение.
  • Команда /cost в сессии. Сразу видно, сколько и куда ушло. Если 30% бюджета сожгла одна задача - вынеси её в /clear-блок.
  • Max 20x ($200) для тех, кто переехал на асинхронный режим. $200/мес покупается под мобильную сборку, который ест бюджет в 3-4 раза быстрее настольного. Если Pro 5x хватает - асинхронный режим у тебя пока эпизодический.

Я несколько недель просидел на Max 5x, не понимая, почему лимит ловит к 14:00. Переехал на Max 20x - за день в три раза больше задач закрыто, потому что считать токены в каждом промпте уже не приходится.

Ловушка 4. Соединение разрывается раз в 6-12 часов

Long-poll Telegram - HTTP-соединение с долгим, но конечным TTL. У меня типичный срок жизни получался 6-12 часов. Бот замолкает, я в спортзале пишу «как дела?» - тишина. Дома проверяю - процесс жив, plugin загружен, MCP-канал разорвался.

Чинится двумя слоями.

Слой 1. RuntimeMaxSec=86400 в systemd-юните. Сервис принудительно перезапускается раз в сутки. Restart=on-failure тут недостаточно: процесс жив, failure не триггерится. А long-poll-соединение давно сдохло, и сервис об этом не знает. RuntimeMaxSec - жёсткий таймер на kill+restart.

Слой 2. Cron от root. Утренний рестарт в дополнение:

0 5 * * * systemctl restart claude-code

В 5 утра МСК сервис ребутается, к моменту утреннего открытия Telegram - живой. Ловит 90% случаев. Опционально - уведомление в /cli-monitor (фоновый watcher из плагина), пишет в Telegram, если бот молчит больше 10 минут. Я держу - чтобы узнать про разрыв раньше, чем зайти с улицы.

Контр-интуитивный вывод: разрыв соединения - особенность long-poll Telegram. Лечится боковыми слоями (systemd + cron + watcher), не обновлением плагина. На research preview Anthropic авто-переподключение не выкатывает, и правильно делает: дешевле научить пользователей слою systemd, чем поддерживать reconnect-логику в роли transport-провайдера.

Ловушка 5. Channels - один из двух пультов. Когда нужен Remote Control

Anthropic вместе с Channels продвигают вторую функцию - Remote Control. Их часто путают в постах на vc.ru. Под разные сценарии нужны разные пульты.

Channels - асинхронный пульт. Пишешь команду в Telegram, Claude крутит 5-30 минут, отвечает результатом. Удобно для крупных рефакторингов, переписывания файлов, обзора PR, ночных миграций.

Remote Control - QR-привязка телефона к десктопной сессии. Открываешь Claude Code на телефоне, видишь живой терминал ноутбука, набираешь команды как в SSH. Удобно для синхронных правок «здесь и сейчас», когда нужно увидеть файлы и поправить две строки.

Я пользуюсь обоими, не смешиваю:

  • Channels - утром написал план дня боту, ушёл по делам, проверил вечером.
  • Remote Control - в спортзале посмотреть, что Claude натворил в реальном времени, дописать промпт.

Главное про Channels: на нём нельзя залипнуть в реальном времени над задачей в 10 файлов. Между вопросом и ответом пройдёт 30-90 секунд - успеешь забыть, о чём спрашивал. Если нужен синхрон - открываешь Remote Control и работаешь как из терминала.

Кстати, я отдельно разбирал Claude Code Remote Control на телефоне - там сравнительная таблица «когда что выбрать» и инструкция, как привязать iPhone к сессии за 5 минут. После недели с двумя пультами в кармане асинхронное программирование ощущается совсем иначе.

Выводы: 5 правил, которые я бы себе сразу сказал

  1. Allowlist - первая команда после привязки токена. Окно без него закрывается за минуты, заметить ты его не сможешь - бот молча принимает всех. У меня в неделю 7 чужих попыток, остановленных allowlist'ом. Если бы он не сработал - хотя бы один промпт-вандал из этих семи прошёл бы.
  2. --dangerously-skip-permissions ставится только с хуками-сторожами. Whitelist разрешённых команд и блок на rm, git reset --hard, find -delete через ~/.claude/settings.json - без них жди свой эпизод с debug-логами и git checkout-восстановлением в туалете спортзала.
  3. Асинхронное программирование ест Max 5x в 3-4 раза быстрее синхронного. Либо /clear после каждой крупной задачи, либо переезд на Max 20x. Промежуточные танцы с экономией контекста чаще раздражают, чем работают.
  4. Соединение разрывается. Готовь два слоя - systemd + cron, не надейся на «функция стабильна». Research preview не обещает авто-переподключение, и правильно не обещает.
  5. Channels и Remote Control - пара пультов под разные сценарии. Channels - на ходу, Remote Control - в реальном времени. Путать = бесить себя.

А вот ещё прогноз: через год асинхронное программирование «команда боту - результат через час» станет нормой работы, не экзотикой первых пользователей. Кто сейчас собрал на Channels рабочую сборку - привыкнет к новой дисциплине дозирования задач: формулировать сразу полные ТЗ, отдавать пакетами, проверять коммитами. Кто сидит синхронно за ноутбуком - будет переезжать постепенно, потому что Anthropic очевидно движется в эту сторону. Channels - первая итерация, дальше будут iMessage-боты, Slack, свои транспорты. И где-то к концу 2027 сидеть с открытым ноутбуком и ждать ответа Claude - покажется такой же редкостью, как ждать загрузки страницы на 56k-модеме.

Вы где? Уже на асинхронной сборке с Channels или ещё держитесь за синхронные сессии «всё на одном экране»? Расскажите в комментах - особенно про свои ловушки на боевом сервере. Мои 5 - явно неполный список.