Skip to content

Latest commit

 

History

History
410 lines (313 loc) · 44.1 KB

RELEASE_CHECKLIST.md

File metadata and controls

410 lines (313 loc) · 44.1 KB

Release Checklist (বাংলা)

🌐 Languages: 🇺🇸 English · 🇪🇹 am · 🇸🇦 ar · 🇦🇿 az · 🇧🇬 bg · 🇧🇦 bs · 🇨🇿 cs · 🇩🇰 da · 🇩🇪 de · 🇬🇷 el · 🇪🇸 es · 🇪🇪 et · 🇮🇷 fa · 🇫🇮 fi · 🇫🇷 fr · 🇮🇪 ga · 🇮🇳 gu · 🇳🇬 ha · 🇮🇱 he · 🇮🇳 hi · 🇭🇷 hr · 🇭🇺 hu · 🇦🇲 hy · 🇮🇩 id · 🇳🇬 ig · 🇮🇹 it · 🇯🇵 ja · 🇬🇪 ka · 🇰🇭 km · 🇮🇳 kn · 🇰🇷 ko · 🇱🇹 lt · 🇱🇻 lv · 🇮🇳 ml · 🇮🇳 mr · 🇲🇾 ms · 🇲🇹 mt · 🇲🇲 my · 🇳🇵 ne · 🇳🇱 nl · 🇳🇴 no · 🇮🇳 or · 🇮🇳 pa · 🇵🇭 phi · 🇵🇱 pl · 🇵🇹 pt · 🇧🇷 pt-BR · 🇷🇴 ro · 🇷🇺 ru · 🇱🇰 si · 🇸🇰 sk · 🇸🇮 sl · 🇷🇸 sr · 🇸🇪 sv · 🇰🇪 sw · 🇮🇳 ta · 🇮🇳 te · 🇹🇭 th · 🇹🇷 tr · 🇺🇦 uk-UA · 🇵🇰 ur · 🇺🇿 uz · 🇻🇳 vi · 🇳🇬 yo · 🇨🇳 zh-CN · 🇹🇼 zh-TW


সর্বশেষ হালনাগাদ: 2026-08-28 — v3.8.51 অটোমেশনের জন্য Claude Code স্কিল ব্যবহারকারী সরলীকৃত রিলিজ প্রবাহ।

রিলিজগুলোর মধ্যবর্তী সময়ে কিউ/ব্রাঞ্চ সবুজ রাখুন: দেখুন RELEASE_GREEN.md (/green-prs পরিবার + npm run check:release-green + /babysit + রাত্রিকালীন রান)। এটি নিয়মিতভাবে — এবং বিশেষ করে এই চেকলিস্টের আগে — চালালে রিলিজ PR শুরু থেকেই সবুজ থাকে।

সংক্ষেপে

# ১. ভার্সন বাড়ান + CHANGELOG তৈরি করুন (স্কিল)
/version-bump-cc patch    # অথবা minor/major

# ২. স্থানীয়ভাবে কোয়ালিটি গেট চালান
npm run check              # lint + টেস্ট
npm run test:coverage      # সম্পূর্ণ কভারেজ গেট (60/60/60/60)

# ৩. বিল্ড ও স্মোক টেস্ট
npm run build
npm run test:e2e           # ঐচ্ছিক, তবে সুপারিশকৃত

# ৪. রিলিজ তৈরি করুন (স্কিল)
/generate-release-cc

# ৫. ডিপ্লয় করুন (স্কিল)
/deploy-vps-both-cc        # অথবা akamai-cc / local-cc

# ৬. রিলিজের প্রমাণ সংগ্রহ করুন (স্কিল)
/capture-release-evidences-cc

npm Trusted Publishing (v3.8.51 থেকে ডিফল্ট) — অনুরোধে staged, fallback হিসেবে direct

