JavaRush /Курсы /Claude code /Claude Code в non-interact...

Claude Code в non-interactive mode

Claude code
21 уровень , 0 лекция
Открыта

1. Claude Code за пределами локальной сессии

Когда вы только начинаете работать с Claude Code, его очень легко зафиксировать в голове как «помощника в терминале»: дали задачу, получили diff, проверили тесты — готово. Но работа не кончается на «ну, кажется, готово». Изменение должно дожить до build, проверок, CI, иногда до release pipeline. Здесь Claude участвует уже не в написании кода, а в доставке результата.

Важно только не переоценить его роль. В delivery loop он не автопилот, который сам рулит merge, release и тем более production. Его роль прозаичнее и потому ценнее: он силён там, где сырой материал — diff, лог, changelog, список файлов — надо быстро превратить в проверяемый артефакт. Именно поэтому на этом уровне мы перестаём воспринимать его только как собеседника. Дальше он для меня рабочее звено software delivery loop. Не хозяин, не судья, не человек-оркестр. Получил вход, выполнил ограниченную задачу, вернул результат, уступил место проверке.

2. Три точки участия Claude в delivery workflow

Чтобы не смешивать всё в одну кашу, полезно сразу увидеть карту местности. В delivery loop у Claude три точки участия: разные по контексту, риску и по тому, кто после него решает. Если эту карту не зафиксировать в голове, очень быстро возникает соблазн лепить один подход везде, а потом удивляться, почему удобное локально в CI стало опасным.

Точка участия Что Claude может делать Что Claude не должен делать
Локально анализировать diff, помогать с диагностикой, готовить черновик описания изменений, подсказывать команды проверки принимать решение о merge, менять проект без понятных границ, работать с широкими правами «на всякий случай»
В CI разбирать логи падения, суммировать результаты job, формировать структурированный отчёт для человека или системы «магически чинить pipeline», запускать рискованные действия без review, обходить проверки
В release pipeline готовить draft release notes, сводку изменений, черновик документации, сводный diff между версиями деплоить в production, выполнять destructive ops, работать с секретами без строгих границ

На примере Commerce OS это выглядит совсем приземлённо. Локально Claude соберёт описание текущего diff после фикса бага в сортировке refund-запросов. В CI получит build.log или test.log и вернёт короткую классификацию причины падения. В release pipeline соберёт черновик release notes по изменениям, уже прошедшим проверки. Полезен везде — владельцем финального решения нигде.

Если хочется запомнить это одной фразой, то вот она: локально Claude помогает думать быстрее, в CI — видеть яснее, в release — оформлять понятнее. А ответственность всё равно остаётся у человека и детерминированных проверок.

3. Non-interactive mode и обычная сессия

Здесь обычно возникает главный вопрос лекции: а что вообще имеется в виду под non-interactive mode? Это тот же Claude Code, но запущенный не как длительная интерактивная сессия с диалогом, а как ограниченный одноразовый прогон из скрипта, терминальной команды или CI job. Вход, выход, рамки — и после завершения он не живёт своей жизнью, как бесконечный чат обо всём.

Полезно увидеть разницу в лоб:

Признак Интерактивная сессия Non-interactive run
Контекст растёт по мере диалога задаётся явно на входе
Память между шагами есть внутри сессии нет, каждый запуск отдельный
Формат работы explorediscussadjust inputrunoutput
Лучший сценарий исследование, планирование, неоднозначная задача узкая повторяемая операция
Тип результата разговор + возможные правки файл, JSON, markdown, короткая сводка
Кто проверяет человек по ходу диалога человек или CI после завершения

Новичков это поначалу часто раздражает: кажется, будто Claude «ничего не помнит». Но в delivery workflow забывчивость — преимущество. Запуск воспроизводим: вы знаете вход и ожидаемый выход и повторяете позже. Не разговор у доски, а лабораторная работа: положили образец, получили измерение, записали результат.

Часто для такого режима используют команду вроде claude -p, но здесь важно сохранить устойчивое к смене версий мышление курса: синтаксис, флаги и набор опций меняются, важнее понять модель, а не заучить форму. Если вам нужны один запуск, узкие права, явный выходной артефакт и нулевая романтика — это non-interactive mode.

4. Паттерн bounded run: сердце всей схемы

