Some OpenAI-compatible gateways repeat the finish chunk (the copy usually
carrying only usage). Strict clients such as the AI SDK reject anything after
the first finish_reason, so the passthrough stream now drops the duplicate;
its usage is still captured and forwarded as the trailing usage-only chunk.
OpenRouter-style gateways also report upstream failures behind an HTTP 200 by
ending an empty completion with native_finish_reason network_error / error /
server_error / timeout. The passthrough stream now routes that case through
the existing stream-failure path (502, code upstream_native_finish_error)
instead of returning a clean empty answer. Content or tool calls keep the
chunk untouched. The non-streaming path already turns these empty bodies into
a 502 via the empty-content guard; a regression test pins it.
Co-authored-by: askid <askid.mobile@gmail.com>
Inspired-by: https://github.com/decolua/9router/pull/3611
Thanks @yourspraveen — the guardrail pipeline now has characterization tests for the current behavior, in `tests/unit/guardrail-pipeline-characterization.test.ts` and `tests/unit/guardrail-pipeline-wiring-characterization.test.ts`.
Boarded on release/v3.8.52 at e2d5747872. Focused tests: 204 passed. The one failure is in tests/unit/codex-models-catalog-refresh.test.ts and belongs to #16299, which was ejected: it grows src/app/api/providers/[id]/models/route.ts from the frozen 2420 to 2422. File-size otherwise kept only the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch those files.
⚠️ base-red inherited: #15306
Thanks @skygunner — /v1beta/models uses the same requireAuthForModels gate as /v1/models, and custom-provider names use the operator prefix instead of the node UUID. Covered by `tests/unit/v1beta-models-route.test.ts`.
Boarded on release/v3.8.52 at e2d5747872. Focused tests: 204 passed. The one failure is in tests/unit/codex-models-catalog-refresh.test.ts and belongs to #16299, which was ejected: it grows src/app/api/providers/[id]/models/route.ts from the frozen 2420 to 2422. File-size otherwise kept only the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch those files.
⚠️ base-red inherited: #15306
Thanks @maxmad64bis — the console log route reads a bounded tail, in `src/app/api/logs/console/route.ts`, covered by `tests/unit/console-log-levels.test.ts`.
Boarded on release/v3.8.52 at e2d5747872. Focused tests: 204 passed. The one failure is in tests/unit/codex-models-catalog-refresh.test.ts and belongs to #16299, which was ejected: it grows src/app/api/providers/[id]/models/route.ts from the frozen 2420 to 2422. File-size otherwise kept only the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch those files.
⚠️ base-red inherited: #15306
Thanks @maxmad64bis — a locked usage write is retried once, and `src/lib/usage/usageHistory.ts` shrinks below its frozen ceiling. Covered by `tests/unit/usage/usageWriteRetry.test.ts`.
Boarded on release/v3.8.52 at e2d5747872. Focused tests: 204 passed. The one failure is in tests/unit/codex-models-catalog-refresh.test.ts and belongs to #16299, which was ejected: it grows src/app/api/providers/[id]/models/route.ts from the frozen 2420 to 2422. File-size otherwise kept only the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch those files.
⚠️ base-red inherited: #15306
Thanks @maxmad64bis — conversation reconnect elects the point with the longest verified run, in `open-sse/services/conversationTracker.ts`, covered by `tests/unit/conversationTracker.test.ts`.
Boarded on release/v3.8.52 at e2d5747872. Focused tests: 204 passed. The one failure is in tests/unit/codex-models-catalog-refresh.test.ts and belongs to #16299, which was ejected: it grows src/app/api/providers/[id]/models/route.ts from the frozen 2420 to 2422. File-size otherwise kept only the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch those files.
⚠️ base-red inherited: #15306
Thanks @maxmad64bis — app-log files clock-prefixed lines under the real component and strips color codes, in `src/lib/consoleInterceptor.ts`, covered by `tests/unit/console-interceptor-message-fidelity.test.ts`.
Boarded on release/v3.8.52 at e2d5747872. Focused tests: 204 passed. The one failure is in tests/unit/codex-models-catalog-refresh.test.ts and belongs to #16299, which was ejected: it grows src/app/api/providers/[id]/models/route.ts from the frozen 2420 to 2422. File-size otherwise kept only the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch those files.
⚠️ base-red inherited: #15306
Thanks @maxmad64bis — streamed reply summaries measure rendered content, in `src/lib/usage/callContentProvenance.ts`, covered by `tests/unit/call-content-provenance.test.ts`.
Boarded on release/v3.8.52 at e2d5747872. Focused tests: 204 passed. The one failure is in tests/unit/codex-models-catalog-refresh.test.ts and belongs to #16299, which was ejected: it grows src/app/api/providers/[id]/models/route.ts from the frozen 2420 to 2422. File-size otherwise kept only the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch those files.
⚠️ base-red inherited: #15306
Thanks @maxmad64bis — PATCH /api/resilience accepts a streamRecovery block, covered by `tests/unit/resilience-stream-recovery-api.test.ts`.
Boarded on release/v3.8.52 at e2d5747872. Focused tests: 204 passed. The one failure is in tests/unit/codex-models-catalog-refresh.test.ts and belongs to #16299, which was ejected: it grows src/app/api/providers/[id]/models/route.ts from the frozen 2420 to 2422. File-size otherwise kept only the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch those files.
⚠️ base-red inherited: #15306
Thanks @maxmad64bis — stored retention durations that are missing from the database settings schema are accepted, in `src/shared/validation/settingsSchemas.ts`, covered by `tests/unit/database-settings-maintenance.test.ts`.
Boarded on release/v3.8.52 at e2d5747872. Focused tests: 204 passed. The one failure is in tests/unit/codex-models-catalog-refresh.test.ts and belongs to #16299, which was ejected: it grows src/app/api/providers/[id]/models/route.ts from the frozen 2420 to 2422. File-size otherwise kept only the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch those files.
⚠️ base-red inherited: #15306
Thanks @maxmad64bis — a retired model that reports 410 locks for 24 hours on that status alone, in `open-sse/services/accountFallback.ts`. The file stays inside its frozen ceiling. Covered by `tests/unit/gemini-deprecated-model-lockout.test.ts`.
Boarded on release/v3.8.52 at e2d5747872. Focused tests: 204 passed. The one failure is in tests/unit/codex-models-catalog-refresh.test.ts and belongs to #16299, which was ejected: it grows src/app/api/providers/[id]/models/route.ts from the frozen 2420 to 2422. File-size otherwise kept only the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch those files.
⚠️ base-red inherited: #15306
Thanks @maxmad64bis — perplexity-web publishes the received upstream status on the active proxy sink, in `open-sse/executors/perplexity-web.ts`, covered by `tests/unit/perplexity-web-upstream-status.test.ts`.
Boarded on release/v3.8.52 at e2d5747872. Focused tests: 204 passed. The one failure is in tests/unit/codex-models-catalog-refresh.test.ts and belongs to #16299, which was ejected: it grows src/app/api/providers/[id]/models/route.ts from the frozen 2420 to 2422. File-size otherwise kept only the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch those files.
⚠️ base-red inherited: #15306
Thanks @maxmad64bis — the CLI logs route reads a bounded tail and still requires CLI tools auth, via `src/lib/logTail.ts`, covered by `tests/unit/cli-logs-route-bounded-tail.test.ts`.
Boarded on release/v3.8.52 at ac590dafa6. Focused node tests: 74 passed, 0 failed. The #16473 dashboard case is a vitest file and passed 3/3 under vitest. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch that file.
⚠️ base-red inherited: #15306
Thanks @maxmad64bis — usage analytics resolves each provider and model price grid once per request, in `src/app/api/usage/analytics/route.ts`, covered by `tests/unit/usage-analytics-pricing-memoization.test.ts`.
Boarded on release/v3.8.52 at ac590dafa6. Focused node tests: 74 passed, 0 failed. The #16473 dashboard case is a vitest file and passed 3/3 under vitest. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch that file.
⚠️ base-red inherited: #15306
Thanks @maxmad64bis — pre-migration snapshots are pruned by the configured retention outside the migration window, in `src/lib/db/cleanup/backupPrune.ts`. This does not add a migration. Covered by `tests/unit/db-backup-prune-outside-migration-window.test.ts`.
Boarded on release/v3.8.52 at ac590dafa6. Focused node tests: 74 passed, 0 failed. The #16473 dashboard case is a vitest file and passed 3/3 under vitest. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch that file.
⚠️ base-red inherited: #15306
Thanks @maxmad64bis — repo quality checks run in a throwaway data directory. The route-guard membership check still loads `isLocalOnlyPath`; the import only moves to after that isolation. Covered by `tests/unit/repo-checks-isolate-datadir.test.ts`.
Boarded on release/v3.8.52 at ac590dafa6. Focused node tests: 74 passed, 0 failed. The #16473 dashboard case is a vitest file and passed 3/3 under vitest. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch that file.
⚠️ base-red inherited: #15306
Thanks @xiaoyaner0201 — account fallback no longer offers `weighted`, which had no account implementation. Combo-level weighted stays. Covered by `tests/unit/account-weighted-runtime-16459.test.ts`, `tests/unit/account-weighted-settings-16459.test.ts`, and `tests/unit/ui/combo-defaults-account-weighted-16459.test.tsx`.
Boarded on release/v3.8.52 at ac590dafa6. Focused node tests: 74 passed, 0 failed. The #16473 dashboard case is a vitest file and passed 3/3 under vitest. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch that file.
⚠️ base-red inherited: #15306
Thanks @maxmad64bis — the combo list shares alias tables and resolved windows for one request, in `src/lib/combos/comboContext.ts`, covered by `tests/unit/combos-list-shared-context-resolution.test.ts`.
Boarded on release/v3.8.52 at ac590dafa6. Focused node tests: 74 passed, 0 failed. The #16473 dashboard case is a vitest file and passed 3/3 under vitest. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch that file.
⚠️ base-red inherited: #15306
Thanks @maxmad64bis — a missing custom favicon redirects to the default icon with an absolute URL, in `src/app/api/settings/favicon/route.ts`, covered by `tests/unit/settings-favicon-fallback.test.ts`.
Boarded on release/v3.8.52 at ac590dafa6. Focused node tests: 74 passed, 0 failed. The #16473 dashboard case is a vitest file and passed 3/3 under vitest. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch that file.
⚠️ base-red inherited: #15306
Thanks @maxmad64bis — a partial database settings patch is accepted and returns 200, in `src/app/api/settings/database/route.ts`, covered by `tests/unit/database-settings-maintenance.test.ts`.
Boarded on release/v3.8.52 at ac590dafa6. Focused node tests: 74 passed, 0 failed. The #16473 dashboard case is a vitest file and passed 3/3 under vitest. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch that file.
⚠️ base-red inherited: #15306
Thanks @ElissonNadson — Antigravity usage now exposes cachedContentTokenCount in the OpenAI usage details, in `open-sse/executors/antigravity/sseCollect.ts`, covered by `tests/unit/antigravity-executor-split.test.ts`.
Boarded on release/v3.8.52 at ac590dafa6. Focused node tests: 74 passed, 0 failed. The #16473 dashboard case is a vitest file and passed 3/3 under vitest. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch that file.
⚠️ base-red inherited: #15306
Thanks @maxmad64bis — emergency fallback skips a target that has left the live catalog. `src/sse/handlers/chat.ts` nets down and the header helper lives in `src/sse/handlers/emergencyFallbackHeader.ts`, covered by `tests/unit/services/emergency-fallback.test.ts`.
Boarded on release/v3.8.52 at e23fb0f8e8. Focused tests: 87 passed, 0 failed. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch that file.
⚠️ base-red inherited: #15306
Thanks @maxmad64bis — stream recovery re-sends a cut that rendered nothing on the same stream, in `open-sse/services/streamRecovery.ts`, covered by `tests/unit/stream-continuation-responses.test.ts`.
Boarded on release/v3.8.52 at e23fb0f8e8. Focused tests: 87 passed, 0 failed. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch that file.
⚠️ base-red inherited: #15306
Thanks @skygunner — a combo waits out a short model lock instead of failing the attempt immediately, in `open-sse/services/combo/comboAttemptLoop.ts` and `comboCooldownRetry.ts`, covered by `tests/unit/combo-model-lock-pre-dispatch-wait-16319.test.ts`.
Boarded on release/v3.8.52 at e23fb0f8e8. Focused tests: 87 passed, 0 failed. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch that file.
⚠️ base-red inherited: #15306Fixes#16319
Thanks @opensource-elearning — parseModel hot-path logging goes through the level-gated logger, in `open-sse/services/model.ts`, covered by `tests/unit/model-logger-gating.test.ts`.
Boarded on release/v3.8.52 at e23fb0f8e8. Focused tests: 87 passed, 0 failed. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch that file.
⚠️ base-red inherited: #15306
Thanks @DuqueSouza — GitHub Copilot sends the vision header automatically, uses a Responses body for uncatalogued Codex model ids, and honors a GHE targetFormat override. Covered by `tests/unit/github-copilot-vision-header-codex-body.test.ts`.
Boarded on release/v3.8.52 at e23fb0f8e8. Focused tests: 87 passed, 0 failed. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch that file.
⚠️ base-red inherited: #15306
Thanks @yourspraveen — memory extraction reads sanitized response text only when PII response sanitization is already on. The flag default stays off. Covered by `tests/unit/memory-extraction-pii-sanitization.test.ts`.
Boarded on release/v3.8.52 at e23fb0f8e8. Focused tests: 87 passed, 0 failed. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch that file.
⚠️ base-red inherited: #15306Closes#16400
Thanks @yourspraveen — the unused `open-sse/services/keyGroupAuth.ts` module is removed. On the release tip it had no importers.
Boarded on release/v3.8.52 at e23fb0f8e8. Focused tests: 87 passed, 0 failed. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch that file.
⚠️ base-red inherited: #15306
Thanks @maxmad64bis — a selector switch prefers a member that no sibling is already serving, in `src/lib/proxySubscription/selectorTrigger.ts`, covered by `tests/unit/proxySubscription.selectorUnservedMember.test.ts`.
Boarded on release/v3.8.52 at e23fb0f8e8. Focused tests: 87 passed, 0 failed. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch that file.
⚠️ base-red inherited: #15306
Thanks @maxmad64bis — LMArena publishes the received upstream status on the proxy sink, in `open-sse/executors/lmarena.ts`, covered by `tests/unit/lmarena-upstream-status.test.ts`.
Boarded on release/v3.8.52 at e23fb0f8e8. Focused tests: 87 passed, 0 failed. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch that file.
⚠️ base-red inherited: #15306
Thanks @maxmad64bis — notion-web publishes the received upstream status on the active proxy sink, in `open-sse/executors/notion-web.ts`, covered by `tests/unit/notion-web-upstream-status.test.ts`.
Boarded on release/v3.8.52 at e23fb0f8e8. Focused tests: 87 passed, 0 failed. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch that file.
⚠️ base-red inherited: #15306
Thanks @maxmad64bis — call-log rotation holds the artifact ceiling when the files are already gone, in `src/lib/usage/callLogRotation.ts`, covered by `tests/unit/call-log-file-rotation.test.ts`.
Boarded on release/v3.8.52 at c188c8e682. Focused tests: 145 passed, 0 failed. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). Three siblings were ejected from this wave because they grow frozen files: #16388 (auth.ts 3588 > 3587), #16356 (imageGeneration.ts 3423 > 3390 and its test 2347 > 2216), #16387 (roundRobinCombo.ts 1294 > 1288). This pull request does not touch those files.
⚠️ base-red inherited: #15306
Thanks @maxmad64bis — resilience PATCH stores only the values the operator sent. Normalization lives in `src/lib/resilience/settings/normalize.ts`, covered by `tests/unit/resilience-settings-normalize-split.test.ts`.
Boarded on release/v3.8.52 at c188c8e682. Focused tests: 145 passed, 0 failed. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). Three siblings were ejected from this wave because they grow frozen files: #16388 (auth.ts 3588 > 3587), #16356 (imageGeneration.ts 3423 > 3390 and its test 2347 > 2216), #16387 (roundRobinCombo.ts 1294 > 1288). This pull request does not touch those files.
⚠️ base-red inherited: #15306
Thanks @skygunner — a Codex replay-reasoning rejection now surfaces as 400 invalid_encrypted_content instead of STREAM_EARLY_EOF, via `open-sse/utils/streamReadiness.ts` and `open-sse/executors/codex/reasoningReplayRejection.ts`. Covered by `tests/unit/stream-readiness-replay-rejection-16364.test.ts`.
Fixes#16364
Boarded on release/v3.8.52 at c188c8e682. Focused tests: 145 passed, 0 failed. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). Three siblings were ejected from this wave because they grow frozen files: #16388 (auth.ts 3588 > 3587), #16356 (imageGeneration.ts 3423 > 3390 and its test 2347 > 2216), #16387 (roundRobinCombo.ts 1294 > 1288). This pull request does not touch those files.
⚠️ base-red inherited: #15306
Thanks @skygunner — an empty_response stream error no longer trips the crash guard in `src/shared/utils/httpClientAbortGuard.mjs`, covered by `tests/unit/http-client-abort-guard-empty-response-16347.test.ts`.
Fixes#16347
Boarded on release/v3.8.52 at c188c8e682. Focused tests: 145 passed, 0 failed. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). Three siblings were ejected from this wave because they grow frozen files: #16388 (auth.ts 3588 > 3587), #16356 (imageGeneration.ts 3423 > 3390 and its test 2347 > 2216), #16387 (roundRobinCombo.ts 1294 > 1288). This pull request does not touch those files.
⚠️ base-red inherited: #15306
Thanks @woodsonl — unlimited key quotas skip the usage read on the hot path in `src/domain/keyQuota.ts` and `src/lib/db/keyQuota.ts`, covered by `tests/unit/key-quota-enforcement-hotpath.test.ts`.
Boarded on release/v3.8.52 at c188c8e682. Focused tests: 145 passed, 0 failed. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). Three siblings were ejected from this wave because they grow frozen files: #16388 (auth.ts 3588 > 3587), #16356 (imageGeneration.ts 3423 > 3390 and its test 2347 > 2216), #16387 (roundRobinCombo.ts 1294 > 1288). This pull request does not touch those files.
⚠️ base-red inherited: #15306
Thanks @skygunner — OpenAI content parts are rebuilt from a field allowlist in `open-sse/translator/helpers/openaiHelper.ts`, so unknown fields are stripped while payload carriers survive. Covered by `tests/unit/translator-content-part-field-allowlist-16384.test.ts`.
Fixes#16384
Boarded on release/v3.8.52 at c188c8e682. Focused tests: 145 passed, 0 failed. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). Three siblings were ejected from this wave because they grow frozen files: #16388 (auth.ts 3588 > 3587), #16356 (imageGeneration.ts 3423 > 3390 and its test 2347 > 2216), #16387 (roundRobinCombo.ts 1294 > 1288). This pull request does not touch those files.
⚠️ base-red inherited: #15306
Thanks @lorenzozanee — MiMo Token Plan dashboard model tests now use a 60-second minimum deadline in `src/lib/api/modelTestRunner.ts`, covered by `tests/unit/model-test-runner.test.ts`. The changelog fragment was prefixed with a markdown bullet on `18db4d23` before this squash.
Fixes#16057
Boarded on release/v3.8.52 at 146459b116. Focused tests: 76 passed, 0 failed. Changelog integrity passed. File-size shows only the inherited executeTargetAttempt.ts overage (1288 > frozen 1284).
⚠️ base-red inherited: #15306
Thanks @JxnLexn — account catalogs survive reactivation. The path is `src/lib/providerModels/managedModelImport.ts` and `prepareConnectionModelTest.ts`, covered by the connection-catalog and managed-model import tests.
Boarded on release/v3.8.52 at 146459b116. Focused tests: 76 passed, 0 failed. Changelog integrity passed. File-size shows only the inherited executeTargetAttempt.ts overage (1288 > frozen 1284).
⚠️ base-red inherited: #15306
Thanks @maxmad64bis — the auto-combo quality tracker is documented as in-memory and cold after restart in `docs/routing/AUTO-COMBO.md`, locked by `tests/unit/auto-combo-quality-memory-cold-docs.test.ts`.
Boarded on release/v3.8.52 at 146459b116. Focused tests: 76 passed, 0 failed. Changelog integrity passed. File-size shows only the inherited executeTargetAttempt.ts overage (1288 > frozen 1284).
⚠️ base-red inherited: #15306
Thanks @HouMinXi — the Agnes intl-max catalog id folds back onto the free model in `open-sse/config/providers/registry/agnes/index.ts` and `src/sse/services/model.ts`, covered by `tests/unit/agnes-intl-max-effort.test.ts`.
Boarded on release/v3.8.52 at 146459b116. Focused tests: 76 passed, 0 failed. Changelog integrity passed. File-size shows only the inherited executeTargetAttempt.ts overage (1288 > frozen 1284).
⚠️ base-red inherited: #15306
Thanks @tiagolabsit — extra usage is now blocked when a Claude plan window is exhausted and extra usage is enabled, in `src/lib/providers/claudeExtraUsage.ts`, covered by `tests/unit/claude-extra-usage.test.ts`.
Boarded on release/v3.8.52 at 146459b116. Focused tests: 76 passed, 0 failed. Changelog integrity passed. File-size shows only the inherited executeTargetAttempt.ts overage (1288 > frozen 1284).
⚠️ base-red inherited: #15306
Thanks @foxy1402 — the chat, completions, messages, and responses handlers now call `enforceClientApiRouteAuth` themselves, so an uppercase `/V1/` path that misses the proxy matcher cannot dispatch without a key. Covered by `tests/unit/authz/handler-auth-bypass.test.ts`.
Boarded on release/v3.8.52 at b0d53251b3 (after #15840). Focused unit tests: 43 passed, 0 failed. Changelog integrity passed. File-size: the inherited executeTargetAttempt.ts overage (1288 > 1284) remains. #16427 was ejected from this wave because it grows open-sse/executors/codex.ts from 1526 to 1608, over the frozen ceiling. These seven pull requests do not touch that file.
⚠️ base-red inherited: #15306
Thanks @pacocartones — pre-dispatch errors now expose the resolved provider and model route metadata from `open-sse/handlers/chatCore.ts`, covered by `tests/unit/pre-dispatch-error-route-meta.test.ts`. The new test is registered in `stryker.conf.json`.
Boarded on release/v3.8.52 at b0d53251b3 (after #15840). Focused unit tests: 43 passed, 0 failed. Changelog integrity passed. File-size: the inherited executeTargetAttempt.ts overage (1288 > 1284) remains. #16427 was ejected from this wave because it grows open-sse/executors/codex.ts from 1526 to 1608, over the frozen ceiling. These seven pull requests do not touch that file.
⚠️ base-red inherited: #15306
Thanks @Louayzouaoui1 — dotted Anthropic catalog ids are sent upstream as dashed model ids via `open-sse/services/modelCanonicalization.ts` and `open-sse/handlers/chatCore/claudeEffortVariant.ts`, covered by `tests/unit/anthropic-dotted-model-ids-16406.test.ts`.
Boarded on release/v3.8.52 at b0d53251b3 (after #15840). Focused unit tests: 43 passed, 0 failed. Changelog integrity passed. File-size: the inherited executeTargetAttempt.ts overage (1288 > 1284) remains. #16427 was ejected from this wave because it grows open-sse/executors/codex.ts from 1526 to 1608, over the frozen ceiling. These seven pull requests do not touch that file.
⚠️ base-red inherited: #15306