npm-publish.yml ডিফল্টভাবে npm Trusted Publishing (OIDC)-এর মাধ্যমে প্রকাশ করে: stage-npm জবটি (github-hosted) ওই রানের জন্য GitHub-এর id-token বিনিময় করে একটি স্বল্পমেয়াদি npm credential নেয় — repository secrets-এ কোনো দীর্ঘমেয়াদি npm token থাকে না, কোনো 2FA prompt আসে না, এবং provenance সংযুক্ত থাকে। 2FA এড়িয়ে যাওয়া token-গুলো অবসরে পাঠানো হচ্ছে বলে npm এখন এই bypass অনুমোদন করে; এটি WS1.3 নিশ্চয়তা বজায় রেখেই v3.8.48 পর্যন্ত প্রকল্পটিতে থাকা সম্পূর্ণ স্বয়ংক্রিয় প্রবাহ পুনরুদ্ধার করে (ফাঁস হওয়া token একা publish করতে পারে না — কারণ কোনো token-ই নেই)।

একবারের সেটআপ (owner): 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 আর সরাসরি publish করে না: এটি প্যাক করা tarball বুট করে (check:pack-boot) এবং তারপর npm stage publish চালায় — হুবহু সেই bytes-গুলো registry-তে রাখা হয়, কিন্তু owner অনুমোদন না করা পর্যন্ত সেগুলো install করা যায় না। মানব-নির্ভর 2FA gate-টি এখন প্রমাণ যাচাইয়ের আগে নয়, পরে সম্পন্ন হয়।

Workflow সবুজ হওয়ার পর owner-এর প্রবাহ:

  1. npm stage list omniroute — stage id খুঁজুন (workflow summary-তেও দেখানো হয়)।
  2. Staged bytes যাচাই করুন (সুপারিশকৃত): npm stage download <id>, তারপর ডাউনলোড করা tarball-টি একটি অস্থায়ী prefix-এ install করে বুট করুন (npm run check:pack-boot CI-তে একই pack→install→boot সিদ্ধান্ত স্বয়ংক্রিয় করে)।
  3. npm stage approve <id> — 2FA prompt-টিই হলো publish। npm stage reject <id> বাতিল করে।
  4. Publish-পরবর্তী সুরক্ষা: publish-পরবর্তী verifier (v3.8.49 পরিকল্পনার WS1.4) একটি পরিষ্কার container-এ public registry থেকে প্রকাশিত version install করে সেটি বুট করে।

জরুরি fallback: publish_mode=direct-সহ workflow_dispatch পুরোনো তাৎক্ষণিক npm publish পুনরুদ্ধার করে (শুধু staging নিজেই ঠিকমতো কাজ না করলে ব্যবহার করুন; কারণটি নথিভুক্ত করুন)।

একবারের hardening (owner, npmjs.com): omniroute-এর Trusted Publisher-কে stage-only mode-এ কনফিগার করুন, যাতে ফাঁস হওয়া কোনো দীর্ঘমেয়াদি token কোথাও থেকে সরাসরি npm publish করতে না পারে — CI কেবল stage করতে পারে; শুধু owner-এর 2FA রিলিজ করতে পারে।

ত্রুটিপূর্ণ artifact-এর playbook (অপরিবর্তিত): ডিফল্ট তাৎক্ষণিক পদক্ষেপ হিসেবে npm deprecate omniroute@<bad> "<reason> — use <fixed>" ব্যবহার করুন (কয়েক মিনিট লাগে, প্রত্যাবর্তনযোগ্য); শুধু 72h/no-dependents সীমার মধ্যে npm unpublish ব্যবহার করুন এবং কখনোই প্রথম পদক্ষেপ হিসেবে নয়। Docker: কোনো version tag কখনো পুনর্লিখবেন না — rollback হলো latest-কে সর্বশেষ ভালো digest-এর দিকে পুনর্নির্দেশ করা।

Docker Hub latest (প্রতিটি stable SemVer publish-এ আবশ্যক): docker-publish workflow-কে অবশ্যই X.Y.Z এবং, যখন should-promote-latest.sh সম্মত হয় যে এটিই সর্বোচ্চ stable SemVer, একই digest দিয়ে :latest— দুটোকেই tag করতে হবে। Job-এর পরে: Hub-এর latest digest নতুন SemVer digest-এর সমান হবে এবং last_updated এগিয়ে যাবে। Release notes-এ এমন fix-এর কথা থাকা অবস্থায় :latest-কে পুরোনো build-এ রেখে দেবেন না, যদি ওই fix শুধু git-এ থাকে। Compose quickstart-গুলো :latest ব্যবহার করে; GitOps-এর X.Y.Z pin করাই চালিয়ে যাওয়া উচিত। দেখুন Docker 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. প্রমাণ: PR body-তে পূর্ববর্তী সম্পূর্ণ-সবুজ heavy run-এর লিঙ্ক থাকে (যে suite-টি বাদ দেওয়া job-গুলো পুনরায় যাচাই করত), সঙ্গে fix-টির নিজস্ব আগে-ব্যর্থ-তারপর-সফল test।
  4. পরিধি: শুধু cherry-pick — ন্যূনতম fix, কোনো refactor নয়, কোনো অতিরিক্ত পরিবর্তন নয়।

