# Release Checklist (ಕನ್ನಡ) 🌐 **Languages:** 🇺🇸 [English](../../../../ops/RELEASE_CHECKLIST.md) · 🇪🇹 [am](../../../am/docs/ops/RELEASE_CHECKLIST.md) · 🇸🇦 [ar](../../../ar/docs/ops/RELEASE_CHECKLIST.md) · 🇦🇿 [az](../../../az/docs/ops/RELEASE_CHECKLIST.md) · 🇧🇬 [bg](../../../bg/docs/ops/RELEASE_CHECKLIST.md) · 🇧🇩 [bn](../../../bn/docs/ops/RELEASE_CHECKLIST.md) · 🇧🇦 [bs](../../../bs/docs/ops/RELEASE_CHECKLIST.md) · 🇨🇿 [cs](../../../cs/docs/ops/RELEASE_CHECKLIST.md) · 🇩🇰 [da](../../../da/docs/ops/RELEASE_CHECKLIST.md) · 🇩🇪 [de](../../../de/docs/ops/RELEASE_CHECKLIST.md) · 🇬🇷 [el](../../../el/docs/ops/RELEASE_CHECKLIST.md) · 🇪🇸 [es](../../../es/docs/ops/RELEASE_CHECKLIST.md) · 🇪🇪 [et](../../../et/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇷 [fa](../../../fa/docs/ops/RELEASE_CHECKLIST.md) · 🇫🇮 [fi](../../../fi/docs/ops/RELEASE_CHECKLIST.md) · 🇫🇷 [fr](../../../fr/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇪 [ga](../../../ga/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇳 [gu](../../../gu/docs/ops/RELEASE_CHECKLIST.md) · 🇳🇬 [ha](../../../ha/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇱 [he](../../../he/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇳 [hi](../../../hi/docs/ops/RELEASE_CHECKLIST.md) · 🇭🇷 [hr](../../../hr/docs/ops/RELEASE_CHECKLIST.md) · 🇭🇺 [hu](../../../hu/docs/ops/RELEASE_CHECKLIST.md) · 🇦🇲 [hy](../../../hy/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇩 [id](../../../id/docs/ops/RELEASE_CHECKLIST.md) · 🇳🇬 [ig](../../../ig/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇹 [it](../../../it/docs/ops/RELEASE_CHECKLIST.md) · 🇯🇵 [ja](../../../ja/docs/ops/RELEASE_CHECKLIST.md) · 🇬🇪 [ka](../../../ka/docs/ops/RELEASE_CHECKLIST.md) · 🇰🇭 [km](../../../km/docs/ops/RELEASE_CHECKLIST.md) · 🇰🇷 [ko](../../../ko/docs/ops/RELEASE_CHECKLIST.md) · 🇱🇹 [lt](../../../lt/docs/ops/RELEASE_CHECKLIST.md) · 🇱🇻 [lv](../../../lv/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇳 [ml](../../../ml/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇳 [mr](../../../mr/docs/ops/RELEASE_CHECKLIST.md) · 🇲🇾 [ms](../../../ms/docs/ops/RELEASE_CHECKLIST.md) · 🇲🇹 [mt](../../../mt/docs/ops/RELEASE_CHECKLIST.md) · 🇲🇲 [my](../../../my/docs/ops/RELEASE_CHECKLIST.md) · 🇳🇵 [ne](../../../ne/docs/ops/RELEASE_CHECKLIST.md) · 🇳🇱 [nl](../../../nl/docs/ops/RELEASE_CHECKLIST.md) · 🇳🇴 [no](../../../no/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇳 [or](../../../or/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇳 [pa](../../../pa/docs/ops/RELEASE_CHECKLIST.md) · 🇵🇭 [phi](../../../phi/docs/ops/RELEASE_CHECKLIST.md) · 🇵🇱 [pl](../../../pl/docs/ops/RELEASE_CHECKLIST.md) · 🇵🇹 [pt](../../../pt/docs/ops/RELEASE_CHECKLIST.md) · 🇧🇷 [pt-BR](../../../pt-BR/docs/ops/RELEASE_CHECKLIST.md) · 🇷🇴 [ro](../../../ro/docs/ops/RELEASE_CHECKLIST.md) · 🇷🇺 [ru](../../../ru/docs/ops/RELEASE_CHECKLIST.md) · 🇱🇰 [si](../../../si/docs/ops/RELEASE_CHECKLIST.md) · 🇸🇰 [sk](../../../sk/docs/ops/RELEASE_CHECKLIST.md) · 🇸🇮 [sl](../../../sl/docs/ops/RELEASE_CHECKLIST.md) · 🇷🇸 [sr](../../../sr/docs/ops/RELEASE_CHECKLIST.md) · 🇸🇪 [sv](../../../sv/docs/ops/RELEASE_CHECKLIST.md) · 🇰🇪 [sw](../../../sw/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇳 [ta](../../../ta/docs/ops/RELEASE_CHECKLIST.md) · 🇮🇳 [te](../../../te/docs/ops/RELEASE_CHECKLIST.md) · 🇹🇭 [th](../../../th/docs/ops/RELEASE_CHECKLIST.md) · 🇹🇷 [tr](../../../tr/docs/ops/RELEASE_CHECKLIST.md) · 🇺🇦 [uk-UA](../../../uk-UA/docs/ops/RELEASE_CHECKLIST.md) · 🇵🇰 [ur](../../../ur/docs/ops/RELEASE_CHECKLIST.md) · 🇺🇿 [uz](../../../uz/docs/ops/RELEASE_CHECKLIST.md) · 🇻🇳 [vi](../../../vi/docs/ops/RELEASE_CHECKLIST.md) · 🇳🇬 [yo](../../../yo/docs/ops/RELEASE_CHECKLIST.md) · 🇨🇳 [zh-CN](../../../zh-CN/docs/ops/RELEASE_CHECKLIST.md) · 🇹🇼 [zh-TW](../../../zh-TW/docs/ops/RELEASE_CHECKLIST.md) --- > **ಕೊನೆಯ ನವೀಕರಣ:** 2026-08-28 — v3.8.51 > ಸ್ವಯಂಚಾಲಿತಗೊಳಿಸುವಿಕೆಗಾಗಿ Claude Code ಕೌಶಲ್ಯಗಳನ್ನು ಬಳಸುವಂತೆ ಸರಳೀಕರಿಸಿದ ಬಿಡುಗಡೆ ಪ್ರಕ್ರಿಯೆ. > > **ಬಿಡುಗಡೆಗಳ ನಡುವೆ ಕ್ಯೂ/ಬ್ರಾಂಚ್ ಅನ್ನು ಗ್ರೀನ್ ಆಗಿರಿಸಿ:** [RELEASE_GREEN.md](./RELEASE_GREEN.md) ನೋಡಿ > (`/green-prs` ಕುಟುಂಬ + `npm run check:release-green` + `/babysit` + ರಾತ್ರಿಯ ಕಾರ್ಯಾಚರಣೆ). ಇದನ್ನು > ನಿಯತಕಾಲಿಕವಾಗಿ — ಮತ್ತು ವಿಶೇಷವಾಗಿ ಈ ಪರಿಶೀಲನಾ ಪಟ್ಟಿಯನ್ನು ಅನುಸರಿಸುವ **ಮೊದಲು** — ಚಲಾಯಿಸುವುದರಿಂದ ಬಿಡುಗಡೆ PR ಗ್ರೀನ್ ಆಗಿಯೇ ಪ್ರಾರಂಭವಾಗುತ್ತದೆ. ## ಸಂಕ್ಷಿಪ್ತವಾಗಿ ```bash # 1. ಆವೃತ್ತಿಯನ್ನು ಹೆಚ್ಚಿಸಿ + CHANGELOG ರಚಿಸಿ (ಕೌಶಲ್ಯ) /version-bump-cc patch # ಅಥವಾ minor/major # 2. ಗುಣಮಟ್ಟದ ಗೇಟ್ ಅನ್ನು ಸ್ಥಳೀಯವಾಗಿ ಚಲಾಯಿಸಿ npm run check # lint + ಪರೀಕ್ಷೆಗಳು npm run test:coverage # ಸಂಪೂರ್ಣ coverage ಗೇಟ್ (60/60/60/60) # 3. ಬಿಲ್ಡ್ ಮಾಡಿ ಮತ್ತು smoke ಪರೀಕ್ಷೆ ನಡೆಸಿ npm run build npm run test:e2e # ಐಚ್ಛಿಕ, ಆದರೆ ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ # 4. ಬಿಡುಗಡೆಯನ್ನು ರಚಿಸಿ (ಕೌಶಲ್ಯ) /generate-release-cc # 5. ನಿಯೋಜಿಸಿ (ಕೌಶಲ್ಯ) /deploy-vps-both-cc # ಅಥವಾ akamai-cc / local-cc # 6. ಬಿಡುಗಡೆಯ ಪುರಾವೆಗಳನ್ನು ಸೆರೆಹಿಡಿಯಿರಿ (ಕೌಶಲ್ಯ) /capture-release-evidences-cc ``` ## npm Trusted Publishing (v3.8.51 ರಿಂದ ಡೀಫಾಲ್ಟ್) — ವಿನಂತಿಯ ಮೇರೆಗೆ staged, ಪರ್ಯಾಯವಾಗಿ direct `npm-publish.yml` ಡೀಫಾಲ್ಟ್ ಆಗಿ **npm Trusted Publishing (OIDC)** ಮೂಲಕ ಪ್ರಕಟಿಸುತ್ತದೆ: `stage-npm` job (github-hosted) ಆ ಕಾರ್ಯಾಚರಣೆಗಾಗಿ GitHub ನ id-token ಅನ್ನು ಅಲ್ಪಾವಧಿಯ npm credential ಗೆ ವಿನಿಮಯ ಮಾಡುತ್ತದೆ — repository secrets ನಲ್ಲಿ ದೀರ್ಘಾವಧಿಯ npm token ಇರುವುದಿಲ್ಲ, 2FA prompt ಇರುವುದಿಲ್ಲ ಮತ್ತು provenance ಲಗತ್ತಿಸಲಾಗುತ್ತದೆ. 2FA ಅನ್ನು ಬಿಟ್ಟುಬಿಡುವ token ಗಳನ್ನು ಹಂತಹಂತವಾಗಿ ನಿವೃತ್ತಿಗೊಳಿಸುತ್ತಿರುವುದರಿಂದ ಈಗ npm ಅನುಮೋದಿಸುವ bypass ಇದೇ; ಇದು WS1.3 ಖಾತರಿಯನ್ನು ಉಳಿಸಿಕೊಂಡೇ v3.8.48 ವರೆಗೆ ಯೋಜನೆಯಲ್ಲಿದ್ದ ಸಂಪೂರ್ಣ ಸ್ವಯಂಚಾಲಿತ ಪ್ರಕ್ರಿಯೆಯನ್ನು ಮರುಸ್ಥಾಪಿಸುತ್ತದೆ (ಸೋರಿಕೆಯಾದ token ಒಂದರಿಂದ ಮಾತ್ರ ಪ್ರಕಟಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ — ಏಕೆಂದರೆ token ಇರುವುದೇ ಇಲ್ಲ). **ಒಂದು-ಬಾರಿಯ ಸೆಟಪ್ (ಮಾಲೀಕರು):** npmjs.com → package `omniroute` → Settings → _Trusted Publisher_ → GitHub: owner `diegosouzapw`, repo `OmniRoute`, workflow `npm-publish.yml` (environment: none). ಇದು ಅಸ್ತಿತ್ವದಲ್ಲಿರುವವರೆಗೆ, ಸ್ವಯಂಚಾಲಿತ ಹಂತವು `ENEEDAUTH` ದೋಷದೊಂದಿಗೆ ವಿಫಲವಾಗುತ್ತದೆ: `publish_mode=staged` (ಕೆಳಗೆ) ಅಥವಾ `direct` ಬಳಸಿ ಮರು-dispatch ಮಾಡಿ. ### Staged publishing (ವಿನಂತಿಯ ಮೇರೆಗೆ — `publish_mode=staged`) npm-publish workflow ಇನ್ನು ಮುಂದೆ ನೇರವಾಗಿ ಪ್ರಕಟಿಸುವುದಿಲ್ಲ: ಇದು ಪ್ಯಾಕ್ ಮಾಡಿದ tarball ಅನ್ನು ಬೂಟ್ ಮಾಡುತ್ತದೆ (`check:pack-boot`) ಮತ್ತು ನಂತರ `npm stage publish` ಅನ್ನು ಚಲಾಯಿಸುತ್ತದೆ — ನಿಖರವಾದ bytes ಅನ್ನು registry ಯಲ್ಲಿ ಇರಿಸಲಾಗುತ್ತದೆ, ಆದರೆ ಮಾಲೀಕರು ಅನುಮೋದಿಸುವವರೆಗೆ ಅವುಗಳನ್ನು **install ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ**. ಮಾನವ 2FA ಗೇಟ್ ಅನ್ನು ಪುರಾವೆಯ ಮೊದಲು ಅಲ್ಲ, ಅದರ ನಂತರಕ್ಕೆ ಸ್ಥಳಾಂತರಿಸಲಾಗಿದೆ. **workflow ಗ್ರೀನ್ ಆದ ನಂತರ ಮಾಲೀಕರ ಪ್ರಕ್ರಿಯೆ:** 1. `npm stage list omniroute` — stage id ಅನ್ನು ಹುಡುಕಿ (workflow ಸಾರಾಂಶದಲ್ಲಿಯೂ ಮುದ್ರಿಸಲಾಗುತ್ತದೆ). 2. staged bytes ಅನ್ನು ಪರಿಶೀಲಿಸಿ (ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ): `npm stage download `, ನಂತರ download ಮಾಡಿದ tarball ಅನ್ನು ತಾತ್ಕಾಲಿಕ prefix ನಲ್ಲಿ install ಮಾಡಿ ಮತ್ತು ಅದನ್ನು ಬೂಟ್ ಮಾಡಿ (`npm run check:pack-boot` ಅದೇ pack→install→boot ತೀರ್ಪನ್ನು CI ನಲ್ಲಿ ಸ್ವಯಂಚಾಲಿತಗೊಳಿಸುತ್ತದೆ). 3. `npm stage approve ` — 2FA prompt ಎನ್ನುವುದೇ publish ಆಗಿದೆ. `npm stage reject ` ಅದನ್ನು ತಿರಸ್ಕರಿಸುತ್ತದೆ. 4. ಪ್ರಕಟಣೆಯ ನಂತರದ ಸುರಕ್ಷತಾ ಜಾಲ: post-publish verifier (v3.8.49 ಯೋಜನೆಯ WS1.4) ಸಾರ್ವಜನಿಕ registry ಯಿಂದ ಪ್ರಕಟಿತ ಆವೃತ್ತಿಯನ್ನು ಸ್ವಚ್ಛ container ನಲ್ಲಿ install ಮಾಡಿ ಅದನ್ನು ಬೂಟ್ ಮಾಡುತ್ತದೆ. **ತುರ್ತು ಪರ್ಯಾಯ:** `publish_mode=direct` ಜೊತೆಗೆ `workflow_dispatch` ಹಳೆಯ ತಕ್ಷಣದ `npm publish` ಅನ್ನು ಮರುಸ್ಥಾಪಿಸುತ್ತದೆ (staging ನಲ್ಲೇ ಸಮಸ್ಯೆಯಿದ್ದರೆ ಮಾತ್ರ ಬಳಸಿ; ಕಾರಣವನ್ನು ದಾಖಲಿಸಿ). **ಒಂದು-ಬಾರಿಯ ಭದ್ರತಾ ಬಲಪಡಿಸುವಿಕೆ (ಮಾಲೀಕರು, npmjs.com):** `omniroute` ಗಾಗಿ Trusted Publisher ಅನ್ನು stage-only mode ನಲ್ಲಿ ಸಂರಚಿಸಿ, ಇದರಿಂದ ಸೋರಿಕೆಯಾದ ದೀರ್ಘಾವಧಿಯ token ಯಾವುದೇ ಸ್ಥಳದಿಂದ ನೇರವಾಗಿ `npm publish` ಮಾಡಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ — CI ಕೇವಲ stage ಮಾಡಬಹುದು; ಮಾಲೀಕರ 2FA ಮಾತ್ರ ಬಿಡುಗಡೆ ಮಾಡಬಹುದು. **ದೋಷಪೂರಿತ artifact ಕಾರ್ಯವಿಧಾನ (ಬದಲಾಗಿಲ್ಲ):** ಡೀಫಾಲ್ಟ್ ತಕ್ಷಣದ ಕ್ರಮವಾಗಿ `npm deprecate omniroute@ " — use "` ಬಳಸಿ (ನಿಮಿಷಗಳಲ್ಲಿ ಆಗುತ್ತದೆ, ಹಿಂತಿರುಗಿಸಬಹುದು); `npm unpublish` ಅನ್ನು 72h/no-dependents ಮಿತಿಯೊಳಗೆ ಮಾತ್ರ ಬಳಸಿ ಮತ್ತು ಅದನ್ನು ಎಂದಿಗೂ ಮೊದಲ ಕ್ರಮವಾಗಿ ಬಳಸಬೇಡಿ. Docker: ಆವೃತ್ತಿಯ tag ಅನ್ನು ಎಂದಿಗೂ ಮರುಬರೆಯಬೇಡಿ — rollback ಎಂದರೆ `latest` ಅನ್ನು ಕೊನೆಯ ಉತ್ತಮ digest ಕಡೆಗೆ ಮರುನಿರ್ದೇಶಿಸುವುದು. **Docker Hub `latest` (ಪ್ರತಿ ಸ್ಥಿರ SemVer ಪ್ರಕಟಣೆಯಲ್ಲೂ ಅಗತ್ಯ):** `docker-publish` workflow **ಎರಡಕ್ಕೂ** tag ಮಾಡಬೇಕು: `X.Y.Z` ಮತ್ತು `should-promote-latest.sh` ಇದು ಅತ್ಯುನ್ನತ ಸ್ಥಿರ SemVer ಎಂದು ಒಪ್ಪಿದಾಗ `:latest`; ಇವೆರಡೂ **ಒಂದೇ digest** ಹೊಂದಿರಬೇಕು. job ನಂತರ: Hub ನ `latest` digest ಹೊಸ SemVer digest ಗೆ ಸಮನಾಗಿರಬೇಕು ಮತ್ತು `last_updated` ಮುಂದಕ್ಕೆ ಸರಿದಿರಬೇಕು. release notes ನಲ್ಲಿ git ನಲ್ಲಿ ಮಾತ್ರ ಇರುವ ಪರಿಹಾರಗಳ ಬಗ್ಗೆ ಹೇಳಿರುವಾಗ `:latest` ಅನ್ನು ಹಳೆಯ build ನಲ್ಲೇ ಬಿಡಬೇಡಿ. Compose quickstart ಗಳು `:latest` ಅನ್ನು ಬಳಸುತ್ತವೆ; GitOps ನಲ್ಲಿ `X.Y.Z` ಅನ್ನು pin ಮಾಡುವುದನ್ನು ಮುಂದುವರಿಸಬೇಕು. [Docker ಬಿಡುಗಡೆ ಚಾನೆಲ್ಗಳು](../guides/DOCKER_GUIDE.md#release-channels) ಮತ್ತು #10317 ನೋಡಿ. ## ಹಾಟ್ಫಿಕ್ಸ್ ಫಾಸ್ಟ್-ಲೇನ್ (`hotfix` ಲೇಬಲ್) `hotfix` ಲೇಬಲ್ ಹೊಂದಿರುವ PR ಭಾರವಾದ CI ಮ್ಯಾಟ್ರಿಕ್ಸ್ ಅನ್ನು (9-shard E2E, coverage ratchet, quality-gate, quality-extended) ಬಿಟ್ಟುಬಿಡುತ್ತದೆ ಮತ್ತು ವೇಗವಾದ, ಹೆಚ್ಚು-ಸಂಕೇತದ ಗೇಟ್ಗಳನ್ನು ಉಳಿಸಿಕೊಳ್ಳುತ್ತದೆ: build, unit shards, integration, vitest, lint/typecheck, docs-sync, `check:pack-artifact` ಮತ್ತು tarball boot-smoke (`check:pack-boot`). ಗುರಿ: ~33min ಬದಲು ≤15min ಒಳಗೆ ಹಸಿರು ಸ್ಥಿತಿ. **ಪ್ರವೇಶ ನೀತಿ — ಎಲ್ಲಾ ನಾಲ್ಕೂ ಕಡ್ಡಾಯ (Chromium/VS Code/Node ತುರ್ತು ಲೇನ್ಗಳ ಮಾದರಿಯಲ್ಲಿ):** 1. **ತೀವ್ರತೆ**: production ಹಾಳಾಗಿದೆ — ಪ್ರಕಟಿಸಿದ artifact boot ಆಗುವಾಗ crash ಆಗುತ್ತದೆ / ಒಂದು security fix / releaseನ ಪ್ರತಿಯೊಬ್ಬ ಬಳಕೆದಾರರೂ ಪರಿಣಾಮಕ್ಕೊಳಗಾಗಿದ್ದಾರೆ. "ಮುಖ್ಯ" ಎಂದರೆ "ಹಾಳಾಗಿದೆ" ಎಂದಲ್ಲ. 2. **ಅಧಿಕಾರ**: repository owner ಮಾತ್ರ `hotfix` ಲೇಬಲ್ ಅನ್ನು ಅನ್ವಯಿಸುತ್ತಾರೆ. ಲೇಬಲ್ವೇ ಅನುಮೋದನೆ — campaign PR ನಲ್ಲಿ ಎಂದಿಗೂ ಸ್ವಯಂ-ಸೇವೆಯಾಗಿ ಬಳಸಬೇಡಿ. 3. **ಸಾಕ್ಷ್ಯ**: ಬಿಟ್ಟುಬಿಟ್ಟ jobs ಮರು-ಮೌಲ್ಯೀಕರಿಸಬೇಕಾಗಿದ್ದ suiteನ ಹಿಂದಿನ ಸಂಪೂರ್ಣ-ಹಸಿರು heavy run ಮತ್ತು fixನ ಸ್ವಂತ ಮೊದಲು-fail-ಆಗಿ-ನಂತರ-pass-ಆದ testಗೆ PR body ಲಿಂಕ್ ಮಾಡುತ್ತದೆ. 4. **ವ್ಯಾಪ್ತಿ**: cherry-pick-only — ಕನಿಷ್ಠ fix ಮಾತ್ರ; refactors ಅಥವಾ ಸಂಬಂಧವಿಲ್ಲದ ಬದಲಾವಣೆಗಳು ಬೇಡ. ಬಿಟ್ಟುಬಿಟ್ಟ coverage/ratchet ಮೇಲ್ಮೈಯನ್ನು release branchನ ಮುಂದಿನ full run ಮೂಲಕ ಮರು-ಮೌಲ್ಯೀಕರಿಸಲಾಗುತ್ತದೆ (ನಿರಂತರ release-green) — ಈ lane WAITING ಅನ್ನು ಮಾತ್ರ ಬಿಟ್ಟುಬಿಡುತ್ತದೆ, validation ಅನ್ನು ಎಂದಿಗೂ ಅಲ್ಲ. Tests-only diffs (`tests/` ಅಡಿಯಲ್ಲಿ ಎಲ್ಲಾ files, `tests/e2e/` ಅಡಿಯಲ್ಲಿ ಯಾವುದೂ ಇಲ್ಲ) ಯಾವುದೇ label ಇಲ್ಲದೆಯೇ E2E matrix ಅನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಬಿಟ್ಟುಬಿಡುತ್ತವೆ. ## ವಿವರವಾದ ಪರಿಶೀಲನಾಪಟ್ಟಿ ### ಬಿಡುಗಡೆಗೆ ಮೊದಲು - [ ] ಈ releaseಗೆ ಗುರಿಪಡಿಸಿದ ಎಲ್ಲಾ PRಗಳನ್ನು `release/vX.Y.0` ಗೆ merge ಮಾಡಲಾಗಿದೆ - [ ] ಈ versionಗೆ ಸಂಬಂಧಿಸಿದ ಎಲ್ಲಾ open Linear/issue items ಅನ್ನು ಮುಚ್ಚಲಾಗಿದೆ ಅಥವಾ ಮುಂದಿನ milestoneಗೆ ಮುಂದೂಡಲಾಗಿದೆ - [ ] `release/vX.Y.0` branchನಲ್ಲಿ CI ಹಸಿರು ಸ್ಥಿತಿಯಲ್ಲಿದೆ - [ ] codeನಲ್ಲಿ `TODO(release)` markers ಇಲ್ಲ: `grep -r "TODO(release)" src/ open-sse/` - [ ] Docker base image ನವೀಕೃತವಾಗಿದೆ (ಪ್ರಸ್ತುತ `node:24.15.0-trixie-slim`) ### Version ಮತ್ತು Changelog - [ ] `/version-bump-cc ` ಅನ್ನು ಚಲಾಯಿಸಿ (Claude Code skill) - `package.json`, `electron/package.json` ಅನ್ನು bump ಮಾಡುತ್ತದೆ - ಕೊನೆಯ tagನಿಂದಾದ git commits ಆಧರಿಸಿ `CHANGELOG.md` ಅನ್ನು ಮರುರಚಿಸುತ್ತದೆ - README.md badges ಅನ್ನು ನವೀಕರಿಸುತ್ತದೆ - [ ] CHANGELOG.md ಅನ್ನು ಕೈಯಾರೆ ಪರಿಶೀಲಿಸಿ ಮತ್ತು ಅಗತ್ಯವಿದ್ದರೆ commit messages ಅನ್ನು ಸ್ವಚ್ಛಗೊಳಿಸಿ - [ ] `CHANGELOG.md` ನ ಇತ್ತೀಚಿನ semver section, `package.json` versionಗೆ ಸಮವಾಗಿದೆ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ - [ ] ಮುಂಬರುವ ಕೆಲಸಕ್ಕಾಗಿ `## [Unreleased]` ಅನ್ನು ಮೊದಲ changelog section ಆಗಿಯೇ ಇರಿಸಿ - [ ] `docs/openapi.yaml` ಅನ್ನು ನವೀಕರಿಸಿ → `info.version`, `package.json` versionಗೆ ಸಮವಾಗಿರಬೇಕು ### Code ಗುಣಮಟ್ಟ - [ ] `npm run lint` — 0 errors (warnings ಮೊದಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿವೆ) - [ ] `npm run typecheck:core` — ಸ್ವಚ್ಛ - [ ] `npm run typecheck:noimplicit:core` — ಸ್ವಚ್ಛ (strict) - [ ] `npm run check:cycles` — circular deps ಇಲ್ಲ - [ ] `npm run check:any-budget:t11` — budgetನೊಳಗೆ - [ ] `npm run check:route-validation:t06` — ಸ್ವಚ್ಛ - [ ] `npm run check:node-runtime` — ಬೆಂಬಲಿತ runtime ಕನಿಷ್ಠ ಮಿತಿ ಪೂರೈಸಲಾಗಿದೆ (`>=22.22.2 <23`, `>=24.0.0 <27`, `src/shared/utils/nodeRuntimeSupport.ts` ನಲ್ಲಿನ `SUPPORTED_NODE_RANGE` ಪ್ರಕಾರ; `package.json` ನ `engines` ಜೊತೆಗೆ ಹೊಂದಿಸಲಾಗಿದೆ) ### ಪರೀಕ್ಷೆ - [ ] `npm run test:unit` — ಉತ್ತೀರ್ಣ - [ ] `npm run test:vitest` — ಉತ್ತೀರ್ಣ (MCP server, autoCombo, cache) - [ ] `npm run test:coverage` — gate 60/60/60/60 ಪೂರೈಸಲಾಗಿದೆ (statements/lines/functions/branches) - [ ] `npm run test:integration` — ಉತ್ತೀರ್ಣ (ಬದಲಾವಣೆಗಳು DB / handlers ಅನ್ನು ಸ್ಪರ್ಶಿಸಿದರೆ) - [ ] `npm run test:combo:matrix` — ಉತ್ತೀರ್ಣ (combo strategy matrix: ಎಲ್ಲಾ 19 public routing strategiesಗಳ selection decisions ಅನ್ನು deterministic ಆಗಿ ಸಾಬೀತುಪಡಿಸುತ್ತದೆ; combo routing, strategy resolution ಅಥವಾ fallback logic ಅನ್ನು ಸ್ಪರ್ಶಿಸುವಾಗ ಚಲಾಯಿಸಿ) - [ ] `RUN_COMBO_LIVE=1 npm run test:combo:live` — **ಐಚ್ಛಿಕ/ಕೈಯಾರೆ** (gate ಹೊಂದಿರುವ real-upstream smoke; VPS `root@192.168.0.15` ನಿಂದ read-only DB snapshot ಅನ್ನು ಪಡೆಯುತ್ತದೆ; ನೈಜ providers ಅನ್ನು ಸಂಪರ್ಕಿಸುತ್ತದೆ, credits ಖರ್ಚಾಗುತ್ತವೆ; CI ನಲ್ಲಿ ಎಂದಿಗೂ ಚಲಿಸುವುದಿಲ್ಲ; gate ಇಲ್ಲದೆ ಸ್ವಚ್ಛವಾಗಿ skip ಆಗುತ್ತದೆ) - [ ] `npm run test:combo:live:vps` — **ಐಚ್ಛಿಕ/ಕೈಯಾರೆ** (Phase-3 VPS live smoke: plain Node ESM ಮೂಲಕ live `.15` server ವಿರುದ್ಧ 7 HTTP scenarios; `ssh root@192.168.0.15` ಅಗತ್ಯವಿದೆ; `__live_test__*` combos ಅನ್ನು ಮಾತ್ರ ರಚಿಸುತ್ತದೆ/ಅಳಿಸುತ್ತದೆ; ನೈಜ providers ಅನ್ನು ಸಂಪರ್ಕಿಸುತ್ತದೆ; CI ನಲ್ಲಿ ಎಂದಿಗೂ ಚಲಿಸುವುದಿಲ್ಲ) - [ ] `npm run test:e2e` — ಉತ್ತೀರ್ಣ (UI ಬದಲಾವಣೆಗಳು) - [ ] `npm run test:protocols:e2e` — ಉತ್ತೀರ್ಣ (MCP/A2A ಬದಲಾವಣೆಗಳು) - [ ] `npm run test:ecosystem` — ಉತ್ತೀರ್ಣ ### Hooks (Husky ಮೂಲಕ ಮೌಲ್ಯೀಕರಿಸಲಾಗಿದೆ) Husky hooks `.husky/` ನಲ್ಲಿ ಇರುತ್ತವೆ ಮತ್ತು git operations ಸಮಯದಲ್ಲಿ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಚಲಿಸುತ್ತವೆ. - **pre-commit:** `npx lint-staged + node scripts/check/check-docs-sync.mjs + npm run check:any-budget:t11` - **pre-push:** ವೇಗವಾದ deterministic gates — `npm run check:any-budget:t11 && npm run check:tracked-artifacts` (2026-06-13 ರಂದು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ). ಉದ್ದೇಶಪೂರ್ವಕವಾಗಿ `test:unit` ಅನ್ನು ಹೊರತುಪಡಿಸುತ್ತದೆ (ನಿಧಾನ; CI `test-unit` job ಮೂಲಕ ಒಳಗೊಳ್ಳಲಾಗಿದೆ). - release branches ಅನ್ನು push ಮಾಡುವ ಮೊದಲು `npm run test:unit` ಅನ್ನು ಕೈಯಾರೆ ಚಲಾಯಿಸಿ. Hook ವಿಫಲವಾದರೆ: ಮೂಲ ಸಮಸ್ಯೆಯನ್ನು ಸರಿಪಡಿಸಿ, `--no-verify` ಬಳಸಿ bypass ಮಾಡಬೇಡಿ. ### Conventional Commits Releaseಗೆ ಹೋಗುವ ಎಲ್ಲಾ commits `type(scope): subject` ಸ್ವರೂಪವನ್ನು ಅನುಸರಿಸಬೇಕು. **ಮಾನ್ಯ types:** `feat`, `fix`, `refactor`, `docs`, `test`, `chore`, `perf`, `style`, `ci` **ಮಾನ್ಯ scopes:** `db`, `sse`, `oauth`, `dashboard`, `api`, `cli`, `docker`, `ci`, `mcp`, `a2a`, `memory`, `skills`, `cloud-agent`, `guardrails`, `compression`, `auto-combo`, `resilience`, `providers`, `executors`, `translator`, `domain`, `authz` Breaking changes: `BREAKING CHANGE:` footer ಅಥವಾ scope ನಂತರ `!` ಸೇರಿಸಿ (ಉದಾ. `feat(api)!: drop /v0`). ### ದಾಖಲೆಗಳು - [ ] `npm run check:docs-sync` ಯಶಸ್ವಿಯಾಗುತ್ತದೆ (pre-commit ಮೂಲಕ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಚಲಿಸುತ್ತದೆ) - [ ] `npm run check:docs-all` ಯಶಸ್ವಿಯಾಗುತ್ತದೆ (ಸಮಗ್ರ ಪರಿಶೀಲನೆ: docs-sync + docs-counts + env-doc-sync + deprecated-versions + doc-links) - [ ] `npm run check:env-doc-sync` 0 ನಿರ್ಗಮನ ಸ್ಥಿತಿಯೊಂದಿಗೆ ಮುಕ್ತಾಯಗೊಳ್ಳುತ್ತದೆ — ಕೋಡ್ ↔ `.env.example` ↔ `docs/reference/ENVIRONMENT.md` env ಒಪ್ಪಂದ ಅಖಂಡವಾಗಿದೆ - [ ] `npm run check:doc-links` 0 ನಿರ್ಗಮನ ಸ್ಥಿತಿಯೊಂದಿಗೆ ಮುಕ್ತಾಯಗೊಳ್ಳುತ್ತದೆ — ಪುನರ್ರಚನೆಯ ನಂತರ ಯಾವುದೇ ಮುರಿದ ಆಂತರಿಕ markdown ಉಲ್ಲೇಖಗಳಿಲ್ಲ - [ ] ಸಂಗ್ರಹಣೆ/runtime ವ್ಯತ್ಯಾಸಗಳಿಗಾಗಿ `docs/architecture/ARCHITECTURE.md` ಪರಿಶೀಲಿಸಲಾಗಿದೆ - [ ] env var ಮತ್ತು ಕಾರ್ಯಾಚರಣಾ ವ್ಯತ್ಯಾಸಗಳಿಗಾಗಿ `docs/guides/TROUBLESHOOTING.md` ಪರಿಶೀಲಿಸಲಾಗಿದೆ - [ ] `.env.example` ಬದಲಾಗಿದ್ದರೆ: `docs/reference/ENVIRONMENT.md` ನವೀಕರಿಸಲಾಗಿದೆ - [ ] ಹೊಸ ವೈಶಿಷ್ಟ್ಯವು UI ಹೊಂದಿದ್ದರೆ: `docs/guides/USER_GUIDE.md` ಅದನ್ನು ಉಲ್ಲೇಖಿಸುತ್ತದೆ - [ ] ಹೊಸ ವೈಶಿಷ್ಟ್ಯವು API ಹೊಂದಿದ್ದರೆ: `docs/reference/API_REFERENCE.md` + `docs/openapi.yaml` ನವೀಕರಿಸಲಾಗಿದೆ - [ ] ಹೊಸ ವೈಶಿಷ್ಟ್ಯವು ಮಾಡ್ಯೂಲ್ ಆಗಿದ್ದರೆ: ಅದಕ್ಕೆ ಮೀಸಲಾದ `docs/.md` ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ - [ ] ಇದು ಹೊಂದಾಣಿಕೆ ಮುರಿಯುವ ಬದಲಾವಣೆಯಾಗಿದ್ದರೆ: `docs/guides/TROUBLESHOOTING.md` ನಲ್ಲಿ ವಲಸೆ ಸೂಚನೆ ಇದೆ ### i18n - [ ] `npm run i18n:check` 0 ನಿರ್ಗಮನ ಸ್ಥಿತಿಯೊಂದಿಗೆ ಮುಕ್ತಾಯಗೊಳ್ಳುತ್ತದೆ — ಅನುವಾದ ಸ್ಥಿತಿ (`.i18n-state.json`) ಮೂಲ ದಸ್ತಾವೇಜುಗಳೊಂದಿಗೆ ಸಿಂಕ್ ಆಗಿದೆ (ಕಟ್ಟುನಿಟ್ಟಿನ ಮೋಡ್ನಲ್ಲಿ ವ್ಯತ್ಯಾಸಗೊಂಡ ಮೂಲಗಳಿಲ್ಲ; ಕೊನೆಯ ಕ್ಷಣದ ದಸ್ತಾವೇಜು ತಿದ್ದುಪಡಿಗಳಿಗೆ ಎಚ್ಚರಿಕೆ-ಮೋಡ್ ಸಲಹೆ ಸ್ವೀಕಾರಾರ್ಹ, ಆದರೆ ಟ್ಯಾಗ್ ಮಾಡುವ ಮೊದಲು ಇದು 0 ಆಗಿರಬೇಕು) - [ ] `npm run i18n:check-ui-coverage` 0 ನಿರ್ಗಮನ ಸ್ಥಿತಿಯೊಂದಿಗೆ ಮುಕ್ತಾಯಗೊಳ್ಳುತ್ತದೆ — ಪ್ರತಿಯೊಂದು UI locale 80% ವ್ಯಾಪ್ತಿ ಮಿತಿಯಲ್ಲಿ ಅಥವಾ ಅದಕ್ಕಿಂತ ಮೇಲಿರುತ್ತದೆ - [ ] `npm run i18n:sync-ui:dry` ಎಲ್ಲಾ 42 localeಗಳಲ್ಲಿ 0 ಕಾಣೆಯಾದ ಕೀಲಿಗಳನ್ನು ವರದಿ ಮಾಡುತ್ತದೆ - [ ] ಮೂಲ ಇಂಗ್ಲಿಷ್ ದಸ್ತಾವೇಜುಗಳು ಬದಲಾಗಿದ್ದರೆ, ಟ್ಯಾಗ್ ಮಾಡುವ ಮೊದಲು `npm run i18n:run` ಚಲಾಯಿಸಿ (`.env` ನಲ್ಲಿ `OMNIROUTE_TRANSLATION_API_KEY` ಅಗತ್ಯವಿದೆ) - [ ] ಸಣ್ಣ ಬದಲಾವಣೆಗಳಾಗಿದ್ದರೆ ಅನುವಾದ ಕೊಡುಗೆಗಳನ್ನು ಮುಂದಿನ ಬಿಡುಗಡೆಗೆ ಮುಂದೂಡಬಹುದು (CHANGELOG ನಲ್ಲಿ ದಾಖಲಿಸಿ) ### ಡೇಟಾಬೇಸ್ ವಲಸೆಗಳು - [ ] `src/lib/db/migrations/` ನಲ್ಲಿ ಹೊಸ ಫೈಲ್ಗಳಿದ್ದರೆ: - [ ] ಪ್ರತಿಯೊಂದು ವಲಸೆಯೂ idempotent ಆಗಿದೆ (`CREATE TABLE IF NOT EXISTS`, ಇತ್ಯಾದಿ) - [ ] ವಲಸೆಗಳನ್ನು transactions ನಲ್ಲಿ ಸುತ್ತುವರಿಯಲಾಗಿದೆ - [ ] ಸರಿಯಾಗಿ ಸಂಖ್ಯೆ ನೀಡಲಾಗಿದೆ (ಅನುಕ್ರಮದಲ್ಲಿ ಯಾವುದೇ ಅಂತರಗಳಿಲ್ಲ) - [ ] ಹೊಸ ಸ್ಥಾಪನೆಯಲ್ಲಿ ಪರೀಕ್ಷಿಸಿ: `~/.omniroute/omniroute.db` ಅಳಿಸಿ ಮತ್ತು `npm run dev` ಚಲಾಯಿಸಿ - [ ] ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಸ್ಥಾಪನೆಯಲ್ಲಿ ಪರೀಕ್ಷಿಸಿ: DB ಬ್ಯಾಕಪ್ ಮಾಡಿ, ವಲಸೆಯನ್ನು ಚಲಾಯಿಸಿ, schema ಪರಿಶೀಲಿಸಿ - [ ] ವಲಸೆಯು tables ಅನ್ನು ಪುನಃ ಬರೆಯುವುದಾದರೆ WAL ಫೈಲ್ಗಳನ್ನು (`-wal`, `-shm`) ಸರಿಯಾಗಿ ನಿರ್ವಹಿಸಲಾಗಿದೆ ### ಒದಗಿಸುವವರ ಕ್ಯಾಟಲಾಗ್ (Zod-ಮೌಲ್ಯೀಕೃತ) - [ ] `src/shared/constants/providers.ts` Zod schema ಲೋಡ್ ಸಮಯದಲ್ಲಿ ಮಾನ್ಯವಾಗಿದೆ - [ ] ಎಲ್ಲಾ ಒದಗಿಸುವವರು ಅಗತ್ಯವಿರುವ ಕ್ಷೇತ್ರಗಳನ್ನು (`id`, `label`, `kind`, ಇತ್ಯಾದಿ) ಹೊಂದಿದ್ದಾರೆ - [ ] ಹೊಸ ಉಚಿತ ಒದಗಿಸುವವರಿಗೆ `freeNote` ಒದಗಿಸಲಾಗಿದೆ - [ ] OAuth ಒದಗಿಸುವವರು `src/lib/oauth/constants/oauth.ts` ನಲ್ಲಿ ನೋಂದಾಯಿಸಲಾದ `oauthConfig` ಅನ್ನು ಹೊಂದಿದ್ದಾರೆ - [ ] ಹೊಸ ಒದಗಿಸುವವರನ್ನು ಸೇರಿಸಿದ್ದರೆ: `open-sse/executors/` ನಲ್ಲಿ ಅನುಗುಣವಾದ executor ಇದೆ - [ ] OpenAI ಅಲ್ಲದ ಸ್ವರೂಪವಾಗಿದ್ದರೆ: `open-sse/translator/` ನಲ್ಲಿ translator ಇದೆ - [ ] Models ಅನ್ನು `open-sse/config/providerRegistry.ts` ನಲ್ಲಿ ನೋಂದಾಯಿಸಲಾಗಿದೆ - [ ] `tests/unit/` ನಲ್ಲಿರುವ unit tests ಒದಗಿಸುವವರ ವರ್ಗೀಕರಣ ಮತ್ತು routing ಅನ್ನು ಒಳಗೊಳ್ಳುತ್ತವೆ ### ಡೆಸ್ಕ್ಟಾಪ್ (Electron) `electron/` ಬದಲಾಗಿದ್ದರೆ: - [ ] `npm run electron:smoke:packaged` ಯಶಸ್ವಿಯಾಗುತ್ತದೆ - [ ] `:win`, `:mac`, `:linux` ಇವುಗಳಲ್ಲಿ ಕನಿಷ್ಠ ಒಂದಕ್ಕಾಗಿ builds ಅನ್ನು ಪರೀಕ್ಷಿಸಲಾಗಿದೆ - [ ] Code signing certificates ಅವಧಿ ಮುಗಿದಿಲ್ಲ (signing ಮಾಡುತ್ತಿದ್ದರೆ) - [ ] `electron/package.json` version ಮೂಲ `package.json` ಗೆ ಹೊಂದಿಕೆಯಾಗುತ್ತದೆ - [ ] `stable` ಗೆ ಬಿಡುಗಡೆ ಮಾಡುತ್ತಿದ್ದರೆ auto-update channel pointer ಅನ್ನು ನವೀಕರಿಸಲಾಗಿದೆ ### Build ವಿನ್ಯಾಸ ರೆಪೊಸಿಟರಿಯು ಮೂರು ವಿಭಿನ್ನ output directories ಅನ್ನು ಬಳಸುತ್ತದೆ — ಅವುಗಳನ್ನು ಎಂದಿಗೂ ಗೊಂದಲಗೊಳಿಸಬೇಡಿ: | ಡೈರೆಕ್ಟರಿ | ಉದ್ದೇಶ | ಟ್ರ್ಯಾಕ್ ಮಾಡಲಾಗಿದೆಯೇ? | | --------- | --------------------------------------------------------------- | --------------------- | | `src/` | ಅಪ್ಲಿಕೇಶನ್ ಮೂಲ (TypeScript / TSX) | ಹೌದು | | `.build/` | Build ಮಧ್ಯಂತರಗಳು — `next build` output (`distDir`) | ಇಲ್ಲ (gitignored) | | `dist/` | ವಿತರಿಸಬಹುದಾದ npm bundle — `assembleStandalone` ಮೂಲಕ ಜೋಡಿಸಲಾಗಿದೆ | ಇಲ್ಲ (gitignored) | > **ನಿರ್ವಾಹಕರ ಸೂಚನೆ:** ದೂರಸ್ಥ VPS image ಡೈರೆಕ್ಟರಿಯು `/usr/lib/node_modules/omniroute/app/` ಆಗಿಯೇ ಉಳಿಯುತ್ತದೆ. > **ರೆಪೊಸಿಟರಿಯೊಳಗಿನ** build output ಮಾತ್ರ ಸ್ಥಳಾಂತರಗೊಂಡಿದೆ (`app/` → `dist/`). Deploy skills > `dist/` ನ ವಿಷಯಗಳನ್ನು ದೂರಸ್ಥ `app/` dir ಗೆ rsync ಮಾಡುತ್ತವೆ — ಯಾವುದೇ VPS path ಬದಲಾವಣೆಗಳು ಅಗತ್ಯವಿಲ್ಲ. **ಏಕ-build ಹರಿವು:** ``` npm run build:release └─ rm -rf .build dist (ಸ್ವಚ್ಛಗೊಳಿಸುವಿಕೆ) └─ next build → .build/next/ (ಮಧ್ಯಂತರಗಳು) └─ assembleStandalone (standalone + static + public + natives ಅನ್ನು dist/ ಗೆ ನಕಲಿಸುತ್ತದೆ) └─ writes dist/BUILD_SHA (HEAD sentinel ಅನ್ನು ಬರೆಯುತ್ತದೆ) ``` Deploy ಗಾಗಿ `npm run build` ಚಲಾಯಿಸಿ ನಂತರ ಪ್ರತ್ಯೇಕವಾಗಿ `npm run build:cli` ಚಲಾಯಿಸಬೇಡಿ — ಒಂದೇ command ನಲ್ಲಿ ಸ್ವಚ್ಛ ಮರುನಿರ್ಮಾಣ + sentinel ಮಾಡುವ `npm run build:release` ಅನ್ನು ಬಳಸಿ. ### Artifact ಮೌಲ್ಯೀಕರಣ - [ ] `npm run build:release` ಯಶಸ್ವಿಯಾಗುತ್ತದೆ ಮತ್ತು `dist/BUILD_SHA` == `git rev-parse --short HEAD` - [ ] `npm run check:pack-artifact` ಸ್ವಚ್ಛವಾಗಿದೆ — `app.__qa_backup`, `scripts/scratch`, `package-lock.json`, ಅಥವಾ ಇತರ ಸ್ಥಳೀಯ ಅವಶೇಷಗಳಿಲ್ಲ - [ ] Build ನಂತರ `dist/server.js` ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ - [ ] ಐಚ್ಛಿಕ ಸ್ಥಳೀಯ packaged-runtime smoke: `npm run dev:candidate -- build` ನಂತರ `npm run dev:candidate -- validate` ಪ್ರತ್ಯೇಕಿಸಿದ `DATA_DIR` ನಲ್ಲಿ packed tarball ಅನ್ನು boot ಮಾಡುತ್ತದೆ ಮತ್ತು `/api/health` + `/v1/models` ಅನ್ನು ಪರಿಶೀಲಿಸುತ್ತದೆ ([Contribution Golden Path](CONTRIBUTION_GOLDEN_PATH.md#local-candidate-loop) ನೋಡಿ) ### ಟ್ಯಾಗಿಂಗ್ ಮತ್ತು ಬಿಡುಗಡೆ - [ ] `/generate-release-cc` (Claude Code skill) ಚಲಾಯಿಸಿ: - `vX.Y.Z` tag ರಚಿಸುತ್ತದೆ - Tag ಮತ್ತು branch ಅನ್ನು push ಮಾಡುತ್ತದೆ - Changelog body ಜೊತೆಗೆ GitHub Release ತೆರೆಯುತ್ತದೆ - Electron installers ಅನ್ನು ಲಗತ್ತಿಸುತ್ತದೆ (build ಮಾಡಿದ್ದರೆ) - [ ] ಅಥವಾ ಕೈಯಾರೆ: ```bash git tag -a vX.Y.Z -m "Release vX.Y.Z" git push origin vX.Y.Z gh release create vX.Y.Z --notes-from-tag ``` ### ನಿಯೋಜನೆ Deploy skills ಹಗುರವಾದ rsync ಹರಿವನ್ನು ಬಳಸುತ್ತವೆ — `npm pack` ಇಲ್ಲ, `npm i -g` ಇಲ್ಲ: - [ ] ಗುರಿಗೆ ಹೊಂದಿಕೆಯಾಗುವ deploy skill ಅನ್ನು ಬಳಸಿ: - `/deploy-vps-local-cc` — ಸ್ಥಳೀಯ VPS (192.168.0.15) - `/deploy-vps-akamai-cc` — Akamai VPS (69.164.221.35) - `/deploy-vps-both-cc` — ಎರಡೂ - [ ] ನಿಯೋಜಿಸುವ ಮೊದಲು, `dist/BUILD_SHA` == `git rev-parse --short HEAD` ಎಂದು ದೃಢೀಕರಿಸಿ - [ ] `node_modules` ನೈಜವಾಗಿರುವಲ್ಲಿ build ಚಲಾಯಿಸಬೇಕು (ಮುಖ್ಯ checkout ಅಥವಾ `npm ci` ಚಲಾಯಿಸಿದ worktree — symlink ಮಾಡಲಾದ worktree ಅಲ್ಲ) - [ ] ನಿಯೋಜಿಸಲಾದ instance ಅನ್ನು smoke test ಮಾಡಿ: - `/dashboard/health` ತೆರೆಯಿರಿ → version string releaseಗೆ ಹೊಂದಿಕೆಯಾಗುತ್ತದೆಯೇ ಎಂದು ಪರಿಶೀಲಿಸಿ - ತಿಳಿದಿರುವ provider ವಿರುದ್ಧ `/v1/chat/completions` request ಅನ್ನು ಚಲಾಯಿಸಿ - `/api/monitoring/health`, `CLOSED` circuit breakers ಅನ್ನು ಹಿಂದಿರುಗಿಸುತ್ತದೆ ಎಂದು ಪರಿಶೀಲಿಸಿ - MCP transports ಪ್ರತಿಕ್ರಿಯಿಸುತ್ತವೆ ಎಂದು ದೃಢೀಕರಿಸಿ (`/mcp` HTTP, `/mcp-sse` SSE) ### ಬಿಡುಗಡೆ ನಂತರ - [ ] `/capture-release-evidences-cc` ಅನ್ನು ಚಲಾಯಿಸಿ (Claude Code skill) - ಹೊಸ ವೈಶಿಷ್ಟ್ಯಗಳ WebP screenshots/recordings ಅನ್ನು ಸೆರೆಹಿಡಿಯುತ್ತದೆ - ಅವುಗಳನ್ನು release notes / blog postಗೆ ಲಗತ್ತಿಸುತ್ತದೆ - [ ] release announcementನೊಂದಿಗೆ GitHub Discussions / Discord ಅನ್ನು ನವೀಕರಿಸಿ - [ ] ಮುಂದಿನ versionಗಾಗಿ milestone ತೆರೆಯಿರಿ - [ ] ನಿರ್ಣಾಯಕವಾಗಿದ್ದರೆ: in-app bannerಗಾಗಿ discussion ಅನ್ನು pin ಮಾಡಿ ಅಥವಾ `news.json` ನಲ್ಲಿ post ಮಾಡಿ ### Radar ಸಾರ್ವಜನಿಕ-ಬಿಡುಗಡೆ gate Radar announcement ಅನ್ನು ಉದ್ದೇಶಪೂರ್ವಕವಾಗಿ `active: false` ನೊಂದಿಗೆ commit ಮಾಡಲಾಗಿದೆ. ಕೆಳಗಿನ ಪ್ರತಿಯೊಂದು ಅಂಶಕ್ಕೂ ಪುರಾವೆ ದೊರೆತ ನಂತರ activation ಒಂದು ಪ್ರತ್ಯೇಕ ಬದಲಾವಣೆಯಾಗಿರುತ್ತದೆ: - [ ] ಎಲ್ಲಾ stacked Radar PRs merge ಆಗಿವೆ ಮತ್ತು release-tip CI ಹಸಿರಾಗಿದೆ - [ ] `RADAR_ENABLED` ಅನ್ನು ಇನ್ನೂ ಪೂರ್ವನಿಯೋಜಿತವಾಗಿ off ಆಗಿಯೇ ಇರಿಸಿ OSS Radar routes ಅನ್ನು deploy ಮಾಡಿ ಮತ್ತು smoke test ಮಾಡಿ - [ ] ಹೆಸರಿಸಲಾದ Radar hostನಲ್ಲಿ `GET /planos`, `/termos`, `/privacidade`, ಮತ್ತು `/reembolso` ಅನ್ನು smoke test ಮಾಡಿ - [ ] ಖಾಸಗಿ serviceನಲ್ಲಿ operator identity/contact/address ಮತ್ತು owner ಅನುಮೋದಿಸಿದ legal review ಅನ್ನು ದಾಖಲಿಸಿ - [ ] test modeನಲ್ಲಿ ಮಾತ್ರ Stripe Checkout ಮತ್ತು signed webhook ಅನ್ನು ಪರೀಕ್ಷಿಸಿ - [ ] ಅನುಮೋದಿತ sender/domainನೊಂದಿಗೆ ಒಂದು encrypted transactional-email delivery ಅನ್ನು ಪರೀಕ್ಷಿಸಿ - [ ] backup restore ಮತ್ತು ಮೇಲ್ವಿಚಾರಣೆಯಲ್ಲಿರುವ, budget ಮಿತಿಗೊಳಿಸಿದ ಒಂದು research run ಅನ್ನು ಸಾಬೀತುಪಡಿಸಿ - [ ] donation evidence ಅನ್ನು ಸ್ವೀಕರಿಸುವ ಮೊದಲು BRL/PIX review policy ಅನ್ನು ಅನುಮೋದಿಸಿ - [ ] ಹಿಂದಿನ gates ಪೂರ್ಣಗೊಂಡ ನಂತರವೇ public Checkout ಅನ್ನು enable ಮಾಡಿ, ನಂತರ ಹೊಸ `news.json` ID ಅನ್ನು activate ಮಾಡಿ - [ ] Home banner ಸ್ಥಳೀಕರಿಸಿದ copy ಅನ್ನು ಬಳಸುತ್ತದೆ ಮತ್ತು ಹಳೆಯ ID ಒಂದನ್ನು dismiss ಮಾಡಿದ ನಂತರ ಹೊಸ ID ಮತ್ತೆ ಕಾಣಿಸಿಕೊಳ್ಳುತ್ತದೆ ಎಂದು ಪರಿಶೀಲಿಸಿ ## ಎಂಬೆಡೆಡ್ ಸರ್ವೀಸ್ಗಳ ಸ್ಮೋಕ್ ಪರೀಕ್ಷೆ (v3.8.4+) ಎಂಬೆಡೆಡ್ ಸರ್ವೀಸ್ಗಳ ಬದಲಾವಣೆಗಳನ್ನು ಒಳಗೊಂಡಿರುವ ಯಾವುದೇ ಬಿಡುಗಡೆಗೂ ಮೊದಲು, ಇವುಗಳನ್ನು ಪರಿಶೀಲಿಸಿ: ### ಹೊಸ-DB ಬೂಟ್ (`migration` ಘರ್ಷಣೆಗಳನ್ನು ಪತ್ತೆಹಚ್ಚುತ್ತದೆ — v3.8.4 ಹಾಟ್ಫಿಕ್ಸ್ ನಂತರ ಸೇರಿಸಲಾಗಿದೆ) - [ ] `DATA_DIR=$(mktemp -d) npm start &` — ಬೂಟ್ಗಾಗಿ 10 ಸೆಕೆಂಡು ಕಾಯಿರಿ - [ ] `curl -s http://127.0.0.1:20128/api/services/9router/status | jq '.tool'` `"9router"` ಅನ್ನು ಹಿಂದಿರುಗಿಸುತ್ತದೆ (404 ಅಲ್ಲ, 500 ಅಲ್ಲ). `071_services.sql` ಮೈಗ್ರೇಶನ್ ಅನ್ವಯಿಸಲಾಗಿದೆ + ಸಾಲು ಸೀಡ್ ಮಾಡಲಾಗಿದೆ ಎಂಬುದನ್ನು ದೃಢೀಕರಿಸುತ್ತದೆ. - [ ] `sqlite3 $DATA_DIR/storage.sqlite "PRAGMA table_info(version_manager);" | grep -E "provider_expose|logs_buffer_path|last_sync_at"` 3 ಸಾಲುಗಳನ್ನು ಹಿಂದಿರುಗಿಸುತ್ತದೆ. - [ ] `sqlite3 $DATA_DIR/storage.sqlite "PRAGMA table_info(webhooks);" | grep -E "kind|metadata_encrypted"` 2 ಸಾಲುಗಳನ್ನು ಹಿಂದಿರುಗಿಸುತ್ತದೆ (`070_webhooks_kind_metadata.sql` ಅನ್ವಯಿಸಲಾಗಿದೆ ಎಂಬುದನ್ನು ಮೌಲ್ಯೀಕರಿಸುತ್ತದೆ). - [ ] `node --import tsx/esm --test tests/unit/db/no-migration-collisions.test.ts` ಯಶಸ್ವಿಯಾಗುತ್ತದೆ — ಭವಿಷ್ಯದ ಘರ್ಷಣೆಗಳಿಂದ ರಕ್ಷಿಸುತ್ತದೆ. ### 9Router - [ ] `POST /api/services/9router/install` 2 ನಿಮಿಷಗಳೊಳಗೆ `installedVersion` ಜೊತೆಗೆ 200 ಅನ್ನು ಹಿಂದಿರುಗಿಸುತ್ತದೆ - [ ] `POST /api/services/9router/start` 30 ಸೆಕೆಂಡುಗಳೊಳಗೆ 200 ಮತ್ತು `state: "running"` ಅನ್ನು ಹಿಂದಿರುಗಿಸುತ್ತದೆ - [ ] `GET /api/services/9router/status` `health: "healthy"` ಎಂದು ವರದಿ ಮಾಡುತ್ತದೆ - [ ] `"model": "9router/auto/..."` ಹೊಂದಿರುವ `POST /v1/chat/completions` 200 ಅನ್ನು ಹಿಂದಿರುಗಿಸುತ್ತದೆ (9Router ಮೂಲಕ ಎಂಡ್-ಟು-ಎಂಡ್ ರೂಟಿಂಗ್) - [ ] `GET /dashboard/providers/services/9router/embed/dashboard` ಪ್ರಾಕ್ಸಿಯೊಳಗೆ 9Router ನೇಟಿವ್ UI ಅನ್ನು ರೆಂಡರ್ ಮಾಡುತ್ತದೆ (ನೇರ `127.0.0.1:port` iframe ಇಲ್ಲ) - [ ] `POST /api/services/9router/rotate-key` `{ keyRotated: true }` ಅನ್ನು ಹಿಂದಿರುಗಿಸುತ್ತದೆ ಮತ್ತು ಸರ್ವೀಸ್ ದೋಷರಹಿತವಾಗಿ ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ - [ ] `POST /api/services/9router/stop` 200 ಮತ್ತು `state: "stopped"` ಅನ್ನು ಹಿಂದಿರುಗಿಸುತ್ತದೆ - [ ] `GET /api/services/9router/logs?tail=50` ಇತ್ತೀಚಿನ ಸಾಲುಗಳನ್ನು ಒಳಗೊಂಡ `snapshot` ಈವೆಂಟ್ ಇರುವ SSE ಸ್ಟ್ರೀಮ್ ಅನ್ನು ಹಿಂದಿರುಗಿಸುತ್ತದೆ - [ ] PATH ನಲ್ಲಿ `npm` ಇಲ್ಲದ ಪರಿಸರದಲ್ಲಿ ಇನ್ಸ್ಟಾಲ್ ಮಾಡುವಾಗ, ಸ್ನೇಹಪರವಾದ (ಸ್ಟ್ಯಾಕ್-ಟ್ರೇಸ್ ಅಲ್ಲದ) ದೋಷ ಸಂದೇಶದೊಂದಿಗೆ 500 ಅನ್ನು ಹಿಂದಿರುಗಿಸುತ್ತದೆ ### CLIProxyAPI - [ ] `POST /api/services/cliproxy/install` 2 ನಿಮಿಷಗಳೊಳಗೆ 200 ಅನ್ನು ಹಿಂದಿರುಗಿಸುತ್ತದೆ - [ ] `POST /api/services/cliproxy/start` 30 ಸೆಕೆಂಡುಗಳೊಳಗೆ 200 ಮತ್ತು `state: "running"` ಅನ್ನು ಹಿಂದಿರುಗಿಸುತ್ತದೆ - [ ] `GET /api/services/cliproxy/status` `health: "healthy"` ಎಂದು ವರದಿ ಮಾಡುತ್ತದೆ - [ ] `POST /api/services/cliproxy/stop` 200 ಮತ್ತು `state: "stopped"` ಅನ್ನು ಹಿಂದಿರುಗಿಸುತ್ತದೆ - [ ] `GET /api/services/cliproxy/logs?tail=50` SSE ಸ್ಟ್ರೀಮ್ ಅನ್ನು ಹಿಂದಿರುಗಿಸುತ್ತದೆ ### ಭದ್ರತಾ ರಿಗ್ರೆಷನ್ - [ ] `curl -H "X-Forwarded-For: 1.2.3.4" http://localhost:20128/api/services/9router/start` `403 LOCAL_ONLY` ಅನ್ನು ಹಿಂದಿರುಗಿಸುತ್ತದೆ - [ ] `curl -H "X-Forwarded-For: 1.2.3.4" http://localhost:20128/api/services/cliproxy/start` `403 LOCAL_ONLY` ಅನ್ನು ಹಿಂದಿರುಗಿಸುತ್ತದೆ - [ ] `/api/services/*` ನಿಂದ ಬರುವ ದೋಷ ಪ್ರತಿಕ್ರಿಯೆಗಳು `err.stack` ಅಥವಾ ಸಂಪೂರ್ಣ ಫೈಲ್ ಪಥಗಳನ್ನು ಒಳಗೊಂಡಿರುವುದಿಲ್ಲ ## v3.8.0+ ಪರಿಶೀಲನೆಗಳು ಯಾವುದೇ v3.8.x ಬಿಡುಗಡೆಯನ್ನು ರವಾನಿಸುವ ಮೊದಲು, ಈ ಹೆಚ್ಚುವರಿ ಅಂಶಗಳನ್ನು ಪರಿಶೀಲಿಸಿ: - [ ] `omniroute --tray` macOS ನಲ್ಲಿ ಬೂಟ್ ಆಗುತ್ತದೆ (`~/.omniroute/runtime/` ಗೆ systray2 ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲಾಗಿದೆ) - [ ] `omniroute --tray` Linux ನಲ್ಲಿ ಬೂಟ್ ಆಗುತ್ತದೆ (DISPLAY ಅಗತ್ಯವಿದೆ; ಹೊಂದಿಸದಿದ್ದರೆ ಸಮರ್ಪಕ ದೋಷ) - [ ] `omniroute --tray` Windows ನಲ್ಲಿ ಬೂಟ್ ಆಗುತ್ತದೆ (PowerShell NotifyIcon, ಹೆಚ್ಚುವರಿ ಬೈನರಿಗಳಿಲ್ಲ) - [ ] `omniroute config tray enable` ಸ್ವಯಂಪ್ರಾರಂಭದ ನಮೂದನ್ನು ರಚಿಸುತ್ತದೆ; ನಿಷ್ಕ್ರಿಯಗೊಳಿಸುವುದರಿಂದ ಅದನ್ನು ತೆಗೆದುಹಾಕಲಾಗುತ್ತದೆ - [ ] `npm install -g omniroute@` ಗಂಭೀರ ನಿರ್ಗಮನವಿಲ್ಲದೆ postinstall ಅನ್ನು ಚಲಾಯಿಸುತ್ತದೆ - [ ] ನವೀಕರಣದ ಪಥವು ಐಚ್ಛಿಕ ಅವಲಂಬನೆಗಳನ್ನು ಉಳಿಸಿಕೊಳ್ಳುತ್ತದೆ: `omniroute update --apply` ಮತ್ತು ಸ್ವಯಂ-ಅಪ್ಡೇಟರ್ `npm install -g … --include=optional` ಅನ್ನು ಚಲಾಯಿಸುತ್ತವೆ, ಆದ್ದರಿಂದ `optionalDependencies` (better-sqlite3, keytar, tls-client, ಮತ್ತು llmlingua SLM ಸ್ಟ್ಯಾಕ್: `@atjsh/llmlingua-2@2.0.5`, `js-tiktoken`) ನವೀಕರಣದ ನಂತರವೂ ಉಳಿಯುತ್ತವೆ. ಅಲ್ಟ್ರಾ `modelPath` SLM ಹಂತಕ್ಕೆ tinybert ಮಾಡೆಲ್ ಕೂಡ ಅಗತ್ಯವಿದೆ; ಮೊದಲ ಬಳಕೆಯಲ್ಲಿ ಅದನ್ನು `${DATA_DIR}/models/llmlingua` ಗೆ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಡೌನ್ಲೋಡ್ ಮಾಡಲಾಗುತ್ತದೆ. ನಂತರ Postinstall (`scripts/build/colocateOptionals.mjs`) SLM ಐಚ್ಛಿಕ ಕ್ಲೋಶರ್ ಅನ್ನು `dist/node_modules` ನಲ್ಲಿ ಸಹ-ಸ್ಥಾಪಿಸುತ್ತದೆ, ಇದರಿಂದ ವರ್ಕರ್ ಒಂದೇ `@huggingface/transformers` ^4.2.0 ಇನ್ಸ್ಟೆನ್ಸ್ ಅನ್ನು ಪರಿಹರಿಸುತ್ತದೆ — ಸ್ವತಂತ್ರ ಟ್ರೇಸ್ ಕೇವಲ transformers ಅನ್ನು ಬಂಡಲ್ ಮಾಡುತ್ತದೆ, ಡೈನಾಮಿಕ್ ಆಗಿ ಇಂಪೋರ್ಟ್ ಮಾಡಿದ ಐಚ್ಛಿಕಗಳನ್ನು ಅಲ್ಲ; ಆದ್ದರಿಂದ ಇದಿಲ್ಲದೆ ವರ್ಕರ್ ರೂಟ್ನ transformers ಜೊತೆಗೆ llmlingua-2 ಅನ್ನು ಲೋಡ್ ಮಾಡುತ್ತದೆ ಮತ್ತು SLM ಹಂತವು ಯಾವುದೇ ಸೂಚನೆಯಿಲ್ಲದೆ fail-open ಆಗುತ್ತದೆ. - [ ] `.env` ಇಲ್ಲದಿದ್ದರೂ `omniroute status` ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ (CLI ಟೋಕನ್ ಪಥ, ಲೂಪ್ಬ್ಯಾಕ್ ಮಾತ್ರ) - [ ] `curl http://localhost:20128/api/shutdown` 401 ಅನ್ನು ಹಿಂದಿರುಗಿಸುತ್ತದೆ (ಯಾವಾಗಲೂ-ರಕ್ಷಿತ ರೂಟ್) - [ ] `curl -H "host: evil.com" http://localhost:20128/api/mcp/sse` 401 ಅನ್ನು ಹಿಂದಿರುಗಿಸುತ್ತದೆ (ಲೂಪ್ಬ್ಯಾಕ್ ಗಾರ್ಡ್) - [ ] ಮೊದಲ ಚಾಲನೆಯಲ್ಲಿ SQLite ರನ್ಟೈಮ್ `bundled` ಗೆ ಪರಿಹಾರಗೊಳ್ಳುತ್ತದೆ (ಪ್ಲಾಟ್ಫಾರ್ಮ್ಗೆ ಬಂಡಲ್ ಮಾಡಿದ ಬೈನರಿ ಮಾನ್ಯವಾಗಿದೆ) - [ ] `node_modules/better-sqlite3` ಅಳಿಸಿದಾಗ SQLite ರನ್ಟೈಮ್ `runtime` ಗೆ ಫಾಲ್ಬ್ಯಾಕ್ ಆಗುತ್ತದೆ - [ ] ಸ್ಮಾರ್ಟ್ MCP ಫಿಲ್ಟರ್ ನೈಜ `playwright-mcp browser_snapshot` ಔಟ್ಪುಟ್ ಅನ್ನು ಸಂಕುಚಿಸುತ್ತದೆ (≥50% ಇಳಿಕೆ) - [ ] ಎಲ್ಲಾ 10 `skills/omniroute*/SKILL.md` ಫೈಲ್ಗಳನ್ನು raw GitHub URL ಮೂಲಕ ಸಾರ್ವಜನಿಕವಾಗಿ ಪಡೆಯಬಹುದು - [ ] ಹೊಸ ಸೆಟಪ್ನಲ್ಲಿ ಆನ್ಬೋರ್ಡಿಂಗ್ ವಿಜಾರ್ಡ್ "ಇದು ಹೇಗೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ" ಹಂತದ ಪರಿಚಯವನ್ನು ತೋರಿಸುತ್ತದೆ - [ ] ಹೋಮ್ ಡ್ಯಾಶ್ಬೋರ್ಡ್ನ ಹಂತದ ವ್ಯಾಪ್ತಿ ವಿಜೆಟ್ ಕಾನ್ಫಿಗರ್ ಮಾಡಿದ/ಸಕ್ರಿಯ ಸಂಖ್ಯೆಯನ್ನು ತೋರಿಸುತ್ತದೆ --- ## 3.9.0 LTS ಕಟ್ (3.8.58ರಲ್ಲಿ ಪೂರ್ವಾಭ್ಯಾಸ ಮಾಡಲಾಗಿದೆ) v3.8.59 ನಂತರದ ಮುಂದಿನ ಆವೃತ್ತಿ 3.9.0 ಆಗಿದ್ದು, ಅದರ ತುದಿಯು ದೀರ್ಘಕಾಲ ಉಳಿಯುವ ಎರಡು ಶಾಖೆಗಳಾಗುತ್ತದೆ: `stable/v3` (v3 LTS ಲೈನ್, npm `latest`) ಮತ್ತು `develop` (v4, 4.0.0ಗೆ ಹೆಚ್ಚಿಸಲಾಗಿದೆ, npm `nightly`). ಶಾಖೆ/ಚಾನೆಲ್ ಮಾದರಿ, ಫಾರ್ವರ್ಡ್-ಪೋರ್ಟ್ ಮತ್ತು ಲೇಬಲ್ಗಳು [RELEASE_STRATEGY.md](./RELEASE_STRATEGY.md)ನಲ್ಲಿವೆ; ಯೋಜನೆಯು [ROADMAP](../../ROADMAP.md)ನಲ್ಲಿ (ಹಂತ 3) ಇದೆ. ಕಟ್ ಒಮ್ಮೆ ಮಾತ್ರ ನಡೆಯುತ್ತದೆ; 3.8.58 ಅದನ್ನು ಫೋರ್ಕ್ನಲ್ಲಿ ಆರಂಭದಿಂದ ಅಂತ್ಯದವರೆಗೆ ಪೂರ್ವಾಭ್ಯಾಸ ಮಾಡುತ್ತದೆ ಮತ್ತು 3.8.59 [GO/NO-GO ಪರಿಶೀಲನಾಪಟ್ಟಿ](./LTS_GO_NO_GO.md)ಯೊಂದಿಗೆ ಮುಕ್ತಾಯಗೊಳ್ಳುತ್ತದೆ. ### ಡ್ರೈ-ರನ್ (ಓದಲು ಮಾತ್ರ, ಯಾವುದೇ ಸಮಯದಲ್ಲೂ ಸುರಕ್ಷಿತ) ```bash npm run release:dry-run-lts-cut # ನಿಜವಾದ ಕಟ್: HEADನಿಂದ 3.9.0, ಹಿಂದಿನ ಟ್ಯಾಗ್ v3.8.59 npm run release:dry-run-lts-cut -- --from <3.9.0-tip> # ಮೂಲ ಕಮಿಟ್ ಅನ್ನು ಪಿನ್ ಮಾಡಿ ``` `scripts/release/dry-run-lts-cut.mjs` ಯಾವುದನ್ನೂ ಕಾರ್ಯಗತಗೊಳಿಸುವುದಿಲ್ಲ: ಅದು git ಮತ್ತು `gh` ಅನ್ನು ಓದಿ ಸಂಪೂರ್ಣ ಅನುಕ್ರಮವನ್ನು ಮುದ್ರಿಸುತ್ತದೆ — ಪೂರ್ವಷರತ್ತುಗಳು (ಮೂಲವು ರೆಸಾಲ್ವ್ ಆಗುತ್ತದೆ, ಮೂಲ ರೆಪೊಸಿಟರಿಯು ಸಂಪೂರ್ಣ ಇತಿಹಾಸವನ್ನು ಹೊಂದಿದೆ — ಶ್ಯಾಲೋ ಕ್ಲೋನ್ `stable/v3` ಅನ್ನು ಪುಶ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ, ಮೊದಲ ಗ್ರಾಫ್ಟ್ ಮಾಡಿದ ಪೇರೆಂಟ್ನಲ್ಲಿ ಸ್ವೀಕರಿಸುವ ಪಾರ್ಶ್ವವು ಪ್ಯಾಕ್ ಅನ್ನು ತಿರಸ್ಕರಿಸುತ್ತದೆ, ಆದ್ದರಿಂದ ಸಂಪೂರ್ಣ ಕ್ಲೋನ್ನಿಂದ ಕಟ್ ಮಾಡಿ ಅಥವಾ ಮೊದಲು `git fetch --unshallow origin` ಚಲಾಯಿಸಿ — ಹಿಂದಿನ ಟ್ಯಾಗ್ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ, `package.json` ಗುರಿ ಆವೃತ್ತಿಯಾಗಿದೆ, `release-freeze` ಇಶ್ಯೂ ತೆರೆದಿದೆ, ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಬಿಡುಗಡೆ ಶಾಖೆಯಲ್ಲಿ ತೆರೆದಿರುವ `Release branch not green` ಇಶ್ಯೂ ಇಲ್ಲ — ಅಸ್ತಿತ್ವದಲ್ಲಿಲ್ಲದ ಶಾಖೆಯು `?` ಅಜ್ಞಾತ ಎಂದು ವರದಿ ಮಾಡುತ್ತದೆ, ಎಂದಿಗೂ ಹಸಿರು ಎಂದು ಅಲ್ಲ — Mergify `release` ಕ್ಯೂ ಅನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಲಾಗಿದೆ (G11: `queue_rules`, `checks_timeout`, ಲೇಬಲ್ `queue`), `release/*` ರೂಲ್ಸೆಟ್ ಇನ್ನೂ ಅಳಿಸುವಿಕೆ ಮತ್ತು ಫೋರ್ಸ್-ಪುಶ್ ಅನ್ನು ನಿರ್ಬಂಧಿಸುತ್ತದೆ ಮತ್ತು `stable/v3` ಹಾಗೂ `develop` ಇನ್ನೂ ಅಸ್ತಿತ್ವದಲ್ಲಿಲ್ಲ), ಎರಡು ಶಾಖೆಯ ಹಂತಗಳು, ಯಾವ ನಿಷ್ಕ್ರಿಯ-ವರ್ಕ್ಫ್ಲೋ ಟ್ರಿಗರ್ಗಳು ಮತ್ತು `if:` ಷರತ್ತುಗಳು ಸತ್ಯವಾಗುತ್ತವೆ (ಮತ್ತು ಯಾವುವು ರೆಪೊಸಿಟರಿ ವೇರಿಯಬಲ್ನಿಂದ ಇನ್ನೂ ಗೇಟ್ ಆಗಿರುತ್ತವೆ ಅಥವಾ ಕ್ಯಾನಾನಿಕಲ್ ರೆಪೊಸಿಟರಿಗೆ ಪಿನ್ ಆಗಿರುತ್ತವೆ), ನಿರೀಕ್ಷಿತ dist-tags (`latest` → 3.9.0, `next` ಮತ್ತು `nightly` ಖಾಲಿ) ಮತ್ತು ರೋಲ್ಬ್ಯಾಕ್. ನಿರ್ಗಮನ `0` = `RESULT: READY`, `1` = ನಿರ್ಬಂಧಿಸುವ ಪೂರ್ವಷರತ್ತು ವಿಫಲವಾಗಿದೆ (`✗`), `2` = ಬಳಕೆ ದೋಷ. `--advisory ` ಪರಿಶೀಲನೆಯನ್ನು ಮರೆಮಾಡದೆಯೇ ಎಚ್ಚರಿಕೆಗೆ (`!`) ಇಳಿಸುತ್ತದೆ. 3.9.0 ಬಿಡುಗಡೆ ಫ್ರೀಜ್ ಇನ್ನೂ ತೆರೆದಿರುವಾಗಲೇ ನಿಜವಾದ ಕಟ್ನ ಡ್ರೈ-ರನ್ ಅನ್ನು ಚಲಾಯಿಸಿ — ಟ್ಯಾಗ್ ನಂತರ ಮತ್ತು ಹಂತ 12c ಫ್ರೀಜ್ ಅನ್ನು ತೆರವುಗೊಳಿಸುವ ಮೊದಲು ಶಾಖೆಗಳನ್ನು ರಚಿಸಲಾಗುತ್ತದೆ. ### 3.8.58 ಪೂರ್ವಾಭ್ಯಾಸ (ಫೋರ್ಕ್ನಲ್ಲಿ ಮಾತ್ರ) ```bash # 1. ಪೂರ್ವಾಭ್ಯಾಸದ ಪ್ಯಾರಾಮೀಟರ್ಗಳೊಂದಿಗೆ ಪ್ರಸ್ತುತ ತುದಿಯಲ್ಲಿ ಡ್ರೈ-ರನ್ ಮಾಡಿ npm run release:dry-run-lts-cut -- --target-version 3.8.58 --previous-tag v3.8.57 \ --advisory freeze,base-green # 2. FORK ರಿಮೋಟ್ ವಿರುದ್ಧ ಕಾರ್ಯಗತಗೊಳಿಸಿ (origin ಅಥವಾ ಕ್ಯಾನಾನಿಕಲ್ # ರೆಪೊಸಿಟರಿಯ URL ಹೊಂದಿರುವ ಯಾವುದೇ ರಿಮೋಟ್ ಅನ್ನು ನಿರಾಕರಿಸಲಾಗುತ್ತದೆ; ಪ್ರತಿಯೊಂದು ಹಂತವೂ ಟರ್ಮಿನಲ್ನಲ್ಲಿ ದೃಢೀಕರಣವನ್ನು ಕೇಳುತ್ತದೆ) git remote add rehearsal https://github.com//OmniRoute.git node scripts/release/dry-run-lts-cut.mjs --execute --remote rehearsal \ --target-version 3.8.58 --previous-tag v3.8.57 --advisory freeze,base-green # 3. ಫೋರ್ಕ್ನಲ್ಲಿ ನಿಷ್ಕ್ರಿಯ ವರ್ಕ್ಫ್ಲೋಗಳನ್ನು ಪ್ರಯೋಗಿಸಿ (ಡ್ರೈ-ರನ್ # ಕ್ಯಾನಾನಿಕಲ್-ರೆಪೊಸಿಟರಿ ಪಿನ್ ಅನ್ನು ವರದಿ ಮಾಡುವಲ್ಲಿ workflow_dispatch), ನಂತರ ರೋಲ್ಬ್ಯಾಕ್ ಮಾಡಿ node scripts/release/dry-run-lts-cut.mjs --execute --rollback --remote rehearsal \ --target-version 3.8.58 --previous-tag v3.8.57 --advisory freeze,base-green ``` develop ಬಂಪ್ ಕಮಿಟ್ ಅನ್ನು git ಪ್ಲಂಬಿಂಗ್ನೊಂದಿಗೆ ನಿರ್ಮಿಸಲಾಗುತ್ತದೆ (ಯಾವುದೇ ವರ್ಕಿಂಗ್ ಟ್ರೀಯನ್ನು ಸ್ಪರ್ಶಿಸುವುದಿಲ್ಲ) ಮತ್ತು ಸೈಕಲ್-ಓಪನ್ ಕಮಿಟ್ನಂತೆಯೇ ಅದೇ ಐದು ಫೈಲ್ಗಳನ್ನು ಬಂಪ್ ಮಾಡುತ್ತದೆ: `package.json`, `open-sse/package.json`, `electron/package.json`, `package-lock.json` ಮತ್ತು `docs/openapi.yaml`. `[4.0.0]` CHANGELOG ವಿಭಾಗ ಮತ್ತು ಅದರ i18n ಮಿರರ್ಗಳನ್ನು ನಂತರ `develop`ನಲ್ಲಿ, ಅದರ ಮೊದಲ PRಗೂ ಮೊದಲು ತೆರೆಯಲಾಗುತ್ತದೆ. ಸ್ಕ್ರಿಪ್ಟ್ ಎಂದಿಗೂ npm dist-tags ಅನ್ನು ಬದಲಿಸುವುದಿಲ್ಲ — ಅವುಗಳನ್ನು ಸ್ಕ್ರ್ಯಾಚ್ ಪ್ಯಾಕೇಜ್ನಲ್ಲಿ ಪೂರ್ವಾಭ್ಯಾಸ ಮಾಡಿ. ### PR ಪೂರ್ವವೀಕ್ಷಣೆ ಆರ್ಟಿಫ್ಯಾಕ್ಟ್ (ಒಮ್ಮೆ ನಿರ್ಮಿಸಿ, ಅದೇ ಬೈಟ್ಗಳನ್ನು ಪ್ರಮೋಟ್ ಮಾಡಿ) `.github/workflows/preview-artifact.yml` PR ಹೆಡ್ನಿಂದ ಒಂದು ಪ್ರೊಡಕ್ಷನ್ ಟಾರ್ಬಾಲ್ ಅನ್ನು ನಿರ್ಮಿಸುತ್ತದೆ ಮತ್ತು ಅದೇ ನಿಖರವಾದ ಬಿಲ್ಡ್ ಅನ್ನು ಮೌಲ್ಯೀಕರಿಸುತ್ತದೆ (#8084 ಭಾಗ (a)). ಒಂದೇ ರೆಪೊಸಿಟರಿಯ PRಗಳು ಮಾತ್ರ; ಯಾವುದನ್ನೂ ಪ್ರಕಟಿಸಲಾಗುವುದಿಲ್ಲ. ```bash gh workflow run preview-artifact.yml -f pr_number= # ಅಥವಾ `preview-artifact` ಲೇಬಲ್ ಸೇರಿಸಿ gh run download --name preview-artifact-pr- --dir preview cd preview && sha256sum -c SHA256SUMS gh attestation verify omniroute-*.tgz --repo diegosouzapw/OmniRoute npm install -g ./omniroute-*.tgz # ಪೂರ್ವವೀಕ್ಷಣೆ ಇನ್ಸ್ಟಾಲ್ ``` ಈ ರನ್ `npm ci`, `npm run build:release`, `npm run check:pack-artifact` ಅನ್ನು ನಿರ್ವಹಿಸಿ, ಟಾರ್ಬಾಲ್ ಅನ್ನು ಪ್ಯಾಕ್ ಮಾಡುತ್ತದೆ, `npm run check:pack-boot` ಅನ್ನು ಚಲಾಯಿಸುತ್ತದೆ (ನಕಲಿ ಸೀಕ್ರೆಟ್ಗಳು, ತಾತ್ಕಾಲಿಕ ಡೇಟಾ ಡೈರೆಕ್ಟರಿ), ಮರು-ಪ್ಯಾಕ್ ಮಾಡುತ್ತದೆ ಮತ್ತು ಡೈಜೆಸ್ಟ್ ಒಂದೇ ಆಗಿರದಿದ್ದರೆ ವಿಫಲಗೊಳ್ಳುತ್ತದೆ; ನಂತರ `artifact-identity.json` (ಹೆಡ್ SHA, ಬೇಸ್ SHA, ಲಾಕ್ಫೈಲ್ ಹ್ಯಾಶ್, ಪ್ಲಾಟ್ಫಾರ್ಮ್, ಆರ್ಕಿಟೆಕ್ಚರ್, node ABI, ಬಂಡ್ಲರ್, ಬಿಲ್ಡ್ ನೀತಿ — `scripts/release/artifact-identity.mjs`) ಅನ್ನು ದಾಖಲಿಸಿ, ಪ್ರತ್ಯೇಕ ಜಾಬ್ನಲ್ಲಿ ಟಾರ್ಬಾಲ್ಗೆ ದೃಢೀಕರಣ ನೀಡುತ್ತದೆ. ಪೂರ್ವವೀಕ್ಷಣೆಯನ್ನು ಪ್ರಮೋಟ್ ಮಾಡುವುದು ಎಂದರೆ ಆ ಟಾರ್ಬಾಲ್ ಅನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡುವುದು: ಮೂಲದಿಂದ ಎಂದಿಗೂ ಮರುನಿರ್ಮಿಸಬೇಡಿ. ### ಕಟ್ (3.9.0, GO ನಂತರ) 1. GO ಅನ್ನು [LTS_GO_NO_GO.md](./LTS_GO_NO_GO.md)ನಲ್ಲಿ ದಾಖಲಿಸಲಾಗಿದೆ. 2. `npm run release:dry-run-lts-cut -- --from v3.9.0` `RESULT: READY` ಅನ್ನು ಮುದ್ರಿಸುತ್ತದೆ. 3. ಡ್ರೈ-ರನ್ ಮುದ್ರಿಸುವ ಕಮಾಂಡ್ಗಳೊಂದಿಗೆ `origin`ನಲ್ಲಿ ಶಾಖೆಗಳನ್ನು ಕೈಯಾರೆ ರಚಿಸಿ — ಸ್ಕ್ರಿಪ್ಟ್ `origin`ಗೆ ಪುಶ್ ಮಾಡಲು ನಿರಾಕರಿಸುತ್ತದೆ. ಪರಿಶೀಲಿಸಲಾದ develop ಕಮಿಟ್ ಅನ್ನು ಮರುಬಳಕೆ ಮಾಡಲು, ಮೊದಲು ನಿಮ್ಮ ಫೋರ್ಕ್ ವಿರುದ್ಧ 3.9.0 ತುದಿಯಲ್ಲಿ `--execute` ಪೂರ್ವಾಭ್ಯಾಸವನ್ನು ಚಲಾಯಿಸಿ; ಅದು ಎರಡೂ SHAಗಳನ್ನು ಮುದ್ರಿಸುತ್ತದೆ ಮತ್ತು ಅದೇ ಕಮಿಟ್ಗಳನ್ನು ಪುಶ್ ಮಾಡಬಹುದು: ```bash git push origin :refs/heads/stable/v3 :refs/heads/develop ``` 4. ಮೊದಲ PR ವಿಲೀನಗೊಳ್ಳುವ ಮೊದಲು `stable/v3` ಮತ್ತು `develop` ಅನ್ನು ಸಂರಕ್ಷಿಸಿ (ನಿಯಮಸಮೂಹಗಳು + ವಿಲೀನ ಸರತಿ). 5. ನಿಷ್ಕ್ರಿಯ ವರ್ಕ್ಫ್ಲೋಗಳು ಶಾಖೆಯ ಅಸ್ತಿತ್ವದ ಆಧಾರದ ಮೇಲೆ ಸಕ್ರಿಯಗೊಳ್ಳುತ್ತವೆ: `forward-port.yml` (`stable/v3` ಗೆ ಪುಶ್), `validate-stable-pr.yml` (`stable/v3` ಗೆ PRಗಳು) ಮತ್ತು `nightly-v4-build.yml` (`develop` ಅನ್ನು ಬಿಲ್ಡ್ ಮಾಡುತ್ತದೆ). ಲೈವ್ ಮಾಡುವ ಮೊದಲು, `secrets.FORWARD_PORT_TOKEN` ರೆಪೊಸಿಟರಿ ಸೀಕ್ರೆಟ್ ಅನ್ನು ಹೊಂದಿಸಿ (ಇದರಿಂದ ಫಾರ್ವರ್ಡ್-ಪೋರ್ಟ್ PRಗಳಲ್ಲಿ CI ರನ್ ಆಗುತ್ತದೆ); ಮಾಲೀಕರು `vars.NIGHTLY_PUBLISH` ರೆಪೊಸಿಟರಿ ವೇರಿಯೇಬಲ್ ಅನ್ನು `true` ಗೆ ಹೊಂದಿಸುವವರೆಗೆ ಮತ್ತು npm Trusted Publishing `nightly-v4-build.yml` ಅನ್ನು ಅಂಗೀಕರಿಸುವವರೆಗೆ ರಾತ್ರಿಯ ಪ್ರಕಟಣೆ ನಿಷ್ಕ್ರಿಯವಾಗಿಯೇ ಇರುತ್ತದೆ. ಚಾನೆಲ್ ನಿರ್ಧಾರಕವು `scripts/release/dist-tag.mjs` ಆಗಿದ್ದು, `npm-publish.yml` ಬಳಸುವ ಅದೇ ನಿರ್ಧಾರಕವಾಗಿದೆ. 6. ಚಾನೆಲ್ಗಳನ್ನು ಪರಿಶೀಲಿಸಿ: `npm view omniroute dist-tags --json` ನಲ್ಲಿ `latest` = 3.9.0 ಎಂದು ತೋರಿಸಬೇಕು ಮತ್ತು v4 ಪ್ರಕಟವಾಗುವವರೆಗೆ `next` / `nightly` ಇರಬಾರದು. 7. ಅಗತ್ಯವಿದ್ದರೆ ಹಿಂದಕ್ಕೆ ಹಿಂತಿರುಗಿಸಲು: `git push origin --delete refs/heads/stable/v3 refs/heads/develop` ಮತ್ತು `npm dist-tag add omniroute@3.8.59 latest`. --- ## ರೋಲ್ಬ್ಯಾಕ್ ಬಿಡುಗಡೆಯಲ್ಲಿ ಗಂಭೀರ ಸಮಸ್ಯೆಯಿದ್ದರೆ: 1. `gh release edit vX.Y.Z --prerelease` (ಇದು ಇತ್ತೀಚಿನ ಬಿಡುಗಡೆ ಅಲ್ಲ ಎಂದು ಗುರುತಿಸುತ್ತದೆ) 2. `git tag -d vX.Y.Z && git push --delete origin vX.Y.Z` (ಬಳಕೆದಾರರು ಇನ್ನೂ ಅಳವಡಿಸಿಕೊಳ್ಳದಿದ್ದರೆ ಮಾತ್ರ) 3. ಅಥವಾ: `release/vX.Y.0` ನಲ್ಲಿ ಹಾಟ್ಫಿಕ್ಸ್ → ಪ್ಯಾಚ್ ಬಿಡುಗಡೆ `vX.Y.(Z+1)` 4. GitHub Discussions ಮತ್ತು Discord ನಲ್ಲಿ ತಕ್ಷಣವೇ ತಿಳಿಸಿ ## ಕಟ್ಟುನಿಟ್ಟಿನ ನಿಯಮಗಳು - `main` ಗೆ ಎಂದಿಗೂ ನೇರವಾಗಿ ಕಮಿಟ್ ಮಾಡಬೇಡಿ - `main` ಅಥವಾ `release/*` ಶಾಖೆಗಳಿಗೆ ಎಂದಿಗೂ `git push --force` ಬಳಸಬೇಡಿ - Husky ಹುಕ್ಗಳನ್ನು (`--no-verify`) ಎಂದಿಗೂ ಬಿಟ್ಟುಬಿಡಬೇಡಿ - ರಹಸ್ಯಗಳು, ರುಜುವಾತುಗಳು ಅಥವಾ `.env` ಫೈಲ್ಗಳನ್ನು ಎಂದಿಗೂ ಕಮಿಟ್ ಮಾಡಬೇಡಿ - ಕವರೇಜ್ ≥60/60/60/60 (ಸ್ಟೇಟ್ಮೆಂಟ್ಗಳು/ಲೈನ್ಗಳು/ಫಂಕ್ಷನ್ಗಳು/ಬ್ರಾಂಚ್ಗಳು) ಆಗಿಯೇ ಉಳಿಯಬೇಕು - `src/`, `open-sse/`, `electron/`, ಅಥವಾ `bin/` ನಲ್ಲಿನ ಪ್ರೊಡಕ್ಷನ್ ಕೋಡ್ ಬದಲಾಯಿಸುವಾಗ ಯಾವಾಗಲೂ ಪರೀಕ್ಷೆಗಳನ್ನು ಸೇರಿಸಿ ಅಥವಾ ನವೀಕರಿಸಿ ## ಸ್ವಯಂಚಾಲಿತ ಸಿಂಕ್ ಪರಿಶೀಲನೆ PR ತೆರೆಯುವ ಮೊದಲು ಡಾಕ್ಸ್ ಸಿಂಕ್ ಗಾರ್ಡ್ ಅನ್ನು ಸ್ಥಳೀಯವಾಗಿ ರನ್ ಮಾಡಿ: ```bash npm run check:docs-sync ``` CI ಕೂಡ ಈ ಪರಿಶೀಲನೆಯನ್ನು `.github/workflows/ci.yml` ನಲ್ಲಿ (ಲಿಂಟ್ ಜಾಬ್) ರನ್ ಮಾಡುತ್ತದೆ.