From ac558e2a3264e1025fd8025fdd71d03dfbe8c86e Mon Sep 17 00:00:00 2001 From: jamy-OAI <332197178+jamy-OAI@users.noreply.github.com> Date: Tue, 3 Nov 2026 16:09:51 +0000 Subject: [PATCH] Resolve saved Daybreak preferences against advertised model programs (#59192) ## What changed Add `SavedDaybreakChoice` and `ModelAccessPrograms::select_saved` to resolve an optional saved preference. Enabled selects an advertised Daybreak program, disabled selects an advertised standard program, and unset or unsupported choices return `None`. ## Testing Extend selection tests to cover enabled, disabled, and unset preferences across advertised program combinations, preserving the preference for Daybreak Blue over Red. GitOrigin-RevId: 1c7ab3fe1d3a48ad64519bfedfe27de90838516c --- codex-rs/protocol/src/openai_models.rs | 1 + .../src/openai_models/access_programs.rs | 28 +++++++++++++++++++ .../openai_models/access_programs_tests.rs | 19 +++++++++++-- 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/codex-rs/protocol/src/openai_models.rs b/codex-rs/protocol/src/openai_models.rs index 180a01f8b3..391acecc55 100644 --- a/codex-rs/protocol/src/openai_models.rs +++ b/codex-rs/protocol/src/openai_models.rs @@ -59,6 +59,7 @@ mod guardian_v2; mod reasoning_effort; pub use access_programs::ModelAccessPrograms; +pub use access_programs::SavedDaybreakChoice; pub use guardian_v2::AsyncClassifierMode; pub use guardian_v2::GuardianV2ModelConfig; pub use guardian_v2::GuardianV2TranscriptModelConfig; diff --git a/codex-rs/protocol/src/openai_models/access_programs.rs b/codex-rs/protocol/src/openai_models/access_programs.rs index a27c604d4b..c78ff2d748 100644 --- a/codex-rs/protocol/src/openai_models/access_programs.rs +++ b/codex-rs/protocol/src/openai_models/access_programs.rs @@ -17,7 +17,35 @@ pub struct ModelAccessPrograms { pub cyber: Vec, } +/// Saved preference to resolve against the selected model's advertised programs. +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum SavedDaybreakChoice { + Unset, + On, + Off, +} + +impl From> for SavedDaybreakChoice { + fn from(enabled: Option) -> Self { + match enabled { + Some(true) => Self::On, + Some(false) => Self::Off, + None => Self::Unset, + } + } +} + impl ModelAccessPrograms { + /// Select only an advertised program for explicit saved intent. Unset and + /// unsupported choices remain omitted, including On without Daybreak support. + pub fn select_saved(&self, choice: SavedDaybreakChoice) -> Option { + match choice { + SavedDaybreakChoice::On => self.daybreak(), + SavedDaybreakChoice::Off => self.standard(), + SavedDaybreakChoice::Unset => None, + } + } + /// Select the preferred Daybreak treatment advertised for this model. pub fn daybreak(&self) -> Option { [ diff --git a/codex-rs/protocol/src/openai_models/access_programs_tests.rs b/codex-rs/protocol/src/openai_models/access_programs_tests.rs index 176d728c0f..c066783796 100644 --- a/codex-rs/protocol/src/openai_models/access_programs_tests.rs +++ b/codex-rs/protocol/src/openai_models/access_programs_tests.rs @@ -1,4 +1,7 @@ +#![cfg(test)] + use super::ModelAccessPrograms; +use super::SavedDaybreakChoice; use crate::turn_input::CyberAccessProgram; use pretty_assertions::assert_eq; @@ -17,8 +20,20 @@ fn selects_only_advertised_programs_with_blue_preferred() { ] { let programs = ModelAccessPrograms { cyber }; assert_eq!( - (programs.daybreak(), programs.standard()), - (expected_daybreak, expected_standard) + ( + programs.daybreak(), + programs.standard(), + programs.select_saved(SavedDaybreakChoice::from(Some(true))), + programs.select_saved(SavedDaybreakChoice::from(Some(false))), + programs.select_saved(SavedDaybreakChoice::from(/* enabled */ None)), + ), + ( + expected_daybreak, + expected_standard, + expected_daybreak, + expected_standard, + None, + ) ); } }