বাদ দেওয়া coverage/ratchet ক্ষেত্রটি release branch-এর পরবর্তী পূর্ণ run-এ পুনরায় যাচাই করা হয় (ধারাবাহিক release-green) — এই lane কেবল অপেক্ষা এড়ায়, যাচাইকরণ কখনো নয়। শুধু test-সংক্রান্ত diff (সব file tests/-এর অধীনে, একটিও tests/e2e/-এর অধীনে নয়) কোনো লেবেল ছাড়াই স্বয়ংক্রিয়ভাবে E2E matrix এড়িয়ে যায়।

বিস্তারিত চেকলিস্ট

রিলিজের আগে

  • এই release-এর জন্য লক্ষ্যকৃত সব PR release/vX.Y.0-তে merge করা হয়েছে
  • এই version-এর সব খোলা Linear/issue item বন্ধ করা হয়েছে অথবা পরবর্তী milestone-এ সরানো হয়েছে
  • release/vX.Y.0 branch-এ CI সবুজ
  • code-এ কোনো TODO(release) marker নেই: grep -r "TODO(release)" src/ open-sse/
  • Docker base image হালনাগাদ (বর্তমানে node:24.15.0-trixie-slim)

Version ও Changelog

  • /version-bump-cc <patch|minor|major> চালান (Claude Code skill)
    • package.json, electron/package.json-এর version bump করে
    • সর্বশেষ tag-এর পরের git commit থেকে CHANGELOG.md পুনরায় তৈরি করে
    • README.md badge হালনাগাদ করে
  • CHANGELOG.md ম্যানুয়ালি পর্যালোচনা করুন এবং প্রয়োজন হলে commit message পরিষ্কার করুন
  • নিশ্চিত করুন, CHANGELOG.md-এর সর্বশেষ semver section package.json version-এর সমান
  • আসন্ন কাজের জন্য ## [Unreleased]-কে changelog-এর প্রথম section হিসেবে রাখুন
  • docs/openapi.yaml হালনাগাদ করুন → info.version অবশ্যই package.json version-এর সমান হতে হবে

Code-এর গুণমান

  • npm run lint — 0টি error (warning-গুলো আগে থেকেই বিদ্যমান)
  • npm run typecheck:core — ত্রুটিমুক্ত
  • npm run typecheck:noimplicit:core — ত্রুটিমুক্ত (strict)
  • npm run check:cycles — কোনো circular dependency নেই
  • 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-এর সঙ্গে সামঞ্জস্যপূর্ণ)

Testing

  • npm run test:unit — সফল
  • npm run test:vitest — সফল (MCP server, autoCombo, cache)
  • npm run test:coverage — 60/60/60/60 gate পূরণ হয়েছে (statements/lines/functions/branches)
  • npm run test:integration — সফল (পরিবর্তনগুলো DB / handler স্পর্শ করলে)
  • npm run test:combo:matrix — সফল (combo strategy matrix: সর্বজনীন 19টি routing strategy-এর selection decision নির্ধারিতভাবে প্রমাণ করে; combo routing, strategy resolution বা fallback logic স্পর্শ করলে চালান)
  • RUN_COMBO_LIVE=1 npm run test:combo:live — ঐচ্ছিক/ম্যানুয়াল (gate-নিয়ন্ত্রিত বাস্তব-upstream smoke; VPS root@192.168.0.15 থেকে একটি read-only DB snapshot নেয়; বাস্তব provider-কে অনুরোধ পাঠায়, credit খরচ করে; CI-তে কখনো চলে না; gate না থাকলে পরিচ্ছন্নভাবে skip করে)
  • npm run test:combo:live:vps — ঐচ্ছিক/ম্যানুয়াল (পর্যায়-৩ VPS live smoke: plain Node ESM-এর মাধ্যমে live .15 server-এর বিপরীতে 7টি HTTP scenario; ssh root@192.168.0.15 প্রয়োজন; শুধু __live_test__* combo তৈরি/মুছে ফেলে; বাস্তব provider-কে অনুরোধ পাঠায়; CI-তে কখনো চলে না)
  • npm run test:e2e — সফল (UI পরিবর্তন)
  • npm run test:protocols:e2e — সফল (MCP/A2A পরিবর্তন)
  • npm run test:ecosystem — সফল

