> ## Documentation Index
> Fetch the complete documentation index at: https://exosphere-auto-translate-docs-20260624-1149.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Built in policies

title: Встроенные политики
description: "Все 39 встроенных политик, которые ловят распространённые сбои агентов"
icon: shield
------------

failproofai поставляется с 39 встроенными политиками, которые ловят распространённые сбои агентов. Каждая политика срабатывает на конкретный тип события hook и имя инструмента. Девятнадцать политик принимают параметры, позволяющие настраивать их поведение без написания кода. Пять политик workflow принудительно соблюдают конвейер commit → push → PR → CI перед остановкой Claude.

***

## Обзор

Политики сгруппированы по категориям:

| Категория                                         | Политики                                                                                                                                     | Тип hook    |
| ------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | ----------- |
| [Опасные команды](#опасные-команды)               | block-sudo, block-rm-rf, block-curl-pipe-sh, block-failproofai-commands                                                                      | PreToolUse  |
| [Команды инфраструктуры](#команды-инфраструктуры) | block-kubectl, block-terraform, block-aws-cli, block-gcloud, block-az-cli, block-helm, block-gh-pipeline                                     | PreToolUse  |
| [Секреты (санитайзеры)](#секреты-санитайзеры)     | sanitize-jwt, sanitize-api-keys, sanitize-connection-strings, sanitize-private-key-content, sanitize-bearer-tokens                           | PostToolUse |
| [Переменные окружения](#переменные-окружения)     | block-env-files, protect-env-vars                                                                                                            | PreToolUse  |
| [Доступ к файлам](#доступ-к-файлам)               | block-read-outside-cwd, block-secrets-write                                                                                                  | PreToolUse  |
| [Git](#git)                                       | block-push-master, block-work-on-main, block-force-push, warn-git-amend, warn-git-stash-drop, warn-all-files-staged                          | PreToolUse  |
| [База данных](#база-данных)                       | warn-destructive-sql, warn-schema-alteration                                                                                                 | PreToolUse  |
| [Предупреждения](#предупреждения)                 | warn-large-file-write, warn-package-publish, warn-background-process, warn-global-package-install                                            | PreToolUse  |
| [Менеджеры пакетов](#менеджеры-пакетов)           | prefer-package-manager                                                                                                                       | PreToolUse  |
| [Workflow](#workflow)                             | require-commit-before-stop, require-push-before-stop, require-pr-before-stop, require-no-conflicts-before-stop, require-ci-green-before-stop | Stop        |

* **`block-`** — остановить выполнение агентом операции.
* **`warn-`** — дать агенту дополнительный контекст, чтобы он мог самокорректироваться.
* **`sanitize-`** — удалить чувствительные данные из вывода инструмента перед тем, как агент их увидит.

### Пространства имён

Каждая политика находится в слоте `<namespace>/<name>`. Встроенные политики принадлежат пространству имён **`failproofai/`** — например, `failproofai/sanitize-jwt`. Пространство имён предотвращает коллизии, когда вы также загружаете пользовательские или сторонние политики с похожими короткими именами.

В вашей конфигурации вы можете ссылаться на встроенную политику как по её короткому имени, так и по полному имени; обе формы разрешаются в одну и ту же политику:

```json theme={null}
{
  "enabledPolicies": [
    "sanitize-jwt",
    "failproofai/block-rm-rf"
  ]
}
```

Если имя не содержит `/`, failproofai обрабатывает его как принадлежащее пространству имён по умолчанию `failproofai`. Имена, которые уже содержат `/` (например `myorg/foo`, `custom/my-hook`), сохраняются как есть.

* **`require-`** — заблокировать событие Stop до выполнения условий.

***

<Tip>
  Каждая политика поддерживает дополнительное поле `hint` в `policyParams`. Подсказка добавляется к сообщению deny или instruct, которое видит Claude, обеспечивая действенное руководство без изменения кода политики. Работает со встроенными, пользовательскими и convention политиками. Подробнее в [Configuration → hint](/ru/configuration#hint-cross-cutting).
</Tip>

***

## Опасные команды

Предотвратить выполнение агентом операций, которые сложно отменить или которые могут повредить хост-систему.

### `block-sudo`

**Событие:** PreToolUse (Bash)\
**По умолчанию:** Блокирует любую команду `sudo`.

Блокирует вызовы, содержащие ключевое слово `sudo`. Сопоставление шаблонов выполняется на разобранных токенах команды, а не на исходной строке, чтобы предотвратить обход через инъекцию операторов shell.

**Параметры:**

| Параметр        | Тип        | По умолчанию | Описание                                                                                              |
| --------------- | ---------- | ------------ | ----------------------------------------------------------------------------------------------------- |
| `allowPatterns` | `string[]` | `[]`         | Точные префиксы команд, которые разрешены. Каждая запись сопоставляется с разобранными токенами argv. |

**Пример:**

```json theme={null}
{
  "policyParams": {
    "block-sudo": {
      "allowPatterns": ["sudo systemctl status", "sudo journalctl"]
    }
  }
}
```

С этой конфигурацией `sudo systemctl status nginx` разрешена, но `sudo rm /etc/hosts` заблокирована.

<Note>
  Шаблоны сопоставляются с разобранными токенами, а не с исходной командной строкой. Это предотвращает обход через приложенные операторы shell (например `sudo systemctl status x; rm -rf /` не соответствует `sudo systemctl status *`).
</Note>

***

### `block-rm-rf`

**Событие:** PreToolUse (Bash)\
**По умолчанию:** Блокирует `rm -rf`, `rm -fr` и похожие формы рекурсивного удаления.

**Параметры:**

| Параметр     | Тип        | По умолчанию | Описание                                                      |
| ------------ | ---------- | ------------ | ------------------------------------------------------------- |
| `allowPaths` | `string[]` | `[]`         | Пути, которые безопасно рекурсивно удалять (например `/tmp`). |

**Пример:**

```json theme={null}
{
  "policyParams": {
    "block-rm-rf": {
      "allowPaths": ["/tmp", "/var/cache"]
    }
  }
}
```

***

### `block-curl-pipe-sh`

**Событие:** PreToolUse (Bash)\
**По умолчанию:** Блокирует `curl <url> | bash`, `curl <url> | sh`, `wget <url> | bash` и похожие шаблоны.

Нет параметров.

***

### `block-failproofai-commands`

**Событие:** PreToolUse (Bash)\
**По умолчанию:** Блокирует команды, которые бы удалили или отключили сам failproofai (например `npm uninstall failproofai`, `failproofai policies --uninstall`).

Нет параметров.

***

## Команды инфраструктуры

Остановить agent-ы кодирования от запуска CLI инфраструктуры или срабатывания CI/CD pipeline-ов. Все политики в этой категории **opt-in** (`defaultEnabled: false`) — агенты, которым легитимно нужно вызывать `kubectl`, `terraform` и т.д., не будут нарушены, если вы не включите политику. При включении каждый вызов сопоставленного CLI блокируется, если только команда не совпадает с записью в `allowPatterns`.

Грамматика шаблонов такая же, как в [`block-sudo`](#block-sudo): токены сопоставляются с разобранными argv, `*` является подстановочным символом для одного токена, и любая команда, содержащая отдельный оператор shell (`&&`, `||`, `|`, `;`) или токен с встроенными метасимволами shell, отклоняется до сопоставления списка разрешений, чтобы предотвратить обход через инъекцию.

### `block-kubectl`

**Событие:** PreToolUse (Bash)\
**По умолчанию:** Блокирует любой вызов `kubectl`.

**Параметры:**

| Параметр        | Тип        | По умолчанию | Описание                                    |
| --------------- | ---------- | ------------ | ------------------------------------------- |
| `allowPatterns` | `string[]` | `[]`         | Префиксы команд kubectl, которые разрешены. |

**Пример:**

```json theme={null}
{
  "policyParams": {
    "block-kubectl": {
      "allowPatterns": ["kubectl get *", "kubectl describe *", "kubectl logs *"]
    }
  }
}
```

С этой конфигурацией `kubectl get pods` разрешена, но `kubectl apply -f deploy.yaml` заблокирована.

***

### `block-terraform`

**Событие:** PreToolUse (Bash)\
**По умолчанию:** Блокирует любой вызов `terraform` или `tofu` (OpenTofu).

**Параметры:**

| Параметр        | Тип        | По умолчанию | Описание                                           |
| --------------- | ---------- | ------------ | -------------------------------------------------- |
| `allowPatterns` | `string[]` | `[]`         | Префиксы команд terraform/tofu, которые разрешены. |

**Пример:**

```json theme={null}
{
  "policyParams": {
    "block-terraform": {
      "allowPatterns": ["terraform plan", "terraform validate", "terraform show *"]
    }
  }
}
```

***

### `block-aws-cli`

**Событие:** PreToolUse (Bash)\
**По умолчанию:** Блокирует любой вызов AWS CLI.

**Параметры:**

| Параметр        | Тип        | По умолчанию | Описание                                    |
| --------------- | ---------- | ------------ | ------------------------------------------- |
| `allowPatterns` | `string[]` | `[]`         | Префиксы команд AWS CLI, которые разрешены. |

**Пример:**

```json theme={null}
{
  "policyParams": {
    "block-aws-cli": {
      "allowPatterns": ["aws s3 ls *", "aws sts get-caller-identity"]
    }
  }
}
```

***

### `block-gcloud`

**Событие:** PreToolUse (Bash)\
**По умолчанию:** Блокирует любой вызов `gcloud` (Google Cloud) CLI.

**Параметры:**

| Параметр        | Тип        | По умолчанию | Описание                                   |
| --------------- | ---------- | ------------ | ------------------------------------------ |
| `allowPatterns` | `string[]` | `[]`         | Префиксы команд gcloud, которые разрешены. |

**Пример:**

```json theme={null}
{
  "policyParams": {
    "block-gcloud": {
      "allowPatterns": ["gcloud auth list", "gcloud config list"]
    }
  }
}
```

***

### `block-az-cli`

**Событие:** PreToolUse (Bash)\
**По умолчанию:** Блокирует любой вызов Azure CLI.

**Параметры:**

| Параметр        | Тип        | По умолчанию | Описание                                      |
| --------------- | ---------- | ------------ | --------------------------------------------- |
| `allowPatterns` | `string[]` | `[]`         | Префиксы команд Azure CLI, которые разрешены. |

**Пример:**

```json theme={null}
{
  "policyParams": {
    "block-az-cli": {
      "allowPatterns": ["az account show", "az group list"]
    }
  }
}
```

***

### `block-helm`

**Событие:** PreToolUse (Bash)\
**По умолчанию:** Блокирует любой вызов `helm`.

**Параметры:**

| Параметр        | Тип        | По умолчанию | Описание                                 |
| --------------- | ---------- | ------------ | ---------------------------------------- |
| `allowPatterns` | `string[]` | `[]`         | Префиксы команд helm, которые разрешены. |

**Пример:**

```json theme={null}
{
  "policyParams": {
    "block-helm": {
      "allowPatterns": ["helm list", "helm status *"]
    }
  }
}
```

***

### `block-gh-pipeline`

**Событие:** PreToolUse (Bash)\
**По умолчанию:** Блокирует следующие подкоманды `gh` CLI, которые изменяют состояние или запускают pipeline-ы:

* `gh workflow run`, `gh workflow enable`, `gh workflow disable`
* `gh run rerun`, `gh run cancel`
* `gh pr merge`
* `gh release create`, `gh release delete`
* `gh cache delete`
* `gh secret set`, `gh secret delete`

Только для чтения подкоманды `gh`, такие как `gh pr view`, `gh pr list`, `gh run list`, `gh release view` и `gh api repos/.../...` **не** соответствуют этой политике — они регулярно нужны для проверок workflow (включая собственный `require-ci-green-before-stop` failproofai).

**Параметры:**

| Параметр        | Тип        | По умолчанию | Описание                                                                                                      |
| --------------- | ---------- | ------------ | ------------------------------------------------------------------------------------------------------------- |
| `allowPatterns` | `string[]` | `[]`         | Конкретные сценариальные вызовы, которые нужно разрешить, несмотря на то что они иначе были бы заблокированы. |

**Пример:**

```json theme={null}
{
  "policyParams": {
    "block-gh-pipeline": {
      "allowPatterns": ["gh run rerun *"]
    }
  }
}
```

***

## Секреты (санитайзеры)

Остановить агентов от утечки учётных данных в их контекст или вывод. Политики-санитайзеры срабатывают на событиях **PostToolUse**. Когда Claude запускает команду Bash, читает файл или вызывает любой инструмент, эти политики проверяют вывод перед его возвратом Claude. Если обнаружен паттерн секрета, политика возвращает решение deny, которое предотвращает передачу вывода обратно.

### `sanitize-jwt`

**Событие:** PostToolUse (все инструменты)\
**По умолчанию:** Скрывает JWT токены (три сегмента base64url, разделённые `.`).

Нет параметров.

***

### `sanitize-api-keys`

**Событие:** PostToolUse (все инструменты)\
**По умолчанию:** Скрывает распространённые форматы API ключей: Anthropic (`sk-ant-`), OpenAI (`sk-`), GitHub PAT (`ghp_`), AWS ключи доступа (`AKIA`), Stripe ключи (`sk_live_`, `sk_test_`) и Google API ключи (`AIza`).

**Параметры:**

| Параметр             | Тип                                  | По умолчанию | Описание                                                               |
| -------------------- | ------------------------------------ | ------------ | ---------------------------------------------------------------------- |
| `additionalPatterns` | `{ regex: string; label: string }[]` | `[]`         | Дополнительные regex паттерны, которые нужно обрабатывать как секреты. |

**Пример:**

```json theme={null}
{
  "policyParams": {
    "sanitize-api-keys": {
      "additionalPatterns": [
        { "regex": "myco_[A-Za-z0-9]{32}", "label": "MyCo internal API key" },
        { "regex": "pat_[0-9a-f]{40}", "label": "Internal PAT" }
      ]
    }
  }
}
```

***

### `sanitize-connection-strings`

**Событие:** PostToolUse (все инструменты)\
**По умолчанию:** Скрывает строки подключения к БД, содержащие встроенные учётные данные (например `postgresql://user:password@host/db`).

Нет параметров.

***

### `sanitize-private-key-content`

**Событие:** PostToolUse (все инструменты)\
**По умолчанию:** Скрывает PEM блоки (`-----BEGIN PRIVATE KEY-----`, `-----BEGIN RSA PRIVATE KEY-----` и т.д.).

Нет параметров.

***

### `sanitize-bearer-tokens`

**Событие:** PostToolUse (все инструменты)\
**По умолчанию:** Скрывает `Authorization: Bearer <token>` заголовки, где токен составляет 20 или более символов.

Нет параметров.

***

## Переменные окружения

Защитить чувствительную конфигурацию окружения от чтения или раскрытия агентами.

### `block-env-files`

**Событие:** PreToolUse (Bash, Read)\
**По умолчанию:** Блокирует чтение файлов `.env` через `cat .env`, вызовы инструмента Read с `.env` как путём файла и т.д.

Не блокирует `.envrc` или другие файлы, связанные с окружением — только файлы названные ровно `.env`.

Нет параметров.

***

### `protect-env-vars`

**Событие:** PreToolUse (Bash)\
**По умолчанию:** Блокирует команды, которые выводят переменные окружения: `printenv`, `env`, `echo $VAR`.

Нет параметров.

***

## Доступ к файлам

Держать агентов в границах проекта и вдали от чувствительных файлов.

### `block-read-outside-cwd`

**Событие:** PreToolUse (Read, Bash)\
**По умолчанию:** Блокирует чтение файлов вне корня проекта. Граница — `CLAUDE_PROJECT_DIR` (устанавливается один раз за сеанс Claude Code), с fallback на текущую рабочую директорию сеанса, если эта переменная не установлена. Использование корня проекта вместо live `cwd` означает, что граница остаётся стабильной даже после того, как Claude перейдёт в подпапку.

**Параметры:**

| Параметр     | Тип        | По умолчанию | Описание                                                                  |
| ------------ | ---------- | ------------ | ------------------------------------------------------------------------- |
| `allowPaths` | `string[]` | `[]`         | Абсолютные префиксы путей, которые разрешены даже если вне корня проекта. |

**Пример:**

```json theme={null}
{
  "policyParams": {
    "block-read-outside-cwd": {
      "allowPaths": ["/shared/data", "/opt/company/config"]
    }
  }
}
```

***

### `block-secrets-write`

**Событие:** PreToolUse (Write, Edit)\
**По умолчанию:** Блокирует запись в файлы, обычно используемые для приватных ключей и сертификатов: `id_rsa`, `id_ed25519`, `*.key`, `*.pem`, `*.p12`, `*.pfx`.

**Параметры:**

| Параметр             | Тип        | По умолчанию | Описание                                                         |
| -------------------- | ---------- | ------------ | ---------------------------------------------------------------- |
| `additionalPatterns` | `string[]` | `[]`         | Дополнительные паттерны имён файлов (glob-стиль) для блокировки. |

**Пример:**

```json theme={null}
{
  "policyParams": {
    "block-secrets-write": {
      "additionalPatterns": [".token", ".secret"]
    }
  }
}
```

***

## Git

Предотвратить случайные push-и, force-push-и и ошибки веток, которые сложно отменить.

### `block-push-master`

**Событие:** PreToolUse (Bash)\
**По умолчанию:** Блокирует `git push origin main` и `git push origin master`.

**Параметры:**

| Параметр            | Тип        | По умолчанию         | Описание                                         |
| ------------------- | ---------- | -------------------- | ------------------------------------------------ |
| `protectedBranches` | `string[]` | `["main", "master"]` | Имена веток, в которые нельзя напрямую push-ить. |

**Пример:**

```json theme={null}
{
  "policyParams": {
    "block-push-master": {
      "protectedBranches": ["main", "master", "release", "prod"]
    }
  }
}
```

<Tip>
  Чтобы разрешить push-ить во все ветки (эффективно отключить эту политику без удаления её из `enabledPolicies`), установите `protectedBranches: []`.
</Tip>

***

### `block-work-on-main`

**Событие:** PreToolUse (Bash)\
**По умолчанию:** Блокирует `git commit`, `git merge`, `git rebase` и `git cherry-pick` пока рабочее дерево находится на `main` или `master`. Создание и переключение веток (`git checkout`, `git checkout -b`, `git switch`, `git switch -c`) не затронуты.

**Параметры:**

| Параметр            | Тип        | По умолчанию         | Описание                                                               |
| ------------------- | ---------- | -------------------- | ---------------------------------------------------------------------- |
| `protectedBranches` | `string[]` | `["main", "master"]` | Имена веток, на которых commit/merge/rebase/cherry-pick заблокированы. |

***

### `block-force-push`

**Событие:** PreToolUse (Bash)\
**По умолчанию:** Блокирует `git push --force` и `git push -f`.

Нет политико-специфичных параметров. Используйте cross-cutting [`hint`](/ru/configuration#hint-cross-cutting) для предложения альтернатив:

```json theme={null}
{
  "policyParams": {
    "block-force-push": {
      "hint": "Create a new branch from your current HEAD (e.g. `git checkout -b <new-branch>`) and push that instead."
    }
  }
}
```

***

### `warn-git-amend`

**Событие:** PreToolUse (Bash)\
**По умолчанию:** Инструктирует Claude действовать осторожно при запуске `git commit --amend`. Команда не блокируется.

Нет параметров.

***

### `warn-git-stash-drop`

**Событие:** PreToolUse (Bash)\
**По умолчанию:** Инструктирует Claude подтвердить перед запуском `git stash drop`. Команда не блокируется.

Нет параметров.

***

### `warn-all-files-staged`

**Событие:** PreToolUse (Bash)\
**По умолчанию:** Инструктирует Claude просмотреть то, что оно ставит на сцену, при запуске `git add -A` или `git add .`. Команда не блокируется.

Нет параметров.

***

## База данных

Поймать деструктивные SQL операции перед их выполнением на вашей БД.

### `warn-destructive-sql`

**Событие:** PreToolUse (Bash)\
**По умолчанию:** Инструктирует Claude подтвердить перед запуском SQL, содержащего `DROP TABLE`, `DROP DATABASE` или `DELETE` без предложения `WHERE`.

Нет параметров.

***

### `warn-schema-alteration`

**Событие:** PreToolUse (Bash)\
**По умолчанию:** Инструктирует Claude подтвердить перед запуском `ALTER TABLE` операторов.

Нет параметров.

***

## Предупреждения

Дать агентам дополнительный контекст перед потенциально рискованными, но не деструктивными операциями.

### `warn-large-file-write`

**Событие:** PreToolUse (Write)\
**По умолчанию:** Инструктирует Claude подтвердить перед записью файлов больше 1024 КБ.

**Параметры:**

| Параметр      | Тип      | По умолчанию | Описание                                                                     |
| ------------- | -------- | ------------ | ---------------------------------------------------------------------------- |
| `thresholdKb` | `number` | `1024`       | Пороговый размер файла в килобайтах, выше которого выводится предупреждение. |

**Пример:**

```json theme={null}
{
  "policyParams": {
    "warn-large-file-write": {
      "thresholdKb": 256
    }
  }
}
```

<Note>
  Обработчик hook применяет лимит 1 МБ stdin для payload-ов. Чтобы протестировать эту политику с малым содержимым, установите `thresholdKb` значительно ниже 1024.
</Note>

***

### `warn-package-publish`

**Событие:** PreToolUse (Bash)\
**По умолчанию:** Инструктирует Claude подтвердить перед запуском `npm publish`.

Нет параметров.

***

### `warn-background-process`

**Событие:** PreToolUse (Bash)\
**По умолчанию:** Инструктирует Claude быть осторожным при запуске фоновых процессов через `nohup`, `&`, `disown` или `screen`.

Нет параметров.

***

### `warn-global-package-install`

**Событие:** PreToolUse (Bash)\
**По умолчанию:** Инструктирует Claude подтвердить перед запуском `npm install -g`, `yarn global add` или `pip install` без виртуального окружения.

Нет параметров.

***

## Менеджеры пакетов

Принудить агента использовать только разрешённые менеджеры пакетов.

### `prefer-package-manager`

**Событие:** PreToolUse (Bash)\
**По умолчанию:** Отключена. При включении блокирует любую команду менеджера пакетов не в списке `allowed` и говорит Claude переписать команду, используя разрешённый менеджер.

Обнаруживает: pip, pip3, python -m pip, npm, npx, yarn, pnpm, pnpx, bun, bunx, uv, poetry, pipenv, conda, cargo.

| Параметр  | Тип       | По умолчанию | Описание                                                                                                                                    |
| --------- | --------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------- |
| `allowed` | string\[] | `[]`         | Разрешённые имена менеджеров пакетов. Любой обнаруженный менеджер не в этом списке блокируется. Когда пусто, политика не оказывает эффекта. |
| `blocked` | string\[] | `[]`         | Дополнительные имена менеджеров для блокировки помимо встроенного списка (например `['pdm', 'pipx']`).                                      |

Встроенный список блокировки охватывает: pip, pip3, npm, npx, yarn, pnpm, pnpx, bun, bunx, uv, poetry, pipenv, conda, cargo. Используйте `blocked` для добавления менеджеров не в этом списке.

**Пример конфигурации:**

```json theme={null}
{
  "enabledPolicies": ["prefer-package-manager"],
  "policyParams": {
    "prefer-package-manager": {
      "allowed": ["uv", "bun"],
      "blocked": ["pdm", "pipx"]
    }
  }
}
```

С этой конфигурацией `pip install flask` и `pdm install flask` оба заблокированы с сообщением, говорящим Claude использовать `uv` или `bun` вместо этого. Команды типа `uv pip install flask` разрешены, потому что `uv` в списке разрешений и проверяется первым.

***

## Поведение AI

Обнаружить когда агенты зависают или ведут себя неожиданно.

### `warn-repeated-tool-calls`

**Событие:** PreToolUse (все инструменты)\
**По умолчанию:** Инструктирует Claude пересмотреть когда один и тот же инструмент вызывается 3+ раза с идентичными параметрами — частый признак того, что агент застрял в loop.

Нет параметров.

***

## Workflow

Принудить соблюдать дисциплинированный workflow конца сеанса. Эти политики срабатывают на событие **Stop** и блокируют агенту остановку до выполнения каждого условия. Они следуют естественной цепочке зависимостей: commit → push → PR → CI. Если политика блокирует, позднейшие политики в цепочке пропускаются (deny short-circuits).

Все политики workflow **fail-open**: если требуемый инструмент не доступен (например `gh` не установлен, нет git remote), политика разрешает с информационным сообщением, объясняющим, почему проверка была пропущена.

### Semantics Stop на CLI

Применение Stop немного отличается в семи поддерживаемых CLI, потому что каждый раскрывает разный contract хука «agent finished». **Результат** — одинаковый — агент не может остановиться пока gate workflow не пройден — но **механика** отличается. Таблица ниже резюмирует; только Pi имеет видимую для пользователя особенность, стоящую понимания перед включением политики `require-*-before-stop`.

| CLI                      | Когда gate срабатывает          | Что вы видите                                                                                                                                                                                                                                                                                                                                                                  |
| ------------------------ | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Claude Code              | Тот же loop агента, сразу же    | Claude продолжает работу — исправляет проблему, затем снова пытается закончить. Без видимых перерывов для вас.                                                                                                                                                                                                                                                                 |
| Codex                    | Тот же loop агента, сразу же    | Как Claude.                                                                                                                                                                                                                                                                                                                                                                    |
| GitHub Copilot CLI       | Тот же loop агента, сразу же    | Как Claude (использует `{decision:"block", reason}` retry канал Copilot — проверено эмпирически на Copilot CLI 1.0.41).                                                                                                                                                                                                                                                        |
| Cursor Agent             | Тот же loop агента, сразу же    | Как Claude (использует `{followup_message}` канал Cursor — capped на `loop_limit`, по умолчанию 5 retries).                                                                                                                                                                                                                                                                    |
| Gemini CLI               | Тот же loop агента, сразу же    | Как Claude (использует `{decision:"block", reason}` канал Gemini на `AfterAgent`).                                                                                                                                                                                                                                                                                             |
| OpenCode                 | Тот же loop агента, сразу же    | Как Claude (использует `client.session.prompt(...)` вызов SDK OpenCode маршрутизированный через `hookSpecificOutput.additionalContext`).                                                                                                                                                                                                                                       |
| **Pi (pi-coding-agent)** | **Следующий turn пользователя** | **Pi видимо останавливается** когда gate срабатывает — её loop агента выходит и вы возвращаетесь к prompt. Gate затем срабатывает в следующий раз, когда вы отправляете prompt: failproofai добавляет директиву `MANDATORY ACTION REQUIRED` к system prompt этого turn, инструктируя LLM завершить шаг workflow (commit, push и т.д.) перед тем как делать то, что вы просили. |

<Note>
  **Ограничение Pi.** `AgentEndEvent` Pi (аналог upstream `Stop` hook Claude) не имеет типа Result — к моменту его срабатывания loop агента Pi уже выхода. Pi не может быть принуждена к retry того же loop как Claude / Copilot / Cursor / Gemini / OpenCode могут. failproofai сдвигает gate на `before_agent_start` event Pi (который срабатывает после следующего пользовательского prompt), чтобы проверка workflow всё ещё применялась, только на следующем turn вместо текущего.

  **Что это означает на практике:**

  * После остановки Pi, причина deny захватывается в памяти, ключ по Pi session id. Очень следующий prompt, который вы отправляете в том же процессе Pi дренирует это: LLM видит директиву `MANDATORY ACTION REQUIRED` в верхней части своего system prompt, коммитит (или push-ит / открывает PR / ждёт CI), и только затем продолжает с вашим запросом. Захваченная причина deny — one-shot — один раз слита, gate очищен.
  * Gate ограничена lifetime процесса Pi. Если вы `Ctrl+C` Pi или выходите между turn-ами, в памяти entry dropped вместе с процессом и gate пропущена. Claude, Copilot, Cursor, Gemini и OpenCode имеют ту же граничную (kill агента и gate пропущена) — Pi только делает это более видимым, потому что агент видимо выходит перед тем как gate срабатывает.
  * Pending deny также очищена на `session_shutdown` по любой причине (`new` / `resume` / `fork` / `quit`), поэтому stale gate от приоров сеанса не может утечь в свежий сеанс, запущенный в том же процессе Pi.

  Если вам нужен Claude-стиль same-loop retry, запустите ваши `Stop` политики под любым из шести других поддерживаемых CLI. Мы отслеживаем Pi upstream для будущего типа Result на `AgentEndEvent`, который позволил бы нам закрыть этот gap.
</Note>

### `require-commit-before-stop`

**Событие:** Stop\
**По умолчанию:** Блокирует остановку когда есть неподтверждённые изменения (изменённые, staged или untracked файлы). Возвращает информационное сообщение когда рабочая директория чиста.

Нет параметров.

***

### `require-push-before-stop`

**Событие:** Stop\
**По умолчанию:** Блокирует остановку когда есть unpushed commits или когда текущая ветка не имеет удалённой tracking ветки. Предлагает `git push -u` создать tracking ветку если нужно. Fails open если нет настроенного remote.

**Параметры:**

| Параметр | Тип      | По умолчанию | Описание               |
| -------- | -------- | ------------ | ---------------------- |
| `remote` | `string` | `"origin"`   | Имя remote для push-а. |

**Пример:**

```json theme={null}
{
  "policyParams": {
    "require-push-before-stop": {
      "remote": "upstream"
    }
  }
}
```

***

### `require-pr-before-stop`

**Событие:** Stop\
**По умолчанию:** Блокирует остановку когда не существует pull request для текущей ветки, или когда существующий PR закрыт без merge. Инструктирует Claude создать PR с `gh pr create`. Когда PR **merged**, политика разрешает (работа доставлена) и сообщение намекает переключиться с ветки (`git checkout main && git pull`).

Нет параметров.

<Note>
  Эта политика требует [GitHub CLI](https://cli.github.com/) (`gh`) установленной и аутентифицированной.
  Запустите `gh auth login` с personal access token, который имеет `repo` scope для чтения pull requests. Если `gh` не установлена или не аутентифицирована, политика fails open и сообщает причину Claude.
</Note>

***

### `require-no-conflicts-before-stop`

**Событие:** Stop\
**По умолчанию:** Блокирует остановку когда текущая ветка не может cleanly merge в base ветку. Политика сначала подтверждает существует ли `OPEN` PR на GitHub для ветки — без одного, нет merge target для применения, поэтому вся политика short-circuits к allow. После подтверждения `OPEN` PR, два независимых probe запускаются:

1. **Локальный** — `git merge-tree --write-tree --name-only origin/<baseBranch> HEAD`. При конфликте сообщение deny называет конфликтующие файлы так Claude знает ровно что разрешать.
2. **GitHub** — переиспользует `gh pr view --json mergeable,state` результат уже загруженный в precheck. Ловит конфликты, которые stale локальный `origin/<baseBranch>` пропустил бы (например кто-то landed конфликтующий PR на `main` с последнего fetch). Результат `CONFLICTING` блокирует. Результат `UNKNOWN` также блокирует и инструктирует Claude ждать \~10 секунд и повторно проверить перед тем как снова пытаться остановиться — это предотвращает false negatives пока GitHub переcomputes.

Пропускает полностью (разрешает) когда: `gh` не установлена, нет PR для ветки, PR состояние не `OPEN` (например `MERGED`, `CLOSED`), или `gh pr view` возвращает распарсиваемый вывод. Также fails open когда `origin/<baseBranch>` пропущена локально или когда нет commits вперёд от base — те Layer 1 fall-throughs всё ещё консультируют cached PR mergeability перед разрешением.

**Параметры:**

| Параметр     | Тип      | По умолчанию | Описание                            |
| ------------ | -------- | ------------ | ----------------------------------- |
| `baseBranch` | `string` | `"main"`     | Base ветка для проверки конфликтов. |

<Note>
  GitHub CLI (`gh`) требуется для этой политики. Политика использует `gh pr view` для подтверждения
  существует ли `OPEN` PR перед запуском любого probe конфликтов — без `gh`, политика
  short-circuits к разрешению. Запустите `gh auth login` с personal access token, который имеет
  `repo` scope для чтения pull requests.
</Note>

***

### `require-ci-green-before-stop`

**Событие:** Stop\
**По умолчанию:** Блокирует остановку когда CI checks падают или всё ещё запускаются на текущей ветке. Проверяет GitHub Actions workflow runs и сторонние bot checks (например CodeRabbit, SonarCloud, Codecov). Обрабатывает `skipped`, `cancelled` и `neutral` выводы как non-failing (последний охватывает например Socket Security alerts на outside contributor PR, где app намеренно сообщает neutral вместо success/failure). Возвращает информационное сообщение когда все checks проходят.

Нет параметров.

<Note>
  Эта политика требует [GitHub CLI](https://cli.github.com/) (`gh`) установленной и аутентифицированной.
  Запустите `gh auth login` с personal access token, который имеет `repo` scope для чтения
  Actions workflow runs и Checks API. Если `gh` не установлена или не аутентифицирована, политика fails open и сообщает причину Claude.
</Note>

***

***

## Отключение отдельных политик

Удалить конкретную политику из `enabledPolicies` в вашей конфигурации, или переключить её в dashboard Policies tab.

```json theme={null}
{
  "enabledPolicies": [
    "block-rm-rf",
    "sanitize-api-keys"
  ]
}
```

Политики не listed в `enabledPolicies` не запускаются, даже если `policyParams` записи для них существуют.
