> ## Documentation Index
> Fetch the complete documentation index at: https://docs.befailproof.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Пользовательские политики

> Напишите политику для режима отказа, уникального для вашего рабочего процесса агента.

Создайте файл с расширением `policies.js`, `policies.mjs` или `policies.ts` в папке `.failproofai/policies/`. Файлы соглашений загружаются автоматически на уровне проекта и пользователя.

## Протестируйте политику перед публикацией в облако

<Tabs>
  <Tab title="Dashboard">
    1. Установите пользовательскую политику на одном тестовом компьютере и запустите как соответствующее действие, так и легитимное несовпадение.
    2. Перейдите в **Observe → policy** и сравните два решения.
    3. Откройте каждый связанный сеанс и убедитесь, что полезная нагрузка события содержит достаточно доказательств для правила.
    4. Когда поведение будет правильным, переместите проверенный исходный код в **Admin → policy editor** и опубликуйте версию.
  </Tab>

  <Tab title="CLI">
    ```bash theme={null}
    failproofai policies --install --custom ./security.policies.ts \
      --cli claude --scope project
    failproofai policies
    ```

    Файлы соглашений в `.failproofai/policies/` загружаются без `--custom`. Сохраняйте явную команду установки в CI, когда валидация должна завершиться ошибкой при нарушении модуля.
  </Tab>
</Tabs>

```ts theme={null}
import { customPolicies, allow, deny } from "failproofai";

customPolicies.add({
  name: "protect-production-paths",
  description: "Block writes to production configuration",
  match: { events: ["PreToolUse"] },
  fn: async (ctx) => {
    if (ctx.toolName !== "Write" && ctx.toolName !== "Edit") return allow();
    const path = String(ctx.toolInput?.file_path ?? "").replaceAll("\\", "/");
    if (path.split("/").includes("production")) {
      return deny("Writes to production configuration require approval.");
    }
    return allow();
  },
});
```

Это совпадает с `production/config.yml`, `/srv/production/config.yml`, `/srv/production` и `C:\\production\\config.yml` для `Write` и `Edit`. Не совпадает с названиями вроде `production-backup`, так как `production` должно быть полным сегментом пути.

Проверьте и установите явный файл:

```bash theme={null}
failproofai policies --install --custom ./security.policies.ts
```

Контекст политики включает тип события, нормализованную полезную нагрузку, имя и вход инструмента, метаданные сеанса, параметры и исходный CLI, если доступен.

## Протестируйте пути отказа

Запустите валидацию после изменения файла входа или любого локального модуля, который он импортирует:

```bash theme={null}
failproofai policies --install --custom ./security.policies.ts --scope project
```

Строгий путь CLI завершается ошибкой при отсутствии файлов, синтаксических ошибках, неразрешённых импортах, исключениях верхнего уровня и превышении времени загрузки модуля. Во время принудительного применения сломанный пользовательский файл регистрируется и пропускается, так что встроенные политики могут продолжить работу. Рассматривайте любое предупреждение загрузки как потерю ожидаемого принудительного применения и создавайте оповещение о нём в журналах производства.

Используйте глобально уникальные имена во всех явных, соглашение и управляемых облаком политиках. Держите функции политик детерминированными, привязывайте внешние вызовы к коротким тайм-аутам и возвращайте намеренный `allow`, `instruct` или `deny` на каждом пути.

<Warning>
  Пользовательская политика — это код принудительного применения. Тестируйте отсутствующие поля, альтернативные имена инструментов и неправильно сформированный ввод — не только ожидаемое совпадение.
</Warning>