Hook (Husky দ্বারা যাচাইকৃত)

Husky hook-গুলো .husky/-তে থাকে এবং git operation-এর সময় স্বয়ংক্রিয়ভাবে চলে।

  • pre-commit: npx lint-staged + node scripts/check/check-docs-sync.mjs + npm run check:any-budget:t11
  • pre-push: দ্রুত নির্ধারিত gate — npm run check:any-budget:t11 && npm run check:tracked-artifacts (2026-06-13-এ সক্রিয় করা হয়েছে)। ইচ্ছাকৃতভাবে test:unit বাদ দেয় (ধীর; CI-এর test-unit job দ্বারা অন্তর্ভুক্ত)।
    • release branch push করার আগে ম্যানুয়ালি npm run test:unit চালান।

কোনো hook ব্যর্থ হলে: অন্তর্নিহিত সমস্যাটি ঠিক করুন, --no-verify দিয়ে এড়িয়ে যাবেন না।

Conventional Commit

release-এ অন্তর্ভুক্ত সব commit-কে অবশ্যই type(scope): subject format অনুসরণ করতে হবে।

বৈধ type: feat, fix, refactor, docs, test, chore, perf, style, ci

বৈধ scope: 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 change: BREAKING CHANGE: footer অথবা scope-এর পরে ! যোগ করুন (যেমন feat(api)!: drop /v0)।

Documentation

  • 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/<MODULE>.md বিদ্যমান
  • এটি একটি breaking change হলে: docs/guides/TROUBLESHOOTING.md-এ migration নোট রয়েছে

i18n

  • npm run i18n:check 0 দিয়ে প্রস্থান করে — অনুবাদের অবস্থা (.i18n-state.json) উৎস ডকুমেন্টেশনের সঙ্গে সিঙ্কে আছে (strict mode-এ কোনো বিচ্যুত উৎস নেই; শেষ মুহূর্তের ডকুমেন্টেশন সংশোধনের জন্য warn-mode পরামর্শ গ্রহণযোগ্য, তবে tagging-এর আগে এটি 0 হওয়া উচিত)
  • npm run i18n:check-ui-coverage 0 দিয়ে প্রস্থান করে — প্রতিটি UI locale 80% কভারেজের ন্যূনতম সীমায় বা তার ওপরে রয়েছে
  • npm run i18n:sync-ui:dry সব 42টি locale জুড়ে 0টি অনুপস্থিত key রিপোর্ট করে
  • উৎসের ইংরেজি ডকুমেন্টেশন পরিবর্তিত হলে, tagging-এর আগে npm run i18n:run চালান (.env-এ OMNIROUTE_TRANSLATION_API_KEY প্রয়োজন)
  • অনুবাদ-সংক্রান্ত অবদান ছোট হলে পরবর্তী release পর্যন্ত স্থগিত রাখা যেতে পারে (CHANGELOG-এ ট্র্যাক করুন)

ডেটাবেস Migration

  • src/lib/db/migrations/-এ নতুন ফাইল থাকলে:
    • প্রতিটি migration idempotent (CREATE TABLE IF NOT EXISTS, ইত্যাদি)
    • Migration-গুলো transaction-এর মধ্যে রাখা হয়েছে
    • সঠিকভাবে নম্বর দেওয়া হয়েছে (ক্রমে কোনো ফাঁক নেই)
  • নতুন ইনস্টলে পরীক্ষা করুন: ~/.omniroute/omniroute.db মুছে দিয়ে npm run dev চালান
  • বিদ্যমান ইনস্টলে পরীক্ষা করুন: DB ব্যাকআপ নিন, migration চালান এবং schema যাচাই করুন
  • Migration-এ table পুনর্লিখন করা হলে WAL ফাইল (-wal, -shm) সঠিকভাবে পরিচালিত হয়েছে

