mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-08-14 03:02:14 +03:00
* fix(ci): clear base-reds on release/v3.8.50 (round 3) - CHANGELOG.md: restore the top [Unreleased] section dropped by the #10189 reconcile (docs-sync gate: first section must be Unreleased) - env-doc-sync: document CONDUCTOR_ORCHESTRATOR_TOKEN + CONDUCTOR_SPOKESPERSON_URL in .env.example/ENVIRONMENT.md; allowlist the CI-only GITHUB_STEP_SUMMARY and TS7_BASE_REF (ts7 ratchet signals); drop a stray merge artifact line - providers: restore the audited chatanywhere metadata entry that base-reds round 2 dropped together with its duplicate — the provider was half-wired (registry+endpoint without APIKEY metadata), which is what the wave3 test catches; re-pin providers-constants-split at the measured 228 - docs counts: 338 -> 339 (today's +2 void-ai/helixmind, -1 Puter) via gen:provider-reference + README/AGENTS/llm.txt/package.json/diagrams/i18n mirrors - file-size ratchet: annotated rebaseline for the two pre-existing drifts (ModelSelectModal 1138, gateways 1250) following the 2026-08-11 precedent Refs #9985 * fix(ci): base-reds round 3b — stale sibling tests + mode-pack weight contract - check-docs-counts-sync.test.ts: drop the imports/subtests of the four helpers #10196 removed from the gate script (readMcpFactsFromSource, listLocalizedDocs, makeRequiredCountsValidator, checkFreeTierInventory) — the new-API tests that #10196 added stay; the file now loads again under the node runner - quota-connection-recovery.test.ts: convert from vitest APIs to node:test — the file lives in tests/unit/*.test.ts (node-runner glob) and the vitest runtime crashes when imported outside vitest, killing the whole shard entry - modePacks.ts: re-normalize all six mode packs to sum 1.0 — #8940 added sessionAvailability: 0.05 to every pack without rebalancing (1.05 total); ratios preserved exactly (÷1.05), so post-normalizeScoringWeights behavior is unchanged; restores the declared sum-to-1.0 contract the 4235 test pins Refs #9985 * fix(ci): base-reds round 3c — vitest siblings, weights default, secrets FP, mutation tap - DistributeProxiesButton.test.tsx: wrap renders in NextIntlClientProvider — #9245 localized the component (useTranslations) and left the test without the intl context, failing all 14 cases - scoring.ts: re-normalize DEFAULT_WEIGHTS to sum 1.0 (same #8940 class as the mode packs — sessionAvailability added without rebalancing; ratios preserved) - .gitleaks.toml: generalize the kimi sponsor-banner localStorage-key allowlist to -v\d+ — #10200 bumped v1→v2 and the stale regex regressed the secrets ratchet with a false positive - stryker.conf.json: register 6 covering unit tests in tap.testFiles (4 modules) so their mutant kills count — unblocks check:mutation-test-coverage --strict Refs #9985 * fix(ci): base-reds round 3d — inspector factor gap, stale registry/gap tests, i18n key sync - comboScoringInspector: add cacheAffinity/sessionAvailability/connectionDensity to FACTOR_KEYS + the factor-key type — calculateScore() weighs them but the breakdown omitted them, so the explained contributions never summed to the reported score (inspector bug, red on the pure tip) - combo-scoring-inspector.test: make the explicit-weights override sum-neutral (±0.05 shift) so it stays valid for any DEFAULT_WEIGHTS values — the hardcoded override only summed to 1.0 against the pre-#8940 defaults, which is also why explicit weights silently fell back to 'default' on the tip - unorouter-registry.test: align to the canonical .com host (api.unorouter.ai 301-redirects there, verified live) and to wave4's live model discovery (passthrough, no static seed) — the .ai/auto-model expectations were stale - check-migration-numbering.test: 147 left KNOWN_GAPS when 147_api_keys_model_access_mode.sql landed — assert absent (same as 143) - i18n: sync-ui pass — 35,914 missing UI keys stamped as __MISSING__ placeholders across 42 locales (mechanical; greens the pt-BR key-presence integrity test; coverage pct unchanged by design — translation is a separate workstream) Refs #9985 * fix(ci): base-reds round 3e — 2 real defects + 14 stale sibling tests (waves A-E) Real defects fixed: - src/lib/db/apiKeys.ts: #9313's empty-allowlist early return bypassed the group permission check, silently disabling group deny rules (#8817) for every key without a per-key allowlist; fall-through restored, restricted+[] deny-all kept - open-sse/utils/proxyFetch.ts: #10032 re-appended the raw transport error to the propagated message, reintroducing the proxy user:password leak #9837 closed; new redactProxyDetailsInMessage() keeps the reason, redacts URL/credentials - .github/workflows/quality.yml: #10134 added the TS7 ratchet as a separate blocking step AFTER the aggregated gates — the exact #8542 masking mechanism; folded into the non-fail-fast loop (still blocking, still PR-only) ⚠️ CI edit, gate-strengthening — explicit owner sign-off requested on the PR - src/i18n/messages/ko.json: 3 machine-mistranslation regressions caught by the #8244 glossary checker (장애인→비활성화됨, 양말5://→socks5://, 비클로드→Claude가 아닌) Stale sibling tests aligned to deliberately-moved contracts (each cites its mover): request-log-detail-layout + -stream (#9245 intl provider), repro-8542 pin update, quality-rail-gate-membership (#10134 shape), agentSkills-routes 45→46 (#9058), cloudflare-ai-catalog-8717 (#8804 supersedes #8808), executor-xai (#9994), vision-bridge-claude-wire (#9463 minimax→openai), sse-auth forced-pin (#8893), tls-proxy-context (strengthened leak guards), rate-limit-local-error-classification (#9164/#9342), minimax-thinking-signature (#9463), codebuddy-cn (#9723 +1 test), github-copilot-custom-model (#9050), providers-g4f-batch3 (#9584), synced-capability-warmup (#9199, stricter), sidebar-tools-group (#8221), oauth-modal-grok-cli-paste (#9245); agentSkills/catalog.ts comment 45→46; file-size rebaseline for proxyFetch (+19, annotated) Refs #9985 * fix(ci): base-reds round 3f — waves F-J: 9 more real defects + stale sibling sweep Real production defects fixed (all red on the pure tip, each with its origin): - routeGuard.ts: #8949 accidentally DELETED the /api/providers/[id]/login local-only pattern — the route spawns a browser, so the loopback gate for a process-spawning route was gone (Hard Rules #15/#17); restored (314 guard tests green) - agentSkills generator: #9058's category dispatch gave the config category an empty body, wiping skills/config-codex-cli/SKILL.md at the #10131 sync; fixed + SKILL.md regenerated via the official generator - imageRegistry: #9982 broke same-provider bare aliasing (antigravity preview id sent upstream unresolved); new resolveSameProviderBareAlias() keeps the fal cross-provider fix intact - imageRegistry: #9982's prefix strip handed the bare nano-banana ids to fal-ai, violating the pinned 2026-07-31 operator decision (adobe-firefly owns them); fal entries made prefix-only (dispatch already re-prefixes) - mediaGeneration/fal.ts: the missing-credential 401 guard was lost when #10198 deleted the superseded falHandler — tests were hitting the live network - bottleneckPatch/rateLimitManager: #9041's merge clobbered #9604, resurrecting the Bottleneck v2.19.5 heartbeat bug (reservoir never refills); patched the library defect at the root and re-aligned chat-rate-limit-body-lock to the working reservoir contract - processSupervisor.mjs: #9761 regressed the Node spawn to bare "node" (the #9156 launchd bug) and dropped #9209's ipv4first args; both restored - openai-responses/pureHelpers: #9423's Agent null-sentinel was unreachable on the schemaless JSON-string path; gate extended - i18n en.json: #8222's regen reverted the #9976 unclosed-tag fix and #8559's combo-cooldown copy; #9038 shipped 40 t() calls with no messages (runtime MISSING_MESSAGE); all restored/added + official sync-ui stamps, and vi's zero-marker policy re-established via the sanctioned translation backend Stale sibling tests aligned (movers cited inline): chat-helpers (#9447), executor-antigravity (#9351), video-fal-grok (#9982), visionBridge (#9759), web-session-credentials (#8974), production-build-module-integrity (positive anchor added), agentSkills-generator/skillManifestsLint/skills-injection/ agentSkillTools-mcp/listCapabilities-a2a (#9058), memory-settings (#10010), model-catalog-policy-invalidation (#8906), model-alias-seed (#9485), reactive-context-compaction (#8949), combo-provider-wildcard (broken upsert helper), oauth-google-loopback (43-locale resurrected-key removal) Validation: 501/501 across the 47 touched test files; typecheck:core, lint, file-size, docs-sync all green. Refs #9985 * fix(ci): base-reds round 3g — wave K/L: 4 more real defects + stale alignments Real defects: - base/reasoningEffort.ts: the stale duplicate cherry-pick #9612 re-added the codex minimal→low rewrite that #9883 had deliberately removed (OMP minimal passthrough); block removed again - cursorImages.ts: #9840 wired prepareCursorImageForWire (sharp re-encode, fail-closed) into the SHARED resolveCursorImages, breaking zai-web and conol-web image uploads (HTTP 400 'undecodable'); new prepareForWire opt-out, Cursor default path unchanged (8 cursor suites green) - modelCapabilities/snapshot: catalog prepare still issued 323 per-model reads of model_context_overrides + max_input_tokens overrides, violating #9199's bulk-load contract; both now resolve from the snapshot single pass - v1-models-discovery-conformance: re-pinned to the bounded 30s SWR window (#9199/#10198) — the old 'stale-first regardless of age' contract is gone Stale tests aligned (movers cited inline): codex-tools-strict-default (#9828 redundant-oneOf strip), devin-providers (#9245 i18n), db-migrationrunner- constants-split (147→151 renumber #8228), gitlab-duo-oauth-setup (#9245), chatcore-extracted-modules (#9161 outbound-protocol keying) compression-api CI failures were cascade artifacts of codex-tools-strict-default failing in the same force-exit shard process — no own defect (171/171 local). Refs #9985 * fix(test): compression-api — register both describes before the runner starts The DATA_DIR setup + route/db top-level awaits sat BETWEEN the two describes; under --test-force-exit (the CI unit-runner flag) the process exits once the already-registered tests finish, so on slow CI machines the whole second describe died as 'Promise resolution is still pending' — the recurring CI-only shard-2 failure that never reproduced locally without the flag. Moved to the top of the file; 10/10 under --test-force-exit locally. Refs #9985 * fix(quality): freeze modelCapabilities.ts at 1006 (annotated) — snapshot routing growth Refs #9985 * fix(quality): move the modelCapabilities freeze into the frozen map (nested schema) Refs #9985 * fix(i18n): translate all 39,718 pending UI keys across 42 locales (owner-approved) Mass-translated every __MISSING__ placeholder via the official i18n:sync-ui --translate-markers pipeline (operator backend), restoring i18nUiCoverage to the 100 baseline (was 89.9 after the merge-storm UI landings + the 42 keys #9038 never shipped). Post-pass repairs, all caught by the existing gates: - glossary: retired renderings the machine reintroduced normalized again (提供商→提供者 zh-CN/zh-TW, 鏈接→連結, 文檔→文件, 調用→呼叫, 供應商→提供者, 響應→回應, 不活躍→未啟用 zh-TW; 클로드→Claude, 옴니루트→OmniRoute ko); DATA_DIR forbidden rendering avoided via 数据文件夹 rephrase - ICU integrity: 120 values with renamed/dropped {params} repaired (39 positional renames, 81 reset to the en source — functional over fluent) Validation: glossary/pt-BR/vi/deno-relay/settings-keys/value-drift/google- loopback suites 76/76; placeholder diff en×42 locales = 0; worst-locale coverage = 100.0%. Refs #9985 --------- Co-authored-by: backryun <bakryun0718@proton.me>
501 lines
27 KiB
JSON
501 lines
27 KiB
JSON
{
|
||
"$schema": "https://stryker-mutator.io/schemas/stryker-schema.json",
|
||
"_comment": [
|
||
"Mutation testing for the ~8 critical modules (Task 11 — Fase 7).",
|
||
"NIGHTLY ONLY — DO NOT run on every PR. Mutation testing is expensive:",
|
||
" - Each mutant requires a full test suite execution.",
|
||
" - The 8 modules produce ~200–500 mutants; est. 30–90 min per run.",
|
||
" - Wired to the nightly CI workflow (.github/workflows/nightly-mutation.yml),",
|
||
" NOT to the 'lint' / 'quality-gate' PR jobs.",
|
||
"",
|
||
"TEST RUNNER — @stryker-mutator/tap-runner (NOT vitest):",
|
||
" The 8 critical modules are covered by node:test files in tests/unit/",
|
||
" (run via `node --import tsx --test`), NOT by vitest. The vitest config",
|
||
" only includes a small set of .test.tsx + open-sse/**/__tests__ files, so",
|
||
" the vitest-runner would find ZERO covering tests for these modules. The",
|
||
" tap-runner spawns each node:test file individually and parses its TAP",
|
||
" output, which matches how this repo actually exercises the modules.",
|
||
" Each test file is loaded with tsx (TypeScript/ESM) + the project polyfill,",
|
||
" the same way `npm run test:unit` runs.",
|
||
"",
|
||
"Install before running (not bundled to avoid E2E / CI bloat):",
|
||
" npm install --save-dev @stryker-mutator/core @stryker-mutator/tap-runner",
|
||
"",
|
||
"Run manually:",
|
||
" npm run test:mutation # full run (slow — nightly budget)",
|
||
" npx stryker run --dryRunOnly # validate the baseline only (no mutants)",
|
||
" (single-module probe: temporarily narrow `mutate` + `tap.testFiles` in this file)",
|
||
"",
|
||
"VALIDATED 2026-06-15: `npx stryker run --dryRunOnly` exits 0 — all 129 covering",
|
||
"test files run green in the Stryker sandbox and the perTest coverage map builds for",
|
||
"all 8 instrumented modules (15k+ mutants). The baseline dry-run takes ~20 min with",
|
||
"concurrency=1; the full mutation phase runs on top (advisory, capped by the workflow",
|
||
"timeout). So the nightly produces REAL mutation scores for the 8 modules.",
|
||
"",
|
||
"Mutation score per module → quality-baseline.json key 'mutationScore.<module>'",
|
||
"Direction: up (score can only improve; ratchet blocks drops — wired in a later INT phase)."
|
||
],
|
||
"packageManager": "npm",
|
||
"incremental": true,
|
||
"incrementalFile": "reports/mutation/stryker-incremental.json",
|
||
"testRunner": "tap",
|
||
"plugins": [
|
||
"@stryker-mutator/tap-runner"
|
||
],
|
||
"tap": {
|
||
"testFiles": [
|
||
"tests/unit/7993-noauth-proxy-routing.test.ts",
|
||
"tests/unit/8200-perplexity-web-401-cooldown.test.ts",
|
||
"tests/unit/8247-accountfallback-model-unhealthy.test.ts",
|
||
"tests/unit/8248-accountfallback-nvidia-degraded.test.ts",
|
||
"tests/unit/8332-combo-vision-fallback.test.ts",
|
||
"tests/unit/8376-econnrefused-breaker.test.ts",
|
||
"tests/unit/8396-cooldown-429-cap.test.ts",
|
||
"tests/unit/8488-capability-filter-fail-closed.test.ts",
|
||
"tests/unit/8779-agy-prefix-credential-lookup.test.ts",
|
||
"tests/unit/account-fallback-anthropic-quota.test.ts",
|
||
"tests/unit/account-fallback-cf1010-no-retry-8775.test.ts",
|
||
"tests/unit/account-fallback-lockout-eviction.test.ts",
|
||
"tests/unit/account-fallback-retry-after-json.test.ts",
|
||
"tests/unit/account-fallback-route-restriction-403.test.ts",
|
||
"tests/unit/account-fallback-service.test.ts",
|
||
"tests/unit/accountfallback-ratelimit-400-4976.test.ts",
|
||
"tests/unit/adaptive-admission-route-matrix.test.ts",
|
||
"tests/unit/adaptive-admission-runtime.test.ts",
|
||
"tests/unit/adobe-firefly.test.ts",
|
||
"tests/unit/alibaba-free-tier-exhaustion.test.ts",
|
||
"tests/unit/anthropic-thinking-signature-recovery.test.ts",
|
||
"tests/unit/antigravity-429-quota-tdd.test.ts",
|
||
"tests/unit/antigravity-prefer-stored-project.test.ts",
|
||
"tests/unit/api-key-policy-noauth-allowed-connections.test.ts",
|
||
"tests/unit/api-key-policy-noauth-allowed-connections.test.ts",
|
||
"tests/unit/api-key-rotator-health.test.ts",
|
||
"tests/unit/api/jobs.test.ts",
|
||
"tests/unit/appearance-widget-settings-schema.test.ts",
|
||
"tests/unit/auth-anonymous-fallback-toggle.test.ts",
|
||
"tests/unit/auth-antigravity-account-retry-v2.test.ts",
|
||
"tests/unit/auth-clear-account-error.test.ts",
|
||
"tests/unit/auth-disable-cooling-2997.test.ts",
|
||
"tests/unit/auth-extract-api-key.test.ts",
|
||
"tests/unit/auth-noauth-fallback-loop-3061.test.ts",
|
||
"tests/unit/auth-ollama-cloud-per-model-403-3027.test.ts",
|
||
"tests/unit/auth-opencode-zen-noauth-fallback.test.ts",
|
||
"tests/unit/auth-terminal-status.test.ts",
|
||
"tests/unit/authz/discovery-routes-local-only.test.ts",
|
||
"tests/unit/authz/route-guard-local-prefix.test.ts",
|
||
"tests/unit/authz/route-guard-skills-collect.test.ts",
|
||
"tests/unit/authz/route-guard-version-get-exemption.test.ts",
|
||
"tests/unit/authz/route-guard-vnc-session-local-only.test.ts",
|
||
"tests/unit/authz/routeGuard.test.ts",
|
||
"tests/unit/auto-combo-context-advertising.test.ts",
|
||
"tests/unit/auto-combo-engine.test.ts",
|
||
"tests/unit/auto-combo-scoring-clamp.test.ts",
|
||
"tests/unit/breaker-network-error-guard.test.ts",
|
||
"tests/unit/bug-7940-gemini-retrydelay.test.ts",
|
||
"tests/unit/bug-9204-agy-provider-alias-credentials.test.ts",
|
||
"tests/unit/build/check-circular-deps.test.ts",
|
||
"tests/unit/cache-sweeps.test.ts",
|
||
"tests/unit/capability-filter.test.ts",
|
||
"tests/unit/cc-bridge-openai-image-7777.test.ts",
|
||
"tests/unit/cc-compatible-provider.test.ts",
|
||
"tests/unit/chat-adaptive-admission-binding.test.ts",
|
||
"tests/unit/chat-combo-live-test.test.ts",
|
||
"tests/unit/chat-context-relay.test.ts",
|
||
"tests/unit/chat-cooldown-aware-retry.test.ts",
|
||
"tests/unit/chat-helpers.test.ts",
|
||
"tests/unit/chat-route-coverage.test.ts",
|
||
"tests/unit/chat-route-edge-cases.test.ts",
|
||
"tests/unit/chatcore-compression-integration.test.ts",
|
||
"tests/unit/chatcore-executor-helpers.test.ts",
|
||
"tests/unit/chatcore-executor-proxy.test.ts",
|
||
"tests/unit/chatcore-extracted-modules-3821.test.ts",
|
||
"tests/unit/chatcore-headers.test.ts",
|
||
"tests/unit/chatcore-imports-cleanly.test.ts",
|
||
"tests/unit/chatcore-log-truncation.test.ts",
|
||
"tests/unit/chatcore-memory-extraction.test.ts",
|
||
"tests/unit/chatcore-memory-skills-injection.test.ts",
|
||
"tests/unit/chatcore-non-streaming-sse.test.ts",
|
||
"tests/unit/chatcore-passthrough-tool-names.test.ts",
|
||
"tests/unit/chatcore-request-format.test.ts",
|
||
"tests/unit/chatcore-sanitization.test.ts",
|
||
"tests/unit/chatcore-semantic-cache-store.test.ts",
|
||
"tests/unit/chatcore-semantic-cache.test.ts",
|
||
"tests/unit/chatcore-strip-stale-headers.test.ts",
|
||
"tests/unit/chatcore-telemetry-helpers.test.ts",
|
||
"tests/unit/chatcore-translation-paths.test.ts",
|
||
"tests/unit/chatcore-upstream-timeouts.test.ts",
|
||
"tests/unit/check-error-helper.test.ts",
|
||
"tests/unit/check-route-guard-membership.test.ts",
|
||
"tests/unit/check-test-discovery.test.ts",
|
||
"tests/unit/circuit-breaker-abort-provider-trip-7907.test.ts",
|
||
"tests/unit/circuit-breaker-client-abort.test.ts",
|
||
"tests/unit/circuit-breaker-failure-kind.test.ts",
|
||
"tests/unit/circuit-breaker-registry-cap.test.ts",
|
||
"tests/unit/circuit-breaker-stream-controller-4602.test.ts",
|
||
"tests/unit/claude-code-parity.test.ts",
|
||
"tests/unit/claude-effort-suffix-strip.test.ts",
|
||
"tests/unit/claude-oauth-provider.test.ts",
|
||
"tests/unit/claude-passthrough-stream-boolean.test.ts",
|
||
"tests/unit/claude-passthrough-thinking-2454.test.ts",
|
||
"tests/unit/cli-simulate.test.ts",
|
||
"tests/unit/cline-response-envelope.test.ts",
|
||
"tests/unit/clinepass-provider.test.ts",
|
||
"tests/unit/cliproxyapi-dedicated-credential-7645.test.ts",
|
||
"tests/unit/cliproxyapi-model-mapping-dispatch.test.ts",
|
||
"tests/unit/cliproxyapi-model-mapping-dispatch.test.ts",
|
||
"tests/unit/cliproxyapi-model-mapping-dispatch.test.ts",
|
||
"tests/unit/codex-failover.test.ts",
|
||
"tests/unit/codex-quota-selection-hydration.test.ts",
|
||
"tests/unit/codex-responses-to-chat-9161.test.ts",
|
||
"tests/unit/codex-session-affinity-reset-aware-5903.test.ts",
|
||
"tests/unit/codex-stream-false.test.ts",
|
||
"tests/unit/collect-metrics-module-coverage.test.ts",
|
||
"tests/unit/combo-499-abort.test.ts",
|
||
"tests/unit/combo-account-allowlist-3266.test.ts",
|
||
"tests/unit/combo-attempt-body-isolation-7847.test.ts",
|
||
"tests/unit/combo-auto-candidate-expansion.test.ts",
|
||
"tests/unit/combo-breaker-429.test.ts",
|
||
"tests/unit/combo-cache-invalidation.test.ts",
|
||
"tests/unit/combo-config.test.ts",
|
||
"tests/unit/combo-context-relay.test.ts",
|
||
"tests/unit/combo-diagnostics-trace.test.ts",
|
||
"tests/unit/combo-dispatch-prelude.test.ts",
|
||
"tests/unit/combo-headroom-strategy.test.ts",
|
||
"tests/unit/combo-health-dashboard.test.ts",
|
||
"tests/unit/combo-health-route.test.ts",
|
||
"tests/unit/combo-hedging.test.ts",
|
||
"tests/unit/combo-least-used-account.test.ts",
|
||
"tests/unit/combo-lockout-quota-reset-6863.test.ts",
|
||
"tests/unit/combo-max-depth-config.test.ts",
|
||
"tests/unit/combo-model-lockout-honors-reset-1308.test.ts",
|
||
"tests/unit/combo-omnimodel-tag-stripping.test.ts",
|
||
"tests/unit/combo-param-validation-fallback-4519.test.ts",
|
||
"tests/unit/combo-prescreen.test.ts",
|
||
"tests/unit/combo-priority-quota-exhaustion-cutoff-5923.test.ts",
|
||
"tests/unit/combo-provider-cooldown-sibling.test.ts",
|
||
"tests/unit/combo-provider-cooldown.test.ts",
|
||
"tests/unit/combo-provider-diversity-wiring.test.ts",
|
||
"tests/unit/combo-quality-validator-reasoning.test.ts",
|
||
"tests/unit/combo-quota-exhaustion-only-fallback.test.ts",
|
||
"tests/unit/combo-quota-share-cooldown-wait.test.ts",
|
||
"tests/unit/combo-quota-soft-penalty.test.ts",
|
||
"tests/unit/combo-resource-404-health.test.ts",
|
||
"tests/unit/combo-round-robin-streaming-lock-3811.test.ts",
|
||
"tests/unit/combo-roundrobin-compat-fallback-6238.test.ts",
|
||
"tests/unit/combo-routing-engine.test.ts",
|
||
"tests/unit/combo-rr-fallback-advance-948.test.ts",
|
||
"tests/unit/combo-rr-sticky-9router.test.ts",
|
||
"tests/unit/combo-scoring-inspector.test.ts",
|
||
"tests/unit/combo-selected-connection-success.test.ts",
|
||
"tests/unit/combo-sessionless-pin-3825.test.ts",
|
||
"tests/unit/combo-skip-conn-disable-plugin-block-7806.test.ts",
|
||
"tests/unit/combo-speed-telemetry-6875.test.ts",
|
||
"tests/unit/combo-strategies.test.ts",
|
||
"tests/unit/combo-strategy-fallbacks.test.ts",
|
||
"tests/unit/combo-stream-readiness-fallback.test.ts",
|
||
"tests/unit/combo-streaming-empty-content-failover.test.ts",
|
||
"tests/unit/combo-strict-random-distribution-3959.test.ts",
|
||
"tests/unit/combo-system-prompt-templates-5501.test.ts",
|
||
"tests/unit/combo-target-defensive-modelstr.test.ts",
|
||
"tests/unit/combo-vision-aware-routing.test.ts",
|
||
"tests/unit/combo/auto-quota-cutoff.test.ts",
|
||
"tests/unit/combo/auto-status-penalty-4540.test.ts",
|
||
"tests/unit/combo/combo-exhausted-skip.test.ts",
|
||
"tests/unit/combo/combo-target-timeout-standards.test.ts",
|
||
"tests/unit/combo/effective-max-concurrency.test.ts",
|
||
"tests/unit/combo/recovery-hint.test.ts",
|
||
"tests/unit/combo/reset-window-strategy-9330.test.ts",
|
||
"tests/unit/complexity-aware-scoring-wiring.test.ts",
|
||
"tests/unit/compression-header-verification.test.ts",
|
||
"tests/unit/context-pinning-tool-calls.test.ts",
|
||
"tests/unit/cooldown-epoch-string-3954.test.ts",
|
||
"tests/unit/correctness/combo.property.test.ts",
|
||
"tests/unit/correctness/sanitizers.property.test.ts",
|
||
"tests/unit/cursor-renewal.test.ts",
|
||
"tests/unit/custom-model-target-format.test.ts",
|
||
"tests/unit/db-reset-module-state.test.ts",
|
||
"tests/unit/ddg-circuit-breaker-null-content-6999-7000.test.ts",
|
||
"tests/unit/domain-persistence.test.ts",
|
||
"tests/unit/edgetts-provider.test.ts",
|
||
"tests/unit/embeddings-auth.test.ts",
|
||
"tests/unit/error-classification.test.ts",
|
||
"tests/unit/error-message-sanitization.test.ts",
|
||
"tests/unit/error-sensitive-redaction.test.ts",
|
||
"tests/unit/execute-chat-resource-pressure-breaker.test.ts",
|
||
"tests/unit/executor-antigravity.test.ts",
|
||
"tests/unit/executor-devin-cli-agentic-acp.test.ts",
|
||
"tests/unit/executor-web-cookie-sweep.test.ts",
|
||
"tests/unit/format-provider-error-cause.test.ts",
|
||
"tests/unit/forwarded-header-budget.test.ts",
|
||
"tests/unit/gemini-web-capabilities-9356.test.ts",
|
||
"tests/unit/gemini-web-capabilities-9356.test.ts",
|
||
"tests/unit/gemini-web-missing-browser-3516.test.ts",
|
||
"tests/unit/grok-cli-oauth.test.ts",
|
||
"tests/unit/guardrails-api-3496.test.ts",
|
||
"tests/unit/headroom-codex-quota-snapshot-6379.test.ts",
|
||
"tests/unit/headroom-proxy-lifecycle.test.ts",
|
||
"tests/unit/idempotency-fusion-collision.test.ts",
|
||
"tests/unit/isLocalStreamLifecycleError-abort-shape.test.ts",
|
||
"tests/unit/issue-6343-v0-web-alias-collision.test.ts",
|
||
"tests/unit/issue-6638-ollama-quota.test.ts",
|
||
"tests/unit/issue-6686-quota-preflight-coverage.test.ts",
|
||
"tests/unit/issue-7071-ollama-session-quota.test.ts",
|
||
"tests/unit/kimi-quota-reset-recovery.test.ts",
|
||
"tests/unit/livews-forward-backoff-4604.test.ts",
|
||
"tests/unit/management-auth-hardening.test.ts",
|
||
"tests/unit/mark-account-unavailable-numeric-epoch-guard.test.ts",
|
||
"tests/unit/masked-200-exhaustion-fallback-6427.test.ts",
|
||
"tests/unit/mcp-connect-scope.test.ts",
|
||
"tests/unit/memory-embedding-remote.test.ts",
|
||
"tests/unit/memory-embedding-transformers.test.ts",
|
||
"tests/unit/microsoft-designer-web-6672.test.ts",
|
||
"tests/unit/middleware-header-strip-5849.test.ts",
|
||
"tests/unit/middleware-hooks-error-sanitization.test.ts",
|
||
"tests/unit/model-catalog-runtime-invalidation.test.ts",
|
||
"tests/unit/model-cooldowns-route-auth.test.ts",
|
||
"tests/unit/model-cooldowns-route.test.ts",
|
||
"tests/unit/model-lockout-decay.test.ts",
|
||
"tests/unit/model-lockout-exact-cooldown-cap.test.ts",
|
||
"tests/unit/model-lockout-max-cooldown.test.ts",
|
||
"tests/unit/no-memory-header.test.ts",
|
||
"tests/unit/noauth-autocombo-lockout-7623.test.ts",
|
||
"tests/unit/non-streaming-sse-terminal-typescan-4459.test.ts",
|
||
"tests/unit/nvidia-410-model-scope.test.ts",
|
||
"tests/unit/nvidia-passthrough-models-6773.test.ts",
|
||
"tests/unit/nvidia-quota-phase1.test.ts",
|
||
"tests/unit/oauth-providers-config.test.ts",
|
||
"tests/unit/oauth-redirect-uri-mismatch.test.ts",
|
||
"tests/unit/observability-fase04.test.ts",
|
||
"tests/unit/observability-payloads.test.ts",
|
||
"tests/unit/ollama-cloud-weekly-quota-cooldown-3709.test.ts",
|
||
"tests/unit/openapi-security-tiers.test.ts",
|
||
"tests/unit/openrouter-passthrough-models.test.ts",
|
||
"tests/unit/openrouter-quota-6842.test.ts",
|
||
"tests/unit/persist-429-cooldown-account-fallback.test.ts",
|
||
"tests/unit/plan3-p0.test.ts",
|
||
"tests/unit/plugin-sandbox-permissions.test.ts",
|
||
"tests/unit/plugins-route-error-sanitization.test.ts",
|
||
"tests/unit/provider-breaker-halfopen-recovery.test.ts",
|
||
"tests/unit/provider-error-rules.test.ts",
|
||
"tests/unit/provider-health-matrix.test.ts",
|
||
"tests/unit/provider-request-failure-pipeline.test.ts",
|
||
"tests/unit/public-client-ids-3493.test.ts",
|
||
"tests/unit/publicCreds.test.ts",
|
||
"tests/unit/qoder-oauth-config.test.ts",
|
||
"tests/unit/quota-groups-route.test.ts",
|
||
"tests/unit/quota-key-models-route.test.ts",
|
||
"tests/unit/quota-policy-generalization.test.ts",
|
||
"tests/unit/quota-pool-log-route.test.ts",
|
||
"tests/unit/quota-streaming-consumption-usd.test.ts",
|
||
"tests/unit/qwen-web-content-array-serialization.test.ts",
|
||
"tests/unit/rate-limit-enhanced.test.ts",
|
||
"tests/unit/rate-limit-execution-timeout-message-4165.test.ts",
|
||
"tests/unit/rate-limit-local-capacity-classification.test.ts",
|
||
"tests/unit/rate-limit-local-error-classification.test.ts",
|
||
"tests/unit/rate-limit-manager.test.ts",
|
||
"tests/unit/rate-limit-queue-timeout-lockout.test.ts",
|
||
"tests/unit/repro-7503-no-choices.test.ts",
|
||
"tests/unit/repro-9486.test.ts",
|
||
"tests/unit/repro-9486.test.ts",
|
||
"tests/unit/repro-9630-combo-false-503.test.ts",
|
||
"tests/unit/repro-antigravity-404-family-cooldown-hijack.test.ts",
|
||
"tests/unit/resilience-connections.test.ts",
|
||
"tests/unit/responses-handler.test.ts",
|
||
"tests/unit/rotation-config-omniroute.test.ts",
|
||
"tests/unit/route-explainability.test.ts",
|
||
"tests/unit/route-guard-acp-agents-local-only.test.ts",
|
||
"tests/unit/route-guard-cursor-agent-availability.test.ts",
|
||
"tests/unit/route-guard-cursor-refresh.test.ts",
|
||
"tests/unit/route-guard-forge-jcode-settings-local-only.test.ts",
|
||
"tests/unit/route-guard-grok-build-settings-local-only.test.ts",
|
||
"tests/unit/route-guard-middleware-local-only.test.ts",
|
||
"tests/unit/route-guard-plugins-local-only.test.ts",
|
||
"tests/unit/route-guard-private-lan.test.ts",
|
||
"tests/unit/route-guard-provider-login-local-only.test.ts",
|
||
"tests/unit/route-guard-qwen-settings-local-only.test.ts",
|
||
"tests/unit/router-strategies.test.ts",
|
||
"tests/unit/rule12-error-sanitization-sweep.test.ts",
|
||
"tests/unit/serial/combo-health-autopilot.test.ts",
|
||
"tests/unit/serial/combo-quota-share-cooldown-wait-timing.test.ts",
|
||
"tests/unit/serial/combo-strategy-fallbacks-half-open-timing.test.ts",
|
||
"tests/unit/serial/provider-health-autopilot.test.ts",
|
||
"tests/unit/service-combo-metrics.test.ts",
|
||
"tests/unit/service-provider-plugin-registry.test.ts",
|
||
"tests/unit/services-branch-hardening.test.ts",
|
||
"tests/unit/services/bifrost-route-guard.test.ts",
|
||
"tests/unit/services/combo-metrics-memory.test.ts",
|
||
"tests/unit/session-affinity-generic-7274.test.ts",
|
||
"tests/unit/settings/authz-bypass.test.ts",
|
||
"tests/unit/skip-provider-breaker-consumer-2743.test.ts",
|
||
"tests/unit/sse-auth-antigravity-credits.test.ts",
|
||
"tests/unit/sse-auth-resource-404.test.ts",
|
||
"tests/unit/sse-auth.test.ts",
|
||
"tests/unit/stream-early-eof-breaker.test.ts",
|
||
"tests/unit/stream-readiness.test.ts",
|
||
"tests/unit/strict-random-deck.test.ts",
|
||
"tests/unit/strip-reasoning-header.test.ts",
|
||
"tests/unit/system-role-extraction.test.ts",
|
||
"tests/unit/t23-t24-fallback-resilience.test.ts",
|
||
"tests/unit/tag-routing.test.ts",
|
||
"tests/unit/thundering-herd.test.ts",
|
||
"tests/unit/token-refresh-race-comprehensive.test.ts",
|
||
"tests/unit/token-refresh-service.test.ts",
|
||
"tests/unit/tools-filter-anthropic-format.test.ts",
|
||
"tests/unit/tproxy-route.test.ts",
|
||
"tests/unit/trae-publiccred.test.ts",
|
||
"tests/unit/types-barrel-model-cooldown.test.ts",
|
||
"tests/unit/upstream-error-passthrough.test.ts",
|
||
"tests/unit/upstream-retry-hints-toggle.test.ts",
|
||
"tests/unit/upstream-timeout-model-override.test.ts",
|
||
"tests/unit/usage-service-hardening.test.ts",
|
||
"tests/unit/validate-response-quality.test.ts",
|
||
"tests/unit/vertex-passthrough-model-lockout.test.ts",
|
||
"tests/unit/xai-agent-tools-passthrough.test.ts"
|
||
],
|
||
"nodeArgs": [
|
||
"--import",
|
||
"tsx",
|
||
"--import",
|
||
"./open-sse/utils/setupPolyfill.ts",
|
||
"--import",
|
||
"./tests/_setup/isolateDataDir.ts",
|
||
"--test-reporter=tap",
|
||
"-r",
|
||
"{{hookFile}}",
|
||
"{{testFile}}"
|
||
]
|
||
},
|
||
"_mutate_godfiles_excluded_comment": [
|
||
"2026-06-18 (Onda 2 budget): chatCore.ts + combo.ts — the two god-files — were REMOVED",
|
||
"from `mutate`. They dominated ~2/3 of the ~15k mutants; the full 8-module run TIMED OUT",
|
||
"at the 180min nightly cap (run 27705123780: 16:47:33 -> killed 19:47:48 = exactly 180min;",
|
||
"the prior 120min scheduled run also timed out). #4078 made concurrency safe but the",
|
||
"tap-runner re-spawns a node process per test file PER MUTANT, so spawn cost dominates and",
|
||
"15k mutants does not fit.",
|
||
"",
|
||
"2026-06-18 (Onda 3 / Fase 9 T5 re-add): the combo.ts god-file was split into 11 small",
|
||
"leaf modules under open-sse/services/combo/ (PRs #4162/#4175/#4186/#4196/#4204). The",
|
||
"routing LOGIC that justified combo.ts being in `mutate` now lives in those leaves, so the",
|
||
"10 well-covered combo/* leaves are ADDED back to `mutate` here (comboStructure/autoStrategy/",
|
||
"validateQuality/shadowRouting/targetSorters/comboPredicates/rrState/comboData + the reset-aware",
|
||
"quota pair quotaScoring/quotaStrategies, added after #4204 (D7b) merged). They are covered by",
|
||
"the 24 combo-*.test.ts files already in tap.testFiles (quota by combo-prescreen/combo-config/",
|
||
"combo-strategy-fallbacks). types.ts is omitted (pure type declarations produce 0 mutants).",
|
||
"",
|
||
"chatCore/* leaves: a covering-test audit found 6 with direct unit coverage (batch g:",
|
||
"comboContextCache/idempotency/passthroughHelpers/responseHeaders/sanitization/upstreamTimeouts).",
|
||
"A follow-up then added DEDICATED unit tests for 6 more leaves (tests/unit/chatcore-headers,",
|
||
"-log-truncation, -memory-extraction, -non-streaming-sse, -passthrough-tool-names,",
|
||
"-executor-helpers — wired into tap.testFiles above) and added those leaves as batch h",
|
||
"(headers/logTruncation/memoryExtraction/nonStreamingSse/passthroughToolNames/executorHelpers).",
|
||
"A later follow-up added dedicated tests (NO mock.module — unavailable under the tap-runner; used",
|
||
"fetch-override + crafted inputs + temp-DATA_DIR) for telemetryHelpers (both fns, all branches) and",
|
||
"memorySkillsInjection (getSkillsProviderForFormat fully + injectMemoryAndSkills guards/empty-DB",
|
||
"path) and added them as batch i.",
|
||
"",
|
||
"The FINAL chatCore leaf, semanticCache.ts, was added to batch i once its cache-HIT block had a",
|
||
"fixture: chatcore-semantic-cache now SEEDS the real cache via setCachedResponse (the in-memory",
|
||
"store getCachedResponse checks first — no mock.module needed) under the exact signature",
|
||
"checkSemanticCache rebuilds, so the HIT branch runs end-to-end (status 200 / 'semantic' / 'HIT' /",
|
||
"the stream + content-type ternaries / the cost fallback / the side-effect calls all get killed).",
|
||
"ALL 15 chatCore leaves are now mutated.",
|
||
"",
|
||
"STILL EXCLUDED (follow-ups, NOT in `mutate` yet):",
|
||
" - combo.ts + chatCore.ts barrels: their handleComboChat/handleChatCore CORES were not",
|
||
" split (out of scope — Fase 3 ChatCoreContext refactor). The barrels are now thin-ish",
|
||
" but still large; keep excluded until the cores are split.",
|
||
"See project memory: Quality Gate v2 / Fase 9 (project-combo-split)."
|
||
],
|
||
"mutate": [
|
||
"open-sse/services/accountFallback.ts",
|
||
"src/sse/services/auth.ts",
|
||
"src/server/authz/routeGuard.ts",
|
||
"open-sse/utils/error.ts",
|
||
"open-sse/utils/publicCreds.ts",
|
||
"src/shared/utils/circuitBreaker.ts",
|
||
"open-sse/services/combo/comboStructure.ts",
|
||
"open-sse/services/combo/autoStrategy.ts",
|
||
"open-sse/services/combo/validateQuality.ts",
|
||
"open-sse/services/combo/shadowRouting.ts",
|
||
"open-sse/services/combo/targetSorters.ts",
|
||
"open-sse/services/combo/comboPredicates.ts",
|
||
"open-sse/services/combo/rrState.ts",
|
||
"open-sse/services/combo/comboData.ts",
|
||
"open-sse/services/combo/quotaScoring.ts",
|
||
"open-sse/services/combo/quotaStrategies.ts",
|
||
"open-sse/handlers/chatCore/comboContextCache.ts",
|
||
"open-sse/handlers/chatCore/idempotency.ts",
|
||
"open-sse/handlers/chatCore/passthroughHelpers.ts",
|
||
"open-sse/handlers/chatCore/responseHeaders.ts",
|
||
"open-sse/handlers/chatCore/sanitization.ts",
|
||
"open-sse/handlers/chatCore/upstreamTimeouts.ts",
|
||
"open-sse/handlers/chatCore/headers.ts",
|
||
"open-sse/handlers/chatCore/logTruncation.ts",
|
||
"open-sse/handlers/chatCore/memoryExtraction.ts",
|
||
"open-sse/handlers/chatCore/nonStreamingSse.ts",
|
||
"open-sse/handlers/chatCore/passthroughToolNames.ts",
|
||
"open-sse/handlers/chatCore/executorHelpers.ts",
|
||
"open-sse/handlers/chatCore/telemetryHelpers.ts",
|
||
"open-sse/handlers/chatCore/memorySkillsInjection.ts",
|
||
"open-sse/handlers/chatCore/semanticCache.ts"
|
||
],
|
||
"_ignorePatterns_comment": [
|
||
"ignorePatterns = files NOT copied into the Stryker sandbox. It does NOT scope",
|
||
"what gets mutated (that is the `mutate` array above). The test files MUST be",
|
||
"copied so the tap-runner can find covering tests, so DO NOT ignore tests/ here.",
|
||
"We only exclude heavy, mutation-irrelevant trees to keep sandbox creation fast:",
|
||
"build output, coverage, the huge docs/i18n translation tree, and other worktrees."
|
||
],
|
||
"ignorePatterns": [
|
||
".next",
|
||
"dist",
|
||
"dist-electron",
|
||
".build",
|
||
"coverage",
|
||
"playwright-report",
|
||
"test-results",
|
||
"reports",
|
||
"docs/i18n",
|
||
".worktrees",
|
||
".stryker-tmp"
|
||
],
|
||
"reporters": [
|
||
"progress",
|
||
"html",
|
||
"json"
|
||
],
|
||
"htmlReporter": {
|
||
"fileName": "reports/mutation/mutation.html"
|
||
},
|
||
"jsonReporter": {
|
||
"fileName": "reports/mutation/mutation.json"
|
||
},
|
||
"coverageAnalysis": "perTest",
|
||
"timeoutMS": 60000,
|
||
"timeoutFactor": 2.5,
|
||
"concurrency": 4,
|
||
"disableTypeChecks": true,
|
||
"checkers": [],
|
||
"thresholds": {
|
||
"high": 70,
|
||
"low": 50,
|
||
"break": null
|
||
},
|
||
"tempDirName": ".stryker-tmp",
|
||
"cleanTempDir": true,
|
||
"_tapTestFiles_comment": [
|
||
"tap.testFiles is the explicit set of node:test files that cover the 8 mutated",
|
||
"modules (union of files importing any of them), MINUS a few timing/heap/streaming-",
|
||
"sensitive integration tests that can flake under Stryker concurrent runners and",
|
||
"would break the required all-green baseline dry-run (e.g. body-timeout-integration,",
|
||
"heap-pressure, sse-heartbeat-integration, *-stream-readiness, chatcore-memory-pressure).",
|
||
"It is enumerated (not a broad glob) so the Stryker dry-run stays tractable for the",
|
||
"nightly budget — a glob over the full ~1300-file unit suite would make the per-test",
|
||
"dry-run take hours. coverageAnalysis:perTest then narrows which files run per mutant.",
|
||
"Regenerate the base union after adding/renaming covering tests, then re-prune flaky ones:",
|
||
" grep -rlE \"circuitBreaker|publicCreds|accountFallback|routeGuard|services/auth|chatCore|services/combo|utils/error|public-client|account-fallback|route-guard|circuit-breaker\" tests/unit --include=\"*.test.ts\" | sort -u"
|
||
],
|
||
"dryRunTimeoutMinutes": 30,
|
||
"_concurrency_comment": "concurrency=4 (was 1): the covering node:test files used to share SQLite/module state via the default DATA_DIR (~/.omniroute), so running them concurrently in the Stryker sandbox caused cross-file races that failed the all-green baseline. tap.nodeArgs now imports ./tests/_setup/isolateDataDir.ts, which gives each spawned test process its own temp DATA_DIR — eliminating the shared on-disk DB, so concurrency>1 is deterministic. A/B verified 2026-06-17: dry-run at concurrency=4 fails WITHOUT the isolation import (account-fallback-service tap exit 9) and passes WITH it. Raise further only if the runner has spare cores."
|
||
}
|