Теперь давайте зафиксируем главный паттерн этой лекции. Звучит он так: input → bounded Claude run → structured output → human or CI review. На бумаге почти скучно — и эта скука делает систему надёжной. Чем меньше у запуска скрытых допущений, лишних инструментов и туманного «ну он как-нибудь разберётся», тем легче его повторить, проверить и встроить.

Вот схема в самом компактном виде:

flowchart TD
    A[Входные данные
diff, log, changelog] --> B[Ограниченный запуск Claude] B --> C[Структурированный результат
markdown, JSON, summary] C --> D[Проверка человеком или CI]

Чтобы bounded run действительно был bounded, у него должен быть очень конкретный контракт. Не философия, не «пожелания», а именно контракт.

Часть контракта Вопрос, на который она отвечает Пример для Commerce OS
Вход что именно подаём Claude git diff, build.log, список merged PR
Границы что ему разрешено использовать только чтение входных данных, иногда одна узкая команда
Ожидаемый выход в каком виде нужен результат 5 bullets, JSON с классификацией падения, краткая сводка
Точка проверки кто принимает результат разработчик локально или владелец job

Обратите внимание на важную деталь: хороший bounded run возвращает структурированный результат, а не поток сознания на полстраницы. Читает человек — короткий markdown со списком изменений. Нужно в pipeline — JSON с фиксированными полями. «Кажется, проблема где-то в окружении» годится за кофе, но бесполезно для CI. А {"тип_падения":"environment","вероятная_причина":"не совпадает версия Java"} уже предметно.

Такой контракт удобно фиксировать даже внутри EVIDENCE_LOG.md — не ради бюрократии, а чтобы спустя два дня не вспоминать, что вы давали на вход и почему получили именно это. Плохая память — обычное человеческое качество. Хороший артефакт — инженерное решение.

5. Узкие permissions для scripted Claude

Здесь легко попасть в ловушку. Раз запуск неинтерактивный, кажется, что ради удобства можно дать прав побольше: пусть и diff посмотрит, и файл поправит, и тесты запустит, и на всякий случай всё сам починит. Проблема в том, что scripted run почти всегда живёт без вас рядом. Значит, его границы должны быть уже, чем у интерактивной сессии, а не шире.

Если интерактивная сессия похожа на поход с рюкзаком, где вы идёте рядом и в любой момент можете остановиться, то non-interactive run — это ручная кладь в аэропорту. Ничего лишнего. Всё предсказуемо. Никаких сюрпризов на досмотре. Метафора нервная, но delivery loop и не славится расслабляющей атмосферой.

На permissions полезно смотреть так:

Соблазн Почему это плохая идея Более безопасный вариант
дать полный доступ к Bash запуск сможет сделать слишком многое разрешить только конкретный источник входа или одну узкую команду
разрешить широкое редактирование можно получить неконтролируемый diff режим только чтения или вывод в отдельный файл
использовать обычные учётные данные разработчика риск утечки и лишнего доступа отдельные CI-секреты с минимальными правами
позволить внешние действия сразу после результата пропадает review boundary сначала structured output, потом проверка человеком

Самая важная мысль здесь проста: права подстраиваются не под мечту «пусть всё сделает сам», а под реальную задачу. Суммировать diff — редактирование не нужно. Классифицировать лог падения — секреты и сетевые интеграции не нужны. Собрать черновик release notes — про production знать незачем.

6. Один Claude на трёх этапах delivery

Давайте посмотрим на это не абстрактно, а на знакомом проекте. Представим Commerce OS, где вы уже локально исправили баг с неправильной сортировкой refund-запросов в inbox: issue, plan, небольшой diff, локальные тесты, проверка. На этом месте начинающий разработчик часто говорит: «Ну всё, код готов». Опытный спрашивает: «Как это изменение дойдёт до review, CI и релизной заметки?»

Локально вы делаете bounded run, который код не трогает: получает текущий diff и возвращает короткий черновик описания — готовое summary для review. Дальше код уходит в CI, и одна job падает — скажем, из-за расхождения окружения. Вместо ритуала «перезапустить и молиться» вы даёте Claude входной лог и просите классифицировать причину в фиксированном формате. По ней человек решает: code issue, dependency issue или environment drift. Прошло дальше — release pipeline пускает ещё один bounded run для черновика заметки: какие изменения попали, какие риски закрыты, что упомянуть в документации.

