From 4d1702586a4acdc88e2c261f4e4630e016e5fbe7 Mon Sep 17 00:00:00 2001 From: canvrno-oai Date: Fri, 12 Jun 2026 14:52:07 -0700 Subject: [PATCH] Warn for structured feature toggles (#27076) ## Summary Startup warnings for under-development features only recognized bare boolean toggles like `features.foo = true`. An upcoming feature will use table-format config, so `features.foo = { enabled = true, ... }` needs to count as an explicit opt-in too. This updates the warning predicate to recognize structured tables with `enabled = true`, while leaving tables without that field unwarned. ## Testing - `just fmt` - `just test -p codex-features unstable_warning_event_mentions_enabled_structured_under_development_feature` --- codex-rs/features/src/lib.rs | 9 ++++++++- codex-rs/features/src/tests.rs | 31 +++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/codex-rs/features/src/lib.rs b/codex-rs/features/src/lib.rs index 65c1c3b28..1b13d41b4 100644 --- a/codex-rs/features/src/lib.rs +++ b/codex-rs/features/src/lib.rs @@ -1281,7 +1281,13 @@ pub fn unstable_features_warning_event( let mut under_development_feature_keys = Vec::new(); if let Some(table) = effective_features { for (key, value) in table { - if value.as_bool() != Some(true) { + let is_enabled = value.as_bool() == Some(true) + || value + .as_table() + .and_then(|table| table.get("enabled")) + .and_then(toml::Value::as_bool) + == Some(true); + if !is_enabled { continue; } let Some(spec) = FEATURES.iter().find(|spec| spec.key == key.as_str()) else { @@ -1300,6 +1306,7 @@ pub fn unstable_features_warning_event( return None; } + under_development_feature_keys.sort(); let under_development_feature_keys = under_development_feature_keys.join(", "); let message = format!( "Under-development features enabled: {under_development_feature_keys}. Under-development features are incomplete and may behave unpredictably. To suppress this warning, set `suppress_unstable_features_warning = true` in {config_path}." diff --git a/codex-rs/features/src/tests.rs b/codex-rs/features/src/tests.rs index db5681988..fd39cab26 100644 --- a/codex-rs/features/src/tests.rs +++ b/codex-rs/features/src/tests.rs @@ -712,3 +712,34 @@ fn unstable_warning_event_only_mentions_enabled_under_development_features() { assert!(!message.contains("personality")); assert!(message.contains("/tmp/config.toml")); } + +#[test] +fn unstable_warning_event_mentions_enabled_structured_under_development_feature() { + let configured_features: Table = toml::from_str( + r#" +multi_agent_v2 = { enabled = true, tool_namespace = "agents" } +code_mode = true +"#, + ) + .expect("features table should deserialize"); + + let mut features = Features::with_defaults(); + features.enable(Feature::MultiAgentV2); + features.enable(Feature::CodeMode); + + let warning = unstable_features_warning_event( + Some(&configured_features), + /*suppress_unstable_features_warning*/ false, + &features, + "/tmp/config.toml", + ) + .expect("warning event"); + + let EventMsg::Warning(WarningEvent { message }) = warning.msg else { + panic!("expected warning event"); + }; + assert_eq!( + "Under-development features enabled: code_mode, multi_agent_v2. Under-development features are incomplete and may behave unpredictably. To suppress this warning, set `suppress_unstable_features_warning = true` in /tmp/config.toml.".to_string(), + message + ); +}