> ## 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.

# Built in policies

title: अंतर्निहित नीतियाँ
description: "39 अंतर्निहित नीतियाँ जो एजेंट की आम विफलताओं को पकड़ती हैं"
icon: shield
------------

failproofai के साथ 39 अंतर्निहित नीतियाँ आती हैं जो एजेंट की आम विफलताओं को पकड़ती हैं। प्रत्येक नीति एक विशिष्ट हुक ईवेंट प्रकार और उपकरण नाम पर सक्रिय होती है। उन्नीस नीतियाँ पैरामीटर स्वीकार करती हैं जो आपको कोड लिखे बिना उनके व्यवहार को ट्यून करने देती हैं। पाँच वर्कफ़्लो नीतियाँ Claude के रुकने से पहले एक commit → push → PR → CI पाइपलाइन को लागू करती हैं।

***

## अवलोकन

नीतियाँ श्रेणियों में विभाजित हैं:

| श्रेणी                                        | नीतियाँ                                                                                                                                      | हुक प्रकार  |
| --------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | ----------- |
| [खतरनाक आदेश](#खतरनाक-आदेश)                   | block-sudo, block-rm-rf, block-curl-pipe-sh, block-failproofai-commands                                                                      | PreToolUse  |
| [इनफ्रा आदेश](#infra-आदेश)                    | 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  |
| [वर्कफ़्लो](#वर्कफ़्लो)                       | 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`। नेमस्पेस तब collision को रोकता है जब आप कस्टम या तीसरे पक्ष की नीतियों को समान छोटे नामों के साथ भी लोड करते हैं।

आपके कॉन्फ़िग में आप अंतर्निहित को उसके छोटे नाम या योग्य नाम दोनों से संदर्भित कर सकते हैं; दोनों रूप एक ही नीति को resolve करते हैं:

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

यदि किसी नाम में कोई `/` नहीं है, failproofai इसे default नेमस्पेस `failproofai` के अंतर्गत मानता है। नाम जिनमें पहले से `/` है (जैसे `myorg/foo`, `custom/my-hook`) जैसे-जैसे रखे जाते हैं।

* **`require-`** — Stop ईवेंट को ब्लॉक करें जब तक शर्तें पूरी न हों।

***

<Tip>
  प्रत्येक नीति `policyParams` में एक वैकल्पिक `hint` फील्ड का समर्थन करती है। hint को deny या instruct message में जोड़ा जाता है जो Claude देखता है, नीति कोड को संशोधित किए बिना कार्रवाई योग्य मार्गदर्शन देते हुए। अंतर्निहित, कस्टम, और convention नीतियों के साथ काम करता है। विवरण के लिए [Configuration → hint](/hi/configuration#hint-cross-cutting) देखें।
</Tip>

***

## खतरनाक आदेश

एजेंटों को उन ऑपरेशन चलाने से रोकें जो को पूर्ववत करना कठिन हो या जो होस्ट सिस्टम को नुकसान पहुंचा सकते हैं।

### `block-sudo`

**ईवेंट:** PreToolUse (Bash)\
**डिफ़ॉल्ट:** कोई भी `sudo` कमांड deny करता है।

`sudo` कीवर्ड सहित invocations को ब्लॉक करता है। पैटर्न मिलान कच्ची स्ट्रिंग के बजाय parsed कमांड टोकन पर किया जाता है, shell operator injection के माध्यम से bypass को रोकने के लिए।

**पैरामीटर:**

| पैरामीटर        | प्रकार     | डिफ़ॉल्ट | विवरण                                                                                               |
| --------------- | ---------- | -------- | --------------------------------------------------------------------------------------------------- |
| `allowPatterns` | `string[]` | `[]`     | सटीक कमांड प्रीफ़िक्स जो अनुमत हैं। प्रत्येक entry को parsed argv tokens के विरुद्ध मिलाया जाता है। |

**उदाहरण:**

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

इस कॉन्फ़िग के साथ, `sudo systemctl status nginx` अनुमत है, लेकिन `sudo rm /etc/hosts` deny किया जाता है।

<Note>
  पैटर्न को कच्ची कमांड स्ट्रिंग के बजाय parsed tokens के विरुद्ध मिलाया जाता है। यह appended shell operators के माध्यम से bypass को रोकता है (उदाहरण के लिए `sudo systemctl status x; rm -rf /` `sudo systemctl status *` से match नहीं करता)।
</Note>

***

### `block-rm-rf`

**ईवेंट:** PreToolUse (Bash)\
**डिफ़ॉल्ट:** `rm -rf`, `rm -fr`, और समान recursive deletion रूपों को deny करता है।

**पैरामीटर:**

| पैरामीटर     | प्रकार     | डिफ़ॉल्ट | विवरण                                                                     |
| ------------ | ---------- | -------- | ------------------------------------------------------------------------- |
| `allowPaths` | `string[]` | `[]`     | पथ जो recursively delete करने के लिए सुरक्षित हैं (उदाहरण के लिए `/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`, और समान patterns को deny करता है।

कोई पैरामीटर नहीं।

***

### `block-failproofai-commands`

**ईवेंट:** PreToolUse (Bash)\
**डिफ़ॉल्ट:** उन कमांडों को deny करता है जो failproofai को स्वयं को uninstall या disable करने के लिए होंगे (उदाहरण के लिए `npm uninstall failproofai`, `failproofai policies --uninstall`)।

कोई पैरामीटर नहीं।

***

## infra आदेश

कोडिंग एजेंटों को infrastructure CLIs चलाने या CI/CD pipelines को trigger करने से रोकें। इस श्रेणी में सभी नीतियाँ **opt-in** हैं (`defaultEnabled: false`) — एजेंट जिन्हें वैध रूप से `kubectl`, `terraform`, आदि को कॉल करने की आवश्यकता है, जब तक आप नीति को enable नहीं करते, तब तक बाधित नहीं होंगे। जब enabled हो, तो matched CLI का हर invocation deny किया जाता है जब तक कमांड `allowPatterns` में एक entry से match न हो।

पैटर्न grammar [`block-sudo`](#block-sudo) के समान है: tokens को parsed argv के विरुद्ध मिलाया जाता है, `*` एक token के लिए wildcard है, और कोई भी कमांड जिसमें एक standalone shell operator (`&&`, `||`, `|`, `;`) या embedded shell metacharacters वाला token है, injection bypasses को रोकने के लिए allowlist matching से पहले reject किया जाता है।

### `block-kubectl`

**ईवेंट:** PreToolUse (Bash)\
**डिफ़ॉल्ट:** कोई भी `kubectl` invocation deny करता है।

**पैरामीटर:**

| पैरामीटर        | प्रकार     | डिफ़ॉल्ट | विवरण                                  |
| --------------- | ---------- | -------- | -------------------------------------- |
| `allowPatterns` | `string[]` | `[]`     | kubectl कमांड प्रीफ़िक्स जो अनुमत हैं। |

**उदाहरण:**

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

इस कॉन्फ़िग के साथ, `kubectl get pods` अनुमत है लेकिन `kubectl apply -f deploy.yaml` deny किया जाता है।

***

### `block-terraform`

**ईवेंट:** PreToolUse (Bash)\
**डिफ़ॉल्ट:** कोई भी `terraform` या `tofu` (OpenTofu) invocation deny करता है।

**पैरामीटर:**

| पैरामीटर        | प्रकार     | डिफ़ॉल्ट | विवरण                                         |
| --------------- | ---------- | -------- | --------------------------------------------- |
| `allowPatterns` | `string[]` | `[]`     | terraform/tofu कमांड प्रीफ़िक्स जो अनुमत हैं। |

**उदाहरण:**

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

***

### `block-aws-cli`

**ईवेंट:** PreToolUse (Bash)\
**डिफ़ॉल्ट:** कोई भी `aws` CLI invocation deny करता है।

**पैरामीटर:**

| पैरामीटर        | प्रकार     | डिफ़ॉल्ट | विवरण                                  |
| --------------- | ---------- | -------- | -------------------------------------- |
| `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 invocation deny करता है।

**पैरामीटर:**

| पैरामीटर        | प्रकार     | डिफ़ॉल्ट | विवरण                                 |
| --------------- | ---------- | -------- | ------------------------------------- |
| `allowPatterns` | `string[]` | `[]`     | gcloud कमांड प्रीफ़िक्स जो अनुमत हैं। |

**उदाहरण:**

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

***

### `block-az-cli`

**ईवेंट:** PreToolUse (Bash)\
**डिफ़ॉल्ट:** कोई भी `az` (Azure) CLI invocation deny करता है।

**पैरामीटर:**

| पैरामीटर        | प्रकार     | डिफ़ॉल्ट | विवरण                                 |
| --------------- | ---------- | -------- | ------------------------------------- |
| `allowPatterns` | `string[]` | `[]`     | az CLI कमांड प्रीफ़िक्स जो अनुमत हैं। |

**उदाहरण:**

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

***

### `block-helm`

**ईवेंट:** PreToolUse (Bash)\
**डिफ़ॉल्ट:** कोई भी `helm` invocation deny करता है।

**पैरामीटर:**

| पैरामीटर        | प्रकार     | डिफ़ॉल्ट | विवरण                               |
| --------------- | ---------- | -------- | ----------------------------------- |
| `allowPatterns` | `string[]` | `[]`     | helm कमांड प्रीफ़िक्स जो अनुमत हैं। |

**उदाहरण:**

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

***

### `block-gh-pipeline`

**ईवेंट:** PreToolUse (Bash)\
**डिफ़ॉल्ट:** निम्नलिखित `gh` CLI subcommands को deny करता है जो state को mutate करते हैं या pipelines को trigger करते हैं:

* `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`

Read-only `gh` subcommands जैसे `gh pr view`, `gh pr list`, `gh run list`, `gh release view`, और `gh api repos/.../...` इस नीति से match **नहीं** होते हैं — वे workflow checks के लिए नियमित रूप से आवश्यक हैं (failproofai का अपना `require-ci-green-before-stop` सहित)।

**पैरामीटर:**

| पैरामीटर        | प्रकार     | डिफ़ॉल्ट | विवरण                                                                                 |
| --------------- | ---------- | -------- | ------------------------------------------------------------------------------------- |
| `allowPatterns` | `string[]` | `[]`     | विशिष्ट scripted invocations जो allow करने के लिए हैं भले ही वे अन्यथा deny किए जाएँ। |

**उदाहरण:**

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

***

## गोपनीयता (सैनिटाइज़र)

एजेंटों को credentials को अपने context या output में leak करने से रोकें। Sanitizer नीतियाँ **PostToolUse** ईवेंट पर fire होती हैं। जब Claude Bash कमांड चलाता है, फाइल पढ़ता है, या कोई भी tool कॉल करता है, ये नीतियाँ आउटपुट को inspect करती हैं इससे पहले कि यह Claude को वापस दिया जाए। यदि एक secret pattern detect किया जाता है, तो नीति एक deny decision return करती है जो आउटपुट को वापस जाने से रोकता है।

### `sanitize-jwt`

**ईवेंट:** PostToolUse (सभी tools)\
**डिफ़ॉल्ट:** JWT tokens को redact करता है (तीन base64url segments `.` से separated)।

कोई पैरामीटर नहीं।

***

### `sanitize-api-keys`

**ईवेंट:** PostToolUse (सभी tools)\
**डिफ़ॉल्ट:** सामान्य API key formats को redact करता है: Anthropic (`sk-ant-`), OpenAI (`sk-`), GitHub PATs (`ghp_`), AWS access keys (`AKIA`), Stripe keys (`sk_live_`, `sk_test_`), और Google API keys (`AIza`)।

**पैरामीटर:**

| पैरामीटर             | प्रकार                               | डिफ़ॉल्ट | विवरण                                                     |
| -------------------- | ------------------------------------ | -------- | --------------------------------------------------------- |
| `additionalPatterns` | `{ regex: string; label: string }[]` | `[]`     | अतिरिक्त regex patterns जो secrets के रूप में treat करें। |

**उदाहरण:**

```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 (सभी tools)\
**डिफ़ॉल्ट:** डेटाबेस connection strings को redact करता है जिनमें embedded credentials हैं (उदाहरण के लिए `postgresql://user:password@host/db`)।

कोई पैरामीटर नहीं।

***

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

**ईवेंट:** PostToolUse (सभी tools)\
**डिफ़ॉल्ट:** PEM blocks को redact करता है (`-----BEGIN PRIVATE KEY-----`, `-----BEGIN RSA PRIVATE KEY-----`, आदि)।

कोई पैरामीटर नहीं।

***

### `sanitize-bearer-tokens`

**ईवेंट:** PostToolUse (सभी tools)\
**डिफ़ॉल्ट:** `Authorization: Bearer <token>` headers को redact करता है जहाँ token 20 या अधिक characters है।

कोई पैरामीटर नहीं।

***

## वातावरण

संवेदनशील environment configuration को एजेंटों द्वारा read या expose किए जाने से बचाएँ।

### `block-env-files`

**ईवेंट:** PreToolUse (Bash, Read)\
**डिफ़ॉल्ट:** `.env` files को `cat .env`, file path के रूप में `.env` के साथ `Read` tool calls आदि के माध्यम से पढ़ने को deny करता है।

`.envrc` या अन्य environment-adjacent files को नहीं रोकता — केवल exactly `.env` नाम वाली files को।

कोई पैरामीटर नहीं।

***

### `protect-env-vars`

**ईवेंट:** PreToolUse (Bash)\
**डिफ़ॉल्ट:** उन कमांडों को deny करता है जो environment variables को print करते हैं: `printenv`, `env`, `echo $VAR`।

कोई पैरामीटर नहीं।

***

## फाइल एक्सेस

एजेंटों को project boundaries के भीतर और sensitive files से दूर रखें।

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

**ईवेंट:** PreToolUse (Read, Bash)\
**डिफ़ॉल्ट:** project root के बाहर की files को पढ़ने को deny करता है। boundary `CLAUDE_PROJECT_DIR` है (एक बार प्रति session Claude Code द्वारा set), जिसमें fallback होता है session के current working directory में जब यह variable unset हो। live `cwd` के बजाय project root का उपयोग करने का मतलब है कि boundary स्थिर रहता है भले ही Claude subdirectory में `cd` कर जाए।

**पैरामीटर:**

| पैरामीटर     | प्रकार     | डिफ़ॉल्ट | विवरण                                                                |
| ------------ | ---------- | -------- | -------------------------------------------------------------------- |
| `allowPaths` | `string[]` | `[]`     | Absolute path prefixes जो अनुमत हैं भले ही project root के बाहर हों। |

**उदाहरण:**

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

***

### `block-secrets-write`

**ईवेंट:** PreToolUse (Write, Edit)\
**डिफ़ॉल्ट:** private keys और certificates के लिए आमतौर पर उपयोग की जाने वाली files को write करने को deny करता है: `id_rsa`, `id_ed25519`, `*.key`, `*.pem`, `*.p12`, `*.pfx`।

**पैरामीटर:**

| पैरामीटर             | प्रकार     | डिफ़ॉल्ट | विवरण                                                  |
| -------------------- | ---------- | -------- | ------------------------------------------------------ |
| `additionalPatterns` | `string[]` | `[]`     | अतिरिक्त filename patterns (glob-style) जो block करें। |

**उदाहरण:**

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

***

## Git

accidental pushes, force-pushes, और branch mistakes को रोकें जो undo करना कठिन हो।

### `block-push-master`

**ईवेंट:** PreToolUse (Bash)\
**डिफ़ॉल्ट:** `git push origin main` और `git push origin master` को deny करता है।

**पैरामीटर:**

| पैरामीटर            | प्रकार     | डिफ़ॉल्ट             | विवरण                                               |
| ------------------- | ---------- | -------------------- | --------------------------------------------------- |
| `protectedBranches` | `string[]` | `["main", "master"]` | Branch नाम जिन्हें directly push नहीं किया जा सकता। |

**उदाहरण:**

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

<Tip>
  सभी branches को push करने की अनुमति देने के लिए (इस नीति को `enabledPolicies` से remove किए बिना effectively disable करने के लिए), `protectedBranches: []` set करें।
</Tip>

***

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

**ईवेंट:** PreToolUse (Bash)\
**डिफ़ॉल्ट:** `git commit`, `git merge`, `git rebase`, और `git cherry-pick` को deny करता है जबकि working tree `main` या `master` पर हो। Branch creation और switching (`git checkout`, `git checkout -b`, `git switch`, `git switch -c`) प्रभावित नहीं होते।

**पैरामीटर:**

| पैरामीटर            | प्रकार     | डिफ़ॉल्ट             | विवरण                                                                |
| ------------------- | ---------- | -------------------- | -------------------------------------------------------------------- |
| `protectedBranches` | `string[]` | `["main", "master"]` | Branch नाम जिन पर commit/merge/rebase/cherry-pick deny किया जाता है। |

***

### `block-force-push`

**ईवेंट:** PreToolUse (Bash)\
**डिफ़ॉल्ट:** `git push --force` और `git push -f` को deny करता है।

कोई policy-specific पैरामीटर नहीं। cross-cutting [`hint`](/hi/configuration#hint-cross-cutting) का उपयोग करें alternatives suggest करने के लिए:

```json theme={null}
{
  "policyParams": {
    "block-force-push": {
      "hint": "अपने current HEAD से एक नई branch बनाएँ (उदाहरण के लिए `git checkout -b <new-branch>`) और उसे push करें।"
    }
  }
}
```

***

### `warn-git-amend`

**ईवेंट:** PreToolUse (Bash)\
**डिफ़ॉल्ट:** Claude को सावधानी से proceed करने का instruct करता है जब `git commit --amend` चलाया जाए। कमांड को block नहीं करता।

कोई पैरामीटर नहीं।

***

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

**ईवेंट:** PreToolUse (Bash)\
**डिफ़ॉल्ट:** Claude को `git stash drop` चलाने से पहले confirm करने का instruct करता है। कमांड को block नहीं करता।

कोई पैरामीटर नहीं।

***

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

**ईवेंट:** PreToolUse (Bash)\
**डिफ़ॉल्ट:** Claude को review करने का instruct करता है कि यह क्या stage कर रहा है जब `git add -A` या `git add .` चलाया जाए। कमांड को block नहीं करता।

कोई पैरामीटर नहीं।

***

## डेटाबेस

destructive SQL operations को execute होने से पहले पकड़ें अपने database के विरुद्ध।

### `warn-destructive-sql`

**ईवेंट:** PreToolUse (Bash)\
**डिफ़ॉल्ट:** Claude को confirm करने का instruct करता है SQL चलाने से पहले जिसमें `DROP TABLE`, `DROP DATABASE`, या `WHERE` clause के बिना `DELETE` हो।

कोई पैरामीटर नहीं।

***

### `warn-schema-alteration`

**ईवेंट:** PreToolUse (Bash)\
**डिफ़ॉल्ट:** Claude को `ALTER TABLE` statements चलाने से पहले confirm करने का instruct करता है।

कोई पैरामीटर नहीं।

***

## चेतावनियाँ

एजेंटों को potentially risky लेकिन non-destructive operations से पहले extra context दें।

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

**ईवेंट:** PreToolUse (Write)\
**डिफ़ॉल्ट:** Claude को 1024 KB से बड़ी files write करने से पहले confirm करने का instruct करता है।

**पैरामीटर:**

| पैरामीटर      | प्रकार   | डिफ़ॉल्ट | विवरण                                                                      |
| ------------- | -------- | -------- | -------------------------------------------------------------------------- |
| `thresholdKb` | `number` | `1024`   | File size threshold kilobytes में जिसके ऊपर एक warning issue किया जाता है। |

**उदाहरण:**

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

<Note>
  Hook handler payloads पर 1 MB stdin limit enforce करता है। इस नीति को small content के साथ test करने के लिए, `thresholdKb` को 1024 से काफी कम value में set करें।
</Note>

***

### `warn-package-publish`

**ईवेंट:** PreToolUse (Bash)\
**डिफ़ॉल्ट:** Claude को `npm publish` चलाने से पहले confirm करने का instruct करता है।

कोई पैरामीटर नहीं।

***

### `warn-background-process`

**ईवेंट:** PreToolUse (Bash)\
**डिफ़ॉल्ट:** Claude को `nohup`, `&`, `disown`, या `screen` के via background processes launch करते समय सावधान रहने का instruct करता है।

कोई पैरामीटर नहीं।

***

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

**ईवेंट:** PreToolUse (Bash)\
**डिफ़ॉल्ट:** Claude को `npm install -g`, `yarn global add`, या virtual environment के बिना `pip install` चलाने से पहले confirm करने का instruct करता है।

कोई पैरामीटर नहीं।

***

## पैकेज मैनेजर

enforce करें कि एजेंट किस पैकेज मैनेजर को use करने की अनुमति है।

### `prefer-package-manager`

**ईवेंट:** PreToolUse (Bash)\
**डिफ़ॉल्ट:** Disabled। जब enabled हो, तो `allowed` list में नहीं होने वाली कोई भी पैकेज मैनेजर command को block करता है और Claude को allowed manager का उपयोग करके command को rewrite करने का कहता है।

Detects: pip, pip3, python -m pip, npm, npx, yarn, pnpm, pnpx, bun, bunx, uv, poetry, pipenv, conda, cargo।

| पैरामीटर  | प्रकार    | डिफ़ॉल्ट | विवरण                                                                                                                        |
| --------- | --------- | -------- | ---------------------------------------------------------------------------------------------------------------------------- |
| `allowed` | string\[] | `[]`     | अनुमत पैकेज मैनेजर नाम। कोई भी detected manager जो इस list में नहीं है block किया जाता है। जब empty हो, तो नीति एक no-op है। |
| `blocked` | string\[] | `[]`     | अतिरिक्त मैनेजर नाम जो built-in list के अलावा block करें (उदाहरण के लिए `['pdm', 'pipx']`)।                                  |

Built-in block list covers: pip, pip3, npm, npx, yarn, pnpm, pnpx, bun, bunx, uv, poetry, pipenv, conda, cargo। इस list में नहीं होने वाले managers को append करने के लिए `blocked` का उपयोग करें।

**उदाहरण कॉन्फ़िगरेशन:**

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

इस कॉन्फ़िग के साथ, `pip install flask` और `pdm install flask` दोनों deny किए जाते हैं Claude को एक message के साथ जो कहता है `uv` या `bun` का उपयोग करने के लिए। `uv pip install flask` जैसी commands अनुमत हैं क्योंकि `uv` allowlist में है और पहले check किया जाता है।

***

## AI व्यवहार

detect करें जब एजेंट stuck हों या unexpectedly behave करें।

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

**ईवेंट:** PreToolUse (सभी tools)\
**डिफ़ॉल्ट:** Claude को reconsider करने का instruct करता है जब same tool को 3+ times identical parameters के साथ call किया जाए — एक common sign कि एजेंट एक loop में stuck है।

कोई पैरामीटर नहीं।

***

## वर्कफ़्लो

एक disciplined end-of-session workflow को enforce करें। ये नीतियाँ **Stop** event पर fire होती हैं और एजेंट को stop करने से deny करती हैं जब तक प्रत्येक condition meet न हो। वे एक natural dependency chain का follow करती हैं: commit → push → PR → CI। यदि एक नीति deny करती है, तो chain में बाद की नीतियाँ skip किए जाते हैं (deny short-circuits)।

सभी वर्कफ़्लो नीतियाँ **fail-open** हैं: यदि required tool available नहीं है (उदाहरण के लिए `gh` installed नहीं, कोई git remote नहीं), तो नीति allow करती है एक informational message के साथ जो explain करता है कि check क्यों skip किया गया।

### Per-CLI Stop semantics

Stop enforcement छहों supported CLIs में थोड़ा अलग दिखता है क्योंकि प्रत्येक एक अलग "agent finished" hook contract expose करता है। **outcome** same है — एजेंट workflow gate failing होने पर stop नहीं हो सकता — लेकिन **mechanics** अलग हैं। नीचे की table summarize करती है; केवल Pi के पास एक user-visible quirk है जो समझने के लायक है इससे पहले आप एक `require-*-before-stop` नीति को enable करें।

| CLI                      | जब gate fires                | आप क्या देखते हैं                                                                                                                                                                                                                                                                                                                                                                      |
| ------------------------ | ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Claude Code              | Same agent loop, immediately | Claude काम करता रहता है — issue को fix करता है, फिर finish करने का दोबारा attempt करता है। आपको कोई interruption दिखाई नहीं देता।                                                                                                                                                                                                                                                      |
| Codex                    | Same agent loop, immediately | Claude के समान।                                                                                                                                                                                                                                                                                                                                                                        |
| GitHub Copilot CLI       | Same agent loop, immediately | Claude के समान (Copilot के `{decision:"block", reason}` retry channel का उपयोग करता है — Copilot CLI 1.0.41 के विरुद्ध empirically verified)।                                                                                                                                                                                                                                          |
| Cursor Agent             | Same agent loop, immediately | Claude के समान (Cursor के `{followup_message}` channel का उपयोग करता है — `loop_limit` द्वारा capped, default 5 retries)।                                                                                                                                                                                                                                                              |
| OpenCode                 | Same agent loop, immediately | Claude के समान (OpenCode के `client.session.prompt(...)` SDK call का उपयोग करता है `hookSpecificOutput.additionalContext` के through routed)।                                                                                                                                                                                                                                          |
| **Pi (pi-coding-agent)** | **Next user turn**           | **Pi visibly stops** जब gate fires — इसका agent loop exit होता है और आपको prompt में वापस किया जाता है। Gate फिर next time fires जब आप एक prompt submit करते हैं: failproofai एक `MANDATORY ACTION REQUIRED` directive को उस turn के system prompt में prepend करता है, LLM को instruct करते हुए workflow step (commit, push, आदि) को complete करने के लिए आप जो माँगते हैं उससे पहले। |

<Note>
  **Pi limitation.** Pi के `AgentEndEvent` (Claude के `Stop` hook के upstream equivalent) के पास कोई Result type नहीं है — जब यह fires, Pi के agent loop पहले ही exit हो चुका है। Pi को Claude / Copilot / Cursor / OpenCode के तरीके से same loop को retry के लिए force नहीं किया जा सकता। failproofai gate को Pi के `before_agent_start` event में shift करता है (जो next user prompt के बाद fires) ताकि workflow check अभी भी enforce हो, बस next turn पर current के बजाय।

  **इसका व्यावहारिक मतलब क्या है:**

  * Pi stop करने के बाद, deny reason को in-memory में Pi session id द्वारा keyed capture किया जाता है। बिल्कुल next prompt आप same Pi process में submit करते हैं drains it: LLM को अपने system prompt के top में `MANDATORY ACTION REQUIRED` directive दिखाई देता है, commit करता है (या push / PR खोलता है / CI wait करता है), और फिर ही आपके request के साथ continue करता है। Captured deny reason एक one-shot है — एक बार drain होने के बाद, gate clear है।
  * Gate Pi के process lifetime द्वारा bounded है। यदि आप Pi को `Ctrl+C` करते हैं या turns के बीच quit करते हैं, in-memory entry process के साथ drop हो जाता है और gate miss हो जाता है। Claude, Copilot, Cursor, और OpenCode के पास same bound है (एजेंट को kill करो और gate miss हो जाता है) — Pi बस इसे अधिक visible बनाता है क्योंकि एजेंट visibly exit होता है gate firing से पहले।
  * Pending deny भी `session_shutdown` पर किसी भी कारण के लिए clear किया जाता है (`new` / `resume` / `fork` / `quit`), तो prior session से एक stale gate same Pi process में started fresh session में leak नहीं हो सकता।

  यदि आपको Claude-style same-loop retry चाहिए, run अपनी `Stop` नीतियों के अंतर्गत किसी और पाँच supported CLIs के। हम Pi upstream को track कर रहे हैं एक future Result type के लिए `AgentEndEvent` पर जो हमें इस gap को close करने देगा।
</Note>

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

**ईवेंट:** Stop\
**डिफ़ॉल्ट:** Stopping को deny करता है जब uncommitted changes हों (modified, staged, या untracked files)। Informational message return करता है जब working directory clean हो।

कोई पैरामीटर नहीं।

***

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

**ईवेंट:** Stop\
**डिफ़ॉल्ट:** Stopping को deny करता है जब unpushed commits हों या जब current branch के पास कोई remote tracking branch नहीं हो। Suggest करता है `git push -u` tracking branch create करने के लिए यदि आवश्यक हो। Fails open यदि कोई remote configured नहीं है।

**पैरामीटर:**

| पैरामीटर | प्रकार   | डिफ़ॉल्ट   | विवरण                       |
| -------- | -------- | ---------- | --------------------------- |
| `remote` | `string` | `"origin"` | Remote name जिसे push करें। |

**उदाहरण:**

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

***

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

**ईवेंट:** Stop\
**डिफ़ॉल्ट:** Stopping को deny करता है जब current branch के लिए कोई pull request exist न हो, या जब existing PR merge किए बिना closed हो। Instruct करता है Claude को `gh pr create` के साथ PR create करने के लिए। जब PR **merged** हो, नीति allow करती है (काम ship हो गया है) और message hint देता है branch को switch करने के लिए (`git checkout main && git pull`)।

कोई पैरामीटर नहीं।

<Note>
  इस नीति के लिए [GitHub CLI](https://cli.github.com/) (`gh`) को installed और authenticated होना आवश्यक है।
  एक personal access token के साथ `gh auth login` चलाएँ जिसके पास `repo` scope हो pull requests में read access के लिए। यदि `gh` installed नहीं है या authenticated नहीं है, तो नीति fail open होती है और Claude को reason report करती है।
</Note>

***

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

**ईवेंट:** Stop\
**डिफ़ॉल्ट:** Stopping को deny करता है जब current branch base branch में cleanly merge न हो सकता हो। नीति पहले confirm करती है कि एक `OPEN` PR GitHub पर branch के लिए exist करता है — बिना उसके, कोई merge target नहीं है enforce करने के लिए, तो पूरी नीति short-circuit करके allow होती है। एक बार `OPEN` PR confirm होने के बाद, दो independent probes चलते हैं:

1. **Local** — `git merge-tree --write-tree --name-only origin/<baseBranch> HEAD`। Conflict पर, deny message conflicted files को name करता है ताकि Claude को पता चले कि क्या resolve करना है।
2. **GitHub** — `gh pr view --json mergeable,state` result को reuse करता है पहले से ही precheck में fetch किया गया। Conflicts को catch करता है जो एक stale local `origin/<baseBranch>` को miss करेगा (उदाहरण के लिए कोई last fetch के बाद `main` पर एक conflicting PR land करता है)। एक `CONFLICTING` result deny करता है। एक `UNKNOWN` result भी deny करता है और Claude को instruct करता है \~10 seconds wait करने और re-check करने के लिए stop attempt करने से पहले — यह false negatives को रोकता है जबकि GitHub recompute करता है।

Entirely skip (allow) करता है जब: `gh` installed नहीं है, branch के लिए कोई PR exist नहीं है, PR की state `OPEN` नहीं है (उदाहरण के लिए `MERGED`, `CLOSED`), या `gh pr view` unparseable output return करता है। भी fail open करता है जब `origin/<baseBranch>` locally missing है या जब कोई commits base से ahead नहीं हैं — वे Layer 1 fall-throughs अभी भी cached PR mergeability को consult करते हैं allow करने से पहले।

**पैरामीटर:**

| पैरामीटर     | प्रकार   | डिफ़ॉल्ट | विवरण                                              |
| ------------ | -------- | -------- | -------------------------------------------------- |
| `baseBranch` | `string` | `"main"` | Base branch जिसके विरुद्ध conflicts को check करें। |

<Note>
  GitHub CLI (`gh`) इस नीति के लिए आवश्यक है। नीति `gh pr view` का उपयोग करता है confirm करने के लिए कि branch के लिए एक `OPEN` PR exist करता है किसी भी conflict probe को चलाने से पहले — बिना `gh` के, नीति short-circuit करके allow करती है। Pull requests में read access के लिए `repo` scope के साथ personal access token के साथ `gh auth login` चलाएँ।
</Note>

***

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

**ईवेंट:** Stop\
**डिफ़ॉल्ट:** Stopping को deny करता है जब CI checks failing या अभी चल रही हों current branch पर। दोनों GitHub Actions workflow runs और third-party bot checks को check करता है (उदाहरण के लिए CodeRabbit, SonarCloud, Codecov)। `skipped`, `cancelled`, और `neutral` conclusions को non-failing के रूप में treat करता है (latter उदाहरण के लिए Socket Security alerts को outside contributor PRs पर cover करता है, जहाँ app intentionally neutral report करता है success/failure के बजाय)। Informational message return करता है जब सभी checks pass करते हैं।

कोई पैरामीटर नहीं।

<Note>
  यह नीति [GitHub CLI](https://cli.github.com/) (`gh`) को installed और authenticated होना आवश्यक करती है।
  Actions workflow runs और Checks API में read access के लिए `repo` scope के साथ personal access token के साथ `gh auth login` चलाएँ। यदि `gh` installed नहीं है या authenticated नहीं है, तो नीति fail open होती है और Claude को reason report करती है।
</Note>

***

***

## व्यक्तिगत नीतियों को disable करना

अपने कॉन्फ़िग में `enabledPolicies` से एक विशिष्ट नीति को remove करें, या dashboard के Policies tab में इसे toggle off करें।

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

नीतियाँ जो `enabledPolicies` में listed नहीं हैं run नहीं होती, भले ही `policyParams` entries उनके लिए exist करें।