Заметьте: во всех трёх случаях Claude один и тот же. Меняются вход, границы и ожидаемый выход. Отсюда взрослая мысль: delivery automation редко выигрывает от «суперумного универсального агента» и почти всегда — от повторяемых узких сценариев. Поэтому Workflow Kit тут кстати: в нём удобно фиксировать такие шаблоны как переиспользуемые практики команды, а не вспоминать их каждый раз с нуля.

Вот как может выглядеть структурированный результат для CI-анализа лога:

{
  "тип_падения": "environment",
  "вероятная_причина": "в CI используется другая версия Java",
  "проверить": ["./gradlew --version", "java -version"],
  "следующий_шаг": "сверить runner и локальное окружение"
}

Это ещё не исправление. И в этом его сила. Сначала ясность, потом действие.

7. Маленькие примеры non-interactive запуска

Теория хороша ровно до того момента, пока не захочется увидеть всё руками. На вечный синтаксис примеры не претендуют, поэтому держим в голове правило курса: точные флаги и доступные опции проверяйте через claude --help. Важен паттерн, не заклинание.

Первый пример — локальный черновик summary по текущему diff. Это типичный сценарий: Claude оформляет уже сделанное изменение, а не пишет код вместо вас.

claude -p "Кратко опиши текущий diff в 5 пунктах для review." \
  --allowed-tools "Bash(git diff:*)" \
  > tmp/pr-summary.md

cat tmp/pr-summary.md
# - Исправлена сортировка refund-запросов
# - Добавлен regression test для inbox
# - Поведение вне refund-сценария не изменено

Второй пример — анализ build.log без редактирования проекта. Здесь удобно подавать лог как вход и ждать структурированный результат.

cat build.log | claude -p \
  "Классифицируй причину падения и верни JSON с полями тип_падения, вероятная_причина, следующий_шаг." \
  > tmp/ci-failure.json

cat tmp/ci-failure.json
# {"тип_падения":"dependency","вероятная_причина":"lockfile устарел","следующий_шаг":"обновить зависимости и повторить job"}

Третий пример — как это можно зафиксировать в EVIDENCE_LOG.md, чтобы запуск не превратился в «мы что-то там делали, кажется, в четверг».

## delivery-run
- цель: черновик summary по diff
- вход: `git diff HEAD~1..HEAD`
- режим: non-interactive, read-only
- выход: `tmp/pr-summary.md`
- проверка: разработчик читает diff и правит summary вручную

Такие кусочки хороши тем, что они маленькие, проверяемые и не требуют веры в магию. А если automation где-то пойдёт не туда, останется понятный след: какой был вход, какой ждали выход, где review-точка.

8. Границы применимости non-interactive

Очень важно не влюбиться в новый инструмент настолько, чтобы начать использовать его везде. Non-interactive mode отличный, но не универсальный: хорош, где задача узкая, повторяемая и с понятной формой результата. Проблема ещё туманная, нужна серия уточнений, исследование кода и обсуждение подходов — интерактивная сессия почти всегда честнее.

Вот хорошее практическое различие:

Лучше non-interactive Лучше интерактивная сессия
краткий summary diff исследование незнакомого модуля
классификация лога падения поиск root cause в нескольких слоях системы
draft release notes обсуждение архитектурного варианта
короткий markdown/JSON output неоднозначная задача с вопросами и уточнениями

Это различие спасает от одной очень распространённой ошибки: упаковать в scripted run задачу, которая ещё не до конца понятна. Тогда запуск возвращает банальности или гадает, а вы злитесь на «бесполезный ИИ». На самом деле проблема не в Claude, а в режиме.

Поэтому рабочая модель на сегодня такая. Чёткий вход, узкая цель, понятный формат выхода и ясная review-точка — non-interactive run к месту. Задача пока похожа на разговор, а не на процедуру — оставайтесь в интерактивной сессии. Из этой дисциплины и вырастают хорошая диагностика окружения, понятные CI-сценарии и build automation, которым можно доверять не на вере, а на воспроизводимом инженерном процессе.

1
Задача
Claude code, 21 уровень, 0 лекция
Недоступна
Bounded non-interactive запуск по diff-файлу
Bounded non-interactive запуск по diff-файлу
1
Задача
Claude code, 21 уровень, 0 лекция
Недоступна
Скрипт локального PR-summary с явным входом и выходом
Скрипт локального PR-summary с явным входом и выходом
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