From 886cdb62d7c2271f7fb6775d52bde50912c648a6 Mon Sep 17 00:00:00 2001 From: maria-rcks <254055478+maria-rcks@users.noreply.github.com> Date: Sat, 12 Sep 2026 00:17:00 +0000 Subject: [PATCH 1/5] fix(models): default to astra medium and fable 5.1 --- .../src/provider/Layers/CodexProvider.test.ts | 35 ++++++++++++++++--- .../src/provider/Layers/CodexProvider.ts | 7 +++- .../Layers/CodexSessionRuntime.test.ts | 18 ++++++++++ .../provider/Layers/CodexSessionRuntime.ts | 9 +++-- apps/server/src/provider/model-manifest.json | 4 +-- packages/contracts/src/model.ts | 5 +-- 6 files changed, 66 insertions(+), 12 deletions(-) diff --git a/apps/server/src/provider/Layers/CodexProvider.test.ts b/apps/server/src/provider/Layers/CodexProvider.test.ts index 0c7a40d9bd9e..ff5c4c66de77 100644 --- a/apps/server/src/provider/Layers/CodexProvider.test.ts +++ b/apps/server/src/provider/Layers/CodexProvider.test.ts @@ -2,6 +2,32 @@ import { assert, it } from "@effect/vitest"; import { applyPreferredCodexDefaultModel, mapCodexModelCapabilities } from "./CodexProvider.ts"; +it("defaults Astra reasoning to medium when supported", () => { + for (const efforts of [ + ["low", "medium", "high"], + ["low", "high"], + ]) { + const capabilities = mapCodexModelCapabilities({ + additionalSpeedTiers: [], + defaultReasoningEffort: "low", + description: "Astra", + displayName: "Astra", + hidden: false, + id: "openai.gpt-6-astra", + isDefault: false, + model: "openai.gpt-6-astra", + supportedReasoningEfforts: efforts.map((reasoningEffort) => ({ + description: reasoningEffort, + reasoningEffort, + })), + }); + const reasoning = capabilities.optionDescriptors?.find( + (option) => option.id === "reasoningEffort", + ); + assert.strictEqual(reasoning?.currentValue, efforts.includes("medium") ? "medium" : "low"); + } +}); + it("maps current Codex model capability fields", () => { const capabilities = mapCodexModelCapabilities({ additionalSpeedTiers: [], @@ -118,13 +144,14 @@ it("marks the most preferred available model as default", () => { ); }); -it("prefers sol over terra when both are available", () => { +it("prefers astra over sol and terra when available", () => { const models = applyPreferredCodexDefaultModel([ { slug: "gpt-5.6-terra", name: "GPT-5.6-Terra", isCustom: false, capabilities: null }, { slug: "gpt-5.6-sol", name: "GPT-5.6-Sol", isCustom: false, capabilities: null }, + { slug: "gpt-6-astra", name: "GPT-6-Astra", isCustom: false, capabilities: null }, ]); - assert.deepStrictEqual(models.find((model) => model.isDefault)?.slug, "gpt-5.6-sol"); + assert.deepStrictEqual(models.find((model) => model.isDefault)?.slug, "gpt-6-astra"); }); it("ranks qualified Codex models while preserving their wire ids", () => { @@ -136,11 +163,11 @@ it("ranks qualified Codex models while preserving their wire ids", () => { isDefault: true, capabilities: null, }, - { slug: "openai.gpt-5.6-sol", name: "Sol", isCustom: false, capabilities: null }, + { slug: "openai.gpt-6-astra", name: "Astra", isCustom: false, capabilities: null }, ]); assert.deepStrictEqual( models.filter((model) => model.isDefault).map((model) => model.slug), - ["openai.gpt-5.6-sol"], + ["openai.gpt-6-astra"], ); }); diff --git a/apps/server/src/provider/Layers/CodexProvider.ts b/apps/server/src/provider/Layers/CodexProvider.ts index 31d02f42c5f4..df4046cb38d1 100644 --- a/apps/server/src/provider/Layers/CodexProvider.ts +++ b/apps/server/src/provider/Layers/CodexProvider.ts @@ -145,8 +145,13 @@ function codexAccountEmail(account: CodexSchema.V2GetAccountResponse["account"]) export function mapCodexModelCapabilities( model: CodexSchema.V2ModelListResponse__Model, ): ModelCapabilities { + const preferredReasoning = + codexModelFamily(model.model) === "gpt-6-astra" && + model.supportedReasoningEfforts.some(({ reasoningEffort }) => reasoningEffort === "medium") + ? "medium" + : model.defaultReasoningEffort; const reasoningOptions = model.supportedReasoningEfforts.map(({ reasoningEffort }) => - reasoningEffort === model.defaultReasoningEffort + reasoningEffort === preferredReasoning ? { id: reasoningEffort, label: reasoningEffortLabel(reasoningEffort), diff --git a/apps/server/src/provider/Layers/CodexSessionRuntime.test.ts b/apps/server/src/provider/Layers/CodexSessionRuntime.test.ts index 3385137a2dae..3bf2a3fb8cfd 100644 --- a/apps/server/src/provider/Layers/CodexSessionRuntime.test.ts +++ b/apps/server/src/provider/Layers/CodexSessionRuntime.test.ts @@ -63,6 +63,24 @@ function makeThreadOpenResponse( } describe("buildTurnStartParams", () => { + it.effect("defaults Astra requests to medium and preserves explicit effort", () => + Effect.gen(function* () { + for (const model of ["gpt-6-astra", "openai.gpt-6-astra"]) { + for (const effort of [undefined, "high"] as const) { + const params = yield* buildTurnStartParams({ + threadId: "provider-thread-1", + runtimeMode: "full-access", + model, + ...(effort ? { effort } : {}), + interactionMode: "default", + }); + NodeAssert.equal(params.effort, effort ?? "medium"); + NodeAssert.equal(params.collaborationMode?.settings.reasoning_effort, effort ?? "medium"); + } + } + }), + ); + it("keeps invalid turn values only in the schema cause", () => { const secret = "codex-turn-input-secret-sentinel"; const error = Effect.runSync( diff --git a/apps/server/src/provider/Layers/CodexSessionRuntime.ts b/apps/server/src/provider/Layers/CodexSessionRuntime.ts index bd9a6b6f34a8..e0e0234674f0 100644 --- a/apps/server/src/provider/Layers/CodexSessionRuntime.ts +++ b/apps/server/src/provider/Layers/CodexSessionRuntime.ts @@ -18,7 +18,7 @@ import { TurnId, } from "@t3tools/contracts"; import { resolveSpawnCommand } from "@t3tools/shared/shell"; -import { normalizeModelSlug } from "@t3tools/shared/model"; +import { codexModelFamily, normalizeModelSlug } from "@t3tools/shared/model"; import * as Crypto from "effect/Crypto"; import * as DateTime from "effect/DateTime"; import * as Deferred from "effect/Deferred"; @@ -635,10 +635,13 @@ export function buildTurnStartParams(input: { } const config = runtimeModeToThreadConfig(input.runtimeMode); + const effort = + input.effort ?? + (input.model && codexModelFamily(input.model) === "gpt-6-astra" ? "medium" : undefined); const collaborationMode = buildCodexCollaborationMode({ ...(input.interactionMode ? { interactionMode: input.interactionMode } : {}), ...(input.model ? { model: input.model } : {}), - ...(input.effort ? { effort: input.effort } : {}), + ...(effort ? { effort } : {}), browserToolsAvailable: input.browserToolsAvailable ?? true, }); @@ -650,7 +653,7 @@ export function buildTurnStartParams(input: { sandboxPolicy: runtimeModeToTurnSandboxPolicy(input.runtimeMode), ...(input.model ? { model: input.model } : {}), ...(input.serviceTier ? { serviceTier: input.serviceTier } : {}), - ...(input.effort ? { effort: input.effort } : {}), + ...(effort ? { effort } : {}), ...(collaborationMode ? { collaborationMode } : {}), }).pipe( Effect.mapError((cause) => diff --git a/apps/server/src/provider/model-manifest.json b/apps/server/src/provider/model-manifest.json index bca9f09eee8c..86ba6a5739fc 100644 --- a/apps/server/src/provider/model-manifest.json +++ b/apps/server/src/provider/model-manifest.json @@ -1,6 +1,6 @@ { "version": 1, - "updatedAt": "2026-09-04T19:10:48Z", + "updatedAt": "2026-09-12T00:00:00Z", "currentModels": { "codex": [ "gpt-6-astra", @@ -16,7 +16,7 @@ "providers": { "claudeAgent": { "defaults": { - "chat": "claude-sonnet-5" + "chat": "claude-fable-5-1" }, "profiles": { "fable-5": { diff --git a/packages/contracts/src/model.ts b/packages/contracts/src/model.ts index bce1a766bc9b..0882aef51d05 100644 --- a/packages/contracts/src/model.ts +++ b/packages/contracts/src/model.ts @@ -149,7 +149,7 @@ const CURSOR_DRIVER_KIND = ProviderDriverKind.make("cursor"); const GROK_DRIVER_KIND = ProviderDriverKind.make("grok"); const OPENCODE_DRIVER_KIND = ProviderDriverKind.make("opencode"); -export const DEFAULT_MODEL = "gpt-5.6-sol"; +export const DEFAULT_MODEL = "gpt-6-astra"; /** * Codex default-model preference, most preferred first. The provider snapshot @@ -157,6 +157,7 @@ export const DEFAULT_MODEL = "gpt-5.6-sol"; * default; when none are available, Codex's own `isDefault` flag wins. */ export const PREFERRED_DEFAULT_CODEX_MODELS: ReadonlyArray = [ + DEFAULT_MODEL, "gpt-5.6-sol", "gpt-5.6-terra", ]; @@ -167,7 +168,7 @@ export const DEFAULT_TEXT_GENERATION_REASONING_EFFORT = "low"; export const DEFAULT_MODEL_BY_PROVIDER: Partial> = { [CODEX_DRIVER_KIND]: DEFAULT_MODEL, - [CLAUDE_DRIVER_KIND]: "claude-sonnet-5", + [CLAUDE_DRIVER_KIND]: "claude-fable-5-1", [CURSOR_DRIVER_KIND]: "auto", // Product slug, not an ACP model id. The Grok adapter treats it as "the session's current model". [GROK_DRIVER_KIND]: "grok-build", From e9aa4e0ef34bef5d7bc2638cca9299c3e2e68ca1 Mon Sep 17 00:00:00 2001 From: maria-rcks <254055478+maria-rcks@users.noreply.github.com> Date: Sat, 12 Sep 2026 00:31:20 +0000 Subject: [PATCH 2/5] fix(models): respect provider reasoning defaults --- .../src/provider/CodexDeveloperInstructions.ts | 2 +- .../src/provider/Layers/CodexProvider.test.ts | 4 ++-- apps/server/src/provider/Layers/CodexProvider.ts | 7 +------ .../provider/Layers/CodexSessionRuntime.test.ts | 16 ++++++++-------- .../src/provider/Layers/CodexSessionRuntime.ts | 15 ++++++--------- apps/server/src/provider/model-manifest.json | 11 ++++++++--- 6 files changed, 26 insertions(+), 29 deletions(-) diff --git a/apps/server/src/provider/CodexDeveloperInstructions.ts b/apps/server/src/provider/CodexDeveloperInstructions.ts index 6a7fee351bce..22010c3c9d89 100644 --- a/apps/server/src/provider/CodexDeveloperInstructions.ts +++ b/apps/server/src/provider/CodexDeveloperInstructions.ts @@ -194,7 +194,7 @@ ${browserToolInstructions(browserToolsAvailable)} export interface CodexRuntimeInfo { readonly model: string; - readonly reasoningEffort: string; + readonly reasoningEffort?: string; } export function buildCodexDeveloperInstructions( diff --git a/apps/server/src/provider/Layers/CodexProvider.test.ts b/apps/server/src/provider/Layers/CodexProvider.test.ts index ff5c4c66de77..1f14f9a56da6 100644 --- a/apps/server/src/provider/Layers/CodexProvider.test.ts +++ b/apps/server/src/provider/Layers/CodexProvider.test.ts @@ -2,7 +2,7 @@ import { assert, it } from "@effect/vitest"; import { applyPreferredCodexDefaultModel, mapCodexModelCapabilities } from "./CodexProvider.ts"; -it("defaults Astra reasoning to medium when supported", () => { +it("preserves Astra's provider reasoning default", () => { for (const efforts of [ ["low", "medium", "high"], ["low", "high"], @@ -24,7 +24,7 @@ it("defaults Astra reasoning to medium when supported", () => { const reasoning = capabilities.optionDescriptors?.find( (option) => option.id === "reasoningEffort", ); - assert.strictEqual(reasoning?.currentValue, efforts.includes("medium") ? "medium" : "low"); + assert.strictEqual(reasoning?.currentValue, "low"); } }); diff --git a/apps/server/src/provider/Layers/CodexProvider.ts b/apps/server/src/provider/Layers/CodexProvider.ts index df4046cb38d1..31d02f42c5f4 100644 --- a/apps/server/src/provider/Layers/CodexProvider.ts +++ b/apps/server/src/provider/Layers/CodexProvider.ts @@ -145,13 +145,8 @@ function codexAccountEmail(account: CodexSchema.V2GetAccountResponse["account"]) export function mapCodexModelCapabilities( model: CodexSchema.V2ModelListResponse__Model, ): ModelCapabilities { - const preferredReasoning = - codexModelFamily(model.model) === "gpt-6-astra" && - model.supportedReasoningEfforts.some(({ reasoningEffort }) => reasoningEffort === "medium") - ? "medium" - : model.defaultReasoningEffort; const reasoningOptions = model.supportedReasoningEfforts.map(({ reasoningEffort }) => - reasoningEffort === preferredReasoning + reasoningEffort === model.defaultReasoningEffort ? { id: reasoningEffort, label: reasoningEffortLabel(reasoningEffort), diff --git a/apps/server/src/provider/Layers/CodexSessionRuntime.test.ts b/apps/server/src/provider/Layers/CodexSessionRuntime.test.ts index 3bf2a3fb8cfd..4fe30a34127e 100644 --- a/apps/server/src/provider/Layers/CodexSessionRuntime.test.ts +++ b/apps/server/src/provider/Layers/CodexSessionRuntime.test.ts @@ -63,7 +63,7 @@ function makeThreadOpenResponse( } describe("buildTurnStartParams", () => { - it.effect("defaults Astra requests to medium and preserves explicit effort", () => + it.effect("leaves Astra reasoning to the provider and preserves explicit effort", () => Effect.gen(function* () { for (const model of ["gpt-6-astra", "openai.gpt-6-astra"]) { for (const effort of [undefined, "high"] as const) { @@ -74,8 +74,8 @@ describe("buildTurnStartParams", () => { ...(effort ? { effort } : {}), interactionMode: "default", }); - NodeAssert.equal(params.effort, effort ?? "medium"); - NodeAssert.equal(params.collaborationMode?.settings.reasoning_effort, effort ?? "medium"); + NodeAssert.equal(params.effort, effort); + NodeAssert.equal(params.collaborationMode?.settings.reasoning_effort, effort ?? null); } } }), @@ -187,17 +187,16 @@ describe("buildTurnStartParams", () => { mode: "default", settings: { model: "gpt-5.3-codex", - reasoning_effort: "medium", + reasoning_effort: null, developer_instructions: buildCodexDeveloperInstructions("default", { model: "gpt-5.3-codex", - reasoningEffort: "medium", }), }, }, }); }); - it("reports the same fallback model and effort in settings and instructions", () => { + it("reports the fallback model without inventing a reasoning effort", () => { const params = Effect.runSync( buildTurnStartParams({ threadId: "provider-thread-1", @@ -209,8 +208,9 @@ describe("buildTurnStartParams", () => { const settings = params.collaborationMode?.settings; NodeAssert.equal(settings?.model, DEFAULT_MODEL); - NodeAssert.equal(settings?.reasoning_effort, "medium"); - NodeAssert.ok(settings?.developer_instructions?.includes(`as ${DEFAULT_MODEL} with medium`)); + NodeAssert.equal(settings?.reasoning_effort, null); + NodeAssert.ok(settings?.developer_instructions?.includes(`as ${DEFAULT_MODEL}`)); + NodeAssert.ok(!settings?.developer_instructions?.includes("with medium reasoning effort")); }); it.effect("routes approvals to the auto reviewer in auto mode", () => diff --git a/apps/server/src/provider/Layers/CodexSessionRuntime.ts b/apps/server/src/provider/Layers/CodexSessionRuntime.ts index e0e0234674f0..de220b984f1d 100644 --- a/apps/server/src/provider/Layers/CodexSessionRuntime.ts +++ b/apps/server/src/provider/Layers/CodexSessionRuntime.ts @@ -18,7 +18,7 @@ import { TurnId, } from "@t3tools/contracts"; import { resolveSpawnCommand } from "@t3tools/shared/shell"; -import { codexModelFamily, normalizeModelSlug } from "@t3tools/shared/model"; +import { normalizeModelSlug } from "@t3tools/shared/model"; import * as Crypto from "effect/Crypto"; import * as DateTime from "effect/DateTime"; import * as Deferred from "effect/Deferred"; @@ -590,15 +590,15 @@ function buildCodexCollaborationMode(input: { return undefined; } const model = normalizeCodexModelSlug(input.model) ?? DEFAULT_MODEL; - const reasoningEffort = input.effort ?? "medium"; + const reasoningEffort = input.effort; return { mode: input.interactionMode, settings: { model, - reasoning_effort: reasoningEffort, + reasoning_effort: reasoningEffort ?? null, developer_instructions: buildCodexDeveloperInstructions( input.interactionMode, - { model, reasoningEffort }, + { model, ...(reasoningEffort ? { reasoningEffort } : {}) }, input.browserToolsAvailable ?? true, ), }, @@ -635,13 +635,10 @@ export function buildTurnStartParams(input: { } const config = runtimeModeToThreadConfig(input.runtimeMode); - const effort = - input.effort ?? - (input.model && codexModelFamily(input.model) === "gpt-6-astra" ? "medium" : undefined); const collaborationMode = buildCodexCollaborationMode({ ...(input.interactionMode ? { interactionMode: input.interactionMode } : {}), ...(input.model ? { model: input.model } : {}), - ...(effort ? { effort } : {}), + ...(input.effort ? { effort: input.effort } : {}), browserToolsAvailable: input.browserToolsAvailable ?? true, }); @@ -653,7 +650,7 @@ export function buildTurnStartParams(input: { sandboxPolicy: runtimeModeToTurnSandboxPolicy(input.runtimeMode), ...(input.model ? { model: input.model } : {}), ...(input.serviceTier ? { serviceTier: input.serviceTier } : {}), - ...(effort ? { effort } : {}), + ...(input.effort ? { effort: input.effort } : {}), ...(collaborationMode ? { collaborationMode } : {}), }).pipe( Effect.mapError((cause) => diff --git a/apps/server/src/provider/model-manifest.json b/apps/server/src/provider/model-manifest.json index 86ba6a5739fc..17d1c12037d5 100644 --- a/apps/server/src/provider/model-manifest.json +++ b/apps/server/src/provider/model-manifest.json @@ -1,6 +1,6 @@ { "version": 1, - "updatedAt": "2026-09-12T00:00:00Z", + "updatedAt": "2026-09-12T00:30:00Z", "currentModels": { "codex": [ "gpt-6-astra", @@ -27,6 +27,11 @@ "label": "Reasoning", "type": "select", "options": [ + { + "id": "default", + "label": "Provider default", + "isDefault": true + }, { "id": "low", "label": "Low" @@ -37,8 +42,7 @@ }, { "id": "high", - "label": "High", - "isDefault": true + "label": "High" }, { "id": "xhigh", @@ -81,6 +85,7 @@ "adapter": { "claudeCode": { "effortMap": { + "default": null, "ultracode": "xhigh", "ultrathink": null }, From aedfa1378b7d6d769f13b72dfae463ba1c715557 Mon Sep 17 00:00:00 2001 From: maria-rcks <254055478+maria-rcks@users.noreply.github.com> Date: Sat, 12 Sep 2026 00:33:59 +0000 Subject: [PATCH 3/5] fix(models): retain newer defaults during catalog refresh --- apps/server/src/provider/ModelManifest.test.ts | 17 +++++++++++++++++ apps/server/src/provider/ModelManifest.ts | 4 ++++ 2 files changed, 21 insertions(+) diff --git a/apps/server/src/provider/ModelManifest.test.ts b/apps/server/src/provider/ModelManifest.test.ts index 0a2ca28feb73..d7212a624603 100644 --- a/apps/server/src/provider/ModelManifest.test.ts +++ b/apps/server/src/provider/ModelManifest.test.ts @@ -342,6 +342,23 @@ const serviceLayers = (input: { ); describe("ModelManifest service", () => { + it.live("does not replace newer bundled defaults with an older remote catalog", () => + Effect.gen(function* () { + const service = yield* make; + assert.deepStrictEqual(yield* service.refresh, BUNDLED_MODEL_MANIFEST); + const rebooted = yield* make; + assert.deepStrictEqual(yield* rebooted.current, BUNDLED_MODEL_MANIFEST); + }).pipe( + Effect.scoped, + Effect.provide( + serviceLayers({ + prefix: "model-manifest-older-remote-test", + response: () => Response.json({ ...REMOTE_MANIFEST, updatedAt: "2000-01-01T00:00:00Z" }), + }), + ), + ), + ); + it.live("prefers a fetched manifest over the bundle and caches it to disk", () => Effect.gen(function* () { const service = yield* make; diff --git a/apps/server/src/provider/ModelManifest.ts b/apps/server/src/provider/ModelManifest.ts index f5ad15dd8586..c36c68e01a5f 100644 --- a/apps/server/src/provider/ModelManifest.ts +++ b/apps/server/src/provider/ModelManifest.ts @@ -399,6 +399,10 @@ export const make = Effect.gen(function* () { ); if (fetched === null) return manifest; + if (manifestUpdatedAtMs(fetched) < manifestUpdatedAtMs(manifest)) { + fetchedAtMs = now; + return manifest; + } manifest = fetched; fetchedAtMs = now; yield* encodeManifestCache({ fetchedAtMs: now, manifest: fetched }).pipe( From 4d9db1b06c87683e6c6a14ad9423f9a1db6c2547 Mon Sep 17 00:00:00 2001 From: maria-rcks <254055478+maria-rcks@users.noreply.github.com> Date: Sat, 12 Sep 2026 00:42:37 +0000 Subject: [PATCH 4/5] fix(models): remove visible default effort option and trim diff --- .../src/provider/Layers/CodexProvider.test.ts | 26 ------------------- .../Layers/CodexSessionRuntime.test.ts | 18 ------------- .../server/src/provider/ModelManifest.test.ts | 17 ------------ apps/server/src/provider/model-manifest.json | 8 +----- 4 files changed, 1 insertion(+), 68 deletions(-) diff --git a/apps/server/src/provider/Layers/CodexProvider.test.ts b/apps/server/src/provider/Layers/CodexProvider.test.ts index 1f14f9a56da6..e3b6215a0e99 100644 --- a/apps/server/src/provider/Layers/CodexProvider.test.ts +++ b/apps/server/src/provider/Layers/CodexProvider.test.ts @@ -2,32 +2,6 @@ import { assert, it } from "@effect/vitest"; import { applyPreferredCodexDefaultModel, mapCodexModelCapabilities } from "./CodexProvider.ts"; -it("preserves Astra's provider reasoning default", () => { - for (const efforts of [ - ["low", "medium", "high"], - ["low", "high"], - ]) { - const capabilities = mapCodexModelCapabilities({ - additionalSpeedTiers: [], - defaultReasoningEffort: "low", - description: "Astra", - displayName: "Astra", - hidden: false, - id: "openai.gpt-6-astra", - isDefault: false, - model: "openai.gpt-6-astra", - supportedReasoningEfforts: efforts.map((reasoningEffort) => ({ - description: reasoningEffort, - reasoningEffort, - })), - }); - const reasoning = capabilities.optionDescriptors?.find( - (option) => option.id === "reasoningEffort", - ); - assert.strictEqual(reasoning?.currentValue, "low"); - } -}); - it("maps current Codex model capability fields", () => { const capabilities = mapCodexModelCapabilities({ additionalSpeedTiers: [], diff --git a/apps/server/src/provider/Layers/CodexSessionRuntime.test.ts b/apps/server/src/provider/Layers/CodexSessionRuntime.test.ts index 4fe30a34127e..4b2feb683354 100644 --- a/apps/server/src/provider/Layers/CodexSessionRuntime.test.ts +++ b/apps/server/src/provider/Layers/CodexSessionRuntime.test.ts @@ -63,24 +63,6 @@ function makeThreadOpenResponse( } describe("buildTurnStartParams", () => { - it.effect("leaves Astra reasoning to the provider and preserves explicit effort", () => - Effect.gen(function* () { - for (const model of ["gpt-6-astra", "openai.gpt-6-astra"]) { - for (const effort of [undefined, "high"] as const) { - const params = yield* buildTurnStartParams({ - threadId: "provider-thread-1", - runtimeMode: "full-access", - model, - ...(effort ? { effort } : {}), - interactionMode: "default", - }); - NodeAssert.equal(params.effort, effort); - NodeAssert.equal(params.collaborationMode?.settings.reasoning_effort, effort ?? null); - } - } - }), - ); - it("keeps invalid turn values only in the schema cause", () => { const secret = "codex-turn-input-secret-sentinel"; const error = Effect.runSync( diff --git a/apps/server/src/provider/ModelManifest.test.ts b/apps/server/src/provider/ModelManifest.test.ts index d7212a624603..0a2ca28feb73 100644 --- a/apps/server/src/provider/ModelManifest.test.ts +++ b/apps/server/src/provider/ModelManifest.test.ts @@ -342,23 +342,6 @@ const serviceLayers = (input: { ); describe("ModelManifest service", () => { - it.live("does not replace newer bundled defaults with an older remote catalog", () => - Effect.gen(function* () { - const service = yield* make; - assert.deepStrictEqual(yield* service.refresh, BUNDLED_MODEL_MANIFEST); - const rebooted = yield* make; - assert.deepStrictEqual(yield* rebooted.current, BUNDLED_MODEL_MANIFEST); - }).pipe( - Effect.scoped, - Effect.provide( - serviceLayers({ - prefix: "model-manifest-older-remote-test", - response: () => Response.json({ ...REMOTE_MANIFEST, updatedAt: "2000-01-01T00:00:00Z" }), - }), - ), - ), - ); - it.live("prefers a fetched manifest over the bundle and caches it to disk", () => Effect.gen(function* () { const service = yield* make; diff --git a/apps/server/src/provider/model-manifest.json b/apps/server/src/provider/model-manifest.json index 17d1c12037d5..ee39d49d229a 100644 --- a/apps/server/src/provider/model-manifest.json +++ b/apps/server/src/provider/model-manifest.json @@ -1,6 +1,6 @@ { "version": 1, - "updatedAt": "2026-09-12T00:30:00Z", + "updatedAt": "2026-09-12T00:41:55Z", "currentModels": { "codex": [ "gpt-6-astra", @@ -27,11 +27,6 @@ "label": "Reasoning", "type": "select", "options": [ - { - "id": "default", - "label": "Provider default", - "isDefault": true - }, { "id": "low", "label": "Low" @@ -85,7 +80,6 @@ "adapter": { "claudeCode": { "effortMap": { - "default": null, "ultracode": "xhigh", "ultrathink": null }, From ae8fa3bb857f836bce2afd9926c2d6175e740310 Mon Sep 17 00:00:00 2001 From: maria-rcks <254055478+maria-rcks@users.noreply.github.com> Date: Sat, 12 Sep 2026 00:47:18 +0000 Subject: [PATCH 5/5] fix(models): limit change to astra and fable medium defaults --- apps/server/src/provider/CodexDeveloperInstructions.ts | 2 +- apps/server/src/provider/Layers/CodexProvider.test.ts | 9 ++++----- apps/server/src/provider/Layers/CodexProvider.ts | 3 ++- .../src/provider/Layers/CodexSessionRuntime.test.ts | 10 +++++----- apps/server/src/provider/Layers/CodexSessionRuntime.ts | 6 +++--- apps/server/src/provider/ModelManifest.ts | 4 ---- apps/server/src/provider/model-manifest.json | 3 ++- 7 files changed, 17 insertions(+), 20 deletions(-) diff --git a/apps/server/src/provider/CodexDeveloperInstructions.ts b/apps/server/src/provider/CodexDeveloperInstructions.ts index 22010c3c9d89..6a7fee351bce 100644 --- a/apps/server/src/provider/CodexDeveloperInstructions.ts +++ b/apps/server/src/provider/CodexDeveloperInstructions.ts @@ -194,7 +194,7 @@ ${browserToolInstructions(browserToolsAvailable)} export interface CodexRuntimeInfo { readonly model: string; - readonly reasoningEffort?: string; + readonly reasoningEffort: string; } export function buildCodexDeveloperInstructions( diff --git a/apps/server/src/provider/Layers/CodexProvider.test.ts b/apps/server/src/provider/Layers/CodexProvider.test.ts index e3b6215a0e99..0c7a40d9bd9e 100644 --- a/apps/server/src/provider/Layers/CodexProvider.test.ts +++ b/apps/server/src/provider/Layers/CodexProvider.test.ts @@ -118,14 +118,13 @@ it("marks the most preferred available model as default", () => { ); }); -it("prefers astra over sol and terra when available", () => { +it("prefers sol over terra when both are available", () => { const models = applyPreferredCodexDefaultModel([ { slug: "gpt-5.6-terra", name: "GPT-5.6-Terra", isCustom: false, capabilities: null }, { slug: "gpt-5.6-sol", name: "GPT-5.6-Sol", isCustom: false, capabilities: null }, - { slug: "gpt-6-astra", name: "GPT-6-Astra", isCustom: false, capabilities: null }, ]); - assert.deepStrictEqual(models.find((model) => model.isDefault)?.slug, "gpt-6-astra"); + assert.deepStrictEqual(models.find((model) => model.isDefault)?.slug, "gpt-5.6-sol"); }); it("ranks qualified Codex models while preserving their wire ids", () => { @@ -137,11 +136,11 @@ it("ranks qualified Codex models while preserving their wire ids", () => { isDefault: true, capabilities: null, }, - { slug: "openai.gpt-6-astra", name: "Astra", isCustom: false, capabilities: null }, + { slug: "openai.gpt-5.6-sol", name: "Sol", isCustom: false, capabilities: null }, ]); assert.deepStrictEqual( models.filter((model) => model.isDefault).map((model) => model.slug), - ["openai.gpt-6-astra"], + ["openai.gpt-5.6-sol"], ); }); diff --git a/apps/server/src/provider/Layers/CodexProvider.ts b/apps/server/src/provider/Layers/CodexProvider.ts index 31d02f42c5f4..a0e2b744c2a7 100644 --- a/apps/server/src/provider/Layers/CodexProvider.ts +++ b/apps/server/src/provider/Layers/CodexProvider.ts @@ -146,7 +146,8 @@ export function mapCodexModelCapabilities( model: CodexSchema.V2ModelListResponse__Model, ): ModelCapabilities { const reasoningOptions = model.supportedReasoningEfforts.map(({ reasoningEffort }) => - reasoningEffort === model.defaultReasoningEffort + reasoningEffort === + (codexModelFamily(model.model) === "gpt-6-astra" ? "medium" : model.defaultReasoningEffort) ? { id: reasoningEffort, label: reasoningEffortLabel(reasoningEffort), diff --git a/apps/server/src/provider/Layers/CodexSessionRuntime.test.ts b/apps/server/src/provider/Layers/CodexSessionRuntime.test.ts index 4b2feb683354..3385137a2dae 100644 --- a/apps/server/src/provider/Layers/CodexSessionRuntime.test.ts +++ b/apps/server/src/provider/Layers/CodexSessionRuntime.test.ts @@ -169,16 +169,17 @@ describe("buildTurnStartParams", () => { mode: "default", settings: { model: "gpt-5.3-codex", - reasoning_effort: null, + reasoning_effort: "medium", developer_instructions: buildCodexDeveloperInstructions("default", { model: "gpt-5.3-codex", + reasoningEffort: "medium", }), }, }, }); }); - it("reports the fallback model without inventing a reasoning effort", () => { + it("reports the same fallback model and effort in settings and instructions", () => { const params = Effect.runSync( buildTurnStartParams({ threadId: "provider-thread-1", @@ -190,9 +191,8 @@ describe("buildTurnStartParams", () => { const settings = params.collaborationMode?.settings; NodeAssert.equal(settings?.model, DEFAULT_MODEL); - NodeAssert.equal(settings?.reasoning_effort, null); - NodeAssert.ok(settings?.developer_instructions?.includes(`as ${DEFAULT_MODEL}`)); - NodeAssert.ok(!settings?.developer_instructions?.includes("with medium reasoning effort")); + NodeAssert.equal(settings?.reasoning_effort, "medium"); + NodeAssert.ok(settings?.developer_instructions?.includes(`as ${DEFAULT_MODEL} with medium`)); }); it.effect("routes approvals to the auto reviewer in auto mode", () => diff --git a/apps/server/src/provider/Layers/CodexSessionRuntime.ts b/apps/server/src/provider/Layers/CodexSessionRuntime.ts index de220b984f1d..bd9a6b6f34a8 100644 --- a/apps/server/src/provider/Layers/CodexSessionRuntime.ts +++ b/apps/server/src/provider/Layers/CodexSessionRuntime.ts @@ -590,15 +590,15 @@ function buildCodexCollaborationMode(input: { return undefined; } const model = normalizeCodexModelSlug(input.model) ?? DEFAULT_MODEL; - const reasoningEffort = input.effort; + const reasoningEffort = input.effort ?? "medium"; return { mode: input.interactionMode, settings: { model, - reasoning_effort: reasoningEffort ?? null, + reasoning_effort: reasoningEffort, developer_instructions: buildCodexDeveloperInstructions( input.interactionMode, - { model, ...(reasoningEffort ? { reasoningEffort } : {}) }, + { model, reasoningEffort }, input.browserToolsAvailable ?? true, ), }, diff --git a/apps/server/src/provider/ModelManifest.ts b/apps/server/src/provider/ModelManifest.ts index c36c68e01a5f..f5ad15dd8586 100644 --- a/apps/server/src/provider/ModelManifest.ts +++ b/apps/server/src/provider/ModelManifest.ts @@ -399,10 +399,6 @@ export const make = Effect.gen(function* () { ); if (fetched === null) return manifest; - if (manifestUpdatedAtMs(fetched) < manifestUpdatedAtMs(manifest)) { - fetchedAtMs = now; - return manifest; - } manifest = fetched; fetchedAtMs = now; yield* encodeManifestCache({ fetchedAtMs: now, manifest: fetched }).pipe( diff --git a/apps/server/src/provider/model-manifest.json b/apps/server/src/provider/model-manifest.json index ee39d49d229a..9ea0c0063eb5 100644 --- a/apps/server/src/provider/model-manifest.json +++ b/apps/server/src/provider/model-manifest.json @@ -33,7 +33,8 @@ }, { "id": "medium", - "label": "Medium" + "label": "Medium", + "isDefault": true }, { "id": "high",