1,104 mirrors rewritten over five passes of run-translation on the 22-source core set: the 14 sources edited since their translation, the 322 mirrors that were still English copies, and the frontmatter the old extractor leaked into the newer locales' bodies. The pipeline now caches per-`## `-section hashes and retranslates only changed sections, never reuses a section that is still English, rebuilds English-copy / leaked mirrors even when the source is unchanged, merges the state on save (parallel runs), and the drift gate (scoped to the core set) is blocking. Final audit: 0 stale, 0 English copies, 0 leaked frontmatter across 1,430 core mirrors. ⚠️ base-red inherited: #12732
30 KiB
Release Checklist (Polski)
🌐 Languages: 🇺🇸 English · 🇪🇹 am · 🇸🇦 ar · 🇦🇿 az · 🇧🇬 bg · 🇧🇩 bn · 🇨🇿 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 · 🇵🇹 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
title: "Checklista wydania" version: 3.8.40 lastUpdated: 2026-06-28
Checklista wydania
Ostatnia aktualizacja: 2026-06-28 — v3.8.40 Uproszczony przepływ wydania wykorzystujący skill-e Claude Code do automatyzacji.
Utrzymuj kolejkę/gałąź na zielono między wydaniami: zobacz RELEASE_GREEN.md (rodzina
/green-prs+npm run check:release-green+/babysit+ nightly). Uruchamianie tego okresowo — a zwłaszcza przed tą checklistą — sprawia, że PR wydania startuje na zielono.
TL;DR
# 1. Zwiększ wersję + wygeneruj CHANGELOG (umiejętność)
/version-bump-cc patch # lub minor/major
# 2. Uruchom lokalnie kontrolę jakości
npm run check # lintowanie + testy
npm run test:coverage # pełna kontrola pokrycia (60/60/60/60)
# 3. Zbuduj i wykonaj test dymny
npm run build
npm run test:e2e # opcjonalne, ale zalecane
# 4. Wygeneruj wydanie (umiejętność)
/generate-release-cc
# 5. Wdróż (umiejętność)
/deploy-vps-both-cc # lub akamai-cc / local-cc
# 6. Zarejestruj dowody wydania (umiejętność)
/capture-release-evidences-cc
Zaufane publikowanie npm (domyślne od v3.8.51) — publikowanie etapowe na żądanie, bezpośrednie jako rozwiązanie awaryjne
npm-publish.yml domyślnie publikuje za pośrednictwem zaufanego publikowania npm (OIDC):
zadanie stage-npm (hostowane przez GitHub) wymienia token id-token GitHuba na krótkotrwałe
poświadczenie npm na potrzeby danego uruchomienia — bez długoterminowego tokena npm
w sekretach repozytorium, bez monitu 2FA, z dołączonym poświadczeniem pochodzenia.
Jest to obecnie zatwierdzony przez npm sposób obejścia problemu wycofywania tokenów
pomijających 2FA; przywraca on w pełni automatyczny przepływ, który projekt miał do
v3.8.48, zachowując gwarancję WS1.3 (wyciek tokena nie wystarczy do publikacji — tokena
po prostu nie ma).
Konfiguracja jednorazowa (właściciel): npmjs.com → pakiet omniroute → Settings → Trusted
Publisher → GitHub: właściciel diegosouzapw, repozytorium OmniRoute, przepływ pracy npm-publish.yml
(środowisko: brak). Dopóki ta konfiguracja nie istnieje, automatyczny krok kończy się błędem ENEEDAUTH:
uruchom go ponownie z publish_mode=staged (poniżej) lub direct.
Publikowanie etapowe (na żądanie — publish_mode=staged)
Przepływ pracy npm-publish nie publikuje już bezpośrednio: uruchamia spakowane archiwum tar
(check:pack-boot), a następnie wykonuje npm stage publish — dokładnie te same bajty są
umieszczane w rejestrze, ale nie można ich zainstalować, dopóki właściciel ich nie zatwierdzi.
Kontrola 2FA wykonywana przez człowieka została przeniesiona na etap PO weryfikacji, a nie przed nią.
Procedura właściciela po pomyślnym zakończeniu przepływu pracy:
npm stage list omniroute— znajdź identyfikator etapu (jest on również wyświetlany w podsumowaniu przepływu pracy).- Zweryfikuj pliki umieszczone etapowo (zalecane):
npm stage download <id>, a następnie zainstaluj pobrane archiwum tar w tymczasowym prefiksie i uruchom je (npm run check:pack-bootautomatyzuje w CI tę samą weryfikację: pakowanie→instalacja→uruchomienie). npm stage approve <id>— monit 2FA JEST publikacją.npm stage reject <id>odrzuca etap.- Zabezpieczenie po publikacji: weryfikator po publikacji (WS1.4 planu v3.8.49) instaluje opublikowaną wersję z publicznego rejestru w czystym kontenerze i ją uruchamia.
Awaryjne rozwiązanie zastępcze: workflow_dispatch z publish_mode=direct przywraca
starszy, natychmiastowy tryb npm publish (używaj tylko wtedy, gdy samo publikowanie etapowe
działa nieprawidłowo; udokumentuj przyczynę).
Jednorazowe wzmocnienie zabezpieczeń (właściciel, npmjs.com): skonfiguruj zaufanego wydawcę
dla omniroute w trybie wyłącznie etapowym, aby ujawniony długoterminowy token nie mógł wykonać
npm publish bezpośrednio z dowolnego miejsca — CI może jedynie utworzyć etap; publikację może
zatwierdzić wyłącznie właściciel za pomocą 2FA.
Procedura postępowania z uszkodzonym artefaktem (bez zmian): npm deprecate omniroute@<bad> "<reason> — use <fixed>"
jako domyślna reakcja (kilka minut, działanie odwracalne); npm unpublish tylko w ciągu 72 godzin,
gdy nie ma zależnych pakietów, i nigdy jako pierwszy krok. Docker: nigdy nie nadpisuj tagu wersji —
wycofanie wersji polega na ponownym wskazaniu przez latest ostatniego prawidłowego skrótu.
Docker Hub latest (wymagane przy każdej publikacji stabilnej wersji SemVer):
przepływ pracy docker-publish musi oznaczyć tagiem zarówno X.Y.Z, jak i — gdy
should-promote-latest.sh potwierdzi, że jest to najwyższa stabilna wersja SemVer — :latest,
używając tego samego skrótu. Po zakończeniu zadania: skrót latest w Hubie musi być zgodny
ze skrótem nowej wersji SemVer, a wartość last_updated musi zostać zaktualizowana. Nie pozostawiaj
:latest wskazującego na starszą kompilację, gdy informacje o wydaniu opisują poprawki dostępne
wyłącznie w git. Przykłady szybkiego startu Compose używają :latest; rozwiązania GitOps powinny
nadal przypinać X.Y.Z. Zobacz Kanały wydań Dockera i #10317.
Szybki pas hotfix (etykieta hotfix)
PR z etykietą hotfix pomija ciężką macierz CI (9-shard E2E, coverage ratchet,
quality-gate, quality-extended) i zostawia szybkie, wysokosygnałowe bramki: build,
unit shards, integration, vitest, lint/typecheck, docs-sync, check:pack-artifact
oraz tarball boot-smoke (check:pack-boot). Cel: zieleń w ≤15 min zamiast ~33 min.
Polityka wejścia — wszystkie cztery wymagane (wzorowane na pasach awaryjnych Chromium/VS Code/Node):
- Severity: produkcja jest zepsuta — opublikowany artefakt pada przy bootcie / poprawka bezpieczeństwa / każdy użytkownik wydania jest dotknięty. „Ważne” to nie „zepsute”.
- Authority: tylko właściciel repozytorium nakłada etykietę
hotfix. Etykieta JEST zatwierdzeniem — nigdy self-serve na PR-ze kampanii. - Evidence: treść PR linkuje poprzedni w pełni zielony heavy run (suite, którą pominięte joby by ponownie walidowały) plus własny test poprawki failing-then-passing.
- Scope: wyłącznie cherry-pick — minimalna poprawka, bez refaktorów, bez ride-alongów.
Pominięta powierzchnia coverage/ratchet jest ponownie walidowana przez kolejny pełny run na
gałęzi release (continuous release-green) — pas pomija OCZEKIWANIE, nigdy walidację.
Diffy tylko-testowe (wszystkie pliki pod tests/, żaden pod tests/e2e/) pomijają macierz E2E
automatycznie, bez żadnej etykiety.
Szczegółowa lista kontrolna
Przed wydaniem
- Wszystkie PR-y przeznaczone do tego wydania zostały scalone z
release/vX.Y.0 - Wszystkie otwarte elementy Linear/zgłoszenia dotyczące tej wersji zostały zamknięte lub przeniesione do następnego kamienia milowego
- CI działa poprawnie na gałęzi
release/vX.Y.0 - Brak znaczników
TODO(release)w kodzie:grep -r "TODO(release)" src/ open-sse/ - Bazowy obraz Dockera jest aktualny (obecnie
node:24.15.0-trixie-slim)
Wersja i dziennik zmian
- Uruchom
/version-bump-cc <patch|minor|major>(umiejętność Claude Code)- Aktualizuje wersje w
package.json,electron/package.json - Ponownie generuje
CHANGELOG.mdna podstawie commitów git od ostatniego tagu - Aktualizuje odznaki w README.md
- Aktualizuje wersje w
- Ręcznie przejrzyj CHANGELOG.md i w razie potrzeby uporządkuj komunikaty commitów
- Upewnij się, że najnowsza sekcja semver w
CHANGELOG.mdodpowiada wersji wpackage.json - Zachowaj
## [Unreleased]jako pierwszą sekcję dziennika zmian przeznaczoną na nadchodzące prace - Zaktualizuj
docs/openapi.yaml→info.versionmusi odpowiadać wersji wpackage.json
Jakość kodu
npm run lint— 0 błędów (ostrzeżenia istniały już wcześniej)npm run typecheck:core— bez problemównpm run typecheck:noimplicit:core— bez problemów (tryb ścisły)npm run check:cycles— brak zależności cyklicznychnpm run check:any-budget:t11— w ramach limitunpm run check:route-validation:t06— bez problemównpm run check:node-runtime— spełniona minimalna obsługiwana wersja środowiska uruchomieniowego (>=22.22.2 <23,>=24.0.0 <27, zgodnie zSUPPORTED_NODE_RANGEwsrc/shared/utils/nodeRuntimeSupport.ts; zgodne zengineswpackage.json)
Testowanie
npm run test:unit— zakończone powodzeniemnpm run test:vitest— zakończone powodzeniem (serwer MCP, autoCombo, pamięć podręczna)npm run test:coverage— spełniony próg 60/60/60/60 (instrukcje/wiersze/funkcje/gałęzie)npm run test:integration— zakończone powodzeniem (jeśli zmiany dotyczą bazy danych / procedur obsługi)npm run test:combo:matrix— zakończone powodzeniem (macierz strategii combo: deterministycznie potwierdza decyzje wyboru wszystkich 19 publicznych strategii routingu; uruchamiaj przy zmianach w routingu combo, rozwiązywaniu strategii lub logice awaryjnej)RUN_COMBO_LIVE=1 npm run test:combo:live— opcjonalne/ręczne (warunkowy test dymny z rzeczywistymi usługami nadrzędnymi; pobiera z VPSroot@192.168.0.15migawkę bazy danych tylko do odczytu; korzysta z rzeczywistych dostawców i zużywa kredyty; nigdy nie jest uruchamiany w CI; bez warunku jest prawidłowo pomijany)npm run test:combo:live:vps— opcjonalne/ręczne (test dymny na żywo VPS fazy 3: 7 scenariuszy HTTP względem działającego serwera.15za pomocą zwykłego Node ESM; wymagassh root@192.168.0.15; tworzy/usuwa wyłącznie kombinacje__live_test__*; korzysta z rzeczywistych dostawców; nigdy nie jest uruchamiany w CI)npm run test:e2e— zakończone powodzeniem (zmiany interfejsu użytkownika)npm run test:protocols:e2e— zakończone powodzeniem (zmiany MCP/A2A)npm run test:ecosystem— zakończone powodzeniem
Hooki (zweryfikowane przez Husky)
Hooki Husky znajdują się w .husky/ i są uruchamiane automatycznie podczas operacji git.
- pre-commit:
npx lint-staged + node scripts/check/check-docs-sync.mjs + npm run check:any-budget:t11 - pre-push: szybkie, deterministyczne kontrole —
npm run check:any-budget:t11 && npm run check:tracked-artifacts(aktywowane 2026-06-13). Celowo pomijajątest:unit(wolne; objęte zadaniem CItest-unit).- Przed wypchnięciem gałęzi wydania uruchom ręcznie
npm run test:unit.
- Przed wypchnięciem gałęzi wydania uruchom ręcznie
Jeśli hook zakończy się niepowodzeniem: napraw przyczynę problemu, nie omijaj go za pomocą --no-verify.
Conventional Commits
Wszystkie commity przeznaczone do wydania muszą być zgodne z formatem type(scope): subject.
Prawidłowe typy: feat, fix, refactor, docs, test, chore, perf, style, ci
Prawidłowe zakresy: db, sse, oauth, dashboard, api, cli, docker, ci, mcp, a2a, memory, skills, cloud-agent, guardrails, compression, auto-combo, resilience, providers, executors, translator, domain, authz
Zmiany niekompatybilne wstecznie: dodaj stopkę BREAKING CHANGE: lub ! po zakresie (np. feat(api)!: drop /v0).
Dokumentacja
npm run check:docs-synckończy się powodzeniem (uruchamiane automatycznie przez pre-commit)npm run check:docs-allkończy się powodzeniem (kontrola zbiorcza: docs-sync + docs-counts + env-doc-sync + deprecated-versions + doc-links)npm run check:env-doc-synckończy się kodem 0 — kontrakt zmiennych środowiskowych między kodem ↔.env.example↔docs/reference/ENVIRONMENT.mdpozostaje spójnynpm run check:doc-linkskończy się kodem 0 — brak uszkodzonych wewnętrznych odwołań Markdown po zmianie struktury- Plik
docs/architecture/ARCHITECTURE.mdzostał sprawdzony pod kątem rozbieżności dotyczących pamięci masowej/środowiska uruchomieniowego - Plik
docs/guides/TROUBLESHOOTING.mdzostał sprawdzony pod kątem rozbieżności dotyczących zmiennych środowiskowych i działania systemu - Jeśli zmieniono
.env.example: zaktualizowanodocs/reference/ENVIRONMENT.md - Jeśli nowa funkcja ma interfejs użytkownika: wspomniano o niej w
docs/guides/USER_GUIDE.md - Jeśli nowa funkcja ma API: zaktualizowano
docs/reference/API_REFERENCE.md+docs/openapi.yaml - Jeśli nowa funkcja jest modułem: istnieje dedykowany plik
docs/<MODULE>.md - Jeśli jest to zmiana niekompatybilna wstecznie:
docs/guides/TROUBLESHOOTING.mdzawiera informację o migracji
i18n
npm run i18n:checkkończy się kodem 0 — stan tłumaczeń (.i18n-state.json) jest zsynchronizowany z dokumentami źródłowymi (brak rozbieżnych źródeł w trybie ścisłym; ostrzeżenie w trybie ostrzegawczym jest dopuszczalne w przypadku wprowadzanych w ostatniej chwili poprawek dokumentacji, ale przed utworzeniem tagu wynik powinien wynosić 0)npm run i18n:check-ui-coveragekończy się kodem 0 — każdy język interfejsu użytkownika osiąga próg pokrycia wynoszący co najmniej 80%npm run i18n:sync-ui:dryzgłasza 0 brakujących kluczy we wszystkich 42 językach- Jeśli zmieniono źródłową dokumentację angielską, przed utworzeniem tagu uruchom
npm run i18n:run(wymagaOMNIROUTE_TRANSLATION_API_KEYw.env) - Wkład w tłumaczenia można odłożyć do następnego wydania, jeśli zmiany są niewielkie (odnotuj to w CHANGELOG)
Migracje bazy danych
- Jeśli
src/lib/db/migrations/zawiera nowe pliki:- Każda migracja jest idempotentna (
CREATE TABLE IF NOT EXISTSitd.) - Migracje są opakowane w transakcje
- Numeracja jest prawidłowa (brak luk w sekwencji)
- Każda migracja jest idempotentna (
- Przetestuj na świeżej instalacji: usuń
~/.omniroute/omniroute.dbi uruchomnpm run dev - Przetestuj na istniejącej instalacji: wykonaj kopię zapasową bazy danych, uruchom migrację i zweryfikuj schemat
- Pliki WAL (
-wal,-shm) są obsługiwane prawidłowo, jeśli migracja przepisuje tabele
Katalog dostawców (walidowany przez Zod)
- Schemat Zod w
src/shared/constants/providers.tsjest prawidłowy podczas ładowania- Wszyscy dostawcy mają wymagane pola (
id,label,kinditd.) - Dla nowych bezpłatnych dostawców podano
freeNote - Dostawcy OAuth mają konfigurację
oauthConfigzarejestrowaną wsrc/lib/oauth/constants/oauth.ts
- Wszyscy dostawcy mają wymagane pola (
- Jeśli dodano nowego dostawcę: odpowiadający mu executor znajduje się w
open-sse/executors/ - Jeśli format jest inny niż OpenAI: translator znajduje się w
open-sse/translator/ - Modele są zarejestrowane w
open-sse/config/providerRegistry.ts - Testy jednostkowe w
tests/unit/obejmują klasyfikację dostawców i routing
Aplikacja desktopowa (Electron)
Jeśli zmieniono electron/:
npm run electron:smoke:packagedkończy się powodzeniem- Kompilacje przetestowano dla co najmniej jednego z wariantów
:win,:mac,:linux - Certyfikaty podpisywania kodu nie wygasły (jeśli używane jest podpisywanie)
- Wersja w
electron/package.jsonjest zgodna z głównym plikiempackage.json - Wskaźnik kanału automatycznych aktualizacji został zaktualizowany, jeśli wydanie trafia do kanału
stable
Układ kompilacji
Repozytorium używa trzech odrębnych katalogów wyjściowych — nigdy ich nie pomyl:
| Katalog | Przeznaczenie | Śledzony? |
|---|---|---|
src/ |
Kod źródłowy aplikacji (TypeScript / TSX) | Tak |
.build/ |
Pliki pośrednie kompilacji — wynik next build (distDir) |
Nie (ignorowany przez git) |
dist/ |
Dystrybucyjny pakiet npm — składany przez assembleStandalone |
Nie (ignorowany przez git) |
Uwaga dla operatora: katalog obrazu na zdalnym VPS pozostaje pod ścieżką
/usr/lib/node_modules/omniroute/app/. Zmieniło się tylko wyjście kompilacji wewnątrz repozytorium (app/→dist/). Procedury wdrażania synchronizują zawartośćdist/przez rsync ze zdalnym katalogiemapp/— zmiany ścieżek na VPS nie są wymagane.
Przepływ pojedynczej kompilacji:
npm run build:release
└─ rm -rf .build dist (czyszczenie)
└─ next build → .build/next/ (pliki pośrednie)
└─ assembleStandalone (kopiuje standalone + static + public + natywne moduły → dist/)
└─ zapisuje dist/BUILD_SHA (wartość kontrolna HEAD)
NIE uruchamiaj npm run build, a następnie osobno npm run build:cli na potrzeby wdrożenia — użyj
npm run build:release, które wykonuje czystą ponowną kompilację i zapisuje wartość kontrolną w jednym poleceniu.
Weryfikacja artefaktu
npm run build:releasekończy się powodzeniem, adist/BUILD_SHA==git rev-parse --short HEADnpm run check:pack-artifactnie zgłasza problemów — brakapp.__qa_backup,scripts/scratch,package-lock.jsoni innych lokalnych pozostałości- Po kompilacji istnieje
dist/server.js
Tagowanie i wydanie
- Uruchom
/generate-release-cc(procedura Claude Code):- Tworzy tag
vX.Y.Z - Wysyła tag i gałąź
- Tworzy wydanie GitHub z treścią dziennika zmian
- Dołącza instalatory Electron (jeśli zostały zbudowane)
- Tworzy tag
- Lub wykonaj ręcznie:
git tag -a vX.Y.Z -m "Wydanie vX.Y.Z" git push origin vX.Y.Z gh release create vX.Y.Z --notes-from-tag
Wdrożenie
Procedury wdrażania korzystają z lekkiego przepływu rsync — bez npm pack i bez npm i -g:
- Użyj procedury wdrażania odpowiedniej dla środowiska docelowego:
/deploy-vps-local-cc— lokalny VPS (192.168.0.15)/deploy-vps-akamai-cc— VPS Akamai (69.164.221.35)/deploy-vps-both-cc— oba
- Przed wdrożeniem potwierdź, że
dist/BUILD_SHA==git rev-parse --short HEAD - Kompilacja musi zostać uruchomiona w miejscu, w którym
node_modulesjest rzeczywistym katalogiem (główna kopia robocza lub worktree z wykonanymnpm ci— NIE worktree korzystające z dowiązania symbolicznego) - Wykonaj test dymny wdrożonej instancji:
- Otwórz
/dashboard/health→ sprawdź, czy ciąg wersji odpowiada wydaniu - Wyślij żądanie
/v1/chat/completionsdo znanego dostawcy - Sprawdź, czy
/api/monitoring/healthzwraca wyłączniki obwodu ze stanemCLOSED - Potwierdź, że transporty MCP odpowiadają (
/mcpHTTP,/mcp-sseSSE)
- Otwórz
Po wydaniu
- Uruchom
/capture-release-evidences-cc(procedura Claude Code)- Rejestruje zrzuty ekranu/nagrania WebP nowych funkcji
- Dołącza je do informacji o wydaniu / wpisu na blogu
- Zaktualizuj GitHub Discussions / Discord, publikując ogłoszenie o wydaniu
- Otwórz kamień milowy dla następnej wersji
- Jeśli wydanie jest krytyczne: przypnij dyskusję lub dodaj wpis w
news.json, aby wyświetlić baner w aplikacji
Warunki publicznego uruchomienia Radar
Ogłoszenie Radar zostało celowo zatwierdzone z ustawieniem active: false. Aktywacja jest osobną
zmianą wykonywaną po udokumentowaniu każdego z poniższych punktów:
- Wszystkie ułożone warstwowo PR-y Radar zostały scalone, a CI dla końcowego commita wydania przechodzi pomyślnie
- Wdróż i przetestuj dymnie trasy OSS Radar, pozostawiając
RADAR_ENABLEDdomyślnie wyłączone - Przetestuj dymnie
GET /planos,/termos,/privacidadei/reembolsona wskazanym hoście Radar - Zarejestruj tożsamość/dane kontaktowe/adres operatora oraz zatwierdzoną przez właściciela ocenę prawną w prywatnej usłudze
- Przetestuj Stripe Checkout i podpisany webhook wyłącznie w trybie testowym
- Przetestuj jedno zaszyfrowane dostarczenie wiadomości transakcyjnej od zatwierdzonego nadawcy/z zatwierdzonej domeny
- Udowodnij możliwość odtworzenia kopii zapasowej i przeprowadź jedno nadzorowane uruchomienie badawcze z ograniczonym budżetem
- Zatwierdź zasady weryfikacji BRL/PIX przed przyjmowaniem dowodów wpłat
- Włącz publiczny Checkout dopiero po spełnieniu powyższych warunków, a następnie aktywuj nowy identyfikator w
news.json - Sprawdź, czy baner na stronie głównej używa zlokalizowanej treści i czy nowy identyfikator pojawia się po odrzuceniu starszego identyfikatora
Smoke embedded services (v3.8.4+)
Przed wypuszczeniem dowolnego wydania zawierającego zmiany embedded services zweryfikuj:
Boot na świeżej DB (łapie kolizje migracji — dodane po hotfixie v3.8.4)
DATA_DIR=$(mktemp -d) npm start &— poczekaj 10 s na bootcurl -s http://127.0.0.1:20128/api/services/9router/status | jq '.tool'zwraca"9router"(NIE 404, NIE 500). Potwierdza, że migracja071_services.sqlsię zastosowała + wiersz zaseedowany.sqlite3 $DATA_DIR/storage.sqlite "PRAGMA table_info(version_manager);" | grep -E "provider_expose|logs_buffer_path|last_sync_at"zwraca 3 wiersze.sqlite3 $DATA_DIR/storage.sqlite "PRAGMA table_info(webhooks);" | grep -E "kind|metadata_encrypted"zwraca 2 wiersze (waliduje zastosowanie070_webhooks_kind_metadata.sql).node --import tsx/esm --test tests/unit/db/no-migration-collisions.test.tsprzechodzi — strzeże przed przyszłymi kolizjami.
9Router
POST /api/services/9router/installzwraca 200 zinstalledVersionw poniżej 2 minPOST /api/services/9router/startzwraca 200 istate: "running"w poniżej 30 sGET /api/services/9router/statusraportujehealth: "healthy"POST /v1/chat/completionsz"model": "9router/auto/..."zwraca 200 (routing end-to-end przez 9Router)GET /dashboard/providers/services/9router/embed/dashboardrenderuje natywne UI 9Router wewnątrz proxy (bez bezpośredniego iframe127.0.0.1:port)POST /api/services/9router/rotate-keyzwraca{ keyRotated: true }i usługa restartuje się czystoPOST /api/services/9router/stopzwraca 200 istate: "stopped"GET /api/services/9router/logs?tail=50zwraca stream SSE z eventemsnapshotzawierającym ostatnie linie- Instalacja w środowisku bez
npmw PATH zwraca 500 z przyjaznym (bez stack-trace) komunikatem błędu
CLIProxyAPI
POST /api/services/cliproxy/installzwraca 200 w poniżej 2 minPOST /api/services/cliproxy/startzwraca 200 istate: "running"w poniżej 30 sGET /api/services/cliproxy/statusraportujehealth: "healthy"POST /api/services/cliproxy/stopzwraca 200 istate: "stopped"GET /api/services/cliproxy/logs?tail=50zwraca stream SSE
Regresja bezpieczeństwa
curl -H "X-Forwarded-For: 1.2.3.4" http://localhost:20128/api/services/9router/startzwraca403 LOCAL_ONLYcurl -H "X-Forwarded-For: 1.2.3.4" http://localhost:20128/api/services/cliproxy/startzwraca403 LOCAL_ONLY- Odpowiedzi błędów z
/api/services/*nie zawierająerr.stackani bezwzględnych ścieżek plików
Kontrole v3.8.0+
Przed wypuszczeniem dowolnego wydania v3.8.x zweryfikuj te dodatkowe pozycje:
omniroute --traybootuje na macOS (systray2 instalowany do~/.omniroute/runtime/)omniroute --traybootuje na Linux (wymaga DISPLAY; graceful error jeśli nie ustawione)omniroute --traybootuje na Windows (PowerShell NotifyIcon, bez dodatkowych binarek)omniroute config tray enabletworzy wpis autostart; disable go usuwanpm install -g omniroute@<this-version>uruchamia postinstall bez fatalnego wyjścia- Ścieżka update zachowuje optional deps:
omniroute update --applyi auto-updater uruchamiająnpm install -g … --include=optional, żebyoptionalDependencies(better-sqlite3, keytar, tls-client oraz stack SLM llmlingua:@atjsh/llmlingua-2@2.0.5,js-tiktoken) przeżyły update. Tier ultramodelPathSLM potrzebuje też modelu tinybert, auto-pobieranego do${DATA_DIR}/models/llmlinguaprzy pierwszym użyciu. Postinstall (scripts/build/colocateOptionals.mjs) następnie ko-lokuje opcjonalne zamknięcie SLM dodist/node_modules, żeby worker rozwiązywał JEDNĄ instancję@huggingface/transformers^4.2.0 — standalone trace bundluje tylko transformers, nie dynamicznie importowane optionals, więc bez tego worker załadowałby llmlingua-2 przeciw transformers z roota i tier SLM cicho fail-openowałby. omniroute statusdziała bez.env(ścieżka tokenu CLI, tylko loopback)curl http://localhost:20128/api/shutdownzwraca 401 (trasa zawsze chroniona)curl -H "host: evil.com" http://localhost:20128/api/mcp/ssezwraca 401 (strażnik loopback)- Runtime SQLite resolvuje do
bundledprzy pierwszym uruchomieniu (bundlowana binarka poprawna dla platformy) - Runtime SQLite spada na
runtime, gdynode_modules/better-sqlite3jest usunięte - Smart MCP filter kompresuje realny output
playwright-mcp browser_snapshot(redukcja ≥50%) - Wszystkie 10 plików
skills/omniroute*/SKILL.mdsą publicznie pobieralne przez raw GitHub URL - Kreator onboardingu pokazuje krok tour „How It Works” tier na świeżym setupie
- Widget pokrycia tierów na home dashboard pokazuje liczby configured/active
Rollback
Jeśli wydanie ma krytyczny problem:
gh release edit vX.Y.Z --prerelease(oznacza jako nie-latest)git tag -d vX.Y.Z && git push --delete origin vX.Y.Z(tylko jeśli użytkownicy jeszcze nie adoptowali)- Albo: hotfix na
release/vX.Y.0→ patch releasevX.Y.(Z+1) - Natychmiast zakomunikuj w GitHub Discussions i Discord
Twarde reguły
- Nigdy nie commituj bezpośrednio do
main - Nigdy nie używaj
git push --forcena gałęziemainanirelease/* - Nigdy nie pomijaj hooków Husky (
--no-verify) - Nigdy nie commituj sekretów, credentials ani plików
.env - Coverage musi zostać ≥60/60/60/60 (statements/lines/functions/branches)
- Zawsze dołączaj lub aktualizuj testy przy zmianie kodu produkcyjnego w
src/,open-sse/,electron/lubbin/
Automatyczna kontrola synchronizacji
Uruchom lokalnie strażnika sync docs przed otwarciem PR:
npm run check:docs-sync
CI też uruchamia tę kontrolę w .github/workflows/ci.yml (job lint).