diff --git a/codex-rs/core/src/config/managed_features.rs b/codex-rs/core/src/config/managed_features.rs index 7c04301444..1e3fe109db 100644 --- a/codex-rs/core/src/config/managed_features.rs +++ b/codex-rs/core/src/config/managed_features.rs @@ -23,9 +23,9 @@ pub(super) fn project_overrides_legacy_subagent_opt_out(layers: &ConfigLayerStac let mut project_enabled = false; for layer in layers.layers_high_to_low() { if let Some(features) = layer.config.get("features").and_then(toml::Value::as_table) - && features - .keys() - .any(|key| feature_for_key(key) == Some(Feature::Collab)) + && features.iter().any(|(key, enabled)| { + enabled.as_bool() == Some(false) && feature_for_key(key) == Some(Feature::Collab) + }) { return project_enabled; } diff --git a/codex-rs/core/tests/suite/model_runtime_selectors.rs b/codex-rs/core/tests/suite/model_runtime_selectors.rs index d25278e1f7..8034cde9be 100644 --- a/codex-rs/core/tests/suite/model_runtime_selectors.rs +++ b/codex-rs/core/tests/suite/model_runtime_selectors.rs @@ -447,6 +447,36 @@ async fn migrating_only_the_project_agent_setting_preserves_v1_tools() -> Result Some("multi_agent_v1"), ), (migrated, config(), None, Some("multi_agent_v1")), + ( + "[features]\nmulti_agent = true", + config().cli_overrides(vec![("features.collab".to_string(), true.into())]), + None, + Some("multi_agent_v1"), + ), + ( + migrated, + config().cli_overrides(vec![("features.collab".to_string(), true.into())]), + None, + Some("multi_agent_v1"), + ), + ( + "[agents]\nenabled = true\n[features]\ncollab = true", + config(), + None, + Some("multi_agent_v1"), + ), + ( + "[agents]\nenabled = true\n[features]\ncollab = false", + config(), + None, + None, + ), + ( + migrated, + config().cli_overrides(vec![("features.collab".to_string(), false.into())]), + None, + None, + ), ( migrated, config(),