Stabilize multi-agent feature flag (#14622)

- make multi_agent stable and enabled by default
- update feature and tool-spec coverage to match the new default

---------

Co-authored-by: Codex <noreply@openai.com>
This commit is contained in:
Ahmed Ibrahim 2026-03-13 14:38:15 -07:00 committed by GitHub
parent cfd97b36da
commit 36dfb84427
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 64 additions and 6 deletions

View file

@ -711,12 +711,8 @@ pub const FEATURES: &[FeatureSpec] = &[
FeatureSpec {
id: Feature::Collab,
key: "multi_agent",
stage: Stage::Experimental {
name: "Subagents",
menu_description: "Ask Codex to spawn subagents to parallelize the work and move faster.",
announcement: "NEW: Subagents can now be spawned by Codex. Enable in /experimental and restart Codex!",
},
default_enabled: false,
stage: Stage::Stable,
default_enabled: true,
},
FeatureSpec {
id: Feature::SpawnCsv,

View file

@ -145,6 +145,12 @@ fn collab_is_legacy_alias_for_multi_agent() {
assert_eq!(feature_for_key("collab"), Some(Feature::Collab));
}
#[test]
fn multi_agent_is_stable_and_enabled_by_default() {
assert_eq!(Feature::Collab.stage(), Stage::Stable);
assert_eq!(Feature::Collab.default_enabled(), true);
}
#[test]
fn enable_fanout_is_under_development() {
assert_eq!(Feature::SpawnCsv.stage(), Stage::UnderDevelopment);

View file

@ -459,6 +459,11 @@ fn test_full_toolset_specs_for_gpt5_codex_unified_exec_web_search() {
search_content_types: None,
},
create_view_image_tool(config.can_request_original_image_detail),
create_spawn_agent_tool(&config),
create_send_input_tool(),
create_resume_agent_tool(),
create_wait_tool(),
create_close_agent_tool(),
] {
expected.insert(tool_name(&spec).to_string(), spec);
}
@ -1184,6 +1189,11 @@ fn test_build_specs_gpt5_codex_default() {
"apply_patch",
"web_search",
"view_image",
"spawn_agent",
"send_input",
"resume_agent",
"wait",
"close_agent",
],
);
}
@ -1202,6 +1212,11 @@ fn test_build_specs_gpt51_codex_default() {
"apply_patch",
"web_search",
"view_image",
"spawn_agent",
"send_input",
"resume_agent",
"wait",
"close_agent",
],
);
}
@ -1222,6 +1237,11 @@ fn test_build_specs_gpt5_codex_unified_exec_web_search() {
"apply_patch",
"web_search",
"view_image",
"spawn_agent",
"send_input",
"resume_agent",
"wait",
"close_agent",
],
);
}
@ -1242,6 +1262,11 @@ fn test_build_specs_gpt51_codex_unified_exec_web_search() {
"apply_patch",
"web_search",
"view_image",
"spawn_agent",
"send_input",
"resume_agent",
"wait",
"close_agent",
],
);
}
@ -1260,6 +1285,11 @@ fn test_gpt_5_1_codex_max_defaults() {
"apply_patch",
"web_search",
"view_image",
"spawn_agent",
"send_input",
"resume_agent",
"wait",
"close_agent",
],
);
}
@ -1278,6 +1308,11 @@ fn test_codex_5_1_mini_defaults() {
"apply_patch",
"web_search",
"view_image",
"spawn_agent",
"send_input",
"resume_agent",
"wait",
"close_agent",
],
);
}
@ -1295,6 +1330,11 @@ fn test_gpt_5_defaults() {
"request_user_input",
"web_search",
"view_image",
"spawn_agent",
"send_input",
"resume_agent",
"wait",
"close_agent",
],
);
}
@ -1313,6 +1353,11 @@ fn test_gpt_5_1_defaults() {
"apply_patch",
"web_search",
"view_image",
"spawn_agent",
"send_input",
"resume_agent",
"wait",
"close_agent",
],
);
}
@ -1333,6 +1378,11 @@ fn test_gpt_5_1_codex_max_unified_exec_web_search() {
"apply_patch",
"web_search",
"view_image",
"spawn_agent",
"send_input",
"resume_agent",
"wait",
"close_agent",
],
);
}

View file

@ -177,6 +177,11 @@ async fn prompt_tools_are_consistent_across_requests() -> anyhow::Result<()> {
"apply_patch",
"web_search",
"view_image",
"spawn_agent",
"send_input",
"resume_agent",
"wait",
"close_agent",
]);
let body0 = req1.single_request().body_json();

View file

@ -5074,6 +5074,7 @@ mod tests {
#[tokio::test]
async fn open_agent_picker_prompts_to_enable_multi_agent_when_disabled() -> Result<()> {
let (mut app, mut app_event_rx, _op_rx) = make_test_app_with_channels().await;
let _ = app.config.features.disable(Feature::Collab);
app.open_agent_picker().await;
app.chat_widget