Provider Catalog (Zod দ্বারা যাচাইকৃত)

  • লোডের সময় src/shared/constants/providers.ts-এর Zod schema বৈধ
    • সব provider-এর প্রয়োজনীয় field (id, label, kind, ইত্যাদি) রয়েছে
    • নতুন বিনামূল্যের provider-এর জন্য freeNote দেওয়া হয়েছে
    • OAuth provider-গুলোর oauthConfig, src/lib/oauth/constants/oauth.ts-এ নিবন্ধিত
  • নতুন provider যোগ করা হলে: open-sse/executors/-এ সংশ্লিষ্ট executor রয়েছে
  • ফরম্যাটটি OpenAI-এর না হলে: open-sse/translator/-এ translator রয়েছে
  • Model-গুলো open-sse/config/providerRegistry.ts-এ নিবন্ধিত
  • tests/unit/-এর unit test-গুলো provider classification এবং routing কভার করে

ডেস্কটপ (Electron)

যদি electron/ পরিবর্তিত হয়ে থাকে:

  • npm run electron:smoke:packaged সফল হয়
  • :win, :mac, :linux-এর মধ্যে অন্তত একটির build পরীক্ষা করা হয়েছে
  • Code signing certificate-এর মেয়াদ শেষ হয়নি (signing করা হলে)
  • electron/package.json-এর version, root package.json-এর সঙ্গে মেলে
  • stable-এ release করা হলে auto-update channel pointer হালনাগাদ করা হয়েছে

Build বিন্যাস

Repository-টি তিনটি স্বতন্ত্র output directory ব্যবহার করে — এগুলো কখনো গুলিয়ে ফেলবেন না:

Directory উদ্দেশ্য ট্র্যাক করা হয়?
src/ Application source (TypeScript / TSX) হ্যাঁ
.build/ Build-এর মধ্যবর্তী ফাইল — next build output (distDir) না (gitignored)
dist/ বিতরণযোগ্য npm bundle — assembleStandalone দ্বারা প্রস্তুত না (gitignored)

অপারেটরের নোট: remote VPS image directory এখনও /usr/lib/node_modules/omniroute/app/। কেবল repository-এর ভেতরের build output সরানো হয়েছে (app/ → dist/)। Deploy skill-গুলো dist/-এর বিষয়বস্তু remote app/ directory-তে 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 চালাবেন না — এর পরিবর্তে npm run build:release ব্যবহার করুন, যা একটি command-এই clean rebuild + sentinel সম্পন্ন করে।

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 বিদ্যমান

Tagging ও Release

  • /generate-release-cc (Claude Code skill) চালান:
    • vX.Y.Z tag তৈরি করে
    • Tag এবং branch push করে
    • Changelog body-সহ GitHub Release খোলে
    • Electron installer সংযুক্ত করে (build করা থাকলে)
  • অথবা ম্যানুয়ালি:
    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 নয়:

  • Target-এর সঙ্গে মেলে এমন deploy skill ব্যবহার করুন:
    • /deploy-vps-local-cc — local VPS (192.168.0.15)
    • /deploy-vps-akamai-cc — Akamai VPS (69.164.221.35)
    • /deploy-vps-both-cc — উভয়টি
  • Deploy করার আগে নিশ্চিত করুন dist/BUILD_SHA == git rev-parse --short HEAD
  • যেখানে node_modules বাস্তব, সেখানেই build চালাতে হবে (মূল checkout অথবা npm ci চালানো worktree — symlink করা worktree নয়)
  • Deploy করা instance-এর smoke test করুন:
    • /dashboard/health খুলুন → version string release-এর সঙ্গে মেলে কি না পরীক্ষা করুন
    • পরিচিত একটি provider-এর বিপরীতে /v1/chat/completions request চালান
    • যাচাই করুন যে /api/monitoring/health, CLOSED circuit breaker ফেরত দেয়
    • MCP transport-গুলো সাড়া দেয় কি না নিশ্চিত করুন (/mcp HTTP, /mcp-sse SSE)

Release-পরবর্তী

  • /capture-release-evidences-cc চালান (Claude Code skill)
    • নতুন ফিচারগুলোর WebP স্ক্রিনশট/রেকর্ডিং ধারণ করে
    • রিলিজ নোট / ব্লগ পোস্টে সংযুক্ত করে
  • রিলিজ ঘোষণাসহ GitHub Discussions / Discord আপডেট করুন
  • পরবর্তী সংস্করণের জন্য milestone খুলুন
  • গুরুত্বপূর্ণ হলে: আলোচনাটি pin করুন অথবা অ্যাপের অভ্যন্তরীণ ব্যানারের জন্য news.json-এ পোস্ট করুন

