From 3d56df4e1bd2a2b3552e36d5e2b4505e29e9be95 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Tue, 31 Mar 2026 17:26:30 -0700 Subject: [PATCH] feat(deep): upgrade default model from gpt-5.3-codex to gpt-5.4 Deep category now uses gpt-5.4 as its default model across all providers (openai, github-copilot, venice, opencode), matching Hephaestus's GPT 5.4 upgrade. The requiresModel constraint is removed since gpt-5.4 is widely available. Adds openai/gpt-5.3-codex -> openai/gpt-5.4 config migration for existing user configs. Deep category prompt optimized for GPT 5.4's stronger native capabilities (leaner, less verbose). --- assets/oh-my-opencode.schema.json | 3 +- .../__snapshots__/model-fallback.test.ts.snap | 60 +++++++++++++++---- .../task-toast-manager/manager.test.ts | 6 +- src/shared/migration.test.ts | 6 ++ src/shared/migration/model-versions.ts | 1 + src/shared/model-requirements.test.ts | 13 ++-- src/shared/model-requirements.ts | 5 +- src/tools/delegate-task/constants.ts | 32 +++------- src/tools/delegate-task/tools.test.ts | 10 ++-- 9 files changed, 84 insertions(+), 52 deletions(-) diff --git a/assets/oh-my-opencode.schema.json b/assets/oh-my-opencode.schema.json index f217e6a5e..bf88ba798 100644 --- a/assets/oh-my-opencode.schema.json +++ b/assets/oh-my-opencode.schema.json @@ -57,7 +57,8 @@ "cancel-ralph", "refactor", "start-work", - "stop-continuation" + "stop-continuation", + "remove-ai-slops" ] } }, diff --git a/src/cli/__snapshots__/model-fallback.test.ts.snap b/src/cli/__snapshots__/model-fallback.test.ts.snap index 1db43d5de..51180f725 100644 --- a/src/cli/__snapshots__/model-fallback.test.ts.snap +++ b/src/cli/__snapshots__/model-fallback.test.ts.snap @@ -102,6 +102,10 @@ exports[`generateModelConfig single native provider uses Claude models when only }, }, "categories": { + "deep": { + "model": "anthropic/claude-opus-4-6", + "variant": "max", + }, "quick": { "model": "anthropic/claude-haiku-4-5", }, @@ -164,6 +168,10 @@ exports[`generateModelConfig single native provider uses Claude models with isMa }, }, "categories": { + "deep": { + "model": "anthropic/claude-opus-4-6", + "variant": "max", + }, "quick": { "model": "anthropic/claude-haiku-4-5", }, @@ -244,7 +252,7 @@ exports[`generateModelConfig single native provider uses OpenAI models when only "variant": "xhigh", }, "deep": { - "model": "openai/gpt-5.3-codex", + "model": "openai/gpt-5.4", "variant": "medium", }, "quick": { @@ -329,7 +337,7 @@ exports[`generateModelConfig single native provider uses OpenAI models with isMa "variant": "xhigh", }, "deep": { - "model": "openai/gpt-5.3-codex", + "model": "openai/gpt-5.4", "variant": "medium", }, "quick": { @@ -395,6 +403,10 @@ exports[`generateModelConfig single native provider uses Gemini models when only "model": "google/gemini-3.1-pro-preview", "variant": "high", }, + "deep": { + "model": "google/gemini-3.1-pro-preview", + "variant": "high", + }, "quick": { "model": "google/gemini-3-flash-preview", }, @@ -455,6 +467,10 @@ exports[`generateModelConfig single native provider uses Gemini models with isMa "model": "google/gemini-3.1-pro-preview", "variant": "high", }, + "deep": { + "model": "google/gemini-3.1-pro-preview", + "variant": "high", + }, "quick": { "model": "google/gemini-3-flash-preview", }, @@ -527,7 +543,7 @@ exports[`generateModelConfig all native providers uses preferred models from fal "variant": "high", }, "deep": { - "model": "openai/gpt-5.3-codex", + "model": "openai/gpt-5.4", "variant": "medium", }, "quick": { @@ -602,7 +618,7 @@ exports[`generateModelConfig all native providers uses preferred models with isM "variant": "high", }, "deep": { - "model": "openai/gpt-5.3-codex", + "model": "openai/gpt-5.4", "variant": "medium", }, "quick": { @@ -678,7 +694,7 @@ exports[`generateModelConfig fallback providers uses OpenCode Zen models when on "variant": "high", }, "deep": { - "model": "opencode/gpt-5.3-codex", + "model": "opencode/gpt-5.4", "variant": "medium", }, "quick": { @@ -753,7 +769,7 @@ exports[`generateModelConfig fallback providers uses OpenCode Zen models with is "variant": "high", }, "deep": { - "model": "opencode/gpt-5.3-codex", + "model": "opencode/gpt-5.4", "variant": "medium", }, "quick": { @@ -827,6 +843,10 @@ exports[`generateModelConfig fallback providers uses GitHub Copilot models when "model": "github-copilot/gemini-3.1-pro-preview", "variant": "high", }, + "deep": { + "model": "github-copilot/gpt-5.4", + "variant": "medium", + }, "quick": { "model": "github-copilot/gpt-5.4-mini", }, @@ -897,6 +917,10 @@ exports[`generateModelConfig fallback providers uses GitHub Copilot models with "model": "github-copilot/gemini-3.1-pro-preview", "variant": "high", }, + "deep": { + "model": "github-copilot/gpt-5.4", + "variant": "medium", + }, "quick": { "model": "github-copilot/gpt-5.4-mini", }, @@ -958,6 +982,9 @@ exports[`generateModelConfig fallback providers uses ZAI model for librarian whe }, }, "categories": { + "deep": { + "model": "opencode/gpt-5-nano", + }, "quick": { "model": "opencode/gpt-5-nano", }, @@ -1016,6 +1043,9 @@ exports[`generateModelConfig fallback providers uses ZAI model for librarian wit }, }, "categories": { + "deep": { + "model": "opencode/gpt-5-nano", + }, "quick": { "model": "opencode/gpt-5-nano", }, @@ -1086,7 +1116,7 @@ exports[`generateModelConfig mixed provider scenarios uses Claude + OpenCode Zen "variant": "high", }, "deep": { - "model": "opencode/gpt-5.3-codex", + "model": "opencode/gpt-5.4", "variant": "medium", }, "quick": { @@ -1161,7 +1191,7 @@ exports[`generateModelConfig mixed provider scenarios uses OpenAI + Copilot comb "variant": "high", }, "deep": { - "model": "openai/gpt-5.3-codex", + "model": "openai/gpt-5.4", "variant": "medium", }, "quick": { @@ -1229,6 +1259,10 @@ exports[`generateModelConfig mixed provider scenarios uses Claude + ZAI combinat }, }, "categories": { + "deep": { + "model": "anthropic/claude-opus-4-6", + "variant": "max", + }, "quick": { "model": "anthropic/claude-haiku-4-5", }, @@ -1294,6 +1328,10 @@ exports[`generateModelConfig mixed provider scenarios uses Gemini + Claude combi "model": "google/gemini-3.1-pro-preview", "variant": "high", }, + "deep": { + "model": "anthropic/claude-opus-4-6", + "variant": "max", + }, "quick": { "model": "anthropic/claude-haiku-4-5", }, @@ -1369,7 +1407,7 @@ exports[`generateModelConfig mixed provider scenarios uses all fallback provider "variant": "high", }, "deep": { - "model": "opencode/gpt-5.3-codex", + "model": "github-copilot/gpt-5.4", "variant": "medium", }, "quick": { @@ -1447,7 +1485,7 @@ exports[`generateModelConfig mixed provider scenarios uses all providers togethe "variant": "high", }, "deep": { - "model": "openai/gpt-5.3-codex", + "model": "openai/gpt-5.4", "variant": "medium", }, "quick": { @@ -1525,7 +1563,7 @@ exports[`generateModelConfig mixed provider scenarios uses all providers with is "variant": "high", }, "deep": { - "model": "openai/gpt-5.3-codex", + "model": "openai/gpt-5.4", "variant": "medium", }, "quick": { diff --git a/src/features/task-toast-manager/manager.test.ts b/src/features/task-toast-manager/manager.test.ts index 22cf5171d..d99698347 100644 --- a/src/features/task-toast-manager/manager.test.ts +++ b/src/features/task-toast-manager/manager.test.ts @@ -288,15 +288,15 @@ describe("TaskToastManager", () => { agent: "sisyphus-junior", isBackground: true, category: "deep", - modelInfo: { model: "openai/gpt-5.3-codex", type: "category-default" as const }, + modelInfo: { model: "openai/gpt-5.4", type: "category-default" as const }, } // when - addTask is called toastManager.addTask(task) - // then - toast should show model name before category like "gpt-5.3-codex: deep" + // then - toast should show model name before category like "gpt-5.4: deep" const call = mockClient.tui.showToast.mock.calls[0][0] - expect(call.body.message).toContain("gpt-5.3-codex: deep") + expect(call.body.message).toContain("gpt-5.4: deep") expect(call.body.message).not.toContain("sisyphus-junior/deep") }) diff --git a/src/shared/migration.test.ts b/src/shared/migration.test.ts index e02fa4356..5b11aa8c3 100644 --- a/src/shared/migration.test.ts +++ b/src/shared/migration.test.ts @@ -565,6 +565,12 @@ describe("MODEL_VERSION_MAP", () => { // then: Should contain correct mapping expect(MODEL_VERSION_MAP["anthropic/claude-opus-4-5"]).toBe("anthropic/claude-opus-4-6") }) + + test("maps openai/gpt-5.3-codex to openai/gpt-5.4 for deep category migration", () => { + // given/when: Check MODEL_VERSION_MAP + // then: gpt-5.3-codex should migrate to gpt-5.4 + expect(MODEL_VERSION_MAP["openai/gpt-5.3-codex"]).toBe("openai/gpt-5.4") + }) }) describe("migrateModelVersions", () => { diff --git a/src/shared/migration/model-versions.ts b/src/shared/migration/model-versions.ts index b3df8cdd2..13731dcaa 100644 --- a/src/shared/migration/model-versions.ts +++ b/src/shared/migration/model-versions.ts @@ -8,6 +8,7 @@ export const MODEL_VERSION_MAP: Record = { "anthropic/claude-opus-4-5": "anthropic/claude-opus-4-6", "anthropic/claude-sonnet-4-5": "anthropic/claude-sonnet-4-6", + "openai/gpt-5.3-codex": "openai/gpt-5.4", } function migrationKey(oldModel: string, newModel: string): string { diff --git a/src/shared/model-requirements.test.ts b/src/shared/model-requirements.test.ts index 5b37eeb14..bb110f554 100644 --- a/src/shared/model-requirements.test.ts +++ b/src/shared/model-requirements.test.ts @@ -319,20 +319,21 @@ describe("CATEGORY_MODEL_REQUIREMENTS", () => { expect(primary.providers[0]).toBe("openai") }) - test("deep has valid fallbackChain with gpt-5.3-codex as primary", () => { + test("deep has valid fallbackChain with gpt-5.4 as primary", () => { // given - deep category requirement const deep = CATEGORY_MODEL_REQUIREMENTS["deep"] // when - accessing deep requirement - // then - fallbackChain exists with gpt-5.3-codex as first entry, medium variant + // then - fallbackChain exists with gpt-5.4 as first entry, medium variant expect(deep).toBeDefined() expect(deep.fallbackChain).toBeArray() expect(deep.fallbackChain.length).toBeGreaterThan(0) const primary = deep.fallbackChain[0] expect(primary.variant).toBe("medium") - expect(primary.model).toBe("gpt-5.3-codex") - expect(primary.providers[0]).toBe("openai") + expect(primary.model).toBe("gpt-5.4") + expect(primary.providers).toContain("openai") + expect(primary.providers).toContain("github-copilot") }) test("visual-engineering has valid fallbackChain with gemini-3.1-pro high as primary", () => { @@ -592,12 +593,12 @@ describe("ModelRequirement type", () => { }) describe("requiresModel field in categories", () => { - test("deep category has requiresModel set to gpt-5.3-codex", () => { + test("deep category no longer has requiresModel (gpt-5.4 is widely available)", () => { // given const deep = CATEGORY_MODEL_REQUIREMENTS["deep"] // when / #then - expect(deep.requiresModel).toBe("gpt-5.3-codex") + expect(deep.requiresModel).toBeUndefined() }) test("artistry category has requiresModel set to gemini-3.1-pro", () => { diff --git a/src/shared/model-requirements.ts b/src/shared/model-requirements.ts index e800ae475..5a1889eae 100644 --- a/src/shared/model-requirements.ts +++ b/src/shared/model-requirements.ts @@ -222,8 +222,8 @@ export const CATEGORY_MODEL_REQUIREMENTS: Record = { deep: { fallbackChain: [ { - providers: ["openai", "opencode"], - model: "gpt-5.3-codex", + providers: ["openai", "github-copilot", "venice", "opencode"], + model: "gpt-5.4", variant: "medium", }, { @@ -237,7 +237,6 @@ export const CATEGORY_MODEL_REQUIREMENTS: Record = { variant: "high", }, ], - requiresModel: "gpt-5.3-codex", }, artistry: { fallbackChain: [ diff --git a/src/tools/delegate-task/constants.ts b/src/tools/delegate-task/constants.ts index 322c0694f..c0cc9ca42 100644 --- a/src/tools/delegate-task/constants.ts +++ b/src/tools/delegate-task/constants.ts @@ -251,36 +251,22 @@ ANTI-AI-SLOP RULES (NON-NEGOTIABLE): export const DEEP_CATEGORY_PROMPT_APPEND = ` You are working on GOAL-ORIENTED AUTONOMOUS tasks. -**CRITICAL - AUTONOMOUS EXECUTION MINDSET (NON-NEGOTIABLE)**: You are NOT an interactive assistant. You are an autonomous problem-solver. -**BEFORE making ANY changes**: -1. SILENTLY explore the codebase extensively (5-15 minutes of reading is normal) +BEFORE making ANY changes: +1. Silently explore the codebase extensively (5-15 minutes of reading is normal) 2. Read related files, trace dependencies, understand the full context 3. Build a complete mental model of the problem space -4. DO NOT ask clarifying questions - the goal is already defined +4. Do not ask clarifying questions - the goal is already defined -**Autonomous executor mindset**: -- You receive a GOAL. When the goal includes numbered steps or phases, treat them as one atomic task broken into sub-steps - NOT as separate independent tasks. -- Figure out HOW to achieve the goal yourself -- Thorough research before any action -- Fix hairy problems that require deep understanding -- Work independently without frequent check-ins +You receive a GOAL. When the goal includes numbered steps or phases, treat them as one atomic task broken into sub-steps, not as separate independent tasks. Figure out HOW to achieve it yourself. Thorough research before any action. -**Single vs. multi-step context**: -- Sub-steps of ONE goal (e.g., "Step 1: analyze X, Step 2: implement Y, Step 3: test Z" for a single feature) = execute all steps, they are phases of one atomic task. -- Genuinely independent tasks (e.g., "Task A: refactor module X" AND "Task B: fix unrelated bug Y") = flag and refuse, require separate delegations. +Sub-steps of ONE goal = execute all steps as phases of one atomic task. +Genuinely independent tasks = flag and refuse, require separate delegations. -**Approach**: -- Explore extensively, understand deeply, then act decisively -- Prefer comprehensive solutions over quick patches -- If the goal is unclear, make reasonable assumptions and proceed -- Document your reasoning in code comments only when non-obvious +Approach: explore extensively, understand deeply, then act decisively. Prefer comprehensive solutions over quick patches. If the goal is unclear, make reasonable assumptions and proceed. -**Response format**: -- Minimal status updates (user trusts your autonomy) -- Focus on results, not play-by-play progress -- Report completion with summary of changes made +Minimal status updates. Focus on results, not play-by-play. Report completion with summary of changes. ` @@ -288,7 +274,7 @@ You are NOT an interactive assistant. You are an autonomous problem-solver. export const DEFAULT_CATEGORIES: Record = { "visual-engineering": { model: "google/gemini-3.1-pro", variant: "high" }, ultrabrain: { model: "openai/gpt-5.4", variant: "xhigh" }, - deep: { model: "openai/gpt-5.3-codex", variant: "medium" }, + deep: { model: "openai/gpt-5.4", variant: "medium" }, artistry: { model: "google/gemini-3.1-pro", variant: "high" }, quick: { model: "openai/gpt-5.4-mini" }, "unspecified-low": { model: "anthropic/claude-sonnet-4-6" }, diff --git a/src/tools/delegate-task/tools.test.ts b/src/tools/delegate-task/tools.test.ts index 1c2677f97..761aaf7a3 100644 --- a/src/tools/delegate-task/tools.test.ts +++ b/src/tools/delegate-task/tools.test.ts @@ -93,7 +93,7 @@ describe("sisyphus-task", () => { // when / #then expect(category).toBeDefined() - expect(category.model).toBe("openai/gpt-5.3-codex") + expect(category.model).toBe("openai/gpt-5.4") expect(category.variant).toBe("medium") }) @@ -705,8 +705,8 @@ describe("sisyphus-task", () => { }) test("blocks requiresModel when availability is known and missing the required model", () => { - // given - const categoryName = "deep" + // given - artistry has requiresModel: gemini-3.1-pro + const categoryName = "artistry" const availableModels = new Set(["anthropic/claude-opus-4-6"]) // when @@ -720,8 +720,8 @@ describe("sisyphus-task", () => { }) test("blocks requiresModel when availability is empty", () => { - // given - const categoryName = "deep" + // given - artistry has requiresModel: gemini-3.1-pro + const categoryName = "artistry" const availableModels = new Set() // when