# Автономный запуск с лимитами

Курс: Claude Code: уровень профи — https://zero2claude.ru/learn/claude-code-pro
Канонический URL: https://zero2claude.ru/learn/claude-code-pro/3-2-avtonomnyy-zapusk

Запуск без присмотра делает только то, что ты разрешил заранее. Поэтому разрешай мало, а остальное ограничивай — минимальные права, строгая песочница, лимиты ходов и бюджета, запрет коммитов и оценка цены на маленьком куске.

В прошлом уроке ты запустил Claude из скрипта. Теперь — запуск, который работает **без присмотра**, долго и с правками файлов. Главный принцип: такой прогон делает ровно то, что ты разрешил заранее. Значит, разрешай мало, а остальное ограничивай.

## Пять рамок

1. **Минимальные права.** Режим `dontAsk` отклоняет всё, что потребовало бы вопроса. Разреши только папки, которые задача правит, и одну команду, которую она запускает.
2. **Песочница.** Пусть система ограничивает, что могут разрешённые команды, — и пусть прогон не стартует, если песочница недоступна.
3. **Лимиты.** `--max-turns` ограничивает ходы, `--max-budget-usd` — примерную стоимость.
4. **Ворота проверки.** Запрети `git commit` и `git push`. Результат останется в рабочем дереве, а коммитишь ты — после того как прочитал дифф.
5. **Оценка цены.** Сначала прогони маленький кусок задачи и по нему поставь лимит бюджета.

## Файл рамок

Рамки удобно хранить в отдельном файле, например `.claude/bounded-run.json`:

```json
{
  "permissions": {
    "allow": ["Edit(./src/**)", "Edit(./test/**)", "Bash(npm test *)"],
    "deny": ["Agent", "Read(./.env)", "Read(./.env.*)", "Bash(git commit *)", "Bash(git push *)"]
  },
  "sandbox": {
    "enabled": true,
    "failIfUnavailable": true,
    "allowUnsandboxedCommands": false
  }
}
```

- `deny` на `Agent` не даёт Claude передать работу субагенту, у которого может оказаться свой режим разрешений;
- `failIfUnavailable` — не стартовать без песочницы;
- `allowUnsandboxedCommands: false` — не повторять команду вне песочницы.

## Запуск

```bash
claude -p "Добавь тест для одной непокрытой функции в src/links.js" \
  --setting-sources project \
  --settings .claude/bounded-run.json \
  --permission-mode dontAsk \
  --model sonnet \
  --max-turns 15 \
  --max-budget-usd 2 \
  --output-format json
```

`--setting-sources project` не подмешивает твои личные настройки — например, разрешение, сохранённое кнопкой «Да, и больше не спрашивать». В рамки попадает только то, что ты в них явно записал.

Когда лимит срабатывает, код выхода ненулевой, а в JSON `subtype` объясняет причину: `error_max_turns` или `error_max_budget_usd`. Поле `total_cost_usd` — оценка на стороне клиента, а не твой счёт.

## Ты — ворота проверки

После прогона прочитай `git status` и `git diff`, включая сам файл рамок, сам запусти тесты и закоммить только то, что принимаешь. Для второго мнения попроси свежую сессию Claude проверить дифф в чистом контексте.

**Осторожно.** 
Защищённая папка .claude/ в режиме dontAsk недоступна для записи инструментами Claude — он не сможет ослабить собственные рамки. Но сам файл рамок ты пишешь руками: прочитай его после каждой правки так же внимательно, как код. Одна лишняя звёздочка в allow открывает больше, чем кажется.