Radar-এর সর্বজনীন লঞ্চ গেট

Radar ঘোষণাটি ইচ্ছাকৃতভাবে active: false সহ commit করা হয়েছে। নিচের প্রতিটি আইটেমের প্রমাণ পাওয়ার পর আলাদা একটি পরিবর্তনের মাধ্যমে এটি সক্রিয় করতে হবে:

  • সব stacked Radar PR merge করা হয়েছে এবং release-tip CI সবুজ রয়েছে
  • RADAR_ENABLED ডিফল্টভাবে বন্ধ রেখেই OSS Radar routes deploy ও smoke test করুন
  • নির্দিষ্ট Radar host-এ GET /planos, /termos, /privacidade, এবং /reembolso smoke test করুন
  • private service-এ operator-এর পরিচয়/যোগাযোগ/ঠিকানা এবং owner-অনুমোদিত আইনি পর্যালোচনা রেকর্ড করুন
  • শুধু test mode-এ Stripe Checkout এবং signed webhook পরীক্ষা করুন
  • অনুমোদিত sender/domain দিয়ে একটি encrypted transactional-email delivery পরীক্ষা করুন
  • backup restore এবং তত্ত্বাবধানে পরিচালিত, budget-capped একটি research run সফলভাবে প্রমাণ করুন
  • donation evidence গ্রহণের আগে BRL/PIX review policy অনুমোদন করুন
  • আগের gate-গুলো সম্পন্ন হওয়ার পরেই public Checkout সক্রিয় করুন, তারপর নতুন news.json ID সক্রিয় করুন
  • যাচাই করুন যে Home banner স্থানীয়কৃত copy ব্যবহার করে এবং পুরোনো কোনো ID dismiss করার পর নতুন একটি ID আবার প্রদর্শিত হয়

এমবেডেড সার্ভিসেস স্মোক পরীক্ষা (v3.8.4+)

এম্বেডেড সার্ভিসে পরিবর্তন অন্তর্ভুক্ত রয়েছে—এমন কোনো রিলিজ প্রকাশের আগে যাচাই করুন:

নতুন-DB বুট (মাইগ্রেশন সংঘর্ষ শনাক্ত করে — v3.8.4 হটফিক্সের পরে যোগ করা হয়েছে)

  • DATA_DIR=$(mktemp -d) npm start & — বুটের জন্য 10 s অপেক্ষা করুন
  • 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 min-এর মধ্যে installedVersion-সহ 200 ফেরত দেয়
  • POST /api/services/9router/start 30 s-এর মধ্যে 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 min-এর মধ্যে 200 ফেরত দেয়
  • POST /api/services/cliproxy/start 30 s-এর মধ্যে 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@<this-version> মারাত্মকভাবে প্রস্থান না করেই 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 বান্ডল করে, ডায়নামিকভাবে ইমপোর্ট করা ঐচ্ছিকগুলো নয়; তাই এটি না থাকলে ওয়ার্কার root-এর 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-এ ফলব্যাক করে
  • Smart MCP ফিল্টার প্রকৃত playwright-mcp browser_snapshot আউটপুট সংকুচিত করে (≥50% হ্রাস)
  • skills/omniroute*/SKILL.md-এর সব 10টি ফাইল raw GitHub URL-এর মাধ্যমে সর্বজনীনভাবে আনা যায়
  • নতুন সেটআপে অনবোর্ডিং উইজার্ড "How It Works" টিয়ার ট্যুর ধাপ দেখায়
  • হোম ড্যাশবোর্ডের টিয়ার কভারেজ উইজেট কনফিগার করা/সক্রিয় সংখ্যাগুলো দেখায়

রোলব্যাক

রিলিজে গুরুতর সমস্যা থাকলে:

  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 খোলার আগে স্থানীয়ভাবে ডকুমেন্টেশন সিঙ্ক গার্ড চালান:

npm run check:docs-sync

CI-ও .github/workflows/ci.yml-এ (lint জব) এই যাচাই চালায়।