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).
This commit is contained in:
@@ -57,7 +57,8 @@
|
||||
"cancel-ralph",
|
||||
"refactor",
|
||||
"start-work",
|
||||
"stop-continuation"
|
||||
"stop-continuation",
|
||||
"remove-ai-slops"
|
||||
]
|
||||
}
|
||||
},
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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")
|
||||
})
|
||||
|
||||
|
||||
@@ -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", () => {
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
export const MODEL_VERSION_MAP: Record<string, string> = {
|
||||
"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 {
|
||||
|
||||
@@ -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", () => {
|
||||
|
||||
@@ -222,8 +222,8 @@ export const CATEGORY_MODEL_REQUIREMENTS: Record<string, ModelRequirement> = {
|
||||
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<string, ModelRequirement> = {
|
||||
variant: "high",
|
||||
},
|
||||
],
|
||||
requiresModel: "gpt-5.3-codex",
|
||||
},
|
||||
artistry: {
|
||||
fallbackChain: [
|
||||
|
||||
@@ -251,36 +251,22 @@ ANTI-AI-SLOP RULES (NON-NEGOTIABLE):
|
||||
export const DEEP_CATEGORY_PROMPT_APPEND = `<Category_Context>
|
||||
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.
|
||||
</Category_Context>`
|
||||
|
||||
|
||||
@@ -288,7 +274,7 @@ You are NOT an interactive assistant. You are an autonomous problem-solver.
|
||||
export const DEFAULT_CATEGORIES: Record<string, CategoryConfig> = {
|
||||
"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" },
|
||||
|
||||
@@ -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<string>(["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<string>()
|
||||
|
||||
// when
|
||||
|
||||
Reference in New Issue
Block a user