# रिपॉज़िटरी नियम — CVE-2026-111497

दायरा: इस रिपॉज़िटरी में काम करने वाले एजेंट और मनुष्य।
प्राथमिकता: गति से ऊपर सुरक्षा। प्रत्येक अपरिवर्तनीय कार्रवाई से पहले बैकअप और उसी कार्रवाई की
sandbox जाँच होती है।

## उद्देश्य

रिपॉज़िटरी में **CVE-2026-111497** के लिए पुनः प्रयोग योग्य निवारण एजेंट है — यह Google Brotli
डिकोडर में out-of-bounds write है। मूल भाग `src/` की नियतात्मक bash स्क्रिप्ट हैं; वे संक्षिप्त
मशीन-पठनीय निर्णय लौटाती हैं और भाषा मॉडल का token व्यय न्यूनतम रखती हैं।

## ज़िम्मेदारी की सीमाएँ

- `src/detect.sh` — **केवल-पठन।** यह कोई पैकेज, सेवा या कॉन्फ़िगरेशन फ़ाइल नहीं बदलती।
- `src/remediate.sh` — परिवर्तन का एकमात्र बिंदु। यह बैकअप, authenticity gate, dry run,
  संस्थापन और उपभोक्ताओं का पुनः-प्रारंभ करती है।
- `src/verify.sh` — **केवल-पठन।** यह उस प्रभाव की पुष्टि करती है जो वास्तव में प्राप्त हुआ।

## अनिवार्य invariants

1. **परिवर्तन से पहले बैकअप।** `remediate.sh` कुछ भी संस्थापित करने से पहले सदैव
   `/root/cve-2026-111497-fix-<timestamp>/` बनाती है, जिसमें पुरानी `.so` फ़ाइलें, डाउनलोड
   योग्य `.deb` और एक `dpkg` स्नैपशॉट रहता है।
2. **Authenticity gate।** संस्थापन केवल तब होता है जब candidate changelog में `CVE-2026-111497`
   का उल्लेख पुष्ट हो जाए। अन्यथा स्क्रिप्ट रुक जाती है और मामला ऊपर भेजती है।
3. **उपभोक्ताओं का पुनः-प्रारंभ।** निवारण के बाद कोई भी प्रक्रिया भेद्य `libbrotlidec` को मैप
   किए हुए नहीं रह सकती। यह `/proc/*/maps` और inode तुलना से जाँचा जाता है।
4. **रिपॉज़िटरी में शून्य रहस्य।** कोई कुंजी, पासवर्ड, token, वास्तविक IP पता या hostname नहीं।
   लक्ष्य होस्ट `~/.ssh/config` से SSH alias के रूप में दिए जाते हैं।
5. **फ़ाइल प्रारूप।** LF, BOM नहीं, UTF-8। `.sh` फ़ाइलें mode `100755` के साथ commit होती हैं।
6. **`.ragraf/` कभी commit नहीं होता** — यह नियम मूल `.gitignore` में रहता है।

## कमांड

```bash
# syntax check before delivery
bash -n src/common.sh src/detect.sh src/remediate.sh src/verify.sh

# field order is fixed: detect -> remediate -> verify
bash src/detect.sh ; echo "exit=$?"
bash src/remediate.sh
bash src/verify.sh
```

## सत्यापन

कोई परिवर्तन केवल तब स्वीकार होता है जब नीचे की सभी बातें पूरी हों:

```bash
bash -n src/*.sh                       # no syntax error
shellcheck src/*.sh                    # no unresolved finding
ghagent doc --root .                   # markdown and privacy contract
```

व्यवहार का प्रमाण एक डिस्पोज़ेबल होस्ट पर फ़ील्ड रन है: `detect.sh` `1` लौटाती है, फिर
`remediate.sh` `0` लौटाती है, फिर `verify.sh` `VERIFY: PASS` छापती है।

## Commit क्रम (स्वामी, एजेंट नहीं)

ओवरराइड करने वाले चर हटाएँ और स्वामी की पहचान स्पष्ट रूप से दें:

```bash
unset GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL GIT_COMMITTER_NAME GIT_COMMITTER_EMAIL
git -c user.name='Mikhail Deynekin' -c user.email='Mikhail@Deynekin.com' commit -m '...'
git log -1 --format='%an <%ae> | %cn <%ce>'   # owner, never zwork
```

## जाल (traps)

| जाल | लक्षण | कार्रवाई |
|---|---|---|
| जल्दी बाहर निकलने वाले `head`/`awk` के साथ `set -o pipefail` | सफलता पर भी exit 141 (SIGPIPE) | `common.sh` में `pipefail` जानबूझकर छोड़ा गया है |
| state फ़ाइल को shell की तरह source करना | कोष्ठक वाले `PRETTY_NAME` पर syntax error | मान `state_get` से पढ़ें |
| glob से inode लेना | symlink का inode दर्ज हो जाता है, stale जाँच झूठी सफल हो जाती है | `find -type f -printf '%i'` |
| unit लूप में बिना newline के `printf '%s'` | unit नाम जुड़ जाते हैं, restart चुपचाप कुछ नहीं करता | `printf '%s\n'` |
| डेस्कटॉप unit का `systemctl restart` | सत्र चला जाता है, VPN टूट जाता है | डेस्कटॉप और इन्फ्रास्ट्रक्चर unit `DESKTOP_INFRA_PAT` में हैं और deferred के रूप में दर्ज होते हैं |
| ISPmanager पैनल daemons को `kill` से पुनः चालू करना | पैनल की स्थिति का भ्रष्ट होना | `mgrctl -m core --restart srvparam` |

## वर्जित

- कार्य में उल्लिखित न होने वाली फ़ाइलें, स्वामी की स्पष्ट सहमति के बिना, हटाना।
- पहले `detect.sh` चलाए बिना `remediate.sh` चलाना (before-state अनिवार्य है)।
- authenticity gate पास न होने पर पैकेज संस्थापन को बाध्य करना।
- अपनी पहल पर लक्ष्य होस्ट पर स्वचालित upgrade या unattended reboot सक्षम करना।
