Add GPT-6 Sol and Luna to the 0.156 model catalog (#47332)

Backport the catalog, migration, and rate-limit updates with release-specific
conflict resolutions. Refresh the seven core scenario snapshots whose
collaboration-tool descriptions change with the model catalog.

GitOrigin-RevId: d3a093d18ce44a903383504ab8f5cbbc911d602d
This commit is contained in:
Ian MacLeod
2026-09-22 17:42:01 -07:00
parent d583e73c4d
commit f1b21bb293
20 changed files with 460 additions and 76 deletions
+1
View File
@@ -51,6 +51,7 @@ async fn daemon_startup(command: &str) -> Result<()> {
suppress_unstable_features_warning = true\nanalytics.enabled = false\n\
windows.sandbox = \"unelevated\"\n\
tui.disable_paste_burst = true\n\
notice.model_migrations.\"gpt-5.6-terra\" = \"gpt-6-sol\"\n\
[projects.{}]\ntrust_level = \"trusted\"\n",
serde_json::to_string(&workspace_path)?,
),
@@ -7,7 +7,7 @@ Scenario: Astra asks who a launch update is for, keeps working, and receives the
## Window 1
-- request 1 (request) --
00:additional_tools/developer (3; hash=9e8e744a3a55a2dd):
00:additional_tools/developer (3; hash=fbbc8f2ad7c8ce86):
- namespace/functions; hash=e7db0a45c4ec3157
- custom/exec
- function/wait
@@ -15,7 +15,7 @@ Scenario: Astra asks who a launch update is for, keeps working, and receives the
- function/request_user_input_async
- namespace/clock: Tools for reading and waiting on time.; hash=f402e8c5e9b5e317
- function/sleep
- namespace/collaboration: Tools for spawning and managing sub-agents.; hash=91f6de0e2773854f
- namespace/collaboration: Tools for spawning and managing sub-agents.; hash=0be1d3f8e1f49dca
- function/followup_task
- function/interrupt_agent
- function/list_agents
@@ -6,7 +6,7 @@ Scenario: Astra receives host and handler timings on completed and failed code-m
## Window 1
-- request 1 (turn) --
00:additional_tools/developer (3; hash=9e8e744a3a55a2dd):
00:additional_tools/developer (3; hash=fbbc8f2ad7c8ce86):
- namespace/functions; hash=e7db0a45c4ec3157
- custom/exec
- function/wait
@@ -14,7 +14,7 @@ Scenario: Astra receives host and handler timings on completed and failed code-m
- function/request_user_input_async
- namespace/clock: Tools for reading and waiting on time.; hash=f402e8c5e9b5e317
- function/sleep
- namespace/collaboration: Tools for spawning and managing sub-agents.; hash=91f6de0e2773854f
- namespace/collaboration: Tools for spawning and managing sub-agents.; hash=0be1d3f8e1f49dca
- function/followup_task
- function/interrupt_agent
- function/list_agents
@@ -16,7 +16,7 @@ Settings:
text: {"verbosity":"low"}
tool_choice: "auto"
-- request 1 (request) --
00:additional_tools/developer (3; hash=d78b689d87e8c03e):
00:additional_tools/developer (3; hash=ff82d1ef7cef6cad):
- namespace/functions; hash=97852c93915dad58
- custom/exec
- function/wait
@@ -24,7 +24,7 @@ Settings:
- function/request_user_input_async
- namespace/clock: Tools for reading and waiting on time.; hash=f402e8c5e9b5e317
- function/sleep
- namespace/collaboration: Tools for spawning and managing sub-agents.; hash=91f6de0e2773854f
- namespace/collaboration: Tools for spawning and managing sub-agents.; hash=0be1d3f8e1f49dca
- function/followup_task
- function/interrupt_agent
- function/list_agents
@@ -16,7 +16,7 @@ Settings:
text: {"verbosity":"low"}
tool_choice: "auto"
-- request 1 (turn) --
00:additional_tools/developer (3; hash=9e8e744a3a55a2dd):
00:additional_tools/developer (3; hash=fbbc8f2ad7c8ce86):
- namespace/functions; hash=e7db0a45c4ec3157
- custom/exec
- function/wait
@@ -24,7 +24,7 @@ Settings:
- function/request_user_input_async
- namespace/clock: Tools for reading and waiting on time.; hash=f402e8c5e9b5e317
- function/sleep
- namespace/collaboration: Tools for spawning and managing sub-agents.; hash=91f6de0e2773854f
- namespace/collaboration: Tools for spawning and managing sub-agents.; hash=0be1d3f8e1f49dca
- function/followup_task
- function/interrupt_agent
- function/list_agents
@@ -190,7 +190,7 @@ Settings:
## Window 2 (after request 3: input diverged at item 02)
Settings: same as window 1
-- request 4 (turn) --
00:additional_tools/developer (3; hash=9e8e744a3a55a2dd):
00:additional_tools/developer (3; hash=fbbc8f2ad7c8ce86):
- namespace/functions; hash=e7db0a45c4ec3157
- custom/exec
- function/wait
@@ -198,7 +198,7 @@ Settings: same as window 1
- function/request_user_input_async
- namespace/clock: Tools for reading and waiting on time.; hash=f402e8c5e9b5e317
- function/sleep
- namespace/collaboration: Tools for spawning and managing sub-agents.; hash=91f6de0e2773854f
- namespace/collaboration: Tools for spawning and managing sub-agents.; hash=0be1d3f8e1f49dca
- function/followup_task
- function/interrupt_agent
- function/list_agents
@@ -16,7 +16,7 @@ Settings:
text: {"verbosity":"low"}
tool_choice: "auto"
-- request 1 (turn) --
00:additional_tools/developer (3; hash=9e8e744a3a55a2dd):
00:additional_tools/developer (3; hash=fbbc8f2ad7c8ce86):
- namespace/functions; hash=e7db0a45c4ec3157
- custom/exec
- function/wait
@@ -24,7 +24,7 @@ Settings:
- function/request_user_input_async
- namespace/clock: Tools for reading and waiting on time.; hash=f402e8c5e9b5e317
- function/sleep
- namespace/collaboration: Tools for spawning and managing sub-agents.; hash=91f6de0e2773854f
- namespace/collaboration: Tools for spawning and managing sub-agents.; hash=0be1d3f8e1f49dca
- function/followup_task
- function/interrupt_agent
- function/list_agents
@@ -113,7 +113,7 @@ Settings:
## Window 2 (after request 2: input diverged at item 00)
Settings: same as window 1
-- request 3 (turn) --
00:additional_tools/developer (3; hash=d9bfc9d2033f8c93):
00:additional_tools/developer (3; hash=175a24d9dd32c0c4):
- namespace/functions; hash=8c17932a39355f2d
- custom/exec
- function/wait
@@ -121,7 +121,7 @@ Settings: same as window 1
- function/request_user_input_async
- namespace/clock: Tools for reading and waiting on time.; hash=f402e8c5e9b5e317
- function/sleep
- namespace/collaboration: Tools for spawning and managing sub-agents.; hash=91f6de0e2773854f
- namespace/collaboration: Tools for spawning and managing sub-agents.; hash=0be1d3f8e1f49dca
- function/followup_task
- function/interrupt_agent
- function/list_agents
@@ -16,7 +16,7 @@ Settings:
text: {"verbosity":"low"}
tool_choice: "auto"
-- request 1 (turn) --
00:additional_tools/developer (3; hash=d9bfc9d2033f8c93):
00:additional_tools/developer (3; hash=175a24d9dd32c0c4):
- namespace/functions; hash=8c17932a39355f2d
- custom/exec
- function/wait
@@ -24,7 +24,7 @@ Settings:
- function/request_user_input_async
- namespace/clock: Tools for reading and waiting on time.; hash=f402e8c5e9b5e317
- function/sleep
- namespace/collaboration: Tools for spawning and managing sub-agents.; hash=91f6de0e2773854f
- namespace/collaboration: Tools for spawning and managing sub-agents.; hash=0be1d3f8e1f49dca
- function/followup_task
- function/interrupt_agent
- function/list_agents
@@ -16,7 +16,7 @@ Settings:
text: {"verbosity":"low"}
tool_choice: "auto"
-- request 1 (turn) --
00:additional_tools/developer (3; hash=9d21738c014fb8eb):
00:additional_tools/developer (3; hash=9fe5eab151c06aac):
- namespace/functions; hash=e7db0a45c4ec3157
- custom/exec
- function/wait
@@ -24,7 +24,7 @@ Settings:
- function/request_user_input_async
- namespace/clock: Tools for reading and waiting on time.; hash=f402e8c5e9b5e317
- function/sleep
- namespace/collaboration: Tools for spawning and managing sub-agents.; hash=2943c667577fdb8b
- namespace/collaboration: Tools for spawning and managing sub-agents.; hash=1ee3951528ebc076
- function/followup_task
- function/interrupt_agent
- function/list_agents
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -120,7 +120,7 @@ pub(super) fn model_upgrade_for_migration(
// Saved selections can outlive their catalog entries. Keep only their migration metadata.
let (target_model, current_name, target_name) = match model {
"gpt-5.4-mini" => ("gpt-5.6-luna", "GPT-5.4 Mini", "GPT-5.6 Luna"),
"gpt-5.4-mini" => ("gpt-6-luna", "GPT-5.4 Mini", "GPT-6 Luna"),
_ => return None,
};
Some(ModelUpgrade {
+43 -15
View File
@@ -179,7 +179,7 @@ async fn model_migration_prompt_only_shows_for_deprecated_models() {
));
assert!(should_show_model_migration_prompt(
"gpt-5.4",
"gpt-5.6-terra",
"gpt-6-sol",
&seen,
&presets
));
@@ -369,8 +369,12 @@ async fn accepted_model_migration_persists_target_default_reasoning_effort() ->
let presets = all_model_presets();
let mut migration_copies = Vec::new();
for (model, replacement) in [
("gpt-5.4", "gpt-5.6-terra"),
("gpt-5.4-mini", "gpt-5.6-luna"),
("gpt-5.4", "gpt-6-sol"),
("gpt-5.4-mini", "gpt-6-luna"),
("gpt-5.5", "gpt-6-sol"),
("gpt-5.6-luna", "gpt-6-luna"),
("gpt-5.6-terra", "gpt-6-sol"),
("gpt-5.6-sol", "gpt-6-sol"),
] {
let codex_home = tempdir()?;
std::fs::write(
@@ -383,7 +387,7 @@ async fn accepted_model_migration_persists_target_default_reasoning_effort() ->
.await?;
let current_model = config.model.clone().expect("saved model");
let upgrade = model_upgrade_for_migration(&current_model, &presets)
.expect("retired selection should still migrate");
.expect("catalog selection should have an upgrade");
assert_eq!(upgrade.id, replacement);
assert!(should_show_model_migration_prompt(
&current_model,
@@ -449,11 +453,27 @@ async fn accepted_model_migration_persists_target_default_reasoning_effort() ->
assert_snapshot!(migration_copies.join("\n"), @r"
GPT-5.4 is no longer available
Codex now uses GPT-5.6 Terra in place of GPT-5.4. Switch to GPT-5.6 Terra to continue.
Codex now uses GPT-6 Sol in place of GPT-5.4. Switch to GPT-6 Sol to continue.
GPT-5.4 Mini is no longer available
Codex now uses GPT-5.6 Luna in place of GPT-5.4 Mini. Switch to GPT-5.6 Luna to continue.
Codex now uses GPT-6 Luna in place of GPT-5.4 Mini. Switch to GPT-6 Luna to continue.
Meet GPT-6 Sol
Our latest Sol is more intelligent and more efficient so your usage limits go further. This model is a great daily driver for complex tasks, especially coding.
Meet GPT-6 Luna
Our latest Luna is significantly more efficient, so your usage limits go even further. Reach for it for any job that doesn't require frontier intelligence.
Meet GPT-6 Sol
Our latest Sol is more intelligent and more efficient so your usage limits go further. This model is a great daily driver for complex tasks, especially coding.
Meet GPT-6 Sol
Our latest Sol is more intelligent and more efficient so your usage limits go further. This model is a great daily driver for complex tasks, especially coding.
");
Ok(())
}
@@ -462,16 +482,24 @@ async fn accepted_model_migration_persists_target_default_reasoning_effort() ->
async fn model_migration_prompt_respects_hide_flag_and_self_target() {
let presets = all_model_presets();
let mut seen = BTreeMap::new();
// A previously acknowledged intermediate upgrade must not hide the new target.
seen.insert("gpt-5.4-mini".to_string(), "gpt-5.6-luna".to_string());
assert!(should_show_model_migration_prompt(
"gpt-5.4-mini",
"gpt-6-luna",
&seen,
&presets
));
seen.insert("gpt-5.4-mini".to_string(), "gpt-6-luna".to_string());
assert!(!should_show_model_migration_prompt(
"gpt-5.4-mini",
"gpt-5.6-luna",
"gpt-6-luna",
&seen,
&presets
));
assert!(!should_show_model_migration_prompt(
"gpt-5.6-luna",
"gpt-5.6-luna",
"gpt-6-luna",
"gpt-6-luna",
&seen,
&presets
));
@@ -480,31 +508,31 @@ async fn model_migration_prompt_respects_hide_flag_and_self_target() {
#[tokio::test]
async fn model_migration_prompt_skips_when_target_missing_or_hidden() {
let mut available = all_model_presets();
available.retain(|preset| preset.model != "gpt-5.6-luna");
available.retain(|preset| preset.model != "gpt-6-luna");
assert!(!should_show_model_migration_prompt(
"gpt-5.4-mini",
"gpt-5.6-luna",
"gpt-6-luna",
&BTreeMap::new(),
&available,
));
assert!(target_preset_for_upgrade(&available, "gpt-5.6-luna").is_none());
assert!(target_preset_for_upgrade(&available, "gpt-6-luna").is_none());
let mut with_hidden_target = all_model_presets();
let target = with_hidden_target
.iter_mut()
.find(|preset| preset.model == "gpt-5.6-luna")
.find(|preset| preset.model == "gpt-6-luna")
.expect("target preset present");
target.show_in_picker = false;
assert!(!should_show_model_migration_prompt(
"gpt-5.4-mini",
"gpt-5.6-luna",
"gpt-6-luna",
&BTreeMap::new(),
&with_hidden_target,
));
assert!(target_preset_for_upgrade(&with_hidden_target, "gpt-5.6-luna").is_none());
assert!(target_preset_for_upgrade(&with_hidden_target, "gpt-6-luna").is_none());
}
#[tokio::test]
@@ -6,6 +6,6 @@ Codex just got an upgrade. Introducing GPT-5.5.
We recommend switching from gpt-5.2 to gpt-5.5.
Frontier model for complex coding, research, and real-world work.
Legacy coding model.
You can continue using gpt-5.2 if you prefer.
@@ -1,16 +1,15 @@
---
source: tui/src/chatwidget/tests/bedrock_catalog_tests.rs
assertion_line: 42
expression: "render_bottom_popup(&chat, 100)"
---
Select Model and Effort
› 1. GPT-5.6 Sol (current) Latest frontier agentic coding model.
2. GPT-6-Astra Our most capable model for complex, demanding work.
3. GPT-5.6 Terra Balanced agentic coding model for everyday work.
4. GPT-5.6 Luna Fast and affordable agentic coding model.
5. GPT-5.5 Frontier model for complex coding, research, and real-world work.
› 1. GPT-5.6 Sol (current) Older coding model for complex work.
2. GPT-6-Astra Frontier intelligence for the most demanding work.
3. GPT-5.6 Terra Older balanced model for straightforward work.
4. GPT-5.6 Luna Older fast and efficient model.
5. GPT-5.5 Legacy coding model.
6. GPT-5.4 Strong model for everyday coding.
enter select · esc back
@@ -1,18 +1,17 @@
---
source: tui/src/chatwidget/tests/bedrock_catalog_tests.rs
assertion_line: 42
expression: "render_bottom_popup(&chat, 100)"
---
Select Model and Effort
› 1. GPT-5.6 Sol (Global) (current) Latest frontier agentic coding model.
2. GPT-6-Astra (Global) Our most capable model for complex, demanding work.
3. GPT-5.6 Terra (Global) Balanced agentic coding model for everyday work.
4. GPT-5.6 Luna (Global) Fast and affordable agentic coding model.
5. GPT-5.6 Sol (US cross-region) Latest frontier agentic coding model.
6. GPT-6-Astra (US cross-region) Our most capable model for complex, demanding work.
7. GPT-5.6 Terra (US cross-region) Balanced agentic coding model for everyday work.
8. GPT-5.6 Luna (US cross-region) Fast and affordable agentic coding model.
› 1. GPT-5.6 Sol (Global) (current) Older coding model for complex work.
2. GPT-6-Astra (Global) Frontier intelligence for the most demanding work.
3. GPT-5.6 Terra (Global) Older balanced model for straightforward work.
4. GPT-5.6 Luna (Global) Older fast and efficient model.
5. GPT-5.6 Sol (US cross-region) Older coding model for complex work.
6. GPT-6-Astra (US cross-region) Frontier intelligence for the most demanding work.
7. GPT-5.6 Terra (US cross-region) Older balanced model for straightforward work.
8. GPT-5.6 Luna (US cross-region) Older fast and efficient model.
enter select · esc back
@@ -6,9 +6,8 @@ expression: "render_bottom_popup(&chat, 80)"
Select Model and Effort
› 1. Renamed model Balanced agentic coding model for everyday
› 1. Renamed model Older balanced model for straightforward
work.
2. Shared display name (current) Frontier model for complex coding, research,
and real-world work.
2. Shared display name (current) Legacy coding model.
enter select · esc back
@@ -6,11 +6,12 @@ expression: popup
Select Model and Effort
1. GPT-6-Astra (default) Our most capable model for complex, demanding work.
2. GPT-5.6-Sol Latest frontier agentic coding model.
3. GPT-5.6-Terra Balanced agentic coding model for everyday work.
4. GPT-5.6-Luna Fast and affordable agentic coding model.
› 5. GPT-5.5 (current) Frontier model for complex coding, research, and
real-world work.
1. GPT-6-Astra (default) Frontier intelligence for the most demanding work.
2. GPT-6-Sol Workhorse model for coding and everyday work.
3. GPT-6-Luna Fast and affordable model for easier tasks.
4. GPT-5.6-Sol Older coding model for complex work.
5. GPT-5.6-Terra Older balanced model for straightforward work.
6. GPT-5.6-Luna Older fast and efficient model.
› 7. GPT-5.5 (current) Legacy coding model.
enter select · esc back
@@ -3,11 +3,11 @@ source: tui/src/chatwidget/tests/status_and_layout.rs
expression: popup
---
Approaching rate limits
Switch to gpt-5.6-luna for lower credit usage?
Switch to gpt-6-luna for lower credit usage?
› 1. Switch to gpt-5.6-luna Fast and affordable agentic coding
model.
› 1. Switch to gpt-6-luna Fast and affordable model for easier
tasks.
2. Keep current model
3. Keep current model (never show again) Hide future rate limit reminders
about switching models.
+1 -1
View File
@@ -5,7 +5,7 @@ use codex_protocol::openai_models::ModelPreset;
use std::convert::Infallible;
pub(crate) const LUNA_RESERVE_MODEL: &str = "gpt-reserve";
pub(crate) const LUNA_MODEL: &str = "gpt-5.6-luna";
pub(crate) const LUNA_MODEL: &str = "gpt-6-luna";
pub(crate) fn model_display_name(model: &str) -> &str {
if model.eq_ignore_ascii_case(LUNA_RESERVE_MODEL) {
+2 -1
View File
@@ -534,7 +534,8 @@ pub(super) fn write_test_config(codex_home: &Path, repo_root: &Path) -> Result<(
let repo_root = repo_root.display();
let config = format!(
"model = \"gpt-5.6-terra\"\nmodel_provider = \"openai\"\n\
suppress_unstable_features_warning = true\nanalytics.enabled = false\n\n\
suppress_unstable_features_warning = true\nanalytics.enabled = false\n\
notice.model_migrations.\"gpt-5.6-terra\" = \"gpt-6-sol\"\n\n\
[projects.\"{repo_root}\"]\ntrust_level = \"trusted\"\n"
);
std::fs::write(codex_home.join("config.toml"), config)
+1 -1
View File
@@ -603,7 +603,7 @@ requires_openai_auth = false
supports_websockets = false
[notice.model_migrations]
"gpt-5.4" = "gpt-5.6-terra"
"gpt-5.4" = "gpt-6-sol"
[projects."{repo_root_display}"]
trust_level = "trusted"