# 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) · 🇮🇳 [kn](../../../kn/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) · 🇮🇳 [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 # സമ്പൂർണ്ണ കവറേജ് ഗേറ്റ് (60/60/60/60) # 3. ബിൽഡ് ചെയ്യുകയും സ്മോക്ക് ടെസ്റ്റ് നടത്തുകയും ചെയ്യുക 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 ഒഴിവാക്കുന്ന tokens പിൻവലിക്കപ്പെടുന്നതിനാൽ 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 ചെയ്യുക. ### ഘട്ടംഘട്ടമായ പ്രസിദ്ധീകരണം (അഭ്യർത്ഥനപ്രകാരം — `publish_mode=staged`) npm-publish workflow ഇനി നേരിട്ട് പ്രസിദ്ധീകരിക്കുന്നില്ല: അത് പാക്ക് ചെയ്ത tarball ബൂട്ട് ചെയ്യുകയും (`check:pack-boot`) തുടർന്ന് `npm stage publish` പ്രവർത്തിപ്പിക്കുകയും ചെയ്യുന്നു — കൃത്യമായ അതേ bytes registry-യിൽ സൂക്ഷിക്കപ്പെടുന്നു, ഉടമ അംഗീകരിക്കുന്നതുവരെ അവ **ഇൻസ്റ്റാൾ ചെയ്യാനാവില്ല**. മനുഷ്യ ഇടപെടലോടെയുള്ള 2FA gate, തെളിവിന് മുമ്പല്ല, അതിന് ശേഷത്തേക്കാണ് മാറ്റിയത്. **workflow ഗ്രീൻ ആയതിന് ശേഷമുള്ള ഉടമയുടെ പ്രവാഹം:** 1. `npm stage list omniroute` — stage id കണ്ടെത്തുക (workflow summary-യിലും ഇത് പ്രിന്റ് ചെയ്യപ്പെടും). 2. staged bytes പരിശോധിക്കുക (ശുപാർശ ചെയ്യുന്നു): `npm stage download `, തുടർന്ന് ഡൗൺലോഡ് ചെയ്ത tarball ഒരു താൽക്കാലിക prefix-ൽ ഇൻസ്റ്റാൾ ചെയ്ത് അത് ബൂട്ട് ചെയ്യുക (`npm run check:pack-boot`, CI-യിൽ ഇതേ pack→install→boot വിധി ഓട്ടോമേറ്റ് ചെയ്യുന്നു). 3. `npm stage approve ` — 2FA prompt തന്നെയാണ് പ്രസിദ്ധീകരണം. `npm stage reject ` അത് ഉപേക്ഷിക്കുന്നു. 4. പ്രസിദ്ധീകരണാനന്തര സുരക്ഷാവലയം: post-publish verifier (v3.8.49 പ്ലാനിലെ WS1.4), പ്രസിദ്ധീകരിച്ച പതിപ്പ് public registry-യിൽ നിന്ന് ഒരു ശുദ്ധമായ container-ൽ ഇൻസ്റ്റാൾ ചെയ്ത് ബൂട്ട് ചെയ്യുന്നു. **അടിയന്തര പകരംമാർഗം:** `publish_mode=direct` ഉപയോഗിച്ചുള്ള `workflow_dispatch`, പഴയ ഉടനടിയുള്ള `npm publish` പുനഃസ്ഥാപിക്കുന്നു (staging തന്നെ തെറ്റായി പ്രവർത്തിച്ചാൽ മാത്രം ഉപയോഗിക്കുക; കാരണം രേഖപ്പെടുത്തുക). **ഒറ്റത്തവണ ശക്തിപ്പെടുത്തൽ (ഉടമ, npmjs.com):** `omniroute`-നുള്ള Trusted Publisher stage-only മോഡിൽ ക്രമീകരിക്കുക; അങ്ങനെ ചോർന്ന ദീർഘകാല token-ന് എവിടെനിന്നും നേരിട്ട് `npm publish` ചെയ്യാൻ കഴിയില്ല — CI-ക്ക് stage ചെയ്യാൻ മാത്രമേ കഴിയൂ; ഉടമയുടെ 2FA മാത്രമാണ് റിലീസ് ചെയ്യുന്നത്. **തകരാറുള്ള artifact-നുള്ള നടപടിക്രമം (മാറ്റമില്ല):** ഡിഫോൾട്ട് പ്രതികരണമായി `npm deprecate omniroute@ " — use "` ഉപയോഗിക്കുക (മിനിറ്റുകൾക്കുള്ളിൽ, തിരിച്ചെടുക്കാവുന്നത്); 72h/no-dependents പരിധിക്കുള്ളിൽ മാത്രം `npm unpublish` ഉപയോഗിക്കുക, ഒരിക്കലും ആദ്യ നടപടിയായി ഉപയോഗിക്കരുത്. Docker: ഒരു version tag ഒരിക്കലും തിരുത്തിയെഴുതരുത് — rollback എന്നത് `latest`-നെ അവസാനം ശരിയായി പ്രവർത്തിച്ച digest-ലേക്ക് വീണ്ടും ചൂണ്ടുന്നതാണ്. **Docker Hub `latest` (ഓരോ സ്ഥിരതയുള്ള SemVer പ്രസിദ്ധീകരണത്തിലും നിർബന്ധം):** `docker-publish` workflow **രണ്ടും** tag ചെയ്യണം: `X.Y.Z`; കൂടാതെ, ഇതാണ് ഏറ്റവും ഉയർന്ന സ്ഥിരതയുള്ള SemVer എന്ന് `should-promote-latest.sh` അംഗീകരിക്കുമ്പോൾ, അതേ **digest** ഉപയോഗിച്ച് `:latest`-ഉം. job-ന് ശേഷം: Hub `latest` digest പുതിയ SemVer digest-ന് തുല്യമായിരിക്കണം, കൂടാതെ `last_updated` മാറിയിരിക്കണം. git-ൽ മാത്രം നിലവിലുള്ള പരിഹാരങ്ങളെക്കുറിച്ച് release notes പറയുമ്പോൾ, `:latest`-നെ പഴയ build-ൽ നിലനിർത്തരുത്. Compose quickstarts `: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. **തീവ്രത**: പ്രൊഡക്ഷൻ തകരാറിലാണ് — പ്രസിദ്ധീകരിച്ച ആർട്ടിഫാക്റ്റ് ബൂട്ട് ചെയ്യുമ്പോൾ ക്രാഷാകുന്നു / ഒരു സുരക്ഷാ പരിഹാരം / റിലീസിന്റെ എല്ലാ ഉപയോക്താക്കളെയും ബാധിക്കുന്നു. "പ്രധാനപ്പെട്ടത്" എന്നത് "തകരാറിലായത്" എന്നല്ല. 2. **അധികാരം**: repository ഉടമ മാത്രമേ `hotfix` ലേബൽ പ്രയോഗിക്കാവൂ. ലേബൽ തന്നെയാണ് അംഗീകാരം — campaign PR-ൽ ഒരിക്കലും സ്വയം പ്രയോഗിക്കരുത്. 3. **തെളിവ്**: PR ബോഡിയിൽ മുമ്പത്തെ പൂർണ്ണമായി വിജയിച്ച heavy run-ലേക്കുള്ള ലിങ്കും (ഒഴിവാക്കിയ jobs വീണ്ടും സാധൂകരിക്കുമായിരുന്ന suite), പരിഹാരത്തിന്റെ സ്വന്തം ആദ്യം പരാജയപ്പെടുകയും പിന്നീട് വിജയിക്കുകയും ചെയ്ത test-ഉം ഉണ്ടായിരിക്കണം. 4. **വ്യാപ്തി**: cherry-pick-only — ഏറ്റവും ചുരുങ്ങിയ പരിഹാരം മാത്രം; refactor-കളോ അനുബന്ധ മാറ്റങ്ങളോ പാടില്ല. ഒഴിവാക്കിയ coverage/ratchet ഉപരിതലം release branch-ലെ അടുത്ത full run വഴി വീണ്ടും സാധൂകരിക്കപ്പെടുന്നു (തുടർച്ചയായ release-green) — lane ഒഴിവാക്കുന്നത് കാത്തിരിപ്പാണ്, സാധൂകരണമല്ല. Tests-only diff-കൾ (`tests/`-ന് കീഴിലുള്ള എല്ലാ files-ഉം, `tests/e2e/`-ന് കീഴിൽ ഒന്നുമില്ലാത്തതും) യാതൊരു label-ഉം കൂടാതെ E2E matrix സ്വയമേവ ഒഴിവാക്കും. ## വിശദമായ ചെക്ക്ലിസ്റ്റ് ### റിലീസിന് മുമ്പ് - [ ] ഈ റിലീസിനെ ലക്ഷ്യമാക്കിയുള്ള എല്ലാ PR-കളും `release/vX.Y.0`-ലേക്ക് merge ചെയ്തിട്ടുണ്ട് - [ ] ഈ version-നുള്ള തുറന്നിരിക്കുന്ന എല്ലാ Linear/issue ഇനങ്ങളും അടച്ചിട്ടുണ്ട് അല്ലെങ്കിൽ അടുത്ത 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` എന്നിവയുടെ version ഉയർത്തുന്നു - അവസാന tag-ന് ശേഷമുള്ള git commit-ുകളിൽ നിന്ന് `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-ന് തുല്യമായിരിക്കണം ### കോഡ് ഗുണനിലവാരം - [ ] `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 routing strategies-ന്റെയും selection decisions നിർണിതമായി തെളിയിക്കുന്നു; 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: സാധാരണ Node ESM വഴി live `.15` server-നെതിരായ 7 HTTP scenarios; `ssh root@192.168.0.15` ആവശ്യമാണ്; `__live_test__*` combos മാത്രം സൃഷ്ടിക്കുകയും ഇല്ലാതാക്കുകയും ചെയ്യുന്നു; യഥാർത്ഥ providers-നെ സമീപിക്കുന്നു; CI-യിൽ ഒരിക്കലും പ്രവർത്തിക്കില്ല) - [ ] `npm run test:e2e` — വിജയിക്കുന്നു (UI changes) - [ ] `npm run test:protocols:e2e` — വിജയിക്കുന്നു (MCP/A2A changes) - [ ] `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:** വേഗമേറിയ നിർണിത 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` ഉപയോഗിച്ച് മറികടക്കരുത്. ### Conventional Commits റിലീസിൽ ഉൾപ്പെടുന്ന എല്ലാ commit-ുകളും `type(scope): subject` format പിന്തുടരണം. **സാധുവായ 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 റഫറൻസുകളൊന്നുമില്ല - [ ] സ്റ്റോറേജ്/റൺടൈം വ്യതിയാനങ്ങൾക്കായി `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`) ഉറവിട ഡോക്യുമെന്റുകളുമായി സമന്വയത്തിലാണ് (strict mode-ൽ വ്യതിചലിച്ച ഉറവിടങ്ങളില്ല; അവസാന നിമിഷ ഡോക്യുമെന്റ് തിരുത്തലുകൾക്ക് warn-mode മുന്നറിയിപ്പ് സ്വീകാര്യമാണ്, എന്നാൽ ടാഗ് ചെയ്യുന്നതിന് മുമ്പ് ഇത് 0 ആയിരിക്കണം) - [ ] `npm run i18n:check-ui-coverage` 0-ൽ പുറത്തുകടക്കുന്നു — എല്ലാ UI locale-കളും 80% കവറേജ് പരിധിയിലോ അതിനു മുകളിലോ ആണ് - [ ] `npm run i18n:sync-ui:dry` എല്ലാ 42 locale-കളിലുമായി നഷ്ടപ്പെട്ട key-കൾ 0 ആണെന്ന് റിപ്പോർട്ട് ചെയ്യുന്നു - [ ] ഉറവിട ഇംഗ്ലീഷ് ഡോക്യുമെന്റുകൾ മാറിയിട്ടുണ്ടെങ്കിൽ, ടാഗ് ചെയ്യുന്നതിന് മുമ്പ് `npm run i18n:run` പ്രവർത്തിപ്പിക്കുക (`.env`-ൽ `OMNIROUTE_TRANSLATION_API_KEY` ആവശ്യമാണ്) - [ ] ചെറിയ മാറ്റങ്ങളാണെങ്കിൽ വിവർത്തന സംഭാവനകൾ അടുത്ത റിലീസിലേക്ക് മാറ്റിവയ്ക്കാം (CHANGELOG-ൽ രേഖപ്പെടുത്തുക) ### ഡാറ്റാബേസ് മൈഗ്രേഷനുകൾ - [ ] `src/lib/db/migrations/`-ൽ പുതിയ ഫയലുകൾ ഉണ്ടെങ്കിൽ: - [ ] ഓരോ മൈഗ്രേഷനും idempotent ആണ് (`CREATE TABLE IF NOT EXISTS` മുതലായവ) - [ ] മൈഗ്രേഷനുകൾ transaction-കളിൽ പൊതിഞ്ഞിരിക്കുന്നു - [ ] ശരിയായി നമ്പർ ചെയ്തിരിക്കുന്നു (ക്രമത്തിൽ വിടവുകളില്ല) - [ ] പുതിയ ഇൻസ്റ്റാളേഷനിൽ പരിശോധിക്കുക: `~/.omniroute/omniroute.db` ഇല്ലാതാക്കി `npm run dev` പ്രവർത്തിപ്പിക്കുക - [ ] നിലവിലുള്ള ഇൻസ്റ്റാളേഷനിൽ പരിശോധിക്കുക: DB ബാക്കപ്പ് ചെയ്യുക, മൈഗ്രേഷൻ പ്രവർത്തിപ്പിക്കുക, schema പരിശോധിച്ചുറപ്പിക്കുക - [ ] മൈഗ്രേഷൻ table-കൾ വീണ്ടും എഴുതുന്നുവെങ്കിൽ WAL ഫയലുകൾ (`-wal`, `-shm`) ശരിയായി കൈകാര്യം ചെയ്തിരിക്കുന്നു ### പ്രൊവൈഡർ കാറ്റലോഗ് (Zod ഉപയോഗിച്ച് സാധൂകരിച്ചത്) - [ ] `src/shared/constants/providers.ts` Zod schema ലോഡ് ചെയ്യുന്ന സമയത്ത് സാധുവാണ് - [ ] എല്ലാ പ്രൊവൈഡറുകൾക്കും ആവശ്യമായ field-കൾ (`id`, `label`, `kind` മുതലായവ) ഉണ്ട് - [ ] പുതിയ സൗജന്യ പ്രൊവൈഡറുകൾക്കായി `freeNote` നൽകിയിട്ടുണ്ട് - [ ] OAuth പ്രൊവൈഡറുകൾക്ക് `src/lib/oauth/constants/oauth.ts`-ൽ `oauthConfig` രജിസ്റ്റർ ചെയ്തിട്ടുണ്ട് - [ ] പുതിയ പ്രൊവൈഡർ ചേർത്തിട്ടുണ്ടെങ്കിൽ: അതിനനുസരിച്ചുള്ള executor `open-sse/executors/`-ൽ ഉണ്ട് - [ ] OpenAI അല്ലാത്ത ഫോർമാറ്റാണെങ്കിൽ: translator `open-sse/translator/`-ൽ ഉണ്ട് - [ ] മോഡലുകൾ `open-sse/config/providerRegistry.ts`-ൽ രജിസ്റ്റർ ചെയ്തിട്ടുണ്ട് - [ ] `tests/unit/`-ലെ unit test-കൾ പ്രൊവൈഡർ വർഗ്ഗീകരണവും റൂട്ടിംഗും ഉൾക്കൊള്ളുന്നു ### ഡെസ്ക്ടോപ്പ് (Electron) `electron/` മാറിയിട്ടുണ്ടെങ്കിൽ: - [ ] `npm run electron:smoke:packaged` വിജയിക്കുന്നു - [ ] `:win`, `:mac`, `:linux` എന്നിവയിൽ കുറഞ്ഞത് ഒന്നിനെങ്കിലും വേണ്ടിയുള്ള build-കൾ പരിശോധിച്ചു - [ ] കോഡ് signing certificate-കളുടെ കാലാവധി കഴിഞ്ഞിട്ടില്ല (signing നടത്തുന്നുവെങ്കിൽ) - [ ] `electron/package.json` പതിപ്പ് root `package.json`-ലെ പതിപ്പുമായി പൊരുത്തപ്പെടുന്നു - [ ] `stable`-ലേക്ക് റിലീസ് ചെയ്യുന്നുവെങ്കിൽ auto-update channel pointer അപ്ഡേറ്റ് ചെയ്തു ### Build ലേഔട്ട് റിപ്പോസിറ്ററി മൂന്ന് വ്യത്യസ്ത output directory-കൾ ഉപയോഗിക്കുന്നു — അവ ഒരിക്കലും പരസ്പരം കലർത്തരുത്: | Directory | ഉദ്ദേശ്യം | ട്രാക്ക് ചെയ്യുന്നുണ്ടോ? | | --------- | -------------------------------------------------------------------------------- | ------------------------ | | `src/` | ആപ്ലിക്കേഷൻ ഉറവിടം (TypeScript / TSX) | ഉണ്ട് | | `.build/` | Build intermediate-കൾ — `next build` output (`distDir`) | ഇല്ല (gitignored) | | `dist/` | വിതരണം ചെയ്യാവുന്ന npm bundle — `assembleStandalone` ഉപയോഗിച്ച് കൂട്ടിച്ചേർത്തത് | ഇല്ല (gitignored) | > **ഓപ്പറേറ്റർ കുറിപ്പ്:** റിമോട്ട് VPS image directory `/usr/lib/node_modules/omniroute/app/` ആയി തുടരുന്നു. > **റിപ്പോസിറ്ററിക്കുള്ളിലെ** build output മാത്രമാണ് മാറിയത് (`app/` → `dist/`). Deploy skill-കൾ > `dist/`-ലെ ഉള്ളടക്കം റിമോട്ട് `app/` dir-ലേക്ക് rsync ചെയ്യുന്നു — VPS path-ൽ മാറ്റങ്ങളൊന്നും ആവശ്യമില്ല. **ഒറ്റ-build പ്രവാഹം:** ``` npm run build:release └─ rm -rf .build dist (clean) └─ next build → .build/next/ (intermediates) └─ assembleStandalone (copies standalone + static + public + natives → dist/) └─ writes dist/BUILD_SHA (HEAD sentinel) ``` Deploy ചെയ്യുന്നതിനായി `npm run build` പ്രവർത്തിപ്പിച്ചതിനുശേഷം വേറിട്ട് `npm run build:cli` പ്രവർത്തിപ്പിക്കരുത് — ഒറ്റ command-ൽ clean rebuild + 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`, അല്ലെങ്കിൽ മറ്റ് local residue ഒന്നുമില്ല - [ ] build-നുശേഷം `dist/server.js` നിലവിലുണ്ട് - [ ] ഐച്ഛികമായ local 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 installer-കൾ ചേർക്കുന്നു (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 Deploy skill-കൾ ലളിതമായ 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) - പുതിയ features-ന്റെ WebP screenshots/recordings പകർത്തുന്നു - അവ release notes / blog post-ൽ ചേർക്കുന്നു - [ ] release announcement ഉപയോഗിച്ച് GitHub Discussions / Discord അപ്ഡേറ്റ് ചെയ്യുക - [ ] അടുത്ത version-നായി milestone തുറക്കുക - [ ] നിർണായകമാണെങ്കിൽ: discussion pin ചെയ്യുക അല്ലെങ്കിൽ in-app banner-നായി `news.json`-ൽ പോസ്റ്റ് ചെയ്യുക ### Radar പൊതു ലോഞ്ച് ഗേറ്റ് Radar announcement മനഃപൂർവം `active: false` എന്ന നിലയിലാണ് commit ചെയ്തിരിക്കുന്നത്. താഴെയുള്ള ഓരോ ഇനത്തിനും തെളിവ് ലഭിച്ചതിന് ശേഷമുള്ള ഒരു പ്രത്യേക മാറ്റമാണ് activation: - [ ] stack ചെയ്ത എല്ലാ Radar PR-കളും merge ചെയ്തിട്ടുണ്ടെന്നും release-tip CI പച്ചയാണെന്നും ഉറപ്പാക്കുക - [ ] `RADAR_ENABLED` ഇപ്പോഴും default ആയി off ആയിരിക്കുമ്പോൾ OSS Radar routes deploy ചെയ്ത് smoke test നടത്തുക - [ ] നാമകരണം ചെയ്ത Radar host-ൽ `GET /planos`, `/termos`, `/privacidade`, `/reembolso` എന്നിവ smoke test നടത്തുക - [ ] operator identity/contact/address-ഉം owner അംഗീകരിച്ച legal review-ഉം private service-ൽ രേഖപ്പെടുത്തുക - [ ] 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 പ്രവർത്തനക്ഷമമാക്കുക, തുടർന്ന് പുതിയ `news.json` ID activate ചെയ്യുക - [ ] Home banner localized copy ഉപയോഗിക്കുന്നുവെന്നും പഴയ ID dismiss ചെയ്തതിന് ശേഷം പുതിയ ID വീണ്ടും ദൃശ്യമാകുന്നുവെന്നും പരിശോധിക്കുക ## എംബെഡഡ് സർവീസുകളുടെ സ്മോക്ക് പരിശോധന (v3.8.4+) എംബെഡഡ് സർവീസുകളിലെ മാറ്റങ്ങൾ ഉൾപ്പെടുന്ന ഏതൊരു റിലീസും പുറത്തിറക്കുന്നതിന് മുമ്പ്, പരിശോധിക്കുക: ### പുതിയ-DB ബൂട്ട് (മൈഗ്രേഷൻ കൂട്ടിയിടികൾ കണ്ടെത്തുന്നു — 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` ഓട്ടോസ്റ്റാർട്ട് എൻട്രി സൃഷ്ടിക്കുന്നു; disable അത് നീക്കം ചെയ്യുന്നു - [ ] `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`) ഒരു അപ്ഡേറ്റിനെ അതിജീവിക്കുന്നു. ultra `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)-ലാണ് (Phase 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` എന്നിവ വായിച്ച് മുഴുവൻ ക്രമവും പ്രിന്റ് ചെയ്യുന്നു — മുൻവ്യവസ്ഥകൾ (സോഴ്സ് റിസോൾവ് ചെയ്യുന്നു, സോഴ്സ് റിപ്പോസിറ്ററിയിൽ പൂർണ്ണ ഹിസ്റ്ററിയുണ്ട് — ഒരു shallow clone-ന് `stable/v3` പുഷ് ചെയ്യാനാവില്ല, സ്വീകരിക്കുന്ന ഭാഗം ആദ്യം grafted parent-ൽ തന്നെ പാക്ക് നിരസിക്കും, അതിനാൽ ഒരു full clone-ൽ നിന്ന് കട്ട് ചെയ്യുക അല്ലെങ്കിൽ ആദ്യം `git fetch --unshallow origin` പ്രവർത്തിപ്പിക്കുക — മുൻ ടാഗ് നിലവിലുണ്ട്, `package.json` ലക്ഷ്യ പതിപ്പിലാണ്, ഒരു `release-freeze` issue തുറന്നിരിക്കുന്നു, നിലവിലുള്ള release branch-ൽ തുറന്ന `Release branch not green` issue ഇല്ല — നിലവിലില്ലാത്ത ഒരു ബ്രാഞ്ച് `?` unknown എന്ന് റിപ്പോർട്ട് ചെയ്യുന്നു, ഒരിക്കലും green അല്ല — Mergify `release` queue കോൺഫിഗർ ചെയ്തിരിക്കുന്നു (G11: `queue_rules`, `checks_timeout`, ലേബൽ `queue`), `release/*` ruleset ഇപ്പോഴും deletion-ഉം force-push-ഉം തടയുന്നു, കൂടാതെ `stable/v3`, `develop` എന്നിവ ഇതുവരെ നിലവിലില്ല), രണ്ട് branch ഘട്ടങ്ങൾ, ഏത് dormant-workflow ട്രിഗറുകളും `if:` നിബന്ധനകളും true ആകുന്നു (കൂടാതെ ഏതൊക്കെ ഒരു repository variable ഉപയോഗിച്ച് gated ആയി തുടരുന്നു അല്ലെങ്കിൽ canonical repository-ലേക്ക് pinned ആയി തുടരുന്നു), പ്രതീക്ഷിക്കുന്ന dist-tags (`latest` → 3.9.0, `next`, `nightly` എന്നിവ ശൂന്യം), rollback എന്നിവ. Exit `0` = `RESULT: READY`, `1` = തടസ്സപ്പെടുത്തുന്ന ഒരു മുൻവ്യവസ്ഥ പരാജയപ്പെട്ടു (`✗`), `2` = ഉപയോഗത്തിലെ പിശക്. `--advisory ` ഒരു പരിശോധനയെ മറച്ചുവയ്ക്കാതെ warning (`!`) ആയി താഴ്ത്തുന്നു. 3.9.0 release freeze ഇപ്പോഴും തുറന്നിരിക്കുമ്പോൾ യഥാർഥ കട്ടിന്റെ dry-run പ്രവർത്തിപ്പിക്കുക — ടാഗിന് ശേഷം, Phase 12c freeze നീക്കുന്നതിന് മുമ്പാണ് ബ്രാഞ്ചുകൾ സൃഷ്ടിക്കുന്നത്. ### 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, അല്ലെങ്കിൽ canonical repository-യുടെ 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. ഫോർക്കിലെ dormant workflows പ്രവർത്തിപ്പിക്കുക (ഡ്രൈ-റൺ ഒരു canonical-repository pin # റിപ്പോർട്ട് ചെയ്യുന്നിടത്ത് workflow_dispatch), തുടർന്ന് rollback ചെയ്യുക 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 bump commit git plumbing ഉപയോഗിച്ചാണ് നിർമ്മിക്കുന്നത് (working tree സ്പർശിക്കില്ല), കൂടാതെ cycle-open commit-ലുള്ള അതേ അഞ്ച് ഫയലുകൾ bump ചെയ്യുന്നു: `package.json`, `open-sse/package.json`, `electron/package.json`, `package-lock.json`, `docs/openapi.yaml`. `[4.0.0]` CHANGELOG വിഭാഗവും അതിന്റെ i18n mirrors-ഉം പിന്നീട് `develop`-ൽ, അതിന്റെ ആദ്യ PR-ന് മുമ്പായി തുറക്കുന്നു. സ്ക്രിപ്റ്റ് ഒരിക്കലും npm dist-tags മാറ്റില്ല — അവ ഒരു scratch package-ൽ റിഹേഴ്സൽ ചെയ്യുക. ### PR preview artifact (ഒരിക്കൽ build ചെയ്യുക, അതേ bytes promote ചെയ്യുക) `.github/workflows/preview-artifact.yml` ഒരു PR head-ൽ നിന്ന് ഒരു production tarball നിർമ്മിക്കുകയും അതേ build സാധൂകരിക്കുകയും ചെയ്യുന്നു (#8084 slice (a)). ഒരേ repository-യിലെ PR-കൾ മാത്രം; ഒന്നും publish ചെയ്യുന്നില്ല. ```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 # preview install ``` ഈ run `npm ci`, `npm run build:release`, `npm run check:pack-artifact` എന്നിവ പ്രവർത്തിപ്പിക്കുകയും tarball pack ചെയ്യുകയും `npm run check:pack-boot` (വ്യാജ secrets, താൽക്കാലിക data dir) പ്രവർത്തിപ്പിക്കുകയും വീണ്ടും pack ചെയ്യുകയും ചെയ്യുന്നു; digest സമാനമല്ലെങ്കിൽ ഇത് പരാജയപ്പെടും. തുടർന്ന് `artifact-identity.json` (head SHA, base SHA, lockfile hash, platform, arch, node ABI, bundler, build policy — `scripts/release/artifact-identity.mjs`) രേഖപ്പെടുത്തുകയും പ്രത്യേക job-ൽ tarball attest ചെയ്യുകയും ചെയ്യുന്നു. ഒരു preview promote ചെയ്യുക എന്നത് ആ tarball install ചെയ്യുക എന്നതാണ്: source-ൽ നിന്ന് ഒരിക്കലും വീണ്ടും build ചെയ്യരുത്. ### കട്ട് (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. ഡ്രൈ-റൺ പ്രിന്റ് ചെയ്യുന്ന commands ഉപയോഗിച്ച് `origin`-ൽ ബ്രാഞ്ചുകൾ കൈകൊണ്ട് സൃഷ്ടിക്കുക — സ്ക്രിപ്റ്റ് `origin`-ലേക്ക് push ചെയ്യാൻ വിസമ്മതിക്കും. റിവ്യൂ ചെയ്ത develop commit വീണ്ടും ഉപയോഗിക്കാൻ, ആദ്യം നിങ്ങളുടെ fork-ൽ 3.9.0 tip-നെതിരെ `--execute` rehearsal പ്രവർത്തിപ്പിക്കുക; ഇത് രണ്ട് SHA-കളും പ്രിന്റ് ചെയ്യും, അതേ commits push ചെയ്യാം: ```bash git push origin :refs/heads/stable/v3 :refs/heads/develop ``` 4. ആദ്യ PR എത്തുന്നതിന് മുമ്പ് `stable/v3`, `develop` എന്നിവ സംരക്ഷിക്കുക (rulesets + merge queue). 5. പ്രവർത്തനരഹിതമായ workflows, branch നിലവിലുണ്ടാകുന്നതനുസരിച്ച് സജീവമാകും: `forward-port.yml` (`stable/v3`-ലേക്കുള്ള push), `validate-stable-pr.yml` (`stable/v3`-ലേക്കുള്ള PR-കൾ), `nightly-v4-build.yml` (`develop` build ചെയ്യുന്നു). പ്രവർത്തനമാരംഭിക്കുന്നതിന് മുമ്പ് `secrets.FORWARD_PORT_TOKEN` repository secret സജ്ജീകരിക്കുക (അതുവഴി forward-port PR-കളിൽ CI പ്രവർത്തിക്കും); ഉടമ repository variable ആയ `vars.NIGHTLY_PUBLISH`-നെ `true` ആയി സജ്ജീകരിക്കുകയും npm Trusted Publishing `nightly-v4-build.yml` അംഗീകരിക്കുകയും ചെയ്യുന്നതുവരെ nightly publishing പ്രവർത്തനരഹിതമായി തുടരും. Channel resolution നിർവഹിക്കുന്നത് `scripts/release/dist-tag.mjs` ആണ്; `npm-publish.yml` ഉപയോഗിക്കുന്നതും ഇതേ resolver തന്നെയാണ്. 6. channels പരിശോധിക്കുക: `npm view omniroute dist-tags --json` എന്നത് `latest` = 3.9.0 എന്നും v4 പ്രസിദ്ധീകരിക്കുന്നതുവരെ `next` / `nightly` ഇല്ലെന്നും കാണിക്കണം. 7. ആവശ്യമെങ്കിൽ rollback ചെയ്യുക: `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`-ൽ (lint job) ഈ പരിശോധന പ്രവർത്തിപ്പിക്കുന്നു.